gthinking 1.3.0 → 2.1.2

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 +248 -246
  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 +323 -0
  7. package/dist/analysis/analysis-engine.js.map +1 -0
  8. package/dist/core/config.d.ts +1423 -0
  9. package/dist/core/config.d.ts.map +1 -0
  10. package/dist/core/config.js +445 -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 +384 -0
  161. package/src/core/config.ts +462 -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,323 @@
1
+ "use strict";
2
+ /**
3
+ * Analysis Engine for gthinking v2.0.0
4
+ * AI-powered content analysis including sentiment, entities, topics, and more.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AnalysisEngine = void 0;
8
+ exports.createAnalysisEngine = createAnalysisEngine;
9
+ const events_1 = require("events");
10
+ const id_generator_1 = require("../utils/id-generator");
11
+ const logger_1 = require("../utils/logger");
12
+ const types_1 = require("../types");
13
+ const validation_1 = require("../utils/validation");
14
+ const errors_1 = require("../core/errors");
15
+ const logger = new logger_1.Logger('AnalysisEngine');
16
+ /**
17
+ * Analysis Engine
18
+ */
19
+ class AnalysisEngine extends events_1.EventEmitter {
20
+ llmService = null;
21
+ constructor(llmService) {
22
+ super();
23
+ this.llmService = llmService || null;
24
+ }
25
+ /**
26
+ * Set the LLM service
27
+ * @param llmService - The LLM service instance
28
+ */
29
+ setLLMService(llmService) {
30
+ this.llmService = llmService;
31
+ }
32
+ /**
33
+ * Analyze content based on request
34
+ * @param request - The analysis request
35
+ * @returns Complete analysis result
36
+ */
37
+ async analyze(request) {
38
+ const startTime = Date.now();
39
+ // Validate request
40
+ const validatedRequest = (0, validation_1.validateSchema)(types_1.AnalysisRequestSchema, request);
41
+ logger.info('Starting analysis', {
42
+ types: validatedRequest.types,
43
+ contentLength: validatedRequest.content.length
44
+ });
45
+ this.emit('analysis:start', { request: validatedRequest });
46
+ try {
47
+ // Execute requested analysis types in parallel
48
+ const tasks = [];
49
+ const result = {
50
+ success: true,
51
+ timestamp: new Date(),
52
+ request: validatedRequest,
53
+ rawContent: validatedRequest.options.includeRaw ? validatedRequest.content : undefined,
54
+ };
55
+ if (validatedRequest.types.includes(types_1.AnalysisType.SENTIMENT)) {
56
+ tasks.push(this.analyzeSentiment(validatedRequest).then(res => { result.sentiment = res; }));
57
+ }
58
+ if (validatedRequest.types.includes(types_1.AnalysisType.ENTITY)) {
59
+ tasks.push(this.extractEntities(validatedRequest).then(res => { result.entities = res; }));
60
+ }
61
+ if (validatedRequest.types.includes(types_1.AnalysisType.TOPIC)) {
62
+ tasks.push(this.extractTopics(validatedRequest).then(res => { result.topics = res; }));
63
+ }
64
+ if (validatedRequest.types.includes(types_1.AnalysisType.KEYWORD)) {
65
+ tasks.push(this.extractKeywords(validatedRequest).then(res => { result.keywords = res; }));
66
+ }
67
+ if (validatedRequest.types.includes(types_1.AnalysisType.SUMMARY)) {
68
+ tasks.push(this.generateSummary(validatedRequest).then(res => { result.summary = res; }));
69
+ }
70
+ if (validatedRequest.types.includes(types_1.AnalysisType.READABILITY)) {
71
+ // Readability is calculated locally, no LLM needed
72
+ tasks.push(Promise.resolve(this.analyzeReadability(validatedRequest.content)).then(res => { result.readability = res; }));
73
+ }
74
+ // Wait for all tasks to complete
75
+ await Promise.all(tasks);
76
+ const duration = Date.now() - startTime;
77
+ const finalResult = {
78
+ ...result,
79
+ duration,
80
+ confidence: this.calculateOverallConfidence(result),
81
+ errors: [],
82
+ };
83
+ logger.info('Analysis completed', { duration });
84
+ this.emit('analysis:complete', { result: finalResult });
85
+ return finalResult;
86
+ }
87
+ catch (error) {
88
+ logger.error('Analysis failed', { error });
89
+ this.emit('analysis:error', { error });
90
+ throw new errors_1.StageError(`Analysis failed: ${error.message}`, types_1.ThinkingStage.ANALYSIS, false, { originalError: error });
91
+ }
92
+ }
93
+ /**
94
+ * Analyze sentiment
95
+ */
96
+ async analyzeSentiment(request) {
97
+ this.ensureLLM();
98
+ const prompt = `
99
+ Analyze the sentiment of the following text.
100
+ Return a JSON object with:
101
+ - overall: "positive", "negative", "neutral", or "mixed"
102
+ - score: number between -1 (negative) and 1 (positive)
103
+ - confidence: number between 0 and 1
104
+ - emotions: object with scores (0-1) for joy, sadness, anger, fear, surprise, disgust
105
+
106
+ Text: "${request.content.slice(0, 5000)}"
107
+ `;
108
+ return this.executeLLMAnalysis(prompt);
109
+ }
110
+ /**
111
+ * Extract entities
112
+ */
113
+ async extractEntities(request) {
114
+ this.ensureLLM();
115
+ const prompt = `
116
+ Extract entities from the following text.
117
+ Return a JSON object with:
118
+ - entities: array of objects with { text, type, confidence }
119
+ - totalCount: total number of entities
120
+
121
+ Entity types: person, organization, location, product, event, concept, date, money, percent
122
+ Max entities: ${request.options.maxEntities}
123
+
124
+ Text: "${request.content.slice(0, 5000)}"
125
+ `;
126
+ const result = await this.executeLLMAnalysis(prompt);
127
+ // Post-process to ensure correct structure
128
+ const entities = (result.entities || []).map((e) => ({
129
+ id: (0, id_generator_1.generateUUID)(),
130
+ text: e.text,
131
+ type: e.type,
132
+ startIndex: 0, // Placeholder
133
+ endIndex: 0, // Placeholder
134
+ confidence: e.confidence || 0.8,
135
+ metadata: {}
136
+ }));
137
+ return {
138
+ entities,
139
+ totalCount: entities.length,
140
+ byType: {} // Needs aggregation logic if needed
141
+ };
142
+ }
143
+ /**
144
+ * Extract topics
145
+ */
146
+ async extractTopics(request) {
147
+ this.ensureLLM();
148
+ const prompt = `
149
+ Extract main topics from the following text.
150
+ Return a JSON object with:
151
+ - topics: array of objects with { name, confidence, relevance, keywords (array of strings) }
152
+ - mainTopic: string
153
+
154
+ Max topics: ${request.options.maxTopics}
155
+
156
+ Text: "${request.content.slice(0, 5000)}"
157
+ `;
158
+ const result = await this.executeLLMAnalysis(prompt);
159
+ const topics = (result.topics || []).map((t) => ({
160
+ id: (0, id_generator_1.generateUUID)(),
161
+ name: t.name,
162
+ confidence: t.confidence || 0.8,
163
+ relevance: t.relevance || 0.5,
164
+ keywords: t.keywords || []
165
+ }));
166
+ return {
167
+ topics,
168
+ mainTopic: result.mainTopic,
169
+ topicHierarchy: []
170
+ };
171
+ }
172
+ /**
173
+ * Extract keywords
174
+ */
175
+ async extractKeywords(request) {
176
+ this.ensureLLM();
177
+ const prompt = `
178
+ Extract keywords and key phrases from the following text.
179
+ Return a JSON object with:
180
+ - keywords: array of objects with { text, score, frequency }
181
+ - keyPhrases: array of strings
182
+
183
+ Max keywords: ${request.options.maxKeywords}
184
+
185
+ Text: "${request.content.slice(0, 5000)}"
186
+ `;
187
+ const result = await this.executeLLMAnalysis(prompt);
188
+ const keywords = (result.keywords || []).map((k) => ({
189
+ text: k.text,
190
+ score: k.score || 0.5,
191
+ frequency: k.frequency || 1,
192
+ tfidf: 0,
193
+ isKeyPhrase: false
194
+ }));
195
+ return {
196
+ keywords,
197
+ keyPhrases: result.keyPhrases || [],
198
+ totalWords: request.content.split(/\s+/).length,
199
+ uniqueWords: 0 // Placeholder
200
+ };
201
+ }
202
+ /**
203
+ * Generate summary
204
+ */
205
+ async generateSummary(request) {
206
+ this.ensureLLM();
207
+ const prompt = `
208
+ Summarize the following text.
209
+ Return a JSON object with:
210
+ - summary: string
211
+ - keyPoints: array of strings
212
+
213
+ Length: ${request.options.summaryLength}
214
+
215
+ Text: "${request.content.slice(0, 10000)}"
216
+ `;
217
+ const result = await this.executeLLMAnalysis(prompt);
218
+ return {
219
+ summary: result.summary,
220
+ keyPoints: result.keyPoints || [],
221
+ originalLength: request.content.length,
222
+ summaryLength: result.summary?.length || 0,
223
+ compressionRatio: result.summary ? result.summary.length / request.content.length : 0,
224
+ method: 'abstractive'
225
+ };
226
+ }
227
+ /**
228
+ * Calculate readability metrics (Locally)
229
+ */
230
+ analyzeReadability(text) {
231
+ const words = text.trim().split(/\s+/).length;
232
+ const sentences = text.split(/[.!?]+/).length - 1 || 1;
233
+ const syllables = this.countSyllables(text);
234
+ const complexWords = this.countComplexWords(text);
235
+ // Flesch-Kincaid Grade Level
236
+ const fkGrade = 0.39 * (words / sentences) + 11.8 * (syllables / words) - 15.59;
237
+ // Flesch Reading Ease
238
+ const fReadingEase = 206.835 - 1.015 * (words / sentences) - 84.6 * (syllables / words);
239
+ return {
240
+ score: Math.max(0, Math.min(100, fReadingEase)),
241
+ grade: this.getGradeLevel(fkGrade),
242
+ metrics: {
243
+ fleschKincaid: fkGrade,
244
+ fleschReadingEase: fReadingEase,
245
+ gunningFog: 0, // Placeholder
246
+ smogIndex: 0, // Placeholder
247
+ colemanLiau: 0, // Placeholder
248
+ automatedReadability: 0 // Placeholder
249
+ },
250
+ statistics: {
251
+ wordCount: words,
252
+ sentenceCount: sentences,
253
+ syllableCount: syllables,
254
+ avgWordsPerSentence: words / sentences,
255
+ avgSyllablesPerWord: syllables / words,
256
+ complexWordCount: complexWords,
257
+ complexWordPercentage: (complexWords / words) * 100
258
+ }
259
+ };
260
+ }
261
+ countSyllables(text) {
262
+ // Very basic syllable counter
263
+ return text.length / 3;
264
+ }
265
+ countComplexWords(text) {
266
+ // Placeholder
267
+ return text.split(/\s+/).filter(w => w.length > 6).length;
268
+ }
269
+ getGradeLevel(score) {
270
+ if (score < 5)
271
+ return 'elementary';
272
+ if (score < 8)
273
+ return 'middle_school';
274
+ if (score < 12)
275
+ return 'high_school';
276
+ if (score < 16)
277
+ return 'college';
278
+ return 'graduate';
279
+ }
280
+ /**
281
+ * Execute LLM analysis with retries and parsing
282
+ */
283
+ async executeLLMAnalysis(prompt) {
284
+ if (!this.llmService)
285
+ throw new Error('LLM Service not initialized');
286
+ const response = await (0, errors_1.withRetry)(async () => {
287
+ return this.llmService.complete(prompt, 'You are a precise text analysis engine. Output valid JSON only.');
288
+ });
289
+ // Clean up potential markdown code blocks
290
+ const cleanResponse = response.replace(/```json/g, '').replace(/```/g, '').trim();
291
+ const parsed = (0, validation_1.safeJsonParse)(cleanResponse);
292
+ if (!parsed) {
293
+ throw new Error('Failed to parse LLM response as JSON');
294
+ }
295
+ return parsed;
296
+ }
297
+ ensureLLM() {
298
+ if (!this.llmService) {
299
+ throw new Error('LLM Service is required for this analysis type');
300
+ }
301
+ }
302
+ calculateOverallConfidence(result) {
303
+ // Simple average of available confidences
304
+ const confidences = [];
305
+ if (result.sentiment)
306
+ confidences.push(result.sentiment.confidence);
307
+ if (result.entities)
308
+ confidences.push(0.8); // Entities usually high
309
+ if (result.topics)
310
+ confidences.push(0.8);
311
+ if (confidences.length === 0)
312
+ return 0.8;
313
+ return confidences.reduce((a, b) => a + b, 0) / confidences.length;
314
+ }
315
+ }
316
+ exports.AnalysisEngine = AnalysisEngine;
317
+ /**
318
+ * Factory function
319
+ */
320
+ function createAnalysisEngine(llmService) {
321
+ return new AnalysisEngine(llmService);
322
+ }
323
+ //# sourceMappingURL=analysis-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis-engine.js","sourceRoot":"","sources":["../../src/analysis/analysis-engine.ts"],"names":[],"mappings":"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"}