browsergym-workarena 0.5.1__tar.gz → 0.5.2__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.
- browsergym_workarena-0.5.2/.github/workflows/pool-telemetry.yml +41 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/PKG-INFO +2 -11
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/README.md +1 -10
- browsergym_workarena-0.5.2/monitor_pool_usage.py +247 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/__init__.py +11 -1
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/config.py +1 -1
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/instance.py +13 -3
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/form.py +24 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/list.py +22 -1
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/service_catalog.py +57 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/.github/workflows/instance_pool_ci.yml +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/.github/workflows/pypi.yml +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/.github/workflows/unit_tests.yml +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/.gitignore +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/CITATION.cff +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/CODE_OF_CONDUCT.md +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/LICENSE +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/SECURITY.md +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/assets/WorkArena_banner.png +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/dcat-metadata.jsonld +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/dev/environment.yaml +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/dev/requirements.txt +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/generate_knowledge_base.ipynb +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/make_human_eval_curriculum.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/pyproject.toml +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/requirements.txt +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/scripts/extract_finetuning_traces.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/scripts/generate_knowledge_base.ipynb +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/scripts/make_human_eval_curriculum.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/__init__.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/category.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/change_request.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/computer_asset.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/cost_center.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/expense_line.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/incident.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/knowledge.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/problem.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/report.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/requested_items.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/requests.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/system_properties.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/ui_themes.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/user.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/utils.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/forms/expected_change_request_form_fields.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/forms/expected_hardware_form_fields.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/forms/expected_incident_form_fields.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/forms/expected_problem_form_fields.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/forms/expected_request_item_form_fields.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/forms/expected_user_form_fields.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/knowledge/kb_autopublish_workflow.xml +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/knowledge/knowledge_base.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/knowledge/protocols.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/knowledge/test.html +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/lists/expected_asset_list_columns.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/lists/expected_change_request_list_columns.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/lists/expected_expense_line_list_columns.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/lists/expected_hardware_list_columns.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/lists/expected_incident_list_columns.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/lists/expected_problem_list_columns.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/lists/expected_requested_items_list_columns.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/lists/expected_service_catalog_list_columns.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/lists/expected_user_list_columns.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/setup_files/ui_themes/workarena_themes.xml +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/all_menu.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/create_change_request_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/create_hardware_asset_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/create_incident_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/create_problem_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/create_user_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/dashboard_retrieval_minmax_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/dashboard_retrieval_value_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/filter_asset_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/filter_change_request_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/filter_hardware_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/filter_incident_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/filter_service_catalog_item_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/filter_user_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/impersonation_users.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/knowledge_base_configs.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/order_apple_mac_book_pro15_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/order_apple_watch_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/order_developer_laptop_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/order_development_laptop_pc_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/order_ipad_mini_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/order_ipad_pro_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/order_loaner_laptop_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/order_sales_laptop_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/order_standard_laptop_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/report_retrieval_minmax_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/report_retrieval_value_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/sort_asset_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/sort_change_request_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/sort_hardware_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/sort_incident_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/sort_service_catalog_item_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/data_files/task_configs/sort_user_list_task.json +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/human_eval/console.js +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/human_eval/tool.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/install.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/__init__.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/base.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/comp_building_block.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/__init__.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/base.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_base.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_catalog.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_catalog_infeasible.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_create_incident.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_create_incident_infeasible.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_create_problem.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_create_problem_infeasible.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_filter.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_request_item.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/dash_do_request_item_infeasible.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/delete_record.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/edit_knowledge_base.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/expense_management.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/filter_and_do.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/find_and_order_item.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/manage_change_request_schedule.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/mark_duplicate_problems.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/maximize_investment_return.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/navigate_and_do.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/navigate_and_do_infeasible.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/offboard_user.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/onboard_user.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/update_task.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/utils/curriculum.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/utils/infeasible_configs.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/utils/knapsack.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/warranty_check.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/work_assignment.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/compositional/workload_balancing.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/dashboard.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/knowledge.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/mark_duplicate_problem.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/navigation.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/scripts/README.md +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/scripts/extract_all_menu_items.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/scripts/generate_dashboard_configs.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/scripts/generate_forms.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/scripts/generate_navigation_tasks.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/scripts/knowledge.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/scripts/list.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/scripts/service_catalog.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/scripts/validate.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/send_chat_message.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/utils/__init__.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/utils/debug.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/utils/form.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/utils/js_utils.js +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/utils/private_tasks.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/utils/string.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/utils/utils.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/utils.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/wa_action_traces.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/workarena_test.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_api.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_compositional.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_compositional_utils.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_filter_list_task.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_random_config_generation.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_snow_instance.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_task_from_config.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_task_general.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_task_setup.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_utils.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/tests/test_validate.py +0 -0
- {browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/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.
|
|
3
|
+
Version: 0.5.2
|
|
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()
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/__init__.py
RENAMED
|
@@ -1,4 +1,14 @@
|
|
|
1
|
-
__version__ = "0.5.
|
|
1
|
+
__version__ = "0.5.2"
|
|
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
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/config.py
RENAMED
|
@@ -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 = "
|
|
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
|
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/instance.py
RENAMED
|
@@ -45,10 +45,18 @@ def encrypt_instance_password(password: str) -> str:
|
|
|
45
45
|
return base64.b64encode(cipher_bytes).decode("utf-8")
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def fetch_instances():
|
|
48
|
+
def fetch_instances(filename: str = None):
|
|
49
49
|
"""
|
|
50
50
|
Load the latest instances from either a custom pool (SNOW_INSTANCE_POOL env var) or the gated HF dataset.
|
|
51
|
+
|
|
52
|
+
Parameters:
|
|
53
|
+
-----------
|
|
54
|
+
filename: str
|
|
55
|
+
Optional filename to fetch from the HF dataset. Defaults to INSTANCE_REPO_FILENAME.
|
|
51
56
|
"""
|
|
57
|
+
if filename is None:
|
|
58
|
+
filename = INSTANCE_REPO_FILENAME
|
|
59
|
+
|
|
52
60
|
pool_path = os.getenv("SNOW_INSTANCE_POOL")
|
|
53
61
|
if pool_path:
|
|
54
62
|
path = os.path.expanduser(pool_path)
|
|
@@ -62,13 +70,13 @@ def fetch_instances():
|
|
|
62
70
|
disable_progress_bars()
|
|
63
71
|
path = hf_hub_download(
|
|
64
72
|
repo_id=INSTANCE_REPO_ID,
|
|
65
|
-
filename=
|
|
73
|
+
filename=filename,
|
|
66
74
|
repo_type=INSTANCE_REPO_TYPE,
|
|
67
75
|
)
|
|
68
76
|
logging.info("Loaded ServiceNow instances from the default instance pool.")
|
|
69
77
|
except Exception as e:
|
|
70
78
|
raise RuntimeError(
|
|
71
|
-
f"Could not access {INSTANCE_REPO_ID}/{
|
|
79
|
+
f"Could not access {INSTANCE_REPO_ID}/{filename}. "
|
|
72
80
|
"Make sure you have been granted access to the gated repo and that you are "
|
|
73
81
|
"authenticated (run `huggingface-cli login` or set HUGGING_FACE_HUB_TOKEN)."
|
|
74
82
|
) from e
|
|
@@ -77,6 +85,8 @@ def fetch_instances():
|
|
|
77
85
|
entries = json.load(f)
|
|
78
86
|
|
|
79
87
|
for entry in entries:
|
|
88
|
+
if entry.get("error"):
|
|
89
|
+
raise RuntimeError(entry.get("message", "Unknown error from instance pool"))
|
|
80
90
|
entry["url"] = entry["u"]
|
|
81
91
|
entry["password"] = decrypt_instance_password(entry["p"])
|
|
82
92
|
del entry["u"]
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/form.py
RENAMED
|
@@ -371,6 +371,30 @@ class ServiceNowFormTask(AbstractServiceNowTask):
|
|
|
371
371
|
|
|
372
372
|
runInGsftMainOnlyAndProtectByURL(monitorChangeOnFields, '{url_suffix}');
|
|
373
373
|
""",
|
|
374
|
+
f"""
|
|
375
|
+
function removePersonalizeFormButton() {{
|
|
376
|
+
waLog('Searching for Personalize Form button...', 'removePersonalizeFormButton');
|
|
377
|
+
let button = document.querySelector('#togglePersonalizeForm');
|
|
378
|
+
if (button) {{
|
|
379
|
+
button.remove();
|
|
380
|
+
waLog('Removed Personalize Form button', 'removePersonalizeFormButton');
|
|
381
|
+
}}
|
|
382
|
+
}}
|
|
383
|
+
|
|
384
|
+
runInGsftMainOnlyAndProtectByURL(removePersonalizeFormButton, '{url_suffix}');
|
|
385
|
+
""",
|
|
386
|
+
f"""
|
|
387
|
+
function removeAdditionalActionsButton() {{
|
|
388
|
+
waLog('Searching for Additional Actions button...', 'removeAdditionalActionsButton');
|
|
389
|
+
let button = document.querySelector('button.additional-actions-context-menu-button');
|
|
390
|
+
if (button) {{
|
|
391
|
+
button.remove();
|
|
392
|
+
waLog('Removed Additional Actions button', 'removeAdditionalActionsButton');
|
|
393
|
+
}}
|
|
394
|
+
}}
|
|
395
|
+
|
|
396
|
+
runInGsftMainOnlyAndProtectByURL(removeAdditionalActionsButton, '{url_suffix}');
|
|
397
|
+
""",
|
|
374
398
|
]
|
|
375
399
|
|
|
376
400
|
def start(self, page: Page) -> None:
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/tasks/list.py
RENAMED
|
@@ -113,7 +113,28 @@ class ServiceNowListTask(AbstractServiceNowTask):
|
|
|
113
113
|
return json.load(f)
|
|
114
114
|
|
|
115
115
|
def get_init_scripts(self) -> List[str]:
|
|
116
|
-
return super().get_init_scripts() + [
|
|
116
|
+
return super().get_init_scripts() + [
|
|
117
|
+
"registerGsftMainLoaded();",
|
|
118
|
+
self._get_remove_personalize_list_button_script(),
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
def _get_remove_personalize_list_button_script(self):
|
|
122
|
+
"""
|
|
123
|
+
Removes the 'Personalize List' button on list pages.
|
|
124
|
+
"""
|
|
125
|
+
script = """
|
|
126
|
+
function removePersonalizeListButton() {
|
|
127
|
+
waLog('Searching for Personalize List buttons...', 'removePersonalizeListButton');
|
|
128
|
+
let buttons = document.querySelectorAll('i[data-type="list_mechanic2_open"]');
|
|
129
|
+
buttons.forEach((button) => {
|
|
130
|
+
button.remove();
|
|
131
|
+
});
|
|
132
|
+
waLog('Removed ' + buttons.length + ' Personalize List buttons', 'removePersonalizeListButton');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
runInGsftMainOnlyAndProtectByURL(removePersonalizeListButton, '_list.do');
|
|
136
|
+
"""
|
|
137
|
+
return script
|
|
117
138
|
|
|
118
139
|
def _get_visible_list(self, page: Page):
|
|
119
140
|
self._wait_for_ready(page)
|
|
@@ -225,6 +225,9 @@ class OrderHardwareTask(AbstractServiceNowTask):
|
|
|
225
225
|
"registerGsftMainLoaded()",
|
|
226
226
|
self._get_disable_add_to_cart_script(),
|
|
227
227
|
self._get_remove_top_items_panel_script(),
|
|
228
|
+
self._get_remove_add_content_button_script(),
|
|
229
|
+
self._get_remove_header_decorations_script(),
|
|
230
|
+
self._get_remove_more_options_buttons_script(),
|
|
228
231
|
]
|
|
229
232
|
|
|
230
233
|
def _get_disable_add_to_cart_script(self):
|
|
@@ -276,6 +279,60 @@ class OrderHardwareTask(AbstractServiceNowTask):
|
|
|
276
279
|
"""
|
|
277
280
|
return script
|
|
278
281
|
|
|
282
|
+
def _get_remove_add_content_button_script(self):
|
|
283
|
+
"""
|
|
284
|
+
Removes the 'Add content' button from the service catalog page.
|
|
285
|
+
"""
|
|
286
|
+
script = """
|
|
287
|
+
function removeAddContentButton() {
|
|
288
|
+
waLog('Searching for Add content button...', 'removeAddContentButton');
|
|
289
|
+
let button = document.querySelector('button[aria-label="Add content"]');
|
|
290
|
+
if (button) {
|
|
291
|
+
button.remove();
|
|
292
|
+
waLog('Removed Add content button', 'removeAddContentButton');
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
runInGsftMainOnlyAndProtectByURL(removeAddContentButton, 'catalog_home');
|
|
297
|
+
"""
|
|
298
|
+
return script
|
|
299
|
+
|
|
300
|
+
def _get_remove_header_decorations_script(self):
|
|
301
|
+
"""
|
|
302
|
+
Removes all header decoration panels (edit/settings/close buttons) from the service catalog page.
|
|
303
|
+
"""
|
|
304
|
+
script = """
|
|
305
|
+
function removeHeaderDecorations() {
|
|
306
|
+
waLog('Searching for header decoration panels...', 'removeHeaderDecorations');
|
|
307
|
+
let panels = document.querySelectorAll('div.header_decorations');
|
|
308
|
+
panels.forEach((panel) => {
|
|
309
|
+
panel.remove();
|
|
310
|
+
});
|
|
311
|
+
waLog('Removed ' + panels.length + ' header decoration panels', 'removeHeaderDecorations');
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
runInGsftMainOnlyAndProtectByURL(removeHeaderDecorations, 'catalog_home');
|
|
315
|
+
"""
|
|
316
|
+
return script
|
|
317
|
+
|
|
318
|
+
def _get_remove_more_options_buttons_script(self):
|
|
319
|
+
"""
|
|
320
|
+
Removes all 'More Options' buttons from the service catalog page.
|
|
321
|
+
"""
|
|
322
|
+
script = """
|
|
323
|
+
function removeMoreOptionsButtons() {
|
|
324
|
+
waLog('Searching for More Options buttons...', 'removeMoreOptionsButtons');
|
|
325
|
+
let buttons = document.querySelectorAll('button.btn.btn-icon.icon-ellipsis');
|
|
326
|
+
buttons.forEach((button) => {
|
|
327
|
+
button.remove();
|
|
328
|
+
});
|
|
329
|
+
waLog('Removed ' + buttons.length + ' More Options buttons', 'removeMoreOptionsButtons');
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
runInGsftMainOnlyAndProtectByURL(removeMoreOptionsButtons, 'com.glideapp.servicecatalog');
|
|
333
|
+
"""
|
|
334
|
+
return script
|
|
335
|
+
|
|
279
336
|
def setup_goal(self, page: Page) -> tuple[str, dict]:
|
|
280
337
|
super().setup_goal(page=page)
|
|
281
338
|
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/.github/ISSUE_TEMPLATE/bug_report.yml
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/.github/workflows/instance_pool_ci.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/scripts/extract_finetuning_traces.py
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/scripts/generate_knowledge_base.ipynb
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/scripts/make_human_eval_curriculum.py
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/__init__.py
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/category.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/incident.py
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/knowledge.py
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/problem.py
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/report.py
RENAMED
|
File without changes
|
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/requests.py
RENAMED
|
File without changes
|
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/ui_themes.py
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/user.py
RENAMED
|
File without changes
|
{browsergym_workarena-0.5.1 → browsergym_workarena-0.5.2}/src/browsergym/workarena/api/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|