@jterrazz/intelligence 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.
- package/LICENSE +21 -0
- package/README.md +229 -0
- package/dist/adapters/agents/chat-agent.adapter.d.ts +35 -0
- package/dist/adapters/agents/chat-agent.adapter.js +388 -0
- package/dist/adapters/agents/chat-agent.adapter.js.map +1 -0
- package/dist/adapters/models/openrouter-model.adapter.d.ts +28 -0
- package/dist/adapters/models/openrouter-model.adapter.js +80 -0
- package/dist/adapters/models/openrouter-model.adapter.js.map +1 -0
- package/dist/adapters/prompts/__tests__/__snapshots__/presets.test.ts.snap +150 -0
- package/dist/adapters/prompts/__tests__/presets.test.d.ts +1 -0
- package/dist/adapters/prompts/__tests__/presets.test.js +31 -0
- package/dist/adapters/prompts/__tests__/presets.test.js.map +1 -0
- package/dist/adapters/prompts/library/categories/agent-logic.d.ts +8 -0
- package/dist/adapters/prompts/library/categories/agent-logic.js +9 -0
- package/dist/adapters/prompts/library/categories/agent-logic.js.map +1 -0
- package/dist/adapters/prompts/library/categories/agent-skills.d.ts +8 -0
- package/dist/adapters/prompts/library/categories/agent-skills.js +9 -0
- package/dist/adapters/prompts/library/categories/agent-skills.js.map +1 -0
- package/dist/adapters/prompts/library/categories/directives.d.ts +9 -0
- package/dist/adapters/prompts/library/categories/directives.js +10 -0
- package/dist/adapters/prompts/library/categories/directives.js.map +1 -0
- package/dist/adapters/prompts/library/categories/domain.d.ts +11 -0
- package/dist/adapters/prompts/library/categories/domain.js +12 -0
- package/dist/adapters/prompts/library/categories/domain.js.map +1 -0
- package/dist/adapters/prompts/library/categories/format.d.ts +9 -0
- package/dist/adapters/prompts/library/categories/format.js +10 -0
- package/dist/adapters/prompts/library/categories/format.js.map +1 -0
- package/dist/adapters/prompts/library/categories/language.d.ts +11 -0
- package/dist/adapters/prompts/library/categories/language.js +12 -0
- package/dist/adapters/prompts/library/categories/language.js.map +1 -0
- package/dist/adapters/prompts/library/categories/persona.d.ts +11 -0
- package/dist/adapters/prompts/library/categories/persona.js +12 -0
- package/dist/adapters/prompts/library/categories/persona.js.map +1 -0
- package/dist/adapters/prompts/library/categories/tone.d.ts +9 -0
- package/dist/adapters/prompts/library/categories/tone.js +10 -0
- package/dist/adapters/prompts/library/categories/tone.js.map +1 -0
- package/dist/adapters/prompts/library/categories/verbosity.d.ts +8 -0
- package/dist/adapters/prompts/library/categories/verbosity.js +9 -0
- package/dist/adapters/prompts/library/categories/verbosity.js.map +1 -0
- package/dist/adapters/prompts/library/index.d.ts +66 -0
- package/dist/adapters/prompts/library/index.js +28 -0
- package/dist/adapters/prompts/library/index.js.map +1 -0
- package/dist/adapters/prompts/library/presets.d.ts +17 -0
- package/dist/adapters/prompts/library/presets.js +51 -0
- package/dist/adapters/prompts/library/presets.js.map +1 -0
- package/dist/adapters/prompts/system-prompt.adapter.d.ts +9 -0
- package/dist/adapters/prompts/system-prompt.adapter.js +57 -0
- package/dist/adapters/prompts/system-prompt.adapter.js.map +1 -0
- package/dist/adapters/prompts/user-prompt.adapter.d.ts +9 -0
- package/dist/adapters/prompts/user-prompt.adapter.js +57 -0
- package/dist/adapters/prompts/user-prompt.adapter.js.map +1 -0
- package/dist/adapters/tools/safe-tool.adapter.d.ts +27 -0
- package/dist/adapters/tools/safe-tool.adapter.js +283 -0
- package/dist/adapters/tools/safe-tool.adapter.js.map +1 -0
- package/dist/adapters/utils/__tests__/ai-response-parser.test.d.ts +1 -0
- package/dist/adapters/utils/__tests__/ai-response-parser.test.js +249 -0
- package/dist/adapters/utils/__tests__/ai-response-parser.test.js.map +1 -0
- package/dist/adapters/utils/ai-response-parser-error.d.ts +8 -0
- package/dist/adapters/utils/ai-response-parser-error.js +136 -0
- package/dist/adapters/utils/ai-response-parser-error.js.map +1 -0
- package/dist/adapters/utils/ai-response-parser.d.ts +56 -0
- package/dist/adapters/utils/ai-response-parser.js +334 -0
- package/dist/adapters/utils/ai-response-parser.js.map +1 -0
- package/dist/index.cjs +1461 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/agent.port.d.ts +11 -0
- package/dist/ports/agent.port.js +5 -0
- package/dist/ports/agent.port.js.map +1 -0
- package/dist/ports/model.port.d.ts +10 -0
- package/dist/ports/model.port.js +5 -0
- package/dist/ports/model.port.js.map +1 -0
- package/dist/ports/prompt.port.d.ts +9 -0
- package/dist/ports/prompt.port.js +5 -0
- package/dist/ports/prompt.port.js.map +1 -0
- package/dist/ports/tool.port.d.ts +11 -0
- package/dist/ports/tool.port.js +5 -0
- package/dist/ports/tool.port.js.map +1 -0
- package/package.json +35 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
function _array_like_to_array(arr, len) {
|
|
2
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
+
return arr2;
|
|
5
|
+
}
|
|
6
|
+
function _array_with_holes(arr) {
|
|
7
|
+
if (Array.isArray(arr)) return arr;
|
|
8
|
+
}
|
|
9
|
+
function _class_call_check(instance, Constructor) {
|
|
10
|
+
if (!(instance instanceof Constructor)) {
|
|
11
|
+
throw new TypeError("Cannot call a class as a function");
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function _defineProperties(target, props) {
|
|
15
|
+
for(var i = 0; i < props.length; i++){
|
|
16
|
+
var descriptor = props[i];
|
|
17
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
18
|
+
descriptor.configurable = true;
|
|
19
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
20
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
24
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
25
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
26
|
+
return Constructor;
|
|
27
|
+
}
|
|
28
|
+
function _define_property(obj, key, value) {
|
|
29
|
+
if (key in obj) {
|
|
30
|
+
Object.defineProperty(obj, key, {
|
|
31
|
+
value: value,
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true
|
|
35
|
+
});
|
|
36
|
+
} else {
|
|
37
|
+
obj[key] = value;
|
|
38
|
+
}
|
|
39
|
+
return obj;
|
|
40
|
+
}
|
|
41
|
+
function _instanceof(left, right) {
|
|
42
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
43
|
+
return !!right[Symbol.hasInstance](left);
|
|
44
|
+
} else {
|
|
45
|
+
return left instanceof right;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function _iterable_to_array_limit(arr, i) {
|
|
49
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
50
|
+
if (_i == null) return;
|
|
51
|
+
var _arr = [];
|
|
52
|
+
var _n = true;
|
|
53
|
+
var _d = false;
|
|
54
|
+
var _s, _e;
|
|
55
|
+
try {
|
|
56
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
57
|
+
_arr.push(_s.value);
|
|
58
|
+
if (i && _arr.length === i) break;
|
|
59
|
+
}
|
|
60
|
+
} catch (err) {
|
|
61
|
+
_d = true;
|
|
62
|
+
_e = err;
|
|
63
|
+
} finally{
|
|
64
|
+
try {
|
|
65
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
66
|
+
} finally{
|
|
67
|
+
if (_d) throw _e;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return _arr;
|
|
71
|
+
}
|
|
72
|
+
function _non_iterable_rest() {
|
|
73
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
74
|
+
}
|
|
75
|
+
function _sliced_to_array(arr, i) {
|
|
76
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
77
|
+
}
|
|
78
|
+
function _type_of(obj) {
|
|
79
|
+
"@swc/helpers - typeof";
|
|
80
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
81
|
+
}
|
|
82
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
83
|
+
if (!o) return;
|
|
84
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
85
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
86
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
87
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
88
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
89
|
+
}
|
|
90
|
+
import { z } from 'zod/v4';
|
|
91
|
+
import { AIResponseParserError } from './ai-response-parser-error.js';
|
|
92
|
+
/**
|
|
93
|
+
* Parses AI response text into structured data based on Zod schema
|
|
94
|
+
*/ export var AIResponseParser = /*#__PURE__*/ function() {
|
|
95
|
+
"use strict";
|
|
96
|
+
function AIResponseParser(schema) {
|
|
97
|
+
_class_call_check(this, AIResponseParser);
|
|
98
|
+
_define_property(this, "schema", void 0);
|
|
99
|
+
this.schema = schema;
|
|
100
|
+
}
|
|
101
|
+
_create_class(AIResponseParser, [
|
|
102
|
+
{
|
|
103
|
+
key: "parse",
|
|
104
|
+
value: /**
|
|
105
|
+
* Parses the AI response text based on the configured schema
|
|
106
|
+
*/ function parse(text) {
|
|
107
|
+
try {
|
|
108
|
+
var cleanedText = this.cleanText(text);
|
|
109
|
+
var json = this.extractJsonFromText(cleanedText);
|
|
110
|
+
var unescapedJson = this.unescapeJsonValues(json);
|
|
111
|
+
return this.schema.parse(unescapedJson);
|
|
112
|
+
} catch (error) {
|
|
113
|
+
if (_instanceof(error, z.ZodError)) {
|
|
114
|
+
throw new AIResponseParserError('Failed to validate response against schema', error, text);
|
|
115
|
+
}
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
key: "cleanText",
|
|
122
|
+
value: /**
|
|
123
|
+
* Cleans text and finds the largest schema-compatible structure
|
|
124
|
+
*/ function cleanText(text) {
|
|
125
|
+
var _this = this;
|
|
126
|
+
// First try to extract from markdown code blocks
|
|
127
|
+
var codeBlocks = text.match(/```(?:json)?\r?\n([^`]*?)\r?\n```/g);
|
|
128
|
+
if (codeBlocks) {
|
|
129
|
+
// Try each code block and return the largest valid one
|
|
130
|
+
var validBlocks = codeBlocks.map(function(block) {
|
|
131
|
+
return _this.extractJsonFromCodeBlock(block);
|
|
132
|
+
}).filter(function(block) {
|
|
133
|
+
return block !== null;
|
|
134
|
+
});
|
|
135
|
+
if (validBlocks.length > 0) {
|
|
136
|
+
return this.findLargestString(validBlocks);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// If no valid code blocks, try to find JSON-like structures in the text
|
|
140
|
+
var jsonMatches = this.findJsonStructures(text);
|
|
141
|
+
if (jsonMatches.length > 0) {
|
|
142
|
+
return this.findLargestString(jsonMatches);
|
|
143
|
+
}
|
|
144
|
+
// If no JSON structures found, clean and return the original text
|
|
145
|
+
return text.replace(/\s+/g, ' ').trim();
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
key: "convertToPrimitive",
|
|
150
|
+
value: /**
|
|
151
|
+
* Converts value to appropriate primitive type based on schema
|
|
152
|
+
*/ function convertToPrimitive(value, schema) {
|
|
153
|
+
if (_instanceof(schema, z.ZodString)) {
|
|
154
|
+
return String(value);
|
|
155
|
+
}
|
|
156
|
+
if (_instanceof(schema, z.ZodNumber)) {
|
|
157
|
+
return Number(value);
|
|
158
|
+
}
|
|
159
|
+
if (_instanceof(schema, z.ZodBoolean)) {
|
|
160
|
+
return Boolean(value);
|
|
161
|
+
}
|
|
162
|
+
if (_instanceof(schema, z.ZodNull)) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
return value;
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
key: "extractArray",
|
|
170
|
+
value: /**
|
|
171
|
+
* Extracts array from text
|
|
172
|
+
*/ function extractArray(text) {
|
|
173
|
+
var arrayStart = text.indexOf('[');
|
|
174
|
+
var arrayEnd = text.lastIndexOf(']');
|
|
175
|
+
if (arrayStart === -1 || arrayEnd === -1) {
|
|
176
|
+
throw new AIResponseParserError('No array found in response', undefined, text);
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
return JSON.parse(text.slice(arrayStart, arrayEnd + 1));
|
|
180
|
+
} catch (error) {
|
|
181
|
+
throw new AIResponseParserError('Failed to parse array JSON', error, text);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
key: "extractJsonFromCodeBlock",
|
|
187
|
+
value: /**
|
|
188
|
+
* Extracts and validates JSON content from a code block
|
|
189
|
+
*/ function extractJsonFromCodeBlock(block) {
|
|
190
|
+
var content = block.replace(/```(?:json)?\r?\n([^`]*?)\r?\n```/, '$1').trim();
|
|
191
|
+
try {
|
|
192
|
+
// Attempt to parse as JSON to validate structure
|
|
193
|
+
JSON.parse(content);
|
|
194
|
+
return content;
|
|
195
|
+
} catch (e) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
key: "extractJsonFromText",
|
|
202
|
+
value: /**
|
|
203
|
+
* Extracts and parses JSON from text based on schema type
|
|
204
|
+
*/ function extractJsonFromText(text) {
|
|
205
|
+
if (_instanceof(this.schema, z.ZodArray)) {
|
|
206
|
+
return this.extractArray(text);
|
|
207
|
+
}
|
|
208
|
+
if (_instanceof(this.schema, z.ZodObject)) {
|
|
209
|
+
return this.extractObject(text);
|
|
210
|
+
}
|
|
211
|
+
if (_instanceof(this.schema, z.ZodString) || _instanceof(this.schema, z.ZodNumber) || _instanceof(this.schema, z.ZodBoolean) || _instanceof(this.schema, z.ZodNull)) {
|
|
212
|
+
return this.extractPrimitive(text, this.schema);
|
|
213
|
+
}
|
|
214
|
+
throw new AIResponseParserError('Unsupported schema type', undefined, text);
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
key: "extractObject",
|
|
219
|
+
value: /**
|
|
220
|
+
* Extracts object from text
|
|
221
|
+
*/ function extractObject(text) {
|
|
222
|
+
var objectStart = text.indexOf('{');
|
|
223
|
+
var objectEnd = text.lastIndexOf('}');
|
|
224
|
+
if (objectStart === -1 || objectEnd === -1) {
|
|
225
|
+
throw new AIResponseParserError('No object found in response', undefined, text);
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
return JSON.parse(text.slice(objectStart, objectEnd + 1));
|
|
229
|
+
} catch (error) {
|
|
230
|
+
throw new AIResponseParserError('Failed to parse object JSON', error, text);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
key: "extractPrimitive",
|
|
236
|
+
value: /**
|
|
237
|
+
* Extracts and converts primitive value from text
|
|
238
|
+
*/ function extractPrimitive(text, schema) {
|
|
239
|
+
var trimmed = text.trim();
|
|
240
|
+
// Try to parse as JSON first in case it's quoted
|
|
241
|
+
try {
|
|
242
|
+
var parsed = JSON.parse(trimmed);
|
|
243
|
+
return this.convertToPrimitive(parsed, schema);
|
|
244
|
+
} catch (e) {
|
|
245
|
+
// If not valid JSON, use the raw string
|
|
246
|
+
return this.convertToPrimitive(trimmed, schema);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
key: "findJsonStructures",
|
|
252
|
+
value: /**
|
|
253
|
+
* Finds valid JSON structures in raw text
|
|
254
|
+
*/ function findJsonStructures(text) {
|
|
255
|
+
var jsonMatches = [];
|
|
256
|
+
var depth = 0;
|
|
257
|
+
var start = -1;
|
|
258
|
+
for(var i = 0; i < text.length; i++){
|
|
259
|
+
var char = text[i];
|
|
260
|
+
if (char === '{' || char === '[') {
|
|
261
|
+
if (depth === 0) start = i;
|
|
262
|
+
depth++;
|
|
263
|
+
} else if (char === '}' || char === ']') {
|
|
264
|
+
depth--;
|
|
265
|
+
if (depth === 0 && start !== -1) {
|
|
266
|
+
var potentialJson = text.slice(start, i + 1);
|
|
267
|
+
try {
|
|
268
|
+
JSON.parse(potentialJson);
|
|
269
|
+
jsonMatches.push(potentialJson);
|
|
270
|
+
} catch (e) {
|
|
271
|
+
// Invalid JSON, ignore
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return jsonMatches;
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
key: "findLargestString",
|
|
281
|
+
value: /**
|
|
282
|
+
* Returns the largest string from an array of strings
|
|
283
|
+
*/ function findLargestString(strings) {
|
|
284
|
+
return strings.reduce(function(largest, current) {
|
|
285
|
+
return current.length > largest.length ? current : largest;
|
|
286
|
+
}, strings[0]);
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
key: "unescapeJsonValues",
|
|
291
|
+
value: /**
|
|
292
|
+
* Recursively unescapes all string values in a JSON object/array
|
|
293
|
+
*/ function unescapeJsonValues(json) {
|
|
294
|
+
var _this = this;
|
|
295
|
+
if (typeof json === 'string') {
|
|
296
|
+
return this.unescapeText(json);
|
|
297
|
+
}
|
|
298
|
+
if (Array.isArray(json)) {
|
|
299
|
+
return json.map(function(item) {
|
|
300
|
+
return _this.unescapeJsonValues(item);
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
if ((typeof json === "undefined" ? "undefined" : _type_of(json)) === 'object' && json !== null) {
|
|
304
|
+
return Object.fromEntries(Object.entries(json).map(function(param) {
|
|
305
|
+
var _param = _sliced_to_array(param, 2), key = _param[0], value = _param[1];
|
|
306
|
+
return [
|
|
307
|
+
key,
|
|
308
|
+
_this.unescapeJsonValues(value)
|
|
309
|
+
];
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
return json;
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
key: "unescapeText",
|
|
317
|
+
value: /**
|
|
318
|
+
* Unescapes common escaped characters in text
|
|
319
|
+
*/ function unescapeText(text) {
|
|
320
|
+
return text.replace(/\\"/g, '"') // Unescape quotes
|
|
321
|
+
.replace(/\\n/g, '\n') // Unescape newlines
|
|
322
|
+
.replace(/\\r/g, '\r') // Unescape carriage returns
|
|
323
|
+
.replace(/\\t/g, '\t') // Unescape tabs
|
|
324
|
+
.replace(/\\\\/g, '\\') // Unescape backslashes
|
|
325
|
+
.replace(/\\u([0-9a-fA-F]{4})/g, function(_, code) {
|
|
326
|
+
return String.fromCharCode(parseInt(code, 16));
|
|
327
|
+
}); // Unescape unicode
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
]);
|
|
331
|
+
return AIResponseParser;
|
|
332
|
+
}();
|
|
333
|
+
|
|
334
|
+
//# sourceMappingURL=ai-response-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/utils/ai-response-parser.ts"],"sourcesContent":["import { z } from 'zod/v4';\n\nimport { AIResponseParserError } from './ai-response-parser-error.js';\n\n/**\n * Parses AI response text into structured data based on Zod schema\n */\nexport class AIResponseParser<T> {\n constructor(private readonly schema: z.ZodSchema<T>) {}\n\n /**\n * Parses the AI response text based on the configured schema\n */\n public parse(text: string): T {\n try {\n const cleanedText = this.cleanText(text);\n const json = this.extractJsonFromText(cleanedText);\n const unescapedJson = this.unescapeJsonValues(json);\n return this.schema.parse(unescapedJson);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new AIResponseParserError(\n 'Failed to validate response against schema',\n error,\n text,\n );\n }\n throw error;\n }\n }\n\n /**\n * Cleans text and finds the largest schema-compatible structure\n */\n private cleanText(text: string): string {\n // First try to extract from markdown code blocks\n const codeBlocks = text.match(/```(?:json)?\\r?\\n([^`]*?)\\r?\\n```/g);\n if (codeBlocks) {\n // Try each code block and return the largest valid one\n const validBlocks = codeBlocks\n .map((block) => this.extractJsonFromCodeBlock(block))\n .filter((block): block is string => block !== null);\n\n if (validBlocks.length > 0) {\n return this.findLargestString(validBlocks);\n }\n }\n\n // If no valid code blocks, try to find JSON-like structures in the text\n const jsonMatches = this.findJsonStructures(text);\n if (jsonMatches.length > 0) {\n return this.findLargestString(jsonMatches);\n }\n\n // If no JSON structures found, clean and return the original text\n return text.replace(/\\s+/g, ' ').trim();\n }\n\n /**\n * Converts value to appropriate primitive type based on schema\n */\n private convertToPrimitive(value: unknown, schema: z.ZodType): unknown {\n if (schema instanceof z.ZodString) {\n return String(value);\n }\n if (schema instanceof z.ZodNumber) {\n return Number(value);\n }\n if (schema instanceof z.ZodBoolean) {\n return Boolean(value);\n }\n if (schema instanceof z.ZodNull) {\n return null;\n }\n return value;\n }\n\n /**\n * Extracts array from text\n */\n private extractArray(text: string): unknown {\n const arrayStart = text.indexOf('[');\n const arrayEnd = text.lastIndexOf(']');\n if (arrayStart === -1 || arrayEnd === -1) {\n throw new AIResponseParserError('No array found in response', undefined, text);\n }\n try {\n return JSON.parse(text.slice(arrayStart, arrayEnd + 1));\n } catch (error) {\n throw new AIResponseParserError('Failed to parse array JSON', error, text);\n }\n }\n\n /**\n * Extracts and validates JSON content from a code block\n */\n private extractJsonFromCodeBlock(block: string): null | string {\n const content = block.replace(/```(?:json)?\\r?\\n([^`]*?)\\r?\\n```/, '$1').trim();\n try {\n // Attempt to parse as JSON to validate structure\n JSON.parse(content);\n return content;\n } catch {\n return null;\n }\n }\n\n /**\n * Extracts and parses JSON from text based on schema type\n */\n private extractJsonFromText(text: string): unknown {\n if (this.schema instanceof z.ZodArray) {\n return this.extractArray(text);\n }\n\n if (this.schema instanceof z.ZodObject) {\n return this.extractObject(text);\n }\n\n if (\n this.schema instanceof z.ZodString ||\n this.schema instanceof z.ZodNumber ||\n this.schema instanceof z.ZodBoolean ||\n this.schema instanceof z.ZodNull\n ) {\n return this.extractPrimitive(text, this.schema);\n }\n\n throw new AIResponseParserError('Unsupported schema type', undefined, text);\n }\n\n /**\n * Extracts object from text\n */\n private extractObject(text: string): unknown {\n const objectStart = text.indexOf('{');\n const objectEnd = text.lastIndexOf('}');\n if (objectStart === -1 || objectEnd === -1) {\n throw new AIResponseParserError('No object found in response', undefined, text);\n }\n try {\n return JSON.parse(text.slice(objectStart, objectEnd + 1));\n } catch (error) {\n throw new AIResponseParserError('Failed to parse object JSON', error, text);\n }\n }\n\n /**\n * Extracts and converts primitive value from text\n */\n private extractPrimitive(text: string, schema: z.ZodType): unknown {\n const trimmed = text.trim();\n\n // Try to parse as JSON first in case it's quoted\n try {\n const parsed = JSON.parse(trimmed);\n return this.convertToPrimitive(parsed, schema);\n } catch {\n // If not valid JSON, use the raw string\n return this.convertToPrimitive(trimmed, schema);\n }\n }\n\n /**\n * Finds valid JSON structures in raw text\n */\n private findJsonStructures(text: string): string[] {\n const jsonMatches: string[] = [];\n let depth = 0;\n let start = -1;\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n if (char === '{' || char === '[') {\n if (depth === 0) start = i;\n depth++;\n } else if (char === '}' || char === ']') {\n depth--;\n if (depth === 0 && start !== -1) {\n const potentialJson = text.slice(start, i + 1);\n try {\n JSON.parse(potentialJson);\n jsonMatches.push(potentialJson);\n } catch {\n // Invalid JSON, ignore\n }\n }\n }\n }\n\n return jsonMatches;\n }\n\n /**\n * Returns the largest string from an array of strings\n */\n private findLargestString(strings: string[]): string {\n return strings.reduce(\n (largest, current) => (current.length > largest.length ? current : largest),\n strings[0],\n );\n }\n\n /**\n * Recursively unescapes all string values in a JSON object/array\n */\n private unescapeJsonValues(json: unknown): unknown {\n if (typeof json === 'string') {\n return this.unescapeText(json);\n }\n if (Array.isArray(json)) {\n return json.map((item) => this.unescapeJsonValues(item));\n }\n if (typeof json === 'object' && json !== null) {\n return Object.fromEntries(\n Object.entries(json).map(([key, value]) => [key, this.unescapeJsonValues(value)]),\n );\n }\n return json;\n }\n\n /**\n * Unescapes common escaped characters in text\n */\n private unescapeText(text: string): string {\n return text\n .replace(/\\\\\"/g, '\"') // Unescape quotes\n .replace(/\\\\n/g, '\\n') // Unescape newlines\n .replace(/\\\\r/g, '\\r') // Unescape carriage returns\n .replace(/\\\\t/g, '\\t') // Unescape tabs\n .replace(/\\\\\\\\/g, '\\\\') // Unescape backslashes\n .replace(/\\\\u([0-9a-fA-F]{4})/g, (_, code) => String.fromCharCode(parseInt(code, 16))); // Unescape unicode\n }\n}\n"],"names":["z","AIResponseParserError","AIResponseParser","schema","parse","text","cleanedText","cleanText","json","extractJsonFromText","unescapedJson","unescapeJsonValues","error","ZodError","codeBlocks","match","validBlocks","map","block","extractJsonFromCodeBlock","filter","length","findLargestString","jsonMatches","findJsonStructures","replace","trim","convertToPrimitive","value","ZodString","String","ZodNumber","Number","ZodBoolean","Boolean","ZodNull","extractArray","arrayStart","indexOf","arrayEnd","lastIndexOf","undefined","JSON","slice","content","ZodArray","ZodObject","extractObject","extractPrimitive","objectStart","objectEnd","trimmed","parsed","depth","start","i","char","potentialJson","push","strings","reduce","largest","current","unescapeText","Array","isArray","item","Object","fromEntries","entries","key","_","code","fromCharCode","parseInt"],"mappings":"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"}
|