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.
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/pyproject.toml +4 -10
- yak_browser_use-0.5.5.dev0/src/yak_browser_use/api/event_bus.py +55 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/routes.py +48 -11
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/server.py +3 -1
- yak_browser_use-0.5.5.dev0/src/yak_browser_use/api/service.py +245 -0
- yak_browser_use-0.5.5.dev0/src/yak_browser_use/api/session_manager.py +217 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/state.py +3 -1
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/discover.py +8 -0
- {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
- {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
- {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
- {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
- {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
- yak_browser_use-0.5.5.dev0/src/yak_browser_use/engine/agent.py +310 -0
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/executor.py +19 -42
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/ops.py +5 -18
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/scratchpad.py +2 -0
- {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
- {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
- {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
- {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
- {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
- {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
- 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
- yak_browser_use-0.5.5.dev0/src/yak_browser_use/static/assets/index-CwtndeyO.css +1 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/static/index.html +2 -2
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/adapters.py +5 -25
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/data.py +6 -25
- {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
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/registry.py +37 -28
- yak_browser_use-0.5.5.dev0/src/yak_browser_use/utils/bridge.py +68 -0
- yak_browser_use-0.5.5.dev0/src/yak_browser_use/utils/file_io.py +55 -0
- yak_browser_use-0.5.5.dev0/src/yak_browser_use/utils/helpers.py +35 -0
- {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
- {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
- {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
- {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
- {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
- yak_browser_use-0.5.5.dev0/src/yak_browser_use.egg-info/scm_version.json +8 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_api_routes.py +1 -0
- yak_browser_use-0.5.5.dev0/tests/test_file_io.py +117 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_format_convert.py +33 -20
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_harness_tools.py +3 -4
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_integration_agent_reform.py +0 -89
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_orchestration_filter.py +0 -64
- yak_browser_use-0.5.5.dev0/tests/test_runner.py +242 -0
- yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use/api/service.py +0 -402
- yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use/engine/agent.py +0 -303
- yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use/engine/runner.py +0 -109
- yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use/static/assets/index-0JhsQIuZ.css +0 -1
- yak_browser_use-0.5.3.post4.dev0/src/yak_browser_use.egg-info/scm_version.json +0 -8
- yak_browser_use-0.5.3.post4.dev0/tests/test_file_io.py +0 -111
- yak_browser_use-0.5.3.post4.dev0/tests/test_runner.py +0 -155
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/MANIFEST.in +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/README.md +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/setup.cfg +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/__main__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/errors.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/daemon.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/helpers.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/launcher.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/profiles.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/protocols.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cdp/session.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/_init.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/logs.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/run.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/serve.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/cli/web.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/diff.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/generator.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/graph.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/models.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/parser.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/prepare.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/resolver.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/compiler/schema.py +0 -0
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/delivery.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/events.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/engine/state.py +0 -0
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/llm/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/llm/client.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/llm/messages.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/params/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/params/manager.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/prompts/_loader.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/captcha.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/extract.py +0 -0
- {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
- {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
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/tools/todo.py +0 -0
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/_path.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/browser.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/utils/logging.py +0 -0
- {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
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/workspace/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/workspace/manager.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/__init__.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/_debug_a11y.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/conftest.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/run_a11y_on_html.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/run_progressive_profile.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_a11y_snapshot.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_agent.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_diff.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_generator.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_graph.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_parser.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_compiler_resolver.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_conversation_loop.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_delivery.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_error_classifier.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_events.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_exact_match.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_executor_helpers.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_iteration_budget.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_ops.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_param_resolver.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_path_guard.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_pipeline_tools.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_progressive.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_prompts_loader.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_registry.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_retry_utils.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_run_check.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_runner_preset.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_schema.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_scratchpad.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_session_persist.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_state.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_step_machine.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_todo_store.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_tool_executor.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_tool_guardrails.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_turn_context.py +0 -0
- {yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/tests/test_version_manager.py +0 -0
- {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
|
+
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
|
|
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
|
|
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
|
|
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>=
|
|
55
|
-
"pytest-asyncio>=
|
|
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
|
{yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/routes.py
RENAMED
|
@@ -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.
|
|
190
|
+
from yak_browser_use.engine.runner_preset import run_pipeline
|
|
192
191
|
except ImportError:
|
|
193
192
|
raise ServerError(
|
|
194
|
-
"engine.
|
|
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.
|
|
673
|
+
from yak_browser_use.engine.runner_preset import run_pipeline
|
|
674
674
|
except ImportError:
|
|
675
|
-
raise ServerError("engine.
|
|
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.
|
|
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
|
-
|
|
1077
|
-
|
|
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
|
-
|
|
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
|
|
{yak_browser_use-0.5.3.post4.dev0 → yak_browser_use-0.5.5.dev0}/src/yak_browser_use/api/server.py
RENAMED
|
@@ -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
|
+
|