misoai-web 1.5.9 → 1.6.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 (60) hide show
  1. package/dist/es/agent.js +158 -54
  2. package/dist/es/agent.js.map +1 -1
  3. package/dist/es/bridge-mode-browser.js +3 -3
  4. package/dist/es/bridge-mode-browser.js.map +1 -1
  5. package/dist/es/bridge-mode.js +160 -56
  6. package/dist/es/bridge-mode.js.map +1 -1
  7. package/dist/es/chrome-extension.js +159 -55
  8. package/dist/es/chrome-extension.js.map +1 -1
  9. package/dist/es/index.js +159 -55
  10. package/dist/es/index.js.map +1 -1
  11. package/dist/es/midscene-playground.js +161 -57
  12. package/dist/es/midscene-playground.js.map +1 -1
  13. package/dist/es/midscene-server.js +4 -4
  14. package/dist/es/midscene-server.js.map +1 -1
  15. package/dist/es/playground.js +158 -54
  16. package/dist/es/playground.js.map +1 -1
  17. package/dist/es/playwright-report.js +1 -1
  18. package/dist/es/playwright-report.js.map +1 -1
  19. package/dist/es/playwright.js +159 -55
  20. package/dist/es/playwright.js.map +1 -1
  21. package/dist/es/puppeteer-agent-launcher.js +158 -54
  22. package/dist/es/puppeteer-agent-launcher.js.map +1 -1
  23. package/dist/es/puppeteer.js +158 -54
  24. package/dist/es/puppeteer.js.map +1 -1
  25. package/dist/es/utils.js +1 -1
  26. package/dist/es/utils.js.map +1 -1
  27. package/dist/es/yaml.js +1 -1
  28. package/dist/es/yaml.js.map +1 -1
  29. package/dist/lib/agent.js +158 -54
  30. package/dist/lib/agent.js.map +1 -1
  31. package/dist/lib/bridge-mode-browser.js +3 -3
  32. package/dist/lib/bridge-mode-browser.js.map +1 -1
  33. package/dist/lib/bridge-mode.js +160 -56
  34. package/dist/lib/bridge-mode.js.map +1 -1
  35. package/dist/lib/chrome-extension.js +159 -55
  36. package/dist/lib/chrome-extension.js.map +1 -1
  37. package/dist/lib/index.js +159 -55
  38. package/dist/lib/index.js.map +1 -1
  39. package/dist/lib/midscene-playground.js +161 -57
  40. package/dist/lib/midscene-playground.js.map +1 -1
  41. package/dist/lib/midscene-server.js +4 -4
  42. package/dist/lib/midscene-server.js.map +1 -1
  43. package/dist/lib/playground.js +158 -54
  44. package/dist/lib/playground.js.map +1 -1
  45. package/dist/lib/playwright-report.js +1 -1
  46. package/dist/lib/playwright-report.js.map +1 -1
  47. package/dist/lib/playwright.js +159 -55
  48. package/dist/lib/playwright.js.map +1 -1
  49. package/dist/lib/puppeteer-agent-launcher.js +158 -54
  50. package/dist/lib/puppeteer-agent-launcher.js.map +1 -1
  51. package/dist/lib/puppeteer.js +158 -54
  52. package/dist/lib/puppeteer.js.map +1 -1
  53. package/dist/lib/utils.js +1 -1
  54. package/dist/lib/utils.js.map +1 -1
  55. package/dist/lib/yaml.js +1 -1
  56. package/dist/lib/yaml.js.map +1 -1
  57. package/dist/types/agent.d.ts +8 -1
  58. package/dist/types/index.d.ts +1 -1
  59. package/dist/types/playwright.d.ts +1 -1
  60. package/package.json +18 -54
@@ -60,13 +60,13 @@ __export(chrome_extension_exports, {
60
60
  module.exports = __toCommonJS(chrome_extension_exports);
61
61
 
62
62
  // src/common/utils.ts
63
+ var import_dayjs = __toESM(require("dayjs"));
63
64
  var import_ai_model = require("misoai-core/ai-model");
64
65
  var import_utils = require("misoai-core/utils");
65
66
  var import_env = require("misoai-shared/env");
66
67
  var import_extractor = require("misoai-shared/extractor");
67
68
  var import_img = require("misoai-shared/img");
68
69
  var import_utils2 = require("misoai-shared/utils");
69
- var import_dayjs = __toESM(require("dayjs"));
70
70
 
71
71
  // src/web-element.ts
72
72
  var WebElementInfo = class {
@@ -485,8 +485,8 @@ var ScriptPlayer = class {
485
485
  var import_js_yaml = __toESM(require("js-yaml"));
486
486
 
487
487
  // src/yaml/utils.ts
488
- var import_utils4 = require("misoai-shared/utils");
489
488
  var import_js_yaml2 = __toESM(require("js-yaml"));
489
+ var import_utils4 = require("misoai-shared/utils");
490
490
  function interpolateEnvVars(content) {
491
491
  return content.replace(/\$\{([^}]+)\}/g, (_, envVar) => {
492
492
  const value = process.env[envVar.trim()];
@@ -685,8 +685,12 @@ var WorkflowMemory = class {
685
685
  const workflow = this.workflows.get(workflowId) || this.createEmptyWorkflowData(workflowId);
686
686
  workflow.memory = [...memory];
687
687
  workflow.metadata.totalSteps = workflow.steps.length;
688
- workflow.metadata.completedSteps = workflow.steps.filter((s) => s.status === "completed").length;
689
- workflow.metadata.failedSteps = workflow.steps.filter((s) => s.status === "failed").length;
688
+ workflow.metadata.completedSteps = workflow.steps.filter(
689
+ (s) => s.status === "completed"
690
+ ).length;
691
+ workflow.metadata.failedSteps = workflow.steps.filter(
692
+ (s) => s.status === "failed"
693
+ ).length;
690
694
  this.workflows.set(workflowId, workflow);
691
695
  this.enforceRetentionPolicy();
692
696
  }
@@ -697,7 +701,9 @@ var WorkflowMemory = class {
697
701
  const workflow = this.workflows.get(workflowId) || this.createEmptyWorkflowData(workflowId);
698
702
  workflow.context = { ...workflow.context, ...context };
699
703
  if (context.currentStep) {
700
- const existingStep = workflow.steps.find((s) => s.stepName === context.currentStep);
704
+ const existingStep = workflow.steps.find(
705
+ (s) => s.stepName === context.currentStep
706
+ );
701
707
  if (!existingStep) {
702
708
  workflow.steps.push({
703
709
  stepId: `step_${workflow.steps.length + 1}`,
@@ -742,7 +748,9 @@ var WorkflowMemory = class {
742
748
  enforceRetentionPolicy() {
743
749
  const maxWorkflows = 10;
744
750
  if (this.workflows.size > maxWorkflows) {
745
- const sortedWorkflows = Array.from(this.workflows.entries()).sort(([, a], [, b]) => (b.metadata.endTime || b.metadata.startTime) - (a.metadata.endTime || a.metadata.startTime));
751
+ const sortedWorkflows = Array.from(this.workflows.entries()).sort(
752
+ ([, a], [, b]) => (b.metadata.endTime || b.metadata.startTime) - (a.metadata.endTime || a.metadata.startTime)
753
+ );
746
754
  const toDelete = sortedWorkflows.slice(maxWorkflows);
747
755
  toDelete.forEach(([workflowId]) => this.workflows.delete(workflowId));
748
756
  }
@@ -1481,7 +1489,9 @@ var PageTaskExecutor = class {
1481
1489
  */
1482
1490
  getPersistentExecutor() {
1483
1491
  if (!this.persistentExecutor || this.persistentExecutor.status === "error") {
1484
- const previousMemory = this.workflowMemory.getWorkflowMemory(this.sessionContext.workflowId);
1492
+ const previousMemory = this.workflowMemory.getWorkflowMemory(
1493
+ this.sessionContext.workflowId
1494
+ );
1485
1495
  this.persistentExecutor = new import_misoai_core.Executor("Persistent Task Executor", {
1486
1496
  onTaskStart: this.onTaskStartCallback,
1487
1497
  initialMemory: previousMemory
@@ -1510,7 +1520,9 @@ var PageTaskExecutor = class {
1510
1520
  if (this.persistentExecutor) {
1511
1521
  this.persistentExecutor.clearMemory();
1512
1522
  }
1513
- this.workflowMemory.clearWorkflow(this.sessionContext.workflowId || "default");
1523
+ this.workflowMemory.clearWorkflow(
1524
+ this.sessionContext.workflowId || "default"
1525
+ );
1514
1526
  }
1515
1527
  /**
1516
1528
  * Mevcut hafızayı döndürür
@@ -1522,7 +1534,9 @@ var PageTaskExecutor = class {
1522
1534
  * İş akışı hafızasını döndürür
1523
1535
  */
1524
1536
  getWorkflowMemory() {
1525
- return this.workflowMemory.getWorkflowData(this.sessionContext.workflowId || "default");
1537
+ return this.workflowMemory.getWorkflowData(
1538
+ this.sessionContext.workflowId || "default"
1539
+ );
1526
1540
  }
1527
1541
  /**
1528
1542
  * Hafıza istatistiklerini döndürür
@@ -1530,7 +1544,13 @@ var PageTaskExecutor = class {
1530
1544
  getMemoryStats() {
1531
1545
  return this.persistentExecutor?.getMemoryStats() || {
1532
1546
  totalItems: 0,
1533
- analytics: { totalTasks: 0, memoryHits: 0, memoryMisses: 0, averageMemorySize: 0, memoryEffectiveness: 0 },
1547
+ analytics: {
1548
+ totalTasks: 0,
1549
+ memoryHits: 0,
1550
+ memoryMisses: 0,
1551
+ averageMemorySize: 0,
1552
+ memoryEffectiveness: 0
1553
+ },
1534
1554
  config: this.memoryConfig
1535
1555
  };
1536
1556
  }
@@ -1566,11 +1586,14 @@ var PageTaskExecutor = class {
1566
1586
  let taskExecutor;
1567
1587
  if (useMemory) {
1568
1588
  taskExecutor = this.getPersistentExecutor();
1569
- this.workflowMemory.updateWorkflowContext({
1570
- currentStep: title,
1571
- pageInfo: this.sessionContext.pageInfo,
1572
- timestamp: Date.now()
1573
- }, this.sessionContext.workflowId || "default");
1589
+ this.workflowMemory.updateWorkflowContext(
1590
+ {
1591
+ currentStep: title,
1592
+ pageInfo: this.sessionContext.pageInfo,
1593
+ timestamp: Date.now()
1594
+ },
1595
+ this.sessionContext.workflowId || "default"
1596
+ );
1574
1597
  } else {
1575
1598
  taskExecutor = new import_misoai_core.Executor(title, {
1576
1599
  onTaskStart: this.onTaskStartCallback
@@ -1868,9 +1891,15 @@ var PageTaskExecutor = class {
1868
1891
  }
1869
1892
  async waitFor(assertion, opt) {
1870
1893
  const description = `waitFor: ${assertion}`;
1871
- const taskExecutor = new import_misoai_core.Executor(taskTitleStr("WaitFor", description), {
1872
- onTaskStart: this.onTaskStartCallback
1873
- });
1894
+ const useMemory = true;
1895
+ let taskExecutor;
1896
+ if (useMemory) {
1897
+ taskExecutor = this.getPersistentExecutor();
1898
+ } else {
1899
+ taskExecutor = new import_misoai_core.Executor(taskTitleStr("WaitFor", description), {
1900
+ onTaskStart: this.onTaskStartCallback
1901
+ });
1902
+ }
1874
1903
  const { timeoutMs, checkIntervalMs } = opt;
1875
1904
  (0, import_utils6.assert)(assertion, "No assertion for waitFor");
1876
1905
  (0, import_utils6.assert)(timeoutMs, "No timeoutMs for waitFor");
@@ -1925,6 +1954,25 @@ var PageTaskExecutor = class {
1925
1954
  `waitFor timeout: ${errorThought}`
1926
1955
  );
1927
1956
  }
1957
+ /**
1958
+ * Hafızaya yeni bir öğe ekler
1959
+ */
1960
+ addToMemory(memoryItem) {
1961
+ if (!this.persistentExecutor || this.persistentExecutor.status === "error") {
1962
+ const previousMemory = this.workflowMemory.getWorkflowMemory(
1963
+ this.sessionContext.workflowId
1964
+ );
1965
+ this.persistentExecutor = new import_misoai_core.Executor("Persistent Task Executor", {
1966
+ onTaskStart: this.onTaskStartCallback,
1967
+ initialMemory: previousMemory
1968
+ });
1969
+ }
1970
+ this.persistentExecutor.memoryStore?.add(memoryItem);
1971
+ this.persistentExecutor.memoryAnalytics?.recordMemoryOperation(
1972
+ "add",
1973
+ memoryItem
1974
+ );
1975
+ }
1928
1976
  };
1929
1977
 
1930
1978
  // src/common/plan-builder.ts
@@ -2012,14 +2060,14 @@ function buildPlans(type, locateParam, param) {
2012
2060
  var import_node_assert = __toESM(require("assert"));
2013
2061
  var import_node_fs2 = require("fs");
2014
2062
  var import_node_path2 = require("path");
2063
+ var import_js_yaml3 = __toESM(require("js-yaml"));
2015
2064
  var import_common2 = require("misoai-shared/common");
2016
2065
  var import_logger3 = require("misoai-shared/logger");
2017
2066
  var import_utils9 = require("misoai-shared/utils");
2018
- var import_js_yaml3 = __toESM(require("js-yaml"));
2019
2067
  var import_semver = __toESM(require("semver"));
2020
2068
 
2021
2069
  // package.json
2022
- var version = "1.5.8";
2070
+ var version = "1.6.1";
2023
2071
 
2024
2072
  // src/common/task-cache.ts
2025
2073
  var debug3 = (0, import_logger3.getDebug)("cache");
@@ -2230,7 +2278,10 @@ var PageAgent = class {
2230
2278
  }
2231
2279
  this.taskExecutor = new PageTaskExecutor(this.page, this.insight, {
2232
2280
  taskCache: this.taskCache,
2233
- onTaskStart: this.callbackOnTaskStartTip.bind(this)
2281
+ onTaskStart: this.callbackOnTaskStartTip.bind(this),
2282
+ memoryConfig: opts?.memoryConfig,
2283
+ sessionId: opts?.sessionId,
2284
+ workflowId: opts?.workflowId
2234
2285
  });
2235
2286
  this.dump = this.resetDump();
2236
2287
  this.reportFileName = reportFileName(
@@ -2311,22 +2362,28 @@ var PageAgent = class {
2311
2362
  const allThoughts = executor.tasks.filter((task) => task.thought).map((task) => task.thought);
2312
2363
  const allLocates = executor.tasks.filter((task) => task.locate).map((task) => task.locate);
2313
2364
  const allPlans = executor.tasks.filter((task) => task.param?.plans).map((task) => task.param?.plans);
2314
- const planningTasks = executor.tasks.filter((task) => task.type === "Planning");
2315
- const insightTasks = executor.tasks.filter((task) => task.type === "Insight");
2365
+ const planningTasks = executor.tasks.filter(
2366
+ (task) => task.type === "Planning"
2367
+ );
2368
+ const insightTasks = executor.tasks.filter(
2369
+ (task) => task.type === "Insight"
2370
+ );
2316
2371
  const actionTasks = executor.tasks.filter((task) => task.type === "Action");
2317
2372
  const planning = planningTasks.length > 0 ? {
2318
2373
  type: "Planning",
2319
- description: `Planning for task execution`,
2374
+ description: "Planning for task execution",
2320
2375
  steps: planningTasks.map((task) => task.thought || "Planning step")
2321
2376
  } : void 0;
2322
2377
  const insight = insightTasks.length > 0 ? {
2323
2378
  type: "Insight",
2324
- description: `Insight for task execution`,
2325
- elements: insightTasks.map((task) => task.thought || "Insight element")
2379
+ description: "Insight for task execution",
2380
+ elements: insightTasks.map(
2381
+ (task) => task.thought || "Insight element"
2382
+ )
2326
2383
  } : void 0;
2327
2384
  const action = actionTasks.length > 0 ? {
2328
2385
  type: "Action",
2329
- description: `Action for task execution`,
2386
+ description: "Action for task execution",
2330
2387
  result: lastTask?.output
2331
2388
  } : void 0;
2332
2389
  const actionDetails = executor.tasks.map((task) => ({
@@ -2660,7 +2717,10 @@ ${memoryContext}` : void 0;
2660
2717
  }
2661
2718
  const memoryContext = this.getMemoryAsContext();
2662
2719
  const assertionWithContext = currentUrl ? `For the page at URL "${currentUrl}", ${assertion}` : assertion;
2663
- const { output, executor } = await this.taskExecutor.assert(assertionWithContext, memoryContext);
2720
+ const { output, executor } = await this.taskExecutor.assert(
2721
+ assertionWithContext,
2722
+ memoryContext
2723
+ );
2664
2724
  const metadata = this.afterTaskRunning(executor, true);
2665
2725
  if (output && opt?.keepRawResponse) {
2666
2726
  return {
@@ -2681,6 +2741,7 @@ ${reasonMsg}`);
2681
2741
  }
2682
2742
  async aiCaptcha(options) {
2683
2743
  const { deepThink = false, autoDetectComplexity = true } = options || {};
2744
+ const memoryContext = this.getMemoryAsContext();
2684
2745
  let shouldUseDeepThink = deepThink;
2685
2746
  if (autoDetectComplexity && !deepThink) {
2686
2747
  const context = await this.getUIContext();
@@ -2698,7 +2759,10 @@ A complex CAPTCHA typically has one or more of these characteristics:
2698
2759
  Return only "complex" or "simple" based on your analysis.
2699
2760
  `;
2700
2761
  const complexityMsgs = [
2701
- { role: "system", content: "You are an AI assistant that analyzes screenshots to determine CAPTCHA complexity." },
2762
+ {
2763
+ role: "system",
2764
+ content: "You are an AI assistant that analyzes screenshots to determine CAPTCHA complexity."
2765
+ },
2702
2766
  {
2703
2767
  role: "user",
2704
2768
  content: [
@@ -2722,7 +2786,12 @@ Return only "complex" or "simple" based on your analysis.
2722
2786
  );
2723
2787
  const responseText = typeof complexityResult.content === "string" ? complexityResult.content.toLowerCase() : JSON.stringify(complexityResult.content).toLowerCase();
2724
2788
  shouldUseDeepThink = responseText.includes("complex");
2725
- debug4("CAPTCHA complexity analysis:", responseText, "Using deep think:", shouldUseDeepThink);
2789
+ debug4(
2790
+ "CAPTCHA complexity analysis:",
2791
+ responseText,
2792
+ "Using deep think:",
2793
+ shouldUseDeepThink
2794
+ );
2726
2795
  } catch (error) {
2727
2796
  debug4("Failed to analyze CAPTCHA complexity:", error);
2728
2797
  }
@@ -2739,7 +2808,9 @@ Return only "complex" or "simple" based on your analysis.
2739
2808
  await this.aiTap(action.target, { deepThink: shouldUseDeepThink });
2740
2809
  } else if (action.type === "input" && action.value) {
2741
2810
  if (action.target) {
2742
- await this.aiInput(action.value, action.target, { deepThink: shouldUseDeepThink });
2811
+ await this.aiInput(action.value, action.target, {
2812
+ deepThink: shouldUseDeepThink
2813
+ });
2743
2814
  }
2744
2815
  } else if (action.type === "verify" && action.target) {
2745
2816
  await this.aiTap(action.target, { deepThink: shouldUseDeepThink });
@@ -2751,7 +2822,9 @@ Return only "complex" or "simple" based on your analysis.
2751
2822
  if (action.coordinates) {
2752
2823
  const x = action.coordinates[0];
2753
2824
  const y = action.coordinates[1];
2754
- await this.aiTap(`element at coordinates (${x}, ${y})`, { deepThink: shouldUseDeepThink });
2825
+ await this.aiTap(`element at coordinates (${x}, ${y})`, {
2826
+ deepThink: shouldUseDeepThink
2827
+ });
2755
2828
  } else if (action.target) {
2756
2829
  await this.aiTap(action.target, { deepThink: shouldUseDeepThink });
2757
2830
  }
@@ -2761,6 +2834,26 @@ Return only "complex" or "simple" based on your analysis.
2761
2834
  }
2762
2835
  }
2763
2836
  await new Promise((resolve2) => setTimeout(resolve2, 3e3));
2837
+ const captchaMemoryItem = {
2838
+ id: `captcha_${Date.now()}`,
2839
+ timestamp: Date.now(),
2840
+ taskType: "Action",
2841
+ summary: `Solved ${captchaResult.captchaType} CAPTCHA: ${captchaResult.thought}`,
2842
+ context: {
2843
+ url: await this.page.url?.() || "",
2844
+ captchaType: captchaResult.captchaType,
2845
+ actions: captchaResult.actions,
2846
+ deepThink: actualDeepThink
2847
+ },
2848
+ metadata: {
2849
+ executionTime: Date.now() - Date.now(),
2850
+ // Will be updated
2851
+ success: true,
2852
+ confidence: 0.9
2853
+ },
2854
+ tags: ["captcha", "action", captchaResult.captchaType]
2855
+ };
2856
+ this.taskExecutor.addToMemory(captchaMemoryItem);
2764
2857
  const metadata = {
2765
2858
  status: "finished",
2766
2859
  usage,
@@ -2777,10 +2870,15 @@ Return only "complex" or "simple" based on your analysis.
2777
2870
  }
2778
2871
  async aiWaitFor(assertion, opt) {
2779
2872
  const startTime = Date.now();
2780
- const { executor } = await this.taskExecutor.waitFor(assertion, {
2873
+ const memoryContext = this.getMemoryAsContext();
2874
+ const assertionWithContext = memoryContext ? `${assertion}
2875
+
2876
+ Previous workflow steps:
2877
+ ${memoryContext}` : assertion;
2878
+ const { executor } = await this.taskExecutor.waitFor(assertionWithContext, {
2781
2879
  timeoutMs: opt?.timeoutMs || 15 * 1e3,
2782
2880
  checkIntervalMs: opt?.checkIntervalMs || 3 * 1e3,
2783
- assertion
2881
+ assertion: assertionWithContext
2784
2882
  });
2785
2883
  const metadata = {
2786
2884
  status: executor.isInErrorState() ? "failed" : "finished",
@@ -2878,25 +2976,27 @@ ${errors}`);
2878
2976
  const executionDump = {
2879
2977
  name: screenshotTitle,
2880
2978
  description: content,
2881
- tasks: [{
2882
- type: "Screenshot",
2883
- subType: "log",
2884
- status: "finished",
2885
- executor: null,
2886
- param: {
2887
- title: screenshotTitle,
2888
- content
2889
- },
2890
- output: {
2891
- screenshot
2892
- },
2893
- thought: `Logged screenshot: ${screenshotTitle}`,
2894
- timing: {
2895
- start: Date.now(),
2896
- end: Date.now(),
2897
- cost: 0
2979
+ tasks: [
2980
+ {
2981
+ type: "Screenshot",
2982
+ subType: "log",
2983
+ status: "finished",
2984
+ executor: null,
2985
+ param: {
2986
+ title: screenshotTitle,
2987
+ content
2988
+ },
2989
+ output: {
2990
+ screenshot
2991
+ },
2992
+ thought: `Logged screenshot: ${screenshotTitle}`,
2993
+ timing: {
2994
+ start: Date.now(),
2995
+ end: Date.now(),
2996
+ cost: 0
2997
+ }
2898
2998
  }
2899
- }],
2999
+ ],
2900
3000
  sdkVersion: "1.0.0",
2901
3001
  logTime: Date.now(),
2902
3002
  model_name: "screenshot"
@@ -2948,7 +3048,9 @@ ${errors}`);
2948
3048
  totalTasks: stats.analytics.totalTasks,
2949
3049
  memoryHits: stats.analytics.memoryHits,
2950
3050
  memoryMisses: stats.analytics.memoryMisses,
2951
- memoryEffectiveness: Math.round(stats.analytics.memoryEffectiveness * 100),
3051
+ memoryEffectiveness: Math.round(
3052
+ stats.analytics.memoryEffectiveness * 100
3053
+ ),
2952
3054
  averageMemorySize: Math.round(stats.analytics.averageMemorySize * 100) / 100
2953
3055
  },
2954
3056
  config: stats.config,
@@ -3012,7 +3114,9 @@ ${errors}`);
3012
3114
  calculateSuccessRate(memory) {
3013
3115
  if (memory.length === 0)
3014
3116
  return 0;
3015
- const successCount = memory.filter((item) => item.metadata?.success !== false).length;
3117
+ const successCount = memory.filter(
3118
+ (item) => item.metadata?.success !== false
3119
+ ).length;
3016
3120
  return Math.round(successCount / memory.length * 100);
3017
3121
  }
3018
3122
  calculateAverageExecutionTime(memory) {
@@ -3256,7 +3360,7 @@ function sleep2(ms) {
3256
3360
  var ChromeExtensionProxyPage = class {
3257
3361
  constructor(forceSameTabNavigation) {
3258
3362
  this.pageType = "chrome-extension-proxy";
3259
- this.version = "1.5.8";
3363
+ this.version = "1.6.1";
3260
3364
  this.activeTabId = null;
3261
3365
  this.tabIdOfDebuggerAttached = null;
3262
3366
  this.attachingDebugger = null;