uipath 2.1.92__tar.gz → 2.1.94__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.
Potentially problematic release.
This version of uipath might be problematic. Click here for more details.
- {uipath-2.1.92 → uipath-2.1.94}/PKG-INFO +2 -1
- {uipath-2.1.92 → uipath-2.1.94}/pyproject.toml +2 -1
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/__init__.py +2 -1
- uipath-2.1.94/src/uipath/_cli/_debug/_bridge.py +414 -0
- uipath-2.1.94/src/uipath/_cli/_debug/_runtime.py +138 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_runtime/_contracts.py +16 -10
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_runtime/_runtime.py +0 -5
- uipath-2.1.94/src/uipath/_cli/cli_debug.py +142 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_run.py +6 -1
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/middlewares.py +1 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_events/_events.py +18 -15
- {uipath-2.1.92 → uipath-2.1.94}/uv.lock +865 -1
- {uipath-2.1.92 → uipath-2.1.94}/.claude/agents/command-tester.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.claude/commands/prepare-pr.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.cursorrules +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.editorconfig +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.gitattributes +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/labeler.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/auto-label.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/integration_tests.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/test-uipath-langchain.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/test-uipath-llamaindex.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.github/workflows/test.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.gitignore +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.python-version +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.vscode/extensions.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.vscode/launch.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/.vscode/settings.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/CONTRIBUTING.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/LICENSE +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/README.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/FAQ.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/assets/favicon.png +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/assets/llms.txt +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/cli/index.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/actions.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/assets.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/attachments.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/buckets.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/connections.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/documents.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/documents_models.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/getting_started.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/jobs.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/processes.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/queues.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/core/traced.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/hooks.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/index.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/overrides/main.html +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/release_policy.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/justfile +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/mkdocs.yml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/py.typed +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/asset-modifier-agent/.env.example +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/asset-modifier-agent/README.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/asset-modifier-agent/input.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/asset-modifier-agent/main.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/asset-modifier-agent/pyproject.toml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/asset-modifier-agent/uv.lock +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/calculator/README.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/calculator/evals/eval-sets/default.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/calculator/evals/evaluators/equality.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/calculator/evals/evaluators/llm-as-a-judge.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/calculator/main.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/calculator/pyproject.toml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/calculator/uipath.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/scripts/debug_test.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/scripts/update_agents_md.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/_auth_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_components/_chat.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_components/_details.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_components/_history.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_components/_new.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_utils/_chat.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_utils/_exporter.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_dev/_terminal/_utils/_logger.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_console_progress_reporter.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_evaluator_factory.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_models/_evaluator.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_models/_evaluator_base_params.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_models/_exceptions.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_models/_mocks.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_models/_output.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_models/_sw_reporting.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_progress_reporter.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_runtime.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/_span_collection.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/mocks/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/mocks/input_mocker.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/mocks/llm_mocker.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/mocks/mocker.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/mocks/mocker_factory.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/mocks/mockito_mocker.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_evals/mocks/mocks.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_runtime/_script_executor.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_eval_set.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_eval.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/models/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/models/runtime_schema.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_config.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_events/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_events/_event_bus.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_resources/AGENTS.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_resources/CLAUDE.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_resources/CLI_REFERENCE.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_resources/REQUIRED_STRUCTURE.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_resources/SDK_REFERENCE.md +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/documents_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/entities_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/external_application_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_auth.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/_utils.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/async_stream.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/citation.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/content.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/conversation.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/event.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/exchange.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/message.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/meta.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/conversation/tool.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/loop/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/loop/prompts.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/loop/tools.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/models/agent.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/agent/models/evals.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/_helpers/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/_helpers/helpers.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/evaluators/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/evaluators/base_evaluator.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/evaluators/deterministic_evaluator_base.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/evaluators/exact_match_evaluator.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/evaluators/json_similarity_evaluator.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/evaluators/llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/evaluators/trajectory_evaluator.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/mocks/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/mocks/mockable.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/models/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/eval/models/models.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/auth.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/documents.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/entities.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/job.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/py.typed +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/src/uipath/utils/dynamic_schema.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/apicalls-testcase/main.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/apicalls-testcase/pyproject.toml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/apicalls-testcase/run.sh +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/apicalls-testcase/src/assert.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/basic-testcase/main.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/basic-testcase/pyproject.toml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/basic-testcase/run.sh +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/basic-testcase/src/assert.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/common/validate_output.sh +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/langchain-cross/agent.mermaid +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/langchain-cross/langgraph.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/langchain-cross/pyproject.toml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/langchain-cross/run.sh +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/langchain-cross/src/assert.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/langchain-cross/src/main.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/llamaindex-cross/agent.mermaid +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/llamaindex-cross/llama_index.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/llamaindex-cross/pyproject.toml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/llamaindex-cross/run.sh +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/llamaindex-cross/src/assert.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/testcases/llamaindex-cross/src/main.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/__init__.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/agent/models/test_agent.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/agent/models/test_evals.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/conftest.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/eval/mocks/test_input_mocker.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/eval/mocks/test_mocks.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/models/test_runtime_schema.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_init.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_init_agents_md.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_new.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_oidc_utils.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_push.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_run.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/utils/test_dynamic_schema.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/conftest.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_documents_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_entities_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_external_application_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/tests_data/documents_service/create_validation_action_response.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/tests_data/documents_service/extraction_response.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/services/tests_data/documents_service/validated_result.json +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.92 → uipath-2.1.94}/tests/tracing/test_tracing_manager.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: uipath
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.94
|
|
4
4
|
Summary: Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools.
|
|
5
5
|
Project-URL: Homepage, https://uipath.com
|
|
6
6
|
Project-URL: Repository, https://github.com/UiPath/uipath-python
|
|
@@ -25,6 +25,7 @@ Requires-Dist: pathlib>=1.0.1
|
|
|
25
25
|
Requires-Dist: pydantic-function-models>=0.1.10
|
|
26
26
|
Requires-Dist: pydantic>=2.11.1
|
|
27
27
|
Requires-Dist: pyperclip>=1.9.0
|
|
28
|
+
Requires-Dist: pysignalr==1.3.0
|
|
28
29
|
Requires-Dist: python-dotenv>=1.0.1
|
|
29
30
|
Requires-Dist: rich>=13.0.0
|
|
30
31
|
Requires-Dist: tenacity>=9.0.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "uipath"
|
|
3
|
-
version = "2.1.
|
|
3
|
+
version = "2.1.94"
|
|
4
4
|
description = "Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools."
|
|
5
5
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -22,6 +22,7 @@ dependencies = [
|
|
|
22
22
|
"mockito>=1.5.4",
|
|
23
23
|
"hydra-core>=1.3.2",
|
|
24
24
|
"pydantic-function-models>=0.1.10",
|
|
25
|
+
"pysignalr==1.3.0",
|
|
25
26
|
]
|
|
26
27
|
classifiers = [
|
|
27
28
|
"Development Status :: 3 - Alpha",
|
|
@@ -5,6 +5,7 @@ import click
|
|
|
5
5
|
|
|
6
6
|
from ._utils._common import add_cwd_to_path, load_environment_variables
|
|
7
7
|
from .cli_auth import auth as auth
|
|
8
|
+
from .cli_debug import debug as debug # type: ignore
|
|
8
9
|
from .cli_deploy import deploy as deploy # type: ignore
|
|
9
10
|
from .cli_dev import dev as dev
|
|
10
11
|
from .cli_eval import eval as eval # type: ignore
|
|
@@ -74,4 +75,4 @@ cli.add_command(push)
|
|
|
74
75
|
cli.add_command(pull)
|
|
75
76
|
cli.add_command(eval)
|
|
76
77
|
cli.add_command(dev)
|
|
77
|
-
cli.add_command(
|
|
78
|
+
cli.add_command(debug)
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
from abc import ABC, abstractmethod
|
|
6
|
+
from typing import Any, Dict, Optional
|
|
7
|
+
|
|
8
|
+
from pysignalr.client import SignalRClient
|
|
9
|
+
from rich.console import Console
|
|
10
|
+
from rich.syntax import Syntax
|
|
11
|
+
|
|
12
|
+
from uipath._cli._runtime._contracts import (
|
|
13
|
+
UiPathBreakpointResult,
|
|
14
|
+
UiPathRuntimeContext,
|
|
15
|
+
UiPathRuntimeResult,
|
|
16
|
+
)
|
|
17
|
+
from uipath._events._events import UiPathAgentStateEvent
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class UiPathDebugBridge(ABC):
|
|
23
|
+
"""Abstract interface for debug communication.
|
|
24
|
+
|
|
25
|
+
Implementations: SignalR, Console, WebSocket, etc.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
@abstractmethod
|
|
29
|
+
async def connect(self) -> None:
|
|
30
|
+
"""Establish connection to debugger."""
|
|
31
|
+
pass
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
async def disconnect(self) -> None:
|
|
35
|
+
"""Close connection to debugger."""
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
@abstractmethod
|
|
39
|
+
async def emit_execution_started(self, execution_id: str, **kwargs) -> None:
|
|
40
|
+
"""Notify debugger that execution started."""
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
@abstractmethod
|
|
44
|
+
async def emit_state_update(self, state_event: UiPathAgentStateEvent) -> None:
|
|
45
|
+
"""Notify debugger of agent state update."""
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
@abstractmethod
|
|
49
|
+
async def emit_breakpoint_hit(
|
|
50
|
+
self, breakpoint_result: UiPathBreakpointResult
|
|
51
|
+
) -> None:
|
|
52
|
+
"""Notify debugger that a breakpoint was hit."""
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
@abstractmethod
|
|
56
|
+
async def emit_execution_completed(
|
|
57
|
+
self,
|
|
58
|
+
runtime_result: UiPathRuntimeResult,
|
|
59
|
+
) -> None:
|
|
60
|
+
"""Notify debugger that execution completed."""
|
|
61
|
+
pass
|
|
62
|
+
|
|
63
|
+
@abstractmethod
|
|
64
|
+
async def emit_execution_error(
|
|
65
|
+
self,
|
|
66
|
+
execution_id: str,
|
|
67
|
+
error: str,
|
|
68
|
+
) -> None:
|
|
69
|
+
"""Notify debugger that an error occurred."""
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
@abstractmethod
|
|
73
|
+
async def wait_for_resume(self) -> Any:
|
|
74
|
+
"""Wait for resume command from debugger."""
|
|
75
|
+
pass
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class ConsoleDebugBridge(UiPathDebugBridge):
|
|
79
|
+
"""Console-based debug bridge for local development."""
|
|
80
|
+
|
|
81
|
+
def __init__(self, verbose: bool = True):
|
|
82
|
+
"""Initialize console debug bridge.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
verbose: If True, show state updates. If False, only show breakpoints.
|
|
86
|
+
"""
|
|
87
|
+
self.console = Console()
|
|
88
|
+
self.verbose = verbose
|
|
89
|
+
|
|
90
|
+
async def connect(self) -> None:
|
|
91
|
+
"""Connect to console debugger."""
|
|
92
|
+
self.console.print()
|
|
93
|
+
self.console.print("[bold cyan]─" * 40)
|
|
94
|
+
self.console.print("[bold cyan]Debug Mode")
|
|
95
|
+
self.console.print("[dim]Press ENTER to continue | Type 'quit' to exit")
|
|
96
|
+
self.console.print("[bold cyan]─" * 40)
|
|
97
|
+
self.console.print()
|
|
98
|
+
|
|
99
|
+
async def disconnect(self) -> None:
|
|
100
|
+
"""Cleanup."""
|
|
101
|
+
self.console.print()
|
|
102
|
+
self.console.print("[dim]─" * 40)
|
|
103
|
+
self.console.print("[green]Debug session completed")
|
|
104
|
+
self.console.print("[dim]─" * 40)
|
|
105
|
+
|
|
106
|
+
async def emit_execution_started(self, execution_id: str, **kwargs) -> None:
|
|
107
|
+
"""Print execution started."""
|
|
108
|
+
self.console.print("[green]▶ Started[/green] [dim]")
|
|
109
|
+
self.console.print()
|
|
110
|
+
|
|
111
|
+
async def emit_state_update(self, state_event: UiPathAgentStateEvent) -> None:
|
|
112
|
+
"""Print agent state update."""
|
|
113
|
+
if not self.verbose:
|
|
114
|
+
return
|
|
115
|
+
|
|
116
|
+
self.console.print(f"[yellow]●[/yellow] [bold]{state_event.node_name}[/bold]")
|
|
117
|
+
|
|
118
|
+
async def emit_breakpoint_hit(
|
|
119
|
+
self, breakpoint_result: UiPathBreakpointResult
|
|
120
|
+
) -> None:
|
|
121
|
+
"""Print breakpoint info."""
|
|
122
|
+
self.console.print()
|
|
123
|
+
self.console.print("[red]─" * 40)
|
|
124
|
+
self.console.print(
|
|
125
|
+
f"[red]■ BREAKPOINT[/red] [bold]{breakpoint_result.breakpoint_node}[/bold] "
|
|
126
|
+
f"[dim]({breakpoint_result.breakpoint_type})"
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
if breakpoint_result.next_nodes:
|
|
130
|
+
self.console.print(f"[dim]Next: {', '.join(breakpoint_result.next_nodes)}")
|
|
131
|
+
|
|
132
|
+
self.console.print("[red]─" * 40)
|
|
133
|
+
|
|
134
|
+
# Display current state
|
|
135
|
+
if breakpoint_result.current_state:
|
|
136
|
+
self._print_json(breakpoint_result.current_state, label="State")
|
|
137
|
+
|
|
138
|
+
async def emit_execution_completed(
|
|
139
|
+
self,
|
|
140
|
+
runtime_result: "UiPathRuntimeResult",
|
|
141
|
+
) -> None:
|
|
142
|
+
"""Print completion."""
|
|
143
|
+
self.console.print()
|
|
144
|
+
|
|
145
|
+
status_upper = runtime_result.status.value.upper()
|
|
146
|
+
if status_upper == "SUCCESSFUL":
|
|
147
|
+
color = "green"
|
|
148
|
+
symbol = "✓"
|
|
149
|
+
elif status_upper == "SUSPENDED":
|
|
150
|
+
color = "yellow"
|
|
151
|
+
symbol = "■"
|
|
152
|
+
else:
|
|
153
|
+
color = "blue"
|
|
154
|
+
symbol = "●"
|
|
155
|
+
|
|
156
|
+
self.console.print(
|
|
157
|
+
f"[{color}]{symbol} Completed[/{color}] [bold]{status_upper}[/bold]"
|
|
158
|
+
)
|
|
159
|
+
if runtime_result.output:
|
|
160
|
+
self._print_json(runtime_result.output, label="Output")
|
|
161
|
+
|
|
162
|
+
async def emit_execution_error(
|
|
163
|
+
self,
|
|
164
|
+
execution_id: str,
|
|
165
|
+
error: str,
|
|
166
|
+
) -> None:
|
|
167
|
+
"""Print error."""
|
|
168
|
+
self.console.print()
|
|
169
|
+
self.console.print("[red]─" * 40)
|
|
170
|
+
self.console.print(f"[red]✗ Error[/red] [dim]{execution_id}")
|
|
171
|
+
self.console.print("[red]─" * 40)
|
|
172
|
+
|
|
173
|
+
# Truncate very long errors
|
|
174
|
+
error_display = error
|
|
175
|
+
if len(error) > 500:
|
|
176
|
+
error_display = error[:500] + "\n[dim]... (truncated)"
|
|
177
|
+
|
|
178
|
+
self.console.print(f"[white]{error_display}[/white]")
|
|
179
|
+
self.console.print("[red]─" * 40)
|
|
180
|
+
|
|
181
|
+
async def wait_for_resume(self) -> Any:
|
|
182
|
+
"""Wait for user to press Enter or type commands."""
|
|
183
|
+
self.console.print()
|
|
184
|
+
self.console.print("[cyan]> [/cyan]", end="")
|
|
185
|
+
|
|
186
|
+
# Run input() in executor to not block async loop
|
|
187
|
+
loop = asyncio.get_running_loop()
|
|
188
|
+
user_input = await loop.run_in_executor(None, input)
|
|
189
|
+
|
|
190
|
+
if user_input.strip().lower() == "quit":
|
|
191
|
+
raise KeyboardInterrupt("User requested exit")
|
|
192
|
+
|
|
193
|
+
self.console.print()
|
|
194
|
+
return user_input
|
|
195
|
+
|
|
196
|
+
def _print_json(self, data: Dict[str, Any], label: str = "Data") -> None:
|
|
197
|
+
"""Print JSON data in a readable format."""
|
|
198
|
+
try:
|
|
199
|
+
json_str = json.dumps(data, indent=2, default=str)
|
|
200
|
+
|
|
201
|
+
# Limit output if too large
|
|
202
|
+
is_truncated = False
|
|
203
|
+
if len(json_str) > 2000:
|
|
204
|
+
json_str = json_str[:2000] + "\n..."
|
|
205
|
+
is_truncated = True
|
|
206
|
+
|
|
207
|
+
syntax = Syntax(
|
|
208
|
+
json_str,
|
|
209
|
+
"json",
|
|
210
|
+
theme="monokai",
|
|
211
|
+
line_numbers=False,
|
|
212
|
+
background_color="default",
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
self.console.print()
|
|
216
|
+
truncated_text = " (truncated)" if is_truncated else ""
|
|
217
|
+
self.console.print(f"[dim]{label}{truncated_text}:")
|
|
218
|
+
self.console.print(syntax)
|
|
219
|
+
self.console.print()
|
|
220
|
+
except Exception:
|
|
221
|
+
# Fallback to simple print
|
|
222
|
+
self.console.print()
|
|
223
|
+
self.console.print(f"[dim]{label}:")
|
|
224
|
+
self.console.print(str(data))
|
|
225
|
+
self.console.print()
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
class SignalRDebugBridge(UiPathDebugBridge):
|
|
229
|
+
"""SignalR-based debug bridge for remote debugging.
|
|
230
|
+
|
|
231
|
+
Communicates with a SignalR hub server.
|
|
232
|
+
"""
|
|
233
|
+
|
|
234
|
+
def __init__(
|
|
235
|
+
self,
|
|
236
|
+
hub_url: str,
|
|
237
|
+
access_token: Optional[str] = None,
|
|
238
|
+
headers: Optional[Dict[str, str]] = None,
|
|
239
|
+
):
|
|
240
|
+
self.hub_url = hub_url
|
|
241
|
+
self.access_token = access_token
|
|
242
|
+
self.headers = headers or {}
|
|
243
|
+
self._client: Optional[SignalRClient] = None
|
|
244
|
+
self._connected_event = asyncio.Event()
|
|
245
|
+
self._resume_event: Optional[asyncio.Event] = None
|
|
246
|
+
self._resume_data: Any = None
|
|
247
|
+
|
|
248
|
+
async def connect(self) -> None:
|
|
249
|
+
"""Establish SignalR connection."""
|
|
250
|
+
all_headers = {**self.headers}
|
|
251
|
+
if self.access_token:
|
|
252
|
+
all_headers["Authorization"] = f"Bearer {self.access_token}"
|
|
253
|
+
|
|
254
|
+
self._client = SignalRClient(self.hub_url, headers=all_headers)
|
|
255
|
+
|
|
256
|
+
# Register event handlers
|
|
257
|
+
self._client.on("ResumeExecution", self._handle_resume)
|
|
258
|
+
self._client.on_open(self._handle_open)
|
|
259
|
+
self._client.on_close(self._handle_close)
|
|
260
|
+
self._client.on_error(self._handle_error)
|
|
261
|
+
|
|
262
|
+
# Start connection in background
|
|
263
|
+
asyncio.create_task(self._client.run())
|
|
264
|
+
|
|
265
|
+
# Wait for connection to establish
|
|
266
|
+
await asyncio.wait_for(self._connected_event.wait(), timeout=30.0)
|
|
267
|
+
|
|
268
|
+
async def disconnect(self) -> None:
|
|
269
|
+
"""Close SignalR connection."""
|
|
270
|
+
if self._client and hasattr(self._client, "_transport"):
|
|
271
|
+
transport = self._client._transport
|
|
272
|
+
if transport and hasattr(transport, "_ws") and transport._ws:
|
|
273
|
+
try:
|
|
274
|
+
await transport._ws.close()
|
|
275
|
+
except Exception as e:
|
|
276
|
+
logger.warning(f"Error closing SignalR WebSocket: {e}")
|
|
277
|
+
|
|
278
|
+
async def emit_execution_started(self, execution_id: str, **kwargs) -> None:
|
|
279
|
+
"""Send execution started event."""
|
|
280
|
+
logger.info(f"Execution started: {execution_id}")
|
|
281
|
+
await self._send("OnExecutionStarted", {"executionId": execution_id, **kwargs})
|
|
282
|
+
|
|
283
|
+
async def emit_state_update(self, state_event: UiPathAgentStateEvent) -> None:
|
|
284
|
+
"""Send agent state update to remote debugger."""
|
|
285
|
+
logger.info(f"State update: {state_event.node_name}")
|
|
286
|
+
await self._send(
|
|
287
|
+
"OnStateUpdate",
|
|
288
|
+
{
|
|
289
|
+
"executionId": state_event.execution_id,
|
|
290
|
+
"nodeName": state_event.node_name,
|
|
291
|
+
"state": state_event.payload,
|
|
292
|
+
},
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
async def emit_breakpoint_hit(
|
|
296
|
+
self, breakpoint_result: UiPathBreakpointResult
|
|
297
|
+
) -> None:
|
|
298
|
+
"""Send breakpoint hit event."""
|
|
299
|
+
logger.info(
|
|
300
|
+
f"Breakpoint hit: {breakpoint_result.breakpoint_node} "
|
|
301
|
+
f"({breakpoint_result.breakpoint_type})"
|
|
302
|
+
)
|
|
303
|
+
await self._send(
|
|
304
|
+
"OnBreakpointHit",
|
|
305
|
+
{
|
|
306
|
+
"node": breakpoint_result.breakpoint_node,
|
|
307
|
+
"type": breakpoint_result.breakpoint_type,
|
|
308
|
+
"state": breakpoint_result.current_state,
|
|
309
|
+
"nextNodes": breakpoint_result.next_nodes,
|
|
310
|
+
},
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
async def emit_execution_completed(
|
|
314
|
+
self,
|
|
315
|
+
runtime_result: UiPathRuntimeResult,
|
|
316
|
+
) -> None:
|
|
317
|
+
"""Send execution completed event."""
|
|
318
|
+
logger.info(f"Execution completed: {runtime_result.status}")
|
|
319
|
+
await self._send(
|
|
320
|
+
"OnExecutionCompleted",
|
|
321
|
+
{
|
|
322
|
+
"status": runtime_result.status,
|
|
323
|
+
},
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
async def emit_execution_error(
|
|
327
|
+
self,
|
|
328
|
+
execution_id: str,
|
|
329
|
+
error: str,
|
|
330
|
+
) -> None:
|
|
331
|
+
"""Send execution error event."""
|
|
332
|
+
logger.error(f"Execution error: {execution_id} - {error}")
|
|
333
|
+
await self._send(
|
|
334
|
+
"OnExecutionError",
|
|
335
|
+
{
|
|
336
|
+
"executionId": execution_id,
|
|
337
|
+
"error": error,
|
|
338
|
+
},
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
async def wait_for_resume(self) -> Any:
|
|
342
|
+
"""Wait for resume command from server."""
|
|
343
|
+
logger.info("Waiting for resume command...")
|
|
344
|
+
self._resume_event = asyncio.Event()
|
|
345
|
+
await self._resume_event.wait()
|
|
346
|
+
logger.info("Resume command received")
|
|
347
|
+
return self._resume_data
|
|
348
|
+
|
|
349
|
+
async def _send(self, method: str, data: Dict[str, Any]) -> None:
|
|
350
|
+
"""Send message to SignalR hub."""
|
|
351
|
+
if not self._client:
|
|
352
|
+
raise RuntimeError("SignalR client not connected")
|
|
353
|
+
|
|
354
|
+
await self._client.send(method=method, arguments=[data])
|
|
355
|
+
|
|
356
|
+
async def _handle_resume(self, args: list[Any]) -> None:
|
|
357
|
+
"""Handle resume command from SignalR server."""
|
|
358
|
+
if self._resume_event and len(args) > 0:
|
|
359
|
+
self._resume_data = args[0]
|
|
360
|
+
self._resume_event.set()
|
|
361
|
+
|
|
362
|
+
async def _handle_open(self) -> None:
|
|
363
|
+
"""Handle SignalR connection open."""
|
|
364
|
+
logger.info("SignalR connection established")
|
|
365
|
+
self._connected_event.set()
|
|
366
|
+
|
|
367
|
+
async def _handle_close(self) -> None:
|
|
368
|
+
"""Handle SignalR connection close."""
|
|
369
|
+
logger.info("SignalR connection closed")
|
|
370
|
+
self._connected_event.clear()
|
|
371
|
+
|
|
372
|
+
async def _handle_error(self, error: Any) -> None:
|
|
373
|
+
"""Handle SignalR error."""
|
|
374
|
+
logger.error(f"SignalR error: {error}")
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
def get_remote_debug_bridge(context: UiPathRuntimeContext) -> UiPathDebugBridge:
|
|
378
|
+
"""Factory to get SignalR debug bridge for remote debugging."""
|
|
379
|
+
uipath_url = os.environ.get("UIPATH_URL")
|
|
380
|
+
if not uipath_url or not context.job_id:
|
|
381
|
+
raise ValueError(
|
|
382
|
+
"UIPATH_URL and UIPATH_JOB_KEY are required for remote debugging"
|
|
383
|
+
)
|
|
384
|
+
if not context.trace_context:
|
|
385
|
+
raise ValueError("trace_context is required for remote debugging")
|
|
386
|
+
|
|
387
|
+
signalr_url = uipath_url + "/agenthub_/wsstunnel?jobId=" + context.job_id
|
|
388
|
+
return SignalRDebugBridge(
|
|
389
|
+
hub_url=signalr_url,
|
|
390
|
+
access_token=os.environ.get("UIPATH_ACCESS_TOKEN"),
|
|
391
|
+
headers={
|
|
392
|
+
"X-UiPath-Internal-TenantId": context.trace_context.tenant_id or "",
|
|
393
|
+
"X-UiPath-Internal-AccountId": context.trace_context.org_id or "",
|
|
394
|
+
"X-UiPath-FolderKey": context.trace_context.folder_key or "",
|
|
395
|
+
},
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def get_debug_bridge(
|
|
400
|
+
context: UiPathRuntimeContext, verbose: bool = True
|
|
401
|
+
) -> UiPathDebugBridge:
|
|
402
|
+
"""Factory to get appropriate debug bridge based on context.
|
|
403
|
+
|
|
404
|
+
Args:
|
|
405
|
+
context: The runtime context containing debug configuration.
|
|
406
|
+
verbose: If True, console bridge shows all state updates. If False, only breakpoints.
|
|
407
|
+
|
|
408
|
+
Returns:
|
|
409
|
+
An instance of UiPathDebugBridge suitable for the context.
|
|
410
|
+
"""
|
|
411
|
+
if context.job_id:
|
|
412
|
+
return get_remote_debug_bridge(context)
|
|
413
|
+
else:
|
|
414
|
+
return ConsoleDebugBridge(verbose=verbose)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import Generic, Optional, TypeVar
|
|
3
|
+
|
|
4
|
+
from uipath._events._events import (
|
|
5
|
+
UiPathAgentStateEvent,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
from .._runtime._contracts import (
|
|
9
|
+
UiPathBaseRuntime,
|
|
10
|
+
UiPathBreakpointResult,
|
|
11
|
+
UiPathRuntimeContext,
|
|
12
|
+
UiPathRuntimeFactory,
|
|
13
|
+
UiPathRuntimeResult,
|
|
14
|
+
UiPathRuntimeStreamNotSupportedError,
|
|
15
|
+
)
|
|
16
|
+
from ._bridge import UiPathDebugBridge
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
T = TypeVar("T", bound=UiPathBaseRuntime)
|
|
21
|
+
C = TypeVar("C", bound=UiPathRuntimeContext)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class UiPathDebugRuntime(UiPathBaseRuntime, Generic[T, C]):
|
|
25
|
+
"""Specialized runtime for debug runs that streams events to a debug bridge."""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
context: UiPathRuntimeContext,
|
|
30
|
+
factory: UiPathRuntimeFactory[T, C],
|
|
31
|
+
debug_bridge: UiPathDebugBridge,
|
|
32
|
+
):
|
|
33
|
+
super().__init__(context)
|
|
34
|
+
self.context: UiPathRuntimeContext = context
|
|
35
|
+
self.factory: UiPathRuntimeFactory[T, C] = factory
|
|
36
|
+
self.debug_bridge: UiPathDebugBridge = debug_bridge
|
|
37
|
+
self._inner_runtime: Optional[T] = None
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def from_debug_context(
|
|
41
|
+
cls,
|
|
42
|
+
context: UiPathRuntimeContext,
|
|
43
|
+
factory: UiPathRuntimeFactory[T, C],
|
|
44
|
+
debug_bridge: UiPathDebugBridge,
|
|
45
|
+
) -> "UiPathDebugRuntime[T, C]":
|
|
46
|
+
return cls(context, factory, debug_bridge)
|
|
47
|
+
|
|
48
|
+
async def execute(self) -> Optional[UiPathRuntimeResult]:
|
|
49
|
+
"""Execute the workflow with debug support."""
|
|
50
|
+
try:
|
|
51
|
+
await self.debug_bridge.connect()
|
|
52
|
+
|
|
53
|
+
self._inner_runtime = self.factory.new_runtime()
|
|
54
|
+
|
|
55
|
+
if not self._inner_runtime:
|
|
56
|
+
raise RuntimeError("Failed to create inner runtime")
|
|
57
|
+
|
|
58
|
+
await self.debug_bridge.emit_execution_started(
|
|
59
|
+
execution_id=self.context.execution_id or "default"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
# Try to stream events from inner runtime
|
|
63
|
+
try:
|
|
64
|
+
self.context.result = await self._stream_and_debug()
|
|
65
|
+
except UiPathRuntimeStreamNotSupportedError:
|
|
66
|
+
# Fallback to regular execute if streaming not supported
|
|
67
|
+
logger.debug(
|
|
68
|
+
f"Runtime {self._inner_runtime.__class__.__name__} does not support "
|
|
69
|
+
"streaming, falling back to execute()"
|
|
70
|
+
)
|
|
71
|
+
self.context.result = await self._inner_runtime.execute()
|
|
72
|
+
|
|
73
|
+
if self.context.result:
|
|
74
|
+
await self.debug_bridge.emit_execution_completed(self.context.result)
|
|
75
|
+
|
|
76
|
+
return self.context.result
|
|
77
|
+
|
|
78
|
+
except Exception as e:
|
|
79
|
+
# Emit execution error
|
|
80
|
+
await self.debug_bridge.emit_execution_error(
|
|
81
|
+
execution_id=self.context.execution_id or "default",
|
|
82
|
+
error=str(e),
|
|
83
|
+
)
|
|
84
|
+
raise
|
|
85
|
+
|
|
86
|
+
async def _stream_and_debug(self) -> Optional[UiPathRuntimeResult]:
|
|
87
|
+
"""Stream events from inner runtime and handle debug interactions."""
|
|
88
|
+
if not self._inner_runtime:
|
|
89
|
+
return None
|
|
90
|
+
|
|
91
|
+
final_result: Optional[UiPathRuntimeResult] = None
|
|
92
|
+
execution_completed = False
|
|
93
|
+
|
|
94
|
+
# Keep streaming until execution completes (not just paused at breakpoint)
|
|
95
|
+
while not execution_completed:
|
|
96
|
+
# Stream events from inner runtime
|
|
97
|
+
async for event in self._inner_runtime.stream():
|
|
98
|
+
# Handle final result
|
|
99
|
+
if isinstance(event, UiPathRuntimeResult):
|
|
100
|
+
final_result = event
|
|
101
|
+
|
|
102
|
+
# Check if it's a breakpoint result
|
|
103
|
+
if isinstance(event, UiPathBreakpointResult):
|
|
104
|
+
# Hit a breakpoint - wait for resume and continue
|
|
105
|
+
await self.debug_bridge.emit_breakpoint_hit(event)
|
|
106
|
+
await self.debug_bridge.wait_for_resume()
|
|
107
|
+
self._inner_runtime.context.resume = True
|
|
108
|
+
# Break out of stream loop to restart streaming from resume point
|
|
109
|
+
break
|
|
110
|
+
else:
|
|
111
|
+
# Normal completion or suspension with dynamic interrupt
|
|
112
|
+
execution_completed = True
|
|
113
|
+
|
|
114
|
+
# Handle dynamic interrupts if present
|
|
115
|
+
# Maybe poll for resume trigger completion here in future
|
|
116
|
+
break
|
|
117
|
+
|
|
118
|
+
# Handle state update events - send to debug bridge
|
|
119
|
+
elif isinstance(event, UiPathAgentStateEvent):
|
|
120
|
+
await self.debug_bridge.emit_state_update(event)
|
|
121
|
+
|
|
122
|
+
return final_result
|
|
123
|
+
|
|
124
|
+
async def validate(self) -> None:
|
|
125
|
+
"""Validate runtime configuration."""
|
|
126
|
+
if self._inner_runtime:
|
|
127
|
+
await self._inner_runtime.validate()
|
|
128
|
+
|
|
129
|
+
async def cleanup(self) -> None:
|
|
130
|
+
"""Cleanup runtime resources."""
|
|
131
|
+
try:
|
|
132
|
+
if self._inner_runtime:
|
|
133
|
+
await self._inner_runtime.cleanup()
|
|
134
|
+
finally:
|
|
135
|
+
try:
|
|
136
|
+
await self.debug_bridge.disconnect()
|
|
137
|
+
except Exception as e:
|
|
138
|
+
logger.warning(f"Error disconnecting debug bridge: {e}")
|
|
@@ -35,7 +35,7 @@ from opentelemetry.sdk.trace.export import (
|
|
|
35
35
|
from opentelemetry.trace import Tracer
|
|
36
36
|
from pydantic import BaseModel, Field
|
|
37
37
|
|
|
38
|
-
from uipath._events._events import
|
|
38
|
+
from uipath._events._events import UiPathRuntimeEvent
|
|
39
39
|
from uipath.agent.conversation import UiPathConversationEvent, UiPathConversationMessage
|
|
40
40
|
from uipath.tracing import TracingManager
|
|
41
41
|
|
|
@@ -156,7 +156,7 @@ class UiPathRuntimeResult(BaseModel):
|
|
|
156
156
|
return result
|
|
157
157
|
|
|
158
158
|
|
|
159
|
-
class
|
|
159
|
+
class UiPathBreakpointResult(UiPathRuntimeResult):
|
|
160
160
|
"""Result for execution suspended at a breakpoint."""
|
|
161
161
|
|
|
162
162
|
# Force status to always be SUSPENDED
|
|
@@ -488,6 +488,12 @@ class UiPathRuntimeError(Exception):
|
|
|
488
488
|
return self.error_info.model_dump()
|
|
489
489
|
|
|
490
490
|
|
|
491
|
+
class UiPathRuntimeStreamNotSupportedError(NotImplementedError):
|
|
492
|
+
"""Raised when a runtime does not support streaming."""
|
|
493
|
+
|
|
494
|
+
pass
|
|
495
|
+
|
|
496
|
+
|
|
491
497
|
class UiPathBaseRuntime(ABC):
|
|
492
498
|
"""Base runtime class implementing the async context manager protocol.
|
|
493
499
|
|
|
@@ -576,7 +582,7 @@ class UiPathBaseRuntime(ABC):
|
|
|
576
582
|
|
|
577
583
|
async def stream(
|
|
578
584
|
self,
|
|
579
|
-
) -> AsyncGenerator[Union[
|
|
585
|
+
) -> AsyncGenerator[Union[UiPathRuntimeEvent, UiPathRuntimeResult], None]:
|
|
580
586
|
"""Stream execution events in real-time.
|
|
581
587
|
|
|
582
588
|
This is an optional method that runtimes can implement to support streaming.
|
|
@@ -586,12 +592,12 @@ class UiPathBaseRuntime(ABC):
|
|
|
586
592
|
with the final event being UiPathRuntimeResult.
|
|
587
593
|
|
|
588
594
|
Yields:
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
Final yield: UiPathRuntimeResult
|
|
595
|
+
UiPathRuntimeEvent subclasses: Framework-agnostic events (UiPathAgentMessageEvent,
|
|
596
|
+
UiPathAgentStateEvent, etc.)
|
|
597
|
+
Final yield: UiPathRuntimeResult (or its subclass UiPathBreakpointResult)
|
|
592
598
|
|
|
593
599
|
Raises:
|
|
594
|
-
|
|
600
|
+
UiPathRuntimeStreamNotSupportedError: If the runtime doesn't support streaming
|
|
595
601
|
RuntimeError: If execution fails
|
|
596
602
|
|
|
597
603
|
Example:
|
|
@@ -600,14 +606,14 @@ class UiPathBaseRuntime(ABC):
|
|
|
600
606
|
# Last event - execution complete
|
|
601
607
|
print(f"Status: {event.status}")
|
|
602
608
|
break
|
|
603
|
-
elif isinstance(event,
|
|
609
|
+
elif isinstance(event, UiPathAgentMessageEvent):
|
|
604
610
|
# Handle message event
|
|
605
611
|
print(f"Message: {event.payload}")
|
|
606
|
-
elif isinstance(event,
|
|
612
|
+
elif isinstance(event, UiPathAgentStateEvent):
|
|
607
613
|
# Handle state update
|
|
608
614
|
print(f"State updated by: {event.node_name}")
|
|
609
615
|
"""
|
|
610
|
-
raise
|
|
616
|
+
raise UiPathRuntimeStreamNotSupportedError(
|
|
611
617
|
f"{self.__class__.__name__} does not implement streaming. "
|
|
612
618
|
"Use execute() instead."
|
|
613
619
|
)
|
|
@@ -45,11 +45,6 @@ class UiPathRuntime(UiPathBaseRuntime):
|
|
|
45
45
|
try:
|
|
46
46
|
script_result = await self.executor(self.context.input_json)
|
|
47
47
|
|
|
48
|
-
if self.context.job_id is None and not getattr(
|
|
49
|
-
self.context, "is_eval_run", False
|
|
50
|
-
):
|
|
51
|
-
logger.info(script_result)
|
|
52
|
-
|
|
53
48
|
self.context.result = UiPathRuntimeResult(
|
|
54
49
|
output=script_result, status=UiPathRuntimeStatus.SUCCESSFUL
|
|
55
50
|
)
|