@juspay/neurolink 9.1.1 → 9.2.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 (237) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +54 -7
  3. package/dist/agent/directTools.d.ts +3 -3
  4. package/dist/cli/commands/config.d.ts +6 -6
  5. package/dist/image-gen/ImageGenService.d.ts +143 -0
  6. package/dist/image-gen/ImageGenService.js +345 -0
  7. package/dist/image-gen/imageGenTools.d.ts +126 -0
  8. package/dist/image-gen/imageGenTools.js +304 -0
  9. package/dist/image-gen/index.d.ts +46 -0
  10. package/dist/image-gen/index.js +48 -0
  11. package/dist/image-gen/types.d.ts +237 -0
  12. package/dist/image-gen/types.js +24 -0
  13. package/dist/lib/agent/directTools.d.ts +3 -3
  14. package/dist/lib/image-gen/ImageGenService.d.ts +143 -0
  15. package/dist/lib/image-gen/ImageGenService.js +346 -0
  16. package/dist/lib/image-gen/imageGenTools.d.ts +126 -0
  17. package/dist/lib/image-gen/imageGenTools.js +305 -0
  18. package/dist/lib/image-gen/index.d.ts +46 -0
  19. package/dist/lib/image-gen/index.js +49 -0
  20. package/dist/lib/image-gen/types.d.ts +237 -0
  21. package/dist/lib/image-gen/types.js +25 -0
  22. package/dist/lib/processors/base/BaseFileProcessor.d.ts +273 -0
  23. package/dist/lib/processors/base/BaseFileProcessor.js +614 -0
  24. package/dist/lib/processors/base/index.d.ts +14 -0
  25. package/dist/lib/processors/base/index.js +20 -0
  26. package/dist/lib/processors/base/types.d.ts +593 -0
  27. package/dist/lib/processors/base/types.js +77 -0
  28. package/dist/lib/processors/cli/fileProcessorCli.d.ts +163 -0
  29. package/dist/lib/processors/cli/fileProcessorCli.js +389 -0
  30. package/dist/lib/processors/cli/index.d.ts +37 -0
  31. package/dist/lib/processors/cli/index.js +50 -0
  32. package/dist/lib/processors/code/ConfigProcessor.d.ts +171 -0
  33. package/dist/lib/processors/code/ConfigProcessor.js +401 -0
  34. package/dist/lib/processors/code/SourceCodeProcessor.d.ts +174 -0
  35. package/dist/lib/processors/code/SourceCodeProcessor.js +305 -0
  36. package/dist/lib/processors/code/index.d.ts +44 -0
  37. package/dist/lib/processors/code/index.js +61 -0
  38. package/dist/lib/processors/config/fileTypes.d.ts +283 -0
  39. package/dist/lib/processors/config/fileTypes.js +521 -0
  40. package/dist/lib/processors/config/index.d.ts +32 -0
  41. package/dist/lib/processors/config/index.js +93 -0
  42. package/dist/lib/processors/config/languageMap.d.ts +66 -0
  43. package/dist/lib/processors/config/languageMap.js +411 -0
  44. package/dist/lib/processors/config/mimeTypes.d.ts +376 -0
  45. package/dist/lib/processors/config/mimeTypes.js +339 -0
  46. package/dist/lib/processors/config/sizeLimits.d.ts +194 -0
  47. package/dist/lib/processors/config/sizeLimits.js +247 -0
  48. package/dist/lib/processors/data/JsonProcessor.d.ts +122 -0
  49. package/dist/lib/processors/data/JsonProcessor.js +204 -0
  50. package/dist/lib/processors/data/XmlProcessor.d.ts +160 -0
  51. package/dist/lib/processors/data/XmlProcessor.js +284 -0
  52. package/dist/lib/processors/data/YamlProcessor.d.ts +163 -0
  53. package/dist/lib/processors/data/YamlProcessor.js +295 -0
  54. package/dist/lib/processors/data/index.d.ts +49 -0
  55. package/dist/lib/processors/data/index.js +77 -0
  56. package/dist/lib/processors/document/ExcelProcessor.d.ts +238 -0
  57. package/dist/lib/processors/document/ExcelProcessor.js +520 -0
  58. package/dist/lib/processors/document/OpenDocumentProcessor.d.ts +69 -0
  59. package/dist/lib/processors/document/OpenDocumentProcessor.js +211 -0
  60. package/dist/lib/processors/document/RtfProcessor.d.ts +152 -0
  61. package/dist/lib/processors/document/RtfProcessor.js +362 -0
  62. package/dist/lib/processors/document/WordProcessor.d.ts +168 -0
  63. package/dist/lib/processors/document/WordProcessor.js +354 -0
  64. package/dist/lib/processors/document/index.d.ts +54 -0
  65. package/dist/lib/processors/document/index.js +91 -0
  66. package/dist/lib/processors/errors/FileErrorCode.d.ts +98 -0
  67. package/dist/lib/processors/errors/FileErrorCode.js +256 -0
  68. package/dist/lib/processors/errors/errorHelpers.d.ts +151 -0
  69. package/dist/lib/processors/errors/errorHelpers.js +379 -0
  70. package/dist/lib/processors/errors/errorSerializer.d.ts +139 -0
  71. package/dist/lib/processors/errors/errorSerializer.js +508 -0
  72. package/dist/lib/processors/errors/index.d.ts +46 -0
  73. package/dist/lib/processors/errors/index.js +50 -0
  74. package/dist/lib/processors/index.d.ts +76 -0
  75. package/dist/lib/processors/index.js +113 -0
  76. package/dist/lib/processors/integration/FileProcessorIntegration.d.ts +244 -0
  77. package/dist/lib/processors/integration/FileProcessorIntegration.js +273 -0
  78. package/dist/lib/processors/integration/index.d.ts +42 -0
  79. package/dist/lib/processors/integration/index.js +45 -0
  80. package/dist/lib/processors/markup/HtmlProcessor.d.ts +169 -0
  81. package/dist/lib/processors/markup/HtmlProcessor.js +250 -0
  82. package/dist/lib/processors/markup/MarkdownProcessor.d.ts +165 -0
  83. package/dist/lib/processors/markup/MarkdownProcessor.js +245 -0
  84. package/dist/lib/processors/markup/SvgProcessor.d.ts +156 -0
  85. package/dist/lib/processors/markup/SvgProcessor.js +241 -0
  86. package/dist/lib/processors/markup/TextProcessor.d.ts +135 -0
  87. package/dist/lib/processors/markup/TextProcessor.js +189 -0
  88. package/dist/lib/processors/markup/index.d.ts +66 -0
  89. package/dist/lib/processors/markup/index.js +103 -0
  90. package/dist/lib/processors/registry/ProcessorRegistry.d.ts +334 -0
  91. package/dist/lib/processors/registry/ProcessorRegistry.js +609 -0
  92. package/dist/lib/processors/registry/index.d.ts +12 -0
  93. package/dist/lib/processors/registry/index.js +17 -0
  94. package/dist/lib/processors/registry/types.d.ts +53 -0
  95. package/dist/lib/processors/registry/types.js +11 -0
  96. package/dist/lib/providers/sagemaker/language-model.d.ts +2 -2
  97. package/dist/lib/server/utils/validation.d.ts +6 -6
  98. package/dist/lib/types/fileTypes.d.ts +1 -1
  99. package/dist/lib/types/index.d.ts +25 -24
  100. package/dist/lib/types/index.js +21 -20
  101. package/dist/lib/types/modelTypes.d.ts +18 -18
  102. package/dist/lib/types/pptTypes.d.ts +14 -2
  103. package/dist/lib/types/pptTypes.js +16 -0
  104. package/dist/lib/utils/async/delay.d.ts +40 -0
  105. package/dist/lib/utils/async/delay.js +43 -0
  106. package/dist/lib/utils/async/index.d.ts +23 -0
  107. package/dist/lib/utils/async/index.js +24 -0
  108. package/dist/lib/utils/async/retry.d.ts +141 -0
  109. package/dist/lib/utils/async/retry.js +172 -0
  110. package/dist/lib/utils/async/withTimeout.d.ts +73 -0
  111. package/dist/lib/utils/async/withTimeout.js +97 -0
  112. package/dist/lib/utils/fileDetector.d.ts +7 -1
  113. package/dist/lib/utils/fileDetector.js +91 -18
  114. package/dist/lib/utils/json/extract.d.ts +103 -0
  115. package/dist/lib/utils/json/extract.js +249 -0
  116. package/dist/lib/utils/json/index.d.ts +36 -0
  117. package/dist/lib/utils/json/index.js +37 -0
  118. package/dist/lib/utils/json/safeParse.d.ts +137 -0
  119. package/dist/lib/utils/json/safeParse.js +191 -0
  120. package/dist/lib/utils/messageBuilder.d.ts +2 -2
  121. package/dist/lib/utils/messageBuilder.js +15 -7
  122. package/dist/lib/utils/sanitizers/filename.d.ts +137 -0
  123. package/dist/lib/utils/sanitizers/filename.js +366 -0
  124. package/dist/lib/utils/sanitizers/html.d.ts +170 -0
  125. package/dist/lib/utils/sanitizers/html.js +326 -0
  126. package/dist/lib/utils/sanitizers/index.d.ts +26 -0
  127. package/dist/lib/utils/sanitizers/index.js +30 -0
  128. package/dist/lib/utils/sanitizers/svg.d.ts +81 -0
  129. package/dist/lib/utils/sanitizers/svg.js +483 -0
  130. package/dist/processors/base/BaseFileProcessor.d.ts +273 -0
  131. package/dist/processors/base/BaseFileProcessor.js +613 -0
  132. package/dist/processors/base/index.d.ts +14 -0
  133. package/dist/processors/base/index.js +19 -0
  134. package/dist/processors/base/types.d.ts +593 -0
  135. package/dist/processors/base/types.js +76 -0
  136. package/dist/processors/cli/fileProcessorCli.d.ts +163 -0
  137. package/dist/processors/cli/fileProcessorCli.js +388 -0
  138. package/dist/processors/cli/index.d.ts +37 -0
  139. package/dist/processors/cli/index.js +49 -0
  140. package/dist/processors/code/ConfigProcessor.d.ts +171 -0
  141. package/dist/processors/code/ConfigProcessor.js +400 -0
  142. package/dist/processors/code/SourceCodeProcessor.d.ts +174 -0
  143. package/dist/processors/code/SourceCodeProcessor.js +304 -0
  144. package/dist/processors/code/index.d.ts +44 -0
  145. package/dist/processors/code/index.js +60 -0
  146. package/dist/processors/config/fileTypes.d.ts +283 -0
  147. package/dist/processors/config/fileTypes.js +520 -0
  148. package/dist/processors/config/index.d.ts +32 -0
  149. package/dist/processors/config/index.js +92 -0
  150. package/dist/processors/config/languageMap.d.ts +66 -0
  151. package/dist/processors/config/languageMap.js +410 -0
  152. package/dist/processors/config/mimeTypes.d.ts +376 -0
  153. package/dist/processors/config/mimeTypes.js +338 -0
  154. package/dist/processors/config/sizeLimits.d.ts +194 -0
  155. package/dist/processors/config/sizeLimits.js +246 -0
  156. package/dist/processors/data/JsonProcessor.d.ts +122 -0
  157. package/dist/processors/data/JsonProcessor.js +203 -0
  158. package/dist/processors/data/XmlProcessor.d.ts +160 -0
  159. package/dist/processors/data/XmlProcessor.js +283 -0
  160. package/dist/processors/data/YamlProcessor.d.ts +163 -0
  161. package/dist/processors/data/YamlProcessor.js +294 -0
  162. package/dist/processors/data/index.d.ts +49 -0
  163. package/dist/processors/data/index.js +76 -0
  164. package/dist/processors/document/ExcelProcessor.d.ts +238 -0
  165. package/dist/processors/document/ExcelProcessor.js +519 -0
  166. package/dist/processors/document/OpenDocumentProcessor.d.ts +69 -0
  167. package/dist/processors/document/OpenDocumentProcessor.js +210 -0
  168. package/dist/processors/document/RtfProcessor.d.ts +152 -0
  169. package/dist/processors/document/RtfProcessor.js +361 -0
  170. package/dist/processors/document/WordProcessor.d.ts +168 -0
  171. package/dist/processors/document/WordProcessor.js +353 -0
  172. package/dist/processors/document/index.d.ts +54 -0
  173. package/dist/processors/document/index.js +90 -0
  174. package/dist/processors/errors/FileErrorCode.d.ts +98 -0
  175. package/dist/processors/errors/FileErrorCode.js +255 -0
  176. package/dist/processors/errors/errorHelpers.d.ts +151 -0
  177. package/dist/processors/errors/errorHelpers.js +378 -0
  178. package/dist/processors/errors/errorSerializer.d.ts +139 -0
  179. package/dist/processors/errors/errorSerializer.js +507 -0
  180. package/dist/processors/errors/index.d.ts +46 -0
  181. package/dist/processors/errors/index.js +49 -0
  182. package/dist/processors/index.d.ts +76 -0
  183. package/dist/processors/index.js +112 -0
  184. package/dist/processors/integration/FileProcessorIntegration.d.ts +244 -0
  185. package/dist/processors/integration/FileProcessorIntegration.js +272 -0
  186. package/dist/processors/integration/index.d.ts +42 -0
  187. package/dist/processors/integration/index.js +44 -0
  188. package/dist/processors/markup/HtmlProcessor.d.ts +169 -0
  189. package/dist/processors/markup/HtmlProcessor.js +249 -0
  190. package/dist/processors/markup/MarkdownProcessor.d.ts +165 -0
  191. package/dist/processors/markup/MarkdownProcessor.js +244 -0
  192. package/dist/processors/markup/SvgProcessor.d.ts +156 -0
  193. package/dist/processors/markup/SvgProcessor.js +240 -0
  194. package/dist/processors/markup/TextProcessor.d.ts +135 -0
  195. package/dist/processors/markup/TextProcessor.js +188 -0
  196. package/dist/processors/markup/index.d.ts +66 -0
  197. package/dist/processors/markup/index.js +102 -0
  198. package/dist/processors/registry/ProcessorRegistry.d.ts +334 -0
  199. package/dist/processors/registry/ProcessorRegistry.js +608 -0
  200. package/dist/processors/registry/index.d.ts +12 -0
  201. package/dist/processors/registry/index.js +16 -0
  202. package/dist/processors/registry/types.d.ts +53 -0
  203. package/dist/processors/registry/types.js +10 -0
  204. package/dist/server/utils/validation.d.ts +6 -6
  205. package/dist/types/fileTypes.d.ts +1 -1
  206. package/dist/types/index.d.ts +25 -24
  207. package/dist/types/index.js +21 -20
  208. package/dist/types/modelTypes.d.ts +10 -10
  209. package/dist/types/pptTypes.d.ts +14 -2
  210. package/dist/types/pptTypes.js +16 -0
  211. package/dist/utils/async/delay.d.ts +40 -0
  212. package/dist/utils/async/delay.js +42 -0
  213. package/dist/utils/async/index.d.ts +23 -0
  214. package/dist/utils/async/index.js +23 -0
  215. package/dist/utils/async/retry.d.ts +141 -0
  216. package/dist/utils/async/retry.js +171 -0
  217. package/dist/utils/async/withTimeout.d.ts +73 -0
  218. package/dist/utils/async/withTimeout.js +96 -0
  219. package/dist/utils/fileDetector.d.ts +7 -1
  220. package/dist/utils/fileDetector.js +91 -18
  221. package/dist/utils/json/extract.d.ts +103 -0
  222. package/dist/utils/json/extract.js +248 -0
  223. package/dist/utils/json/index.d.ts +36 -0
  224. package/dist/utils/json/index.js +36 -0
  225. package/dist/utils/json/safeParse.d.ts +137 -0
  226. package/dist/utils/json/safeParse.js +190 -0
  227. package/dist/utils/messageBuilder.d.ts +2 -2
  228. package/dist/utils/messageBuilder.js +15 -7
  229. package/dist/utils/sanitizers/filename.d.ts +137 -0
  230. package/dist/utils/sanitizers/filename.js +365 -0
  231. package/dist/utils/sanitizers/html.d.ts +170 -0
  232. package/dist/utils/sanitizers/html.js +325 -0
  233. package/dist/utils/sanitizers/index.d.ts +26 -0
  234. package/dist/utils/sanitizers/index.js +29 -0
  235. package/dist/utils/sanitizers/svg.d.ts +81 -0
  236. package/dist/utils/sanitizers/svg.js +482 -0
  237. package/package.json +2 -2
@@ -0,0 +1,248 @@
1
+ /**
2
+ * JSON Extraction Utilities
3
+ *
4
+ * Utilities for extracting JSON from mixed text content.
5
+ * Particularly useful for parsing AI responses that contain JSON within prose.
6
+ */
7
+ import { parseJsonOrNull } from "./safeParse.js";
8
+ /**
9
+ * Extract JSON string from text that may contain surrounding content.
10
+ *
11
+ * Searches for valid JSON in the following order:
12
+ * 1. Direct parse of the entire text
13
+ * 2. JSON within markdown code blocks (```json ... ``` or ``` ... ```)
14
+ * 3. JSON object pattern ({ ... })
15
+ * 4. JSON array pattern ([ ... ])
16
+ *
17
+ * @param text - Text that may contain JSON
18
+ * @returns Extracted JSON string or null if none found
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const response = "Here's the data: {\"name\": \"test\"} Let me know if you need more.";
23
+ * const json = extractJsonStringFromText(response);
24
+ * // Returns: '{"name": "test"}'
25
+ * ```
26
+ */
27
+ export function extractJsonStringFromText(text) {
28
+ // Try direct parse first - maybe the whole text is valid JSON
29
+ try {
30
+ JSON.parse(text);
31
+ return text;
32
+ }
33
+ catch {
34
+ // Continue to extraction patterns
35
+ }
36
+ // Try to find JSON in code blocks (```json ... ``` or ``` ... ```)
37
+ const codeBlockMatch = text.match(/```(?:json)?\s*([\s\S]*?)```/);
38
+ if (codeBlockMatch?.[1]) {
39
+ const potentialJson = codeBlockMatch[1].trim();
40
+ try {
41
+ JSON.parse(potentialJson);
42
+ return potentialJson;
43
+ }
44
+ catch {
45
+ // Continue to other patterns
46
+ }
47
+ }
48
+ // Try to find JSON object or array pattern using non-greedy iterative scan.
49
+ // Note: [\s\S]*? is non-greedy but can still produce over-spanning matches
50
+ // in texts with many braces. This is acceptable as we try-parse each candidate
51
+ // and move to the next on failure. A bracket-balancing parser would be more
52
+ // precise but significantly more complex for marginal benefit.
53
+ const candidateRegex = /(\{[\s\S]*?\}|\[[\s\S]*?\])/g;
54
+ let candidate;
55
+ while ((candidate = candidateRegex.exec(text)) !== null) {
56
+ try {
57
+ JSON.parse(candidate[1]);
58
+ return candidate[1];
59
+ }
60
+ catch {
61
+ // Try next candidate
62
+ }
63
+ }
64
+ return null;
65
+ }
66
+ /**
67
+ * Extract and parse JSON from mixed text content.
68
+ *
69
+ * Useful for parsing AI responses that contain JSON within prose.
70
+ * Combines extraction and parsing in one step.
71
+ *
72
+ * @param text - Text that may contain JSON
73
+ * @returns Parsed JSON value or null if not found/invalid
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const response = `
78
+ * Here is your configuration:
79
+ * \`\`\`json
80
+ * {"theme": "dark", "fontSize": 14}
81
+ * \`\`\`
82
+ * Let me know if you need changes.
83
+ * `;
84
+ * const config = extractJsonFromText(response);
85
+ * // Returns: { theme: "dark", fontSize: 14 }
86
+ * ```
87
+ */
88
+ export function extractJsonFromText(text) {
89
+ const jsonString = extractJsonStringFromText(text);
90
+ if (!jsonString) {
91
+ return null;
92
+ }
93
+ return parseJsonOrNull(jsonString);
94
+ }
95
+ /**
96
+ * Parse JSON from text with optional type validation.
97
+ *
98
+ * Extracts JSON from text and optionally validates it against a type guard.
99
+ * Useful when you need type-safe parsing of AI responses.
100
+ *
101
+ * @param text - Text that may contain JSON
102
+ * @param validator - Optional type guard to validate the parsed result
103
+ * @returns Parsed and validated JSON or null if not found/invalid/fails validation
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * interface UserConfig {
108
+ * theme: string;
109
+ * fontSize: number;
110
+ * }
111
+ *
112
+ * function isUserConfig(obj: unknown): obj is UserConfig {
113
+ * return (
114
+ * typeof obj === 'object' &&
115
+ * obj !== null &&
116
+ * 'theme' in obj &&
117
+ * 'fontSize' in obj &&
118
+ * typeof (obj as UserConfig).theme === 'string' &&
119
+ * typeof (obj as UserConfig).fontSize === 'number'
120
+ * );
121
+ * }
122
+ *
123
+ * const config = parseJsonFromText<UserConfig>(aiResponse, isUserConfig);
124
+ * if (config) {
125
+ * // config is typed as UserConfig
126
+ * console.log(config.theme, config.fontSize);
127
+ * }
128
+ * ```
129
+ */
130
+ export function parseJsonFromText(text, validator) {
131
+ const parsed = extractJsonFromText(text);
132
+ if (parsed === null) {
133
+ return null;
134
+ }
135
+ if (validator && !validator(parsed)) {
136
+ return null;
137
+ }
138
+ return parsed;
139
+ }
140
+ /**
141
+ * Extract all JSON objects/arrays from text.
142
+ *
143
+ * Useful when text contains multiple JSON blocks.
144
+ *
145
+ * @param text - Text that may contain multiple JSON values
146
+ * @returns Array of parsed JSON values
147
+ *
148
+ * @example
149
+ * ```typescript
150
+ * const text = 'First: {"a": 1} Second: {"b": 2}';
151
+ * const results = extractAllJsonFromText(text);
152
+ * // Returns: [{ a: 1 }, { b: 2 }]
153
+ * ```
154
+ */
155
+ export function extractAllJsonFromText(text) {
156
+ const results = [];
157
+ // Extract from code blocks first
158
+ const codeBlockRegex = /```(?:json)?\s*([\s\S]*?)```/g;
159
+ let match = codeBlockRegex.exec(text);
160
+ while (match !== null) {
161
+ if (match[1]) {
162
+ const potentialJson = match[1].trim();
163
+ try {
164
+ results.push(JSON.parse(potentialJson));
165
+ }
166
+ catch {
167
+ // Not valid JSON, skip
168
+ }
169
+ }
170
+ match = codeBlockRegex.exec(text);
171
+ }
172
+ // If we found code blocks, return those results
173
+ if (results.length > 0) {
174
+ return results;
175
+ }
176
+ // Otherwise, try to find all JSON objects and arrays
177
+ // This is a simplified approach - it finds top-level JSON structures
178
+ const remaining = text;
179
+ let searchStart = 0;
180
+ while (searchStart < remaining.length) {
181
+ // Find next potential JSON start
182
+ const objectStart = remaining.indexOf("{", searchStart);
183
+ const arrayStart = remaining.indexOf("[", searchStart);
184
+ let start;
185
+ let isObject;
186
+ if (objectStart === -1 && arrayStart === -1) {
187
+ break;
188
+ }
189
+ else if (objectStart === -1) {
190
+ start = arrayStart;
191
+ isObject = false;
192
+ }
193
+ else if (arrayStart === -1) {
194
+ start = objectStart;
195
+ isObject = true;
196
+ }
197
+ else {
198
+ start = Math.min(objectStart, arrayStart);
199
+ isObject = objectStart < arrayStart;
200
+ }
201
+ // Try to find matching end
202
+ const openChar = isObject ? "{" : "[";
203
+ const closeChar = isObject ? "}" : "]";
204
+ let depth = 0;
205
+ let inString = false;
206
+ let escapeNext = false;
207
+ for (let i = start; i < remaining.length; i++) {
208
+ const char = remaining[i];
209
+ if (escapeNext) {
210
+ escapeNext = false;
211
+ continue;
212
+ }
213
+ if (char === "\\") {
214
+ escapeNext = true;
215
+ continue;
216
+ }
217
+ if (char === '"') {
218
+ inString = !inString;
219
+ continue;
220
+ }
221
+ if (inString) {
222
+ continue;
223
+ }
224
+ if (char === openChar) {
225
+ depth++;
226
+ }
227
+ else if (char === closeChar) {
228
+ depth--;
229
+ if (depth === 0) {
230
+ const potentialJson = remaining.substring(start, i + 1);
231
+ try {
232
+ results.push(JSON.parse(potentialJson));
233
+ searchStart = i + 1;
234
+ }
235
+ catch {
236
+ searchStart = start + 1;
237
+ }
238
+ break;
239
+ }
240
+ }
241
+ }
242
+ if (depth !== 0) {
243
+ // Unbalanced brackets, move past this start
244
+ searchStart = start + 1;
245
+ }
246
+ }
247
+ return results;
248
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * JSON Utilities
3
+ *
4
+ * Centralized JSON parsing, serialization, and extraction utilities.
5
+ * Provides safe operations that handle errors gracefully without throwing.
6
+ *
7
+ * @module json
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import {
12
+ * safeParseJson,
13
+ * parseJsonOrNull,
14
+ * isValidJson,
15
+ * safeStringify,
16
+ * extractJsonFromText,
17
+ * parseJsonFromText,
18
+ * } from './utils/json/index.js';
19
+ *
20
+ * // Safe parsing with fallback
21
+ * const config = safeParseJson(userInput, { theme: 'light' });
22
+ *
23
+ * // Check if valid before parsing
24
+ * if (isValidJson(str)) {
25
+ * const data = JSON.parse(str);
26
+ * }
27
+ *
28
+ * // Handle circular references
29
+ * const json = safeStringify(complexObject, 2);
30
+ *
31
+ * // Extract JSON from AI responses
32
+ * const result = extractJsonFromText(aiResponse);
33
+ * ```
34
+ */
35
+ export * from "./extract.js";
36
+ export * from "./safeParse.js";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * JSON Utilities
3
+ *
4
+ * Centralized JSON parsing, serialization, and extraction utilities.
5
+ * Provides safe operations that handle errors gracefully without throwing.
6
+ *
7
+ * @module json
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import {
12
+ * safeParseJson,
13
+ * parseJsonOrNull,
14
+ * isValidJson,
15
+ * safeStringify,
16
+ * extractJsonFromText,
17
+ * parseJsonFromText,
18
+ * } from './utils/json/index.js';
19
+ *
20
+ * // Safe parsing with fallback
21
+ * const config = safeParseJson(userInput, { theme: 'light' });
22
+ *
23
+ * // Check if valid before parsing
24
+ * if (isValidJson(str)) {
25
+ * const data = JSON.parse(str);
26
+ * }
27
+ *
28
+ * // Handle circular references
29
+ * const json = safeStringify(complexObject, 2);
30
+ *
31
+ * // Extract JSON from AI responses
32
+ * const result = extractJsonFromText(aiResponse);
33
+ * ```
34
+ */
35
+ export * from "./extract.js";
36
+ export * from "./safeParse.js";
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Safe JSON Parsing Utilities
3
+ *
4
+ * Centralized JSON parsing utilities that handle errors gracefully.
5
+ * Provides safe parsing that doesn't throw on invalid JSON.
6
+ */
7
+ /**
8
+ * Result type for safe JSON parsing operations
9
+ */
10
+ export interface SafeParseResult<T> {
11
+ success: boolean;
12
+ data: T | null;
13
+ error: Error | null;
14
+ }
15
+ /**
16
+ * Safely parse a JSON string without throwing.
17
+ *
18
+ * This is the preferred method for parsing JSON from external sources
19
+ * (user input, API responses, etc.) where invalid JSON is possible.
20
+ *
21
+ * @param str - The string to parse as JSON
22
+ * @returns Object with success flag and either data or error
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const result = safeParseJsonResult<UserData>(userInput);
27
+ * if (result.success) {
28
+ * console.log(result.data.name);
29
+ * } else {
30
+ * console.error('Invalid JSON:', result.error.message);
31
+ * }
32
+ * ```
33
+ */
34
+ export declare function safeParseJsonResult<T = unknown>(str: string): SafeParseResult<T>;
35
+ /**
36
+ * Safely parse JSON with fallback value.
37
+ *
38
+ * Useful when you need a value regardless of parse success.
39
+ *
40
+ * @param str - The string to parse as JSON
41
+ * @param fallback - Value to return if parsing fails
42
+ * @returns Parsed value or fallback
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * const config = safeParseJson(configString, { theme: 'light' });
47
+ * // Always returns an object, never throws
48
+ * ```
49
+ */
50
+ export declare function safeParseJson<T>(str: string, fallback: T): T;
51
+ /**
52
+ * Parse JSON or return undefined if invalid.
53
+ *
54
+ * @param str - The string to parse as JSON
55
+ * @returns Parsed value or undefined
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * const data = parseJsonOrUndefined<Config>(input);
60
+ * if (data) {
61
+ * // Use data
62
+ * }
63
+ * ```
64
+ */
65
+ export declare function parseJsonOrUndefined<T>(str: string): T | undefined;
66
+ /**
67
+ * Parse JSON or return null if invalid.
68
+ *
69
+ * @param str - The string to parse as JSON
70
+ * @returns Parsed value or null
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const data = parseJsonOrNull<Config>(input);
75
+ * if (data !== null) {
76
+ * // Use data
77
+ * }
78
+ * ```
79
+ */
80
+ export declare function parseJsonOrNull<T>(str: string): T | null;
81
+ /**
82
+ * Check if a string is valid JSON.
83
+ *
84
+ * @param str - The string to validate
85
+ * @returns true if the string is valid JSON
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * if (isValidJson(userInput)) {
90
+ * // Proceed with parsing
91
+ * }
92
+ * ```
93
+ */
94
+ export declare function isValidJson(str: string): boolean;
95
+ /**
96
+ * Safe stringify with circular reference handling.
97
+ *
98
+ * Handles circular references, BigInt values, and other edge cases gracefully.
99
+ *
100
+ * @param obj - Value to stringify
101
+ * @param space - Optional indentation (number of spaces)
102
+ * @returns JSON string, with circular references replaced by "[Circular]"
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const obj = { name: 'test' };
107
+ * obj.self = obj; // Circular reference
108
+ *
109
+ * const json = safeStringify(obj);
110
+ * // Returns: '{"name":"test","self":"[Circular]"}'
111
+ *
112
+ * const prettyJson = safeStringify(data, 2);
113
+ * // Returns formatted JSON with 2-space indentation
114
+ * ```
115
+ */
116
+ export declare function safeStringify(obj: unknown, space?: number): string;
117
+ /**
118
+ * Safe stringify with options for more control.
119
+ *
120
+ * @param obj - Value to stringify
121
+ * @param options - Stringify options
122
+ * @returns JSON string or fallback string on error
123
+ *
124
+ * @example
125
+ * ```typescript
126
+ * const json = safeStringifyWithOptions(data, {
127
+ * pretty: true,
128
+ * fallback: '{}',
129
+ * });
130
+ * ```
131
+ */
132
+ export declare function safeStringifyWithOptions(obj: unknown, options?: {
133
+ /** Use 2-space indentation */
134
+ pretty?: boolean;
135
+ /** Value to return if stringify fails */
136
+ fallback?: string;
137
+ }): string;
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Safe JSON Parsing Utilities
3
+ *
4
+ * Centralized JSON parsing utilities that handle errors gracefully.
5
+ * Provides safe parsing that doesn't throw on invalid JSON.
6
+ */
7
+ /**
8
+ * Safely parse a JSON string without throwing.
9
+ *
10
+ * This is the preferred method for parsing JSON from external sources
11
+ * (user input, API responses, etc.) where invalid JSON is possible.
12
+ *
13
+ * @param str - The string to parse as JSON
14
+ * @returns Object with success flag and either data or error
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const result = safeParseJsonResult<UserData>(userInput);
19
+ * if (result.success) {
20
+ * console.log(result.data.name);
21
+ * } else {
22
+ * console.error('Invalid JSON:', result.error.message);
23
+ * }
24
+ * ```
25
+ */
26
+ export function safeParseJsonResult(str) {
27
+ try {
28
+ const data = JSON.parse(str);
29
+ return { success: true, data, error: null };
30
+ }
31
+ catch (error) {
32
+ return {
33
+ success: false,
34
+ data: null,
35
+ error: error instanceof Error ? error : new Error(String(error)),
36
+ };
37
+ }
38
+ }
39
+ /**
40
+ * Safely parse JSON with fallback value.
41
+ *
42
+ * Useful when you need a value regardless of parse success.
43
+ *
44
+ * @param str - The string to parse as JSON
45
+ * @param fallback - Value to return if parsing fails
46
+ * @returns Parsed value or fallback
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const config = safeParseJson(configString, { theme: 'light' });
51
+ * // Always returns an object, never throws
52
+ * ```
53
+ */
54
+ export function safeParseJson(str, fallback) {
55
+ try {
56
+ return JSON.parse(str);
57
+ }
58
+ catch {
59
+ return fallback;
60
+ }
61
+ }
62
+ /**
63
+ * Parse JSON or return undefined if invalid.
64
+ *
65
+ * @param str - The string to parse as JSON
66
+ * @returns Parsed value or undefined
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * const data = parseJsonOrUndefined<Config>(input);
71
+ * if (data) {
72
+ * // Use data
73
+ * }
74
+ * ```
75
+ */
76
+ export function parseJsonOrUndefined(str) {
77
+ try {
78
+ return JSON.parse(str);
79
+ }
80
+ catch {
81
+ return undefined;
82
+ }
83
+ }
84
+ /**
85
+ * Parse JSON or return null if invalid.
86
+ *
87
+ * @param str - The string to parse as JSON
88
+ * @returns Parsed value or null
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const data = parseJsonOrNull<Config>(input);
93
+ * if (data !== null) {
94
+ * // Use data
95
+ * }
96
+ * ```
97
+ */
98
+ export function parseJsonOrNull(str) {
99
+ try {
100
+ return JSON.parse(str);
101
+ }
102
+ catch {
103
+ return null;
104
+ }
105
+ }
106
+ /**
107
+ * Check if a string is valid JSON.
108
+ *
109
+ * @param str - The string to validate
110
+ * @returns true if the string is valid JSON
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * if (isValidJson(userInput)) {
115
+ * // Proceed with parsing
116
+ * }
117
+ * ```
118
+ */
119
+ export function isValidJson(str) {
120
+ try {
121
+ JSON.parse(str);
122
+ return true;
123
+ }
124
+ catch {
125
+ return false;
126
+ }
127
+ }
128
+ /**
129
+ * Safe stringify with circular reference handling.
130
+ *
131
+ * Handles circular references, BigInt values, and other edge cases gracefully.
132
+ *
133
+ * @param obj - Value to stringify
134
+ * @param space - Optional indentation (number of spaces)
135
+ * @returns JSON string, with circular references replaced by "[Circular]"
136
+ *
137
+ * @example
138
+ * ```typescript
139
+ * const obj = { name: 'test' };
140
+ * obj.self = obj; // Circular reference
141
+ *
142
+ * const json = safeStringify(obj);
143
+ * // Returns: '{"name":"test","self":"[Circular]"}'
144
+ *
145
+ * const prettyJson = safeStringify(data, 2);
146
+ * // Returns formatted JSON with 2-space indentation
147
+ * ```
148
+ */
149
+ export function safeStringify(obj, space) {
150
+ const seen = new WeakSet();
151
+ return JSON.stringify(obj, (_key, value) => {
152
+ // Handle BigInt
153
+ if (typeof value === "bigint") {
154
+ return value.toString();
155
+ }
156
+ // Handle circular references
157
+ if (typeof value === "object" && value !== null) {
158
+ if (seen.has(value)) {
159
+ return "[Circular]";
160
+ }
161
+ seen.add(value);
162
+ }
163
+ return value;
164
+ }, space);
165
+ }
166
+ /**
167
+ * Safe stringify with options for more control.
168
+ *
169
+ * @param obj - Value to stringify
170
+ * @param options - Stringify options
171
+ * @returns JSON string or fallback string on error
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * const json = safeStringifyWithOptions(data, {
176
+ * pretty: true,
177
+ * fallback: '{}',
178
+ * });
179
+ * ```
180
+ */
181
+ export function safeStringifyWithOptions(obj, options) {
182
+ const { pretty = false, fallback = "[Unable to stringify]" } = options ?? {};
183
+ try {
184
+ const space = pretty ? 2 : undefined;
185
+ return safeStringify(obj, space);
186
+ }
187
+ catch {
188
+ return fallback;
189
+ }
190
+ }
@@ -3,11 +3,11 @@
3
3
  * Centralized logic for building message arrays from TextGenerationOptions
4
4
  * Enhanced with multimodal support for images
5
5
  */
6
+ import type { CoreMessage } from "ai";
6
7
  import type { MultimodalChatMessage } from "../types/conversation.js";
8
+ import type { GenerateOptions } from "../types/generateTypes.js";
7
9
  import type { TextGenerationOptions } from "../types/index.js";
8
10
  import type { StreamOptions } from "../types/streamTypes.js";
9
- import type { GenerateOptions } from "../types/generateTypes.js";
10
- import type { CoreMessage } from "ai";
11
11
  /**
12
12
  * Type-safe conversion from MultimodalChatMessage[] to CoreMessage[]
13
13
  * Filters out invalid content and ensures strict CoreMessage contract compliance
@@ -3,15 +3,15 @@
3
3
  * Centralized logic for building message arrays from TextGenerationOptions
4
4
  * Enhanced with multimodal support for images
5
5
  */
6
+ import { existsSync, readFileSync } from "fs";
7
+ import { getGlobalDispatcher, interceptors, request } from "undici";
8
+ import { MultimodalLogger, ProviderImageAdapter, } from "../adapters/providerImageAdapter.js";
6
9
  import { CONVERSATION_INSTRUCTIONS, STRUCTURED_OUTPUT_INSTRUCTIONS, } from "../config/conversationMemory.js";
7
- import { ProviderImageAdapter, MultimodalLogger, } from "../adapters/providerImageAdapter.js";
8
- import { logger } from "./logger.js";
9
10
  import { FileDetector } from "./fileDetector.js";
10
- import { PDFProcessor, PDFImageConverter } from "./pdfProcessor.js";
11
- import { urlDownloadRateLimiter } from "./rateLimiter.js";
12
- import { request, getGlobalDispatcher, interceptors } from "undici";
13
11
  import { getImageCache } from "./imageCache.js";
14
- import { readFileSync, existsSync } from "fs";
12
+ import { logger } from "./logger.js";
13
+ import { PDFImageConverter, PDFProcessor } from "./pdfProcessor.js";
14
+ import { urlDownloadRateLimiter } from "./rateLimiter.js";
15
15
  /**
16
16
  * Type guard to check if an image input has alt text
17
17
  */
@@ -376,7 +376,7 @@ export async function buildMultimodalMessagesArray(options, provider, model) {
376
376
  try {
377
377
  const result = await FileDetector.detectAndProcess(file, {
378
378
  maxSize,
379
- allowedTypes: ["csv", "image", "pdf"],
379
+ allowedTypes: ["csv", "image", "pdf", "svg"],
380
380
  csvOptions: options.csvOptions,
381
381
  provider: provider,
382
382
  });
@@ -396,6 +396,14 @@ export async function buildMultimodalMessagesArray(options, provider, model) {
396
396
  options.input.text += csvSection;
397
397
  logger.info(`[FileDetector] ✅ CSV: ${filename}`);
398
398
  }
399
+ else if (result.type === "svg") {
400
+ // SVG is processed as text content (sanitized XML markup)
401
+ // Inject into text prompt instead of sending as image
402
+ const filename = extractFilename(file);
403
+ const svgSection = `\n\n## SVG Content from "${filename}":\n\`\`\`xml\n${result.content}\n\`\`\`\n`;
404
+ options.input.text += svgSection;
405
+ logger.info(`[FileDetector] ✅ SVG (as text): ${filename}`);
406
+ }
399
407
  else if (result.type === "image") {
400
408
  options.input.images = [
401
409
  ...(options.input.images || []),