@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/tools/safe-tool.adapter.ts"],"sourcesContent":["import type { LoggerPort } from '@jterrazz/logger';\nimport { DynamicStructuredTool, DynamicTool } from 'langchain/tools';\nimport type { z } from 'zod/v4';\n\nimport type { Tool } from '../../ports/tool.port.js';\n\nexport interface SafeToolOptions<T> {\n logger?: LoggerPort;\n schema?: z.ZodSchema<T>;\n}\n\nexport type ToolConfig<T = void> = {\n description: string;\n execute: ToolFunction<T>;\n name: string;\n};\n\nexport type ToolFunction<T = void> = T extends void\n ? () => Promise<string>\n : (args: T) => Promise<string>;\n\n/**\n * Safe tool adapter that provides error handling and logging for LangChain tools\n */\nexport class SafeToolAdapter<T = void> implements Tool {\n private readonly dynamicTool: DynamicStructuredTool<z.ZodSchema<T>> | DynamicTool;\n\n constructor(\n private readonly config: ToolConfig<T>,\n private readonly options: SafeToolOptions<T> = {},\n ) {\n const { logger, schema } = options;\n\n if (schema) {\n // Use DynamicStructuredTool for parameterized tools\n this.dynamicTool = new DynamicStructuredTool({\n description: config.description,\n func: async (args: T) => {\n try {\n return await (config.execute as ToolFunction<T>)(args);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n logger?.error(`Unexpected error in ${config.name}`, {\n args,\n error: errorMessage,\n toolName: config.name,\n });\n\n return `Tool ${config.name} failed to execute`;\n }\n },\n name: config.name,\n schema: schema,\n });\n } else {\n // Use DynamicTool for simple tools\n this.dynamicTool = new DynamicTool({\n description: config.description,\n func: async () => {\n try {\n return await (config.execute as ToolFunction<void>)();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n logger?.error(`Unexpected error in ${config.name}`, {\n error: errorMessage,\n toolName: config.name,\n });\n\n return `Tool ${config.name} failed to execute`;\n }\n },\n name: config.name,\n });\n }\n }\n\n /**\n * Get the underlying LangChain DynamicTool instance\n */\n getDynamicTool(): DynamicStructuredTool<z.ZodSchema<unknown>> | DynamicTool {\n return this.dynamicTool as DynamicStructuredTool<z.ZodSchema<unknown>> | DynamicTool;\n }\n}\n"],"names":["DynamicStructuredTool","DynamicTool","SafeToolAdapter","config","options","dynamicTool","logger","schema","description","func","args","error","errorMessage","execute","Error","message","String","name","toolName","getDynamicTool"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAASA,qBAAqB,EAAEC,WAAW,QAAQ,kBAAkB;AAoBrE;;CAEC,GACD,OAAO,IAAA,AAAMC,gCAAN;;aAAMA,gBAIL,AAAiBC,MAAqB;YACtC,AAAiBC,UAAjB,iEAA+C,CAAC;gCAL3CF;;;QACT,uBAAiBG,eAAjB,KAAA;aAGqBF,SAAAA;aACAC,UAAAA;QAEjB,IAAQE,SAAmBF,QAAnBE,QAAQC,SAAWH,QAAXG;QAEhB,IAAIA,QAAQ;YACR,oDAAoD;YACpD,IAAI,CAACF,WAAW,GAAG,IAAIL,sBAAsB;gBACzCQ,aAAaL,OAAOK,WAAW;gBAC/BC,MAAM,SAAOC;;4BAGAC,OACCC;;;;;;;;;;oCAFC;;wCAAOT,OAAOU,OAAO,CAAqBH;;;oCAAjD;;wCAAO;;;oCACFC;oCACCC,eAAeD,AAAK,YAALA,OAAiBG,SAAQH,MAAMI,OAAO,GAAGC,OAAOL;oCAErEL,mBAAAA,6BAAAA,OAAQK,KAAK,CAAC,AAAC,uBAAkC,OAAZR,OAAOc,IAAI,GAAI;wCAChDP,MAAAA;wCACAC,OAAOC;wCACPM,UAAUf,OAAOc,IAAI;oCACzB;oCAEA;;wCAAQ,QAAmB,OAAZd,OAAOc,IAAI,EAAC;;;;;;;;oBAEnC;;gBACAA,MAAMd,OAAOc,IAAI;gBACjBV,QAAQA;YACZ;QACJ,OAAO;YACH,mCAAmC;YACnC,IAAI,CAACF,WAAW,GAAG,IAAIJ,YAAY;gBAC/BO,aAAaL,OAAOK,WAAW;gBAC/BC,MAAM;;4BAGOE,OACCC;;;;;;;;;;oCAFC;;wCAAOT,OAAOU,OAAO;;;oCAA5B;;wCAAO;;;oCACFF;oCACCC,eAAeD,AAAK,YAALA,OAAiBG,SAAQH,MAAMI,OAAO,GAAGC,OAAOL;oCAErEL,mBAAAA,6BAAAA,OAAQK,KAAK,CAAC,AAAC,uBAAkC,OAAZR,OAAOc,IAAI,GAAI;wCAChDN,OAAOC;wCACPM,UAAUf,OAAOc,IAAI;oCACzB;oCAEA;;wCAAQ,QAAmB,OAAZd,OAAOc,IAAI,EAAC;;;;;;;;oBAEnC;;gBACAA,MAAMd,OAAOc,IAAI;YACrB;QACJ;;kBAnDKf;;YAsDT;;KAEC,GACDiB,KAAAA;mBAAAA,SAAAA;gBACI,OAAO,IAAI,CAACd,WAAW;YAC3B;;;WA3DSH;IA4DZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { describe, expect, it } from '@jterrazz/test';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
import { AIResponseParser } from '../ai-response-parser.js';
|
|
4
|
+
import { AIResponseParserError } from '../ai-response-parser-error.js';
|
|
5
|
+
// Test data
|
|
6
|
+
var testSchema = z.object({
|
|
7
|
+
content: z.string(),
|
|
8
|
+
tags: z.array(z.string()),
|
|
9
|
+
title: z.string()
|
|
10
|
+
});
|
|
11
|
+
var validJson = {
|
|
12
|
+
content: 'Test content',
|
|
13
|
+
tags: [
|
|
14
|
+
'test',
|
|
15
|
+
'ai'
|
|
16
|
+
],
|
|
17
|
+
title: 'Test Article'
|
|
18
|
+
};
|
|
19
|
+
var validJsonString = JSON.stringify(validJson);
|
|
20
|
+
describe('AIResponseParser', function() {
|
|
21
|
+
describe('parse', function() {
|
|
22
|
+
it('should parse valid JSON object', function() {
|
|
23
|
+
// Given - a valid JSON object string and parser
|
|
24
|
+
var text = validJsonString;
|
|
25
|
+
var parser = new AIResponseParser(testSchema);
|
|
26
|
+
// When - parsing the string
|
|
27
|
+
var result = parser.parse(text);
|
|
28
|
+
// Then - it should return the parsed object
|
|
29
|
+
expect(result).toEqual(validJson);
|
|
30
|
+
});
|
|
31
|
+
it('should parse JSON object with surrounding text', function() {
|
|
32
|
+
// Given - a JSON object string with surrounding text and parser
|
|
33
|
+
var text = "Here's the article: ".concat(validJsonString, " - end of article");
|
|
34
|
+
var parser = new AIResponseParser(testSchema);
|
|
35
|
+
// When - parsing the string
|
|
36
|
+
var result = parser.parse(text);
|
|
37
|
+
// Then - it should return the parsed object
|
|
38
|
+
expect(result).toEqual(validJson);
|
|
39
|
+
});
|
|
40
|
+
it('should parse array response', function() {
|
|
41
|
+
// Given - a JSON array string and array parser
|
|
42
|
+
var arraySchema = z.array(z.string());
|
|
43
|
+
var text = '["test", "ai", "content"]';
|
|
44
|
+
var parser = new AIResponseParser(arraySchema);
|
|
45
|
+
// When - parsing the string
|
|
46
|
+
var result = parser.parse(text);
|
|
47
|
+
// Then - it should return the parsed array
|
|
48
|
+
expect(result).toEqual([
|
|
49
|
+
'test',
|
|
50
|
+
'ai',
|
|
51
|
+
'content'
|
|
52
|
+
]);
|
|
53
|
+
});
|
|
54
|
+
it('should parse primitive string value', function() {
|
|
55
|
+
// Given - a JSON string value and string parser
|
|
56
|
+
var text = '"test string"';
|
|
57
|
+
var parser = new AIResponseParser(z.string());
|
|
58
|
+
// When - parsing the string
|
|
59
|
+
var result = parser.parse(text);
|
|
60
|
+
// Then - it should return the parsed string
|
|
61
|
+
expect(result).toBe('test string');
|
|
62
|
+
});
|
|
63
|
+
it('should parse primitive number value', function() {
|
|
64
|
+
// Given - a JSON number value and number parser
|
|
65
|
+
var text = '42';
|
|
66
|
+
var parser = new AIResponseParser(z.number());
|
|
67
|
+
// When - parsing the string
|
|
68
|
+
var result = parser.parse(text);
|
|
69
|
+
// Then - it should return the parsed number
|
|
70
|
+
expect(result).toBe(42);
|
|
71
|
+
});
|
|
72
|
+
it('should parse primitive boolean value', function() {
|
|
73
|
+
// Given - a JSON boolean value and boolean parser
|
|
74
|
+
var text = 'true';
|
|
75
|
+
var parser = new AIResponseParser(z["boolean"]());
|
|
76
|
+
// When - parsing the string
|
|
77
|
+
var result = parser.parse(text);
|
|
78
|
+
// Then - it should return the parsed boolean
|
|
79
|
+
expect(result).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
it('should parse primitive null value', function() {
|
|
82
|
+
// Given - a JSON null value and null parser
|
|
83
|
+
var text = 'null';
|
|
84
|
+
var parser = new AIResponseParser(z["null"]());
|
|
85
|
+
// When - parsing the string
|
|
86
|
+
var result = parser.parse(text);
|
|
87
|
+
// Then - it should return the parsed null
|
|
88
|
+
expect(result).toBeNull();
|
|
89
|
+
});
|
|
90
|
+
it('should throw ResponseParsingError when JSON is invalid', function() {
|
|
91
|
+
// Given - an invalid JSON string and parser
|
|
92
|
+
var text = '{invalid json}';
|
|
93
|
+
var parser = new AIResponseParser(testSchema);
|
|
94
|
+
// When/Then - parsing the string should throw a ResponseParsingError
|
|
95
|
+
expect(function() {
|
|
96
|
+
return parser.parse(text);
|
|
97
|
+
}).toThrow(AIResponseParserError);
|
|
98
|
+
});
|
|
99
|
+
it('should throw ResponseParsingError when schema validation fails', function() {
|
|
100
|
+
// Given - an invalid JSON object and parser
|
|
101
|
+
var invalidJson = {
|
|
102
|
+
// Should be string
|
|
103
|
+
content: 'Test content',
|
|
104
|
+
tags: [
|
|
105
|
+
'test',
|
|
106
|
+
'ai'
|
|
107
|
+
],
|
|
108
|
+
title: 123
|
|
109
|
+
};
|
|
110
|
+
var text = JSON.stringify(invalidJson);
|
|
111
|
+
var parser = new AIResponseParser(testSchema);
|
|
112
|
+
// When/Then - parsing the string should throw a ResponseParsingError
|
|
113
|
+
expect(function() {
|
|
114
|
+
return parser.parse(text);
|
|
115
|
+
}).toThrow(AIResponseParserError);
|
|
116
|
+
});
|
|
117
|
+
it('should throw ResponseParsingError when no object found in text', function() {
|
|
118
|
+
// Given - a text without a JSON object and parser
|
|
119
|
+
var text = 'No JSON object here';
|
|
120
|
+
var parser = new AIResponseParser(testSchema);
|
|
121
|
+
// When/Then - parsing the string should throw a ResponseParsingError
|
|
122
|
+
expect(function() {
|
|
123
|
+
return parser.parse(text);
|
|
124
|
+
}).toThrow(AIResponseParserError);
|
|
125
|
+
});
|
|
126
|
+
it('should throw ResponseParsingError when no array found in text', function() {
|
|
127
|
+
// Given - a text without a JSON array and array parser
|
|
128
|
+
var text = 'No array here';
|
|
129
|
+
var arraySchema = z.array(z.string());
|
|
130
|
+
var parser = new AIResponseParser(arraySchema);
|
|
131
|
+
// When/Then - parsing the string should throw a ResponseParsingError
|
|
132
|
+
expect(function() {
|
|
133
|
+
return parser.parse(text);
|
|
134
|
+
}).toThrow(AIResponseParserError);
|
|
135
|
+
});
|
|
136
|
+
it('should throw ResponseParsingError for unsupported schema type', function() {
|
|
137
|
+
// Given - a text with an unsupported schema type and parser
|
|
138
|
+
var text = 'test';
|
|
139
|
+
var unsupportedSchema = z.union([
|
|
140
|
+
z.string(),
|
|
141
|
+
z.number()
|
|
142
|
+
]);
|
|
143
|
+
var parser = new AIResponseParser(unsupportedSchema);
|
|
144
|
+
// When/Then - parsing the string should throw a ResponseParsingError
|
|
145
|
+
expect(function() {
|
|
146
|
+
return parser.parse(text);
|
|
147
|
+
}).toThrow(AIResponseParserError);
|
|
148
|
+
});
|
|
149
|
+
it('should include original text in error when parsing fails', function() {
|
|
150
|
+
// Given - an invalid JSON string and parser
|
|
151
|
+
var text = '{invalid json}';
|
|
152
|
+
var parser = new AIResponseParser(testSchema);
|
|
153
|
+
// When - parsing the string
|
|
154
|
+
try {
|
|
155
|
+
parser.parse(text);
|
|
156
|
+
throw new Error('Should have thrown an error');
|
|
157
|
+
} catch (error) {
|
|
158
|
+
// Then - the error should include the original text
|
|
159
|
+
expect(error).toBeInstanceOf(AIResponseParserError);
|
|
160
|
+
expect(error.text).toBe(text);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
it('should handle text with newlines in JSON object', function() {
|
|
164
|
+
// Given - a JSON object with newlines and parser
|
|
165
|
+
var textWithNewlines = '{\n "content": "Test\ncontent\nwith\nnewlines",\n "tags": ["test", "ai"],\n "title": "Test\nArticle"\n }';
|
|
166
|
+
var parser = new AIResponseParser(testSchema);
|
|
167
|
+
// When - parsing the string
|
|
168
|
+
var result = parser.parse(textWithNewlines);
|
|
169
|
+
// Then - it should return the parsed object
|
|
170
|
+
expect(result).toEqual({
|
|
171
|
+
content: 'Test content with newlines',
|
|
172
|
+
tags: [
|
|
173
|
+
'test',
|
|
174
|
+
'ai'
|
|
175
|
+
],
|
|
176
|
+
title: 'Test Article'
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
it('should handle text with newlines in surrounding text', function() {
|
|
180
|
+
// Given - a text with newlines around the JSON object and parser
|
|
181
|
+
var textWithNewlines = "Here's the\narticle:\n".concat(validJsonString, "\n- end of\narticle");
|
|
182
|
+
var parser = new AIResponseParser(testSchema);
|
|
183
|
+
// When - parsing the string
|
|
184
|
+
var result = parser.parse(textWithNewlines);
|
|
185
|
+
// Then - it should return the parsed object
|
|
186
|
+
expect(result).toEqual(validJson);
|
|
187
|
+
});
|
|
188
|
+
it('should handle text with multiple consecutive newlines and spaces', function() {
|
|
189
|
+
// Given - a text with multiple consecutive newlines and spaces and parser
|
|
190
|
+
var textWithNewlines = "Here's the\n\n article: \n\n".concat(validJsonString, "\n\n");
|
|
191
|
+
var parser = new AIResponseParser(testSchema);
|
|
192
|
+
// When - parsing the string
|
|
193
|
+
var result = parser.parse(textWithNewlines);
|
|
194
|
+
// Then - it should return the parsed object
|
|
195
|
+
expect(result).toEqual(validJson);
|
|
196
|
+
});
|
|
197
|
+
it('should handle escaped characters in JSON', function() {
|
|
198
|
+
// Given - a JSON string with escaped characters and parser
|
|
199
|
+
var text = '{"content": "Test\\ncontent\\twith\\r\\nescapes", "tags": ["test\\u0020ai", "escaped\\"quotes\\""], "title": "Test\\\\Article"}';
|
|
200
|
+
var parser = new AIResponseParser(testSchema);
|
|
201
|
+
// When - parsing the string
|
|
202
|
+
var result = parser.parse(text);
|
|
203
|
+
// Then - it should return the parsed object
|
|
204
|
+
expect(result).toEqual({
|
|
205
|
+
content: 'Test\ncontent\twith\r\nescapes',
|
|
206
|
+
tags: [
|
|
207
|
+
'test ai',
|
|
208
|
+
'escaped"quotes"'
|
|
209
|
+
],
|
|
210
|
+
title: 'Test\\Article'
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
it('should handle escaped characters in markdown code blocks', function() {
|
|
214
|
+
// Given - a markdown code block with escaped characters and parser
|
|
215
|
+
var text = '```json\n{"content": "Test\\nContent", "tags": ["test\\u0020ai"], "title": "Test\\\\Title"}\n```';
|
|
216
|
+
var parser = new AIResponseParser(testSchema);
|
|
217
|
+
// When - parsing the string
|
|
218
|
+
var result = parser.parse(text);
|
|
219
|
+
// Then - it should return the parsed object
|
|
220
|
+
expect(result).toEqual({
|
|
221
|
+
content: 'Test\nContent',
|
|
222
|
+
tags: [
|
|
223
|
+
'test ai'
|
|
224
|
+
],
|
|
225
|
+
title: 'Test\\Title'
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
it('should handle escaped characters in markdown code blocks', function() {
|
|
229
|
+
// Given - a markdown code block with escaped characters and array parser
|
|
230
|
+
var text = '```json\n [\n{"content": "Test\\nContent", "tags": ["test\\u0020ai"], "title": "Test\\\\Title"}\n]\n```';
|
|
231
|
+
var arraySchema = z.array(testSchema);
|
|
232
|
+
var parser = new AIResponseParser(arraySchema);
|
|
233
|
+
// When - parsing the string
|
|
234
|
+
var result = parser.parse(text);
|
|
235
|
+
// Then - it should return the parsed array
|
|
236
|
+
expect(result).toEqual([
|
|
237
|
+
{
|
|
238
|
+
content: 'Test\nContent',
|
|
239
|
+
tags: [
|
|
240
|
+
'test ai'
|
|
241
|
+
],
|
|
242
|
+
title: 'Test\\Title'
|
|
243
|
+
}
|
|
244
|
+
]);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
//# sourceMappingURL=ai-response-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/adapters/utils/__tests__/ai-response-parser.test.ts"],"sourcesContent":["import { describe, expect, it } from '@jterrazz/test';\nimport { z } from 'zod/v4';\n\nimport { AIResponseParser } from '../ai-response-parser.js';\nimport { AIResponseParserError } from '../ai-response-parser-error.js';\n\n// Test data\nconst testSchema = z.object({\n content: z.string(),\n tags: z.array(z.string()),\n title: z.string(),\n});\n\nconst validJson = {\n content: 'Test content',\n tags: ['test', 'ai'],\n title: 'Test Article',\n};\n\nconst validJsonString = JSON.stringify(validJson);\n\ndescribe('AIResponseParser', () => {\n describe('parse', () => {\n it('should parse valid JSON object', () => {\n // Given - a valid JSON object string and parser\n const text = validJsonString;\n const parser = new AIResponseParser(testSchema);\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed object\n expect(result).toEqual(validJson);\n });\n\n it('should parse JSON object with surrounding text', () => {\n // Given - a JSON object string with surrounding text and parser\n const text = `Here's the article: ${validJsonString} - end of article`;\n const parser = new AIResponseParser(testSchema);\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed object\n expect(result).toEqual(validJson);\n });\n\n it('should parse array response', () => {\n // Given - a JSON array string and array parser\n const arraySchema = z.array(z.string());\n const text = '[\"test\", \"ai\", \"content\"]';\n const parser = new AIResponseParser(arraySchema);\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed array\n expect(result).toEqual(['test', 'ai', 'content']);\n });\n\n it('should parse primitive string value', () => {\n // Given - a JSON string value and string parser\n const text = '\"test string\"';\n const parser = new AIResponseParser(z.string());\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed string\n expect(result).toBe('test string');\n });\n\n it('should parse primitive number value', () => {\n // Given - a JSON number value and number parser\n const text = '42';\n const parser = new AIResponseParser(z.number());\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed number\n expect(result).toBe(42);\n });\n\n it('should parse primitive boolean value', () => {\n // Given - a JSON boolean value and boolean parser\n const text = 'true';\n const parser = new AIResponseParser(z.boolean());\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed boolean\n expect(result).toBe(true);\n });\n\n it('should parse primitive null value', () => {\n // Given - a JSON null value and null parser\n const text = 'null';\n const parser = new AIResponseParser(z.null());\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed null\n expect(result).toBeNull();\n });\n\n it('should throw ResponseParsingError when JSON is invalid', () => {\n // Given - an invalid JSON string and parser\n const text = '{invalid json}';\n const parser = new AIResponseParser(testSchema);\n\n // When/Then - parsing the string should throw a ResponseParsingError\n expect(() => parser.parse(text)).toThrow(AIResponseParserError);\n });\n\n it('should throw ResponseParsingError when schema validation fails', () => {\n // Given - an invalid JSON object and parser\n const invalidJson = {\n // Should be string\n content: 'Test content',\n tags: ['test', 'ai'],\n title: 123,\n };\n const text = JSON.stringify(invalidJson);\n const parser = new AIResponseParser(testSchema);\n\n // When/Then - parsing the string should throw a ResponseParsingError\n expect(() => parser.parse(text)).toThrow(AIResponseParserError);\n });\n\n it('should throw ResponseParsingError when no object found in text', () => {\n // Given - a text without a JSON object and parser\n const text = 'No JSON object here';\n const parser = new AIResponseParser(testSchema);\n\n // When/Then - parsing the string should throw a ResponseParsingError\n expect(() => parser.parse(text)).toThrow(AIResponseParserError);\n });\n\n it('should throw ResponseParsingError when no array found in text', () => {\n // Given - a text without a JSON array and array parser\n const text = 'No array here';\n const arraySchema = z.array(z.string());\n const parser = new AIResponseParser(arraySchema);\n\n // When/Then - parsing the string should throw a ResponseParsingError\n expect(() => parser.parse(text)).toThrow(AIResponseParserError);\n });\n\n it('should throw ResponseParsingError for unsupported schema type', () => {\n // Given - a text with an unsupported schema type and parser\n const text = 'test';\n const unsupportedSchema = z.union([z.string(), z.number()]);\n const parser = new AIResponseParser(unsupportedSchema);\n\n // When/Then - parsing the string should throw a ResponseParsingError\n expect(() => parser.parse(text)).toThrow(AIResponseParserError);\n });\n\n it('should include original text in error when parsing fails', () => {\n // Given - an invalid JSON string and parser\n const text = '{invalid json}';\n const parser = new AIResponseParser(testSchema);\n\n // When - parsing the string\n try {\n parser.parse(text);\n throw new Error('Should have thrown an error');\n } catch (error) {\n // Then - the error should include the original text\n expect(error).toBeInstanceOf(AIResponseParserError);\n expect((error as AIResponseParserError).text).toBe(text);\n }\n });\n\n it('should handle text with newlines in JSON object', () => {\n // Given - a JSON object with newlines and parser\n const textWithNewlines = `{\n \"content\": \"Test\\ncontent\\nwith\\nnewlines\",\n \"tags\": [\"test\", \"ai\"],\n \"title\": \"Test\\nArticle\"\n }`;\n const parser = new AIResponseParser(testSchema);\n\n // When - parsing the string\n const result = parser.parse(textWithNewlines);\n\n // Then - it should return the parsed object\n expect(result).toEqual({\n content: 'Test content with newlines',\n tags: ['test', 'ai'],\n title: 'Test Article',\n });\n });\n\n it('should handle text with newlines in surrounding text', () => {\n // Given - a text with newlines around the JSON object and parser\n const textWithNewlines = `Here's the\\narticle:\\n${validJsonString}\\n- end of\\narticle`;\n const parser = new AIResponseParser(testSchema);\n\n // When - parsing the string\n const result = parser.parse(textWithNewlines);\n\n // Then - it should return the parsed object\n expect(result).toEqual(validJson);\n });\n\n it('should handle text with multiple consecutive newlines and spaces', () => {\n // Given - a text with multiple consecutive newlines and spaces and parser\n const textWithNewlines = `Here's the\\n\\n article: \\n\\n${validJsonString}\\n\\n`;\n const parser = new AIResponseParser(testSchema);\n\n // When - parsing the string\n const result = parser.parse(textWithNewlines);\n\n // Then - it should return the parsed object\n expect(result).toEqual(validJson);\n });\n\n it('should handle escaped characters in JSON', () => {\n // Given - a JSON string with escaped characters and parser\n const text =\n '{\"content\": \"Test\\\\ncontent\\\\twith\\\\r\\\\nescapes\", \"tags\": [\"test\\\\u0020ai\", \"escaped\\\\\"quotes\\\\\"\"], \"title\": \"Test\\\\\\\\Article\"}';\n const parser = new AIResponseParser(testSchema);\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed object\n expect(result).toEqual({\n content: 'Test\\ncontent\\twith\\r\\nescapes',\n tags: ['test ai', 'escaped\"quotes\"'],\n title: 'Test\\\\Article',\n });\n });\n\n it('should handle escaped characters in markdown code blocks', () => {\n // Given - a markdown code block with escaped characters and parser\n const text =\n '```json\\n{\"content\": \"Test\\\\nContent\", \"tags\": [\"test\\\\u0020ai\"], \"title\": \"Test\\\\\\\\Title\"}\\n```';\n const parser = new AIResponseParser(testSchema);\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed object\n expect(result).toEqual({\n content: 'Test\\nContent',\n tags: ['test ai'],\n title: 'Test\\\\Title',\n });\n });\n\n it('should handle escaped characters in markdown code blocks', () => {\n // Given - a markdown code block with escaped characters and array parser\n const text =\n '```json\\n [\\n{\"content\": \"Test\\\\nContent\", \"tags\": [\"test\\\\u0020ai\"], \"title\": \"Test\\\\\\\\Title\"}\\n]\\n```';\n const arraySchema = z.array(testSchema);\n const parser = new AIResponseParser(arraySchema);\n\n // When - parsing the string\n const result = parser.parse(text);\n\n // Then - it should return the parsed array\n expect(result).toEqual([\n {\n content: 'Test\\nContent',\n tags: ['test ai'],\n title: 'Test\\\\Title',\n },\n ]);\n });\n });\n});\n"],"names":["describe","expect","it","z","AIResponseParser","AIResponseParserError","testSchema","object","content","string","tags","array","title","validJson","validJsonString","JSON","stringify","text","parser","result","parse","toEqual","arraySchema","toBe","number","boolean","null","toBeNull","toThrow","invalidJson","unsupportedSchema","union","Error","error","toBeInstanceOf","textWithNewlines"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error for AI response parsing failures
|
|
3
|
+
*/
|
|
4
|
+
export declare class AIResponseParserError extends Error {
|
|
5
|
+
readonly cause?: unknown | undefined;
|
|
6
|
+
readonly text?: string | undefined;
|
|
7
|
+
constructor(message: string, cause?: unknown | undefined, text?: string | undefined);
|
|
8
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom error for AI response parsing failures
|
|
3
|
+
*/ function _assert_this_initialized(self) {
|
|
4
|
+
if (self === void 0) {
|
|
5
|
+
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
|
6
|
+
}
|
|
7
|
+
return self;
|
|
8
|
+
}
|
|
9
|
+
function _call_super(_this, derived, args) {
|
|
10
|
+
derived = _get_prototype_of(derived);
|
|
11
|
+
return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
|
|
12
|
+
}
|
|
13
|
+
function _class_call_check(instance, Constructor) {
|
|
14
|
+
if (!(instance instanceof Constructor)) {
|
|
15
|
+
throw new TypeError("Cannot call a class as a function");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function _construct(Parent, args, Class) {
|
|
19
|
+
if (_is_native_reflect_construct()) {
|
|
20
|
+
_construct = Reflect.construct;
|
|
21
|
+
} else {
|
|
22
|
+
_construct = function construct(Parent, args, Class) {
|
|
23
|
+
var a = [
|
|
24
|
+
null
|
|
25
|
+
];
|
|
26
|
+
a.push.apply(a, args);
|
|
27
|
+
var Constructor = Function.bind.apply(Parent, a);
|
|
28
|
+
var instance = new Constructor();
|
|
29
|
+
if (Class) _set_prototype_of(instance, Class.prototype);
|
|
30
|
+
return instance;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return _construct.apply(null, arguments);
|
|
34
|
+
}
|
|
35
|
+
function _define_property(obj, key, value) {
|
|
36
|
+
if (key in obj) {
|
|
37
|
+
Object.defineProperty(obj, key, {
|
|
38
|
+
value: value,
|
|
39
|
+
enumerable: true,
|
|
40
|
+
configurable: true,
|
|
41
|
+
writable: true
|
|
42
|
+
});
|
|
43
|
+
} else {
|
|
44
|
+
obj[key] = value;
|
|
45
|
+
}
|
|
46
|
+
return obj;
|
|
47
|
+
}
|
|
48
|
+
function _get_prototype_of(o) {
|
|
49
|
+
_get_prototype_of = Object.setPrototypeOf ? Object.getPrototypeOf : function getPrototypeOf(o) {
|
|
50
|
+
return o.__proto__ || Object.getPrototypeOf(o);
|
|
51
|
+
};
|
|
52
|
+
return _get_prototype_of(o);
|
|
53
|
+
}
|
|
54
|
+
function _inherits(subClass, superClass) {
|
|
55
|
+
if (typeof superClass !== "function" && superClass !== null) {
|
|
56
|
+
throw new TypeError("Super expression must either be null or a function");
|
|
57
|
+
}
|
|
58
|
+
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
|
59
|
+
constructor: {
|
|
60
|
+
value: subClass,
|
|
61
|
+
writable: true,
|
|
62
|
+
configurable: true
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
if (superClass) _set_prototype_of(subClass, superClass);
|
|
66
|
+
}
|
|
67
|
+
function _is_native_function(fn) {
|
|
68
|
+
return Function.toString.call(fn).indexOf("[native code]") !== -1;
|
|
69
|
+
}
|
|
70
|
+
function _possible_constructor_return(self, call) {
|
|
71
|
+
if (call && (_type_of(call) === "object" || typeof call === "function")) {
|
|
72
|
+
return call;
|
|
73
|
+
}
|
|
74
|
+
return _assert_this_initialized(self);
|
|
75
|
+
}
|
|
76
|
+
function _set_prototype_of(o, p) {
|
|
77
|
+
_set_prototype_of = Object.setPrototypeOf || function setPrototypeOf(o, p) {
|
|
78
|
+
o.__proto__ = p;
|
|
79
|
+
return o;
|
|
80
|
+
};
|
|
81
|
+
return _set_prototype_of(o, p);
|
|
82
|
+
}
|
|
83
|
+
function _type_of(obj) {
|
|
84
|
+
"@swc/helpers - typeof";
|
|
85
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
86
|
+
}
|
|
87
|
+
function _wrap_native_super(Class) {
|
|
88
|
+
var _cache = typeof Map === "function" ? new Map() : undefined;
|
|
89
|
+
_wrap_native_super = function wrapNativeSuper(Class) {
|
|
90
|
+
if (Class === null || !_is_native_function(Class)) return Class;
|
|
91
|
+
if (typeof Class !== "function") {
|
|
92
|
+
throw new TypeError("Super expression must either be null or a function");
|
|
93
|
+
}
|
|
94
|
+
if (typeof _cache !== "undefined") {
|
|
95
|
+
if (_cache.has(Class)) return _cache.get(Class);
|
|
96
|
+
_cache.set(Class, Wrapper);
|
|
97
|
+
}
|
|
98
|
+
function Wrapper() {
|
|
99
|
+
return _construct(Class, arguments, _get_prototype_of(this).constructor);
|
|
100
|
+
}
|
|
101
|
+
Wrapper.prototype = Object.create(Class.prototype, {
|
|
102
|
+
constructor: {
|
|
103
|
+
value: Wrapper,
|
|
104
|
+
enumerable: false,
|
|
105
|
+
writable: true,
|
|
106
|
+
configurable: true
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
return _set_prototype_of(Wrapper, Class);
|
|
110
|
+
};
|
|
111
|
+
return _wrap_native_super(Class);
|
|
112
|
+
}
|
|
113
|
+
function _is_native_reflect_construct() {
|
|
114
|
+
try {
|
|
115
|
+
var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
|
|
116
|
+
} catch (_) {}
|
|
117
|
+
return (_is_native_reflect_construct = function() {
|
|
118
|
+
return !!result;
|
|
119
|
+
})();
|
|
120
|
+
}
|
|
121
|
+
export var AIResponseParserError = /*#__PURE__*/ function(Error1) {
|
|
122
|
+
"use strict";
|
|
123
|
+
_inherits(AIResponseParserError, Error1);
|
|
124
|
+
function AIResponseParserError(message, cause, text) {
|
|
125
|
+
_class_call_check(this, AIResponseParserError);
|
|
126
|
+
var _this;
|
|
127
|
+
_this = _call_super(this, AIResponseParserError, [
|
|
128
|
+
message
|
|
129
|
+
]), _define_property(_this, "cause", void 0), _define_property(_this, "text", void 0), _this.cause = cause, _this.text = text;
|
|
130
|
+
_this.name = 'AIResponseParserError';
|
|
131
|
+
return _this;
|
|
132
|
+
}
|
|
133
|
+
return AIResponseParserError;
|
|
134
|
+
}(_wrap_native_super(Error));
|
|
135
|
+
|
|
136
|
+
//# sourceMappingURL=ai-response-parser-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/utils/ai-response-parser-error.ts"],"sourcesContent":["/**\n * Custom error for AI response parsing failures\n */\nexport class AIResponseParserError extends Error {\n constructor(\n message: string,\n public readonly cause?: unknown,\n public readonly text?: string,\n ) {\n super(message);\n this.name = 'AIResponseParserError';\n }\n}\n"],"names":["AIResponseParserError","message","cause","text","name","Error"],"mappings":"AAAA;;CAEC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACD,OAAO,IAAA,AAAMA,sCAAN;;cAAMA;aAAAA,sBAELC,OAAe,EACf,AAAgBC,KAAe,EAC/B,AAAgBC,IAAa;gCAJxBH;;gBAML,kBANKA;YAMCC;qGAHUC,QAAAA,aACAC,OAAAA;QAGhB,MAAKC,IAAI,GAAG;;;WAPPJ;qBAA8BK,QAS1C"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
/**
|
|
3
|
+
* Parses AI response text into structured data based on Zod schema
|
|
4
|
+
*/
|
|
5
|
+
export declare class AIResponseParser<T> {
|
|
6
|
+
private readonly schema;
|
|
7
|
+
constructor(schema: z.ZodSchema<T>);
|
|
8
|
+
/**
|
|
9
|
+
* Parses the AI response text based on the configured schema
|
|
10
|
+
*/
|
|
11
|
+
parse(text: string): T;
|
|
12
|
+
/**
|
|
13
|
+
* Cleans text and finds the largest schema-compatible structure
|
|
14
|
+
*/
|
|
15
|
+
private cleanText;
|
|
16
|
+
/**
|
|
17
|
+
* Converts value to appropriate primitive type based on schema
|
|
18
|
+
*/
|
|
19
|
+
private convertToPrimitive;
|
|
20
|
+
/**
|
|
21
|
+
* Extracts array from text
|
|
22
|
+
*/
|
|
23
|
+
private extractArray;
|
|
24
|
+
/**
|
|
25
|
+
* Extracts and validates JSON content from a code block
|
|
26
|
+
*/
|
|
27
|
+
private extractJsonFromCodeBlock;
|
|
28
|
+
/**
|
|
29
|
+
* Extracts and parses JSON from text based on schema type
|
|
30
|
+
*/
|
|
31
|
+
private extractJsonFromText;
|
|
32
|
+
/**
|
|
33
|
+
* Extracts object from text
|
|
34
|
+
*/
|
|
35
|
+
private extractObject;
|
|
36
|
+
/**
|
|
37
|
+
* Extracts and converts primitive value from text
|
|
38
|
+
*/
|
|
39
|
+
private extractPrimitive;
|
|
40
|
+
/**
|
|
41
|
+
* Finds valid JSON structures in raw text
|
|
42
|
+
*/
|
|
43
|
+
private findJsonStructures;
|
|
44
|
+
/**
|
|
45
|
+
* Returns the largest string from an array of strings
|
|
46
|
+
*/
|
|
47
|
+
private findLargestString;
|
|
48
|
+
/**
|
|
49
|
+
* Recursively unescapes all string values in a JSON object/array
|
|
50
|
+
*/
|
|
51
|
+
private unescapeJsonValues;
|
|
52
|
+
/**
|
|
53
|
+
* Unescapes common escaped characters in text
|
|
54
|
+
*/
|
|
55
|
+
private unescapeText;
|
|
56
|
+
}
|