browsergym-workarena 0.4.3__py3-none-any.whl → 0.4.4__py3-none-any.whl

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.
@@ -10,6 +10,7 @@ from tenacity import retry, stop_after_attempt, retry_if_exception_type
10
10
  from requests import HTTPError
11
11
  from time import sleep
12
12
 
13
+ from .api.system_properties import get_sys_property, set_sys_property
13
14
  from .api.ui_themes import get_workarena_theme_variants
14
15
  from .api.user import create_user
15
16
  from .api.utils import table_api_call, table_column_info
@@ -38,7 +39,7 @@ from .config import (
38
39
  EXPECTED_USER_FORM_FIELDS_PATH,
39
40
  # Patch flag for reports
40
41
  REPORT_PATCH_FLAG,
41
- REPORT_DATE_FILTER,
42
+ REPORT_FILTER_PROPERTY,
42
43
  # Supported ServiceNow releases
43
44
  SNOW_SUPPORTED_RELEASES,
44
45
  # For workflows setup
@@ -51,51 +52,22 @@ from .instance import SNowInstance
51
52
  from .utils import url_login
52
53
 
53
54
 
54
- def _set_sys_property(property_name: str, value: str):
55
+ def _is_dev_portal_instance() -> bool:
55
56
  """
56
- Set a sys_property in the instance.
57
+ Check if the instance is a ServiceNow Developer Portal instance.
57
58
 
58
- """
59
- instance = SNowInstance()
60
-
61
- property = table_api_call(
62
- instance=instance,
63
- table="sys_properties",
64
- params={"sysparm_query": f"name={property_name}", "sysparm_fields": "sys_id"},
65
- )["result"]
66
-
67
- if not property:
68
- property_sysid = ""
69
- method = "POST"
70
- else:
71
- property_sysid = "/" + property[0]["sys_id"]
72
- method = "PUT"
73
-
74
- property = table_api_call(
75
- instance=instance,
76
- table=f"sys_properties{property_sysid}",
77
- method=method,
78
- json={"name": property_name, "value": value},
79
- )
80
-
81
- # Verify that the property was updated
82
- assert property["result"]["value"] == value, f"Error setting {property_name}."
83
-
84
-
85
- def _get_sys_property(property_name: str) -> str:
86
- """
87
- Get a sys_property from the instance.
59
+ Returns:
60
+ --------
61
+ bool: True if the instance is a developer portal instance, False otherwise.
88
62
 
89
63
  """
90
64
  instance = SNowInstance()
91
-
92
- property_value = table_api_call(
93
- instance=instance,
94
- table="sys_properties",
95
- params={"sysparm_query": f"name={property_name}", "sysparm_fields": "value"},
96
- )["result"][0]["value"]
97
-
98
- return property_value
65
+ # Check if the instance url has the for devXXXXXX.service-now.com format (where X is a digit)
66
+ if re.match(r"^https?://dev\d{6}\.service-now\.com", instance.snow_url):
67
+ logging.info("Detected a developer portal instance...")
68
+ return True
69
+ logging.info("Detected an internal instance...")
70
+ return False
99
71
 
100
72
 
101
73
  def _install_update_set(path: str, name: str):
@@ -797,7 +769,9 @@ def enable_url_login():
797
769
  Configure the instance to allow login via URL.
798
770
 
799
771
  """
800
- _set_sys_property(property_name="glide.security.restrict.get.login", value="false")
772
+ set_sys_property(
773
+ instance=SNowInstance(), property_name="glide.security.restrict.get.login", value="false"
774
+ )
801
775
  logging.info("URL login enabled.")
802
776
 
803
777
 
@@ -808,7 +782,21 @@ def disable_password_policies():
808
782
  Notes: this is required to allow the creation of users with weak passwords.
809
783
 
810
784
  """
811
- _set_sys_property(property_name="glide.security.password.policy.enabled", value="false")
785
+ set_sys_property(
786
+ instance=SNowInstance(),
787
+ property_name="glide.security.password.policy.enabled",
788
+ value="false",
789
+ )
790
+ set_sys_property(
791
+ instance=SNowInstance(), property_name="glide.apply.password_policy.on_login", value="false"
792
+ )
793
+ # The following is not supported on developer portal instances
794
+ if not _is_dev_portal_instance():
795
+ set_sys_property(
796
+ instance=SNowInstance(),
797
+ property_name="glide.authenticate.api.user.reset_password.mandatory",
798
+ value="false",
799
+ )
812
800
  logging.info("Password policies disabled.")
813
801
 
814
802
 
@@ -817,8 +805,14 @@ def disable_guided_tours():
817
805
  Hide guided tour popups
818
806
 
819
807
  """
820
- _set_sys_property(property_name="com.snc.guided_tours.sp.enable", value="false")
821
- _set_sys_property(property_name="com.snc.guided_tours.standard_ui.enable", value="false")
808
+ set_sys_property(
809
+ instance=SNowInstance(), property_name="com.snc.guided_tours.sp.enable", value="false"
810
+ )
811
+ set_sys_property(
812
+ instance=SNowInstance(),
813
+ property_name="com.snc.guided_tours.standard_ui.enable",
814
+ value="false",
815
+ )
822
816
  logging.info("Guided tours disabled.")
823
817
 
824
818
 
@@ -836,7 +830,9 @@ def disable_analytics_popups():
836
830
  Disable analytics popups (needs to be done through UI since Vancouver release)
837
831
 
838
832
  """
839
- _set_sys_property(property_name="glide.analytics.enabled", value="false")
833
+ set_sys_property(
834
+ instance=SNowInstance(), property_name="glide.analytics.enabled", value="false"
835
+ )
840
836
  logging.info("Analytics popups disabled.")
841
837
 
842
838
 
@@ -850,7 +846,8 @@ def setup_ui_themes():
850
846
  check_ui_themes_installed()
851
847
 
852
848
  logging.info("Setting default UI theme")
853
- _set_sys_property(
849
+ set_sys_property(
850
+ instance=SNowInstance(),
854
851
  property_name="glide.ui.polaris.theme.custom",
855
852
  value=get_workarena_theme_variants(SNowInstance())[0]["theme.sys_id"],
856
853
  )
@@ -894,7 +891,9 @@ def check_ui_themes_installed():
894
891
 
895
892
  def set_home_page():
896
893
  logging.info("Setting default home page")
897
- _set_sys_property(property_name="glide.login.home", value="/now/nav/ui/home")
894
+ set_sys_property(
895
+ instance=SNowInstance(), property_name="glide.login.home", value="/now/nav/ui/home"
896
+ )
898
897
 
899
898
 
900
899
  def wipe_system_admin_preferences():
@@ -918,9 +917,9 @@ def wipe_system_admin_preferences():
918
917
  )
919
918
 
920
919
 
921
- def is_report_filter_using_time(filter):
920
+ def is_report_filter_using_relative_time(filter):
922
921
  """
923
- Heuristic to check if a report is filtering based on time
922
+ Heuristic to check if a report is filtering based on relative time
924
923
 
925
924
  This aims to detect the use of functions like "gs.endOfToday()". To avoid hardcoding all of them,
926
925
  we simply check for the use of keywords. Our filter is definitely too wide, but that's ok.
@@ -938,6 +937,32 @@ def patch_report_filters():
938
937
  logging.info("Patching reports with date filter...")
939
938
 
940
939
  instance = SNowInstance()
940
+ filter_config = instance.report_filter_config
941
+
942
+ # If the report date filter is already set, we use the existing values (would be the case on reinstall)
943
+ if not filter_config:
944
+ # Set the report date filter to current date as YYYY-MM-DD and time filter to current time as HH:MM:SS
945
+ now = datetime.now()
946
+ report_date_filter = now.strftime("%Y-%m-%d")
947
+ report_time_filter = now.strftime("%H:%M:%S")
948
+ # ... save the filter config
949
+ logging.info(
950
+ f"Setting report date filter to {report_date_filter} and time filter to {report_time_filter} via {REPORT_FILTER_PROPERTY}"
951
+ )
952
+ set_sys_property(
953
+ instance=instance,
954
+ property_name=REPORT_FILTER_PROPERTY,
955
+ value=json.dumps(
956
+ {"report_date_filter": report_date_filter, "report_time_filter": report_time_filter}
957
+ ),
958
+ )
959
+ else:
960
+ # Use the existing configuration
961
+ logging.info(
962
+ f"Using existing report date filter {filter_config['report_date_filter']} and time filter {filter_config['report_time_filter']}"
963
+ )
964
+ report_date_filter = filter_config["report_date_filter"]
965
+ report_time_filter = filter_config["report_time_filter"]
941
966
 
942
967
  # Get all reports that are not already patched
943
968
  reports = table_api_call(
@@ -959,27 +984,31 @@ def patch_report_filters():
959
984
  logging.info(f"Discarding report {report['title']} {report['sys_id']}...")
960
985
  raise NotImplementedError() # Mark for deletion
961
986
 
962
- if not is_report_filter_using_time(report["filter"]):
987
+ if not is_report_filter_using_relative_time(report["filter"]):
963
988
  # That's a report we want to keep (use date cutoff filter)
964
- filter_date = REPORT_DATE_FILTER
989
+ filter_date = report_date_filter
990
+ filter_time = report_time_filter
965
991
  logging.info(
966
992
  f"Keeping report {report['title']} {report['sys_id']} (columns: {sys_created_on_cols})..."
967
993
  )
968
994
  else:
969
- # XXX: We do not support reports with filters that rely on time (e.g., last 10 days) because
995
+ # XXX: We do not support reports with filters that rely on relative time (e.g., last 10 days) because
970
996
  # there are not stable. In this case, we don't delete them but add a filter to make
971
997
  # them empty. They will be shown as "No data available".
972
998
  logging.info(
973
999
  f"Disabling report {report['title']} {report['sys_id']} because it uses time filters..."
974
1000
  )
975
1001
  filter_date = "1900-01-01"
1002
+ filter_time = "00:00:00"
976
1003
 
1004
+ # Format the filter
977
1005
  filter = "".join(
978
1006
  [
979
- f"^{col}<javascript:gs.dateGenerate('{filter_date}','00:00:00')"
1007
+ f"^{col}<javascript:gs.dateGenerate('{filter_date}','{filter_time}')"
980
1008
  for col in sys_created_on_cols
981
1009
  ]
982
1010
  ) + ("^" if len(report["filter"]) > 0 and not report["filter"].startswith("^") else "")
1011
+ # Patch the report with the new filter
983
1012
  table_api_call(
984
1013
  instance=instance,
985
1014
  table=f"sys_report/{report['sys_id']}",
@@ -1055,7 +1084,11 @@ def setup():
1055
1084
 
1056
1085
  # Save installation date
1057
1086
  logging.info("Saving installation date")
1058
- _set_sys_property(property_name="workarena.installation.date", value=datetime.now().isoformat())
1087
+ set_sys_property(
1088
+ instance=SNowInstance(),
1089
+ property_name="workarena.installation.date",
1090
+ value=datetime.now().isoformat(),
1091
+ )
1059
1092
 
1060
1093
  logging.info("WorkArena setup complete.")
1061
1094
 
@@ -1068,7 +1101,9 @@ def main():
1068
1101
  logging.basicConfig(level=logging.INFO)
1069
1102
 
1070
1103
  try:
1071
- past_install_date = _get_sys_property("workarena.installation.date")
1104
+ past_install_date = get_sys_property(
1105
+ instance=SNowInstance(), property_name="workarena.installation.date"
1106
+ )
1072
1107
  logging.info(f"Detected previous installation on {past_install_date}. Reinstalling...")
1073
1108
  except:
1074
1109
  past_install_date = "never"
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import os
2
3
  import requests
3
4
  import re
@@ -5,7 +6,7 @@ import re
5
6
  from playwright.sync_api import sync_playwright
6
7
  from typing import Optional
7
8
 
8
- from .config import SNOW_BROWSER_TIMEOUT
9
+ from .config import SNOW_BROWSER_TIMEOUT, REPORT_FILTER_PROPERTY
9
10
 
10
11
 
11
12
  class SNowInstance:
@@ -124,3 +125,25 @@ class SNowInstance:
124
125
  browser.close()
125
126
 
126
127
  return release_info
128
+
129
+ @property
130
+ def report_filter_config(self) -> dict:
131
+ """
132
+ Get the report filter configuration from the ServiceNow instance.
133
+
134
+ Returns:
135
+ --------
136
+ dict
137
+ The report filter configuration, or an empty dictionary if not found.
138
+
139
+ """
140
+ from .api.system_properties import (
141
+ get_sys_property,
142
+ ) # Import here to avoid circular import issues
143
+
144
+ try:
145
+ config = get_sys_property(self, REPORT_FILTER_PROPERTY)
146
+ config = json.loads(config)
147
+ return config
148
+ except Exception:
149
+ return None
@@ -19,7 +19,6 @@ from ..config import (
19
19
  DASHBOARD_RETRIEVAL_VALUE_CONFIG_PATH,
20
20
  REPORT_RETRIEVAL_MINMAX_CONFIG_PATH,
21
21
  REPORT_RETRIEVAL_VALUE_CONFIG_PATH,
22
- REPORT_DATE_FILTER,
23
22
  REPORT_PATCH_FLAG,
24
23
  )
25
24
  from ..instance import SNowInstance
@@ -30,6 +29,15 @@ from .utils.utils import check_url_suffix_match
30
29
  # - We currently don't support maps because they are clickable and would require a more evolved cheat function
31
30
  SUPPORTED_PLOT_TYPES = ["area", "bar", "column", "line", "pie", "spline"]
32
31
 
32
+ # Get report filter config
33
+ config = SNowInstance().report_filter_config
34
+ if config is None:
35
+ REPORT_DATE_FILTER = REPORT_TIME_FILTER = None
36
+ else:
37
+ REPORT_DATE_FILTER = config["report_date_filter"]
38
+ REPORT_TIME_FILTER = config["report_time_filter"]
39
+ del config
40
+
33
41
 
34
42
  class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
35
43
  """
@@ -298,6 +306,12 @@ class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
298
306
  def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str | dict]:
299
307
  super().setup_goal(page=page)
300
308
 
309
+ # Check that the report filters are properly setup
310
+ if REPORT_DATE_FILTER is None or REPORT_TIME_FILTER is None:
311
+ raise RuntimeError(
312
+ "The report date and time filters are not set. Please run the install script to set them."
313
+ )
314
+
301
315
  # Configure task
302
316
  # ... sample a configuration
303
317
  self.config = (
@@ -305,7 +319,9 @@ class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
305
319
  )
306
320
  # ... set start URL based on config
307
321
  # ...... some of the reports have need a date filter to be applied so we do this by patching a placeholder in the URL
308
- self.start_url = self.instance.snow_url + self.config["url"]
322
+ self.start_url = self.instance.snow_url + self.config["url"].replace(
323
+ "REPORT_DATE_FILTER", REPORT_DATE_FILTER
324
+ ).replace("REPORT_TIME_FILTER", REPORT_TIME_FILTER)
309
325
 
310
326
  # Produce goal string based on question type
311
327
  chart_locator = (
@@ -616,6 +632,12 @@ class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
616
632
  The types of questions to sample from (uniformely)
617
633
 
618
634
  """
635
+ # Check that the report filters are properly setup
636
+ if REPORT_DATE_FILTER is None or REPORT_TIME_FILTER is None:
637
+ raise RuntimeError(
638
+ "The report date and time filters are not set. Please run the install script to set them."
639
+ )
640
+
619
641
  # Generate a bunch of reports based on valid table fields
620
642
  ON_THE_FLY_REPORTS = []
621
643
  for table in [
@@ -678,7 +700,7 @@ class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
678
700
  # On the fly generated report
679
701
  if not report.get("sys_id", None):
680
702
  # ... these receive a filter that is added through the URL
681
- url = f"/now/nav/ui/classic/params/target/sys_report_template.do%3Fsysparm_field%3D{report['field']}%26sysparm_type%3D{report['type']}%26sysparm_table%3D{report['table']}%26sysparm_from_list%3Dtrue%26sysparm_chart_size%3Dlarge%26sysparm_manual_labor%3Dtrue%26sysparm_query=sys_created_on<javascript:gs.dateGenerate('{REPORT_DATE_FILTER}','00:00:00')^EQ"
703
+ url = f"/now/nav/ui/classic/params/target/sys_report_template.do%3Fsysparm_field%3D{report['field']}%26sysparm_type%3D{report['type']}%26sysparm_table%3D{report['table']}%26sysparm_from_list%3Dtrue%26sysparm_chart_size%3Dlarge%26sysparm_manual_labor%3Dtrue%26sysparm_query=sys_created_on<javascript:gs.dateGenerate('{REPORT_DATE_FILTER}','{REPORT_TIME_FILTER}')^EQ"
682
704
  # Report from the database
683
705
  else:
684
706
  url = f"/now/nav/ui/classic/params/target/sys_report_template.do%3Fjvar_report_id={report['sys_id']}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: browsergym-workarena
3
- Version: 0.4.3
3
+ Version: 0.4.4
4
4
  Summary: WorkArena benchmark for BrowserGym
5
5
  Project-URL: homepage, https://github.com/ServiceNow/WorkArena
6
6
  Author: Léo Boisvert, Alex Drouin, Maxime Gasse, Alex Lacoste, Manuel Del Verme, Megh Thakkar
@@ -1,7 +1,7 @@
1
- browsergym/workarena/__init__.py,sha256=7s59CgTTqAr4Dh9CTw2u4ycENp60nhASAYG_x3b2oVs,6289
2
- browsergym/workarena/config.py,sha256=L8f-EgCHwWQtXoa9ZmYBWc16_JfBRrQUjz1YB6rZiIk,8522
3
- browsergym/workarena/install.py,sha256=iEps7IkXFObJaQlE9t78LUFvoqsfKsQbcLLvuFIfBK8,39728
4
- browsergym/workarena/instance.py,sha256=-w21jT-lnXVWtUolJbuTKsPuULvq-Qa-j9FwdfNJrmE,4343
1
+ browsergym/workarena/__init__.py,sha256=gqvx_SVwq31CU-T1XoNP9EDZsjivUgMCXS7lbH_uc84,6289
2
+ browsergym/workarena/config.py,sha256=Fmx4sl3B1Ee2m2fGnnEYJfsQ0TkCV0VdKhNZ-gNytRU,8608
3
+ browsergym/workarena/install.py,sha256=Dy9cTbT_LMDW0Dhmd2CpVnj4W_aB-xaxPubjGRTThxQ,41493
4
+ browsergym/workarena/instance.py,sha256=pLlYBrKu-GCwYPzfYO2w0BYc2u_n5jMt3HZdpplCD40,4997
5
5
  browsergym/workarena/utils.py,sha256=mD6RqVua-m1-mKM1RGGlUEu1s6un0ZI9a5ZTPN7g1hY,3199
6
6
  browsergym/workarena/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  browsergym/workarena/api/category.py,sha256=4oiwPnRas0ZWCdky76zhNpu_9PfB_HmhnFa_DJZyGfA,2084
@@ -15,6 +15,7 @@ browsergym/workarena/api/problem.py,sha256=QEr9uwUCOvVZcz7Or9bKkb7aCIrP7LSPulvfO
15
15
  browsergym/workarena/api/report.py,sha256=nNSTcM4mKE9GXjlm787iAlK5Q71oQbWdUcVvl0GlpeE,6903
16
16
  browsergym/workarena/api/requested_items.py,sha256=g0X0sA1v8bAQzz9jfpATqSctUNNOTD547D6EH5Z4sw0,1678
17
17
  browsergym/workarena/api/requests.py,sha256=z2vQTTkm1HR04_d_pce6jopuN--Oh0gUaT-YhrVa9-8,4148
18
+ browsergym/workarena/api/system_properties.py,sha256=-DysHuUTfH82tkQGOalNdtql-2yeGWEH5QBaYTpBKh4,1648
18
19
  browsergym/workarena/api/ui_themes.py,sha256=9H8HhnqHWt0CA5X5E1sokkXSCYYxtWZvhNFcXn3e90s,836
19
20
  browsergym/workarena/api/user.py,sha256=mLx8r4RFVAuw66514xniv5sn_O4kwjAsVf-iCQC9aJk,4821
20
21
  browsergym/workarena/api/utils.py,sha256=sulU1rC6jiCyDVwn5PqPK0AC-6m-GJS_4Crzar6pENU,5000
@@ -63,8 +64,8 @@ browsergym/workarena/data_files/task_configs/order_ipad_pro_task.json,sha256=gR5
63
64
  browsergym/workarena/data_files/task_configs/order_loaner_laptop_task.json,sha256=g_BDRnvn5wm7rRcISdmT197-4MDe2QfsWmY5FnCG7Tc,183107
64
65
  browsergym/workarena/data_files/task_configs/order_sales_laptop_task.json,sha256=6IGZg5NE2pjrUeDyOajk3Z2F4TCjqBRLS9VPh7lEu5Q,707828
65
66
  browsergym/workarena/data_files/task_configs/order_standard_laptop_task.json,sha256=qSh8lM13RgQyaKAzNIwAM0B84iZvSOgY1FQEAGeawaA,516203
66
- browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json,sha256=cVG6wknVqj9tl4hTVmhyv0fTD-0r8B3OQFgK-Bf5rwc,112107
67
- browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json,sha256=ee1LhCMwM5VCw1OodCGmwyQWSkMhpvckFNCR34AxsMA,327974
67
+ browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json,sha256=RwuWHi8W_cgWGF37-cf4mLx5A7WEr4Io8R8kV-HqjpM,116571
68
+ browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json,sha256=GKAw70L_00SoDSgr4anJmipyulkfy2krdxzC_VsKZig,339350
68
69
  browsergym/workarena/data_files/task_configs/sort_asset_list_task.json,sha256=CxGupg15OFAT8z0ddieTJnIOQ1xHqCJJkqPgZI1sJNA,44721
69
70
  browsergym/workarena/data_files/task_configs/sort_change_request_list_task.json,sha256=dmYPzs86MGzD-j_h8bEiynH9LWdfm12a2Z5PkSJ7-dc,45862
70
71
  browsergym/workarena/data_files/task_configs/sort_hardware_list_task.json,sha256=iE5RmskNfiw-6CajMgmB75oxyJ8qu5JIjJugHf1NNPQ,45127
@@ -76,7 +77,7 @@ browsergym/workarena/human_eval/tool.py,sha256=SwPqArNnvEeOPLRgem6kwl8ho345o-1f3
76
77
  browsergym/workarena/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
78
  browsergym/workarena/tasks/base.py,sha256=Ikh_A5I9_9acHFQCcnVMEnlBg3u3QHQD2I_NbGvD6SE,6411
78
79
  browsergym/workarena/tasks/comp_building_block.py,sha256=Lg3KbAWrxzAHe5XbPN6L8bvdu7mfJpmBvI7jXeSDwKE,194
79
- browsergym/workarena/tasks/dashboard.py,sha256=KFqenTFCbhndZL4rPouK3DJcapoCYaph4O4E3aLhDaI,34493
80
+ browsergym/workarena/tasks/dashboard.py,sha256=LnLRyn6VdQVZyCYJtQl51UKh-aQxuNZIvWcSKVC5WI8,35435
80
81
  browsergym/workarena/tasks/form.py,sha256=_s07yZ-zcZbi5v6VK6km1BPzUfIFfMEVWFm56QhoznM,64141
81
82
  browsergym/workarena/tasks/knowledge.py,sha256=kANjlC7DpptMbRlUlZGdDjqZeWIwwyJzozV58qEA6KU,13751
82
83
  browsergym/workarena/tasks/list.py,sha256=7eb9F1JooLzFGIciul2_E1bCmNyBo5AzOPozO1p1HaM,55778
@@ -131,8 +132,8 @@ browsergym/workarena/tasks/utils/js_utils.js,sha256=n97fmY2Jkr59rEcQSuSbCnn1L2ZN
131
132
  browsergym/workarena/tasks/utils/private_tasks.py,sha256=r7Z9SnBMuZdZ2i-tK6eULj0q8hclANXFSzdLl49KYHI,2128
132
133
  browsergym/workarena/tasks/utils/string.py,sha256=ir5_ASD9QSFMZ9kuHo2snSXRuSfv_wROH6nxBLOTP4I,330
133
134
  browsergym/workarena/tasks/utils/utils.py,sha256=xQD-njEwgN7qxfn1dLBN8MYfd3kl3TuVfpmI1yxML9k,955
134
- browsergym_workarena-0.4.3.dist-info/METADATA,sha256=XP57A1zokK8y5ijhsmtqT32BVyWiGH_rA36UDCQspWg,11698
135
- browsergym_workarena-0.4.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
136
- browsergym_workarena-0.4.3.dist-info/entry_points.txt,sha256=1lCeAbQFCcU6UTFwS5QIA3TKhT2P9ZabaZKT7sIShKc,137
137
- browsergym_workarena-0.4.3.dist-info/licenses/LICENSE,sha256=sZLFiZHo_1hcxXRhXUDnQYVATUuWwRCdQjBxqxNnNEs,579
138
- browsergym_workarena-0.4.3.dist-info/RECORD,,
135
+ browsergym_workarena-0.4.4.dist-info/METADATA,sha256=Oh9OgOSknd_krKVFxUzvq2dtZN70-VBLoINxi31s6co,11698
136
+ browsergym_workarena-0.4.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
137
+ browsergym_workarena-0.4.4.dist-info/entry_points.txt,sha256=1lCeAbQFCcU6UTFwS5QIA3TKhT2P9ZabaZKT7sIShKc,137
138
+ browsergym_workarena-0.4.4.dist-info/licenses/LICENSE,sha256=sZLFiZHo_1hcxXRhXUDnQYVATUuWwRCdQjBxqxNnNEs,579
139
+ browsergym_workarena-0.4.4.dist-info/RECORD,,