browsergym-workarena 0.5.1__tar.gz → 0.5.3__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 (172) hide show
  1. browsergym_workarena-0.5.3/.github/workflows/pool-telemetry.yml +41 -0
  2. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/PKG-INFO +2 -11
  3. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/README.md +1 -10
  4. browsergym_workarena-0.5.3/monitor_pool_usage.py +247 -0
  5. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/__init__.py +11 -1
  6. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/config.py +1 -1
  7. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/install.py +340 -77
  8. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/instance.py +13 -3
  9. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/form.py +48 -0
  10. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/list.py +54 -1
  11. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/service_catalog.py +57 -0
  12. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  13. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/.github/workflows/instance_pool_ci.yml +0 -0
  14. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/.github/workflows/pypi.yml +0 -0
  15. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/.github/workflows/unit_tests.yml +0 -0
  16. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/.gitignore +0 -0
  17. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/CITATION.cff +0 -0
  18. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/CODE_OF_CONDUCT.md +0 -0
  19. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/LICENSE +0 -0
  20. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/SECURITY.md +0 -0
  21. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/assets/WorkArena_banner.png +0 -0
  22. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/dcat-metadata.jsonld +0 -0
  23. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/dev/environment.yaml +0 -0
  24. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/dev/requirements.txt +0 -0
  25. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/generate_knowledge_base.ipynb +0 -0
  26. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/make_human_eval_curriculum.py +0 -0
  27. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/pyproject.toml +0 -0
  28. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/requirements.txt +0 -0
  29. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/scripts/extract_finetuning_traces.py +0 -0
  30. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/scripts/generate_knowledge_base.ipynb +0 -0
  31. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/scripts/make_human_eval_curriculum.py +0 -0
  32. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/__init__.py +0 -0
  33. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/category.py +0 -0
  34. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/change_request.py +0 -0
  35. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/computer_asset.py +0 -0
  36. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/cost_center.py +0 -0
  37. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/expense_line.py +0 -0
  38. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/incident.py +0 -0
  39. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/knowledge.py +0 -0
  40. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/problem.py +0 -0
  41. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/report.py +0 -0
  42. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/requested_items.py +0 -0
  43. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/requests.py +0 -0
  44. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/system_properties.py +0 -0
  45. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/ui_themes.py +0 -0
  46. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/user.py +0 -0
  47. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/api/utils.py +0 -0
  48. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/forms/expected_change_request_form_fields.json +0 -0
  49. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/forms/expected_hardware_form_fields.json +0 -0
  50. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/forms/expected_incident_form_fields.json +0 -0
  51. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/forms/expected_problem_form_fields.json +0 -0
  52. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/forms/expected_request_item_form_fields.json +0 -0
  53. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/forms/expected_user_form_fields.json +0 -0
  54. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/knowledge/kb_autopublish_workflow.xml +0 -0
  55. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/knowledge/knowledge_base.json +0 -0
  56. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/knowledge/protocols.json +0 -0
  57. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/knowledge/test.html +0 -0
  58. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/lists/expected_asset_list_columns.json +0 -0
  59. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/lists/expected_change_request_list_columns.json +0 -0
  60. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/lists/expected_expense_line_list_columns.json +0 -0
  61. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/lists/expected_hardware_list_columns.json +0 -0
  62. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/lists/expected_incident_list_columns.json +0 -0
  63. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/lists/expected_problem_list_columns.json +0 -0
  64. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/lists/expected_requested_items_list_columns.json +0 -0
  65. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/lists/expected_service_catalog_list_columns.json +0 -0
  66. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/lists/expected_user_list_columns.json +0 -0
  67. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/setup_files/ui_themes/workarena_themes.xml +0 -0
  68. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/all_menu.json +0 -0
  69. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/create_change_request_task.json +0 -0
  70. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/create_hardware_asset_task.json +0 -0
  71. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/create_incident_task.json +0 -0
  72. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/create_problem_task.json +0 -0
  73. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/create_user_task.json +0 -0
  74. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/dashboard_retrieval_minmax_task.json +0 -0
  75. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/dashboard_retrieval_value_task.json +0 -0
  76. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/filter_asset_list_task.json +0 -0
  77. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/filter_change_request_list_task.json +0 -0
  78. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/filter_hardware_list_task.json +0 -0
  79. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/filter_incident_list_task.json +0 -0
  80. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/filter_service_catalog_item_list_task.json +0 -0
  81. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/filter_user_list_task.json +0 -0
  82. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/impersonation_users.json +0 -0
  83. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/knowledge_base_configs.json +0 -0
  84. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/order_apple_mac_book_pro15_task.json +0 -0
  85. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/order_apple_watch_task.json +0 -0
  86. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/order_developer_laptop_task.json +0 -0
  87. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/order_development_laptop_pc_task.json +0 -0
  88. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/order_ipad_mini_task.json +0 -0
  89. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/order_ipad_pro_task.json +0 -0
  90. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/order_loaner_laptop_task.json +0 -0
  91. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/order_sales_laptop_task.json +0 -0
  92. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/order_standard_laptop_task.json +0 -0
  93. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json +0 -0
  94. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json +0 -0
  95. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/sort_asset_list_task.json +0 -0
  96. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/sort_change_request_list_task.json +0 -0
  97. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/sort_hardware_list_task.json +0 -0
  98. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/sort_incident_list_task.json +0 -0
  99. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/sort_service_catalog_item_list_task.json +0 -0
  100. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/data_files/task_configs/sort_user_list_task.json +0 -0
  101. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/human_eval/console.js +0 -0
  102. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/human_eval/tool.py +0 -0
  103. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/__init__.py +0 -0
  104. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/base.py +0 -0
  105. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/comp_building_block.py +0 -0
  106. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/__init__.py +0 -0
  107. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/base.py +0 -0
  108. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_base.py +0 -0
  109. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_catalog.py +0 -0
  110. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_catalog_infeasible.py +0 -0
  111. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_create_incident.py +0 -0
  112. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_create_incident_infeasible.py +0 -0
  113. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_create_problem.py +0 -0
  114. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_create_problem_infeasible.py +0 -0
  115. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_filter.py +0 -0
  116. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_request_item.py +0 -0
  117. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/dash_do_request_item_infeasible.py +0 -0
  118. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/delete_record.py +0 -0
  119. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/edit_knowledge_base.py +0 -0
  120. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/expense_management.py +0 -0
  121. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/filter_and_do.py +0 -0
  122. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/find_and_order_item.py +0 -0
  123. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/manage_change_request_schedule.py +0 -0
  124. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/mark_duplicate_problems.py +0 -0
  125. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/maximize_investment_return.py +0 -0
  126. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/navigate_and_do.py +0 -0
  127. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/navigate_and_do_infeasible.py +0 -0
  128. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/offboard_user.py +0 -0
  129. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/onboard_user.py +0 -0
  130. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/update_task.py +0 -0
  131. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/utils/curriculum.py +0 -0
  132. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/utils/infeasible_configs.py +0 -0
  133. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/utils/knapsack.py +0 -0
  134. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/warranty_check.py +0 -0
  135. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/work_assignment.py +0 -0
  136. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/compositional/workload_balancing.py +0 -0
  137. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/dashboard.py +0 -0
  138. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/knowledge.py +0 -0
  139. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/mark_duplicate_problem.py +0 -0
  140. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/navigation.py +0 -0
  141. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/scripts/README.md +0 -0
  142. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/scripts/extract_all_menu_items.py +0 -0
  143. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/scripts/generate_dashboard_configs.py +0 -0
  144. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/scripts/generate_forms.py +0 -0
  145. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/scripts/generate_navigation_tasks.py +0 -0
  146. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/scripts/knowledge.py +0 -0
  147. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/scripts/list.py +0 -0
  148. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/scripts/service_catalog.py +0 -0
  149. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/scripts/validate.py +0 -0
  150. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/send_chat_message.py +0 -0
  151. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/utils/__init__.py +0 -0
  152. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/utils/debug.py +0 -0
  153. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/utils/form.py +0 -0
  154. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/utils/js_utils.js +0 -0
  155. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/utils/private_tasks.py +0 -0
  156. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/utils/string.py +0 -0
  157. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/tasks/utils/utils.py +0 -0
  158. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/browsergym/workarena/utils.py +0 -0
  159. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/wa_action_traces.py +0 -0
  160. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/src/workarena_test.py +0 -0
  161. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_api.py +0 -0
  162. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_compositional.py +0 -0
  163. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_compositional_utils.py +0 -0
  164. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_filter_list_task.py +0 -0
  165. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_random_config_generation.py +0 -0
  166. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_snow_instance.py +0 -0
  167. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_task_from_config.py +0 -0
  168. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_task_general.py +0 -0
  169. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_task_setup.py +0 -0
  170. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_utils.py +0 -0
  171. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/test_validate.py +0 -0
  172. {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.3}/tests/utils.py +0 -0
@@ -0,0 +1,41 @@
1
+ name: Pool Usage Telemetry
2
+
3
+ on:
4
+ schedule:
5
+ # Run daily at 00:00 UTC
6
+ - cron: '0 0 * * *'
7
+ workflow_dispatch: # Allow manual trigger
8
+
9
+ jobs:
10
+ telemetry:
11
+ runs-on: ubuntu-latest
12
+
13
+ defaults:
14
+ run:
15
+ shell: bash -l {0}
16
+
17
+ env:
18
+ HUGGING_FACE_HUB_TOKEN: ${{ secrets.HUGGING_FACE_HUB_TOKEN }}
19
+
20
+ steps:
21
+ - name: Checkout repository
22
+ uses: actions/checkout@v4
23
+
24
+ - name: Set up Python
25
+ uses: actions/setup-python@v5
26
+ with:
27
+ python-version: '3.12'
28
+ cache: 'pip'
29
+
30
+ - name: Install Python dependencies
31
+ working-directory: ./dev
32
+ run: |
33
+ pip install -r requirements.txt
34
+ pip install huggingface_hub
35
+ pip install wandb>=0.16
36
+
37
+ - name: Run telemetry script
38
+ env:
39
+ WANDB_API_KEY: ${{ secrets.WANDB_API_KEY }}
40
+ run: |
41
+ python monitor_pool_usage.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: browsergym-workarena
3
- Version: 0.5.1
3
+ Version: 0.5.3
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
@@ -30,16 +30,6 @@ Description-Content-Type: text/markdown
30
30
  # WorkArena: A Benchmark for Evaluating Agents on Knowledge Work Tasks
31
31
  [[Benchmark Contents]](#benchmark-contents) ♦ [[Getting Started]](#getting-started) ♦ [[Live Demo]](#live-demo) ♦ [[BrowserGym]](https://github.com/ServiceNow/BrowserGym) ♦ [[Citing This Work]](#citing-this-work) ♦ [Join us on Discord!](https://discord.gg/rDkP69X7)
32
32
 
33
- ## Join Our Discord Community
34
-
35
- Want to brainstorm ideas, troubleshoot issues, or just geek out with fellow agent builders? Our official Discord server is the perfect place to connect and collaborate. Come hang out with us to:
36
-
37
- - Exchange tips, tricks, and success stories
38
- - Get real-time support and feedback
39
- - Stay updated on the latest features and announcements
40
-
41
- [Join us on Discord!](https://discord.gg/rDkP69X7)
42
-
43
33
  ---
44
34
 
45
35
  ### Explore the BrowserGym Ecosystem
@@ -73,6 +63,7 @@ To setup WorkArena, you will need to gain access to ServiceNow instances and ins
73
63
  1. Navigate to https://huggingface.co/datasets/ServiceNow/WorkArena-Instances.
74
64
  2. Fill the form, accept the terms to gain access to the gated repository and wait for approval.
75
65
  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).
66
+ 4. Unset any previous WorkArena environment variables if you are upgrading from a previous install (`SNOW_INSTANCE_URL`, etc.)
76
67
 
77
68
  ### b) Install WorkArena
78
69
 
@@ -5,16 +5,6 @@
5
5
  # WorkArena: A Benchmark for Evaluating Agents on Knowledge Work Tasks
6
6
  [[Benchmark Contents]](#benchmark-contents) ♦ [[Getting Started]](#getting-started) ♦ [[Live Demo]](#live-demo) ♦ [[BrowserGym]](https://github.com/ServiceNow/BrowserGym) ♦ [[Citing This Work]](#citing-this-work) ♦ [Join us on Discord!](https://discord.gg/rDkP69X7)
7
7
 
8
- ## Join Our Discord Community
9
-
10
- Want to brainstorm ideas, troubleshoot issues, or just geek out with fellow agent builders? Our official Discord server is the perfect place to connect and collaborate. Come hang out with us to:
11
-
12
- - Exchange tips, tricks, and success stories
13
- - Get real-time support and feedback
14
- - Stay updated on the latest features and announcements
15
-
16
- [Join us on Discord!](https://discord.gg/rDkP69X7)
17
-
18
8
  ---
19
9
 
20
10
  ### Explore the BrowserGym Ecosystem
@@ -48,6 +38,7 @@ To setup WorkArena, you will need to gain access to ServiceNow instances and ins
48
38
  1. Navigate to https://huggingface.co/datasets/ServiceNow/WorkArena-Instances.
49
39
  2. Fill the form, accept the terms to gain access to the gated repository and wait for approval.
50
40
  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).
41
+ 4. Unset any previous WorkArena environment variables if you are upgrading from a previous install (`SNOW_INSTANCE_URL`, etc.)
51
42
 
52
43
  ### b) Install WorkArena
53
44
 
@@ -0,0 +1,247 @@
1
+ #!/usr/bin/env python
2
+ """
3
+ Count how many users were created recently on each ServiceNow instance in the pool.
4
+
5
+ This reuses the instance loader and table API helper from the codebase.
6
+ """
7
+
8
+ import logging
9
+ from collections import defaultdict
10
+ from datetime import datetime, timedelta, timezone
11
+ from typing import Dict, List, Tuple
12
+
13
+ WAND_ENTITY = "alexdrouin"
14
+ WAND_PROJECT = "workarena-monitoring"
15
+ RUN_VERSION = "v3" # Increment if you need to recreate runs after deletion
16
+
17
+ from browsergym.workarena.api.utils import table_api_call
18
+ from browsergym.workarena.instance import SNowInstance, fetch_instances
19
+
20
+
21
+ def _time_window(hours: int = 24) -> Tuple[str, str]:
22
+ end = datetime.now(timezone.utc)
23
+ start = end - timedelta(hours=hours)
24
+ ts_format = "%Y-%m-%d %H:%M:%S"
25
+ return start.strftime(ts_format), end.strftime(ts_format)
26
+
27
+
28
+ def _fetch_user_creations(
29
+ instance: SNowInstance, start_ts: str, end_ts: str
30
+ ) -> List[Dict[str, str]]:
31
+ # Query the audit log directly so deleted users are still counted.
32
+ page_size = 10000 # avoid the default 100-row limit
33
+ offset = 0
34
+ seen: Dict[str, Dict[str, str]] = {}
35
+ while True:
36
+ params = {
37
+ "sysparm_query": f"tablename=sys_user^sys_created_on>={start_ts}^sys_created_on<{end_ts}",
38
+ "sysparm_fields": "documentkey,sys_created_on,user,fieldname,newvalue",
39
+ "sysparm_limit": page_size,
40
+ "sysparm_offset": offset,
41
+ }
42
+ response = table_api_call(instance=instance, table="sys_audit", params=params)
43
+ batch = response.get("result", [])
44
+ for audit in batch:
45
+ doc = audit.get("documentkey")
46
+ if not doc:
47
+ continue
48
+ # Keep the earliest audit entry per user record.
49
+ if doc not in seen or audit.get("sys_created_on", "") < seen[doc].get(
50
+ "sys_created_on", ""
51
+ ):
52
+ seen[doc] = audit
53
+ if len(batch) < page_size:
54
+ break
55
+ offset += page_size
56
+ return list(seen.values())
57
+
58
+
59
+ def _parse_sys_created(ts: str | None) -> datetime | None:
60
+ if not ts:
61
+ return None
62
+ ts = ts.replace("Z", "+00:00")
63
+ # Try ISO parsing with timezone if provided
64
+ try:
65
+ dt = datetime.fromisoformat(ts)
66
+ except ValueError:
67
+ dt = None
68
+ if dt is None:
69
+ for fmt in ("%Y-%m-%d %H:%M:%S.%f", "%Y-%m-%d %H:%M:%S"):
70
+ try:
71
+ dt = datetime.strptime(ts, fmt)
72
+ break
73
+ except ValueError:
74
+ continue
75
+ if dt is None:
76
+ return None
77
+ if dt.tzinfo is None:
78
+ dt = dt.replace(tzinfo=timezone.utc)
79
+ return dt.astimezone(timezone.utc)
80
+
81
+
82
+ def _hourly_counts(records: List[Dict[str, str]]) -> Dict[datetime, int]:
83
+ buckets: Dict[datetime, int] = defaultdict(int)
84
+ for record in records:
85
+ ts = _parse_sys_created(record.get("sys_created_on"))
86
+ if ts is None:
87
+ continue
88
+ bucket = ts.replace(minute=0, second=0, microsecond=0)
89
+ buckets[bucket] += 1
90
+ return buckets
91
+
92
+
93
+ def _daily_counts(records: List[Dict[str, str]]) -> Dict[datetime, int]:
94
+ buckets: Dict[datetime, int] = defaultdict(int)
95
+ for record in records:
96
+ ts = _parse_sys_created(record.get("sys_created_on"))
97
+ if ts is None:
98
+ continue
99
+ bucket = ts.replace(hour=0, minute=0, second=0, microsecond=0)
100
+ buckets[bucket] += 1
101
+ return buckets
102
+
103
+
104
+ def _init_wandb(instance_name: str | None = None):
105
+ try:
106
+ import wandb
107
+ except ImportError as exc:
108
+ raise SystemExit(
109
+ "wandb is required for logging; install it to enable W&B logging."
110
+ ) from exc
111
+
112
+ # Use instance name or "total" as the display name
113
+ display_name = instance_name or "total"
114
+ # Add version suffix to run ID to avoid conflicts with deleted runs
115
+ run_id = f"{display_name}-{RUN_VERSION}"
116
+
117
+ run = wandb.init(
118
+ project=WAND_PROJECT,
119
+ entity=WAND_ENTITY,
120
+ name=display_name, # Clean name for display
121
+ mode="online",
122
+ id=run_id, # Versioned ID for persistence
123
+ resume="allow",
124
+ settings=wandb.Settings(init_timeout=180),
125
+ config={
126
+ "hours": 24,
127
+ "instance": display_name,
128
+ },
129
+ )
130
+ return run
131
+
132
+
133
+ def _log_time_series_to_wandb(
134
+ run,
135
+ hourly_data: Dict[datetime, int],
136
+ daily_data: Dict[datetime, int],
137
+ ):
138
+ """Log time series data to a W&B run, ensuring chronological order."""
139
+ if run is None:
140
+ return
141
+
142
+ import wandb
143
+
144
+ # Define metrics to allow out-of-order logging based on timestamp
145
+ run.define_metric("daily_tasks_run", step_metric="timestamp", summary="last")
146
+ run.define_metric("hourly_tasks_run", step_metric="timestamp", summary="last")
147
+ run.define_metric("date", step_metric="timestamp")
148
+
149
+ # Combine all timestamps and sort them chronologically
150
+ all_data = []
151
+
152
+ # Add daily data points
153
+ for bucket, count in daily_data.items():
154
+ all_data.append((bucket, "daily_tasks_run", count))
155
+
156
+ # Add hourly data points
157
+ for bucket, count in hourly_data.items():
158
+ all_data.append((bucket, "hourly_tasks_run", count))
159
+
160
+ # Sort by timestamp
161
+ all_data.sort(key=lambda x: x[0])
162
+
163
+ # Log in chronological order with human-readable date
164
+ for bucket, metric_name, count in all_data:
165
+ run.log(
166
+ {
167
+ "timestamp": int(bucket.timestamp()),
168
+ metric_name: count,
169
+ "date": bucket, # Pass datetime object directly for W&B to format
170
+ }
171
+ )
172
+
173
+ run.finish()
174
+
175
+
176
+ def main():
177
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
178
+
179
+ start_ts, end_ts = _time_window()
180
+ logging.info("Checking user creations between %s and %s (UTC)", start_ts, end_ts)
181
+
182
+ instances = fetch_instances()
183
+ if not instances:
184
+ raise SystemExit("No ServiceNow instances available.")
185
+
186
+ summaries: List[Tuple[str, int]] = []
187
+ hourly_totals: Dict[datetime, int] = defaultdict(int)
188
+ hourly_per_instance: Dict[str, Dict[datetime, int]] = {}
189
+ daily_totals: Dict[datetime, int] = defaultdict(int)
190
+ daily_per_instance: Dict[str, Dict[datetime, int]] = {}
191
+
192
+ # Fetch data from all instances
193
+ for entry in instances:
194
+ url = entry["url"]
195
+ logging.info("Querying %s", url)
196
+ try:
197
+ instance = SNowInstance(snow_url=url, snow_credentials=("admin", entry["password"]))
198
+ creations = _fetch_user_creations(instance=instance, start_ts=start_ts, end_ts=end_ts)
199
+ summaries.append((url, len(creations)))
200
+ hourly = _hourly_counts(creations)
201
+ for bucket, count in hourly.items():
202
+ hourly_totals[bucket] += count
203
+ hourly_per_instance[url] = hourly
204
+ daily = _daily_counts(creations)
205
+ for bucket, count in daily.items():
206
+ daily_totals[bucket] += count
207
+ daily_per_instance[url] = daily
208
+ logging.info("...found %s tasks run", len(creations))
209
+ except Exception:
210
+ logging.exception("Failed to fetch data for %s", url)
211
+
212
+ # Log total data to a separate W&B run
213
+ logging.info("Logging total usage to W&B")
214
+ total_run = _init_wandb(instance_name=None)
215
+ _log_time_series_to_wandb(total_run, hourly_totals, daily_totals)
216
+
217
+ # Log each instance's data to separate W&B runs
218
+ for url, hourly_data in hourly_per_instance.items():
219
+ instance_name = url.split("//")[-1].replace(".service-now.com", "")
220
+ logging.info(f"Logging {instance_name} usage to W&B")
221
+
222
+ instance_run = _init_wandb(instance_name=instance_name)
223
+ daily_data = daily_per_instance[url]
224
+ _log_time_series_to_wandb(instance_run, hourly_data, daily_data)
225
+
226
+ # Print summary
227
+ total_created = sum(count for _, count in summaries)
228
+ print(f"\nTotal tasks run across instances: {total_created}")
229
+
230
+ for url, count in summaries:
231
+ print(f"{url}: {count} task(s) run")
232
+
233
+ if daily_totals:
234
+ print("\nDaily task runs (UTC):")
235
+ for bucket in sorted(daily_totals.keys()):
236
+ ts_str = bucket.strftime("%Y-%m-%d")
237
+ print(f"{ts_str}: {daily_totals[bucket]}")
238
+
239
+ if hourly_totals:
240
+ print("\nHourly task runs (UTC):")
241
+ for bucket in sorted(hourly_totals.keys()):
242
+ ts_str = bucket.strftime("%Y-%m-%d %H:%M")
243
+ print(f"{ts_str}: {hourly_totals[bucket]}")
244
+
245
+
246
+ if __name__ == "__main__":
247
+ main()
@@ -1,4 +1,14 @@
1
- __version__ = "0.5.1"
1
+ __version__ = "0.5.3"
2
+
3
+ # Check playwright version early to avoid cryptic errors
4
+ import importlib.metadata
5
+
6
+ _playwright_version = importlib.metadata.version("playwright")
7
+ if _playwright_version != "1.44.0":
8
+ raise RuntimeError(
9
+ f"browsergym-workarena requires playwright==1.44.0, but found {_playwright_version}. "
10
+ f"Please install the correct version: pip install playwright==1.44.0"
11
+ )
2
12
 
3
13
  import inspect
4
14
  from logging import warning
@@ -13,7 +13,7 @@ SNOW_SUPPORTED_RELEASES = ["washingtondc"]
13
13
 
14
14
  # Hugging Face dataset containing available instances
15
15
  INSTANCE_REPO_ID = "ServiceNow/WorkArena-Instances"
16
- INSTANCE_REPO_FILENAME = "instances.json"
16
+ INSTANCE_REPO_FILENAME = "instances_v2.json"
17
17
  INSTANCE_REPO_TYPE = "dataset"
18
18
  INSTANCE_XOR_SEED = "x3!+-9mi#nhlo%a02$9hna{]"
19
19