@eko-ai/eko 1.0.9 → 1.0.11
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 -21
- package/README.md +139 -139
- package/dist/core/eko.d.ts +3 -2
- package/dist/extension/script/bing.js +0 -0
- package/dist/extension/script/build_dom_tree.js +661 -661
- package/dist/extension/script/common.js +12 -4
- package/dist/extension/script/duckduckgo.js +0 -0
- package/dist/extension/script/google.js +0 -0
- package/dist/extension/tools/cancel_workflow.d.ts +9 -0
- package/dist/extension/utils.d.ts +1 -1
- package/dist/extension.cjs.js +117 -111
- package/dist/extension.esm.js +117 -111
- package/dist/extension_content_script.js +79 -61
- package/dist/fellou.cjs.js +18 -18
- package/dist/fellou.esm.js +18 -18
- package/dist/index.cjs.js +262 -172
- package/dist/index.esm.js +262 -172
- package/dist/jest.config.js +10 -0
- package/dist/jest.config.js.map +1 -0
- package/dist/models/workflow.d.ts +3 -1
- package/dist/nodejs.cjs.js +1651 -1633
- package/dist/nodejs.esm.js +1651 -1633
- package/dist/rollup.config.js +171 -0
- package/dist/rollup.config.js.map +1 -0
- package/dist/script.js +10 -0
- package/dist/script.js.map +1 -0
- package/dist/services/llm/deepseek-provider.d.ts +13 -0
- package/dist/services/llm/provider-factory.d.ts +4 -0
- package/dist/services/llm/siliconflow-provider.d.ts +13 -0
- package/dist/services/parser/workflow-parser.d.ts +2 -1
- package/dist/services/workflow/generator.d.ts +3 -2
- package/dist/src/core/eko.js +99 -0
- package/dist/src/core/eko.js.map +1 -0
- package/dist/src/core/tool-registry.js +51 -0
- package/dist/src/core/tool-registry.js.map +1 -0
- package/dist/src/extension/content/index.js +409 -0
- package/dist/src/extension/content/index.js.map +1 -0
- package/dist/src/extension/core.js +29 -0
- package/dist/src/extension/core.js.map +1 -0
- package/dist/src/extension/index.js +12 -0
- package/dist/src/extension/index.js.map +1 -0
- package/dist/src/extension/script/bing.js +25 -0
- package/dist/src/extension/script/bing.js.map +1 -0
- package/dist/src/extension/script/build_dom_tree.js +585 -0
- package/dist/src/extension/script/build_dom_tree.js.map +1 -0
- package/dist/src/extension/script/common.js +203 -0
- package/dist/src/extension/script/common.js.map +1 -0
- package/dist/src/extension/script/duckduckgo.js +25 -0
- package/dist/src/extension/script/duckduckgo.js.map +1 -0
- package/dist/src/extension/script/google.js +26 -0
- package/dist/src/extension/script/google.js.map +1 -0
- package/dist/src/extension/tools/browser.js +174 -0
- package/dist/src/extension/tools/browser.js.map +1 -0
- package/dist/src/extension/tools/browser_use.js +186 -0
- package/dist/src/extension/tools/browser_use.js.map +1 -0
- package/dist/src/extension/tools/element_click.js +123 -0
- package/dist/src/extension/tools/element_click.js.map +1 -0
- package/dist/src/extension/tools/export_file.js +93 -0
- package/dist/src/extension/tools/export_file.js.map +1 -0
- package/dist/src/extension/tools/extract_content.js +38 -0
- package/dist/src/extension/tools/extract_content.js.map +1 -0
- package/dist/src/extension/tools/find_element_position.js +125 -0
- package/dist/src/extension/tools/find_element_position.js.map +1 -0
- package/dist/src/extension/tools/html_script.js +219 -0
- package/dist/src/extension/tools/html_script.js.map +1 -0
- package/dist/src/extension/tools/index.js +12 -0
- package/dist/src/extension/tools/index.js.map +1 -0
- package/dist/src/extension/tools/open_url.js +68 -0
- package/dist/src/extension/tools/open_url.js.map +1 -0
- package/dist/src/extension/tools/request_login.js +87 -0
- package/dist/src/extension/tools/request_login.js.map +1 -0
- package/dist/src/extension/tools/screenshot.js +26 -0
- package/dist/src/extension/tools/screenshot.js.map +1 -0
- package/dist/src/extension/tools/tab_management.js +160 -0
- package/dist/src/extension/tools/tab_management.js.map +1 -0
- package/dist/src/extension/tools/web_search.js +281 -0
- package/dist/src/extension/tools/web_search.js.map +1 -0
- package/dist/src/extension/utils.js +244 -0
- package/dist/src/extension/utils.js.map +1 -0
- package/dist/src/fellou/computer.js +104 -0
- package/dist/src/fellou/computer.js.map +1 -0
- package/dist/src/fellou/index.js +7 -0
- package/dist/src/fellou/index.js.map +1 -0
- package/dist/src/fellou/tools/computer_use.js +111 -0
- package/dist/src/fellou/tools/computer_use.js.map +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/models/action.js +364 -0
- package/dist/src/models/action.js.map +1 -0
- package/dist/src/models/workflow.js +120 -0
- package/dist/src/models/workflow.js.map +1 -0
- package/dist/src/nodejs/core.js +18 -0
- package/dist/src/nodejs/core.js.map +1 -0
- package/dist/src/nodejs/index.js +6 -0
- package/dist/src/nodejs/index.js.map +1 -0
- package/dist/src/nodejs/script/build_dom_tree.js +586 -0
- package/dist/src/nodejs/script/build_dom_tree.js.map +1 -0
- package/dist/src/nodejs/tools/browser_use.js +458 -0
- package/dist/src/nodejs/tools/browser_use.js.map +1 -0
- package/dist/src/nodejs/tools/command_execute.js +65 -0
- package/dist/src/nodejs/tools/command_execute.js.map +1 -0
- package/dist/src/nodejs/tools/file_read.js +45 -0
- package/dist/src/nodejs/tools/file_read.js.map +1 -0
- package/dist/src/nodejs/tools/file_write.js +95 -0
- package/dist/src/nodejs/tools/file_write.js.map +1 -0
- package/dist/src/nodejs/tools/index.js +5 -0
- package/dist/src/nodejs/tools/index.js.map +1 -0
- package/dist/src/schemas/workflow.schema.js +64 -0
- package/dist/src/schemas/workflow.schema.js.map +1 -0
- package/dist/src/services/llm/claude-provider.js +140 -0
- package/dist/src/services/llm/claude-provider.js.map +1 -0
- package/dist/src/services/llm/deepseek-provider.js +432 -0
- package/dist/src/services/llm/deepseek-provider.js.map +1 -0
- package/dist/src/services/llm/glm-provider.js +317 -0
- package/dist/src/services/llm/glm-provider.js.map +1 -0
- package/dist/src/services/llm/openai-provider copy.js +317 -0
- package/dist/src/services/llm/openai-provider copy.js.map +1 -0
- package/dist/src/services/llm/openai-provider.js +317 -0
- package/dist/src/services/llm/openai-provider.js.map +1 -0
- package/dist/src/services/parser/workflow-parser.js +208 -0
- package/dist/src/services/parser/workflow-parser.js.map +1 -0
- package/dist/src/services/workflow/generator.js +105 -0
- package/dist/src/services/workflow/generator.js.map +1 -0
- package/dist/src/services/workflow/templates.js +42 -0
- package/dist/src/services/workflow/templates.js.map +1 -0
- package/dist/src/types/action.types.js +2 -0
- package/dist/src/types/action.types.js.map +1 -0
- package/dist/src/types/eko.types.js +2 -0
- package/dist/src/types/eko.types.js.map +1 -0
- package/dist/src/types/index.js +6 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/llm.types.js +2 -0
- package/dist/src/types/llm.types.js.map +1 -0
- package/dist/src/types/parser.types.js +2 -0
- package/dist/src/types/parser.types.js.map +1 -0
- package/dist/src/types/tools.types.js +2 -0
- package/dist/src/types/tools.types.js.map +1 -0
- package/dist/src/types/workflow.types.js +3 -0
- package/dist/src/types/workflow.types.js.map +1 -0
- package/dist/src/web/core.js +18 -0
- package/dist/src/web/core.js.map +1 -0
- package/dist/src/web/index.js +9 -0
- package/dist/src/web/index.js.map +1 -0
- package/dist/src/web/script/build_dom_tree.js +584 -0
- package/dist/src/web/script/build_dom_tree.js.map +1 -0
- package/dist/src/web/tools/browser.js +249 -0
- package/dist/src/web/tools/browser.js.map +1 -0
- package/dist/src/web/tools/browser_use.js +176 -0
- package/dist/src/web/tools/browser_use.js.map +1 -0
- package/dist/src/web/tools/element_click.js +121 -0
- package/dist/src/web/tools/element_click.js.map +1 -0
- package/dist/src/web/tools/export_file.js +74 -0
- package/dist/src/web/tools/export_file.js.map +1 -0
- package/dist/src/web/tools/extract_content.js +24 -0
- package/dist/src/web/tools/extract_content.js.map +1 -0
- package/dist/src/web/tools/find_element_position.js +121 -0
- package/dist/src/web/tools/find_element_position.js.map +1 -0
- package/dist/src/web/tools/html_script.js +219 -0
- package/dist/src/web/tools/html_script.js.map +1 -0
- package/dist/src/web/tools/index.js +8 -0
- package/dist/src/web/tools/index.js.map +1 -0
- package/dist/src/web/tools/screenshot.js +24 -0
- package/dist/src/web/tools/screenshot.js.map +1 -0
- package/dist/test/integration/claude-provider.test.js +170 -0
- package/dist/test/integration/claude-provider.test.js.map +1 -0
- package/dist/test/integration/deepseek-provider.test.js +171 -0
- package/dist/test/integration/deepseek-provider.test.js.map +1 -0
- package/dist/test/integration/glm-provider.test.js +173 -0
- package/dist/test/integration/glm-provider.test.js.map +1 -0
- package/dist/test/integration/openai-provider.test copy.js +170 -0
- package/dist/test/integration/openai-provider.test copy.js.map +1 -0
- package/dist/test/integration/openai-provider.test.js +170 -0
- package/dist/test/integration/openai-provider.test.js.map +1 -0
- package/dist/test/integration/qwen-provider.js +170 -0
- package/dist/test/integration/qwen-provider.js.map +1 -0
- package/dist/test/integration/qwen-provider.test copy.js +170 -0
- package/dist/test/integration/qwen-provider.test copy.js.map +1 -0
- package/dist/test/integration/qwen-provider.test.js +170 -0
- package/dist/test/integration/qwen-provider.test.js.map +1 -0
- package/dist/test/integration/workflow.execution.test.js +152 -0
- package/dist/test/integration/workflow.execution.test.js.map +1 -0
- package/dist/test/integration/workflow.generation-and-execution.test.js +131 -0
- package/dist/test/integration/workflow.generation-and-execution.test.js.map +1 -0
- package/dist/test/integration/workflow.generator.test.js +207 -0
- package/dist/test/integration/workflow.generator.test.js.map +1 -0
- package/dist/test/unit/action.test.js +186 -0
- package/dist/test/unit/action.test.js.map +1 -0
- package/dist/test/unit/tool-registry.test.js +99 -0
- package/dist/test/unit/tool-registry.test.js.map +1 -0
- package/dist/test/unit/workflow-parser.test.js +189 -0
- package/dist/test/unit/workflow-parser.test.js.map +1 -0
- package/dist/test/unit/workflow.test.js +102 -0
- package/dist/test/unit/workflow.test.js.map +1 -0
- package/dist/types/action.types.d.ts +2 -0
- package/dist/types/eko.types.d.ts +4 -1
- package/dist/types/jest.config.d.ts +10 -0
- package/dist/types/llm.types.d.ts +0 -2
- package/dist/types/rollup.config.d.ts +16 -0
- package/dist/types/script.d.ts +1 -0
- package/dist/types/src/core/eko.d.ts +20 -0
- package/dist/types/src/core/tool-registry.d.ts +13 -0
- package/dist/types/src/extension/content/index.d.ts +16 -0
- package/dist/types/src/extension/core.d.ts +11 -0
- package/dist/types/src/extension/index.d.ts +7 -0
- package/dist/types/src/extension/script/bing.d.ts +0 -0
- package/dist/types/src/extension/script/build_dom_tree.d.ts +38 -0
- package/dist/types/src/extension/script/common.d.ts +0 -0
- package/dist/types/src/extension/script/duckduckgo.d.ts +0 -0
- package/dist/types/src/extension/script/google.d.ts +0 -0
- package/dist/types/src/extension/tools/browser.d.ts +22 -0
- package/dist/types/src/extension/tools/browser_use.d.ts +19 -0
- package/dist/types/src/extension/tools/element_click.d.ts +12 -0
- package/dist/types/src/extension/tools/export_file.d.ts +18 -0
- package/dist/types/src/extension/tools/extract_content.d.ts +18 -0
- package/dist/types/src/extension/tools/find_element_position.d.ts +12 -0
- package/dist/types/src/extension/tools/html_script.d.ts +10 -0
- package/dist/types/src/extension/tools/index.d.ts +11 -0
- package/dist/types/src/extension/tools/open_url.d.ts +18 -0
- package/dist/{extension/tools/form_autofill.d.ts → types/src/extension/tools/request_login.d.ts} +3 -4
- package/dist/types/src/extension/tools/screenshot.d.ts +18 -0
- package/dist/types/src/extension/tools/tab_management.d.ts +19 -0
- package/dist/types/src/extension/tools/web_search.d.ts +18 -0
- package/dist/types/src/extension/utils.d.ts +31 -0
- package/dist/types/src/fellou/computer.d.ts +20 -0
- package/dist/types/src/fellou/index.d.ts +6 -0
- package/dist/types/src/fellou/tools/computer_use.d.ts +18 -0
- package/dist/types/src/index.d.ts +8 -0
- package/dist/types/src/models/action.d.ts +22 -0
- package/dist/types/src/models/workflow.d.ts +16 -0
- package/dist/types/src/nodejs/core.d.ts +2 -0
- package/dist/types/src/nodejs/index.d.ts +3 -0
- package/dist/types/src/nodejs/script/build_dom_tree.d.ts +1 -0
- package/dist/types/src/nodejs/tools/browser_use.d.ts +28 -0
- package/dist/types/src/nodejs/tools/command_execute.d.ts +12 -0
- package/dist/types/src/nodejs/tools/file_read.d.ts +11 -0
- package/dist/types/src/nodejs/tools/file_write.d.ts +15 -0
- package/dist/types/src/nodejs/tools/index.d.ts +4 -0
- package/dist/types/src/schemas/workflow.schema.d.ts +88 -0
- package/dist/types/src/services/llm/claude-provider.d.ts +11 -0
- package/dist/types/src/services/llm/deepseek-provider.d.ts +15 -0
- package/dist/types/src/services/llm/glm-provider.d.ts +11 -0
- package/dist/types/src/services/llm/openai-provider copy.d.ts +11 -0
- package/dist/types/src/services/llm/openai-provider.d.ts +11 -0
- package/dist/types/src/services/parser/workflow-parser.d.ts +29 -0
- package/dist/types/src/services/workflow/generator.d.ts +13 -0
- package/dist/types/src/services/workflow/templates.d.ts +8 -0
- package/dist/types/src/types/action.types.d.ts +38 -0
- package/dist/types/src/types/eko.types.d.ts +21 -0
- package/dist/types/src/types/index.d.ts +5 -0
- package/dist/types/src/types/llm.types.d.ts +54 -0
- package/dist/types/src/types/parser.types.d.ts +9 -0
- package/dist/types/src/types/tools.types.d.ts +88 -0
- package/dist/types/src/types/workflow.types.d.ts +39 -0
- package/dist/types/src/web/core.d.ts +2 -0
- package/dist/types/src/web/index.d.ts +5 -0
- package/dist/types/src/web/script/build_dom_tree.d.ts +10 -0
- package/dist/types/src/web/tools/browser.d.ts +21 -0
- package/dist/types/src/web/tools/browser_use.d.ts +19 -0
- package/dist/types/src/web/tools/element_click.d.ts +12 -0
- package/dist/types/src/web/tools/export_file.d.ts +18 -0
- package/dist/types/src/web/tools/extract_content.d.ts +17 -0
- package/dist/types/src/web/tools/find_element_position.d.ts +12 -0
- package/dist/types/src/web/tools/html_script.d.ts +10 -0
- package/dist/types/src/web/tools/index.d.ts +7 -0
- package/dist/types/src/web/tools/screenshot.d.ts +18 -0
- package/dist/types/test/integration/claude-provider.test.d.ts +1 -0
- package/dist/types/test/integration/deepseek-provider.test.d.ts +1 -0
- package/dist/types/test/integration/glm-provider.test.d.ts +1 -0
- package/dist/types/test/integration/openai-provider.test copy.d.ts +1 -0
- package/dist/types/test/integration/openai-provider.test.d.ts +1 -0
- package/dist/types/test/integration/qwen-provider.d.ts +1 -0
- package/dist/types/test/integration/qwen-provider.test copy.d.ts +1 -0
- package/dist/types/test/integration/qwen-provider.test.d.ts +1 -0
- package/dist/types/test/integration/workflow.execution.test.d.ts +1 -0
- package/dist/types/test/integration/workflow.generation-and-execution.test.d.ts +1 -0
- package/dist/types/test/integration/workflow.generator.test.d.ts +1 -0
- package/dist/types/test/unit/action.test.d.ts +1 -0
- package/dist/types/test/unit/tool-registry.test.d.ts +1 -0
- package/dist/types/test/unit/workflow-parser.test.d.ts +1 -0
- package/dist/types/test/unit/workflow.test.d.ts +1 -0
- package/dist/universal_tools/human/text.d.ts +9 -0
- package/dist/web.cjs.js +128 -121
- package/dist/web.esm.js +128 -121
- package/package.json +106 -106
- package/dist/fellou/tools/index.d.ts +0 -2
- package/dist/types/framework.types.d.ts +0 -11
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// test/integration/workflow.generator.test.ts
|
|
2
|
+
import { ClaudeProvider } from '../../src/services/llm/claude-provider';
|
|
3
|
+
import { WorkflowGenerator } from '../../src/services/workflow/generator';
|
|
4
|
+
import { ToolRegistry } from '../../src/core/tool-registry';
|
|
5
|
+
import { WorkflowParser } from '../../src/services/parser/workflow-parser';
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import dotenv from 'dotenv';
|
|
9
|
+
dotenv.config();
|
|
10
|
+
// Mock browser tool base class to avoid duplicate code
|
|
11
|
+
class BrowserTool {
|
|
12
|
+
constructor(name, description, input_schema) {
|
|
13
|
+
this.name = name;
|
|
14
|
+
this.description = description;
|
|
15
|
+
this.input_schema = input_schema;
|
|
16
|
+
}
|
|
17
|
+
async execute(params) {
|
|
18
|
+
throw new Error('Not implemented');
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Create mock browser tools
|
|
22
|
+
function createBrowserTools() {
|
|
23
|
+
return [
|
|
24
|
+
new BrowserTool('open_url', 'Opens a specified URL in the current browser tab', {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
url: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'The URL to open'
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
required: ['url']
|
|
33
|
+
}),
|
|
34
|
+
new BrowserTool('find_dom_object', 'Finds a DOM element using CSS selector, returns multiple elements if found', {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
selector: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'CSS selector to find elements'
|
|
40
|
+
},
|
|
41
|
+
waitForElement: {
|
|
42
|
+
type: 'boolean',
|
|
43
|
+
description: 'Whether to wait for elements to appear'
|
|
44
|
+
},
|
|
45
|
+
timeout: {
|
|
46
|
+
type: 'integer',
|
|
47
|
+
description: 'Maximum time to wait in milliseconds'
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
required: ['selector']
|
|
51
|
+
}),
|
|
52
|
+
new BrowserTool('click_dom_object', 'Clicks on a DOM element found by CSS selector', {
|
|
53
|
+
type: 'object',
|
|
54
|
+
properties: {
|
|
55
|
+
selector: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
description: 'CSS selector of element to click'
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
required: ['selector']
|
|
61
|
+
}),
|
|
62
|
+
new BrowserTool('input_text', 'Types text into a form field', {
|
|
63
|
+
type: 'object',
|
|
64
|
+
properties: {
|
|
65
|
+
selector: {
|
|
66
|
+
type: 'string',
|
|
67
|
+
description: 'CSS selector of input element'
|
|
68
|
+
},
|
|
69
|
+
text: {
|
|
70
|
+
type: 'string',
|
|
71
|
+
description: 'Text to type'
|
|
72
|
+
},
|
|
73
|
+
clear: {
|
|
74
|
+
type: 'boolean',
|
|
75
|
+
description: 'Whether to clear existing text first'
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
required: ['selector', 'text']
|
|
79
|
+
}),
|
|
80
|
+
new BrowserTool('copy_dom_object_text', 'Extracts text content from DOM elements matching a selector', {
|
|
81
|
+
type: 'object',
|
|
82
|
+
properties: {
|
|
83
|
+
selector: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
description: 'CSS selector of elements to copy text from'
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
required: ['selector']
|
|
89
|
+
}),
|
|
90
|
+
new BrowserTool('save_file', 'Saves content to a file', {
|
|
91
|
+
type: 'object',
|
|
92
|
+
properties: {
|
|
93
|
+
content: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
description: 'Content to save'
|
|
96
|
+
},
|
|
97
|
+
filename: {
|
|
98
|
+
type: 'string',
|
|
99
|
+
description: 'Name of the file'
|
|
100
|
+
},
|
|
101
|
+
type: {
|
|
102
|
+
type: 'string',
|
|
103
|
+
description: 'File type',
|
|
104
|
+
enum: ['text/plain', 'text/csv', 'text/html', 'application/json']
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
required: ['content', 'filename']
|
|
108
|
+
})
|
|
109
|
+
];
|
|
110
|
+
}
|
|
111
|
+
const ENABLE_INTEGRATION_TESTS = process.env.ENABLE_INTEGRATION_TESTS === 'true';
|
|
112
|
+
const describeIntegration = ENABLE_INTEGRATION_TESTS ? describe : describe.skip;
|
|
113
|
+
describeIntegration('WorkflowGenerator Integration', () => {
|
|
114
|
+
let toolRegistry;
|
|
115
|
+
let generator;
|
|
116
|
+
// Helper function to save workflow DSL to file
|
|
117
|
+
async function saveWorkflowToFile(dsl, filename) {
|
|
118
|
+
const testOutputDir = path.join(__dirname, '../fixtures/generated');
|
|
119
|
+
await fs.mkdir(testOutputDir, { recursive: true });
|
|
120
|
+
await fs.writeFile(path.join(testOutputDir, filename), dsl, 'utf-8');
|
|
121
|
+
}
|
|
122
|
+
beforeAll(() => {
|
|
123
|
+
const ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
|
|
124
|
+
if (!ANTHROPIC_API_KEY) {
|
|
125
|
+
throw new Error('ANTHROPIC_API_KEY environment variable is required for integration tests');
|
|
126
|
+
}
|
|
127
|
+
// Set up registry with browser tools
|
|
128
|
+
toolRegistry = new ToolRegistry();
|
|
129
|
+
createBrowserTools().forEach(tool => toolRegistry.registerTool(tool));
|
|
130
|
+
// Create generator with Claude provider
|
|
131
|
+
const llmProvider = new ClaudeProvider(ANTHROPIC_API_KEY);
|
|
132
|
+
generator = new WorkflowGenerator(llmProvider, toolRegistry);
|
|
133
|
+
});
|
|
134
|
+
it('should generate workflow for finding Chromium developers', async () => {
|
|
135
|
+
const prompt = "Find Chromium developers from Github, collect the profiles, and summarize the results to CSV";
|
|
136
|
+
// Generate workflow
|
|
137
|
+
const workflow = await generator.generateWorkflow(prompt);
|
|
138
|
+
// Convert to DSL for validation and inspection
|
|
139
|
+
const dsl = WorkflowParser.serialize(workflow);
|
|
140
|
+
// Save DSL for human inspection
|
|
141
|
+
await saveWorkflowToFile(dsl, 'github_chromium_workflow.json');
|
|
142
|
+
// Validate the generated workflow
|
|
143
|
+
const validationResult = WorkflowParser.validate(JSON.parse(dsl));
|
|
144
|
+
// Log validation errors if any (helpful for debugging)
|
|
145
|
+
if (!validationResult.valid) {
|
|
146
|
+
console.error('Validation errors:', JSON.stringify(validationResult.errors, null, 2));
|
|
147
|
+
}
|
|
148
|
+
// Assert validation
|
|
149
|
+
expect(validationResult.valid).toBe(true);
|
|
150
|
+
expect(validationResult.errors).toHaveLength(0);
|
|
151
|
+
// Basic structure checks
|
|
152
|
+
expect(workflow.id).toBeDefined();
|
|
153
|
+
expect(workflow.name).toBeDefined();
|
|
154
|
+
expect(workflow.nodes).toBeDefined();
|
|
155
|
+
expect(workflow.nodes.length).toBeGreaterThan(0);
|
|
156
|
+
// Log workflow structure for inspection
|
|
157
|
+
console.log('\nGenerated Workflow Structure:');
|
|
158
|
+
console.log('ID:', workflow.id);
|
|
159
|
+
console.log('Name:', workflow.name);
|
|
160
|
+
console.log('Number of nodes:', workflow.nodes.length);
|
|
161
|
+
console.log('Nodes:', workflow.nodes.map(n => ({
|
|
162
|
+
id: n.id,
|
|
163
|
+
name: n.name,
|
|
164
|
+
dependencies: n.dependencies,
|
|
165
|
+
action: {
|
|
166
|
+
type: n.action.type,
|
|
167
|
+
tools: n.action.tools.map(t => t.name)
|
|
168
|
+
}
|
|
169
|
+
})));
|
|
170
|
+
// Verify tool usage
|
|
171
|
+
const usedTools = new Set();
|
|
172
|
+
workflow.nodes.forEach(node => {
|
|
173
|
+
node.action.tools.forEach(tool => {
|
|
174
|
+
usedTools.add(tool.name);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
console.log('\nTools used:', Array.from(usedTools));
|
|
178
|
+
// Expected tools for this workflow
|
|
179
|
+
const expected_tools = new Set([
|
|
180
|
+
'open_url', // For navigating to Github
|
|
181
|
+
'input_text', // For entering search terms
|
|
182
|
+
'click_dom_object', // For interaction
|
|
183
|
+
'find_dom_object', // For finding profile elements
|
|
184
|
+
'copy_dom_object_text', // For extracting profile data
|
|
185
|
+
'save_file', // For saving the CSV
|
|
186
|
+
'write_context' // For storing data in context
|
|
187
|
+
]);
|
|
188
|
+
// Verify reasonable tool usage
|
|
189
|
+
expect(usedTools.size).toBeGreaterThanOrEqual(3);
|
|
190
|
+
usedTools.forEach(tool => {
|
|
191
|
+
expect(expected_tools).toContain(tool);
|
|
192
|
+
});
|
|
193
|
+
// Verify workflow has proper node dependencies
|
|
194
|
+
expect(workflow.validateDAG()).toBe(true);
|
|
195
|
+
// The last node should use save_file tool to create CSV
|
|
196
|
+
const lastNode = workflow.nodes[workflow.nodes.length - 1];
|
|
197
|
+
expect(lastNode.action.tools.some(t => t.name === 'save_file')).toBe(true);
|
|
198
|
+
// First node should have no dependencies
|
|
199
|
+
const firstNode = workflow.nodes[0];
|
|
200
|
+
expect(firstNode.dependencies.length).toBe(0);
|
|
201
|
+
// Other nodes should have dependencies
|
|
202
|
+
workflow.nodes.slice(1).forEach(node => {
|
|
203
|
+
expect(node.dependencies.length).toBeGreaterThan(0);
|
|
204
|
+
});
|
|
205
|
+
}, 30000); // Increased timeout for LLM
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=workflow.generator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.generator.test.js","sourceRoot":"","sources":["../../../test/integration/workflow.generator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { ActionImpl } from '../../src/models/action';
|
|
2
|
+
// Mock tool for testing
|
|
3
|
+
class MockTool {
|
|
4
|
+
constructor(name, description = 'Mock tool for testing', shouldFail = false) {
|
|
5
|
+
this.name = name;
|
|
6
|
+
this.description = description;
|
|
7
|
+
this.shouldFail = shouldFail;
|
|
8
|
+
this.input_schema = {
|
|
9
|
+
type: 'object',
|
|
10
|
+
properties: {
|
|
11
|
+
testParam: { type: 'string' },
|
|
12
|
+
},
|
|
13
|
+
required: ['testParam'],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async execute(context, params) {
|
|
17
|
+
if (this.shouldFail) {
|
|
18
|
+
throw new Error('Tool execution failed');
|
|
19
|
+
}
|
|
20
|
+
return { success: true, params };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Mock LLM provider
|
|
24
|
+
class MockLLMProvider {
|
|
25
|
+
constructor(toolCallResponses = [], shouldFail = false, counter = 0) {
|
|
26
|
+
this.toolCallResponses = toolCallResponses;
|
|
27
|
+
this.shouldFail = shouldFail;
|
|
28
|
+
this.counter = counter;
|
|
29
|
+
}
|
|
30
|
+
async generateText() {
|
|
31
|
+
if (this.shouldFail) {
|
|
32
|
+
throw new Error('LLM generation failed');
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
content: 'Test response',
|
|
36
|
+
toolCalls: this.toolCallResponses,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async generateStream(messages, params, handler) {
|
|
40
|
+
var _a, _b, _c, _d;
|
|
41
|
+
if (this.shouldFail) {
|
|
42
|
+
(_a = handler.onError) === null || _a === void 0 ? void 0 : _a.call(handler, new Error('Stream generation failed'));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Simulate thinking output
|
|
46
|
+
(_b = handler.onContent) === null || _b === void 0 ? void 0 : _b.call(handler, 'Thinking about the task...');
|
|
47
|
+
// Process each tool call
|
|
48
|
+
const toolCall = this.toolCallResponses[this.counter++];
|
|
49
|
+
(_c = handler.onToolUse) === null || _c === void 0 ? void 0 : _c.call(handler, {
|
|
50
|
+
id: `tool-${Math.random()}`,
|
|
51
|
+
name: toolCall.name,
|
|
52
|
+
input: toolCall.input,
|
|
53
|
+
});
|
|
54
|
+
// Final response
|
|
55
|
+
(_d = handler.onComplete) === null || _d === void 0 ? void 0 : _d.call(handler, {
|
|
56
|
+
content: [
|
|
57
|
+
{ type: 'text', text: 'Thinking about the task...' },
|
|
58
|
+
{
|
|
59
|
+
type: 'tool_use',
|
|
60
|
+
id: `tool-${Math.random()}`,
|
|
61
|
+
name: toolCall.name,
|
|
62
|
+
input: toolCall.input
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
toolCalls: [{
|
|
66
|
+
id: `tool-${Math.random()}`,
|
|
67
|
+
name: toolCall.name,
|
|
68
|
+
input: toolCall.input
|
|
69
|
+
}],
|
|
70
|
+
stop_reason: 'tool_use',
|
|
71
|
+
textContent: null // No text content when using tools
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
describe('ActionImpl', () => {
|
|
76
|
+
let mockTool;
|
|
77
|
+
let mockLLMProvider;
|
|
78
|
+
let context;
|
|
79
|
+
beforeEach(() => {
|
|
80
|
+
mockTool = new MockTool('test_tool');
|
|
81
|
+
mockLLMProvider = new MockLLMProvider();
|
|
82
|
+
context = {
|
|
83
|
+
llmProvider: mockLLMProvider,
|
|
84
|
+
variables: new Map(),
|
|
85
|
+
tools: new Map(),
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
describe('constructor', () => {
|
|
89
|
+
it('should create an action with tools including write_context', () => {
|
|
90
|
+
const action = ActionImpl.createPromptAction('test_action', 'This is an action for testing purposes', [mockTool], mockLLMProvider);
|
|
91
|
+
expect(action.tools).toHaveLength(2); // Original tool + write_context
|
|
92
|
+
expect(action.tools.some((t) => t.name === 'write_context')).toBeTruthy();
|
|
93
|
+
expect(action.tools.some((t) => t.name === 'test_tool')).toBeTruthy();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe('execute', () => {
|
|
97
|
+
it('should handle successful tool execution', async () => {
|
|
98
|
+
// Setup LLM to make a tool call
|
|
99
|
+
mockLLMProvider = new MockLLMProvider([
|
|
100
|
+
{ name: 'test_tool', input: { testParam: 'test' } },
|
|
101
|
+
{ name: 'return_output', input: { value: 'test return' } },
|
|
102
|
+
]);
|
|
103
|
+
const action = ActionImpl.createPromptAction('test_action', 'This is an action for testing purposes', [mockTool], mockLLMProvider);
|
|
104
|
+
await action.execute('Test input', context);
|
|
105
|
+
// Tool was successful, no errors thrown
|
|
106
|
+
});
|
|
107
|
+
it('should handle tool execution failure', async () => {
|
|
108
|
+
// Setup failing tool
|
|
109
|
+
mockTool = new MockTool('test_tool', 'Mock tool', true);
|
|
110
|
+
mockLLMProvider = new MockLLMProvider([
|
|
111
|
+
{ name: 'test_tool', input: { testParam: 'test' } },
|
|
112
|
+
{ name: 'return_output', input: { value: 'test return' } },
|
|
113
|
+
]);
|
|
114
|
+
const action = ActionImpl.createPromptAction('test_action', 'This is an action for testing purposes', [mockTool], mockLLMProvider);
|
|
115
|
+
await action.execute('Test input', context);
|
|
116
|
+
// Should handle tool failure gracefully, no error thrown
|
|
117
|
+
});
|
|
118
|
+
it('should handle LLM provider failure', async () => {
|
|
119
|
+
mockLLMProvider = new MockLLMProvider([], true);
|
|
120
|
+
const action = ActionImpl.createPromptAction('test_action', 'This is an action for testing purposes', [mockTool], mockLLMProvider);
|
|
121
|
+
await expect(action.execute('Test input', context)).resolves.toBeDefined();
|
|
122
|
+
// Should handle LLM failure gracefully
|
|
123
|
+
});
|
|
124
|
+
it('should properly use write_context tool', async () => {
|
|
125
|
+
// Setup LLM to make a write_context call
|
|
126
|
+
mockLLMProvider = new MockLLMProvider([
|
|
127
|
+
{
|
|
128
|
+
name: 'write_context',
|
|
129
|
+
input: { key: 'test_key', value: JSON.stringify({ data: 'test' }) },
|
|
130
|
+
},
|
|
131
|
+
{ name: 'return_output', input: { value: 'test return' } },
|
|
132
|
+
]);
|
|
133
|
+
const action = ActionImpl.createPromptAction('test_action', 'This is an action for testing purposes', [mockTool], mockLLMProvider);
|
|
134
|
+
await action.execute('Test input', context);
|
|
135
|
+
// Check if value was written to context
|
|
136
|
+
expect(context.variables.get('test_key')).toEqual({ data: 'test' });
|
|
137
|
+
});
|
|
138
|
+
it('should handle non-JSON values in write_context', async () => {
|
|
139
|
+
// Setup LLM to make a write_context call with string value
|
|
140
|
+
mockLLMProvider = new MockLLMProvider([
|
|
141
|
+
{
|
|
142
|
+
name: 'write_context',
|
|
143
|
+
input: { key: 'test_key', value: 'plain text value' },
|
|
144
|
+
},
|
|
145
|
+
{ name: 'return_output', input: { value: 'test return' } },
|
|
146
|
+
]);
|
|
147
|
+
const action = ActionImpl.createPromptAction('test_action', 'This is an action for testing purposes', [mockTool], mockLLMProvider);
|
|
148
|
+
await action.execute('Test input', context);
|
|
149
|
+
// Check if value was written to context as string
|
|
150
|
+
expect(context.variables.get('test_key')).toBe('plain text value');
|
|
151
|
+
});
|
|
152
|
+
it('should include context variables in user prompt', async () => {
|
|
153
|
+
// Setup context with some variables
|
|
154
|
+
context.variables.set('existingVar', 'test value');
|
|
155
|
+
// Create mock LLM provider that captures messages
|
|
156
|
+
const capturedMessages = [];
|
|
157
|
+
const mockLLMProviderWithCapture = new MockLLMProvider();
|
|
158
|
+
mockLLMProviderWithCapture.generateStream = async (messages, params, handler) => {
|
|
159
|
+
var _a;
|
|
160
|
+
capturedMessages.push(...messages);
|
|
161
|
+
// Continue with normal stream handling
|
|
162
|
+
await ((_a = handler.onContent) === null || _a === void 0 ? void 0 : _a.call(handler, 'Test content'));
|
|
163
|
+
};
|
|
164
|
+
const action = ActionImpl.createPromptAction('test_action', 'This is an action for testing purposes', [mockTool], mockLLMProviderWithCapture);
|
|
165
|
+
await action.execute('Test input', context);
|
|
166
|
+
// Verify system prompt includes context variables
|
|
167
|
+
const initialPrompt = capturedMessages[1].content;
|
|
168
|
+
expect(initialPrompt).toContain('existingVar');
|
|
169
|
+
expect(initialPrompt).toContain('test value');
|
|
170
|
+
});
|
|
171
|
+
it('should merge action tools with context tools', async () => {
|
|
172
|
+
var _a;
|
|
173
|
+
const contextTool = new MockTool('context_tool');
|
|
174
|
+
(_a = context.tools) === null || _a === void 0 ? void 0 : _a.set(contextTool.name, contextTool);
|
|
175
|
+
mockLLMProvider = new MockLLMProvider([
|
|
176
|
+
{ name: 'context_tool', input: { testParam: 'test' } },
|
|
177
|
+
{ name: 'test_tool', input: { testParam: 'test' } },
|
|
178
|
+
{ name: 'return_output', input: { value: 'test return' } },
|
|
179
|
+
]);
|
|
180
|
+
const action = ActionImpl.createPromptAction('test_action', 'This is an action for testing purposes', [mockTool], mockLLMProvider);
|
|
181
|
+
await action.execute('Test input', context);
|
|
182
|
+
// Both tools should have been accessible
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=action.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.test.js","sourceRoot":"","sources":["../../../test/unit/action.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { ToolRegistry } from '../../src/core/tool-registry';
|
|
2
|
+
class MockTool {
|
|
3
|
+
constructor(name, description = 'Mock tool description', input_schema = {
|
|
4
|
+
type: 'object',
|
|
5
|
+
properties: {
|
|
6
|
+
param: { type: 'string' }
|
|
7
|
+
}
|
|
8
|
+
}) {
|
|
9
|
+
this.name = name;
|
|
10
|
+
this.description = description;
|
|
11
|
+
this.input_schema = input_schema;
|
|
12
|
+
}
|
|
13
|
+
async execute(params) {
|
|
14
|
+
return { executed: true };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
describe('ToolRegistry', () => {
|
|
18
|
+
let registry;
|
|
19
|
+
let mockTool;
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
registry = new ToolRegistry();
|
|
22
|
+
mockTool = new MockTool('mock_tool');
|
|
23
|
+
});
|
|
24
|
+
describe('tool management', () => {
|
|
25
|
+
test('should register a tool successfully', () => {
|
|
26
|
+
registry.registerTool(mockTool);
|
|
27
|
+
expect(registry.getTool('mock_tool')).toBe(mockTool);
|
|
28
|
+
});
|
|
29
|
+
test('should throw when registering duplicate tool', () => {
|
|
30
|
+
registry.registerTool(mockTool);
|
|
31
|
+
expect(() => registry.registerTool(mockTool)).toThrow();
|
|
32
|
+
});
|
|
33
|
+
test('should unregister a tool successfully', () => {
|
|
34
|
+
registry.registerTool(mockTool);
|
|
35
|
+
registry.unregisterTool('mock_tool');
|
|
36
|
+
expect(() => registry.getTool('mock_tool')).toThrow();
|
|
37
|
+
});
|
|
38
|
+
test('should throw when unregistering non-existent tool', () => {
|
|
39
|
+
expect(() => registry.unregisterTool('non_existent')).toThrow();
|
|
40
|
+
});
|
|
41
|
+
test('should check for tool existence correctly', () => {
|
|
42
|
+
registry.registerTool(mockTool);
|
|
43
|
+
expect(registry.hasTools(['mock_tool'])).toBe(true);
|
|
44
|
+
expect(registry.hasTools(['non_existent'])).toBe(false);
|
|
45
|
+
expect(registry.hasTools(['mock_tool', 'non_existent'])).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('tool enumeration', () => {
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
registry.registerTool(new MockTool('tool1'));
|
|
51
|
+
registry.registerTool(new MockTool('tool2'));
|
|
52
|
+
});
|
|
53
|
+
test('should get all tools', () => {
|
|
54
|
+
const tools = registry.getAllTools();
|
|
55
|
+
expect(tools).toHaveLength(2);
|
|
56
|
+
expect(tools.map(t => t.name)).toEqual(['tool1', 'tool2']);
|
|
57
|
+
});
|
|
58
|
+
test('should get tool definitions', () => {
|
|
59
|
+
const definitions = registry.getToolDefinitions();
|
|
60
|
+
expect(definitions).toHaveLength(2);
|
|
61
|
+
expect(definitions[0]).toHaveProperty('name', 'tool1');
|
|
62
|
+
expect(definitions[0]).toHaveProperty('description');
|
|
63
|
+
expect(definitions[0]).toHaveProperty('input_schema');
|
|
64
|
+
});
|
|
65
|
+
test('should get tool enum', () => {
|
|
66
|
+
const enumValues = registry.getToolEnum();
|
|
67
|
+
expect(enumValues).toEqual(['tool1', 'tool2']);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('workflow schema generation', () => {
|
|
71
|
+
beforeEach(() => {
|
|
72
|
+
registry.registerTool(new MockTool('tool1'));
|
|
73
|
+
registry.registerTool(new MockTool('tool2'));
|
|
74
|
+
});
|
|
75
|
+
test('should generate valid workflow schema', () => {
|
|
76
|
+
const schema = registry.getWorkflowSchema();
|
|
77
|
+
// Basic schema structure
|
|
78
|
+
expect(schema).toHaveProperty('type', 'object');
|
|
79
|
+
expect(schema.properties).toHaveProperty('nodes');
|
|
80
|
+
// Tool enum in action schema
|
|
81
|
+
const actionTools = schema.properties.nodes.items.properties.action.properties.tools;
|
|
82
|
+
expect(actionTools.items.enum).toEqual(['tool1', 'tool2']);
|
|
83
|
+
});
|
|
84
|
+
test('should update schema when tools change', () => {
|
|
85
|
+
let schema = registry.getWorkflowSchema();
|
|
86
|
+
expect(schema.properties.nodes.items.properties.action.properties.tools.items.enum)
|
|
87
|
+
.toEqual(['tool1', 'tool2']);
|
|
88
|
+
registry.registerTool(new MockTool('tool3'));
|
|
89
|
+
schema = registry.getWorkflowSchema();
|
|
90
|
+
expect(schema.properties.nodes.items.properties.action.properties.tools.items.enum)
|
|
91
|
+
.toEqual(['tool1', 'tool2', 'tool3']);
|
|
92
|
+
registry.unregisterTool('tool2');
|
|
93
|
+
schema = registry.getWorkflowSchema();
|
|
94
|
+
expect(schema.properties.nodes.items.properties.action.properties.tools.items.enum)
|
|
95
|
+
.toEqual(['tool1', 'tool3']);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=tool-registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.test.js","sourceRoot":"","sources":["../../../test/unit/tool-registry.test.ts"],"names":[],"mappings":"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"}
|