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,158 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLIProvider = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const base_1 = require("./base");
6
+ const errors_1 = require("../../core/errors");
7
+ const logger_1 = require("../../utils/logger");
8
+ class CLIProvider extends base_1.BaseLLMProvider {
9
+ name = 'cli';
10
+ availableModels = ['local-default']; // CLI usually handles the model selection internally or via args
11
+ command;
12
+ defaultArgs;
13
+ promptPassingMethod;
14
+ promptFlag;
15
+ constructor(config) {
16
+ super({
17
+ apiKey: 'local-auth', // Placeholder for base class requirement
18
+ baseUrl: 'local', // Placeholder
19
+ defaultModel: 'default',
20
+ timeoutMs: config.timeoutMs,
21
+ maxRetries: config.maxRetries
22
+ });
23
+ this.command = config.command;
24
+ this.defaultArgs = config.args || [];
25
+ this.promptPassingMethod = config.promptPassingMethod || 'stdin';
26
+ this.promptFlag = config.promptFlag;
27
+ }
28
+ // Helper to extract the actual prompt from messages
29
+ // CLIs usually accept a single prompt string, not a full chat history JSON
30
+ getPromptText(messages) {
31
+ // Strategy: Concatenate system prompt and user messages
32
+ return messages.map(m => {
33
+ if (m.role === 'system')
34
+ return `System: ${m.content}\n`;
35
+ if (m.role === 'user')
36
+ return `User: ${m.content}\n`;
37
+ return `Assistant: ${m.content}\n`;
38
+ }).join('\n') + "\nResponse:";
39
+ }
40
+ // Strategy for simple CLIs (like 'gemini "prompt"'):
41
+ // If the CLI accepts the prompt as the last argument
42
+ getLatestPrompt(messages) {
43
+ const lastUserMsg = [...messages].reverse().find(m => m.role === 'user');
44
+ return lastUserMsg ? lastUserMsg.content : '';
45
+ }
46
+ async complete(messages, options = {}) {
47
+ return this.withRetry(async () => {
48
+ const prompt = this.getLatestPrompt(messages);
49
+ let args = [...this.defaultArgs];
50
+ // Handle Prompt passing logic
51
+ if (this.promptPassingMethod === 'arg') {
52
+ if (this.promptFlag) {
53
+ args.push(this.promptFlag);
54
+ }
55
+ args.push(prompt);
56
+ }
57
+ return new Promise((resolve, reject) => {
58
+ logger_1.logger.debug(`Executing CLI command: ${this.command}`, { args, method: this.promptPassingMethod });
59
+ const child = (0, child_process_1.spawn)(this.command, args, {
60
+ env: { ...process.env },
61
+ shell: false,
62
+ stdio: ['pipe', 'pipe', 'pipe']
63
+ });
64
+ let stdout = '';
65
+ let stderr = '';
66
+ child.stdout.on('data', (data) => {
67
+ stdout += data.toString();
68
+ });
69
+ child.stderr.on('data', (data) => {
70
+ stderr += data.toString();
71
+ });
72
+ child.on('close', (code) => {
73
+ if (code !== 0) {
74
+ logger_1.logger.error(`CLI execution failed`, { code, stderr });
75
+ reject(new errors_1.LLMError(`CLI command failed with code ${code}: ${stderr}`, 'cli'));
76
+ }
77
+ else {
78
+ resolve({
79
+ content: stdout.trim(),
80
+ model: 'cli-default',
81
+ usage: {
82
+ promptTokens: 0,
83
+ completionTokens: 0,
84
+ totalTokens: 0
85
+ },
86
+ finishReason: 'stop'
87
+ });
88
+ }
89
+ });
90
+ child.on('error', (err) => {
91
+ reject(new errors_1.LLMError(`Failed to spawn CLI process: ${err.message}`, 'cli'));
92
+ });
93
+ // Only write to stdin if configured to do so
94
+ if (this.promptPassingMethod === 'stdin') {
95
+ child.stdin.write(prompt);
96
+ child.stdin.end();
97
+ }
98
+ else {
99
+ // Even if passing by arg, we should end stdin to prevent hanging if process reads stdin
100
+ child.stdin.end();
101
+ }
102
+ });
103
+ });
104
+ }
105
+ async *stream(messages, options = {}) {
106
+ const prompt = this.getLatestPrompt(messages);
107
+ let args = [...this.defaultArgs];
108
+ if (this.promptPassingMethod === 'arg') {
109
+ if (this.promptFlag) {
110
+ args.push(this.promptFlag);
111
+ }
112
+ args.push(prompt);
113
+ }
114
+ const child = (0, child_process_1.spawn)(this.command, args, {
115
+ env: { ...process.env },
116
+ shell: false,
117
+ stdio: ['pipe', 'pipe', 'pipe']
118
+ });
119
+ if (this.promptPassingMethod === 'stdin') {
120
+ child.stdin.write(prompt);
121
+ child.stdin.end();
122
+ }
123
+ else {
124
+ child.stdin.end();
125
+ }
126
+ // Use a manual iterator to handle backpressure properly would require
127
+ // implementing a ReadableStream-like behavior or simply yielding as we get data.
128
+ // For simplicity and effectiveness in this context, we'll iterate over the stdout stream.
129
+ try {
130
+ for await (const chunk of child.stdout) {
131
+ yield {
132
+ content: chunk.toString(),
133
+ isComplete: false
134
+ };
135
+ }
136
+ // Wait for process to exit to check for errors
137
+ await new Promise((resolve, reject) => {
138
+ child.on('close', (code) => {
139
+ if (code !== 0) {
140
+ // We can capture stderr here if needed, but for stream we just end
141
+ // Ideally we would have collected stderr separately
142
+ reject(new errors_1.LLMError(`CLI stream failed with code ${code}`, 'cli'));
143
+ }
144
+ else {
145
+ resolve();
146
+ }
147
+ });
148
+ child.on('error', reject);
149
+ });
150
+ yield { content: '', isComplete: true };
151
+ }
152
+ catch (error) {
153
+ throw new errors_1.LLMError(`Stream error: ${error.message}`, 'cli');
154
+ }
155
+ }
156
+ }
157
+ exports.CLIProvider = CLIProvider;
158
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/llm/providers/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Google Gemini LLM Provider
3
+ *
4
+ * @module llm/providers/gemini
5
+ */
6
+ import { BaseLLMProvider, type LLMMessage, type LLMRequestOptions, type LLMResponse, type LLMStreamChunk } from './base';
7
+ /**
8
+ * Gemini provider configuration
9
+ */
10
+ export interface GeminiConfig {
11
+ apiKey: string;
12
+ model?: string;
13
+ baseUrl?: string;
14
+ timeoutMs?: number;
15
+ maxRetries?: number;
16
+ }
17
+ /**
18
+ * Gemini provider implementation
19
+ */
20
+ export declare class GeminiProvider extends BaseLLMProvider {
21
+ readonly name = "gemini";
22
+ readonly availableModels: string[];
23
+ constructor(config: GeminiConfig);
24
+ complete(messages: LLMMessage[], options?: LLMRequestOptions): Promise<LLMResponse>;
25
+ stream(messages: LLMMessage[], options?: LLMRequestOptions): AsyncGenerator<LLMStreamChunk>;
26
+ private buildRequestBody;
27
+ private parseResponse;
28
+ protected isNonRetryableError(error: unknown): boolean;
29
+ }
30
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/gemini.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;AAIzH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,eAAe;IACjD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,eAAe,WAItB;gBAEU,MAAM,EAAE,YAAY;IAU1B,QAAQ,CACZ,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC;IA6BhB,MAAM,CACX,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,iBAAsB,GAC9B,cAAc,CAAC,cAAc,CAAC;IAmDjC,OAAO,CAAC,gBAAgB;IAyCxB,OAAO,CAAC,aAAa;cAoBF,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;CAUhE"}
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * Google Gemini LLM Provider
4
+ *
5
+ * @module llm/providers/gemini
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.GeminiProvider = void 0;
12
+ const axios_1 = __importDefault(require("axios"));
13
+ const base_1 = require("./base");
14
+ const errors_1 = require("../../core/errors");
15
+ const logger_1 = require("../../utils/logger");
16
+ /**
17
+ * Gemini provider implementation
18
+ */
19
+ class GeminiProvider extends base_1.BaseLLMProvider {
20
+ name = 'gemini';
21
+ availableModels = [
22
+ 'gemini-1.5-pro',
23
+ 'gemini-1.5-flash',
24
+ 'gemini-1.0-pro',
25
+ ];
26
+ constructor(config) {
27
+ super({
28
+ apiKey: config.apiKey,
29
+ baseUrl: config.baseUrl ?? 'https://generativelanguage.googleapis.com/v1beta',
30
+ defaultModel: config.model ?? 'gemini-1.5-pro',
31
+ timeoutMs: config.timeoutMs,
32
+ maxRetries: config.maxRetries,
33
+ });
34
+ }
35
+ async complete(messages, options = {}) {
36
+ return this.withRetry(async () => {
37
+ const model = this.getModel(options);
38
+ const url = `${this.baseUrl}/models/${model}:generateContent?key=${this.apiKey}`;
39
+ const requestBody = this.buildRequestBody(messages, options);
40
+ try {
41
+ const response = await axios_1.default.post(url, requestBody, {
42
+ timeout: options.timeoutMs ?? this.timeoutMs,
43
+ headers: {
44
+ 'Content-Type': 'application/json',
45
+ },
46
+ });
47
+ return this.parseResponse(response.data, model);
48
+ }
49
+ catch (error) {
50
+ if (axios_1.default.isAxiosError(error)) {
51
+ const statusCode = error.response?.status;
52
+ const errorMessage = error.response?.data?.error?.message ?? error.message;
53
+ logger_1.logger.error('Gemini API error', { statusCode, errorMessage });
54
+ throw new errors_1.LLMError(errorMessage, 'gemini', statusCode);
55
+ }
56
+ throw error;
57
+ }
58
+ });
59
+ }
60
+ async *stream(messages, options = {}) {
61
+ const model = this.getModel(options);
62
+ const url = `${this.baseUrl}/models/${model}:streamGenerateContent?key=${this.apiKey}`;
63
+ const requestBody = this.buildRequestBody(messages, options);
64
+ try {
65
+ const response = await axios_1.default.post(url, requestBody, {
66
+ timeout: options.timeoutMs ?? this.timeoutMs,
67
+ headers: {
68
+ 'Content-Type': 'application/json',
69
+ },
70
+ responseType: 'stream',
71
+ });
72
+ const stream = response.data;
73
+ for await (const chunk of stream) {
74
+ const lines = chunk.toString().split('\n').filter((line) => line.trim());
75
+ for (const line of lines) {
76
+ try {
77
+ const data = JSON.parse(line);
78
+ const content = data.candidates?.[0]?.content?.parts?.[0]?.text ?? '';
79
+ if (content) {
80
+ yield {
81
+ content,
82
+ isComplete: false,
83
+ };
84
+ }
85
+ }
86
+ catch {
87
+ // Ignore parse errors for non-JSON lines
88
+ }
89
+ }
90
+ }
91
+ yield {
92
+ content: '',
93
+ isComplete: true,
94
+ };
95
+ }
96
+ catch (error) {
97
+ if (axios_1.default.isAxiosError(error)) {
98
+ const statusCode = error.response?.status;
99
+ const errorMessage = error.response?.data?.error?.message ?? error.message;
100
+ throw new errors_1.LLMError(errorMessage, 'gemini', statusCode);
101
+ }
102
+ throw error;
103
+ }
104
+ }
105
+ buildRequestBody(messages, options) {
106
+ const contents = messages.map(msg => ({
107
+ role: msg.role === 'user' ? 'user' : 'model',
108
+ parts: [{ text: msg.content }],
109
+ }));
110
+ const body = {
111
+ contents,
112
+ };
113
+ if (options.temperature !== undefined) {
114
+ body.generationConfig = {
115
+ ...body.generationConfig,
116
+ temperature: options.temperature,
117
+ };
118
+ }
119
+ if (options.maxTokens !== undefined) {
120
+ body.generationConfig = {
121
+ ...body.generationConfig,
122
+ maxOutputTokens: options.maxTokens,
123
+ };
124
+ }
125
+ if (options.topP !== undefined) {
126
+ body.generationConfig = {
127
+ ...body.generationConfig,
128
+ topP: options.topP,
129
+ };
130
+ }
131
+ if (options.stopSequences !== undefined) {
132
+ body.generationConfig = {
133
+ ...body.generationConfig,
134
+ stopSequences: options.stopSequences,
135
+ };
136
+ }
137
+ return body;
138
+ }
139
+ parseResponse(data, model) {
140
+ const candidate = data.candidates?.[0];
141
+ const content = candidate?.content;
142
+ const parts = content?.parts;
143
+ const text = parts?.[0]?.text ?? '';
144
+ const usage = data.usageMetadata;
145
+ return {
146
+ content: text,
147
+ model,
148
+ usage: {
149
+ promptTokens: usage?.promptTokenCount ?? 0,
150
+ completionTokens: usage?.candidatesTokenCount ?? 0,
151
+ totalTokens: usage?.totalTokenCount ?? 0,
152
+ },
153
+ finishReason: candidate?.finishReason ?? 'stop',
154
+ };
155
+ }
156
+ isNonRetryableError(error) {
157
+ if (axios_1.default.isAxiosError(error)) {
158
+ const statusCode = error.response?.status;
159
+ // Don't retry on client errors (4xx except 429)
160
+ if (statusCode !== undefined && statusCode >= 400 && statusCode < 500 && statusCode !== 429) {
161
+ return true;
162
+ }
163
+ }
164
+ return false;
165
+ }
166
+ }
167
+ exports.GeminiProvider = GeminiProvider;
168
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/llm/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Input Sanitization for LLM Service
3
+ *
4
+ * Provides security-focused sanitization to prevent prompt injection
5
+ * and other LLM-related security vulnerabilities.
6
+ *
7
+ * @module llm/sanitization
8
+ */
9
+ /**
10
+ * Sanitization options
11
+ */
12
+ export interface SanitizationOptions {
13
+ maxLength?: number;
14
+ allowCode?: boolean;
15
+ allowHTML?: boolean;
16
+ allowedTags?: string[];
17
+ }
18
+ /**
19
+ * Sanitize a prompt for LLM use
20
+ *
21
+ * @param input - Raw input string
22
+ * @param options - Sanitization options
23
+ * @returns Sanitized string
24
+ */
25
+ export declare function sanitizePrompt(input: string, options?: SanitizationOptions): string;
26
+ /**
27
+ * Validate that a prompt is safe to use
28
+ *
29
+ * @param input - Input to validate
30
+ * @returns Validation result
31
+ */
32
+ export declare function validatePrompt(input: string): {
33
+ safe: boolean;
34
+ issues: string[];
35
+ };
36
+ /**
37
+ * Escape special characters for safe inclusion in prompts
38
+ *
39
+ * @param input - Input to escape
40
+ * @returns Escaped string
41
+ */
42
+ export declare function escapeSpecialChars(input: string): string;
43
+ /**
44
+ * Sanitize LLM response to remove any system-like content
45
+ *
46
+ * @param response - LLM response
47
+ * @returns Sanitized response
48
+ */
49
+ export declare function sanitizeResponse(response: string): string;
50
+ //# sourceMappingURL=sanitization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitization.d.ts","sourceRoot":"","sources":["../../src/llm/sanitization.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAuCD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,CA+CvF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAwBjF;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUzD"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * Input Sanitization for LLM Service
4
+ *
5
+ * Provides security-focused sanitization to prevent prompt injection
6
+ * and other LLM-related security vulnerabilities.
7
+ *
8
+ * @module llm/sanitization
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.sanitizePrompt = sanitizePrompt;
12
+ exports.validatePrompt = validatePrompt;
13
+ exports.escapeSpecialChars = escapeSpecialChars;
14
+ exports.sanitizeResponse = sanitizeResponse;
15
+ const logger_1 = require("../utils/logger");
16
+ /**
17
+ * Default sanitization options
18
+ */
19
+ const DEFAULT_OPTIONS = {
20
+ maxLength: 10000,
21
+ allowCode: false,
22
+ allowHTML: false,
23
+ allowedTags: [],
24
+ };
25
+ /**
26
+ * Dangerous patterns that could indicate prompt injection
27
+ */
28
+ const DANGEROUS_PATTERNS = [
29
+ // System prompt injection attempts
30
+ /ignore\s+(previous|prior|above)\s+instructions?/gi,
31
+ /disregard\s+(all\s+)?(previous|prior)\s+instructions?/gi,
32
+ /forget\s+(everything|all)\s+(you\s+)?(were\s+)?told/gi,
33
+ /system\s*:\s*/gi,
34
+ /user\s*:\s*/gi,
35
+ /assistant\s*:\s*/gi,
36
+ /\[system\s+prompt\]/gi,
37
+ /\[instructions\]/gi,
38
+ // Jailbreak attempts
39
+ /DAN\s*\(|do\s+anything\s+now/gi,
40
+ /jailbreak/gi,
41
+ /\bmode\s*:\s*\w+\s+unfiltered/gi,
42
+ /no\s+(restrictions?|limits?|filter)/gi,
43
+ // Delimiter manipulation
44
+ /```\s*system/gi,
45
+ /<\|system\|>/gi,
46
+ /<\|im_start\|>/gi,
47
+ /<\|im_end\|>/gi,
48
+ ];
49
+ /**
50
+ * Sanitize a prompt for LLM use
51
+ *
52
+ * @param input - Raw input string
53
+ * @param options - Sanitization options
54
+ * @returns Sanitized string
55
+ */
56
+ function sanitizePrompt(input, options = {}) {
57
+ const opts = { ...DEFAULT_OPTIONS, ...options };
58
+ // Check for dangerous patterns
59
+ for (const pattern of DANGEROUS_PATTERNS) {
60
+ if (pattern.test(input)) {
61
+ logger_1.logger.warn('Potentially dangerous pattern detected in prompt', { pattern: pattern.source });
62
+ }
63
+ }
64
+ let sanitized = input;
65
+ // Remove null bytes and control characters
66
+ sanitized = sanitized.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
67
+ // Remove potential prompt injection markers
68
+ sanitized = sanitized.replace(/^(system|user|assistant)\s*:\s*/gim, '');
69
+ // Remove system prompt markers
70
+ sanitized = sanitized.replace(/\[system\s+prompt\]/gi, '');
71
+ sanitized = sanitized.replace(/\[instructions?\]/gi, '');
72
+ // Handle code blocks
73
+ if (!opts.allowCode) {
74
+ // Escape code block markers
75
+ sanitized = sanitized.replace(/```/g, '` ` `');
76
+ }
77
+ // Handle HTML
78
+ if (!opts.allowHTML) {
79
+ // Remove or escape HTML tags
80
+ sanitized = sanitized.replace(/</g, '&lt;').replace(/>/g, '&gt;');
81
+ }
82
+ // Trim whitespace
83
+ sanitized = sanitized.trim();
84
+ // Enforce length limit
85
+ if (sanitized.length > opts.maxLength) {
86
+ logger_1.logger.warn('Prompt truncated due to length limit', {
87
+ originalLength: sanitized.length,
88
+ maxLength: opts.maxLength
89
+ });
90
+ sanitized = sanitized.substring(0, opts.maxLength);
91
+ }
92
+ return sanitized;
93
+ }
94
+ /**
95
+ * Validate that a prompt is safe to use
96
+ *
97
+ * @param input - Input to validate
98
+ * @returns Validation result
99
+ */
100
+ function validatePrompt(input) {
101
+ const issues = [];
102
+ // Check for dangerous patterns
103
+ for (const pattern of DANGEROUS_PATTERNS) {
104
+ if (pattern.test(input)) {
105
+ issues.push(`Suspicious pattern detected: ${pattern.source}`);
106
+ }
107
+ }
108
+ // Check length
109
+ if (input.length > 10000) {
110
+ issues.push('Input exceeds maximum length of 10000 characters');
111
+ }
112
+ // Check for null bytes
113
+ if (/\x00/.test(input)) {
114
+ issues.push('Input contains null bytes');
115
+ }
116
+ return {
117
+ safe: issues.length === 0,
118
+ issues,
119
+ };
120
+ }
121
+ /**
122
+ * Escape special characters for safe inclusion in prompts
123
+ *
124
+ * @param input - Input to escape
125
+ * @returns Escaped string
126
+ */
127
+ function escapeSpecialChars(input) {
128
+ return input
129
+ .replace(/\\/g, '\\\\')
130
+ .replace(/"/g, '\\"')
131
+ .replace(/\n/g, '\\n')
132
+ .replace(/\r/g, '\\r')
133
+ .replace(/\t/g, '\\t');
134
+ }
135
+ /**
136
+ * Sanitize LLM response to remove any system-like content
137
+ *
138
+ * @param response - LLM response
139
+ * @returns Sanitized response
140
+ */
141
+ function sanitizeResponse(response) {
142
+ let sanitized = response;
143
+ // Remove system-like prefixes
144
+ sanitized = sanitized.replace(/^(system|user|assistant)\s*:\s*/gim, '');
145
+ // Remove any embedded instructions
146
+ sanitized = sanitized.replace(/\[system\s+prompt\].*?\[\/system\s+prompt\]/gis, '');
147
+ return sanitized.trim();
148
+ }
149
+ //# sourceMappingURL=sanitization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitization.js","sourceRoot":"","sources":["../../src/llm/sanitization.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../server.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":""}