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
@@ -22,6 +22,7 @@ var __privateMethod = (obj, member, method) => {
22
22
  };
23
23
 
24
24
  // src/common/utils.ts
25
+ import dayjs from "dayjs";
25
26
  import { elementByPositionWithElementInfo } from "misoai-core/ai-model";
26
27
  import { uploadTestInfoToServer } from "misoai-core/utils";
27
28
  import { MIDSCENE_REPORT_TAG_NAME, getAIConfig } from "misoai-shared/env";
@@ -33,7 +34,6 @@ import {
33
34
  } from "misoai-shared/extractor";
34
35
  import { resizeImgBase64 } from "misoai-shared/img";
35
36
  import { assert, logMsg, uuid } from "misoai-shared/utils";
36
- import dayjs from "dayjs";
37
37
 
38
38
  // src/web-element.ts
39
39
  var WebElementInfo = class {
@@ -452,8 +452,8 @@ var ScriptPlayer = class {
452
452
  import yaml from "js-yaml";
453
453
 
454
454
  // src/yaml/utils.ts
455
- import { assert as assert3 } from "misoai-shared/utils";
456
455
  import yaml2 from "js-yaml";
456
+ import { assert as assert3 } from "misoai-shared/utils";
457
457
  function interpolateEnvVars(content) {
458
458
  return content.replace(/\$\{([^}]+)\}/g, (_, envVar) => {
459
459
  const value = process.env[envVar.trim()];
@@ -667,8 +667,12 @@ var WorkflowMemory = class {
667
667
  const workflow = this.workflows.get(workflowId) || this.createEmptyWorkflowData(workflowId);
668
668
  workflow.memory = [...memory];
669
669
  workflow.metadata.totalSteps = workflow.steps.length;
670
- workflow.metadata.completedSteps = workflow.steps.filter((s) => s.status === "completed").length;
671
- workflow.metadata.failedSteps = workflow.steps.filter((s) => s.status === "failed").length;
670
+ workflow.metadata.completedSteps = workflow.steps.filter(
671
+ (s) => s.status === "completed"
672
+ ).length;
673
+ workflow.metadata.failedSteps = workflow.steps.filter(
674
+ (s) => s.status === "failed"
675
+ ).length;
672
676
  this.workflows.set(workflowId, workflow);
673
677
  this.enforceRetentionPolicy();
674
678
  }
@@ -679,7 +683,9 @@ var WorkflowMemory = class {
679
683
  const workflow = this.workflows.get(workflowId) || this.createEmptyWorkflowData(workflowId);
680
684
  workflow.context = { ...workflow.context, ...context };
681
685
  if (context.currentStep) {
682
- const existingStep = workflow.steps.find((s) => s.stepName === context.currentStep);
686
+ const existingStep = workflow.steps.find(
687
+ (s) => s.stepName === context.currentStep
688
+ );
683
689
  if (!existingStep) {
684
690
  workflow.steps.push({
685
691
  stepId: `step_${workflow.steps.length + 1}`,
@@ -724,7 +730,9 @@ var WorkflowMemory = class {
724
730
  enforceRetentionPolicy() {
725
731
  const maxWorkflows = 10;
726
732
  if (this.workflows.size > maxWorkflows) {
727
- const sortedWorkflows = Array.from(this.workflows.entries()).sort(([, a], [, b]) => (b.metadata.endTime || b.metadata.startTime) - (a.metadata.endTime || a.metadata.startTime));
733
+ const sortedWorkflows = Array.from(this.workflows.entries()).sort(
734
+ ([, a], [, b]) => (b.metadata.endTime || b.metadata.startTime) - (a.metadata.endTime || a.metadata.startTime)
735
+ );
728
736
  const toDelete = sortedWorkflows.slice(maxWorkflows);
729
737
  toDelete.forEach(([workflowId]) => this.workflows.delete(workflowId));
730
738
  }
@@ -1463,7 +1471,9 @@ var PageTaskExecutor = class {
1463
1471
  */
1464
1472
  getPersistentExecutor() {
1465
1473
  if (!this.persistentExecutor || this.persistentExecutor.status === "error") {
1466
- const previousMemory = this.workflowMemory.getWorkflowMemory(this.sessionContext.workflowId);
1474
+ const previousMemory = this.workflowMemory.getWorkflowMemory(
1475
+ this.sessionContext.workflowId
1476
+ );
1467
1477
  this.persistentExecutor = new Executor("Persistent Task Executor", {
1468
1478
  onTaskStart: this.onTaskStartCallback,
1469
1479
  initialMemory: previousMemory
@@ -1492,7 +1502,9 @@ var PageTaskExecutor = class {
1492
1502
  if (this.persistentExecutor) {
1493
1503
  this.persistentExecutor.clearMemory();
1494
1504
  }
1495
- this.workflowMemory.clearWorkflow(this.sessionContext.workflowId || "default");
1505
+ this.workflowMemory.clearWorkflow(
1506
+ this.sessionContext.workflowId || "default"
1507
+ );
1496
1508
  }
1497
1509
  /**
1498
1510
  * Mevcut hafızayı döndürür
@@ -1504,7 +1516,9 @@ var PageTaskExecutor = class {
1504
1516
  * İş akışı hafızasını döndürür
1505
1517
  */
1506
1518
  getWorkflowMemory() {
1507
- return this.workflowMemory.getWorkflowData(this.sessionContext.workflowId || "default");
1519
+ return this.workflowMemory.getWorkflowData(
1520
+ this.sessionContext.workflowId || "default"
1521
+ );
1508
1522
  }
1509
1523
  /**
1510
1524
  * Hafıza istatistiklerini döndürür
@@ -1512,7 +1526,13 @@ var PageTaskExecutor = class {
1512
1526
  getMemoryStats() {
1513
1527
  return this.persistentExecutor?.getMemoryStats() || {
1514
1528
  totalItems: 0,
1515
- analytics: { totalTasks: 0, memoryHits: 0, memoryMisses: 0, averageMemorySize: 0, memoryEffectiveness: 0 },
1529
+ analytics: {
1530
+ totalTasks: 0,
1531
+ memoryHits: 0,
1532
+ memoryMisses: 0,
1533
+ averageMemorySize: 0,
1534
+ memoryEffectiveness: 0
1535
+ },
1516
1536
  config: this.memoryConfig
1517
1537
  };
1518
1538
  }
@@ -1548,11 +1568,14 @@ var PageTaskExecutor = class {
1548
1568
  let taskExecutor;
1549
1569
  if (useMemory) {
1550
1570
  taskExecutor = this.getPersistentExecutor();
1551
- this.workflowMemory.updateWorkflowContext({
1552
- currentStep: title,
1553
- pageInfo: this.sessionContext.pageInfo,
1554
- timestamp: Date.now()
1555
- }, this.sessionContext.workflowId || "default");
1571
+ this.workflowMemory.updateWorkflowContext(
1572
+ {
1573
+ currentStep: title,
1574
+ pageInfo: this.sessionContext.pageInfo,
1575
+ timestamp: Date.now()
1576
+ },
1577
+ this.sessionContext.workflowId || "default"
1578
+ );
1556
1579
  } else {
1557
1580
  taskExecutor = new Executor(title, {
1558
1581
  onTaskStart: this.onTaskStartCallback
@@ -1850,9 +1873,15 @@ var PageTaskExecutor = class {
1850
1873
  }
1851
1874
  async waitFor(assertion, opt) {
1852
1875
  const description = `waitFor: ${assertion}`;
1853
- const taskExecutor = new Executor(taskTitleStr("WaitFor", description), {
1854
- onTaskStart: this.onTaskStartCallback
1855
- });
1876
+ const useMemory = true;
1877
+ let taskExecutor;
1878
+ if (useMemory) {
1879
+ taskExecutor = this.getPersistentExecutor();
1880
+ } else {
1881
+ taskExecutor = new Executor(taskTitleStr("WaitFor", description), {
1882
+ onTaskStart: this.onTaskStartCallback
1883
+ });
1884
+ }
1856
1885
  const { timeoutMs, checkIntervalMs } = opt;
1857
1886
  assert4(assertion, "No assertion for waitFor");
1858
1887
  assert4(timeoutMs, "No timeoutMs for waitFor");
@@ -1907,6 +1936,25 @@ var PageTaskExecutor = class {
1907
1936
  `waitFor timeout: ${errorThought}`
1908
1937
  );
1909
1938
  }
1939
+ /**
1940
+ * Hafızaya yeni bir öğe ekler
1941
+ */
1942
+ addToMemory(memoryItem) {
1943
+ if (!this.persistentExecutor || this.persistentExecutor.status === "error") {
1944
+ const previousMemory = this.workflowMemory.getWorkflowMemory(
1945
+ this.sessionContext.workflowId
1946
+ );
1947
+ this.persistentExecutor = new Executor("Persistent Task Executor", {
1948
+ onTaskStart: this.onTaskStartCallback,
1949
+ initialMemory: previousMemory
1950
+ });
1951
+ }
1952
+ this.persistentExecutor.memoryStore?.add(memoryItem);
1953
+ this.persistentExecutor.memoryAnalytics?.recordMemoryOperation(
1954
+ "add",
1955
+ memoryItem
1956
+ );
1957
+ }
1910
1958
  };
1911
1959
 
1912
1960
  // src/common/plan-builder.ts
@@ -1994,14 +2042,14 @@ function buildPlans(type, locateParam, param) {
1994
2042
  import assert6 from "assert";
1995
2043
  import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync, writeFileSync as writeFileSync2 } from "fs";
1996
2044
  import { dirname as dirname2, join as join2 } from "path";
2045
+ import yaml3 from "js-yaml";
1997
2046
  import { getMidsceneRunSubDir as getMidsceneRunSubDir2 } from "misoai-shared/common";
1998
2047
  import { getDebug as getDebug3 } from "misoai-shared/logger";
1999
2048
  import { ifInBrowser as ifInBrowser2 } from "misoai-shared/utils";
2000
- import yaml3 from "js-yaml";
2001
2049
  import semver from "semver";
2002
2050
 
2003
2051
  // package.json
2004
- var version = "1.5.8";
2052
+ var version = "1.6.1";
2005
2053
 
2006
2054
  // src/common/task-cache.ts
2007
2055
  var debug3 = getDebug3("cache");
@@ -2212,7 +2260,10 @@ var PageAgent = class {
2212
2260
  }
2213
2261
  this.taskExecutor = new PageTaskExecutor(this.page, this.insight, {
2214
2262
  taskCache: this.taskCache,
2215
- onTaskStart: this.callbackOnTaskStartTip.bind(this)
2263
+ onTaskStart: this.callbackOnTaskStartTip.bind(this),
2264
+ memoryConfig: opts?.memoryConfig,
2265
+ sessionId: opts?.sessionId,
2266
+ workflowId: opts?.workflowId
2216
2267
  });
2217
2268
  this.dump = this.resetDump();
2218
2269
  this.reportFileName = reportFileName(
@@ -2293,22 +2344,28 @@ var PageAgent = class {
2293
2344
  const allThoughts = executor.tasks.filter((task) => task.thought).map((task) => task.thought);
2294
2345
  const allLocates = executor.tasks.filter((task) => task.locate).map((task) => task.locate);
2295
2346
  const allPlans = executor.tasks.filter((task) => task.param?.plans).map((task) => task.param?.plans);
2296
- const planningTasks = executor.tasks.filter((task) => task.type === "Planning");
2297
- const insightTasks = executor.tasks.filter((task) => task.type === "Insight");
2347
+ const planningTasks = executor.tasks.filter(
2348
+ (task) => task.type === "Planning"
2349
+ );
2350
+ const insightTasks = executor.tasks.filter(
2351
+ (task) => task.type === "Insight"
2352
+ );
2298
2353
  const actionTasks = executor.tasks.filter((task) => task.type === "Action");
2299
2354
  const planning = planningTasks.length > 0 ? {
2300
2355
  type: "Planning",
2301
- description: `Planning for task execution`,
2356
+ description: "Planning for task execution",
2302
2357
  steps: planningTasks.map((task) => task.thought || "Planning step")
2303
2358
  } : void 0;
2304
2359
  const insight = insightTasks.length > 0 ? {
2305
2360
  type: "Insight",
2306
- description: `Insight for task execution`,
2307
- elements: insightTasks.map((task) => task.thought || "Insight element")
2361
+ description: "Insight for task execution",
2362
+ elements: insightTasks.map(
2363
+ (task) => task.thought || "Insight element"
2364
+ )
2308
2365
  } : void 0;
2309
2366
  const action = actionTasks.length > 0 ? {
2310
2367
  type: "Action",
2311
- description: `Action for task execution`,
2368
+ description: "Action for task execution",
2312
2369
  result: lastTask?.output
2313
2370
  } : void 0;
2314
2371
  const actionDetails = executor.tasks.map((task) => ({
@@ -2642,7 +2699,10 @@ ${memoryContext}` : void 0;
2642
2699
  }
2643
2700
  const memoryContext = this.getMemoryAsContext();
2644
2701
  const assertionWithContext = currentUrl ? `For the page at URL "${currentUrl}", ${assertion}` : assertion;
2645
- const { output, executor } = await this.taskExecutor.assert(assertionWithContext, memoryContext);
2702
+ const { output, executor } = await this.taskExecutor.assert(
2703
+ assertionWithContext,
2704
+ memoryContext
2705
+ );
2646
2706
  const metadata = this.afterTaskRunning(executor, true);
2647
2707
  if (output && opt?.keepRawResponse) {
2648
2708
  return {
@@ -2663,6 +2723,7 @@ ${reasonMsg}`);
2663
2723
  }
2664
2724
  async aiCaptcha(options) {
2665
2725
  const { deepThink = false, autoDetectComplexity = true } = options || {};
2726
+ const memoryContext = this.getMemoryAsContext();
2666
2727
  let shouldUseDeepThink = deepThink;
2667
2728
  if (autoDetectComplexity && !deepThink) {
2668
2729
  const context = await this.getUIContext();
@@ -2680,7 +2741,10 @@ A complex CAPTCHA typically has one or more of these characteristics:
2680
2741
  Return only "complex" or "simple" based on your analysis.
2681
2742
  `;
2682
2743
  const complexityMsgs = [
2683
- { role: "system", content: "You are an AI assistant that analyzes screenshots to determine CAPTCHA complexity." },
2744
+ {
2745
+ role: "system",
2746
+ content: "You are an AI assistant that analyzes screenshots to determine CAPTCHA complexity."
2747
+ },
2684
2748
  {
2685
2749
  role: "user",
2686
2750
  content: [
@@ -2704,7 +2768,12 @@ Return only "complex" or "simple" based on your analysis.
2704
2768
  );
2705
2769
  const responseText = typeof complexityResult.content === "string" ? complexityResult.content.toLowerCase() : JSON.stringify(complexityResult.content).toLowerCase();
2706
2770
  shouldUseDeepThink = responseText.includes("complex");
2707
- debug4("CAPTCHA complexity analysis:", responseText, "Using deep think:", shouldUseDeepThink);
2771
+ debug4(
2772
+ "CAPTCHA complexity analysis:",
2773
+ responseText,
2774
+ "Using deep think:",
2775
+ shouldUseDeepThink
2776
+ );
2708
2777
  } catch (error) {
2709
2778
  debug4("Failed to analyze CAPTCHA complexity:", error);
2710
2779
  }
@@ -2721,7 +2790,9 @@ Return only "complex" or "simple" based on your analysis.
2721
2790
  await this.aiTap(action.target, { deepThink: shouldUseDeepThink });
2722
2791
  } else if (action.type === "input" && action.value) {
2723
2792
  if (action.target) {
2724
- await this.aiInput(action.value, action.target, { deepThink: shouldUseDeepThink });
2793
+ await this.aiInput(action.value, action.target, {
2794
+ deepThink: shouldUseDeepThink
2795
+ });
2725
2796
  }
2726
2797
  } else if (action.type === "verify" && action.target) {
2727
2798
  await this.aiTap(action.target, { deepThink: shouldUseDeepThink });
@@ -2733,7 +2804,9 @@ Return only "complex" or "simple" based on your analysis.
2733
2804
  if (action.coordinates) {
2734
2805
  const x = action.coordinates[0];
2735
2806
  const y = action.coordinates[1];
2736
- await this.aiTap(`element at coordinates (${x}, ${y})`, { deepThink: shouldUseDeepThink });
2807
+ await this.aiTap(`element at coordinates (${x}, ${y})`, {
2808
+ deepThink: shouldUseDeepThink
2809
+ });
2737
2810
  } else if (action.target) {
2738
2811
  await this.aiTap(action.target, { deepThink: shouldUseDeepThink });
2739
2812
  }
@@ -2743,6 +2816,26 @@ Return only "complex" or "simple" based on your analysis.
2743
2816
  }
2744
2817
  }
2745
2818
  await new Promise((resolve2) => setTimeout(resolve2, 3e3));
2819
+ const captchaMemoryItem = {
2820
+ id: `captcha_${Date.now()}`,
2821
+ timestamp: Date.now(),
2822
+ taskType: "Action",
2823
+ summary: `Solved ${captchaResult.captchaType} CAPTCHA: ${captchaResult.thought}`,
2824
+ context: {
2825
+ url: await this.page.url?.() || "",
2826
+ captchaType: captchaResult.captchaType,
2827
+ actions: captchaResult.actions,
2828
+ deepThink: actualDeepThink
2829
+ },
2830
+ metadata: {
2831
+ executionTime: Date.now() - Date.now(),
2832
+ // Will be updated
2833
+ success: true,
2834
+ confidence: 0.9
2835
+ },
2836
+ tags: ["captcha", "action", captchaResult.captchaType]
2837
+ };
2838
+ this.taskExecutor.addToMemory(captchaMemoryItem);
2746
2839
  const metadata = {
2747
2840
  status: "finished",
2748
2841
  usage,
@@ -2759,10 +2852,15 @@ Return only "complex" or "simple" based on your analysis.
2759
2852
  }
2760
2853
  async aiWaitFor(assertion, opt) {
2761
2854
  const startTime = Date.now();
2762
- const { executor } = await this.taskExecutor.waitFor(assertion, {
2855
+ const memoryContext = this.getMemoryAsContext();
2856
+ const assertionWithContext = memoryContext ? `${assertion}
2857
+
2858
+ Previous workflow steps:
2859
+ ${memoryContext}` : assertion;
2860
+ const { executor } = await this.taskExecutor.waitFor(assertionWithContext, {
2763
2861
  timeoutMs: opt?.timeoutMs || 15 * 1e3,
2764
2862
  checkIntervalMs: opt?.checkIntervalMs || 3 * 1e3,
2765
- assertion
2863
+ assertion: assertionWithContext
2766
2864
  });
2767
2865
  const metadata = {
2768
2866
  status: executor.isInErrorState() ? "failed" : "finished",
@@ -2860,25 +2958,27 @@ ${errors}`);
2860
2958
  const executionDump = {
2861
2959
  name: screenshotTitle,
2862
2960
  description: content,
2863
- tasks: [{
2864
- type: "Screenshot",
2865
- subType: "log",
2866
- status: "finished",
2867
- executor: null,
2868
- param: {
2869
- title: screenshotTitle,
2870
- content
2871
- },
2872
- output: {
2873
- screenshot
2874
- },
2875
- thought: `Logged screenshot: ${screenshotTitle}`,
2876
- timing: {
2877
- start: Date.now(),
2878
- end: Date.now(),
2879
- cost: 0
2961
+ tasks: [
2962
+ {
2963
+ type: "Screenshot",
2964
+ subType: "log",
2965
+ status: "finished",
2966
+ executor: null,
2967
+ param: {
2968
+ title: screenshotTitle,
2969
+ content
2970
+ },
2971
+ output: {
2972
+ screenshot
2973
+ },
2974
+ thought: `Logged screenshot: ${screenshotTitle}`,
2975
+ timing: {
2976
+ start: Date.now(),
2977
+ end: Date.now(),
2978
+ cost: 0
2979
+ }
2880
2980
  }
2881
- }],
2981
+ ],
2882
2982
  sdkVersion: "1.0.0",
2883
2983
  logTime: Date.now(),
2884
2984
  model_name: "screenshot"
@@ -2930,7 +3030,9 @@ ${errors}`);
2930
3030
  totalTasks: stats.analytics.totalTasks,
2931
3031
  memoryHits: stats.analytics.memoryHits,
2932
3032
  memoryMisses: stats.analytics.memoryMisses,
2933
- memoryEffectiveness: Math.round(stats.analytics.memoryEffectiveness * 100),
3033
+ memoryEffectiveness: Math.round(
3034
+ stats.analytics.memoryEffectiveness * 100
3035
+ ),
2934
3036
  averageMemorySize: Math.round(stats.analytics.averageMemorySize * 100) / 100
2935
3037
  },
2936
3038
  config: stats.config,
@@ -2994,7 +3096,9 @@ ${errors}`);
2994
3096
  calculateSuccessRate(memory) {
2995
3097
  if (memory.length === 0)
2996
3098
  return 0;
2997
- const successCount = memory.filter((item) => item.metadata?.success !== false).length;
3099
+ const successCount = memory.filter(
3100
+ (item) => item.metadata?.success !== false
3101
+ ).length;
2998
3102
  return Math.round(successCount / memory.length * 100);
2999
3103
  }
3000
3104
  calculateAverageExecutionTime(memory) {
@@ -3240,7 +3344,7 @@ function sleep2(ms) {
3240
3344
  var ChromeExtensionProxyPage = class {
3241
3345
  constructor(forceSameTabNavigation) {
3242
3346
  this.pageType = "chrome-extension-proxy";
3243
- this.version = "1.5.8";
3347
+ this.version = "1.6.1";
3244
3348
  this.activeTabId = null;
3245
3349
  this.tabIdOfDebuggerAttached = null;
3246
3350
  this.attachingDebugger = null;