@houtini/lm 1.0.0

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 (260) hide show
  1. package/CHANGELOG.md +273 -0
  2. package/LICENSE +21 -0
  3. package/README.md +203 -0
  4. package/dist/cache/analysis-cache.d.ts +33 -0
  5. package/dist/cache/analysis-cache.d.ts.map +1 -0
  6. package/dist/cache/analysis-cache.js +56 -0
  7. package/dist/cache/analysis-cache.js.map +1 -0
  8. package/dist/cache/cache-manager.d.ts +29 -0
  9. package/dist/cache/cache-manager.d.ts.map +1 -0
  10. package/dist/cache/cache-manager.js +85 -0
  11. package/dist/cache/cache-manager.js.map +1 -0
  12. package/dist/cache/index.d.ts +16 -0
  13. package/dist/cache/index.d.ts.map +1 -0
  14. package/dist/cache/index.js +17 -0
  15. package/dist/cache/index.js.map +1 -0
  16. package/dist/cache/prompt-cache.d.ts +33 -0
  17. package/dist/cache/prompt-cache.d.ts.map +1 -0
  18. package/dist/cache/prompt-cache.js +61 -0
  19. package/dist/cache/prompt-cache.js.map +1 -0
  20. package/dist/config.d.ts +43 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +70 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/core/ThreeStagePromptManager.d.ts +39 -0
  25. package/dist/core/ThreeStagePromptManager.d.ts.map +1 -0
  26. package/dist/core/ThreeStagePromptManager.js +176 -0
  27. package/dist/core/ThreeStagePromptManager.js.map +1 -0
  28. package/dist/index.d.ts +6 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +230 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/plugins/base-plugin.d.ts +47 -0
  33. package/dist/plugins/base-plugin.d.ts.map +1 -0
  34. package/dist/plugins/base-plugin.js +90 -0
  35. package/dist/plugins/base-plugin.js.map +1 -0
  36. package/dist/plugins/index.d.ts +58 -0
  37. package/dist/plugins/index.d.ts.map +1 -0
  38. package/dist/plugins/index.js +161 -0
  39. package/dist/plugins/index.js.map +1 -0
  40. package/dist/plugins/types.d.ts +5 -0
  41. package/dist/plugins/types.d.ts.map +1 -0
  42. package/dist/plugins/types.js +5 -0
  43. package/dist/plugins/types.js.map +1 -0
  44. package/dist/prompts/analyze/code-quality.d.ts +116 -0
  45. package/dist/prompts/analyze/code-quality.d.ts.map +1 -0
  46. package/dist/prompts/analyze/code-quality.js +433 -0
  47. package/dist/prompts/analyze/code-quality.js.map +1 -0
  48. package/dist/prompts/analyze/compare-integration.d.ts +130 -0
  49. package/dist/prompts/analyze/compare-integration.d.ts.map +1 -0
  50. package/dist/prompts/analyze/compare-integration.js +543 -0
  51. package/dist/prompts/analyze/compare-integration.js.map +1 -0
  52. package/dist/prompts/analyze/count-files.d.ts +109 -0
  53. package/dist/prompts/analyze/count-files.d.ts.map +1 -0
  54. package/dist/prompts/analyze/count-files.js +399 -0
  55. package/dist/prompts/analyze/count-files.js.map +1 -0
  56. package/dist/prompts/analyze/database-queries.d.ts +156 -0
  57. package/dist/prompts/analyze/database-queries.d.ts.map +1 -0
  58. package/dist/prompts/analyze/database-queries.js +759 -0
  59. package/dist/prompts/analyze/database-queries.js.map +1 -0
  60. package/dist/prompts/analyze/dependencies.d.ts +97 -0
  61. package/dist/prompts/analyze/dependencies.d.ts.map +1 -0
  62. package/dist/prompts/analyze/dependencies.js +333 -0
  63. package/dist/prompts/analyze/dependencies.js.map +1 -0
  64. package/dist/prompts/analyze/diff-signatures.d.ts +139 -0
  65. package/dist/prompts/analyze/diff-signatures.d.ts.map +1 -0
  66. package/dist/prompts/analyze/diff-signatures.js +702 -0
  67. package/dist/prompts/analyze/diff-signatures.js.map +1 -0
  68. package/dist/prompts/analyze/find-patterns.d.ts +128 -0
  69. package/dist/prompts/analyze/find-patterns.d.ts.map +1 -0
  70. package/dist/prompts/analyze/find-patterns.js +520 -0
  71. package/dist/prompts/analyze/find-patterns.js.map +1 -0
  72. package/dist/prompts/analyze/find-unused-css.d.ts +151 -0
  73. package/dist/prompts/analyze/find-unused-css.d.ts.map +1 -0
  74. package/dist/prompts/analyze/find-unused-css.js +754 -0
  75. package/dist/prompts/analyze/find-unused-css.js.map +1 -0
  76. package/dist/prompts/analyze/n8n-workflow.d.ts +137 -0
  77. package/dist/prompts/analyze/n8n-workflow.d.ts.map +1 -0
  78. package/dist/prompts/analyze/n8n-workflow.js +529 -0
  79. package/dist/prompts/analyze/n8n-workflow.js.map +1 -0
  80. package/dist/prompts/analyze/project-structure.d.ts +126 -0
  81. package/dist/prompts/analyze/project-structure.d.ts.map +1 -0
  82. package/dist/prompts/analyze/project-structure.js +569 -0
  83. package/dist/prompts/analyze/project-structure.js.map +1 -0
  84. package/dist/prompts/analyze/security-audit.d.ts +142 -0
  85. package/dist/prompts/analyze/security-audit.d.ts.map +1 -0
  86. package/dist/prompts/analyze/security-audit.js +637 -0
  87. package/dist/prompts/analyze/security-audit.js.map +1 -0
  88. package/dist/prompts/analyze/single-file.d.ts +162 -0
  89. package/dist/prompts/analyze/single-file.d.ts.map +1 -0
  90. package/dist/prompts/analyze/single-file.js +665 -0
  91. package/dist/prompts/analyze/single-file.js.map +1 -0
  92. package/dist/prompts/analyze/trace-execution.d.ts +126 -0
  93. package/dist/prompts/analyze/trace-execution.d.ts.map +1 -0
  94. package/dist/prompts/analyze/trace-execution.js +609 -0
  95. package/dist/prompts/analyze/trace-execution.js.map +1 -0
  96. package/dist/prompts/analyze/wordpress-plugin-audit.d.ts +116 -0
  97. package/dist/prompts/analyze/wordpress-plugin-audit.d.ts.map +1 -0
  98. package/dist/prompts/analyze/wordpress-plugin-audit.js +454 -0
  99. package/dist/prompts/analyze/wordpress-plugin-audit.js.map +1 -0
  100. package/dist/prompts/analyze/wordpress-security.d.ts +146 -0
  101. package/dist/prompts/analyze/wordpress-security.d.ts.map +1 -0
  102. package/dist/prompts/analyze/wordpress-security.js +698 -0
  103. package/dist/prompts/analyze/wordpress-security.js.map +1 -0
  104. package/dist/prompts/analyze/wordpress-theme-audit.d.ts +114 -0
  105. package/dist/prompts/analyze/wordpress-theme-audit.d.ts.map +1 -0
  106. package/dist/prompts/analyze/wordpress-theme-audit.js +538 -0
  107. package/dist/prompts/analyze/wordpress-theme-audit.js.map +1 -0
  108. package/dist/prompts/custom/custom-prompt.d.ts +135 -0
  109. package/dist/prompts/custom/custom-prompt.d.ts.map +1 -0
  110. package/dist/prompts/custom/custom-prompt.js +419 -0
  111. package/dist/prompts/custom/custom-prompt.js.map +1 -0
  112. package/dist/prompts/fun/arcade-game.d.ts +152 -0
  113. package/dist/prompts/fun/arcade-game.d.ts.map +1 -0
  114. package/dist/prompts/fun/arcade-game.js +653 -0
  115. package/dist/prompts/fun/arcade-game.js.map +1 -0
  116. package/dist/prompts/fun/create_text_adventure.d.ts +100 -0
  117. package/dist/prompts/fun/create_text_adventure.d.ts.map +1 -0
  118. package/dist/prompts/fun/create_text_adventure.js +397 -0
  119. package/dist/prompts/fun/create_text_adventure.js.map +1 -0
  120. package/dist/prompts/fun/css-art-generator.d.ts +168 -0
  121. package/dist/prompts/fun/css-art-generator.d.ts.map +1 -0
  122. package/dist/prompts/fun/css-art-generator.js +827 -0
  123. package/dist/prompts/fun/css-art-generator.js.map +1 -0
  124. package/dist/prompts/generate/project-documentation.d.ts +137 -0
  125. package/dist/prompts/generate/project-documentation.d.ts.map +1 -0
  126. package/dist/prompts/generate/project-documentation.js +666 -0
  127. package/dist/prompts/generate/project-documentation.js.map +1 -0
  128. package/dist/prompts/generate/refactoring.d.ts +164 -0
  129. package/dist/prompts/generate/refactoring.d.ts.map +1 -0
  130. package/dist/prompts/generate/refactoring.js +621 -0
  131. package/dist/prompts/generate/refactoring.js.map +1 -0
  132. package/dist/prompts/generate/responsive-component.d.ts +147 -0
  133. package/dist/prompts/generate/responsive-component.d.ts.map +1 -0
  134. package/dist/prompts/generate/responsive-component.js +955 -0
  135. package/dist/prompts/generate/responsive-component.js.map +1 -0
  136. package/dist/prompts/generate/typescript-conversion.d.ts +144 -0
  137. package/dist/prompts/generate/typescript-conversion.d.ts.map +1 -0
  138. package/dist/prompts/generate/typescript-conversion.js +527 -0
  139. package/dist/prompts/generate/typescript-conversion.js.map +1 -0
  140. package/dist/prompts/generate/unit-tests.d.ts +139 -0
  141. package/dist/prompts/generate/unit-tests.d.ts.map +1 -0
  142. package/dist/prompts/generate/unit-tests.js +578 -0
  143. package/dist/prompts/generate/unit-tests.js.map +1 -0
  144. package/dist/prompts/generate/wordpress-plugin.d.ts +179 -0
  145. package/dist/prompts/generate/wordpress-plugin.d.ts.map +1 -0
  146. package/dist/prompts/generate/wordpress-plugin.js +763 -0
  147. package/dist/prompts/generate/wordpress-plugin.js.map +1 -0
  148. package/dist/prompts/generate/wordpress-theme-from-static.d.ts +177 -0
  149. package/dist/prompts/generate/wordpress-theme-from-static.d.ts.map +1 -0
  150. package/dist/prompts/generate/wordpress-theme-from-static.js +695 -0
  151. package/dist/prompts/generate/wordpress-theme-from-static.js.map +1 -0
  152. package/dist/prompts/shared/cache-manager.d.ts +45 -0
  153. package/dist/prompts/shared/cache-manager.d.ts.map +1 -0
  154. package/dist/prompts/shared/cache-manager.js +129 -0
  155. package/dist/prompts/shared/cache-manager.js.map +1 -0
  156. package/dist/prompts/shared/helpers.d.ts +39 -0
  157. package/dist/prompts/shared/helpers.d.ts.map +1 -0
  158. package/dist/prompts/shared/helpers.js +151 -0
  159. package/dist/prompts/shared/helpers.js.map +1 -0
  160. package/dist/prompts/shared/templates.d.ts +35 -0
  161. package/dist/prompts/shared/templates.d.ts.map +1 -0
  162. package/dist/prompts/shared/templates.js +77 -0
  163. package/dist/prompts/shared/templates.js.map +1 -0
  164. package/dist/prompts/shared/types.d.ts +112 -0
  165. package/dist/prompts/shared/types.d.ts.map +1 -0
  166. package/dist/prompts/shared/types.js +5 -0
  167. package/dist/prompts/shared/types.js.map +1 -0
  168. package/dist/prompts/system/find-unused-files.d.ts +106 -0
  169. package/dist/prompts/system/find-unused-files.d.ts.map +1 -0
  170. package/dist/prompts/system/find-unused-files.js +353 -0
  171. package/dist/prompts/system/find-unused-files.js.map +1 -0
  172. package/dist/security/index.d.ts +39 -0
  173. package/dist/security/index.d.ts.map +1 -0
  174. package/dist/security/index.js +46 -0
  175. package/dist/security/index.js.map +1 -0
  176. package/dist/security/integration-helpers.d.ts +121 -0
  177. package/dist/security/integration-helpers.d.ts.map +1 -0
  178. package/dist/security/integration-helpers.js +190 -0
  179. package/dist/security/integration-helpers.js.map +1 -0
  180. package/dist/security/output-encoder.d.ts +94 -0
  181. package/dist/security/output-encoder.d.ts.map +1 -0
  182. package/dist/security/output-encoder.js +295 -0
  183. package/dist/security/output-encoder.js.map +1 -0
  184. package/dist/security/prompt-injection-guard.d.ts +59 -0
  185. package/dist/security/prompt-injection-guard.d.ts.map +1 -0
  186. package/dist/security/prompt-injection-guard.js +249 -0
  187. package/dist/security/prompt-injection-guard.js.map +1 -0
  188. package/dist/security/sanitisation.d.ts +67 -0
  189. package/dist/security/sanitisation.d.ts.map +1 -0
  190. package/dist/security/sanitisation.js +398 -0
  191. package/dist/security/sanitisation.js.map +1 -0
  192. package/dist/security/security-service.d.ts +103 -0
  193. package/dist/security/security-service.d.ts.map +1 -0
  194. package/dist/security/security-service.js +303 -0
  195. package/dist/security/security-service.js.map +1 -0
  196. package/dist/security-config.d.ts +45 -0
  197. package/dist/security-config.d.ts.map +1 -0
  198. package/dist/security-config.js +63 -0
  199. package/dist/security-config.js.map +1 -0
  200. package/dist/system/function-list.d.ts +61 -0
  201. package/dist/system/function-list.d.ts.map +1 -0
  202. package/dist/system/function-list.js +111 -0
  203. package/dist/system/function-list.js.map +1 -0
  204. package/dist/system/function-registry.d.ts +23 -0
  205. package/dist/system/function-registry.d.ts.map +1 -0
  206. package/dist/system/function-registry.js +136 -0
  207. package/dist/system/function-registry.js.map +1 -0
  208. package/dist/system/health-check.d.ts +33 -0
  209. package/dist/system/health-check.d.ts.map +1 -0
  210. package/dist/system/health-check.js +98 -0
  211. package/dist/system/health-check.js.map +1 -0
  212. package/dist/system/path-resolver.d.ts +55 -0
  213. package/dist/system/path-resolver.d.ts.map +1 -0
  214. package/dist/system/path-resolver.js +90 -0
  215. package/dist/system/path-resolver.js.map +1 -0
  216. package/dist/templates/plugin-template.d.ts +121 -0
  217. package/dist/templates/plugin-template.d.ts.map +1 -0
  218. package/dist/templates/plugin-template.js +450 -0
  219. package/dist/templates/plugin-template.js.map +1 -0
  220. package/dist/types/chunking-types.d.ts +88 -0
  221. package/dist/types/chunking-types.d.ts.map +1 -0
  222. package/dist/types/chunking-types.js +18 -0
  223. package/dist/types/chunking-types.js.map +1 -0
  224. package/dist/types/prompt-stages.d.ts +42 -0
  225. package/dist/types/prompt-stages.d.ts.map +1 -0
  226. package/dist/types/prompt-stages.js +6 -0
  227. package/dist/types/prompt-stages.js.map +1 -0
  228. package/dist/types.d.ts +46 -0
  229. package/dist/types.d.ts.map +1 -0
  230. package/dist/types.js +6 -0
  231. package/dist/types.js.map +1 -0
  232. package/dist/utils/css-parser.d.ts +26 -0
  233. package/dist/utils/css-parser.d.ts.map +1 -0
  234. package/dist/utils/css-parser.js +117 -0
  235. package/dist/utils/css-parser.js.map +1 -0
  236. package/dist/utils/path-resolver.d.ts +13 -0
  237. package/dist/utils/path-resolver.d.ts.map +1 -0
  238. package/dist/utils/path-resolver.js +78 -0
  239. package/dist/utils/path-resolver.js.map +1 -0
  240. package/dist/utils/plugin-utilities.d.ts +171 -0
  241. package/dist/utils/plugin-utilities.d.ts.map +1 -0
  242. package/dist/utils/plugin-utilities.js +221 -0
  243. package/dist/utils/plugin-utilities.js.map +1 -0
  244. package/dist/utils/streamHandler.d.ts +3 -0
  245. package/dist/utils/streamHandler.d.ts.map +1 -0
  246. package/dist/utils/streamHandler.js +137 -0
  247. package/dist/utils/streamHandler.js.map +1 -0
  248. package/dist/validation/output-validator.d.ts +136 -0
  249. package/dist/validation/output-validator.d.ts.map +1 -0
  250. package/dist/validation/output-validator.js +262 -0
  251. package/dist/validation/output-validator.js.map +1 -0
  252. package/dist/validation/response-factory.d.ts +44 -0
  253. package/dist/validation/response-factory.d.ts.map +1 -0
  254. package/dist/validation/response-factory.js +202 -0
  255. package/dist/validation/response-factory.js.map +1 -0
  256. package/dist/validation/schemas.d.ts +519 -0
  257. package/dist/validation/schemas.d.ts.map +1 -0
  258. package/dist/validation/schemas.js +6 -0
  259. package/dist/validation/schemas.js.map +1 -0
  260. package/package.json +72 -0
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Output Validation System for Houtini LM MCP
3
+ * Centralized validation and formatting for all function outputs
4
+ * Based on Functional Specification v4.0
5
+ */
6
+ /**
7
+ * Central Output Validator Class
8
+ * All functions should use this to ensure consistent output format
9
+ */
10
+ export class OutputValidator {
11
+ /**
12
+ * Create a successful analysis response
13
+ */
14
+ static createAnalyzeResponse(data, modelUsed, executionTimeMs) {
15
+ return {
16
+ success: true,
17
+ timestamp: new Date().toISOString(),
18
+ modelUsed,
19
+ executionTimeMs: executionTimeMs || (Date.now() - this.startTime),
20
+ data
21
+ };
22
+ }
23
+ /**
24
+ * Create a successful generation response
25
+ */
26
+ static createGenerateResponse(data, modelUsed, executionTimeMs) {
27
+ return {
28
+ success: true,
29
+ timestamp: new Date().toISOString(),
30
+ modelUsed,
31
+ executionTimeMs: executionTimeMs || (Date.now() - this.startTime),
32
+ data
33
+ };
34
+ }
35
+ /**
36
+ * Create a successful multi-file response
37
+ */
38
+ static createMultiFileResponse(data, modelUsed, executionTimeMs) {
39
+ return {
40
+ success: true,
41
+ timestamp: new Date().toISOString(),
42
+ modelUsed,
43
+ executionTimeMs: executionTimeMs || (Date.now() - this.startTime),
44
+ data
45
+ };
46
+ }
47
+ /**
48
+ * Create a successful system response
49
+ */
50
+ static createSystemResponse(data, modelUsed = 'system', executionTimeMs) {
51
+ return {
52
+ success: true,
53
+ timestamp: new Date().toISOString(),
54
+ modelUsed,
55
+ executionTimeMs: executionTimeMs || (Date.now() - this.startTime),
56
+ data
57
+ };
58
+ }
59
+ /**
60
+ * Create an error response (for any function type)
61
+ */
62
+ static createErrorResponse(errorCode, errorMessage, details, modelUsed = 'unknown', executionTimeMs) {
63
+ return {
64
+ success: false,
65
+ timestamp: new Date().toISOString(),
66
+ modelUsed,
67
+ executionTimeMs: executionTimeMs || (Date.now() - this.startTime),
68
+ error: {
69
+ code: errorCode,
70
+ message: errorMessage,
71
+ details
72
+ }
73
+ };
74
+ }
75
+ /**
76
+ * Validate that a response matches the expected schema
77
+ */
78
+ static validateResponse(response, expectedType) {
79
+ // Basic structure validation
80
+ if (!response || typeof response !== 'object') {
81
+ return false;
82
+ }
83
+ // Required base fields
84
+ const requiredFields = ['success', 'timestamp', 'modelUsed', 'executionTimeMs'];
85
+ for (const field of requiredFields) {
86
+ if (!(field in response)) {
87
+ return false;
88
+ }
89
+ }
90
+ // Type-specific validation
91
+ if (response.success && !response.data) {
92
+ return false;
93
+ }
94
+ if (!response.success && !response.error) {
95
+ return false;
96
+ }
97
+ return true;
98
+ }
99
+ /**
100
+ * Set execution start time for timing calculations
101
+ */
102
+ static setStartTime() {
103
+ this.startTime = Date.now();
104
+ }
105
+ /**
106
+ * Get execution time since start
107
+ */
108
+ static getExecutionTime() {
109
+ return Date.now() - this.startTime;
110
+ }
111
+ }
112
+ OutputValidator.startTime = Date.now();
113
+ /**
114
+ * Standardize error codes
115
+ */
116
+ OutputValidator.ErrorCodes = {
117
+ INVALID_INPUT: 'INVALID_INPUT',
118
+ FILE_NOT_FOUND: 'FILE_NOT_FOUND',
119
+ MODEL_ERROR: 'MODEL_ERROR',
120
+ PARSING_ERROR: 'PARSING_ERROR',
121
+ VALIDATION_ERROR: 'VALIDATION_ERROR',
122
+ TIMEOUT: 'TIMEOUT',
123
+ SYSTEM_ERROR: 'SYSTEM_ERROR'
124
+ };
125
+ // Export specific response parsers for each function category
126
+ export class AnalysisOutputParser {
127
+ /**
128
+ * Parse LLM response into structured analysis data
129
+ */
130
+ static parseAnalysisResponse(llmResponse, functionName) {
131
+ try {
132
+ // Try to parse as JSON first
133
+ const parsed = JSON.parse(llmResponse);
134
+ return this.validateAndNormalizeAnalysis(parsed, functionName);
135
+ }
136
+ catch {
137
+ // If not JSON, parse as structured text
138
+ return this.parseStructuredText(llmResponse, functionName);
139
+ }
140
+ }
141
+ static validateAndNormalizeAnalysis(parsed, functionName) {
142
+ // Default structure
143
+ const data = {
144
+ summary: '',
145
+ findings: [],
146
+ suggestions: [],
147
+ metadata: {}
148
+ };
149
+ // Extract summary
150
+ if (parsed.summary || parsed.analysis) {
151
+ data.summary = parsed.summary || parsed.analysis;
152
+ }
153
+ // Extract findings
154
+ if (Array.isArray(parsed.findings)) {
155
+ data.findings = parsed.findings.map(this.normalizeFinding);
156
+ }
157
+ else if (Array.isArray(parsed.issues)) {
158
+ data.findings = parsed.issues.map(this.normalizeFinding);
159
+ }
160
+ // Extract suggestions
161
+ if (Array.isArray(parsed.suggestions)) {
162
+ data.suggestions = parsed.suggestions;
163
+ }
164
+ else if (Array.isArray(parsed.recommendations)) {
165
+ data.suggestions = parsed.recommendations;
166
+ }
167
+ // Function-specific parsing
168
+ if (functionName === 'analyze_single_file') {
169
+ data.metadata = {
170
+ structure: parsed.structure || {},
171
+ metrics: parsed.metrics || {},
172
+ patterns: parsed.patterns || []
173
+ };
174
+ }
175
+ return data;
176
+ }
177
+ static parseStructuredText(text, functionName) {
178
+ // Parse structured text responses (fallback)
179
+ const sections = text.split(/\n\n+/);
180
+ return {
181
+ summary: sections[0] || text.substring(0, 200),
182
+ findings: this.extractFindings(text),
183
+ suggestions: this.extractSuggestions(text),
184
+ metadata: { rawResponse: text }
185
+ };
186
+ }
187
+ static normalizeFinding(finding) {
188
+ return {
189
+ type: finding.type || 'info',
190
+ severity: finding.severity || 'medium',
191
+ message: finding.message || finding.description || '',
192
+ location: finding.location,
193
+ recommendation: finding.recommendation || finding.fix
194
+ };
195
+ }
196
+ static extractFindings(text) {
197
+ const findings = [];
198
+ // Simple regex-based extraction for common patterns
199
+ const issuePatterns = [
200
+ /(?:issue|problem|error):\s*(.+)/gi,
201
+ /(?:warning|caution):\s*(.+)/gi,
202
+ /(?:suggestion|improvement):\s*(.+)/gi
203
+ ];
204
+ for (const pattern of issuePatterns) {
205
+ const matches = text.matchAll(pattern);
206
+ for (const match of matches) {
207
+ findings.push({
208
+ type: 'issue',
209
+ severity: 'medium',
210
+ message: match[1].trim()
211
+ });
212
+ }
213
+ }
214
+ return findings;
215
+ }
216
+ static extractSuggestions(text) {
217
+ const suggestions = [];
218
+ const suggestionPatterns = [
219
+ /(?:recommend|suggest)(?:ation)?:\s*(.+)/gi,
220
+ /(?:consider|try):\s*(.+)/gi
221
+ ];
222
+ for (const pattern of suggestionPatterns) {
223
+ const matches = text.matchAll(pattern);
224
+ for (const match of matches) {
225
+ suggestions.push(match[1].trim());
226
+ }
227
+ }
228
+ return suggestions;
229
+ }
230
+ }
231
+ export class GenerationOutputParser {
232
+ /**
233
+ * Parse LLM response into structured generation data
234
+ */
235
+ static parseGenerationResponse(llmResponse, functionName, language) {
236
+ const lines = llmResponse.split('\n').length;
237
+ return {
238
+ content: llmResponse,
239
+ metadata: {
240
+ type: this.getContentType(functionName),
241
+ language: language || 'javascript',
242
+ framework: 'auto-detected'
243
+ },
244
+ statistics: {
245
+ linesGenerated: lines,
246
+ tokensUsed: Math.floor(llmResponse.length / 4) // Rough estimate
247
+ }
248
+ };
249
+ }
250
+ static getContentType(functionName) {
251
+ const typeMap = {
252
+ 'generate_unit_tests': 'test-code',
253
+ 'generate_documentation': 'documentation',
254
+ 'generate_wordpress_plugin': 'plugin-code',
255
+ 'generate_responsive_component': 'component-code',
256
+ 'convert_to_typescript': 'typescript-code',
257
+ 'suggest_refactoring': 'refactored-code'
258
+ };
259
+ return typeMap[functionName] || 'generated-content';
260
+ }
261
+ }
262
+ //# sourceMappingURL=output-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-validator.js","sourceRoot":"","sources":["../../src/validation/output-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Response Factory for Houtini LM MCP Functions
3
+ * Makes it incredibly easy to create correctly formatted responses
4
+ * Usage: ResponseFactory.createAnalyzeSingleFileResponse(data, modelId)
5
+ */
6
+ import { FunctionName, FunctionResponse, AnalyzeSingleFileResponse, SecurityAuditResponse, GenerateUnitTestsResponse, GenerateDocumentationResponse, HealthCheckResponse } from './schemas.js';
7
+ export declare class ResponseFactory {
8
+ private static startTime;
9
+ /**
10
+ * Set execution start time
11
+ */
12
+ static setStartTime(): void;
13
+ /**
14
+ * Get execution time since start
15
+ */
16
+ private static getExecutionTime;
17
+ static createAnalyzeSingleFileResponse(summary: string, structure: AnalyzeSingleFileResponse['data']['structure'], metrics: AnalyzeSingleFileResponse['data']['metrics'], findings: AnalyzeSingleFileResponse['data']['findings'], patterns: string[], suggestions: string[], modelUsed: string): AnalyzeSingleFileResponse;
18
+ static createSecurityAuditResponse(summary: SecurityAuditResponse['data']['summary'], vulnerabilities: SecurityAuditResponse['data']['vulnerabilities'], recommendations: string[], passedChecks: string[], dependencies: SecurityAuditResponse['data']['dependencies'] | undefined, modelUsed: string): SecurityAuditResponse;
19
+ static createGenerateUnitTestsResponse(tests: string, coverage: GenerateUnitTestsResponse['data']['coverage'], testCount: number, testTypes: GenerateUnitTestsResponse['data']['testTypes'], mocks: string[], setupRequired: string[], modelUsed: string): GenerateUnitTestsResponse;
20
+ static createGenerateDocumentationResponse(documentation: string, sections: GenerateDocumentationResponse['data']['sections'], metadata: GenerateDocumentationResponse['data']['metadata'], modelUsed: string): GenerateDocumentationResponse;
21
+ static createSystemResponse(data: {
22
+ status: string;
23
+ details: Record<string, any>;
24
+ }, modelUsed?: string, executionTimeMs?: number): any;
25
+ static createHealthCheckResponse(status: "healthy" | "unhealthy", connection: "established" | "failed", lmStudioUrl: string, error?: string, suggestion?: string, details?: HealthCheckResponse['data']['details'], contextLength?: number): HealthCheckResponse;
26
+ static createErrorResponse(functionName: FunctionName, errorCode: string, errorMessage: string, details?: any, modelUsed?: string): {
27
+ success: boolean;
28
+ timestamp: string;
29
+ modelUsed: string;
30
+ executionTimeMs: number;
31
+ error: {
32
+ code: string;
33
+ message: string;
34
+ details: any;
35
+ };
36
+ };
37
+ /**
38
+ * Universal response parser for all MCP functions
39
+ * Works with the universal template architecture - no function-specific switch statements needed!
40
+ */
41
+ static parseAndCreateResponse<T extends FunctionName>(functionName: T, llmResponse: string, modelUsed: string, additionalData?: any): FunctionResponse<T>;
42
+ private static parseHealthCheck;
43
+ }
44
+ //# sourceMappingURL=response-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-factory.d.ts","sourceRoot":"","sources":["../../src/validation/response-factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Response Factory for Houtini LM MCP Functions
3
+ * Makes it incredibly easy to create correctly formatted responses
4
+ * Usage: ResponseFactory.createAnalyzeSingleFileResponse(data, modelId)
5
+ */
6
+ import { OutputValidator } from './output-validator.js';
7
+ export class ResponseFactory {
8
+ /**
9
+ * Set execution start time
10
+ */
11
+ static setStartTime() {
12
+ this.startTime = Date.now();
13
+ }
14
+ /**
15
+ * Get execution time since start
16
+ */
17
+ static getExecutionTime() {
18
+ return Date.now() - this.startTime;
19
+ }
20
+ // ====================
21
+ // ANALYSIS FUNCTIONS
22
+ // ====================
23
+ static createAnalyzeSingleFileResponse(summary, structure, metrics, findings, patterns, suggestions, modelUsed) {
24
+ return {
25
+ success: true,
26
+ timestamp: new Date().toISOString(),
27
+ modelUsed,
28
+ executionTimeMs: this.getExecutionTime(),
29
+ data: {
30
+ summary,
31
+ structure,
32
+ metrics,
33
+ findings,
34
+ patterns,
35
+ suggestions
36
+ }
37
+ };
38
+ }
39
+ static createSecurityAuditResponse(summary, vulnerabilities, recommendations, passedChecks, dependencies, modelUsed) {
40
+ return {
41
+ success: true,
42
+ timestamp: new Date().toISOString(),
43
+ modelUsed,
44
+ executionTimeMs: this.getExecutionTime(),
45
+ data: {
46
+ summary,
47
+ vulnerabilities,
48
+ dependencies,
49
+ recommendations,
50
+ passedChecks
51
+ }
52
+ };
53
+ }
54
+ // ====================
55
+ // GENERATION FUNCTIONS
56
+ // ====================
57
+ static createGenerateUnitTestsResponse(tests, coverage, testCount, testTypes, mocks, setupRequired, modelUsed) {
58
+ return {
59
+ success: true,
60
+ timestamp: new Date().toISOString(),
61
+ modelUsed,
62
+ executionTimeMs: this.getExecutionTime(),
63
+ data: {
64
+ tests,
65
+ coverage,
66
+ testCount,
67
+ testTypes,
68
+ mocks,
69
+ setupRequired
70
+ }
71
+ };
72
+ }
73
+ static createGenerateDocumentationResponse(documentation, sections, metadata, modelUsed) {
74
+ return {
75
+ success: true,
76
+ timestamp: new Date().toISOString(),
77
+ modelUsed,
78
+ executionTimeMs: this.getExecutionTime(),
79
+ data: {
80
+ documentation,
81
+ sections,
82
+ metadata
83
+ }
84
+ };
85
+ }
86
+ // ====================
87
+ // SYSTEM FUNCTIONS
88
+ // ====================
89
+ static createSystemResponse(data, modelUsed = 'system', executionTimeMs) {
90
+ return {
91
+ success: true,
92
+ timestamp: new Date().toISOString(),
93
+ modelUsed,
94
+ executionTimeMs: executionTimeMs || this.getExecutionTime(),
95
+ data
96
+ };
97
+ }
98
+ static createHealthCheckResponse(status, connection, lmStudioUrl, error, suggestion, details, contextLength) {
99
+ return {
100
+ success: status === "healthy",
101
+ timestamp: new Date().toISOString(),
102
+ modelUsed: details?.activeModel?.identifier || 'none',
103
+ executionTimeMs: this.getExecutionTime(),
104
+ data: {
105
+ status,
106
+ connection,
107
+ lmStudioUrl,
108
+ timestamp: new Date().toISOString(),
109
+ error,
110
+ suggestion,
111
+ contextLength,
112
+ details
113
+ }
114
+ };
115
+ }
116
+ // ====================
117
+ // ERROR RESPONSES
118
+ // ====================
119
+ static createErrorResponse(functionName, errorCode, errorMessage, details, modelUsed = 'unknown') {
120
+ return {
121
+ success: false,
122
+ timestamp: new Date().toISOString(),
123
+ modelUsed,
124
+ executionTimeMs: this.getExecutionTime(),
125
+ error: {
126
+ code: errorCode,
127
+ message: errorMessage,
128
+ details
129
+ }
130
+ };
131
+ }
132
+ // ====================
133
+ // SMART PARSING HELPERS
134
+ // ====================
135
+ /**
136
+ * Universal response parser for all MCP functions
137
+ * Works with the universal template architecture - no function-specific switch statements needed!
138
+ */
139
+ static parseAndCreateResponse(functionName, llmResponse, modelUsed, additionalData = {}) {
140
+ this.setStartTime();
141
+ try {
142
+ // Handle special case for health_check which needs additionalData
143
+ if (functionName === 'health_check') {
144
+ return this.parseHealthCheck(llmResponse, modelUsed, additionalData);
145
+ }
146
+ // Universal JSON parsing with markdown code block handling
147
+ let parsed;
148
+ try {
149
+ // Strip markdown JSON code blocks if present
150
+ let cleanedResponse = llmResponse.trim();
151
+ if (cleanedResponse.startsWith('```json') && cleanedResponse.endsWith('```')) {
152
+ cleanedResponse = cleanedResponse.slice(7, -3).trim();
153
+ }
154
+ else if (cleanedResponse.startsWith('```') && cleanedResponse.endsWith('```')) {
155
+ // Handle generic code blocks that might contain JSON
156
+ cleanedResponse = cleanedResponse.slice(3, -3).trim();
157
+ }
158
+ parsed = JSON.parse(cleanedResponse);
159
+ // If it's valid JSON, return it properly structured
160
+ return {
161
+ success: true,
162
+ timestamp: new Date().toISOString(),
163
+ modelUsed,
164
+ executionTimeMs: this.getExecutionTime(),
165
+ data: parsed
166
+ };
167
+ }
168
+ catch {
169
+ // If not JSON, fall back to content wrapping
170
+ return {
171
+ success: true,
172
+ timestamp: new Date().toISOString(),
173
+ modelUsed,
174
+ executionTimeMs: this.getExecutionTime(),
175
+ data: {
176
+ content: llmResponse,
177
+ metadata: {
178
+ functionName,
179
+ parsedAt: new Date().toISOString(),
180
+ responseLength: llmResponse.length
181
+ }
182
+ }
183
+ };
184
+ }
185
+ }
186
+ catch (error) {
187
+ return this.createErrorResponse(functionName, OutputValidator.ErrorCodes.PARSING_ERROR, `Failed to parse LLM response: ${error.message}`, { originalResponse: llmResponse.substring(0, 500) }, modelUsed);
188
+ }
189
+ }
190
+ // ====================
191
+ // HEALTH CHECK SPECIAL CASE
192
+ // ====================
193
+ // HEALTH CHECK SPECIAL CASE
194
+ // ====================
195
+ static parseHealthCheck(llmResponse, modelUsed, additionalData) {
196
+ // health_check is a special case - it doesn't return JSON from LLM,
197
+ // but instead gets structured data from additionalData
198
+ return this.createHealthCheckResponse(additionalData.status || 'healthy', additionalData.connection || 'established', additionalData.lmStudioUrl || 'ws://localhost:1234', additionalData.error, additionalData.suggestion, additionalData.details);
199
+ }
200
+ }
201
+ ResponseFactory.startTime = Date.now();
202
+ //# sourceMappingURL=response-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-factory.js","sourceRoot":"","sources":["../../src/validation/response-factory.ts"],"names":[],"mappings":"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"}