browsergym-workarena 0.4.4__tar.gz → 0.5.0__tar.gz

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 (169) hide show
  1. browsergym_workarena-0.5.0/CITATION.cff +81 -0
  2. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/PKG-INFO +9 -21
  3. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/README.md +7 -20
  4. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/requirements.txt +1 -0
  5. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/__init__.py +1 -1
  6. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/config.py +6 -0
  7. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/install.py +56 -3
  8. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/instance.py +101 -17
  9. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/dashboard.py +20 -12
  10. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/generate_dashboard_configs.py +11 -2
  11. browsergym_workarena-0.4.4/src/browsergym/workarena/tasks/scripts/navigation.py → browsergym_workarena-0.5.0/src/browsergym/workarena/tasks/scripts/generate_navigation_tasks.py +4 -1
  12. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/knowledge.py +6 -4
  13. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/wa_action_traces.py +9 -2
  14. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  15. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/.github/workflows/pypi.yml +0 -0
  16. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/.github/workflows/unit_tests.yml +0 -0
  17. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/.gitignore +0 -0
  18. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/CODE_OF_CONDUCT.md +0 -0
  19. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/LICENSE +0 -0
  20. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/SECURITY.md +0 -0
  21. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/assets/WorkArena_banner.png +0 -0
  22. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/dcat-metadata.jsonld +0 -0
  23. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/dev/environment.yaml +0 -0
  24. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/dev/requirements.txt +0 -0
  25. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/generate_knowledge_base.ipynb +0 -0
  26. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/make_human_eval_curriculum.py +0 -0
  27. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/pyproject.toml +0 -0
  28. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/scripts/extract_finetuning_traces.py +0 -0
  29. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/scripts/generate_knowledge_base.ipynb +0 -0
  30. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/scripts/make_human_eval_curriculum.py +0 -0
  31. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/__init__.py +0 -0
  32. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/category.py +0 -0
  33. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/change_request.py +0 -0
  34. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/computer_asset.py +0 -0
  35. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/cost_center.py +0 -0
  36. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/expense_line.py +0 -0
  37. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/incident.py +0 -0
  38. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/knowledge.py +0 -0
  39. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/problem.py +0 -0
  40. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/report.py +0 -0
  41. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/requested_items.py +0 -0
  42. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/requests.py +0 -0
  43. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/system_properties.py +0 -0
  44. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/ui_themes.py +0 -0
  45. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/user.py +0 -0
  46. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/api/utils.py +0 -0
  47. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_change_request_form_fields.json +0 -0
  48. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_hardware_form_fields.json +0 -0
  49. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_incident_form_fields.json +0 -0
  50. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_problem_form_fields.json +0 -0
  51. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_request_item_form_fields.json +0 -0
  52. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/forms/expected_user_form_fields.json +0 -0
  53. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/knowledge/kb_autopublish_workflow.xml +0 -0
  54. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/knowledge/knowledge_base.json +0 -0
  55. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/knowledge/protocols.json +0 -0
  56. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/knowledge/test.html +0 -0
  57. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_asset_list_columns.json +0 -0
  58. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_change_request_list_columns.json +0 -0
  59. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_expense_line_list_columns.json +0 -0
  60. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_hardware_list_columns.json +0 -0
  61. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_incident_list_columns.json +0 -0
  62. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_problem_list_columns.json +0 -0
  63. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_requested_items_list_columns.json +0 -0
  64. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_service_catalog_list_columns.json +0 -0
  65. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/lists/expected_user_list_columns.json +0 -0
  66. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/setup_files/ui_themes/workarena_themes.xml +0 -0
  67. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/all_menu.json +0 -0
  68. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_change_request_task.json +0 -0
  69. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_hardware_asset_task.json +0 -0
  70. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_incident_task.json +0 -0
  71. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_problem_task.json +0 -0
  72. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/create_user_task.json +0 -0
  73. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/dashboard_retrieval_minmax_task.json +0 -0
  74. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/dashboard_retrieval_value_task.json +0 -0
  75. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_asset_list_task.json +0 -0
  76. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_change_request_list_task.json +0 -0
  77. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_hardware_list_task.json +0 -0
  78. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_incident_list_task.json +0 -0
  79. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_service_catalog_item_list_task.json +0 -0
  80. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/filter_user_list_task.json +0 -0
  81. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/impersonation_users.json +0 -0
  82. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/knowledge_base_configs.json +0 -0
  83. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_apple_mac_book_pro15_task.json +0 -0
  84. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_apple_watch_task.json +0 -0
  85. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_developer_laptop_task.json +0 -0
  86. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_development_laptop_pc_task.json +0 -0
  87. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_ipad_mini_task.json +0 -0
  88. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_ipad_pro_task.json +0 -0
  89. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_loaner_laptop_task.json +0 -0
  90. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_sales_laptop_task.json +0 -0
  91. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/order_standard_laptop_task.json +0 -0
  92. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json +0 -0
  93. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json +0 -0
  94. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_asset_list_task.json +0 -0
  95. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_change_request_list_task.json +0 -0
  96. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_hardware_list_task.json +0 -0
  97. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_incident_list_task.json +0 -0
  98. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_service_catalog_item_list_task.json +0 -0
  99. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/data_files/task_configs/sort_user_list_task.json +0 -0
  100. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/human_eval/console.js +0 -0
  101. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/human_eval/tool.py +0 -0
  102. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/__init__.py +0 -0
  103. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/base.py +0 -0
  104. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/comp_building_block.py +0 -0
  105. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/__init__.py +0 -0
  106. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/base.py +0 -0
  107. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_base.py +0 -0
  108. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_catalog.py +0 -0
  109. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_catalog_infeasible.py +0 -0
  110. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_create_incident.py +0 -0
  111. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_create_incident_infeasible.py +0 -0
  112. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_create_problem.py +0 -0
  113. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_create_problem_infeasible.py +0 -0
  114. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_filter.py +0 -0
  115. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_request_item.py +0 -0
  116. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/dash_do_request_item_infeasible.py +0 -0
  117. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/delete_record.py +0 -0
  118. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/edit_knowledge_base.py +0 -0
  119. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/expense_management.py +0 -0
  120. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/filter_and_do.py +0 -0
  121. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/find_and_order_item.py +0 -0
  122. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/manage_change_request_schedule.py +0 -0
  123. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/mark_duplicate_problems.py +0 -0
  124. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/maximize_investment_return.py +0 -0
  125. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/navigate_and_do.py +0 -0
  126. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/navigate_and_do_infeasible.py +0 -0
  127. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/offboard_user.py +0 -0
  128. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/onboard_user.py +0 -0
  129. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/update_task.py +0 -0
  130. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/utils/curriculum.py +0 -0
  131. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/utils/infeasible_configs.py +0 -0
  132. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/utils/knapsack.py +0 -0
  133. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/warranty_check.py +0 -0
  134. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/work_assignment.py +0 -0
  135. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/compositional/workload_balancing.py +0 -0
  136. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/form.py +0 -0
  137. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/knowledge.py +0 -0
  138. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/list.py +0 -0
  139. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/mark_duplicate_problem.py +0 -0
  140. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/navigation.py +0 -0
  141. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/README.md +0 -0
  142. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/extract_all_menu_items.py +0 -0
  143. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/generate_forms.py +0 -0
  144. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/list.py +0 -0
  145. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/service_catalog.py +0 -0
  146. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/scripts/validate.py +0 -0
  147. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/send_chat_message.py +0 -0
  148. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/service_catalog.py +0 -0
  149. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/__init__.py +0 -0
  150. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/debug.py +0 -0
  151. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/form.py +0 -0
  152. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/js_utils.js +0 -0
  153. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/private_tasks.py +0 -0
  154. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/string.py +0 -0
  155. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/tasks/utils/utils.py +0 -0
  156. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/browsergym/workarena/utils.py +0 -0
  157. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/src/workarena_test.py +0 -0
  158. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_api.py +0 -0
  159. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_compositional.py +0 -0
  160. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_compositional_utils.py +0 -0
  161. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_filter_list_task.py +0 -0
  162. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_random_config_generation.py +0 -0
  163. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_snow_instance.py +0 -0
  164. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_task_from_config.py +0 -0
  165. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_task_general.py +0 -0
  166. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_task_setup.py +0 -0
  167. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_utils.py +0 -0
  168. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/test_validate.py +0 -0
  169. {browsergym_workarena-0.4.4 → browsergym_workarena-0.5.0}/tests/utils.py +0 -0
@@ -0,0 +1,81 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use WorkArena in your research, please cite both of the following papers."
3
+ title: "WorkArena"
4
+ date-released: 2024-03-12
5
+ url: "https://github.com/ServiceNow/workarena"
6
+ license: "Apache-2.0"
7
+
8
+ authors:
9
+ - family-names: Drouin
10
+ given-names: Alexandre
11
+ - family-names: Gasse
12
+ given-names: Maxime
13
+ - family-names: Caccia
14
+ given-names: Massimo
15
+ - family-names: Laradji
16
+ given-names: Issam H.
17
+ - family-names: Del Verme
18
+ given-names: Manuel
19
+ - family-names: Marty
20
+ given-names: Tom
21
+ - family-names: Vazquez
22
+ given-names: David
23
+ - family-names: Chapados
24
+ given-names: Nicolas
25
+ - family-names: Lacoste
26
+ given-names: Alexandre
27
+
28
+ preferred-citation:
29
+ - type: inproceedings
30
+ title: "WorkArena: How Capable are Web Agents at Solving Common Knowledge Work Tasks?"
31
+ authors:
32
+ - family-names: Drouin
33
+ given-names: Alexandre
34
+ - family-names: Gasse
35
+ given-names: Maxime
36
+ - family-names: Caccia
37
+ given-names: Massimo
38
+ - family-names: Laradji
39
+ given-names: Issam H.
40
+ - family-names: Del Verme
41
+ given-names: Manuel
42
+ - family-names: Marty
43
+ given-names: Tom
44
+ - family-names: Vazquez
45
+ given-names: David
46
+ - family-names: Chapados
47
+ given-names: Nicolas
48
+ - family-names: Lacoste
49
+ given-names: Alexandre
50
+ booktitle: "Proceedings of the 41st International Conference on Machine Learning (ICML)"
51
+ series: "Proceedings of Machine Learning Research"
52
+ volume: 235
53
+ pages: "11642–11662"
54
+ year: 2024
55
+ url: "https://proceedings.mlr.press/v235/drouin24a.html"
56
+
57
+ - type: inproceedings
58
+ title: "WorkArena++: Towards Compositional Planning and Reasoning-based Common Knowledge Work Tasks"
59
+ authors:
60
+ - family-names: Boisvert
61
+ given-names: Léo
62
+ - family-names: Thakkar
63
+ given-names: Megh
64
+ - family-names: Gasse
65
+ given-names: Maxime
66
+ - family-names: Caccia
67
+ given-names: Massimo
68
+ - family-names: Le Sellier De Chezelles
69
+ given-names: Thibault
70
+ - family-names: Cappart
71
+ given-names: Quentin
72
+ - family-names: Chapados
73
+ given-names: Nicolas
74
+ - family-names: Lacoste
75
+ given-names: Alexandre
76
+ - family-names: Drouin
77
+ given-names: Alexandre
78
+ booktitle: "Advances in Neural Information Processing Systems 37 (NeurIPS 2024), Datasets & Benchmarks Track"
79
+ year: 2024
80
+ url: "https://proceedings.neurips.cc/paper_files/paper/2024/hash/0b82662b6c32e887bb252a74d8cb2d5e-Paper-Datasets_and_Benchmarks_Track.pdf"
81
+ doi: "10.52202/079017-0195"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: browsergym-workarena
3
- Version: 0.4.4
3
+ Version: 0.5.0
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
@@ -16,6 +16,7 @@ Requires-Python: >3.7
16
16
  Requires-Dist: browsergym-core>=0.2
17
17
  Requires-Dist: english-words>=2.0.1
18
18
  Requires-Dist: faker>=24.8.0
19
+ Requires-Dist: huggingface-hub>=0.23
19
20
  Requires-Dist: numpy>=1.14
20
21
  Requires-Dist: requests>=2.31
21
22
  Requires-Dist: tenacity>=8.2.3
@@ -65,28 +66,19 @@ https://github.com/ServiceNow/WorkArena/assets/2374980/68640f09-7d6f-4eb1-b556-c
65
66
 
66
67
  ## Getting Started
67
68
 
68
- To setup WorkArena, you will need to get your own ServiceNow instance, install our Python package, and upload some data to your instance. Follow the steps below to achieve this.
69
+ To setup WorkArena, you will need to gain access to ServiceNow instances and install our Python package locally. Follow the steps below to achieve this.
69
70
 
70
- ### a) Create a ServiceNow Developer Instance
71
+ ### a) Gain Access to ServiceNow Instances
71
72
 
72
- 1. Go to https://developer.servicenow.com/ and create an account.
73
- 2. Click on `Request an instance` and select the `Washington` release (initializing the instance will take a few minutes)
74
- 3. Once the instance is ready, you should see your instance URL and credentials. If not, click _Return to the Developer Portal_, then navigate to _Manage instance password_ and click _Reset instance password_.
75
- 4. Change the role of the user to admin in yoyr instance parameters ![image](https://github.com/user-attachments/assets/6f0fbf8e-f40f-411a-84cb-fead93d85f60)
73
+ 1. Navigate to https://huggingface.co/datasets/ServiceNow/WorkArena-Instances.
74
+ 2. Fill the form, accept the terms to gain access to the gated repository and wait for approval.
75
+ 3. Ensure that the machine where you will run WorkArena is [authenticated with Hugging Face](https://huggingface.co/docs/hub/en/datasets-polars-auth) (e.g., via huggingface-cli login or the HUGGING_FACE_HUB_TOKEN environment variable).
76
76
 
77
- 5. You should now see your URL and credentials. Based on this information, set the following environment variables:
78
- * `SNOW_INSTANCE_URL`: The URL of your ServiceNow developer instance
79
- * `SNOW_INSTANCE_UNAME`: The username, should be "admin"
80
- * `SNOW_INSTANCE_PWD`: The password, make sure you place the value in quotes "" and be mindful of [escaping special shell characters](https://onlinelinuxtools.com/escape-shell-characters). Running `echo $SNOW_INSTANCE_PWD` should print the correct password.
81
- 6. Log into your instance via a browser using the admin credentials. Close any popup that appears on the main screen (e.g., agreeing to analytics).
82
-
83
- **Warning:** Feel free to look around the platform, but please make sure you revert any changes (e.g., changes to list views, pinning some menus, etc.) as these changes will be persistent and affect the benchmarking process.
84
-
85
- ### b) Install WorkArena and Initialize your Instance
77
+ ### b) Install WorkArena
86
78
 
87
79
  Run the following command to install WorkArena in the [BrowswerGym](https://github.com/servicenow/browsergym) environment:
88
80
  ```
89
- pip install browsergym
81
+ pip install browsergym-workarena
90
82
  ```
91
83
 
92
84
  Then, install [Playwright](https://github.com/microsoft/playwright):
@@ -94,10 +86,6 @@ Then, install [Playwright](https://github.com/microsoft/playwright):
94
86
  playwright install
95
87
  ```
96
88
 
97
- Finally, run this command in a terminal to upload the benchmark data to your ServiceNow instance:
98
- ```
99
- workarena-install
100
- ```
101
89
  Your installation is now complete! 🎉
102
90
 
103
91
 
@@ -41,28 +41,19 @@ https://github.com/ServiceNow/WorkArena/assets/2374980/68640f09-7d6f-4eb1-b556-c
41
41
 
42
42
  ## Getting Started
43
43
 
44
- To setup WorkArena, you will need to get your own ServiceNow instance, install our Python package, and upload some data to your instance. Follow the steps below to achieve this.
44
+ To setup WorkArena, you will need to gain access to ServiceNow instances and install our Python package locally. Follow the steps below to achieve this.
45
45
 
46
- ### a) Create a ServiceNow Developer Instance
46
+ ### a) Gain Access to ServiceNow Instances
47
47
 
48
- 1. Go to https://developer.servicenow.com/ and create an account.
49
- 2. Click on `Request an instance` and select the `Washington` release (initializing the instance will take a few minutes)
50
- 3. Once the instance is ready, you should see your instance URL and credentials. If not, click _Return to the Developer Portal_, then navigate to _Manage instance password_ and click _Reset instance password_.
51
- 4. Change the role of the user to admin in yoyr instance parameters ![image](https://github.com/user-attachments/assets/6f0fbf8e-f40f-411a-84cb-fead93d85f60)
48
+ 1. Navigate to https://huggingface.co/datasets/ServiceNow/WorkArena-Instances.
49
+ 2. Fill the form, accept the terms to gain access to the gated repository and wait for approval.
50
+ 3. Ensure that the machine where you will run WorkArena is [authenticated with Hugging Face](https://huggingface.co/docs/hub/en/datasets-polars-auth) (e.g., via huggingface-cli login or the HUGGING_FACE_HUB_TOKEN environment variable).
52
51
 
53
- 5. You should now see your URL and credentials. Based on this information, set the following environment variables:
54
- * `SNOW_INSTANCE_URL`: The URL of your ServiceNow developer instance
55
- * `SNOW_INSTANCE_UNAME`: The username, should be "admin"
56
- * `SNOW_INSTANCE_PWD`: The password, make sure you place the value in quotes "" and be mindful of [escaping special shell characters](https://onlinelinuxtools.com/escape-shell-characters). Running `echo $SNOW_INSTANCE_PWD` should print the correct password.
57
- 6. Log into your instance via a browser using the admin credentials. Close any popup that appears on the main screen (e.g., agreeing to analytics).
58
-
59
- **Warning:** Feel free to look around the platform, but please make sure you revert any changes (e.g., changes to list views, pinning some menus, etc.) as these changes will be persistent and affect the benchmarking process.
60
-
61
- ### b) Install WorkArena and Initialize your Instance
52
+ ### b) Install WorkArena
62
53
 
63
54
  Run the following command to install WorkArena in the [BrowswerGym](https://github.com/servicenow/browsergym) environment:
64
55
  ```
65
- pip install browsergym
56
+ pip install browsergym-workarena
66
57
  ```
67
58
 
68
59
  Then, install [Playwright](https://github.com/microsoft/playwright):
@@ -70,10 +61,6 @@ Then, install [Playwright](https://github.com/microsoft/playwright):
70
61
  playwright install
71
62
  ```
72
63
 
73
- Finally, run this command in a terminal to upload the benchmark data to your ServiceNow instance:
74
- ```
75
- workarena-install
76
- ```
77
64
  Your installation is now complete! 🎉
78
65
 
79
66
 
@@ -5,3 +5,4 @@ numpy>=1.14
5
5
  requests>=2.31
6
6
  tenacity>=8.2.3 # only used in cheat() -> move to tests?
7
7
  tqdm>=4.66.2
8
+ huggingface_hub>=0.23
@@ -1,4 +1,4 @@
1
- __version__ = "0.4.4"
1
+ __version__ = "0.5.0"
2
2
 
3
3
  import inspect
4
4
  from logging import warning
@@ -11,6 +11,12 @@ SNOW_BROWSER_TIMEOUT = 30000 # Milliseconds
11
11
  SNOW_JS_UTILS_FILEPATH = str(resources.files(utils).joinpath("js_utils.js"))
12
12
  SNOW_SUPPORTED_RELEASES = ["washingtondc"]
13
13
 
14
+ # Hugging Face dataset containing available instances
15
+ INSTANCE_REPO_ID = "ServiceNow/WorkArena-Instances"
16
+ INSTANCE_REPO_FILENAME = "instances.json"
17
+ INSTANCE_REPO_TYPE = "dataset"
18
+ INSTANCE_XOR_SEED = "x3!+-9mi#nhlo%a02$9hna{]"
19
+
14
20
  # Path to the Menu navigation task configuration
15
21
  ALL_MENU_PATH = str(resources.files(data_files).joinpath("task_configs/all_menu.json"))
16
22
 
@@ -1,3 +1,6 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
1
4
  import html
2
5
  import json
3
6
  import logging
@@ -48,10 +51,36 @@ from .config import (
48
51
  UI_THEMES_UPDATE_SET,
49
52
  )
50
53
  from .api.user import set_user_preference
51
- from .instance import SNowInstance
54
+ from .instance import SNowInstance as _BaseSNowInstance
52
55
  from .utils import url_login
53
56
 
54
57
 
58
+ _CLI_INSTANCE_URL: str | None = None
59
+ _CLI_INSTANCE_PASSWORD: str | None = None
60
+
61
+
62
+ def SNowInstance(snow_credentials: tuple[str, str] | None = None):
63
+ """
64
+ Wrapper around the standard SNowInstance that uses CLI-provided instance URL and password if none are provided.
65
+ """
66
+ if not _CLI_INSTANCE_URL:
67
+ raise RuntimeError("Installer requires --instance-url to create a SNowInstance.")
68
+
69
+ resolved_creds = snow_credentials
70
+
71
+ if resolved_creds is None:
72
+ if not _CLI_INSTANCE_PASSWORD:
73
+ raise RuntimeError(
74
+ "Installer requires --instance-password (or explicit credentials) to create a SNowInstance."
75
+ )
76
+ resolved_creds = ("admin", _CLI_INSTANCE_PASSWORD)
77
+
78
+ return _BaseSNowInstance(
79
+ snow_url=_CLI_INSTANCE_URL,
80
+ snow_credentials=resolved_creds,
81
+ )
82
+
83
+
55
84
  def _is_dev_portal_instance() -> bool:
56
85
  """
57
86
  Check if the instance is a ServiceNow Developer Portal instance.
@@ -790,13 +819,20 @@ def disable_password_policies():
790
819
  set_sys_property(
791
820
  instance=SNowInstance(), property_name="glide.apply.password_policy.on_login", value="false"
792
821
  )
793
- # The following is not supported on developer portal instances
794
- if not _is_dev_portal_instance():
822
+ # Exception handling since this property is sometimes read-only on some instances
823
+ try:
795
824
  set_sys_property(
796
825
  instance=SNowInstance(),
797
826
  property_name="glide.authenticate.api.user.reset_password.mandatory",
798
827
  value="false",
799
828
  )
829
+ except Exception:
830
+ logging.warning(
831
+ "Warning: Failed to set sys property "
832
+ "'glide.authenticate.api.user.reset_password.mandatory'. Continuing.",
833
+ exc_info=True,
834
+ )
835
+
800
836
  logging.info("Password policies disabled.")
801
837
 
802
838
 
@@ -1098,6 +1134,23 @@ def main():
1098
1134
  Entrypoint for package CLI installation command
1099
1135
 
1100
1136
  """
1137
+ parser = argparse.ArgumentParser(
1138
+ description="Install WorkArena artifacts on a ServiceNow instance."
1139
+ )
1140
+ parser.add_argument(
1141
+ "--instance-url", required=True, help="URL of the target ServiceNow instance."
1142
+ )
1143
+ parser.add_argument(
1144
+ "--instance-password",
1145
+ required=True,
1146
+ help="Password for the admin user on the target ServiceNow instance.",
1147
+ )
1148
+ args = parser.parse_args()
1149
+
1150
+ global _CLI_INSTANCE_URL, _CLI_INSTANCE_PASSWORD
1151
+ _CLI_INSTANCE_URL = args.instance_url
1152
+ _CLI_INSTANCE_PASSWORD = args.instance_password
1153
+
1101
1154
  logging.basicConfig(level=logging.INFO)
1102
1155
 
1103
1156
  try:
@@ -1,12 +1,88 @@
1
+ import base64
1
2
  import json
3
+ import logging
2
4
  import os
5
+ import random
3
6
  import requests
4
- import re
7
+ from itertools import cycle
5
8
 
9
+ from huggingface_hub import hf_hub_download
10
+ from huggingface_hub.utils import disable_progress_bars
6
11
  from playwright.sync_api import sync_playwright
7
12
  from typing import Optional
8
13
 
9
- from .config import SNOW_BROWSER_TIMEOUT, REPORT_FILTER_PROPERTY
14
+ from .config import (
15
+ INSTANCE_REPO_FILENAME,
16
+ INSTANCE_REPO_ID,
17
+ INSTANCE_REPO_TYPE,
18
+ INSTANCE_XOR_SEED,
19
+ REPORT_FILTER_PROPERTY,
20
+ SNOW_BROWSER_TIMEOUT,
21
+ )
22
+
23
+
24
+ # Required to read the instance credentials
25
+ if not INSTANCE_XOR_SEED:
26
+ raise ValueError("INSTANCE_XOR_SEED must be configured")
27
+
28
+
29
+ def _xor_cipher(data: bytes, key: bytes) -> bytes:
30
+ return bytes(b ^ k for b, k in zip(data, cycle(key)))
31
+
32
+
33
+ def decrypt_instance_password(encrypted_password: str) -> str:
34
+ """Decrypt a base64-encoded XOR-obfuscated password using the shared key."""
35
+
36
+ cipher_bytes = base64.b64decode(encrypted_password)
37
+ plain_bytes = _xor_cipher(cipher_bytes, INSTANCE_XOR_SEED.encode("utf-8"))
38
+ return plain_bytes.decode("utf-8")
39
+
40
+
41
+ def encrypt_instance_password(password: str) -> str:
42
+ """Helper to produce encrypted passwords for populating the instance file."""
43
+
44
+ cipher_bytes = _xor_cipher(password.encode("utf-8"), INSTANCE_XOR_SEED.encode("utf-8"))
45
+ return base64.b64encode(cipher_bytes).decode("utf-8")
46
+
47
+
48
+ def fetch_instances():
49
+ """
50
+ Load the latest instances from either a custom pool (SNOW_INSTANCE_POOL env var) or the gated HF dataset.
51
+ """
52
+ pool_path = os.getenv("SNOW_INSTANCE_POOL")
53
+ if pool_path:
54
+ path = os.path.expanduser(pool_path)
55
+ if not os.path.exists(path):
56
+ raise FileNotFoundError(
57
+ f"SNOW_INSTANCE_POOL points to '{pool_path}', but the file does not exist."
58
+ )
59
+ logging.info("Loading ServiceNow instances from custom pool: %s", path)
60
+ else:
61
+ try:
62
+ disable_progress_bars()
63
+ path = hf_hub_download(
64
+ repo_id=INSTANCE_REPO_ID,
65
+ filename=INSTANCE_REPO_FILENAME,
66
+ repo_type=INSTANCE_REPO_TYPE,
67
+ )
68
+ logging.info("Loaded ServiceNow instances from the default instance pool.")
69
+ except Exception as e:
70
+ raise RuntimeError(
71
+ f"Could not access {INSTANCE_REPO_ID}/{INSTANCE_REPO_FILENAME}. "
72
+ "Make sure you have been granted access to the gated repo and that you are "
73
+ "authenticated (run `huggingface-cli login` or set HUGGING_FACE_HUB_TOKEN)."
74
+ ) from e
75
+
76
+ with open(path, "r", encoding="utf-8") as f:
77
+ entries = json.load(f)
78
+
79
+ for entry in entries:
80
+ entry["url"] = entry["u"]
81
+ entry["password"] = decrypt_instance_password(entry["p"])
82
+ del entry["u"]
83
+ del entry["p"]
84
+
85
+ return entries
10
86
 
11
87
 
12
88
  class SNowInstance:
@@ -26,31 +102,39 @@ class SNowInstance:
26
102
  Parameters:
27
103
  -----------
28
104
  snow_url: str
29
- The URL of a SNow instance. If None, will try to get the value from the environment variable SNOW_INSTANCE_URL.
105
+ The URL of a SNow instance. When omitted, the constructor first looks for SNOW_INSTANCE_URL and falls back
106
+ to a random instance from the benchmark's instance pool if the environment variable is not set.
30
107
  snow_credentials: (str, str)
31
- The username and password used to access the SNow instance. If None, will try to get the values from the
32
- environment variables SNOW_INSTANCE_UNAME and SNOW_INSTANCE_PWD.
108
+ The username and password used to access the SNow instance. When omitted, environment variables
109
+ SNOW_INSTANCE_UNAME/SNOW_INSTANCE_PWD are used if set; otherwise, a random instance from the benchmark's
110
+ instance pool is selected.
33
111
 
34
112
  """
35
113
  # try to get these values from environment variables if not provided
36
- if snow_url is None:
37
- if "SNOW_INSTANCE_URL" in os.environ:
114
+ if snow_url is None or snow_credentials is None:
115
+
116
+ # Check if all required environment variables are set and if yes, fetch url and credentials from there
117
+ if (
118
+ "SNOW_INSTANCE_URL" in os.environ
119
+ and "SNOW_INSTANCE_UNAME" in os.environ
120
+ and "SNOW_INSTANCE_PWD" in os.environ
121
+ ):
38
122
  snow_url = os.environ["SNOW_INSTANCE_URL"]
39
- else:
40
- raise ValueError(
41
- f"Please provide a ServiceNow instance URL (you can use the environment variable SNOW_INSTANCE_URL)"
42
- )
43
-
44
- if snow_credentials is None:
45
- if "SNOW_INSTANCE_UNAME" in os.environ and "SNOW_INSTANCE_PWD" in os.environ:
46
123
  snow_credentials = (
47
124
  os.environ["SNOW_INSTANCE_UNAME"],
48
125
  os.environ["SNOW_INSTANCE_PWD"],
49
126
  )
127
+
128
+ # Otherwise, load all instances and select one randomly
50
129
  else:
51
- raise ValueError(
52
- f"Please provide ServiceNow credentials (you can use the environment variables SNOW_INSTANCE_UNAME and SNOW_INSTANCE_PWD)"
53
- )
130
+ instances = fetch_instances()
131
+ if not instances:
132
+ raise ValueError(
133
+ f"No instances found in the dataset {INSTANCE_REPO_ID}. Please provide instance details via parameters or environment variables."
134
+ )
135
+ instance = random.choice(instances)
136
+ snow_url = instance["url"]
137
+ snow_credentials = ("admin", instance["password"])
54
138
 
55
139
  # remove trailing slashes in the URL, if any
56
140
  self.snow_url = snow_url.rstrip("/")
@@ -29,15 +29,6 @@ from .utils.utils import check_url_suffix_match
29
29
  # - We currently don't support maps because they are clickable and would require a more evolved cheat function
30
30
  SUPPORTED_PLOT_TYPES = ["area", "bar", "column", "line", "pie", "spline"]
31
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
-
41
32
 
42
33
  class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
43
34
  """
@@ -303,14 +294,28 @@ class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
303
294
  """,
304
295
  ]
305
296
 
306
- def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str | dict]:
307
- super().setup_goal(page=page)
297
+ def _get_filter_config(self) -> str:
298
+ # Get report filter config
299
+ config = self.instance.report_filter_config
300
+ if config is None:
301
+ REPORT_DATE_FILTER = REPORT_TIME_FILTER = None
302
+ else:
303
+ REPORT_DATE_FILTER = config["report_date_filter"]
304
+ REPORT_TIME_FILTER = config["report_time_filter"]
305
+ del config
308
306
 
309
307
  # Check that the report filters are properly setup
310
308
  if REPORT_DATE_FILTER is None or REPORT_TIME_FILTER is None:
311
309
  raise RuntimeError(
312
310
  "The report date and time filters are not set. Please run the install script to set them."
313
311
  )
312
+ return REPORT_DATE_FILTER, REPORT_TIME_FILTER
313
+
314
+ def setup_goal(self, page: playwright.sync_api.Page) -> Tuple[str | dict]:
315
+ super().setup_goal(page=page)
316
+
317
+ # Get the instance report filter config
318
+ REPORT_DATE_FILTER, REPORT_TIME_FILTER = self._get_filter_config()
314
319
 
315
320
  # Configure task
316
321
  # ... sample a configuration
@@ -632,6 +637,9 @@ class DashboardRetrievalTask(AbstractServiceNowTask, ABC):
632
637
  The types of questions to sample from (uniformely)
633
638
 
634
639
  """
640
+ # Get the instance report filter config
641
+ REPORT_DATE_FILTER, REPORT_TIME_FILTER = self._get_filter_config()
642
+
635
643
  # Check that the report filters are properly setup
636
644
  if REPORT_DATE_FILTER is None or REPORT_TIME_FILTER is None:
637
645
  raise RuntimeError(
@@ -798,7 +806,7 @@ class SingleChartMeanMedianModeRetrievalTask(
798
806
 
799
807
 
800
808
  class WorkLoadBalancingMinMaxRetrievalTask(
801
- MultiChartMinMaxRetrievalTask, CompositionalBuildingBlockTask
809
+ SingleChartMinMaxRetrievalTask, CompositionalBuildingBlockTask
802
810
  ):
803
811
  def all_configs(self):
804
812
  return json.load(open(REPORT_RETRIEVAL_MINMAX_CONFIG_PATH, "r"))
@@ -15,7 +15,6 @@ from playwright.sync_api import sync_playwright
15
15
 
16
16
  from browsergym.workarena.api.utils import table_api_call, table_column_info
17
17
  from browsergym.workarena.config import (
18
- REPORT_DATE_FILTER,
19
18
  REPORT_PATCH_FLAG,
20
19
  REPORT_RETRIEVAL_MINMAX_CONFIG_PATH,
21
20
  REPORT_RETRIEVAL_VALUE_CONFIG_PATH,
@@ -44,6 +43,10 @@ class DummyDashboard(DashboardRetrievalTask):
44
43
 
45
44
 
46
45
  def get_report_urls(instance):
46
+ # Get the instance report filter config
47
+ REPORT_DATE_FILTER, REPORT_TIME_FILTER = instance._get_filter_config()
48
+ raise NotImplementedError("TODO: Include the time filter as in dashboard.py")
49
+
47
50
  # Generate a bunch of reports on the fly based on valid table fields
48
51
  ON_THE_FLY_REPORTS = []
49
52
  for table in [
@@ -226,7 +229,13 @@ def get_all_configs_by_url(url, is_report):
226
229
 
227
230
 
228
231
  if __name__ == "__main__":
229
- instance = SNowInstance()
232
+
233
+ # XXX: Make sure to specific the exact instance on which to generate configs (and not use a random one)
234
+ raise NotImplementedError(
235
+ "Make sure to specific instance URL and credentials below, then comment this line."
236
+ )
237
+ instance = SNowInstance(snow_url=None, snow_credentials=None)
238
+
230
239
  reports = get_report_urls(instance)
231
240
  gen_func = partial(get_all_configs_by_url, is_report=REPORT)
232
241
 
@@ -6,7 +6,10 @@ NUM_CONFIGS = 650 # number of impersonation tasks in the paper
6
6
 
7
7
 
8
8
  def get_all_impersonation_users():
9
- instance = SNowInstance()
9
+ raise NotImplementedError(
10
+ "Make sure to specific instance URL and credentials below, then comment this line."
11
+ )
12
+ instance = SNowInstance(snow_url=None, snow_credentials=None)
10
13
  candidate_users = [
11
14
  u["first_name"] + " " + u["last_name"]
12
15
  for u in table_api_call(
@@ -1,3 +1,4 @@
1
+ # TODO: Can we delete this file?
1
2
  import json
2
3
  import random
3
4
 
@@ -9,9 +10,8 @@ from tenacity import retry, stop_after_attempt
9
10
  from tqdm import tqdm
10
11
 
11
12
 
12
- def generate_all_kb_configs(instance=None, num_configs=1000) -> list[dict]:
13
+ def generate_all_kb_configs(instance, num_configs=1000) -> list[dict]:
13
14
  """Generate all possible KB configs"""
14
- instance = instance if instance is not None else SNowInstance()
15
15
  with open(KB_FILEPATH, "r") as f:
16
16
  kb_entries = json.load(f)
17
17
  all_configs = []
@@ -33,5 +33,7 @@ def generate_all_kb_configs(instance=None, num_configs=1000) -> list[dict]:
33
33
 
34
34
 
35
35
  if __name__ == "__main__":
36
-
37
- validate_kb_configs()
36
+ raise NotImplementedError(
37
+ "Make sure to specific instance URL and credentials below, then comment this line."
38
+ )
39
+ generate_all_kb_configs(instance=SNowInstance(snow_url=None))
@@ -111,8 +111,15 @@ def extract_trace(task_cls, headless=True):
111
111
  monkey_patch_playwright(observation_callback=env._get_obs, trace_storage=trace)
112
112
 
113
113
  env.reset()
114
- env.task.cheat(env.page, env.chat.messages)
115
- env.close()
114
+ # For compositional tasks, we need to cheat on each subtask
115
+ if hasattr(env.task, 'subtasks'):
116
+ # This is a compositional task, solve each subtask
117
+ for subtask_idx in range(len(env.task.subtasks)):
118
+ env.task.cheat(env.page, env.chat.messages, subtask_idx)
119
+ else:
120
+ # This is a regular task
121
+ env.task.cheat(env.page, env.chat.messages)
122
+ env.close()
116
123
 
117
124
  return trace
118
125