@eko-ai/eko 1.0.1

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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/core/eko.d.ts +17 -0
  4. package/dist/core/tool-registry.d.ts +13 -0
  5. package/dist/extension/content/index.d.ts +7 -0
  6. package/dist/extension/core.d.ts +11 -0
  7. package/dist/extension/index.d.ts +7 -0
  8. package/dist/extension/script/bing.js +25 -0
  9. package/dist/extension/script/build_dom_tree.js +657 -0
  10. package/dist/extension/script/common.js +204 -0
  11. package/dist/extension/script/duckduckgo.js +25 -0
  12. package/dist/extension/script/google.js +26 -0
  13. package/dist/extension/tools/browser.d.ts +21 -0
  14. package/dist/extension/tools/browser_use.d.ts +18 -0
  15. package/dist/extension/tools/element_click.d.ts +12 -0
  16. package/dist/extension/tools/export_file.d.ts +18 -0
  17. package/dist/extension/tools/extract_content.d.ts +18 -0
  18. package/dist/extension/tools/find_element_position.d.ts +12 -0
  19. package/dist/extension/tools/form_autofill.d.ts +11 -0
  20. package/dist/extension/tools/html_script.d.ts +21 -0
  21. package/dist/extension/tools/index.d.ts +11 -0
  22. package/dist/extension/tools/open_url.d.ts +18 -0
  23. package/dist/extension/tools/screenshot.d.ts +18 -0
  24. package/dist/extension/tools/tab_management.d.ts +19 -0
  25. package/dist/extension/tools/web_search.d.ts +18 -0
  26. package/dist/extension/utils.d.ts +30 -0
  27. package/dist/extension.cjs.js +1783 -0
  28. package/dist/extension.esm.js +1776 -0
  29. package/dist/extension_content_script.js +247 -0
  30. package/dist/fellou/computer.d.ts +20 -0
  31. package/dist/fellou/index.d.ts +6 -0
  32. package/dist/fellou/tools/computer_use.d.ts +18 -0
  33. package/dist/fellou/tools/index.d.ts +2 -0
  34. package/dist/fellou.cjs.js +238 -0
  35. package/dist/fellou.esm.js +235 -0
  36. package/dist/index.cjs.js +9350 -0
  37. package/dist/index.d.ts +8 -0
  38. package/dist/index.esm.js +9340 -0
  39. package/dist/models/action.d.ts +20 -0
  40. package/dist/models/workflow.d.ts +15 -0
  41. package/dist/nodejs/index.d.ts +2 -0
  42. package/dist/nodejs/tools/index.d.ts +1 -0
  43. package/dist/nodejs.cjs.js +7 -0
  44. package/dist/nodejs.esm.js +5 -0
  45. package/dist/schemas/workflow.schema.d.ts +85 -0
  46. package/dist/services/llm/claude-provider.d.ts +10 -0
  47. package/dist/services/llm/openai-provider.d.ts +10 -0
  48. package/dist/services/parser/workflow-parser.d.ts +29 -0
  49. package/dist/services/workflow/generator.d.ts +11 -0
  50. package/dist/services/workflow/templates.d.ts +7 -0
  51. package/dist/types/action.types.d.ts +36 -0
  52. package/dist/types/eko.types.d.ts +21 -0
  53. package/dist/types/framework.types.d.ts +11 -0
  54. package/dist/types/index.d.ts +6 -0
  55. package/dist/types/llm.types.d.ts +54 -0
  56. package/dist/types/parser.types.d.ts +9 -0
  57. package/dist/types/tools.types.d.ts +88 -0
  58. package/dist/types/workflow.types.d.ts +39 -0
  59. package/dist/web/index.d.ts +2 -0
  60. package/dist/web/tools/index.d.ts +1 -0
  61. package/dist/web.cjs.js +7 -0
  62. package/dist/web.esm.js +5 -0
  63. package/package.json +108 -0
@@ -0,0 +1,247 @@
1
+ if (!window.eko) {
2
+ window.eko = { lastMouseX: 0, lastMouseY: 0 };
3
+ }
4
+ eko.sub = function (event, callback) {
5
+ if (!eko.subListeners) {
6
+ eko.subListeners = {};
7
+ }
8
+ if (event && callback) {
9
+ eko.subListeners[event] = callback;
10
+ }
11
+ };
12
+ document.addEventListener('mousemove', (event) => {
13
+ eko.lastMouseX = event.clientX;
14
+ eko.lastMouseY = event.clientY;
15
+ });
16
+ chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
17
+ (async () => {
18
+ try {
19
+ switch (request.type) {
20
+ case 'eko:message': {
21
+ let result = null;
22
+ if (eko.subListeners && eko.subListeners[request.event]) {
23
+ try {
24
+ result = await eko.subListeners[request.event](request.params);
25
+ }
26
+ catch (e) {
27
+ console.log(e);
28
+ }
29
+ }
30
+ sendResponse(result);
31
+ break;
32
+ }
33
+ case 'page:getDetailLinks': {
34
+ let result = await eko.getDetailLinks(request.search);
35
+ sendResponse(result);
36
+ break;
37
+ }
38
+ case 'page:getContent': {
39
+ let result = await eko.getContent(request.search);
40
+ sendResponse(result);
41
+ break;
42
+ }
43
+ case 'computer:key': {
44
+ sendResponse(key(request));
45
+ break;
46
+ }
47
+ case 'computer:type': {
48
+ sendResponse(type(request));
49
+ break;
50
+ }
51
+ case 'computer:mouse_move': {
52
+ sendResponse(mouse_move(request));
53
+ break;
54
+ }
55
+ case 'computer:left_click': {
56
+ sendResponse(simulateMouseEvent(request, ['mousedown', 'mouseup', 'click'], 0));
57
+ break;
58
+ }
59
+ case 'computer:right_click': {
60
+ sendResponse(simulateMouseEvent(request, ['mousedown', 'mouseup', 'contextmenu'], 2));
61
+ break;
62
+ }
63
+ case 'computer:double_click': {
64
+ sendResponse(simulateMouseEvent(request, ['mousedown', 'mouseup', 'click', 'mousedown', 'mouseup', 'click', 'dblclick'], 0));
65
+ break;
66
+ }
67
+ case 'computer:left_click_drag': {
68
+ sendResponse(left_click_drag(request));
69
+ break;
70
+ }
71
+ case 'computer:scroll_to': {
72
+ sendResponse(scroll_to(request));
73
+ break;
74
+ }
75
+ case 'computer:cursor_position': {
76
+ sendResponse({ coordinate: [eko.lastMouseX, eko.lastMouseY] });
77
+ break;
78
+ }
79
+ }
80
+ }
81
+ catch (e) {
82
+ console.log('onMessage error', e);
83
+ sendResponse(false);
84
+ }
85
+ })();
86
+ return true;
87
+ });
88
+ function key(request) {
89
+ const event = new KeyboardEvent(request.keyEventType || 'keydown', {
90
+ key: request.key,
91
+ ctrlKey: request.ctrlKey,
92
+ altKey: request.altKey,
93
+ shiftKey: request.shiftKey,
94
+ metaKey: request.metaKey,
95
+ bubbles: true,
96
+ cancelable: true,
97
+ });
98
+ let coordinate = request.coordinate;
99
+ let element = (document.activeElement ||
100
+ document.elementFromPoint(coordinate[0], coordinate[1]));
101
+ if (element && element.focus) {
102
+ element.focus();
103
+ }
104
+ let result = element === null || element === void 0 ? void 0 : element.dispatchEvent(event);
105
+ console.log('key', element, request, result);
106
+ return result;
107
+ }
108
+ function type(request) {
109
+ let text = request.text;
110
+ let element;
111
+ if (request.xpath) {
112
+ let xpath = request.xpath;
113
+ let result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
114
+ element = result.singleNodeValue;
115
+ }
116
+ else {
117
+ let coordinate = request.coordinate;
118
+ element = document.elementFromPoint(coordinate[0], coordinate[1]) || document.activeElement;
119
+ }
120
+ if (!element) {
121
+ return;
122
+ }
123
+ let input;
124
+ if (element.tagName == 'INPUT' ||
125
+ element.tagName == 'TEXTAREA' ||
126
+ element.childElementCount == 0) {
127
+ input = element;
128
+ }
129
+ else {
130
+ input = element.querySelector('input') || element.querySelector('textarea') || element;
131
+ }
132
+ input.focus && input.focus();
133
+ if (!text) {
134
+ input.value = '';
135
+ }
136
+ else {
137
+ input.value += text;
138
+ }
139
+ let result = input.dispatchEvent(new Event('input', { bubbles: true }));
140
+ console.log('type', input, request, result);
141
+ return result;
142
+ }
143
+ function mouse_move(request) {
144
+ let coordinate = request.coordinate;
145
+ let x = coordinate[0];
146
+ let y = coordinate[1];
147
+ const event = new MouseEvent('mousemove', {
148
+ view: window,
149
+ bubbles: true,
150
+ cancelable: true,
151
+ screenX: x,
152
+ screenY: y,
153
+ clientX: x,
154
+ clientY: y,
155
+ });
156
+ let result = document.body.dispatchEvent(event);
157
+ console.log('mouse_move', document.body, request, result);
158
+ return result;
159
+ }
160
+ function simulateMouseEvent(request, eventTypes, button) {
161
+ let element;
162
+ if (request.xpath) {
163
+ let xpath = request.xpath;
164
+ let result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
165
+ element = result.singleNodeValue;
166
+ }
167
+ else {
168
+ let coordinate = request.coordinate;
169
+ element = document.elementFromPoint(coordinate[0], coordinate[1]) || document.body;
170
+ }
171
+ const x = undefined;
172
+ const y = undefined;
173
+ let result = false;
174
+ for (let i = 0; i < eventTypes.length; i++) {
175
+ const event = new MouseEvent(eventTypes[i], {
176
+ view: window,
177
+ bubbles: true,
178
+ cancelable: true,
179
+ clientX: x,
180
+ clientY: y,
181
+ button, // 0 left; 2 right
182
+ });
183
+ result = element.dispatchEvent(event);
184
+ console.log('simulateMouse', element, { ...request, eventTypes, button }, result);
185
+ }
186
+ return result;
187
+ }
188
+ function scroll_to(request) {
189
+ if (request.xpath) {
190
+ let xpath = request.xpath;
191
+ let result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
192
+ let element = result.singleNodeValue;
193
+ element.scrollIntoView({
194
+ behavior: 'smooth'
195
+ });
196
+ }
197
+ else {
198
+ const to_coordinate = request.to_coordinate;
199
+ window.scrollTo({
200
+ left: to_coordinate[0],
201
+ top: to_coordinate[1],
202
+ behavior: 'smooth',
203
+ });
204
+ }
205
+ console.log('scroll_to', request);
206
+ }
207
+ function left_click_drag(request, steps = 10) {
208
+ const from_coordinate = request.from_coordinate;
209
+ const to_coordinate = request.to_coordinate;
210
+ let startX = from_coordinate[0];
211
+ let startY = from_coordinate[1];
212
+ let endX = to_coordinate[0];
213
+ let endY = to_coordinate[1];
214
+ let element = document.elementFromPoint(startX, startY) || document.body;
215
+ const mouseDownEvent = new MouseEvent('mousedown', {
216
+ bubbles: true,
217
+ cancelable: true,
218
+ view: window,
219
+ clientX: startX,
220
+ clientY: startY,
221
+ button: 0,
222
+ });
223
+ element.dispatchEvent(mouseDownEvent);
224
+ for (let i = 1; i <= steps; i++) {
225
+ const intermediateX = startX + (endX - startX) * (i / steps);
226
+ const intermediateY = startY + (endY - startY) * (i / steps);
227
+ const dragEvent = new MouseEvent('mousemove', {
228
+ bubbles: true,
229
+ cancelable: true,
230
+ view: window,
231
+ clientX: intermediateX,
232
+ clientY: intermediateY,
233
+ button: 0,
234
+ });
235
+ element.dispatchEvent(dragEvent);
236
+ }
237
+ const mouseUpEvent = new MouseEvent('mouseup', {
238
+ bubbles: true,
239
+ cancelable: true,
240
+ view: window,
241
+ clientX: endX,
242
+ clientY: endY,
243
+ button: 0,
244
+ });
245
+ console.log('left_click_drag', request);
246
+ return element.dispatchEvent(mouseUpEvent);
247
+ }
@@ -0,0 +1,20 @@
1
+ export declare function can_use_computer(): Promise<boolean>;
2
+ export declare function key(key: string, coordinate?: [number, number]): Promise<boolean>;
3
+ export declare function type(text: string, coordinate?: [number, number]): Promise<boolean>;
4
+ export declare function mouse_move(coordinate: [number, number]): Promise<boolean>;
5
+ export declare function left_click(coordinate?: [number, number]): Promise<boolean>;
6
+ export declare function left_click_drag(coordinate: [number, number]): Promise<boolean>;
7
+ export declare function right_click(coordinate?: [number, number]): Promise<boolean>;
8
+ export declare function double_click(coordinate?: [number, number]): Promise<boolean>;
9
+ export declare function screenshot(windowId?: number): Promise<{
10
+ image: {
11
+ type: 'base64';
12
+ media_type: 'image/png' | 'image/jpeg';
13
+ data: string;
14
+ };
15
+ }>;
16
+ export declare function cursor_position(): Promise<{
17
+ coordinate: [number, number];
18
+ }>;
19
+ export declare function size(): Promise<[number, number]>;
20
+ export declare function scroll(coordinate: [number, number]): Promise<boolean>;
@@ -0,0 +1,6 @@
1
+ import * as computer from './computer';
2
+ import { ComputerUse } from './tools/computer_use';
3
+ export { ComputerUse };
4
+ export declare const fellou: {
5
+ computer: typeof computer;
6
+ };
@@ -0,0 +1,18 @@
1
+ import { ComputerUseParam, ComputerUseResult } from '../../types/tools.types';
2
+ import { Tool, InputSchema, ExecutionContext } from '../../types/action.types';
3
+ /**
4
+ * Computer Use for fellou
5
+ */
6
+ export declare class ComputerUse implements Tool<ComputerUseParam, ComputerUseResult> {
7
+ name: string;
8
+ description: string;
9
+ input_schema: InputSchema;
10
+ constructor();
11
+ /**
12
+ * computer
13
+ *
14
+ * @param {*} params { action: 'mouse_move', coordinate: [100, 200] }
15
+ * @returns { success: true, coordinate?: [], image?: { type: 'base64', media_type: 'image/jpeg', data: '/9j...' } }
16
+ */
17
+ execute(context: ExecutionContext, params: ComputerUseParam): Promise<ComputerUseResult>;
18
+ }
@@ -0,0 +1,2 @@
1
+ import { ComputerUse } from './computer_use';
2
+ export { ComputerUse };
@@ -0,0 +1,238 @@
1
+ 'use strict';
2
+
3
+ async function can_use_computer() {
4
+ try {
5
+ await size();
6
+ return true;
7
+ }
8
+ catch (e) {
9
+ return false;
10
+ }
11
+ }
12
+ async function key(key, coordinate) {
13
+ if (coordinate) {
14
+ await mouse_move(coordinate);
15
+ }
16
+ let mapping = {
17
+ space: ' ',
18
+ return: 'enter',
19
+ page_up: 'pageup',
20
+ page_down: 'pagedown',
21
+ back_space: 'backspace',
22
+ };
23
+ let keys = key.replace(/\s+/g, ' ').split(' ');
24
+ let success = false;
25
+ for (let i = 0; i < keys.length; i++) {
26
+ let _key = keys[i];
27
+ if (_key.indexOf('+') > -1) {
28
+ let mapped_keys = _key
29
+ .split('+')
30
+ .map((k) => mapping[k] || k)
31
+ .reverse();
32
+ success = (await runComputeruseCommand('keyTap', mapped_keys)).success;
33
+ }
34
+ else {
35
+ let mapped_key = mapping[_key] || _key;
36
+ success = (await runComputeruseCommand('keyTap', [mapped_key])).success;
37
+ }
38
+ await new Promise((resolve) => setTimeout(() => resolve(), 100));
39
+ }
40
+ return success;
41
+ }
42
+ async function type(text, coordinate) {
43
+ if (coordinate) {
44
+ await mouse_move(coordinate);
45
+ }
46
+ return (await runComputeruseCommand('typeString', [text])).success;
47
+ }
48
+ async function mouse_move(coordinate) {
49
+ return (await runComputeruseCommand('move', coordinate)).success;
50
+ }
51
+ async function left_click(coordinate) {
52
+ if (coordinate && coordinate.length > 0) {
53
+ await mouse_move(coordinate);
54
+ }
55
+ return (await runComputeruseCommand('click', ['left'])).success;
56
+ }
57
+ async function left_click_drag(coordinate) {
58
+ return (await runComputeruseCommand('dragSmooth', coordinate)).success;
59
+ }
60
+ async function right_click(coordinate) {
61
+ if (coordinate && coordinate.length > 0) {
62
+ await mouse_move(coordinate);
63
+ }
64
+ return (await runComputeruseCommand('click', ['right'])).success;
65
+ }
66
+ async function double_click(coordinate) {
67
+ if (coordinate && coordinate.length > 0) {
68
+ await mouse_move(coordinate);
69
+ }
70
+ return (await runComputeruseCommand('click', ['left', true])).success;
71
+ }
72
+ async function screenshot(windowId) {
73
+ let screenshot = (await runComputeruseCommand('captureFullScreen')).data;
74
+ let dataUrl = screenshot.startsWith('data:') ? screenshot : 'data:image/png;base64,' + screenshot;
75
+ let data = dataUrl.substring(dataUrl.indexOf('base64,') + 7);
76
+ return {
77
+ image: {
78
+ type: 'base64',
79
+ media_type: dataUrl.indexOf('image/png') > -1 ? 'image/png' : 'image/jpeg',
80
+ data: data,
81
+ },
82
+ };
83
+ }
84
+ async function cursor_position() {
85
+ let response = await runComputeruseCommand('mouseLocation');
86
+ return { coordinate: [response.data.x, response.data.y] };
87
+ }
88
+ async function size() {
89
+ let response = await runComputeruseCommand('getScreenSize');
90
+ return [response.data.width, response.data.height];
91
+ }
92
+ async function scroll(coordinate) {
93
+ return (await runComputeruseCommand('scrollTo', coordinate)).success;
94
+ }
95
+ async function runComputeruseCommand(func, args) {
96
+ let result = (await window.fellou.ai.computeruse.runCommand({
97
+ func,
98
+ args,
99
+ }));
100
+ if (result.error) {
101
+ // error: 'permission-error'
102
+ throw new Error(result.error);
103
+ }
104
+ return result;
105
+ }
106
+
107
+ var computer = /*#__PURE__*/Object.freeze({
108
+ __proto__: null,
109
+ can_use_computer: can_use_computer,
110
+ cursor_position: cursor_position,
111
+ double_click: double_click,
112
+ key: key,
113
+ left_click: left_click,
114
+ left_click_drag: left_click_drag,
115
+ mouse_move: mouse_move,
116
+ right_click: right_click,
117
+ screenshot: screenshot,
118
+ scroll: scroll,
119
+ size: size,
120
+ type: type
121
+ });
122
+
123
+ /**
124
+ * Computer Use for fellou
125
+ */
126
+ class ComputerUse {
127
+ constructor() {
128
+ this.name = 'computer_use';
129
+ this.description = `Use a mouse and keyboard to interact with a computer, and take screenshots.
130
+ * This is a browser GUI interface where you do not have access to the address bar or bookmarks. You must operate the browser using inputs like screenshots, mouse, keyboard, etc.
131
+ * Some operations may take time to process, so you may need to wait and take successive screenshots to see the results of your actions. E.g. if you clicked submit button, but it didn't work, try taking another screenshot.
132
+ * Whenever you intend to move the cursor to click on an element, you should consult a screenshot to determine the coordinates of the element before moving the cursor.
133
+ * If you tried clicking on a button or link but it failed to load, even after waiting, try adjusting your cursor position so that the tip of the cursor visually falls on the element that you want to click.
134
+ * Make sure to click any buttons, links, icons, etc with the cursor tip in the center of the element.`;
135
+ this.input_schema = {
136
+ type: 'object',
137
+ properties: {
138
+ action: {
139
+ type: 'string',
140
+ description: `The action to perform. The available actions are:
141
+ * \`key\`: Press a key or key-combination on the keyboard.
142
+ - This supports robotgo hotkey syntax.
143
+ - Multiple keys are combined using the "+" symbol.
144
+ - Examples: "a", "enter", "ctrl+s", "command+shift+a", "num0".
145
+ * \`type\`: Type a string of text on the keyboard.
146
+ * \`cursor_position\`: Get the current (x, y) pixel coordinate of the cursor on the screen.
147
+ * \`mouse_move\`: Move the cursor to a specified (x, y) pixel coordinate on the screen.
148
+ * \`left_click\`: Click the left mouse button.
149
+ * \`left_click_drag\`: Click and drag the cursor to a specified (x, y) pixel coordinate on the screen.
150
+ * \`right_click\`: Click the right mouse button.
151
+ * \`double_click\`: Double-click the left mouse button.
152
+ * \`screenshot\`: Take a screenshot of the screen.
153
+ * \`scroll\`: Scroll to the specified (x, y) pixel coordinates on the screen.`,
154
+ enum: [
155
+ 'key',
156
+ 'type',
157
+ 'mouse_move',
158
+ 'left_click',
159
+ 'left_click_drag',
160
+ 'right_click',
161
+ 'double_click',
162
+ 'screenshot',
163
+ 'cursor_position',
164
+ 'scroll',
165
+ ],
166
+ },
167
+ coordinate: {
168
+ type: 'array',
169
+ description: '(x, y): The x (pixels from the left edge) and y (pixels from the top edge) coordinates to move the mouse to.',
170
+ },
171
+ text: {
172
+ type: 'string',
173
+ description: 'Required only by `action=type` and `action=key`',
174
+ },
175
+ },
176
+ required: ['action'],
177
+ };
178
+ }
179
+ /**
180
+ * computer
181
+ *
182
+ * @param {*} params { action: 'mouse_move', coordinate: [100, 200] }
183
+ * @returns { success: true, coordinate?: [], image?: { type: 'base64', media_type: 'image/jpeg', data: '/9j...' } }
184
+ */
185
+ async execute(context, params) {
186
+ if (params === null || !params.action) {
187
+ throw new Error('Invalid parameters. Expected an object with a "action" property.');
188
+ }
189
+ let result;
190
+ switch (params.action) {
191
+ case 'key':
192
+ result = await key(params.text, params.coordinate);
193
+ break;
194
+ case 'type':
195
+ result = await type(params.text, params.coordinate);
196
+ break;
197
+ case 'mouse_move':
198
+ result = await mouse_move(params.coordinate);
199
+ break;
200
+ case 'left_click':
201
+ result = await left_click(params.coordinate);
202
+ break;
203
+ case 'left_click_drag':
204
+ result = await left_click_drag(params.coordinate);
205
+ break;
206
+ case 'right_click':
207
+ result = await right_click(params.coordinate);
208
+ break;
209
+ case 'double_click':
210
+ result = await double_click(params.coordinate);
211
+ break;
212
+ case 'screenshot':
213
+ result = await screenshot();
214
+ break;
215
+ case 'cursor_position':
216
+ result = await cursor_position();
217
+ break;
218
+ case 'scroll':
219
+ result = await scroll(params.coordinate);
220
+ break;
221
+ default:
222
+ throw Error(`Invalid parameters. The "${params.action}" value is not included in the "action" enumeration.`);
223
+ }
224
+ if (typeof result == 'boolean') {
225
+ return { success: result };
226
+ }
227
+ else {
228
+ return { success: true, ...result };
229
+ }
230
+ }
231
+ }
232
+
233
+ const fellou = {
234
+ computer,
235
+ };
236
+
237
+ exports.ComputerUse = ComputerUse;
238
+ exports.fellou = fellou;