@polka-codes/core 0.10.13 → 0.10.17
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/Agent/backoff.d.ts +7 -0
- package/dist/Agent/backoff.js +21 -0
- package/dist/Agent/backoff.js.map +1 -0
- package/dist/Agent/index.d.ts +2 -0
- package/dist/Agent/index.js +3 -0
- package/dist/Agent/index.js.map +1 -0
- package/dist/Agent/parseJsonFromMarkdown.d.ts +8 -0
- package/dist/Agent/parseJsonFromMarkdown.js +34 -0
- package/dist/Agent/parseJsonFromMarkdown.js.map +1 -0
- package/dist/Agent/parseJsonFromMarkdown.test.d.ts +1 -0
- package/dist/Agent/parseJsonFromMarkdown.test.js +70 -0
- package/dist/Agent/parseJsonFromMarkdown.test.js.map +1 -0
- package/dist/Agent/prompts.d.ts +9 -0
- package/dist/Agent/prompts.js +107 -0
- package/dist/Agent/prompts.js.map +1 -0
- package/dist/UsageMeter.d.ts +101 -0
- package/dist/UsageMeter.js +299 -0
- package/dist/UsageMeter.js.map +1 -0
- package/dist/UsageMeter.test.d.ts +4 -0
- package/dist/UsageMeter.test.js +556 -0
- package/dist/UsageMeter.test.js.map +1 -0
- package/dist/config/base.d.ts +68 -0
- package/dist/config/base.js +56 -0
- package/dist/config/base.js.map +1 -0
- package/dist/config/memory.d.ts +24 -0
- package/dist/config/memory.js +36 -0
- package/dist/config/memory.js.map +1 -0
- package/dist/config.d.ts +236 -0
- package/dist/config.js +184 -0
- package/dist/config.js.map +1 -0
- package/dist/errors/base.d.ts +31 -0
- package/dist/errors/base.js +60 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/fs/index.d.ts +2 -0
- package/dist/fs/index.js +3 -0
- package/dist/fs/index.js.map +1 -0
- package/dist/fs/node-provider.d.ts +16 -0
- package/dist/fs/node-provider.js +47 -0
- package/dist/fs/node-provider.js.map +1 -0
- package/dist/fs/provider.d.ts +61 -0
- package/dist/fs/provider.js +3 -0
- package/dist/fs/provider.js.map +1 -0
- package/dist/index.d.ts +20 -191
- package/dist/index.js +21 -4123
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/types.d.ts +136 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/path.d.ts +9 -0
- package/dist/path.js +68 -0
- package/dist/path.js.map +1 -0
- package/dist/path.test.d.ts +1 -0
- package/dist/path.test.js +82 -0
- package/dist/path.test.js.map +1 -0
- package/dist/pricing/converter.d.ts +6 -0
- package/dist/pricing/converter.js +13 -0
- package/dist/pricing/converter.js.map +1 -0
- package/dist/pricing/converter.test.d.ts +1 -0
- package/dist/pricing/converter.test.js +54 -0
- package/dist/pricing/converter.test.js.map +1 -0
- package/dist/pricing/index.d.ts +2 -0
- package/dist/pricing/index.js +2 -0
- package/dist/pricing/index.js.map +1 -0
- package/dist/pricing/portkey-client.d.ts +2 -0
- package/dist/pricing/portkey-client.js +57 -0
- package/dist/pricing/portkey-client.js.map +1 -0
- package/dist/pricing/pricing-service.d.ts +6 -0
- package/dist/pricing/pricing-service.js +125 -0
- package/dist/pricing/pricing-service.js.map +1 -0
- package/dist/pricing/pricing-service.test.d.ts +1 -0
- package/dist/pricing/pricing-service.test.js +141 -0
- package/dist/pricing/pricing-service.test.js.map +1 -0
- package/dist/pricing/types.d.ts +24 -0
- package/dist/pricing/types.js +2 -0
- package/dist/pricing/types.js.map +1 -0
- package/dist/skills/__tests__/discovery.test.d.ts +1 -0
- package/dist/skills/__tests__/discovery.test.js +254 -0
- package/dist/skills/__tests__/discovery.test.js.map +1 -0
- package/dist/skills/__tests__/validation.test.d.ts +1 -0
- package/dist/skills/__tests__/validation.test.js +221 -0
- package/dist/skills/__tests__/validation.test.js.map +1 -0
- package/dist/skills/constants.d.ts +32 -0
- package/dist/skills/constants.js +50 -0
- package/dist/skills/constants.js.map +1 -0
- package/dist/skills/discovery.d.ts +56 -0
- package/dist/skills/discovery.js +392 -0
- package/dist/skills/discovery.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.js +6 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/tools/index.d.ts +3 -0
- package/dist/skills/tools/index.js +5 -0
- package/dist/skills/tools/index.js.map +1 -0
- package/dist/skills/tools/listSkills.d.ts +54 -0
- package/dist/skills/tools/listSkills.js +52 -0
- package/dist/skills/tools/listSkills.js.map +1 -0
- package/dist/skills/tools/loadSkill.d.ts +52 -0
- package/dist/skills/tools/loadSkill.js +86 -0
- package/dist/skills/tools/loadSkill.js.map +1 -0
- package/dist/skills/tools/readSkillFile.d.ts +43 -0
- package/dist/skills/tools/readSkillFile.js +68 -0
- package/dist/skills/tools/readSkillFile.js.map +1 -0
- package/dist/skills/types.d.ts +83 -0
- package/dist/skills/types.js +42 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/skills/validation.d.ts +30 -0
- package/dist/skills/validation.js +133 -0
- package/dist/skills/validation.js.map +1 -0
- package/dist/tool.d.ts +51 -0
- package/dist/tool.js +2 -0
- package/dist/tool.js.map +1 -0
- package/dist/tools/askFollowupQuestion.d.ts +35 -0
- package/dist/tools/askFollowupQuestion.js +105 -0
- package/dist/tools/askFollowupQuestion.js.map +1 -0
- package/dist/tools/askFollowupQuestion.test.d.ts +1 -0
- package/dist/tools/askFollowupQuestion.test.js +80 -0
- package/dist/tools/askFollowupQuestion.test.js.map +1 -0
- package/dist/tools/executeCommand.d.ts +29 -0
- package/dist/tools/executeCommand.js +82 -0
- package/dist/tools/executeCommand.js.map +1 -0
- package/dist/tools/executeCommand.test.d.ts +1 -0
- package/dist/tools/executeCommand.test.js +60 -0
- package/dist/tools/executeCommand.test.js.map +1 -0
- package/dist/tools/fetchUrl.d.ts +26 -0
- package/dist/tools/fetchUrl.js +85 -0
- package/dist/tools/fetchUrl.js.map +1 -0
- package/dist/tools/index.d.ts +15 -0
- package/dist/tools/index.js +17 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listFiles.d.ts +35 -0
- package/dist/tools/listFiles.js +61 -0
- package/dist/tools/listFiles.js.map +1 -0
- package/dist/tools/listFiles.test.d.ts +1 -0
- package/dist/tools/listFiles.test.js +59 -0
- package/dist/tools/listFiles.test.js.map +1 -0
- package/dist/tools/provider.d.ts +76 -0
- package/dist/tools/provider.js +60 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/tools/readBinaryFile.d.ts +26 -0
- package/dist/tools/readBinaryFile.js +52 -0
- package/dist/tools/readBinaryFile.js.map +1 -0
- package/dist/tools/readFile.d.ts +35 -0
- package/dist/tools/readFile.js +128 -0
- package/dist/tools/readFile.js.map +1 -0
- package/dist/tools/readFile.test.d.ts +1 -0
- package/dist/tools/readFile.test.js +37 -0
- package/dist/tools/readFile.test.js.map +1 -0
- package/dist/tools/removeFile.d.ts +26 -0
- package/dist/tools/removeFile.js +49 -0
- package/dist/tools/removeFile.js.map +1 -0
- package/dist/tools/removeFile.test.d.ts +1 -0
- package/dist/tools/removeFile.test.js +32 -0
- package/dist/tools/removeFile.test.js.map +1 -0
- package/dist/tools/renameFile.d.ts +29 -0
- package/dist/tools/renameFile.js +48 -0
- package/dist/tools/renameFile.js.map +1 -0
- package/dist/tools/renameFile.test.d.ts +1 -0
- package/dist/tools/renameFile.test.js +53 -0
- package/dist/tools/renameFile.test.js.map +1 -0
- package/dist/tools/replaceInFile.d.ts +29 -0
- package/dist/tools/replaceInFile.js +233 -0
- package/dist/tools/replaceInFile.js.map +1 -0
- package/dist/tools/replaceInFile.test.d.ts +1 -0
- package/dist/tools/replaceInFile.test.js +79 -0
- package/dist/tools/replaceInFile.test.js.map +1 -0
- package/dist/tools/response-builders.d.ts +64 -0
- package/dist/tools/response-builders.js +88 -0
- package/dist/tools/response-builders.js.map +1 -0
- package/dist/tools/search.d.ts +26 -0
- package/dist/tools/search.js +56 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/search.test.d.ts +1 -0
- package/dist/tools/search.test.js +22 -0
- package/dist/tools/search.test.js.map +1 -0
- package/dist/tools/searchFiles.d.ts +32 -0
- package/dist/tools/searchFiles.js +86 -0
- package/dist/tools/searchFiles.js.map +1 -0
- package/dist/tools/todo.d.ts +37 -0
- package/dist/tools/todo.js +41 -0
- package/dist/tools/todo.js.map +1 -0
- package/dist/tools/utils/index.d.ts +1 -0
- package/dist/tools/utils/index.js +2 -0
- package/dist/tools/utils/index.js.map +1 -0
- package/dist/tools/utils/replaceInFile.d.ts +7 -0
- package/dist/tools/utils/replaceInFile.js +133 -0
- package/dist/tools/utils/replaceInFile.js.map +1 -0
- package/dist/tools/utils/replaceInFile.test.d.ts +1 -0
- package/dist/tools/utils/replaceInFile.test.js +308 -0
- package/dist/tools/utils/replaceInFile.test.js.map +1 -0
- package/dist/tools/utils.d.ts +10 -0
- package/dist/tools/utils.js +27 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/writeToFile.d.ts +29 -0
- package/dist/tools/writeToFile.js +85 -0
- package/dist/tools/writeToFile.js.map +1 -0
- package/dist/tools/writeToFile.test.d.ts +1 -0
- package/dist/tools/writeToFile.test.js +46 -0
- package/dist/tools/writeToFile.test.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge.d.ts +26 -0
- package/dist/utils/merge.js +45 -0
- package/dist/utils/merge.js.map +1 -0
- package/dist/workflow/agent.workflow.d.ts +39 -0
- package/dist/workflow/agent.workflow.js +166 -0
- package/dist/workflow/agent.workflow.js.map +1 -0
- package/dist/workflow/agent.workflow.test.d.ts +1 -0
- package/dist/workflow/agent.workflow.test.js +175 -0
- package/dist/workflow/agent.workflow.test.js.map +1 -0
- package/dist/workflow/control-flow.test.d.ts +1 -0
- package/dist/workflow/control-flow.test.js +323 -0
- package/dist/workflow/control-flow.test.js.map +1 -0
- package/dist/workflow/dynamic-edge-cases.test.d.ts +1 -0
- package/dist/workflow/dynamic-edge-cases.test.js +486 -0
- package/dist/workflow/dynamic-edge-cases.test.js.map +1 -0
- package/dist/workflow/dynamic-types.d.ts +124 -0
- package/dist/workflow/dynamic-types.js +105 -0
- package/dist/workflow/dynamic-types.js.map +1 -0
- package/dist/workflow/dynamic.d.ts +118 -0
- package/dist/workflow/dynamic.js +999 -0
- package/dist/workflow/dynamic.js.map +1 -0
- package/dist/workflow/index.d.ts +6 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/json-ai-types.d.ts +122 -0
- package/dist/workflow/json-ai-types.js +144 -0
- package/dist/workflow/json-ai-types.js.map +1 -0
- package/dist/workflow/json-schema-conversion.test.d.ts +1 -0
- package/dist/workflow/json-schema-conversion.test.js +371 -0
- package/dist/workflow/json-schema-conversion.test.js.map +1 -0
- package/dist/workflow/try-catch.test.d.ts +1 -0
- package/dist/workflow/try-catch.test.js +443 -0
- package/dist/workflow/try-catch.test.js.map +1 -0
- package/dist/workflow/types.d.ts +103 -0
- package/dist/workflow/types.js +17 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflow/workflow.d.ts +29 -0
- package/dist/workflow/workflow.js +57 -0
- package/dist/workflow/workflow.js.map +1 -0
- package/dist/workflow/workflow.test.d.ts +1 -0
- package/dist/workflow/workflow.test.js +189 -0
- package/dist/workflow/workflow.test.js.map +1 -0
- package/package.json +9 -1
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
import { describe, expect, it } from 'bun:test';
|
|
2
|
+
import { createDynamicWorkflow, parseDynamicWorkflowDefinition, validateWorkflowFile } from './dynamic';
|
|
3
|
+
function asValidationFailure(result) {
|
|
4
|
+
if (result.success) {
|
|
5
|
+
throw new Error('Expected validation failure but got success');
|
|
6
|
+
}
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
function asParseFailure(result) {
|
|
10
|
+
if (result.success) {
|
|
11
|
+
throw new Error('Expected parse failure but got success');
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
describe('Dynamic Workflow Edge Cases', () => {
|
|
16
|
+
const mockToolInfo = [
|
|
17
|
+
{
|
|
18
|
+
name: 'testTool',
|
|
19
|
+
description: 'A test tool',
|
|
20
|
+
parameters: { type: 'object' },
|
|
21
|
+
handler: async () => ({ success: true, message: { type: 'text', value: 'Test result' } }),
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
describe('validation edge cases', () => {
|
|
25
|
+
it('should reject workflow with no steps', () => {
|
|
26
|
+
const workflowDef = {
|
|
27
|
+
workflows: {
|
|
28
|
+
empty: {
|
|
29
|
+
task: 'Empty workflow',
|
|
30
|
+
steps: [],
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
const result = validateWorkflowFile(workflowDef);
|
|
35
|
+
const failure = asValidationFailure(result);
|
|
36
|
+
expect(failure.errors).toContain("Workflow 'empty' has no steps");
|
|
37
|
+
});
|
|
38
|
+
it('should reject break statement outside loop', () => {
|
|
39
|
+
const workflowDef = {
|
|
40
|
+
workflows: {
|
|
41
|
+
invalidBreak: {
|
|
42
|
+
task: 'Invalid break',
|
|
43
|
+
steps: [
|
|
44
|
+
{
|
|
45
|
+
id: 'invalidStep',
|
|
46
|
+
break: true,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
const result = validateWorkflowFile(workflowDef);
|
|
53
|
+
const failure = asValidationFailure(result);
|
|
54
|
+
expect(failure.errors[0]).toContain('break/continue outside of a loop');
|
|
55
|
+
});
|
|
56
|
+
it('should reject continue statement outside loop', () => {
|
|
57
|
+
const workflowDef = {
|
|
58
|
+
workflows: {
|
|
59
|
+
invalidContinue: {
|
|
60
|
+
task: 'Invalid continue',
|
|
61
|
+
steps: [
|
|
62
|
+
{
|
|
63
|
+
id: 'invalidStep',
|
|
64
|
+
continue: true,
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
const result = validateWorkflowFile(workflowDef);
|
|
71
|
+
const failure = asValidationFailure(result);
|
|
72
|
+
expect(failure.errors[0]).toContain('break/continue outside of a loop');
|
|
73
|
+
});
|
|
74
|
+
it('should accept break inside while loop', () => {
|
|
75
|
+
const workflowDef = {
|
|
76
|
+
workflows: {
|
|
77
|
+
validBreak: {
|
|
78
|
+
task: 'Valid break',
|
|
79
|
+
steps: [
|
|
80
|
+
{
|
|
81
|
+
id: 'loopWithBreak',
|
|
82
|
+
while: {
|
|
83
|
+
condition: 'true',
|
|
84
|
+
steps: [{ break: true }],
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
const result = validateWorkflowFile(workflowDef);
|
|
92
|
+
expect(result.success).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it('should accept continue inside while loop', () => {
|
|
95
|
+
const workflowDef = {
|
|
96
|
+
workflows: {
|
|
97
|
+
validContinue: {
|
|
98
|
+
task: 'Valid continue',
|
|
99
|
+
steps: [
|
|
100
|
+
{
|
|
101
|
+
id: 'loopWithContinue',
|
|
102
|
+
while: {
|
|
103
|
+
condition: 'true',
|
|
104
|
+
steps: [{ continue: true }],
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
const result = validateWorkflowFile(workflowDef);
|
|
112
|
+
expect(result.success).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
it('should reject break inside if/else branch (not in loop)', () => {
|
|
115
|
+
const workflowDef = {
|
|
116
|
+
workflows: {
|
|
117
|
+
breakInIf: {
|
|
118
|
+
task: 'Break in if',
|
|
119
|
+
steps: [
|
|
120
|
+
{
|
|
121
|
+
id: 'check',
|
|
122
|
+
if: {
|
|
123
|
+
condition: 'true',
|
|
124
|
+
thenBranch: [{ break: true }],
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
const result = validateWorkflowFile(workflowDef);
|
|
132
|
+
const failure = asValidationFailure(result);
|
|
133
|
+
expect(failure.errors[0]).toContain('break/continue outside of a loop');
|
|
134
|
+
});
|
|
135
|
+
it('should accept break inside if/else inside while loop', () => {
|
|
136
|
+
const workflowDef = {
|
|
137
|
+
workflows: {
|
|
138
|
+
breakInIfInLoop: {
|
|
139
|
+
task: 'Valid break in if in loop',
|
|
140
|
+
steps: [
|
|
141
|
+
{
|
|
142
|
+
id: 'loop',
|
|
143
|
+
while: {
|
|
144
|
+
condition: 'true',
|
|
145
|
+
steps: [
|
|
146
|
+
{
|
|
147
|
+
id: 'check',
|
|
148
|
+
if: {
|
|
149
|
+
condition: 'true',
|
|
150
|
+
thenBranch: [{ break: true }],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
const result = validateWorkflowFile(workflowDef);
|
|
161
|
+
expect(result.success).toBe(true);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('parse errors', () => {
|
|
165
|
+
it('should reject invalid YAML syntax', () => {
|
|
166
|
+
const invalidYaml = `
|
|
167
|
+
workflows:
|
|
168
|
+
test:
|
|
169
|
+
task: Test
|
|
170
|
+
steps: [
|
|
171
|
+
id: step1
|
|
172
|
+
invalid yaml here
|
|
173
|
+
`;
|
|
174
|
+
const result = parseDynamicWorkflowDefinition(invalidYaml);
|
|
175
|
+
const failure = asParseFailure(result);
|
|
176
|
+
expect(failure.error).toBeDefined();
|
|
177
|
+
});
|
|
178
|
+
it('should reject workflow with missing required fields', () => {
|
|
179
|
+
const invalidWorkflow = `
|
|
180
|
+
workflows:
|
|
181
|
+
test:
|
|
182
|
+
steps: []
|
|
183
|
+
`;
|
|
184
|
+
const result = parseDynamicWorkflowDefinition(invalidWorkflow);
|
|
185
|
+
const failure = asParseFailure(result);
|
|
186
|
+
expect(failure.error).toContain('task');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('condition evaluation edge cases', () => {
|
|
190
|
+
it('should handle undefined variables in conditions gracefully', () => {
|
|
191
|
+
const workflowDef = {
|
|
192
|
+
workflows: {
|
|
193
|
+
test: {
|
|
194
|
+
task: 'Test undefined variable',
|
|
195
|
+
steps: [
|
|
196
|
+
{
|
|
197
|
+
id: 'checkUndefined',
|
|
198
|
+
task: 'Check undefined',
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
output: 'result',
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
const workflow = createDynamicWorkflow(workflowDef, {
|
|
206
|
+
toolInfo: mockToolInfo,
|
|
207
|
+
});
|
|
208
|
+
// This should not throw during creation, but would throw during execution
|
|
209
|
+
expect(workflow).toBeDefined();
|
|
210
|
+
});
|
|
211
|
+
it('should handle complex boolean expressions', () => {
|
|
212
|
+
const workflowDef = {
|
|
213
|
+
workflows: {
|
|
214
|
+
test: {
|
|
215
|
+
task: 'Complex boolean',
|
|
216
|
+
steps: [
|
|
217
|
+
{
|
|
218
|
+
id: 'check',
|
|
219
|
+
if: {
|
|
220
|
+
condition: 'state.a && state.b || state.c',
|
|
221
|
+
thenBranch: [{ id: 'then', task: 'Then' }],
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
const workflow = createDynamicWorkflow(workflowDef, {
|
|
229
|
+
toolInfo: mockToolInfo,
|
|
230
|
+
});
|
|
231
|
+
expect(workflow).toBeDefined();
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe('input validation edge cases', () => {
|
|
235
|
+
it('should validate that required inputs without defaults are checked', () => {
|
|
236
|
+
const workflowDef = {
|
|
237
|
+
workflows: {
|
|
238
|
+
test: {
|
|
239
|
+
task: 'Test required input',
|
|
240
|
+
inputs: [
|
|
241
|
+
{
|
|
242
|
+
id: 'required',
|
|
243
|
+
description: 'Required input',
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
steps: [
|
|
247
|
+
{
|
|
248
|
+
id: 'step1',
|
|
249
|
+
task: 'Step 1',
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
},
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
// Workflow creation should succeed
|
|
256
|
+
const workflow = createDynamicWorkflow(workflowDef, {
|
|
257
|
+
toolInfo: mockToolInfo,
|
|
258
|
+
});
|
|
259
|
+
expect(workflow).toBeDefined();
|
|
260
|
+
});
|
|
261
|
+
it('should handle inputs with defaults', () => {
|
|
262
|
+
const workflowDef = {
|
|
263
|
+
workflows: {
|
|
264
|
+
test: {
|
|
265
|
+
task: 'Test default input',
|
|
266
|
+
inputs: [
|
|
267
|
+
{
|
|
268
|
+
id: 'value',
|
|
269
|
+
description: 'Value with default',
|
|
270
|
+
default: 42,
|
|
271
|
+
},
|
|
272
|
+
],
|
|
273
|
+
steps: [
|
|
274
|
+
{
|
|
275
|
+
id: 'step1',
|
|
276
|
+
task: 'Step 1',
|
|
277
|
+
},
|
|
278
|
+
],
|
|
279
|
+
output: 'value',
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
const workflow = createDynamicWorkflow(workflowDef, {
|
|
284
|
+
toolInfo: mockToolInfo,
|
|
285
|
+
});
|
|
286
|
+
expect(workflow).toBeDefined();
|
|
287
|
+
});
|
|
288
|
+
it('should handle multiple inputs with mixed defaults', () => {
|
|
289
|
+
const workflowDef = {
|
|
290
|
+
workflows: {
|
|
291
|
+
test: {
|
|
292
|
+
task: 'Test mixed inputs',
|
|
293
|
+
inputs: [
|
|
294
|
+
{
|
|
295
|
+
id: 'required1',
|
|
296
|
+
description: 'Required input 1',
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
id: 'optional1',
|
|
300
|
+
description: 'Optional input',
|
|
301
|
+
default: 'default-value',
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
id: 'required2',
|
|
305
|
+
description: 'Required input 2',
|
|
306
|
+
},
|
|
307
|
+
],
|
|
308
|
+
steps: [
|
|
309
|
+
{
|
|
310
|
+
id: 'step1',
|
|
311
|
+
task: 'Step 1',
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
const workflow = createDynamicWorkflow(workflowDef, {
|
|
318
|
+
toolInfo: mockToolInfo,
|
|
319
|
+
});
|
|
320
|
+
expect(workflow).toBeDefined();
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
describe('nested control flow edge cases', () => {
|
|
324
|
+
it('should handle deeply nested while loops', () => {
|
|
325
|
+
const workflowDef = {
|
|
326
|
+
workflows: {
|
|
327
|
+
test: {
|
|
328
|
+
task: 'Deeply nested loops',
|
|
329
|
+
steps: [
|
|
330
|
+
{
|
|
331
|
+
id: 'outer',
|
|
332
|
+
while: {
|
|
333
|
+
condition: 'state.i < 2',
|
|
334
|
+
steps: [
|
|
335
|
+
{
|
|
336
|
+
id: 'middle',
|
|
337
|
+
while: {
|
|
338
|
+
condition: 'state.j < 2',
|
|
339
|
+
steps: [
|
|
340
|
+
{
|
|
341
|
+
id: 'inner',
|
|
342
|
+
while: {
|
|
343
|
+
condition: 'state.k < 2',
|
|
344
|
+
steps: [{ id: 'work', task: 'Work' }],
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
],
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
},
|
|
352
|
+
},
|
|
353
|
+
],
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
};
|
|
357
|
+
const result = validateWorkflowFile(workflowDef);
|
|
358
|
+
expect(result.success).toBe(true);
|
|
359
|
+
});
|
|
360
|
+
it('should handle if/else with nested try/catch', () => {
|
|
361
|
+
const workflowDef = {
|
|
362
|
+
workflows: {
|
|
363
|
+
test: {
|
|
364
|
+
task: 'Nested try/catch in if',
|
|
365
|
+
steps: [
|
|
366
|
+
{
|
|
367
|
+
id: 'check',
|
|
368
|
+
if: {
|
|
369
|
+
condition: 'true',
|
|
370
|
+
thenBranch: [
|
|
371
|
+
{
|
|
372
|
+
id: 'tryBlock',
|
|
373
|
+
try: {
|
|
374
|
+
trySteps: [{ id: 'attempt', task: 'Try' }],
|
|
375
|
+
catchSteps: [{ id: 'recover', task: 'Catch' }],
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
],
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
],
|
|
382
|
+
},
|
|
383
|
+
},
|
|
384
|
+
};
|
|
385
|
+
const result = validateWorkflowFile(workflowDef);
|
|
386
|
+
expect(result.success).toBe(true);
|
|
387
|
+
});
|
|
388
|
+
});
|
|
389
|
+
describe('workflow not found errors', () => {
|
|
390
|
+
it('should throw error for non-existent workflow', async () => {
|
|
391
|
+
const workflowDef = {
|
|
392
|
+
workflows: {
|
|
393
|
+
existing: {
|
|
394
|
+
task: 'Existing workflow',
|
|
395
|
+
steps: [{ id: 'step1', task: 'Step 1' }],
|
|
396
|
+
},
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
const workflow = createDynamicWorkflow(workflowDef, {
|
|
400
|
+
toolInfo: mockToolInfo,
|
|
401
|
+
});
|
|
402
|
+
const mockStep = async (_name, optionsOrFn, fn) => {
|
|
403
|
+
const actualFn = fn || optionsOrFn;
|
|
404
|
+
if (typeof actualFn === 'function') {
|
|
405
|
+
return await actualFn();
|
|
406
|
+
}
|
|
407
|
+
throw new Error('Expected function');
|
|
408
|
+
};
|
|
409
|
+
const mockContext = {
|
|
410
|
+
tools: {},
|
|
411
|
+
logger: {
|
|
412
|
+
info: (_msg) => { },
|
|
413
|
+
debug: (_msg) => { },
|
|
414
|
+
warn: (_msg) => { },
|
|
415
|
+
error: (_msg) => { },
|
|
416
|
+
},
|
|
417
|
+
step: mockStep,
|
|
418
|
+
};
|
|
419
|
+
await expect(workflow('nonexistent', {}, mockContext)).rejects.toThrow("Workflow 'nonexistent' not found");
|
|
420
|
+
});
|
|
421
|
+
});
|
|
422
|
+
describe('state management edge cases', () => {
|
|
423
|
+
it('should handle state mutation in loops', () => {
|
|
424
|
+
const workflowDef = {
|
|
425
|
+
workflows: {
|
|
426
|
+
test: {
|
|
427
|
+
task: 'State mutation',
|
|
428
|
+
steps: [
|
|
429
|
+
{
|
|
430
|
+
id: 'loop',
|
|
431
|
+
while: {
|
|
432
|
+
condition: 'state.count < 3',
|
|
433
|
+
steps: [
|
|
434
|
+
{
|
|
435
|
+
id: 'increment',
|
|
436
|
+
task: 'Increment',
|
|
437
|
+
output: 'count',
|
|
438
|
+
},
|
|
439
|
+
],
|
|
440
|
+
},
|
|
441
|
+
},
|
|
442
|
+
],
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
};
|
|
446
|
+
const workflow = createDynamicWorkflow(workflowDef, {
|
|
447
|
+
toolInfo: mockToolInfo,
|
|
448
|
+
});
|
|
449
|
+
expect(workflow).toBeDefined();
|
|
450
|
+
});
|
|
451
|
+
it('should propagate state through nested structures', () => {
|
|
452
|
+
const workflowDef = {
|
|
453
|
+
workflows: {
|
|
454
|
+
test: {
|
|
455
|
+
task: 'State propagation',
|
|
456
|
+
steps: [
|
|
457
|
+
{
|
|
458
|
+
id: 'first',
|
|
459
|
+
task: 'First step',
|
|
460
|
+
output: 'value1',
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
id: 'conditional',
|
|
464
|
+
if: {
|
|
465
|
+
condition: 'true',
|
|
466
|
+
thenBranch: [
|
|
467
|
+
{
|
|
468
|
+
id: 'second',
|
|
469
|
+
task: 'Second step',
|
|
470
|
+
output: 'value2',
|
|
471
|
+
},
|
|
472
|
+
],
|
|
473
|
+
},
|
|
474
|
+
},
|
|
475
|
+
],
|
|
476
|
+
},
|
|
477
|
+
},
|
|
478
|
+
};
|
|
479
|
+
const workflow = createDynamicWorkflow(workflowDef, {
|
|
480
|
+
toolInfo: mockToolInfo,
|
|
481
|
+
});
|
|
482
|
+
expect(workflow).toBeDefined();
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
});
|
|
486
|
+
//# sourceMappingURL=dynamic-edge-cases.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-edge-cases.test.js","sourceRoot":"","sources":["../../src/workflow/dynamic-edge-cases.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export type ValidationResult = {
|
|
3
|
+
success: true;
|
|
4
|
+
} | {
|
|
5
|
+
success: false;
|
|
6
|
+
errors: string[];
|
|
7
|
+
};
|
|
8
|
+
export interface WhileLoopStep {
|
|
9
|
+
id: string;
|
|
10
|
+
while: {
|
|
11
|
+
condition: string;
|
|
12
|
+
steps: WorkflowControlFlowStep[];
|
|
13
|
+
};
|
|
14
|
+
output?: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface IfElseStep {
|
|
17
|
+
id: string;
|
|
18
|
+
if: {
|
|
19
|
+
condition: string;
|
|
20
|
+
thenBranch: WorkflowControlFlowStep[];
|
|
21
|
+
elseBranch?: WorkflowControlFlowStep[];
|
|
22
|
+
};
|
|
23
|
+
output?: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface BreakStep {
|
|
26
|
+
break: true;
|
|
27
|
+
}
|
|
28
|
+
export interface ContinueStep {
|
|
29
|
+
continue: true;
|
|
30
|
+
}
|
|
31
|
+
export interface TryCatchStep {
|
|
32
|
+
id: string;
|
|
33
|
+
try: {
|
|
34
|
+
trySteps: WorkflowControlFlowStep[];
|
|
35
|
+
catchSteps: WorkflowControlFlowStep[];
|
|
36
|
+
};
|
|
37
|
+
output?: string | null;
|
|
38
|
+
}
|
|
39
|
+
export type WorkflowControlFlowStep = z.infer<typeof WorkflowStepDefinitionSchema> | WhileLoopStep | IfElseStep | BreakStep | ContinueStep | TryCatchStep;
|
|
40
|
+
export declare const WorkflowInputDefinitionSchema: z.ZodObject<{
|
|
41
|
+
id: z.ZodString;
|
|
42
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
43
|
+
default: z.ZodOptional<z.ZodNullable<z.ZodUnknown>>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
/**
|
|
46
|
+
* Basic workflow step - executes a task
|
|
47
|
+
*/
|
|
48
|
+
export declare const WorkflowStepDefinitionSchema: z.ZodObject<{
|
|
49
|
+
id: z.ZodString;
|
|
50
|
+
tools: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
|
|
51
|
+
task: z.ZodString;
|
|
52
|
+
output: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
53
|
+
expected_outcome: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
54
|
+
outputSchema: z.ZodOptional<z.ZodNullable<z.ZodUnknown>>;
|
|
55
|
+
timeout: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
/**
|
|
58
|
+
* Control flow step types
|
|
59
|
+
*/
|
|
60
|
+
/**
|
|
61
|
+
* While loop - repeats steps while condition is true
|
|
62
|
+
*/
|
|
63
|
+
export declare const WhileLoopStepSchema: z.ZodType<WhileLoopStep>;
|
|
64
|
+
/**
|
|
65
|
+
* If/else branch - conditionally executes steps
|
|
66
|
+
*/
|
|
67
|
+
export declare const IfElseStepSchema: z.ZodType<IfElseStep>;
|
|
68
|
+
/**
|
|
69
|
+
* Break statement - exits the nearest enclosing loop
|
|
70
|
+
*/
|
|
71
|
+
export declare const BreakStepSchema: z.ZodObject<{
|
|
72
|
+
break: z.ZodLiteral<true>;
|
|
73
|
+
}, z.core.$strip>;
|
|
74
|
+
/**
|
|
75
|
+
* Continue statement - skips to next iteration of nearest enclosing loop
|
|
76
|
+
*/
|
|
77
|
+
export declare const ContinueStepSchema: z.ZodObject<{
|
|
78
|
+
continue: z.ZodLiteral<true>;
|
|
79
|
+
}, z.core.$strip>;
|
|
80
|
+
/**
|
|
81
|
+
* Try/catch block - error handling
|
|
82
|
+
*/
|
|
83
|
+
export declare const TryCatchStepSchema: z.ZodObject<{
|
|
84
|
+
id: z.ZodString;
|
|
85
|
+
try: z.ZodObject<{
|
|
86
|
+
trySteps: z.ZodArray<z.ZodLazy<z.ZodType<WorkflowControlFlowStep, unknown, z.core.$ZodTypeInternals<WorkflowControlFlowStep, unknown>>>>;
|
|
87
|
+
catchSteps: z.ZodArray<z.ZodLazy<z.ZodType<WorkflowControlFlowStep, unknown, z.core.$ZodTypeInternals<WorkflowControlFlowStep, unknown>>>>;
|
|
88
|
+
}, z.core.$strip>;
|
|
89
|
+
output: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
90
|
+
}, z.core.$strip>;
|
|
91
|
+
/**
|
|
92
|
+
* Any step that can appear in a workflow's steps array
|
|
93
|
+
* Can be a basic step, control flow, or jump statement
|
|
94
|
+
*/
|
|
95
|
+
export declare const WorkflowControlFlowStepSchema: z.ZodType<WorkflowControlFlowStep>;
|
|
96
|
+
/**
|
|
97
|
+
* Workflow definition - now supports control flow in steps
|
|
98
|
+
*/
|
|
99
|
+
export declare const WorkflowDefinitionSchema: z.ZodObject<{
|
|
100
|
+
task: z.ZodString;
|
|
101
|
+
inputs: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
|
|
102
|
+
id: z.ZodString;
|
|
103
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
104
|
+
default: z.ZodOptional<z.ZodNullable<z.ZodUnknown>>;
|
|
105
|
+
}, z.core.$strip>>>>;
|
|
106
|
+
steps: z.ZodArray<z.ZodType<WorkflowControlFlowStep, unknown, z.core.$ZodTypeInternals<WorkflowControlFlowStep, unknown>>>;
|
|
107
|
+
output: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
108
|
+
}, z.core.$strip>;
|
|
109
|
+
export declare const WorkflowFileSchema: z.ZodObject<{
|
|
110
|
+
workflows: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
111
|
+
task: z.ZodString;
|
|
112
|
+
inputs: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
|
|
113
|
+
id: z.ZodString;
|
|
114
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
115
|
+
default: z.ZodOptional<z.ZodNullable<z.ZodUnknown>>;
|
|
116
|
+
}, z.core.$strip>>>>;
|
|
117
|
+
steps: z.ZodArray<z.ZodType<WorkflowControlFlowStep, unknown, z.core.$ZodTypeInternals<WorkflowControlFlowStep, unknown>>>;
|
|
118
|
+
output: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
119
|
+
}, z.core.$strip>>;
|
|
120
|
+
}, z.core.$strip>;
|
|
121
|
+
export type WorkflowInputDefinition = z.infer<typeof WorkflowInputDefinitionSchema>;
|
|
122
|
+
export type WorkflowStepDefinition = z.infer<typeof WorkflowStepDefinitionSchema>;
|
|
123
|
+
export type WorkflowDefinition = z.infer<typeof WorkflowDefinitionSchema>;
|
|
124
|
+
export type WorkflowFile = z.infer<typeof WorkflowFileSchema>;
|