yak-browser-use 0.5.3.post4.dev0__tar.gz → 0.5.5.dev0__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 (284) hide show
  1. {yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use.egg-info → yak_browser_use-0.5.5.dev0}/PKG-INFO +2 -5
  2. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/pyproject.toml +4 -10
  3. yak_browser_use-0.5.5.dev0/src/yak_browser_use/api/event_bus.py +55 -0
  4. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/routes.py +48 -11
  5. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/server.py +3 -1
  6. yak_browser_use-0.5.5.dev0/src/yak_browser_use/api/service.py +245 -0
  7. yak_browser_use-0.5.5.dev0/src/yak_browser_use/api/session_manager.py +217 -0
  8. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/state.py +3 -1
  9. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/discover.py +8 -0
  10. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/playwright_bridge.py +5 -5
  11. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/pipeline_tools.py +2 -4
  12. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/tool_executor.py +2 -78
  13. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_lifecycle/compensation.py +0 -1
  14. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_lifecycle/guardian.py +17 -6
  15. yak_browser_use-0.5.5.dev0/src/yak_browser_use/engine/agent.py +310 -0
  16. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/eval_agent.py +2 -3
  17. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/executor.py +19 -42
  18. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/ops.py +5 -18
  19. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/runner_preset.py +21 -2
  20. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/scratchpad.py +2 -0
  21. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/chat/system.md +6 -6
  22. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/eval_agent/js_lib.js +1 -1
  23. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/eval_agent/system.md +2 -2
  24. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/guidance/tool_strategy.md +3 -3
  25. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/planner-plan.md +2 -2
  26. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/skill/goal-execution/SKILL.md +2 -2
  27. yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use/static/assets/index-B5OGyBnt.js → yak_browser_use-0.5.5.dev0/src/yak_browser_use/static/assets/index-BSpnE2pW.js +27 -27
  28. yak_browser_use-0.5.5.dev0/src/yak_browser_use/static/assets/index-CwtndeyO.css +1 -0
  29. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/index.html +2 -2
  30. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/_path_utils.py +6 -3
  31. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/adapters.py +5 -25
  32. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/data.py +6 -25
  33. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/edit_pipeline.py +4 -2
  34. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/record_step.py +5 -4
  35. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/registry.py +37 -28
  36. yak_browser_use-0.5.5.dev0/src/yak_browser_use/utils/bridge.py +68 -0
  37. yak_browser_use-0.5.5.dev0/src/yak_browser_use/utils/file_io.py +55 -0
  38. yak_browser_use-0.5.5.dev0/src/yak_browser_use/utils/helpers.py +35 -0
  39. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/tool_cdp.py +27 -36
  40. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0/src/yak_browser_use.egg-info}/PKG-INFO +2 -5
  41. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use.egg-info/SOURCES.txt +7 -3
  42. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use.egg-info/requires.txt +1 -5
  43. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use.egg-info/scm_file_list.json +5 -1
  44. yak_browser_use-0.5.5.dev0/src/yak_browser_use.egg-info/scm_version.json +8 -0
  45. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_api_routes.py +1 -0
  46. yak_browser_use-0.5.5.dev0/tests/test_file_io.py +117 -0
  47. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_format_convert.py +33 -20
  48. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_harness_tools.py +3 -4
  49. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_integration_agent_reform.py +0 -89
  50. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_orchestration_filter.py +0 -64
  51. yak_browser_use-0.5.5.dev0/tests/test_runner.py +242 -0
  52. yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use/api/service.py +0 -402
  53. yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use/engine/agent.py +0 -303
  54. yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use/engine/runner.py +0 -109
  55. yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use/static/assets/index-0JhsQIuZ.css +0 -1
  56. yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use.egg-info/scm_version.json +0 -8
  57. yak_browser_use-0.5.3.post4.dev0/tests/test_file_io.py +0 -111
  58. yak_browser_use-0.5.3.post4.dev0/tests/test_runner.py +0 -155
  59. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/MANIFEST.in +0 -0
  60. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/README.md +0 -0
  61. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/setup.cfg +0 -0
  62. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/__main__.py +0 -0
  63. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/__init__.py +0 -0
  64. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/errors.py +0 -0
  65. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/__init__.py +0 -0
  66. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/daemon.py +0 -0
  67. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/helpers.py +0 -0
  68. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/launcher.py +0 -0
  69. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/profiles.py +0 -0
  70. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/protocols.py +0 -0
  71. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/session.py +0 -0
  72. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/__init__.py +0 -0
  73. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/_init.py +0 -0
  74. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/logs.py +0 -0
  75. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/run.py +0 -0
  76. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/serve.py +0 -0
  77. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/web.py +0 -0
  78. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/__init__.py +0 -0
  79. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/diff.py +0 -0
  80. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/generator.py +0 -0
  81. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/graph.py +0 -0
  82. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/models.py +0 -0
  83. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/parser.py +0 -0
  84. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/prepare.py +0 -0
  85. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/resolver.py +0 -0
  86. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/schema.py +0 -0
  87. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/step_type.py +0 -0
  88. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/__init__.py +0 -0
  89. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/__init__.py +0 -0
  90. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/conversation_loop.py +0 -0
  91. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/error_classifier.py +0 -0
  92. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/iteration_budget.py +0 -0
  93. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/pipeline_events.py +0 -0
  94. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/retry_utils.py +0 -0
  95. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/skill_tools.py +0 -0
  96. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/tool_guardrails.py +0 -0
  97. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/tools.py +0 -0
  98. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_harness/turn_context.py +0 -0
  99. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_lifecycle/__init__.py +0 -0
  100. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/_param_resolver.py +0 -0
  101. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/delivery.py +0 -0
  102. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/events.py +0 -0
  103. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/state.py +0 -0
  104. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/step_machine.py +0 -0
  105. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/llm/__init__.py +0 -0
  106. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/llm/client.py +0 -0
  107. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/llm/messages.py +0 -0
  108. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/params/__init__.py +0 -0
  109. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/params/manager.py +0 -0
  110. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/__init__.py +0 -0
  111. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/_archived/document-clean.md +0 -0
  112. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/_archived/fallback-assessment.md +0 -0
  113. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/_archived/navigation-guard.md +0 -0
  114. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/_archived/recovery-plan.md +0 -0
  115. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/_archived/replan-after-goal.md +0 -0
  116. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/_archived/skill/ph-tool-generation.md +0 -0
  117. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/_loader.py +0 -0
  118. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/generate-handler.md +0 -0
  119. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/guardrails/blocked.md +0 -0
  120. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/guardrails/exact_failure.md +0 -0
  121. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/guardrails/no_progress.md +0 -0
  122. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/guardrails/same_tool_failure.md +0 -0
  123. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/guardrails/warning_prefix.md +0 -0
  124. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/guidance/error_recovery.md +0 -0
  125. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/planner-expand.md +0 -0
  126. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/replan-on-failure.md +0 -0
  127. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/skill/skill-authoring/SKILL.md +0 -0
  128. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/skill/web-standard-paths/SKILL.md +0 -0
  129. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/abap-DLDM7-KI.js +0 -0
  130. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/apex-DNDY2TF8.js +0 -0
  131. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/azcli-Y6nb8tq_.js +0 -0
  132. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/bat-BwHxbl9M.js +0 -0
  133. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/bicep-CFznDFnq.js +0 -0
  134. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/cameligo-Bf6VGUru.js +0 -0
  135. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/clojure-Dnu-v4kV.js +0 -0
  136. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/codicon-ngg6Pgfi.ttf +0 -0
  137. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/coffee-Bd8akH9Z.js +0 -0
  138. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/cpp-BbWJElDN.js +0 -0
  139. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/csharp-Co3qMtFm.js +0 -0
  140. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/csp-D-4FJmMZ.js +0 -0
  141. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/css-DdJfP1eB.js +0 -0
  142. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/css.worker-B4z49cGk.js +0 -0
  143. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/cssMode-BKVMOhiw.js +0 -0
  144. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/cypher-cTPe9QuQ.js +0 -0
  145. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/dart-BOtBlQCF.js +0 -0
  146. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/dockerfile-BG73LgW2.js +0 -0
  147. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/ecl-BEgZUVRK.js +0 -0
  148. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/elixir-BkW5O-1t.js +0 -0
  149. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/flow9-BeJ5waoc.js +0 -0
  150. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/freemarker2-DTeYIFpS.js +0 -0
  151. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/fsharp-PahG7c26.js +0 -0
  152. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/go-acbASCJo.js +0 -0
  153. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/graphql-BxJiqAUM.js +0 -0
  154. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/handlebars-ClLV9qLZ.js +0 -0
  155. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/hcl-DtV1sZF8.js +0 -0
  156. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/html-CeHr6nkO.js +0 -0
  157. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/html.worker-DtiGdgqp.js +0 -0
  158. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/htmlMode-7i4spDmy.js +0 -0
  159. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/ini-Kd9XrMLS.js +0 -0
  160. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/java-CXBNlu9o.js +0 -0
  161. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/javascript-BPUrVTmd.js +0 -0
  162. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/json.worker-leyajbqV.js +0 -0
  163. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/jsonMode-BB46bPtH.js +0 -0
  164. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/julia-cl7-CwDS.js +0 -0
  165. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/kotlin-s7OhZKlX.js +0 -0
  166. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/less-9HpZscsL.js +0 -0
  167. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/lexon-OrD6JF1K.js +0 -0
  168. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/liquid-DEi7G6zA.js +0 -0
  169. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/lspLanguageFeatures-CWVggkyz.js +0 -0
  170. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/lua-Cyyb5UIc.js +0 -0
  171. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/m3-B8OfTtLu.js +0 -0
  172. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/markdown-BFxVWTOG.js +0 -0
  173. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/mdx-Dj8j_y7K.js +0 -0
  174. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/mips-CiqrrVzr.js +0 -0
  175. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/monaco-C-jspPYF.js +0 -0
  176. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/monaco-CJZrZ56I.css +0 -0
  177. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/msdax-DmeGPVcC.js +0 -0
  178. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/mysql-C_tMU-Nz.js +0 -0
  179. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/objective-c-BDtDVThU.js +0 -0
  180. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/pascal-vHIfCaH5.js +0 -0
  181. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/pascaligo-DtZ0uQbO.js +0 -0
  182. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/perl-Ub6l9XKa.js +0 -0
  183. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/pgsql-BlNEE0v7.js +0 -0
  184. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/php-BBUBE1dy.js +0 -0
  185. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/pla-DSh2-awV.js +0 -0
  186. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/postiats-CocnycG-.js +0 -0
  187. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/powerquery-tScXyioY.js +0 -0
  188. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/powershell-COWaemsV.js +0 -0
  189. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/protobuf-Brw8urJB.js +0 -0
  190. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/pug-8SOpv6rk.js +0 -0
  191. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/python--7VVDvlg.js +0 -0
  192. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/qsharp-Bw9ernYp.js +0 -0
  193. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/r-j7ic8hl3.js +0 -0
  194. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/razor-fy4Z9muo.js +0 -0
  195. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/redis-Bu5POkcn.js +0 -0
  196. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/redshift-Bs9aos_-.js +0 -0
  197. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/restructuredtext-CqXO7rUv.js +0 -0
  198. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/ruby-zBfavPgS.js +0 -0
  199. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/rust-BzKRNQWT.js +0 -0
  200. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/sb-BBc9UKZt.js +0 -0
  201. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/scala-D9hQfWCl.js +0 -0
  202. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/scheme-BPhDTwHR.js +0 -0
  203. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/scss-CBJaRo0y.js +0 -0
  204. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/shell-DiJ1NA_G.js +0 -0
  205. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/solidity-Db0IVjzk.js +0 -0
  206. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/sophia-CnS9iZB_.js +0 -0
  207. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/sparql-CJmd_6j2.js +0 -0
  208. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/sql-ClhHkBeG.js +0 -0
  209. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/st-CHwy0fLd.js +0 -0
  210. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/swift-Bqt4WxQ4.js +0 -0
  211. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/systemverilog-Bs9z6M-B.js +0 -0
  212. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/tcl-Dm6ycUr_.js +0 -0
  213. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/ts.worker-59MjiAqk.js +0 -0
  214. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/tsMode-CLI8G9FG.js +0 -0
  215. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/twig-Csy3S7wG.js +0 -0
  216. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/typescript-DkhtSYnQ.js +0 -0
  217. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/typespec-Btyra-wh.js +0 -0
  218. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/vb-Db0cS2oM.js +0 -0
  219. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/wgsl-BTesnYfV.js +0 -0
  220. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/xml-C_ipiDoN.js +0 -0
  221. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/assets/yaml-CKMSl9WO.js +0 -0
  222. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/monacoeditorwork/editor.worker.bundle.js +0 -0
  223. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/__init__.py +0 -0
  224. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/captcha.py +0 -0
  225. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/extract.py +0 -0
  226. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/file_read.py +0 -0
  227. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/file_write.py +0 -0
  228. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/format_convert.py +0 -0
  229. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/todo.py +0 -0
  230. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/todo_store.py +0 -0
  231. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/__init__.py +0 -0
  232. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/_path.py +0 -0
  233. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/browser.py +0 -0
  234. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/logging.py +0 -0
  235. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/response_logger.py +0 -0
  236. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/skill_loader.py +0 -0
  237. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/workspace/__init__.py +0 -0
  238. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/workspace/manager.py +0 -0
  239. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/workspace/path_guard.py +0 -0
  240. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/workspace/session_store.py +0 -0
  241. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/workspace/version_manager.py +0 -0
  242. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use.egg-info/dependency_links.txt +0 -0
  243. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use.egg-info/entry_points.txt +0 -0
  244. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use.egg-info/top_level.txt +0 -0
  245. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/__init__.py +0 -0
  246. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/_debug_a11y.py +0 -0
  247. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/conftest.py +0 -0
  248. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/run_a11y_on_html.py +0 -0
  249. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/run_progressive_profile.py +0 -0
  250. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_a11y_snapshot.py +0 -0
  251. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_agent.py +0 -0
  252. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_diff.py +0 -0
  253. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_generator.py +0 -0
  254. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_graph.py +0 -0
  255. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_parser.py +0 -0
  256. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_resolver.py +0 -0
  257. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_conversation_loop.py +0 -0
  258. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_delivery.py +0 -0
  259. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_error_classifier.py +0 -0
  260. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_events.py +0 -0
  261. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_exact_match.py +0 -0
  262. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_executor_helpers.py +0 -0
  263. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_iteration_budget.py +0 -0
  264. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_ops.py +0 -0
  265. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_param_resolver.py +0 -0
  266. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_path_guard.py +0 -0
  267. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_pipeline_tools.py +0 -0
  268. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_progressive.py +0 -0
  269. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_prompts_loader.py +0 -0
  270. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_registry.py +0 -0
  271. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_retry_utils.py +0 -0
  272. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_run_check.py +0 -0
  273. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_runner_preset.py +0 -0
  274. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_schema.py +0 -0
  275. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_scratchpad.py +0 -0
  276. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_session_persist.py +0 -0
  277. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_state.py +0 -0
  278. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_step_machine.py +0 -0
  279. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_todo_store.py +0 -0
  280. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_tool_executor.py +0 -0
  281. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_tool_guardrails.py +0 -0
  282. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_turn_context.py +0 -0
  283. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_version_manager.py +0 -0
  284. {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_workspace_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yak-browser-use
3
- Version: 0.5.3.post4.dev0
3
+ Version: 0.5.5.dev0
4
4
  Summary: A clean, learnable browser automation framework — Chat mode + Preset replay via Playwright CDP
5
5
  Author-email: SlimeSB <x56277534@gmail.com>
6
6
  License-Expression: MIT
@@ -26,10 +26,7 @@ Requires-Dist: python-dotenv>=1.0.0
26
26
  Requires-Dist: pyyaml>=6.0
27
27
  Requires-Dist: fastapi>=0.115.0
28
28
  Requires-Dist: uvicorn[standard]>=0.30.0
29
- Requires-Dist: websockets==15.0.1
30
- Provides-Extra: dev
31
- Requires-Dist: pytest>=8.0.0; extra == "dev"
32
- Requires-Dist: pytest-asyncio>=0.25.0; extra == "dev"
29
+ Requires-Dist: websockets>=15.0
33
30
 
34
31
  <p align="center">
35
32
  <picture>
@@ -1,6 +1,6 @@
1
1
  [build-system]
2
2
  requires = ["setuptools>=64", "setuptools-scm>=8"]
3
- build-backend = "setuptools.build_meta:__legacy__"
3
+ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "yak-browser-use"
@@ -32,7 +32,7 @@ dependencies = [
32
32
  "pyyaml>=6.0",
33
33
  "fastapi>=0.115.0",
34
34
  "uvicorn[standard]>=0.30.0",
35
- "websockets==15.0.1",
35
+ "websockets>=15.0",
36
36
  ]
37
37
 
38
38
  [project.urls]
@@ -40,19 +40,13 @@ Homepage = "https://github.com/SlimeSB/yak-browser-use"
40
40
  Source = "https://github.com/SlimeSB/yak-browser-use"
41
41
  BugTracker = "https://github.com/SlimeSB/yak-browser-use/issues"
42
42
 
43
- [project.optional-dependencies]
44
- dev = [
45
- "pytest>=8.0.0",
46
- "pytest-asyncio>=0.25.0",
47
- ]
48
-
49
43
  [tool.pytest.ini_options]
50
44
  asyncio_mode = "auto"
51
45
 
52
46
  [dependency-groups]
53
47
  dev = [
54
- "pytest>=9.0.3",
55
- "pytest-asyncio>=1.4.0",
48
+ "pytest>=8.0.0",
49
+ "pytest-asyncio>=0.25.0",
56
50
  ]
57
51
 
58
52
  [tool.setuptools.packages.find]
@@ -0,0 +1,55 @@
1
+ """EventBus — centralized event dispatch for chat and pipeline events.
2
+
3
+ Routes events to:
4
+ - Registered callbacks (e.g. WebSocket manager)
5
+ - Engine state WS client queues
6
+ - (Pipeline events also go through EventSink, which is separate)
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import time
12
+ from typing import Any, Callable
13
+
14
+ from yak_browser_use.utils.logging import get_logger
15
+
16
+ logger = get_logger(__name__)
17
+
18
+
19
+ class EventBus:
20
+ """Pushes structured events to callbacks and engine-state WS clients.
21
+
22
+ Tracks a ``chat_streaming`` flag so ``chat.message`` events can be
23
+ suppressed during streaming (the delta chunks are sent via individual
24
+ streaming callbacks, so the full message event is redundant).
25
+ """
26
+
27
+ def __init__(self, engine_state: Any | None = None):
28
+ self._engine_state = engine_state
29
+ self._event_callbacks: list[Callable[[dict], None]] = []
30
+ self.chat_streaming: bool = False
31
+
32
+ def on_event(self, callback: Callable[[dict], None]) -> None:
33
+ """Register a callback for event streaming."""
34
+ self._event_callbacks.append(callback)
35
+
36
+ def push(self, event: dict) -> None:
37
+ """Push an event to all registered callbacks AND engine-state WS clients.
38
+
39
+ ``chat.message`` events are silently dropped while
40
+ ``chat_streaming`` is active to avoid duplicating the delta stream.
41
+ """
42
+ if event.get("type") == "chat.message" and self.chat_streaming:
43
+ return
44
+ event["_ts"] = time.time()
45
+ for cb in self._event_callbacks:
46
+ try:
47
+ cb(event)
48
+ except Exception:
49
+ logger.warning("Event callback failed for type=%s", event.get("type"), exc_info=True)
50
+ if self._engine_state and hasattr(self._engine_state, "ws_clients"):
51
+ for q in self._engine_state.ws_clients:
52
+ try:
53
+ q.put_nowait(event)
54
+ except Exception:
55
+ pass
@@ -186,13 +186,11 @@ def register_all_routes(app: FastAPI) -> None:
186
186
  from yak_browser_use.cdp.helpers import CDPHelpers
187
187
  browser = CDPHelpers(engine_state.bridge)
188
188
 
189
- # Import run_pipeline with fallback (being written simultaneously)
190
189
  try:
191
- from yak_browser_use.engine.runner import run_pipeline
190
+ from yak_browser_use.engine.runner_preset import run_pipeline
192
191
  except ImportError:
193
192
  raise ServerError(
194
- "engine.runner is not yet available — pipeline execution cannot start. "
195
- "Ensure engine/runner.py is implemented."
193
+ "engine.runner_preset is not yet available — pipeline execution cannot start."
196
194
  )
197
195
 
198
196
  ctx = await run_pipeline(
@@ -205,12 +203,14 @@ def register_all_routes(app: FastAPI) -> None:
205
203
  )
206
204
 
207
205
  status = "completed" if not ctx.errors else "failed"
206
+ first_error = ctx.errors[0].get("message", str(ctx.errors[0])) if ctx.errors else None
208
207
  return JSONResponse({
209
208
  "run_id": ctx.run_id,
210
209
  "pipeline": ctx.pipeline_name,
211
210
  "status": status,
212
211
  "step_count": len(steps),
213
212
  "errors": ctx.errors,
213
+ "error": first_error,
214
214
  })
215
215
  except APIError:
216
216
  raise
@@ -670,9 +670,9 @@ def register_all_routes(app: FastAPI) -> None:
670
670
  snapshot_path.write_text(pipeline_text, encoding="utf-8")
671
671
 
672
672
  try:
673
- from yak_browser_use.engine.runner import run_pipeline
673
+ from yak_browser_use.engine.runner_preset import run_pipeline
674
674
  except ImportError:
675
- raise ServerError("engine.runner is not yet available")
675
+ raise ServerError("engine.runner_preset is not yet available")
676
676
 
677
677
  from yak_browser_use.cdp.helpers import CDPHelpers
678
678
  browser = CDPHelpers(engine_state.bridge)
@@ -813,7 +813,7 @@ def register_all_routes(app: FastAPI) -> None:
813
813
  turn_index = (len(session.messages) if session else 0) + 1
814
814
 
815
815
  def _push(event: dict) -> None:
816
- service._push_event(event)
816
+ service.events.push(event)
817
817
 
818
818
  def _on_stream_start() -> None:
819
819
  _push({"type": "chat.stream_start", "turn_index": turn_index})
@@ -1073,8 +1073,31 @@ def register_all_routes(app: FastAPI) -> None:
1073
1073
  for d in sorted(workspaces_dir.iterdir()):
1074
1074
  if not d.is_dir() or d.name.startswith("."):
1075
1075
  continue
1076
- if (d / "pipeline.yaml").exists():
1077
- pipelines.append({"name": d.name, "title": d.name})
1076
+ pipe_file = d / "pipeline.yaml"
1077
+ if pipe_file.exists():
1078
+ name = d.name
1079
+ description = ""
1080
+ stages: list[str] = []
1081
+ step_count = 0
1082
+ try:
1083
+ import yaml
1084
+ raw = yaml.safe_load(pipe_file.read_text(encoding="utf-8"))
1085
+ if isinstance(raw, dict):
1086
+ name = raw.get("name", name)
1087
+ description = raw.get("description", "")
1088
+ steps_raw = raw.get("steps", [])
1089
+ if isinstance(steps_raw, list):
1090
+ stages = [s.get("name", f"step_{i}") for i, s in enumerate(steps_raw)]
1091
+ step_count = len(steps_raw)
1092
+ except Exception:
1093
+ pass
1094
+ pipelines.append({
1095
+ "name": name,
1096
+ "title": name,
1097
+ "description": description,
1098
+ "stages": stages,
1099
+ "step_count": step_count,
1100
+ })
1078
1101
  return JSONResponse({"pipelines": pipelines})
1079
1102
 
1080
1103
  @app.get("/api/pipelines/{name}")
@@ -1086,7 +1109,21 @@ def register_all_routes(app: FastAPI) -> None:
1086
1109
  if not pipe_path.exists():
1087
1110
  raise APIError("pipeline not found", status_code=404)
1088
1111
  content = pipe_path.read_text(encoding="utf-8")
1089
- return JSONResponse({"name": name, "content": content})
1112
+ meta: dict = {"name": name, "title": name, "description": "", "stages": [], "step_count": 0}
1113
+ try:
1114
+ import yaml
1115
+ raw = yaml.safe_load(content)
1116
+ if isinstance(raw, dict):
1117
+ meta["name"] = raw.get("name", name)
1118
+ meta["title"] = meta["name"]
1119
+ meta["description"] = raw.get("description", "")
1120
+ steps_raw = raw.get("steps", [])
1121
+ if isinstance(steps_raw, list):
1122
+ meta["stages"] = [s.get("name", f"step_{i}") for i, s in enumerate(steps_raw)]
1123
+ meta["step_count"] = len(steps_raw)
1124
+ except Exception:
1125
+ pass
1126
+ return JSONResponse({"name": name, "content": content, "meta": meta})
1090
1127
 
1091
1128
  @app.delete("/api/pipelines/{name}")
1092
1129
  async def api_delete_pipeline(name: str) -> JSONResponse:
@@ -1111,7 +1148,7 @@ def register_all_routes(app: FastAPI) -> None:
1111
1148
  Each connected client receives event dicts as JSON text messages.
1112
1149
  """
1113
1150
  await websocket.accept()
1114
- q: asyncio.Queue = asyncio.Queue()
1151
+ q: asyncio.Queue = asyncio.Queue(maxsize=256)
1115
1152
  engine_state.ws_clients.append(q)
1116
1153
  logger.debug("WebSocket client connected (%d total)", len(engine_state.ws_clients))
1117
1154
 
@@ -23,6 +23,9 @@ async def lifespan(app: FastAPI):
23
23
  from yak_browser_use.api.state import engine_state
24
24
 
25
25
  await engine_state.cleanup()
26
+ from yak_browser_use.cdp.discover import cleanup as cleanup_discover
27
+
28
+ await cleanup_discover()
26
29
  logger.info("Yak Browser-Use API stopped")
27
30
 
28
31
 
@@ -44,7 +47,6 @@ def create_app() -> FastAPI:
44
47
  app.add_middleware(
45
48
  CORSMiddleware,
46
49
  allow_origins=["*"],
47
- allow_credentials=True,
48
50
  allow_methods=["*"],
49
51
  allow_headers=["*"],
50
52
  )
@@ -0,0 +1,245 @@
1
+ """API service layer — session/chat/pipeline business logic.
2
+
3
+ Bridges the API routes to the engine: session management,
4
+ chat message processing, pipeline compilation, and event pushing.
5
+
6
+ Delegates to :class:`SessionManager` and :class:`EventBus` for the
7
+ respective sub-domains; Service itself handles chat orchestration
8
+ and pipeline utilities.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import asyncio
14
+ from pathlib import Path
15
+ from typing import Callable
16
+
17
+ from yak_browser_use.utils.logging import get_logger
18
+
19
+ from yak_browser_use.api.errors import APIError
20
+ from yak_browser_use.api.event_bus import EventBus
21
+ from yak_browser_use.api.session_manager import SessionManager, SessionState, _DEFAULT_PIPELINE
22
+ from yak_browser_use.workspace.manager import WORKSPACES_ROOT
23
+ from yak_browser_use.tools.todo_store import current_store
24
+
25
+ logger = get_logger(__name__)
26
+
27
+ _WORKSPACES_DIR = WORKSPACES_ROOT
28
+
29
+
30
+ def _build_pipeline_context(pipeline_name: str) -> str | None:
31
+ """Build a markdown snippet describing the currently selected pipeline."""
32
+ import yaml
33
+
34
+ pipe_path = _WORKSPACES_DIR / pipeline_name / "pipeline.yaml"
35
+ if not pipe_path.exists():
36
+ logger.info("Pipeline %s not found for context injection", pipeline_name)
37
+ return None
38
+
39
+ try:
40
+ content = pipe_path.read_text(encoding="utf-8")
41
+ data = yaml.safe_load(content)
42
+ if not isinstance(data, dict):
43
+ return None
44
+
45
+ name = data.get("name", pipeline_name)
46
+ goal = data.get("goal", data.get("description", ""))
47
+ steps = data.get("steps", [])
48
+
49
+ lines = [f"## 当前选中的 Pipeline: {name}"]
50
+ if goal:
51
+ lines.append(f"目标: {goal}")
52
+ if steps:
53
+ lines.append("")
54
+ lines.append("### 步骤列表")
55
+ for i, step in enumerate(steps):
56
+ step_name = step.get("name") if isinstance(step, dict) else str(step)
57
+ lines.append(f"- {step_name or f'step_{i}'}")
58
+ lines.append("")
59
+ lines.append("你可以使用 pipeline_* 工具对此 pipeline 进行操作。")
60
+ return "\n".join(lines)
61
+ except Exception as exc:
62
+ logger.warning("Failed to load pipeline %s context: %s", pipeline_name, exc)
63
+ return None
64
+
65
+
66
+ class Service:
67
+ """Business logic service for the YBU API.
68
+
69
+ Composes :class:`SessionManager` and :class:`EventBus` and
70
+ exposes the combined interface used by the route layer.
71
+ """
72
+
73
+ def __init__(self, engine_state: object | None = None):
74
+ self.sessions = SessionManager()
75
+ self.events = EventBus(engine_state)
76
+ self.sessions.set_event_pusher(self.events.push)
77
+ self._chat_lock = asyncio.Lock()
78
+
79
+ # ── Session management (delegated) ──────────────────────────────
80
+
81
+ def create_session(self, pipeline_name: str = "") -> SessionState:
82
+ return self.sessions.create_session(pipeline_name)
83
+
84
+ def get_session(self, pipeline_name: str | None = None) -> SessionState | None:
85
+ return self.sessions.get_session(pipeline_name)
86
+
87
+ def reset_session(self) -> SessionState:
88
+ return self.sessions.reset_session()
89
+
90
+ def cancel_session(self) -> SessionState | None:
91
+ return self.sessions.cancel_session()
92
+
93
+ def switch_session(self, pipeline_name: str) -> list[dict]:
94
+ return self.sessions.switch_session(pipeline_name)
95
+
96
+ def archive_session(self, pipeline_name: str, session_id: str) -> bool:
97
+ return self.sessions.archive_session(pipeline_name, session_id)
98
+
99
+ def new_session(self, pipeline_name: str) -> dict:
100
+ return self.sessions.new_session(pipeline_name)
101
+
102
+ # ── Chat message processing ─────────────────────────────────────
103
+
104
+ async def process_chat_message(
105
+ self,
106
+ message: str,
107
+ *,
108
+ cdp_helpers: object | None = None,
109
+ tools_dir: Path | None = None,
110
+ pipeline_name: str = "",
111
+ llm_call: Callable | None = None,
112
+ ) -> dict:
113
+ """Process a chat message through conversation_loop."""
114
+ async with self._chat_lock:
115
+ from yak_browser_use.engine._harness.conversation_loop import (
116
+ run_conversation_loop,
117
+ ConversationResult,
118
+ )
119
+ from yak_browser_use.engine._harness.tools import get_all_tools
120
+ from yak_browser_use.prompts._loader import build_system_prompt
121
+
122
+ session = self.sessions.get_session(pipeline_name)
123
+ if session is None:
124
+ session = self.sessions.create_session(pipeline_name)
125
+
126
+ logger.info("Chat [%s] user: %s", session.session_id, message[:120])
127
+
128
+ session.status = "running"
129
+ self.events.push({
130
+ "type": "session.state",
131
+ "status": "running",
132
+ "session_id": session.session_id,
133
+ })
134
+
135
+ session.messages.append({"role": "user", "content": message})
136
+
137
+ system_prompt = build_system_prompt()
138
+
139
+ normalized = self.sessions.normalize_pipeline(pipeline_name)
140
+ self.sessions.active_pipeline = normalized
141
+ if normalized != _DEFAULT_PIPELINE:
142
+ pipeline_ctx = _build_pipeline_context(normalized)
143
+ if pipeline_ctx:
144
+ system_prompt += "\n\n" + pipeline_ctx
145
+
146
+ def _stream_cb(event: dict) -> None:
147
+ event["session_id"] = session.session_id
148
+ self.events.push(event)
149
+
150
+ def _interrupt_check() -> bool:
151
+ return session.status in ("cancelled",)
152
+
153
+ _todo_token = current_store.set(session.todo_store)
154
+ self.events.chat_streaming = True
155
+
156
+ def _on_turn_complete() -> None:
157
+ self.sessions.persist_session(session)
158
+
159
+ try:
160
+ result: ConversationResult = await run_conversation_loop(
161
+ llm_call=llm_call,
162
+ system_prompt=system_prompt,
163
+ messages=session.messages,
164
+ tools=get_all_tools(),
165
+ cdp_helpers=cdp_helpers,
166
+ tools_dir=tools_dir,
167
+ pipeline_name=normalized,
168
+ interrupt_check=_interrupt_check,
169
+ stream_callback=_stream_cb,
170
+ on_turn_complete=_on_turn_complete,
171
+ )
172
+
173
+ session.status = "completed" if not result.interrupted else "cancelled"
174
+ session.budget_snapshot = result.budget.to_dict()
175
+
176
+ self.sessions.persist_session(session)
177
+
178
+ resp_preview = (result.final_response or "")[:120]
179
+ logger.info("Chat [%s] done: status=%s turns=%d duration=%dms response: %s",
180
+ session.session_id, session.status,
181
+ result.turn_count, result.duration_ms, resp_preview)
182
+
183
+ return {
184
+ "ok": True,
185
+ "response": result.final_response,
186
+ "status": session.status,
187
+ "turn_count": result.turn_count,
188
+ "duration_ms": result.duration_ms,
189
+ }
190
+
191
+ except Exception as e:
192
+ logger.error("Chat processing error: %s", e)
193
+ session.status = "cancelled"
194
+ session.error_info = {"message": str(e)}
195
+ return {"ok": False, "error": str(e)}
196
+
197
+ finally:
198
+ self.events.chat_streaming = False
199
+ self.events.push({
200
+ "type": "session.state",
201
+ "status": session.status,
202
+ "session_id": session.session_id,
203
+ })
204
+ current_store.reset(_todo_token)
205
+
206
+ # ── Pipeline management ─────────────────────────────────────────
207
+
208
+ def compile_pipeline(self, pipeline_text: str) -> dict:
209
+ """Compile pipeline.yaml text into step definitions."""
210
+ try:
211
+ from yak_browser_use.compiler.parser import parse_pipeline
212
+ from yak_browser_use.compiler.resolver import resolve
213
+ parsed = parse_pipeline(pipeline_text)
214
+ return resolve(parsed)
215
+ except Exception as e:
216
+ raise APIError(f"Failed to compile pipeline.yaml: {e}")
217
+
218
+ def list_presets(self) -> list[dict]:
219
+ """List saved pipelines from workspaces/."""
220
+ if not _WORKSPACES_DIR.exists():
221
+ return []
222
+ presets: list[dict] = []
223
+ for d in sorted(_WORKSPACES_DIR.iterdir()):
224
+ if not d.is_dir() or d.name.startswith("."):
225
+ continue
226
+ pipe_path = d / "pipeline.yaml"
227
+ if not pipe_path.exists():
228
+ continue
229
+ try:
230
+ presets.append({
231
+ "name": d.name,
232
+ "path": str(pipe_path),
233
+ "modified": pipe_path.stat().st_mtime,
234
+ })
235
+ except Exception:
236
+ logger.warning("Failed to stat pipeline in %s", d, exc_info=True)
237
+ return presets
238
+
239
+ # ── Events (delegated) ─────────────────────────────────────────
240
+
241
+ def on_event(self, callback: Callable[[dict], None]) -> None:
242
+ """Register a callback for event streaming."""
243
+ self.events.on_event(callback)
244
+
245
+