illuma-agents 1.0.36 → 1.0.38
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/dist/cjs/agents/AgentContext.cjs +69 -14
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +3 -1
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +50 -8
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +277 -11
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +128 -61
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +16 -7
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +1 -0
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +1 -1
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/tools.cjs +2 -2
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/stream.cjs +4 -2
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/BrowserTools.cjs +27 -3
- package/dist/cjs/tools/BrowserTools.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +22 -21
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +14 -11
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +101 -2
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +862 -0
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -0
- package/dist/esm/agents/AgentContext.mjs +69 -14
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +3 -1
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +51 -9
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +278 -12
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +127 -60
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/main.mjs +1 -1
- package/dist/esm/messages/cache.mjs +1 -0
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +1 -1
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/tools.mjs +2 -2
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/stream.mjs +4 -2
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/BrowserTools.mjs +27 -3
- package/dist/esm/tools/BrowserTools.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +22 -21
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +14 -11
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +102 -3
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +827 -0
- package/dist/esm/tools/ToolSearch.mjs.map +1 -0
- package/dist/types/agents/AgentContext.d.ts +33 -1
- package/dist/types/common/enum.d.ts +4 -2
- package/dist/types/graphs/Graph.d.ts +6 -0
- package/dist/types/graphs/MultiAgentGraph.d.ts +16 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/llm/bedrock/index.d.ts +89 -11
- package/dist/types/llm/bedrock/types.d.ts +27 -0
- package/dist/types/llm/bedrock/utils/index.d.ts +5 -0
- package/dist/types/llm/bedrock/utils/message_inputs.d.ts +31 -0
- package/dist/types/llm/bedrock/utils/message_outputs.d.ts +33 -0
- package/dist/types/tools/BrowserTools.d.ts +2 -0
- package/dist/types/tools/CodeExecutor.d.ts +0 -3
- package/dist/types/tools/ProgrammaticToolCalling.d.ts +0 -3
- package/dist/types/tools/ToolNode.d.ts +3 -1
- package/dist/types/tools/ToolSearch.d.ts +148 -0
- package/dist/types/types/graph.d.ts +2 -0
- package/dist/types/types/llm.d.ts +3 -1
- package/dist/types/types/tools.d.ts +42 -2
- package/package.json +12 -5
- package/src/agents/AgentContext.ts +88 -16
- package/src/common/enum.ts +3 -1
- package/src/graphs/Graph.ts +64 -13
- package/src/graphs/MultiAgentGraph.ts +350 -13
- package/src/index.ts +1 -1
- package/src/llm/bedrock/index.ts +221 -99
- package/src/llm/bedrock/llm.spec.ts +616 -0
- package/src/llm/bedrock/types.ts +51 -0
- package/src/llm/bedrock/utils/index.ts +18 -0
- package/src/llm/bedrock/utils/message_inputs.ts +563 -0
- package/src/llm/bedrock/utils/message_outputs.ts +310 -0
- package/src/messages/__tests__/tools.test.ts +21 -21
- package/src/messages/cache.test.ts +259 -0
- package/src/messages/cache.ts +104 -1
- package/src/messages/core.ts +1 -1
- package/src/messages/tools.ts +2 -2
- package/src/scripts/caching.ts +27 -19
- package/src/scripts/code_exec_files.ts +58 -15
- package/src/scripts/code_exec_multi_session.ts +241 -0
- package/src/scripts/code_exec_session.ts +282 -0
- package/src/scripts/multi-agent-conditional.ts +1 -0
- package/src/scripts/multi-agent-supervisor.ts +1 -0
- package/src/scripts/programmatic_exec_agent.ts +4 -4
- package/src/scripts/test-handoff-preamble.ts +277 -0
- package/src/scripts/test-parallel-handoffs.ts +291 -0
- package/src/scripts/test-tools-before-handoff.ts +8 -4
- package/src/scripts/test_code_api.ts +361 -0
- package/src/scripts/thinking-bedrock.ts +159 -0
- package/src/scripts/thinking.ts +39 -18
- package/src/scripts/{tool_search_regex.ts → tool_search.ts} +5 -5
- package/src/scripts/tools.ts +7 -3
- package/src/stream.ts +4 -2
- package/src/tools/BrowserTools.ts +68 -14
- package/src/tools/CodeExecutor.ts +26 -23
- package/src/tools/ProgrammaticToolCalling.ts +18 -14
- package/src/tools/ToolNode.ts +114 -1
- package/src/tools/ToolSearch.ts +1041 -0
- package/src/tools/__tests__/ProgrammaticToolCalling.test.ts +0 -2
- package/src/tools/__tests__/{ToolSearchRegex.integration.test.ts → ToolSearch.integration.test.ts} +6 -6
- package/src/tools/__tests__/ToolSearch.test.ts +1003 -0
- package/src/types/graph.ts +2 -0
- package/src/types/llm.ts +3 -1
- package/src/types/tools.ts +51 -2
- package/dist/cjs/tools/ToolSearchRegex.cjs +0 -455
- package/dist/cjs/tools/ToolSearchRegex.cjs.map +0 -1
- package/dist/esm/tools/ToolSearchRegex.mjs +0 -448
- package/dist/esm/tools/ToolSearchRegex.mjs.map +0 -1
- package/dist/types/tools/ToolSearchRegex.d.ts +0 -80
- package/src/tools/ToolSearchRegex.ts +0 -535
- package/src/tools/__tests__/ToolSearchRegex.test.ts +0 -232
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
// src/tools/__tests__/ToolSearchRegex.test.ts
|
|
2
|
-
/**
|
|
3
|
-
* Unit tests for Tool Search Regex.
|
|
4
|
-
* Tests helper functions and sanitization logic without hitting the API.
|
|
5
|
-
*/
|
|
6
|
-
import { describe, it, expect } from '@jest/globals';
|
|
7
|
-
import {
|
|
8
|
-
sanitizeRegex,
|
|
9
|
-
escapeRegexSpecialChars,
|
|
10
|
-
isDangerousPattern,
|
|
11
|
-
countNestedGroups,
|
|
12
|
-
hasNestedQuantifiers,
|
|
13
|
-
} from '../ToolSearchRegex';
|
|
14
|
-
|
|
15
|
-
describe('ToolSearchRegex', () => {
|
|
16
|
-
describe('escapeRegexSpecialChars', () => {
|
|
17
|
-
it('escapes special regex characters', () => {
|
|
18
|
-
expect(escapeRegexSpecialChars('hello.world')).toBe('hello\\.world');
|
|
19
|
-
expect(escapeRegexSpecialChars('test*pattern')).toBe('test\\*pattern');
|
|
20
|
-
expect(escapeRegexSpecialChars('query+result')).toBe('query\\+result');
|
|
21
|
-
expect(escapeRegexSpecialChars('a?b')).toBe('a\\?b');
|
|
22
|
-
expect(escapeRegexSpecialChars('(group)')).toBe('\\(group\\)');
|
|
23
|
-
expect(escapeRegexSpecialChars('[abc]')).toBe('\\[abc\\]');
|
|
24
|
-
expect(escapeRegexSpecialChars('a|b')).toBe('a\\|b');
|
|
25
|
-
expect(escapeRegexSpecialChars('a^b$c')).toBe('a\\^b\\$c');
|
|
26
|
-
expect(escapeRegexSpecialChars('a{2,3}')).toBe('a\\{2,3\\}');
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('handles empty string', () => {
|
|
30
|
-
expect(escapeRegexSpecialChars('')).toBe('');
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('handles string with no special chars', () => {
|
|
34
|
-
expect(escapeRegexSpecialChars('hello_world')).toBe('hello_world');
|
|
35
|
-
expect(escapeRegexSpecialChars('test123')).toBe('test123');
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('handles multiple consecutive special chars', () => {
|
|
39
|
-
expect(escapeRegexSpecialChars('...')).toBe('\\.\\.\\.');
|
|
40
|
-
expect(escapeRegexSpecialChars('***')).toBe('\\*\\*\\*');
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
describe('countNestedGroups', () => {
|
|
45
|
-
it('counts simple nesting', () => {
|
|
46
|
-
expect(countNestedGroups('(a)')).toBe(1);
|
|
47
|
-
expect(countNestedGroups('((a))')).toBe(2);
|
|
48
|
-
expect(countNestedGroups('(((a)))')).toBe(3);
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
it('counts maximum depth with multiple groups', () => {
|
|
52
|
-
expect(countNestedGroups('(a)(b)(c)')).toBe(1);
|
|
53
|
-
expect(countNestedGroups('(a(b)c)')).toBe(2);
|
|
54
|
-
expect(countNestedGroups('(a(b(c)))')).toBe(3);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
it('handles mixed nesting levels', () => {
|
|
58
|
-
expect(countNestedGroups('(a)((b)(c))')).toBe(2);
|
|
59
|
-
expect(countNestedGroups('((a)(b))((c))')).toBe(2);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it('ignores escaped parentheses', () => {
|
|
63
|
-
expect(countNestedGroups('\\(not a group\\)')).toBe(0);
|
|
64
|
-
expect(countNestedGroups('(a\\(b\\)c)')).toBe(1);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('handles no groups', () => {
|
|
68
|
-
expect(countNestedGroups('abc')).toBe(0);
|
|
69
|
-
expect(countNestedGroups('test.*pattern')).toBe(0);
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('handles unbalanced groups', () => {
|
|
73
|
-
expect(countNestedGroups('((a)')).toBe(2);
|
|
74
|
-
expect(countNestedGroups('(a))')).toBe(1);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
describe('hasNestedQuantifiers', () => {
|
|
79
|
-
it('detects nested quantifiers', () => {
|
|
80
|
-
expect(hasNestedQuantifiers('(a+)+')).toBe(true);
|
|
81
|
-
expect(hasNestedQuantifiers('(a*)*')).toBe(true);
|
|
82
|
-
expect(hasNestedQuantifiers('(a+)*')).toBe(true);
|
|
83
|
-
expect(hasNestedQuantifiers('(a*)?')).toBe(true);
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('allows safe quantifiers', () => {
|
|
87
|
-
expect(hasNestedQuantifiers('a+')).toBe(false);
|
|
88
|
-
expect(hasNestedQuantifiers('(abc)+')).toBe(false);
|
|
89
|
-
expect(hasNestedQuantifiers('a+b*c?')).toBe(false);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
it('handles complex patterns', () => {
|
|
93
|
-
expect(hasNestedQuantifiers('(a|b)+')).toBe(false);
|
|
94
|
-
// Note: This pattern might not be detected by the simple regex check
|
|
95
|
-
const complexPattern = '((a|b)+)+';
|
|
96
|
-
const result = hasNestedQuantifiers(complexPattern);
|
|
97
|
-
// Just verify it doesn't crash - detection may vary
|
|
98
|
-
expect(typeof result).toBe('boolean');
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
describe('isDangerousPattern', () => {
|
|
103
|
-
it('detects nested quantifiers', () => {
|
|
104
|
-
expect(isDangerousPattern('(a+)+')).toBe(true);
|
|
105
|
-
expect(isDangerousPattern('(a*)*')).toBe(true);
|
|
106
|
-
expect(isDangerousPattern('(.+)+')).toBe(true);
|
|
107
|
-
expect(isDangerousPattern('(.*)*')).toBe(true);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
it('detects excessive nesting', () => {
|
|
111
|
-
expect(isDangerousPattern('((((((a))))))')).toBe(true); // Depth > 5
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('detects excessive wildcards', () => {
|
|
115
|
-
const pattern = '.{1000,}';
|
|
116
|
-
expect(isDangerousPattern(pattern)).toBe(true);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
it('allows safe patterns', () => {
|
|
120
|
-
expect(isDangerousPattern('weather')).toBe(false);
|
|
121
|
-
expect(isDangerousPattern('get_.*_data')).toBe(false);
|
|
122
|
-
expect(isDangerousPattern('(a|b|c)')).toBe(false);
|
|
123
|
-
expect(isDangerousPattern('test\\d+')).toBe(false);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('detects various dangerous patterns', () => {
|
|
127
|
-
expect(isDangerousPattern('(.*)+')).toBe(true);
|
|
128
|
-
expect(isDangerousPattern('(.+)*')).toBe(true);
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
describe('sanitizeRegex', () => {
|
|
133
|
-
it('returns safe pattern unchanged', () => {
|
|
134
|
-
const result = sanitizeRegex('weather');
|
|
135
|
-
expect(result.safe).toBe('weather');
|
|
136
|
-
expect(result.wasEscaped).toBe(false);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('escapes dangerous patterns', () => {
|
|
140
|
-
const result = sanitizeRegex('(a+)+');
|
|
141
|
-
expect(result.safe).toBe('\\(a\\+\\)\\+');
|
|
142
|
-
expect(result.wasEscaped).toBe(true);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
it('escapes invalid regex', () => {
|
|
146
|
-
const result = sanitizeRegex('(unclosed');
|
|
147
|
-
expect(result.wasEscaped).toBe(true);
|
|
148
|
-
expect(result.safe).toContain('\\(');
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it('allows complex but safe patterns', () => {
|
|
152
|
-
const result = sanitizeRegex('get_[a-z]+_data');
|
|
153
|
-
expect(result.safe).toBe('get_[a-z]+_data');
|
|
154
|
-
expect(result.wasEscaped).toBe(false);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
it('handles alternation patterns', () => {
|
|
158
|
-
const result = sanitizeRegex('weather|forecast');
|
|
159
|
-
expect(result.safe).toBe('weather|forecast');
|
|
160
|
-
expect(result.wasEscaped).toBe(false);
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
describe('Pattern Validation Edge Cases', () => {
|
|
165
|
-
it('handles empty pattern', () => {
|
|
166
|
-
expect(countNestedGroups('')).toBe(0);
|
|
167
|
-
expect(hasNestedQuantifiers('')).toBe(false);
|
|
168
|
-
expect(isDangerousPattern('')).toBe(false);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it('handles pattern with only quantifiers', () => {
|
|
172
|
-
expect(hasNestedQuantifiers('+++')).toBe(false);
|
|
173
|
-
expect(hasNestedQuantifiers('***')).toBe(false);
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
it('handles escaped special sequences', () => {
|
|
177
|
-
const result = sanitizeRegex('\\d+\\w*\\s?');
|
|
178
|
-
expect(result.wasEscaped).toBe(false);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it('sanitizes exponential backtracking patterns', () => {
|
|
182
|
-
// These can cause catastrophic backtracking
|
|
183
|
-
expect(isDangerousPattern('(a+)+')).toBe(true);
|
|
184
|
-
expect(isDangerousPattern('(a*)*')).toBe(true);
|
|
185
|
-
expect(isDangerousPattern('(.*)*')).toBe(true);
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
describe('Real-World Pattern Examples', () => {
|
|
190
|
-
it('handles common search patterns safely', () => {
|
|
191
|
-
const safePatterns = [
|
|
192
|
-
'expense',
|
|
193
|
-
'weather|forecast',
|
|
194
|
-
'data.*query',
|
|
195
|
-
'_tool$',
|
|
196
|
-
];
|
|
197
|
-
|
|
198
|
-
for (const pattern of safePatterns) {
|
|
199
|
-
const result = sanitizeRegex(pattern);
|
|
200
|
-
expect(result.wasEscaped).toBe(false);
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it('escapes clearly dangerous patterns', () => {
|
|
205
|
-
const dangerousPatterns = ['(a+)+', '(.*)+', '(.+)*'];
|
|
206
|
-
|
|
207
|
-
for (const pattern of dangerousPatterns) {
|
|
208
|
-
const result = sanitizeRegex(pattern);
|
|
209
|
-
expect(result.wasEscaped).toBe(true);
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
it('handles patterns that may or may not be escaped', () => {
|
|
214
|
-
// These patterns might be escaped depending on validation logic
|
|
215
|
-
const edgeCasePatterns = [
|
|
216
|
-
'(?i)email',
|
|
217
|
-
'^create_',
|
|
218
|
-
'get_[a-z]+_info',
|
|
219
|
-
'get_.*',
|
|
220
|
-
'((((((a))))))',
|
|
221
|
-
'(a|a)*',
|
|
222
|
-
];
|
|
223
|
-
|
|
224
|
-
for (const pattern of edgeCasePatterns) {
|
|
225
|
-
const result = sanitizeRegex(pattern);
|
|
226
|
-
// Just verify it returns a result without crashing
|
|
227
|
-
expect(typeof result.safe).toBe('string');
|
|
228
|
-
expect(typeof result.wasEscaped).toBe('boolean');
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
});
|