@eko-ai/eko 1.0.8 → 1.0.10

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 (300) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +139 -131
  3. package/dist/core/eko.d.ts +3 -2
  4. package/dist/extension/script/bing.js +0 -0
  5. package/dist/extension/script/build_dom_tree.js +661 -661
  6. package/dist/extension/script/common.js +0 -0
  7. package/dist/extension/script/duckduckgo.js +0 -0
  8. package/dist/extension/script/google.js +0 -0
  9. package/dist/extension/tools/cancel_workflow.d.ts +9 -0
  10. package/dist/extension/tools/get_all_tabs.d.ts +9 -0
  11. package/dist/extension/tools/index.d.ts +3 -1
  12. package/dist/extension/tools/tab_management.d.ts +1 -1
  13. package/dist/extension/utils.d.ts +1 -1
  14. package/dist/extension.cjs.js +749 -278
  15. package/dist/extension.esm.js +749 -278
  16. package/dist/extension_content_script.js +55 -55
  17. package/dist/fellou.cjs.js +18 -18
  18. package/dist/fellou.esm.js +18 -18
  19. package/dist/index.cjs.js +2034 -1609
  20. package/dist/index.d.ts +3 -1
  21. package/dist/index.esm.js +2033 -1610
  22. package/dist/jest.config.js +10 -0
  23. package/dist/jest.config.js.map +1 -0
  24. package/dist/models/action.d.ts +8 -4
  25. package/dist/models/workflow.d.ts +8 -3
  26. package/dist/nodejs/tools/index.d.ts +1 -0
  27. package/dist/nodejs.cjs.js +1832 -1623
  28. package/dist/nodejs.esm.js +1832 -1623
  29. package/dist/rollup.config.js +171 -0
  30. package/dist/rollup.config.js.map +1 -0
  31. package/dist/schemas/workflow.schema.d.ts +2 -13
  32. package/dist/script.js +10 -0
  33. package/dist/script.js.map +1 -0
  34. package/dist/services/llm/claude-provider.d.ts +2 -1
  35. package/dist/services/llm/deepseek-provider.d.ts +13 -0
  36. package/dist/services/llm/openai-provider.d.ts +2 -1
  37. package/dist/services/llm/provider-factory.d.ts +4 -0
  38. package/dist/services/llm/siliconflow-provider.d.ts +13 -0
  39. package/dist/services/parser/workflow-parser.d.ts +0 -7
  40. package/dist/services/workflow/generator.d.ts +1 -0
  41. package/dist/src/core/eko.js +99 -0
  42. package/dist/src/core/eko.js.map +1 -0
  43. package/dist/src/core/tool-registry.js +51 -0
  44. package/dist/src/core/tool-registry.js.map +1 -0
  45. package/dist/src/extension/content/index.js +409 -0
  46. package/dist/src/extension/content/index.js.map +1 -0
  47. package/dist/src/extension/core.js +29 -0
  48. package/dist/src/extension/core.js.map +1 -0
  49. package/dist/src/extension/index.js +12 -0
  50. package/dist/src/extension/index.js.map +1 -0
  51. package/dist/src/extension/script/bing.js +25 -0
  52. package/dist/src/extension/script/bing.js.map +1 -0
  53. package/dist/src/extension/script/build_dom_tree.js +585 -0
  54. package/dist/src/extension/script/build_dom_tree.js.map +1 -0
  55. package/dist/src/extension/script/common.js +203 -0
  56. package/dist/src/extension/script/common.js.map +1 -0
  57. package/dist/src/extension/script/duckduckgo.js +25 -0
  58. package/dist/src/extension/script/duckduckgo.js.map +1 -0
  59. package/dist/src/extension/script/google.js +26 -0
  60. package/dist/src/extension/script/google.js.map +1 -0
  61. package/dist/src/extension/tools/browser.js +174 -0
  62. package/dist/src/extension/tools/browser.js.map +1 -0
  63. package/dist/src/extension/tools/browser_use.js +186 -0
  64. package/dist/src/extension/tools/browser_use.js.map +1 -0
  65. package/dist/src/extension/tools/element_click.js +123 -0
  66. package/dist/src/extension/tools/element_click.js.map +1 -0
  67. package/dist/src/extension/tools/export_file.js +93 -0
  68. package/dist/src/extension/tools/export_file.js.map +1 -0
  69. package/dist/src/extension/tools/extract_content.js +38 -0
  70. package/dist/src/extension/tools/extract_content.js.map +1 -0
  71. package/dist/src/extension/tools/find_element_position.js +125 -0
  72. package/dist/src/extension/tools/find_element_position.js.map +1 -0
  73. package/dist/src/extension/tools/html_script.js +219 -0
  74. package/dist/src/extension/tools/html_script.js.map +1 -0
  75. package/dist/src/extension/tools/index.js +12 -0
  76. package/dist/src/extension/tools/index.js.map +1 -0
  77. package/dist/src/extension/tools/open_url.js +68 -0
  78. package/dist/src/extension/tools/open_url.js.map +1 -0
  79. package/dist/src/extension/tools/request_login.js +87 -0
  80. package/dist/src/extension/tools/request_login.js.map +1 -0
  81. package/dist/src/extension/tools/screenshot.js +26 -0
  82. package/dist/src/extension/tools/screenshot.js.map +1 -0
  83. package/dist/src/extension/tools/tab_management.js +160 -0
  84. package/dist/src/extension/tools/tab_management.js.map +1 -0
  85. package/dist/src/extension/tools/web_search.js +281 -0
  86. package/dist/src/extension/tools/web_search.js.map +1 -0
  87. package/dist/src/extension/utils.js +244 -0
  88. package/dist/src/extension/utils.js.map +1 -0
  89. package/dist/src/fellou/computer.js +104 -0
  90. package/dist/src/fellou/computer.js.map +1 -0
  91. package/dist/src/fellou/index.js +7 -0
  92. package/dist/src/fellou/index.js.map +1 -0
  93. package/dist/src/fellou/tools/computer_use.js +111 -0
  94. package/dist/src/fellou/tools/computer_use.js.map +1 -0
  95. package/dist/src/index.js +9 -0
  96. package/dist/src/index.js.map +1 -0
  97. package/dist/src/models/action.js +364 -0
  98. package/dist/src/models/action.js.map +1 -0
  99. package/dist/src/models/workflow.js +120 -0
  100. package/dist/src/models/workflow.js.map +1 -0
  101. package/dist/src/nodejs/core.js +18 -0
  102. package/dist/src/nodejs/core.js.map +1 -0
  103. package/dist/src/nodejs/index.js +6 -0
  104. package/dist/src/nodejs/index.js.map +1 -0
  105. package/dist/src/nodejs/script/build_dom_tree.js +586 -0
  106. package/dist/src/nodejs/script/build_dom_tree.js.map +1 -0
  107. package/dist/src/nodejs/tools/browser_use.js +458 -0
  108. package/dist/src/nodejs/tools/browser_use.js.map +1 -0
  109. package/dist/src/nodejs/tools/command_execute.js +65 -0
  110. package/dist/src/nodejs/tools/command_execute.js.map +1 -0
  111. package/dist/src/nodejs/tools/file_read.js +45 -0
  112. package/dist/src/nodejs/tools/file_read.js.map +1 -0
  113. package/dist/src/nodejs/tools/file_write.js +95 -0
  114. package/dist/src/nodejs/tools/file_write.js.map +1 -0
  115. package/dist/src/nodejs/tools/index.js +5 -0
  116. package/dist/src/nodejs/tools/index.js.map +1 -0
  117. package/dist/src/schemas/workflow.schema.js +64 -0
  118. package/dist/src/schemas/workflow.schema.js.map +1 -0
  119. package/dist/src/services/llm/claude-provider.js +140 -0
  120. package/dist/src/services/llm/claude-provider.js.map +1 -0
  121. package/dist/src/services/llm/deepseek-provider.js +432 -0
  122. package/dist/src/services/llm/deepseek-provider.js.map +1 -0
  123. package/dist/src/services/llm/glm-provider.js +317 -0
  124. package/dist/src/services/llm/glm-provider.js.map +1 -0
  125. package/dist/src/services/llm/openai-provider copy.js +317 -0
  126. package/dist/src/services/llm/openai-provider copy.js.map +1 -0
  127. package/dist/src/services/llm/openai-provider.js +317 -0
  128. package/dist/src/services/llm/openai-provider.js.map +1 -0
  129. package/dist/src/services/parser/workflow-parser.js +208 -0
  130. package/dist/src/services/parser/workflow-parser.js.map +1 -0
  131. package/dist/src/services/workflow/generator.js +105 -0
  132. package/dist/src/services/workflow/generator.js.map +1 -0
  133. package/dist/src/services/workflow/templates.js +42 -0
  134. package/dist/src/services/workflow/templates.js.map +1 -0
  135. package/dist/src/types/action.types.js +2 -0
  136. package/dist/src/types/action.types.js.map +1 -0
  137. package/dist/src/types/eko.types.js +2 -0
  138. package/dist/src/types/eko.types.js.map +1 -0
  139. package/dist/src/types/index.js +6 -0
  140. package/dist/src/types/index.js.map +1 -0
  141. package/dist/src/types/llm.types.js +2 -0
  142. package/dist/src/types/llm.types.js.map +1 -0
  143. package/dist/src/types/parser.types.js +2 -0
  144. package/dist/src/types/parser.types.js.map +1 -0
  145. package/dist/src/types/tools.types.js +2 -0
  146. package/dist/src/types/tools.types.js.map +1 -0
  147. package/dist/src/types/workflow.types.js +3 -0
  148. package/dist/src/types/workflow.types.js.map +1 -0
  149. package/dist/src/web/core.js +18 -0
  150. package/dist/src/web/core.js.map +1 -0
  151. package/dist/src/web/index.js +9 -0
  152. package/dist/src/web/index.js.map +1 -0
  153. package/dist/src/web/script/build_dom_tree.js +584 -0
  154. package/dist/src/web/script/build_dom_tree.js.map +1 -0
  155. package/dist/src/web/tools/browser.js +249 -0
  156. package/dist/src/web/tools/browser.js.map +1 -0
  157. package/dist/src/web/tools/browser_use.js +176 -0
  158. package/dist/src/web/tools/browser_use.js.map +1 -0
  159. package/dist/src/web/tools/element_click.js +121 -0
  160. package/dist/src/web/tools/element_click.js.map +1 -0
  161. package/dist/src/web/tools/export_file.js +74 -0
  162. package/dist/src/web/tools/export_file.js.map +1 -0
  163. package/dist/src/web/tools/extract_content.js +24 -0
  164. package/dist/src/web/tools/extract_content.js.map +1 -0
  165. package/dist/src/web/tools/find_element_position.js +121 -0
  166. package/dist/src/web/tools/find_element_position.js.map +1 -0
  167. package/dist/src/web/tools/html_script.js +219 -0
  168. package/dist/src/web/tools/html_script.js.map +1 -0
  169. package/dist/src/web/tools/index.js +8 -0
  170. package/dist/src/web/tools/index.js.map +1 -0
  171. package/dist/src/web/tools/screenshot.js +24 -0
  172. package/dist/src/web/tools/screenshot.js.map +1 -0
  173. package/dist/test/integration/claude-provider.test.js +170 -0
  174. package/dist/test/integration/claude-provider.test.js.map +1 -0
  175. package/dist/test/integration/deepseek-provider.test.js +171 -0
  176. package/dist/test/integration/deepseek-provider.test.js.map +1 -0
  177. package/dist/test/integration/glm-provider.test.js +173 -0
  178. package/dist/test/integration/glm-provider.test.js.map +1 -0
  179. package/dist/test/integration/openai-provider.test copy.js +170 -0
  180. package/dist/test/integration/openai-provider.test copy.js.map +1 -0
  181. package/dist/test/integration/openai-provider.test.js +170 -0
  182. package/dist/test/integration/openai-provider.test.js.map +1 -0
  183. package/dist/test/integration/qwen-provider.js +170 -0
  184. package/dist/test/integration/qwen-provider.js.map +1 -0
  185. package/dist/test/integration/qwen-provider.test copy.js +170 -0
  186. package/dist/test/integration/qwen-provider.test copy.js.map +1 -0
  187. package/dist/test/integration/qwen-provider.test.js +170 -0
  188. package/dist/test/integration/qwen-provider.test.js.map +1 -0
  189. package/dist/test/integration/workflow.execution.test.js +152 -0
  190. package/dist/test/integration/workflow.execution.test.js.map +1 -0
  191. package/dist/test/integration/workflow.generation-and-execution.test.js +131 -0
  192. package/dist/test/integration/workflow.generation-and-execution.test.js.map +1 -0
  193. package/dist/test/integration/workflow.generator.test.js +207 -0
  194. package/dist/test/integration/workflow.generator.test.js.map +1 -0
  195. package/dist/test/unit/action.test.js +186 -0
  196. package/dist/test/unit/action.test.js.map +1 -0
  197. package/dist/test/unit/tool-registry.test.js +99 -0
  198. package/dist/test/unit/tool-registry.test.js.map +1 -0
  199. package/dist/test/unit/workflow-parser.test.js +189 -0
  200. package/dist/test/unit/workflow-parser.test.js.map +1 -0
  201. package/dist/test/unit/workflow.test.js +102 -0
  202. package/dist/test/unit/workflow.test.js.map +1 -0
  203. package/dist/types/action.types.d.ts +8 -3
  204. package/dist/types/jest.config.d.ts +10 -0
  205. package/dist/types/rollup.config.d.ts +16 -0
  206. package/dist/types/script.d.ts +1 -0
  207. package/dist/types/src/core/eko.d.ts +20 -0
  208. package/dist/types/src/core/tool-registry.d.ts +13 -0
  209. package/dist/types/src/extension/content/index.d.ts +16 -0
  210. package/dist/types/src/extension/core.d.ts +11 -0
  211. package/dist/types/src/extension/index.d.ts +7 -0
  212. package/dist/types/src/extension/script/bing.d.ts +0 -0
  213. package/dist/types/src/extension/script/build_dom_tree.d.ts +38 -0
  214. package/dist/types/src/extension/script/common.d.ts +0 -0
  215. package/dist/types/src/extension/script/duckduckgo.d.ts +0 -0
  216. package/dist/types/src/extension/script/google.d.ts +0 -0
  217. package/dist/types/src/extension/tools/browser.d.ts +22 -0
  218. package/dist/types/src/extension/tools/browser_use.d.ts +19 -0
  219. package/dist/types/src/extension/tools/element_click.d.ts +12 -0
  220. package/dist/types/src/extension/tools/export_file.d.ts +18 -0
  221. package/dist/types/src/extension/tools/extract_content.d.ts +18 -0
  222. package/dist/types/src/extension/tools/find_element_position.d.ts +12 -0
  223. package/dist/types/src/extension/tools/html_script.d.ts +10 -0
  224. package/dist/types/src/extension/tools/index.d.ts +11 -0
  225. package/dist/types/src/extension/tools/open_url.d.ts +18 -0
  226. package/dist/{extension/tools/form_autofill.d.ts → types/src/extension/tools/request_login.d.ts} +3 -4
  227. package/dist/types/src/extension/tools/screenshot.d.ts +18 -0
  228. package/dist/types/src/extension/tools/tab_management.d.ts +19 -0
  229. package/dist/types/src/extension/tools/web_search.d.ts +18 -0
  230. package/dist/types/src/extension/utils.d.ts +31 -0
  231. package/dist/types/src/fellou/computer.d.ts +20 -0
  232. package/dist/types/src/fellou/index.d.ts +6 -0
  233. package/dist/types/src/fellou/tools/computer_use.d.ts +18 -0
  234. package/dist/types/src/index.d.ts +8 -0
  235. package/dist/types/src/models/action.d.ts +22 -0
  236. package/dist/types/src/models/workflow.d.ts +16 -0
  237. package/dist/types/src/nodejs/core.d.ts +2 -0
  238. package/dist/types/src/nodejs/index.d.ts +3 -0
  239. package/dist/types/src/nodejs/script/build_dom_tree.d.ts +1 -0
  240. package/dist/types/src/nodejs/tools/browser_use.d.ts +28 -0
  241. package/dist/types/src/nodejs/tools/command_execute.d.ts +12 -0
  242. package/dist/types/src/nodejs/tools/file_read.d.ts +11 -0
  243. package/dist/types/src/nodejs/tools/file_write.d.ts +15 -0
  244. package/dist/types/src/nodejs/tools/index.d.ts +4 -0
  245. package/dist/types/src/schemas/workflow.schema.d.ts +88 -0
  246. package/dist/types/src/services/llm/claude-provider.d.ts +11 -0
  247. package/dist/types/src/services/llm/deepseek-provider.d.ts +15 -0
  248. package/dist/types/src/services/llm/glm-provider.d.ts +11 -0
  249. package/dist/types/src/services/llm/openai-provider copy.d.ts +11 -0
  250. package/dist/types/src/services/llm/openai-provider.d.ts +11 -0
  251. package/dist/types/src/services/parser/workflow-parser.d.ts +29 -0
  252. package/dist/types/src/services/workflow/generator.d.ts +13 -0
  253. package/dist/types/src/services/workflow/templates.d.ts +8 -0
  254. package/dist/types/src/types/action.types.d.ts +38 -0
  255. package/dist/types/src/types/eko.types.d.ts +21 -0
  256. package/dist/types/src/types/index.d.ts +5 -0
  257. package/dist/types/src/types/llm.types.d.ts +54 -0
  258. package/dist/types/src/types/parser.types.d.ts +9 -0
  259. package/dist/types/src/types/tools.types.d.ts +88 -0
  260. package/dist/types/src/types/workflow.types.d.ts +39 -0
  261. package/dist/types/src/web/core.d.ts +2 -0
  262. package/dist/types/src/web/index.d.ts +5 -0
  263. package/dist/types/src/web/script/build_dom_tree.d.ts +10 -0
  264. package/dist/types/src/web/tools/browser.d.ts +21 -0
  265. package/dist/types/src/web/tools/browser_use.d.ts +19 -0
  266. package/dist/types/src/web/tools/element_click.d.ts +12 -0
  267. package/dist/types/src/web/tools/export_file.d.ts +18 -0
  268. package/dist/types/src/web/tools/extract_content.d.ts +17 -0
  269. package/dist/types/src/web/tools/find_element_position.d.ts +12 -0
  270. package/dist/types/src/web/tools/html_script.d.ts +10 -0
  271. package/dist/types/src/web/tools/index.d.ts +7 -0
  272. package/dist/types/src/web/tools/screenshot.d.ts +18 -0
  273. package/dist/types/test/integration/claude-provider.test.d.ts +1 -0
  274. package/dist/types/test/integration/deepseek-provider.test.d.ts +1 -0
  275. package/dist/types/test/integration/glm-provider.test.d.ts +1 -0
  276. package/dist/types/test/integration/openai-provider.test copy.d.ts +1 -0
  277. package/dist/types/test/integration/openai-provider.test.d.ts +1 -0
  278. package/dist/types/test/integration/qwen-provider.d.ts +1 -0
  279. package/dist/types/test/integration/qwen-provider.test copy.d.ts +1 -0
  280. package/dist/types/test/integration/qwen-provider.test.d.ts +1 -0
  281. package/dist/types/test/integration/workflow.execution.test.d.ts +1 -0
  282. package/dist/types/test/integration/workflow.generation-and-execution.test.d.ts +1 -0
  283. package/dist/types/test/integration/workflow.generator.test.d.ts +1 -0
  284. package/dist/types/test/unit/action.test.d.ts +1 -0
  285. package/dist/types/test/unit/tool-registry.test.d.ts +1 -0
  286. package/dist/types/test/unit/workflow-parser.test.d.ts +1 -0
  287. package/dist/types/test/unit/workflow.test.d.ts +1 -0
  288. package/dist/types/tools.types.d.ts +44 -1
  289. package/dist/types/workflow.types.d.ts +22 -9
  290. package/dist/universal_tools/cancel_workflow.d.ts +9 -0
  291. package/dist/universal_tools/human/text.d.ts +9 -0
  292. package/dist/universal_tools/human.d.ts +30 -0
  293. package/dist/universal_tools/index.d.ts +4 -0
  294. package/dist/universal_tools/summary_workflow.d.ts +9 -0
  295. package/dist/utils/execution-logger.d.ts +69 -0
  296. package/dist/web.cjs.js +117 -117
  297. package/dist/web.esm.js +117 -117
  298. package/package.json +106 -107
  299. package/dist/fellou/tools/index.d.ts +0 -2
  300. package/dist/types/framework.types.d.ts +0 -11
@@ -0,0 +1,68 @@
1
+ import { getWindowId, open_new_tab } from '../utils';
2
+ /**
3
+ * Open Url
4
+ */
5
+ export class OpenUrl {
6
+ constructor() {
7
+ this.name = 'open_url';
8
+ this.description = 'Open the specified URL link in browser window';
9
+ this.input_schema = {
10
+ type: 'object',
11
+ properties: {
12
+ url: {
13
+ type: 'string',
14
+ description: 'URL link address',
15
+ },
16
+ newWindow: {
17
+ type: 'boolean',
18
+ description: 'true: Open in a new window; false: Open in the current window.',
19
+ },
20
+ },
21
+ required: ['url'],
22
+ };
23
+ }
24
+ /**
25
+ * Open Url
26
+ *
27
+ * @param {*} params { url: 'https://www.google.com', newWindow: true }
28
+ * @returns > { tabId, windowId, title, success: true }
29
+ */
30
+ async execute(context, params) {
31
+ if (typeof params !== 'object' || params === null || !params.url) {
32
+ throw new Error('Invalid parameters. Expected an object with a "url" property.');
33
+ }
34
+ let url = params.url;
35
+ let newWindow = params.newWindow;
36
+ if (!newWindow && !context.variables.get('windowId') && !context.variables.get('tabId')) {
37
+ // First mandatory opening of a new window
38
+ newWindow = true;
39
+ }
40
+ let tab;
41
+ if (newWindow) {
42
+ tab = await open_new_tab(url, true);
43
+ }
44
+ else {
45
+ let windowId = await getWindowId(context);
46
+ tab = await open_new_tab(url, false, windowId);
47
+ }
48
+ let windowId = tab.windowId;
49
+ let tabId = tab.id;
50
+ context.variables.set('windowId', windowId);
51
+ context.variables.set('tabId', tabId);
52
+ if (newWindow) {
53
+ let windowIds = context.variables.get('windowIds');
54
+ if (windowIds) {
55
+ windowIds.push(windowId);
56
+ }
57
+ else {
58
+ context.variables.set('windowIds', [windowId]);
59
+ }
60
+ }
61
+ return {
62
+ tabId,
63
+ windowId,
64
+ title: tab.title,
65
+ };
66
+ }
67
+ }
68
+ //# sourceMappingURL=open_url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open_url.js","sourceRoot":"","sources":["../../../../src/extension/tools/open_url.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAErD;;GAEG;AACH,MAAM,OAAO,OAAO;IAKlB;QACE,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,+CAA+C,CAAC;QACnE,IAAI,CAAC,YAAY,GAAG;YAClB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kBAAkB;iBAChC;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,gEAAgE;iBAC9E;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;SAClB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,OAAyB,EAAE,MAAoB;QAC3D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACrB,IAAI,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACxF,0CAA0C;YAC1C,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,GAAoB,CAAC;QACzB,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;YAC1C,GAAG,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAkB,CAAC;QACtC,IAAI,KAAK,GAAG,GAAG,CAAC,EAAY,CAAC;QAC7B,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC5C,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAkB,CAAC;YACpE,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAkB,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QACD,OAAO;YACL,KAAK;YACL,QAAQ;YACR,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,87 @@
1
+ import { getTabId, getWindowId, doesTabExists } from '../utils';
2
+ import { screenshot } from './browser';
3
+ export class RequestLogin {
4
+ constructor() {
5
+ this.name = 'request_login';
6
+ this.description =
7
+ 'Login to this website, assist with identity verification when manual intervention is needed, guide users through the login process, and wait for their confirmation of successful login.';
8
+ this.input_schema = {
9
+ type: 'object',
10
+ properties: {},
11
+ };
12
+ }
13
+ async execute(context, params) {
14
+ if (!params.force && await this.isLoginIn(context)) {
15
+ return true;
16
+ }
17
+ let tabId = await getTabId(context);
18
+ let task_id = 'login_required_' + tabId;
19
+ const request_user_help = async () => {
20
+ await chrome.tabs.sendMessage(tabId, {
21
+ type: 'request_user_help',
22
+ task_id,
23
+ failure_type: 'login_required',
24
+ failure_message: 'Access page require user authentication.',
25
+ });
26
+ };
27
+ const login_interval = setInterval(async () => {
28
+ try {
29
+ request_user_help();
30
+ }
31
+ catch (e) {
32
+ clearInterval(login_interval);
33
+ }
34
+ }, 2000);
35
+ try {
36
+ return await this.awaitLogin(tabId, task_id);
37
+ }
38
+ finally {
39
+ clearInterval(login_interval);
40
+ }
41
+ }
42
+ async awaitLogin(tabId, task_id) {
43
+ return new Promise((resolve) => {
44
+ const checkTabClosedInterval = setInterval(async () => {
45
+ const tabExists = await doesTabExists(tabId);
46
+ if (!tabExists) {
47
+ clearInterval(checkTabClosedInterval);
48
+ resolve(false);
49
+ chrome.runtime.onMessage.removeListener(listener);
50
+ }
51
+ }, 1000);
52
+ const listener = (message) => {
53
+ if (message.type === 'issue_resolved' && message.task_id === task_id) {
54
+ resolve(true);
55
+ clearInterval(checkTabClosedInterval);
56
+ }
57
+ };
58
+ chrome.runtime.onMessage.addListener(listener);
59
+ });
60
+ }
61
+ async isLoginIn(context) {
62
+ let windowId = await getWindowId(context);
63
+ let screenshot_result = await screenshot(windowId, true);
64
+ let messages = [
65
+ {
66
+ role: 'user',
67
+ content: [
68
+ {
69
+ type: 'image',
70
+ source: screenshot_result.image,
71
+ },
72
+ {
73
+ type: 'text',
74
+ text: 'Check if the current website is logged in. If not logged in, output `NOT_LOGIN`. If logged in, output `LOGGED_IN`. Output directly without explanation.',
75
+ },
76
+ ],
77
+ },
78
+ ];
79
+ let response = await context.llmProvider.generateText(messages, { maxTokens: 256 });
80
+ let text = response.textContent;
81
+ if (!text) {
82
+ text = JSON.stringify(response.content);
83
+ }
84
+ return text.indexOf('LOGGED_IN') > -1;
85
+ }
86
+ }
87
+ //# sourceMappingURL=request_login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request_login.js","sourceRoot":"","sources":["../../../../src/extension/tools/request_login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { screenshot } from './browser';
2
+ import { getWindowId } from '../utils';
3
+ /**
4
+ * Current Page Screenshot
5
+ */
6
+ export class Screenshot {
7
+ constructor() {
8
+ this.name = 'screenshot';
9
+ this.description = 'Screenshot the current webpage window';
10
+ this.input_schema = {
11
+ type: 'object',
12
+ properties: {},
13
+ };
14
+ }
15
+ /**
16
+ * Current Page Screenshot
17
+ *
18
+ * @param {*} params {}
19
+ * @returns > { image: { type: 'base64', media_type: 'image/png', data } }
20
+ */
21
+ async execute(context, params) {
22
+ let windowId = await getWindowId(context);
23
+ return await screenshot(windowId);
24
+ }
25
+ }
26
+ //# sourceMappingURL=screenshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../../../src/extension/tools/screenshot.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC;;GAEG;AACH,MAAM,OAAO,UAAU;IAKrB;QACE,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,uCAAuC,CAAC;QAC3D,IAAI,CAAC,YAAY,GAAG;YAClB,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE;SACf,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,OAAyB,EAAE,MAAe;QACtD,IAAI,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,160 @@
1
+ import { executeScript, getTabId, getWindowId, open_new_tab, sleep, waitForTabComplete, } from '../utils';
2
+ /**
3
+ * Browser tab management
4
+ */
5
+ export class TabManagement {
6
+ constructor() {
7
+ this.name = 'tab_management';
8
+ this.description = 'Browser tab management, view and operate tabs';
9
+ this.input_schema = {
10
+ type: 'object',
11
+ properties: {
12
+ commond: {
13
+ type: 'string',
14
+ description: `The commond to perform. The available commonds are:
15
+ * \`tab_all\`: View all tabs and return the tabId and title.
16
+ * \`current_tab\`: Get current tab information (tabId, url, title).
17
+ * \`go_back\`: Go back to the previous page in the current tab.
18
+ * \`change_url [url]\`: open URL in the current tab, eg: \`change_url https://www.google.com\`.
19
+ * \`close_tab\`: Close the current tab.
20
+ * \`switch_tab [tabId]\`: Switch to the specified tab using tabId, eg: \`switch_tab 1000\`.
21
+ * \`new_tab [url]\`: Open a new tab window and open the URL, eg: \`new_tab https://www.google.com\``,
22
+ },
23
+ },
24
+ required: ['commond'],
25
+ };
26
+ }
27
+ /**
28
+ * Tab management
29
+ *
30
+ * @param {*} params { commond: `new_tab [url]` | 'tab_all' | 'current_tab' | 'go_back' | 'close_tab' | 'switch_tab [tabId]' | `change_url [url]` }
31
+ * @returns > { result, success: true }
32
+ */
33
+ async execute(context, params) {
34
+ if (params === null || !params.commond) {
35
+ throw new Error('Invalid parameters. Expected an object with a "commond" property.');
36
+ }
37
+ let windowId = await getWindowId(context);
38
+ let commond = params.commond.trim();
39
+ if (commond.startsWith('`')) {
40
+ commond = commond.substring(1);
41
+ }
42
+ if (commond.endsWith('`')) {
43
+ commond = commond.substring(0, commond.length - 1);
44
+ }
45
+ let result;
46
+ if (commond == 'tab_all') {
47
+ result = [];
48
+ let tabs = await chrome.tabs.query({ windowId: windowId });
49
+ for (let i = 0; i < tabs.length; i++) {
50
+ let tab = tabs[i];
51
+ let tabInfo = {
52
+ tabId: tab.id,
53
+ windowId: tab.windowId,
54
+ title: tab.title,
55
+ url: tab.url,
56
+ };
57
+ if (tab.active) {
58
+ tabInfo.active = true;
59
+ }
60
+ result.push(tabInfo);
61
+ }
62
+ }
63
+ else if (commond == 'current_tab') {
64
+ let tabId = await getTabId(context);
65
+ let tab = await chrome.tabs.get(tabId);
66
+ let tabInfo = { tabId, windowId: tab.windowId, title: tab.title, url: tab.url };
67
+ result = tabInfo;
68
+ }
69
+ else if (commond == 'go_back') {
70
+ let tabId = await getTabId(context);
71
+ await chrome.tabs.goBack(tabId);
72
+ let tab = await chrome.tabs.get(tabId);
73
+ let tabInfo = { tabId, windowId: tab.windowId, title: tab.title, url: tab.url };
74
+ result = tabInfo;
75
+ }
76
+ else if (commond == 'close_tab') {
77
+ let closedTabId = await getTabId(context);
78
+ await chrome.tabs.remove(closedTabId);
79
+ await sleep(100);
80
+ let tabs = await chrome.tabs.query({ active: true, currentWindow: true });
81
+ if (tabs.length == 0) {
82
+ tabs = await chrome.tabs.query({ status: 'complete', currentWindow: true });
83
+ }
84
+ let tab = tabs[tabs.length - 1];
85
+ if (!tab.active) {
86
+ await chrome.tabs.update(tab.id, { active: true });
87
+ }
88
+ let newTabId = tab.id;
89
+ context.variables.set('tabId', tab.id);
90
+ context.variables.set('windowId', tab.windowId);
91
+ let closeTabInfo = { closedTabId, newTabId, newTabTitle: tab.title };
92
+ result = closeTabInfo;
93
+ }
94
+ else if (commond.startsWith('switch_tab')) {
95
+ let tabId = parseInt(commond.replace('switch_tab', '').replace('[', '').replace(']', ''));
96
+ let tab = await chrome.tabs.update(tabId, { active: true });
97
+ context.variables.set('tabId', tab.id);
98
+ context.variables.set('windowId', tab.windowId);
99
+ let tabInfo = { tabId, windowId: tab.windowId, title: tab.title, url: tab.url };
100
+ result = tabInfo;
101
+ }
102
+ else if (commond.startsWith('change_url')) {
103
+ let url = commond.substring('change_url'.length).replace('[', '').replace(']', '').trim();
104
+ let tabId = await getTabId(context);
105
+ // await chrome.tabs.update(tabId, { url: url });
106
+ await executeScript(tabId, () => {
107
+ location.href = url;
108
+ }, []);
109
+ let tab = await waitForTabComplete(tabId);
110
+ let tabInfo = { tabId, windowId: tab.windowId, title: tab.title, url: tab.url };
111
+ result = tabInfo;
112
+ }
113
+ else if (commond.startsWith('new_tab')) {
114
+ let url = commond.replace('new_tab', '').replace('[', '').replace(']', '').replace(/"/g, '');
115
+ // First mandatory opening of a new window
116
+ let newWindow = !context.variables.get('windowId') && !context.variables.get('tabId');
117
+ let tab;
118
+ if (newWindow) {
119
+ tab = await open_new_tab(url, true);
120
+ }
121
+ else {
122
+ let windowId = await getWindowId(context);
123
+ tab = await open_new_tab(url, false, windowId);
124
+ }
125
+ let windowId = tab.windowId;
126
+ let tabId = tab.id;
127
+ context.variables.set('windowId', windowId);
128
+ context.variables.set('tabId', tabId);
129
+ if (newWindow) {
130
+ let windowIds = context.variables.get('windowIds');
131
+ if (windowIds) {
132
+ windowIds.push(windowId);
133
+ }
134
+ else {
135
+ context.variables.set('windowIds', [windowId]);
136
+ }
137
+ }
138
+ let tabInfo = {
139
+ tabId: tab.id,
140
+ windowId: tab.windowId,
141
+ title: tab.title,
142
+ url: tab.url,
143
+ };
144
+ result = tabInfo;
145
+ }
146
+ else {
147
+ throw Error('Unknown commond: ' + commond);
148
+ }
149
+ return result;
150
+ }
151
+ destroy(context) {
152
+ let windowIds = context.variables.get('windowIds');
153
+ if (windowIds) {
154
+ for (let i = 0; i < windowIds.length; i++) {
155
+ chrome.windows.remove(windowIds[i]);
156
+ }
157
+ }
158
+ }
159
+ }
160
+ //# sourceMappingURL=tab_management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tab_management.js","sourceRoot":"","sources":["../../../../src/extension/tools/tab_management.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,281 @@
1
+ import { MsgEvent, CountDownLatch, sleep, injectScript } from '../utils';
2
+ /**
3
+ * Web Search
4
+ */
5
+ export class WebSearch {
6
+ constructor() {
7
+ this.name = 'web_search';
8
+ this.description = 'Use web search to return search results';
9
+ this.input_schema = {
10
+ type: 'object',
11
+ properties: {
12
+ query: {
13
+ type: 'string',
14
+ description: 'search for keywords',
15
+ },
16
+ maxResults: {
17
+ type: 'integer',
18
+ description: 'Maximum search results, default 5',
19
+ },
20
+ },
21
+ required: ['query'],
22
+ };
23
+ }
24
+ /**
25
+ * search
26
+ *
27
+ * @param {*} params { url: 'https://www.google.com', query: 'ai agent', maxResults: 5 }
28
+ * @returns > [{ title, url, content }]
29
+ */
30
+ async execute(context, params) {
31
+ var _a;
32
+ if (typeof params !== 'object' || params === null || !params.query) {
33
+ throw new Error('Invalid parameters. Expected an object with a "query" property.');
34
+ }
35
+ let url = params.url;
36
+ let query = params.query;
37
+ let maxResults = params.maxResults;
38
+ if (!url) {
39
+ url = 'https://www.google.com';
40
+ }
41
+ let taskId = new Date().getTime() + '';
42
+ let searchs = [{ url: url, keyword: query }];
43
+ let searchInfo = await deepSearch(taskId, searchs, maxResults || 5);
44
+ let links = ((_a = searchInfo.result[0]) === null || _a === void 0 ? void 0 : _a.links) || [];
45
+ return links.filter((s) => s.content);
46
+ }
47
+ }
48
+ const deepSearchInjects = {
49
+ 'bing.com': {
50
+ filename: 'bing.js',
51
+ buildSearchUrl: function (url, keyword) {
52
+ return 'https://bing.com/search?q=' + encodeURI(keyword);
53
+ },
54
+ },
55
+ 'duckduckgo.com': {
56
+ filename: 'duckduckgo.js',
57
+ buildSearchUrl: function (url, keyword) {
58
+ return 'https://duckduckgo.com/?q=' + encodeURI(keyword);
59
+ },
60
+ },
61
+ 'google.com': {
62
+ filename: 'google.js',
63
+ buildSearchUrl: function (url, keyword) {
64
+ return 'https://www.google.com/search?q=' + encodeURI(keyword);
65
+ },
66
+ },
67
+ default: {
68
+ filename: 'google.js',
69
+ buildSearchUrl: function (url, keyword) {
70
+ url = url.trim();
71
+ let idx = url.indexOf('//');
72
+ if (idx > -1) {
73
+ url = url.substring(idx + 2);
74
+ }
75
+ idx = url.indexOf('/', 2);
76
+ if (idx > -1) {
77
+ url = url.substring(0, idx);
78
+ }
79
+ keyword = 'site:' + url + ' ' + keyword;
80
+ return 'https://www.google.com/search?q=' + encodeURIComponent(keyword);
81
+ },
82
+ },
83
+ };
84
+ function buildDeepSearchUrl(url, keyword) {
85
+ let idx = url.indexOf('/', url.indexOf('//') + 2);
86
+ let baseUrl = idx > -1 ? url.substring(0, idx) : url;
87
+ let domains = Object.keys(deepSearchInjects);
88
+ let inject = null;
89
+ for (let j = 0; j < domains.length; j++) {
90
+ let domain = domains[j];
91
+ if (baseUrl == domain || baseUrl.endsWith('.' + domain) || baseUrl.endsWith('/' + domain)) {
92
+ inject = deepSearchInjects[domain];
93
+ break;
94
+ }
95
+ }
96
+ if (!inject) {
97
+ inject = deepSearchInjects['default'];
98
+ }
99
+ return {
100
+ filename: inject.filename,
101
+ url: inject.buildSearchUrl(url, keyword),
102
+ };
103
+ }
104
+ // Event
105
+ const tabsUpdateEvent = new MsgEvent();
106
+ chrome.tabs.onUpdated.addListener(async function (tabId, changeInfo, tab) {
107
+ await tabsUpdateEvent.publish({ tabId, changeInfo, tab });
108
+ });
109
+ /**
110
+ * deep search
111
+ *
112
+ * @param {string} taskId task id
113
+ * @param {array} searchs search list => [{ url: 'https://bing.com', keyword: 'ai' }]
114
+ * @param {number} detailsMaxNum Maximum crawling quantity per search detail page
115
+ */
116
+ async function deepSearch(taskId, searchs, detailsMaxNum, window) {
117
+ let closeWindow = false;
118
+ if (!window) {
119
+ // open new window
120
+ window = await chrome.windows.create({
121
+ type: 'normal',
122
+ state: 'maximized',
123
+ url: null,
124
+ });
125
+ closeWindow = true;
126
+ }
127
+ // crawler the search page details page link
128
+ // [{ links: [{ title, url }] }]
129
+ let detailLinkGroups = await doDetailLinkGroups(taskId, searchs, detailsMaxNum, window);
130
+ // crawler all details page content and comments
131
+ let searchInfo = await doPageContent(taskId, detailLinkGroups, window);
132
+ console.log('searchInfo: ', searchInfo);
133
+ // close window
134
+ closeWindow && chrome.windows.remove(window.id);
135
+ return searchInfo;
136
+ }
137
+ /**
138
+ * crawler the search page details page link
139
+ *
140
+ * @param {string} taskId task id
141
+ * @param {array} searchs search list => [{ url: 'https://bing.com', keyword: 'ai' }]
142
+ * @param {number} detailsMaxNum Maximum crawling quantity per search detail page
143
+ * @param {*} window
144
+ * @returns [{ links: [{ title, url }] }]
145
+ */
146
+ async function doDetailLinkGroups(taskId, searchs, detailsMaxNum, window) {
147
+ let detailLinkGroups = [];
148
+ let countDownLatch = new CountDownLatch(searchs.length);
149
+ for (let i = 0; i < searchs.length; i++) {
150
+ try {
151
+ // script name & build search URL
152
+ const { filename, url } = buildDeepSearchUrl(searchs[i].url, searchs[i].keyword);
153
+ // open new Tab
154
+ let tab = await chrome.tabs.create({
155
+ url: url,
156
+ windowId: window.id,
157
+ });
158
+ let eventId = taskId + '_' + i;
159
+ // monitor Tab status
160
+ tabsUpdateEvent.addListener(async function (obj) {
161
+ if (obj.tabId != tab.id) {
162
+ return;
163
+ }
164
+ if (obj.changeInfo.status === 'complete') {
165
+ tabsUpdateEvent.removeListener(eventId);
166
+ // inject js
167
+ await injectScript(tab.id, filename);
168
+ await sleep(1000);
169
+ // crawler the search page details page
170
+ // { links: [{ title, url }] }
171
+ let detailLinks = await chrome.tabs.sendMessage(tab.id, {
172
+ type: 'page:getDetailLinks',
173
+ keyword: searchs[i].keyword,
174
+ });
175
+ if (!detailLinks || !detailLinks.links) {
176
+ // TODO error
177
+ detailLinks = { links: [] };
178
+ }
179
+ console.log('detailLinks: ', detailLinks);
180
+ let links = detailLinks.links.slice(0, detailsMaxNum);
181
+ detailLinkGroups.push({ url, links, filename });
182
+ countDownLatch.countDown();
183
+ chrome.tabs.remove(tab.id);
184
+ }
185
+ else if (obj.changeInfo.status === 'unloaded') {
186
+ countDownLatch.countDown();
187
+ chrome.tabs.remove(tab.id);
188
+ tabsUpdateEvent.removeListener(eventId);
189
+ }
190
+ }, eventId);
191
+ }
192
+ catch (e) {
193
+ console.error(e);
194
+ countDownLatch.countDown();
195
+ }
196
+ }
197
+ await countDownLatch.await(30000);
198
+ return detailLinkGroups;
199
+ }
200
+ /**
201
+ * page content
202
+ *
203
+ * @param {string} taskId task id
204
+ * @param {array} detailLinkGroups details page group
205
+ * @param {*} window
206
+ * @returns search info
207
+ */
208
+ async function doPageContent(taskId, detailLinkGroups, window) {
209
+ const searchInfo = {
210
+ total: 0,
211
+ running: 0,
212
+ succeed: 0,
213
+ failed: 0,
214
+ failedLinks: [],
215
+ result: detailLinkGroups,
216
+ };
217
+ for (let i = 0; i < detailLinkGroups.length; i++) {
218
+ let links = detailLinkGroups[i].links;
219
+ searchInfo.total += links.length;
220
+ }
221
+ let countDownLatch = new CountDownLatch(searchInfo.total);
222
+ for (let i = 0; i < detailLinkGroups.length; i++) {
223
+ let filename = detailLinkGroups[i].filename;
224
+ let links = detailLinkGroups[i].links;
225
+ for (let j = 0; j < links.length; j++) {
226
+ let link = links[j];
227
+ // open new tab
228
+ let tab = await chrome.tabs.create({
229
+ url: link.url,
230
+ windowId: window.id,
231
+ });
232
+ searchInfo.running++;
233
+ let eventId = taskId + '_' + i + '_' + j;
234
+ // monitor Tab status
235
+ tabsUpdateEvent.addListener(async function (obj) {
236
+ if (obj.tabId != tab.id) {
237
+ return;
238
+ }
239
+ if (obj.changeInfo.status === 'complete') {
240
+ try {
241
+ tabsUpdateEvent.removeListener(eventId);
242
+ // inject js
243
+ await injectScript(tab.id, filename);
244
+ await sleep(1000);
245
+ // cralwer content and comments
246
+ // { title, content }
247
+ let result = await chrome.tabs.sendMessage(tab.id, {
248
+ type: 'page:getContent',
249
+ });
250
+ if (!result) {
251
+ throw Error('No Result');
252
+ }
253
+ link.content = result.content;
254
+ link.page_title = result.title;
255
+ searchInfo.succeed++;
256
+ }
257
+ catch (e) {
258
+ searchInfo.failed++;
259
+ searchInfo.failedLinks.push(link);
260
+ console.error(link.title + ' crawler error', link.url, e);
261
+ }
262
+ finally {
263
+ searchInfo.running--;
264
+ countDownLatch.countDown();
265
+ chrome.tabs.remove(tab.id);
266
+ tabsUpdateEvent.removeListener(eventId);
267
+ }
268
+ }
269
+ else if (obj.changeInfo.status === 'unloaded') {
270
+ searchInfo.running--;
271
+ countDownLatch.countDown();
272
+ chrome.tabs.remove(tab.id);
273
+ tabsUpdateEvent.removeListener(eventId);
274
+ }
275
+ }, eventId);
276
+ }
277
+ }
278
+ await countDownLatch.await(60000);
279
+ return searchInfo;
280
+ }
281
+ //# sourceMappingURL=web_search.js.map