uipath 2.0.64__tar.gz → 2.0.66__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.0.66/.vscode/launch.json +14 -0
- {uipath-2.0.64 → uipath-2.0.66}/PKG-INFO +1 -1
- {uipath-2.0.64 → uipath-2.0.66}/docs/cli/index.md +22 -1
- {uipath-2.0.64 → uipath-2.0.66}/pyproject.toml +1 -1
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_runtime/_hitl.py +72 -9
- uipath-2.0.66/src/uipath/_cli/_utils/_debug.py +52 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/cli_run.py +32 -3
- {uipath-2.0.64 → uipath-2.0.66}/uv.lock +1697 -1698
- {uipath-2.0.64 → uipath-2.0.66}/.cursorrules +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.editorconfig +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.gitattributes +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.github/workflows/cd.yml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.github/workflows/ci.yml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.github/workflows/lint.yml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.github/workflows/slack.yml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.github/workflows/test.yml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.gitignore +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.pre-commit-config.yaml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.python-version +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.vscode/extensions.json +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/.vscode/settings.json +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/CONTRIBUTING.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/LICENSE +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/README.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/FAQ.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/assets/favicon.png +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/assets/logo-light.svg +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/actions.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/assets.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/attachments.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/buckets.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/connections.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/context_grounding.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/environment_variables.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/getting_started.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/jobs.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/processes.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/queues.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/core/traced.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/hooks.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/javascripts/extra.js +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/langchain/chat_models.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/langchain/context_grounding.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/langchain/human_in_the_loop.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/overrides/main.html +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/release_policy.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/docs/stylesheets/extra.css +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/justfile +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/mkdocs.yml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/py.typed +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/__init__.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/README.md +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_runtime/_runtime.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_config.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_execution_context.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_folder_context.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_uipath.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/__init__.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/actions.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/assets.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/attachment.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/buckets.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/connections.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/errors.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/job.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/processes.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/models/queues.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/py.typed +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/__init__.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/conftest.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/test_hitl.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/test_init.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/test_invoke.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/test_new.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/test_pack.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/test_publish.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/test_run.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/test_utils.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/conftest.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/test_config.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/tests/tracing/test_traced.py +0 -0
- {uipath-2.0.64 → uipath-2.0.66}/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.0.
|
|
3
|
+
Version: 2.0.66
|
|
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
|
|
@@ -46,6 +46,27 @@ The `uipath init` command executes your `main.py` file to analyze its structure
|
|
|
46
46
|
:depth: 1
|
|
47
47
|
:style: table
|
|
48
48
|
|
|
49
|
+
/// tip
|
|
50
|
+
For step-by-step debugging with breakpoints and variable inspection (supported from `2.0.66` onward):
|
|
51
|
+
```console
|
|
52
|
+
# Install debugpy package
|
|
53
|
+
[uv] pip install debugpy
|
|
54
|
+
# Run agent with debugging enabled
|
|
55
|
+
uipath run [ENTRYPOINT] [INPUT] --debug
|
|
56
|
+
```
|
|
57
|
+
For vscode: add the [debug configuration](https://github.com/UiPath/uipath-python/blob/main/.vscode/launch.json) in your .vscode/launch.json file.
|
|
58
|
+
Place breakpoints in your code where needed.
|
|
59
|
+
Use the shortcut `F5`, or navigate to Run -> Start Debugging -> Python Debugger: Attach
|
|
60
|
+
|
|
61
|
+
Upon starting the debugging process, one should see the following logs in terminal:
|
|
62
|
+
```console
|
|
63
|
+
🐛 Debug server started on port 5678
|
|
64
|
+
📌 Waiting for debugger to attach...
|
|
65
|
+
- VS Code: Run -> Start Debugging -> Python Debugger: Attach
|
|
66
|
+
✓ Debugger attached successfully!
|
|
67
|
+
```
|
|
68
|
+
///
|
|
69
|
+
|
|
49
70
|
/// warning
|
|
50
71
|
Depending on the shell you are using, it may be necessary to escape the input json:
|
|
51
72
|
|
|
@@ -162,4 +183,4 @@ Selected feed: Orchestrator Tenant Processes Feed
|
|
|
162
183
|
⠴ Starting job ...
|
|
163
184
|
✨ Job started successfully!
|
|
164
185
|
🔗 Monitor your job here: [LINK]
|
|
165
|
-
```
|
|
186
|
+
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "uipath"
|
|
3
|
-
version = "2.0.
|
|
3
|
+
version = "2.0.66"
|
|
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"
|
|
@@ -19,20 +19,47 @@ from .._utils._common import serialize_object
|
|
|
19
19
|
from ._escalation import Escalation
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
def _try_convert_to_json_format(value: str) -> str:
|
|
22
|
+
def _try_convert_to_json_format(value: str | None) -> str | None:
|
|
23
|
+
"""Attempts to parse a string as JSON and returns the parsed object or original string.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
value: The string value to attempt JSON parsing on.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
The parsed JSON object if successful, otherwise the original string value.
|
|
30
|
+
"""
|
|
23
31
|
try:
|
|
32
|
+
if not value:
|
|
33
|
+
return None
|
|
24
34
|
return json.loads(value)
|
|
25
35
|
except json.decoder.JSONDecodeError:
|
|
26
36
|
return value
|
|
27
37
|
|
|
28
38
|
|
|
29
|
-
default_escalation = Escalation()
|
|
30
|
-
|
|
31
|
-
|
|
32
39
|
class HitlReader:
|
|
40
|
+
"""Handles reading and retrieving Human-In-The-Loop (HITL) data from UiPath services."""
|
|
41
|
+
|
|
33
42
|
@classmethod
|
|
34
43
|
async def read(cls, resume_trigger: UiPathResumeTrigger) -> Optional[str]:
|
|
44
|
+
"""Reads data from a UiPath resume trigger based on its type.
|
|
45
|
+
|
|
46
|
+
This method handles different types of resume triggers (ACTION, JOB, API) and retrieves
|
|
47
|
+
the appropriate data from UiPath services. For actions, it retrieves action data with
|
|
48
|
+
optional escalation processing. For jobs, it retrieves job output and validates success.
|
|
49
|
+
For API triggers, it retrieves the API payload.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
resume_trigger: The UiPath resume trigger containing the trigger type and metadata.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
The retrieved data as a string, or None if no data is available.
|
|
56
|
+
|
|
57
|
+
Raises:
|
|
58
|
+
UiPathRuntimeError: If the job failed, API connection failed, trigger type is unknown,
|
|
59
|
+
or HITL feedback retrieval failed.
|
|
60
|
+
"""
|
|
35
61
|
uipath = UiPath()
|
|
62
|
+
default_escalation = Escalation()
|
|
36
63
|
match resume_trigger.trigger_type:
|
|
37
64
|
case UiPathResumeTriggerType.ACTION:
|
|
38
65
|
if resume_trigger.item_key:
|
|
@@ -62,9 +89,10 @@ class HitlReader:
|
|
|
62
89
|
raise UiPathRuntimeError(
|
|
63
90
|
"INVOKED_PROCESS_FAILURE",
|
|
64
91
|
"Invoked process did not finish successfully.",
|
|
65
|
-
_try_convert_to_json_format(str(job.job_error or job.info))
|
|
92
|
+
_try_convert_to_json_format(str(job.job_error or job.info))
|
|
93
|
+
or "Job error unavailable.",
|
|
66
94
|
)
|
|
67
|
-
return job.output_arguments
|
|
95
|
+
return _try_convert_to_json_format(job.output_arguments)
|
|
68
96
|
|
|
69
97
|
case UiPathResumeTriggerType.API:
|
|
70
98
|
if resume_trigger.api_resume and resume_trigger.api_resume.inbox_id:
|
|
@@ -97,13 +125,30 @@ class HitlReader:
|
|
|
97
125
|
|
|
98
126
|
@dataclass
|
|
99
127
|
class HitlProcessor:
|
|
100
|
-
"""Processes events in a Human-(Robot/Agent)-In-The-Loop scenario.
|
|
128
|
+
"""Processes events in a Human-(Robot/Agent)-In-The-Loop scenario.
|
|
129
|
+
|
|
130
|
+
This class handles the creation and processing of HITL resume triggers for different
|
|
131
|
+
types of UiPath operations including actions, jobs, and API calls. It determines the
|
|
132
|
+
appropriate trigger type based on the input value and creates the corresponding
|
|
133
|
+
resume trigger with proper configuration.
|
|
134
|
+
|
|
135
|
+
Attributes:
|
|
136
|
+
value: The input value to be processed, can be various UiPath model types or strings.
|
|
137
|
+
"""
|
|
101
138
|
|
|
102
139
|
value: Any
|
|
103
140
|
|
|
104
141
|
@cached_property
|
|
105
142
|
def type(self) -> UiPathResumeTriggerType:
|
|
106
|
-
"""
|
|
143
|
+
"""Determines the resume trigger type based on the input value.
|
|
144
|
+
|
|
145
|
+
Analyzes the input value type and returns the corresponding UiPath resume trigger type.
|
|
146
|
+
Actions (CreateAction, WaitAction) map to ACTION type, jobs (InvokeProcess, WaitJob)
|
|
147
|
+
map to JOB type, and all other values default to API type.
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
The appropriate UiPathResumeTriggerType based on the input value type.
|
|
151
|
+
"""
|
|
107
152
|
if isinstance(self.value, CreateAction) or isinstance(self.value, WaitAction):
|
|
108
153
|
return UiPathResumeTriggerType.ACTION
|
|
109
154
|
if isinstance(self.value, InvokeProcess) or isinstance(self.value, WaitJob):
|
|
@@ -112,8 +157,26 @@ class HitlProcessor:
|
|
|
112
157
|
return UiPathResumeTriggerType.API
|
|
113
158
|
|
|
114
159
|
async def create_resume_trigger(self) -> UiPathResumeTrigger:
|
|
115
|
-
"""
|
|
160
|
+
"""Creates a UiPath resume trigger based on the input value and its type.
|
|
161
|
+
|
|
162
|
+
This method processes the input value and creates an appropriate resume trigger
|
|
163
|
+
for HITL scenarios. It handles different input types:
|
|
164
|
+
- Actions: Creates or references UiPath actions with folder information
|
|
165
|
+
- Jobs: Invokes processes or references existing jobs with folder information
|
|
166
|
+
- API: Creates API triggers with generated inbox IDs
|
|
167
|
+
- String with escalation: Creates escalated actions
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
A configured UiPathResumeTrigger ready for HITL processing.
|
|
171
|
+
|
|
172
|
+
Raises:
|
|
173
|
+
UiPathRuntimeError: If action/job creation fails, escalation fails, or an
|
|
174
|
+
unknown model type is encountered.
|
|
175
|
+
Exception: If any underlying UiPath service calls fail.
|
|
176
|
+
"""
|
|
116
177
|
uipath = UiPath()
|
|
178
|
+
default_escalation = Escalation()
|
|
179
|
+
|
|
117
180
|
try:
|
|
118
181
|
hitl_input = self.value
|
|
119
182
|
resume_trigger = UiPathResumeTrigger(
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""Debug utilities for UiPath CLI."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
|
|
5
|
+
from ._console import ConsoleLogger
|
|
6
|
+
|
|
7
|
+
console = ConsoleLogger()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def setup_debugging(debug: bool, debug_port: int = 5678) -> bool:
|
|
11
|
+
"""Setup debugging with debugpy if requested.
|
|
12
|
+
|
|
13
|
+
Args:
|
|
14
|
+
debug: Whether to enable debugging
|
|
15
|
+
debug_port: Port for the debug server (default: 5678)
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
bool: True if debugging was setup successfully or not requested, False on error
|
|
19
|
+
"""
|
|
20
|
+
if not debug:
|
|
21
|
+
return True
|
|
22
|
+
|
|
23
|
+
# Set environment variables to improve debugging
|
|
24
|
+
os.environ["PYDEVD_DISABLE_FILE_VALIDATION"] = "1"
|
|
25
|
+
os.environ["PYDEVD_USE_FRAME_EVAL"] = "NO"
|
|
26
|
+
|
|
27
|
+
# Try to import debugpy, log warning if not available
|
|
28
|
+
try:
|
|
29
|
+
import debugpy # type: ignore[import-not-found]
|
|
30
|
+
except ImportError:
|
|
31
|
+
console.warning(
|
|
32
|
+
"debugpy not found, please install it and retry: '[uv] pip install debugpy'"
|
|
33
|
+
)
|
|
34
|
+
return False
|
|
35
|
+
|
|
36
|
+
# Configure debugpy for better breakpoint handling
|
|
37
|
+
try:
|
|
38
|
+
# Clear any existing listeners
|
|
39
|
+
debugpy.configure(subProcess=False)
|
|
40
|
+
|
|
41
|
+
debugpy.listen(debug_port)
|
|
42
|
+
console.info(f"🐛 Debug server started on port {debug_port}")
|
|
43
|
+
console.info("📌 Waiting for debugger to attach...")
|
|
44
|
+
console.info(" - VS Code: Run -> Start Debugging -> Python: Remote Attach")
|
|
45
|
+
|
|
46
|
+
debugpy.wait_for_client()
|
|
47
|
+
console.success("Debugger attached successfully!")
|
|
48
|
+
|
|
49
|
+
return True
|
|
50
|
+
except Exception as e:
|
|
51
|
+
console.error(f"Failed to start debug server on port {debug_port}: {str(e)}")
|
|
52
|
+
return False
|
|
@@ -9,6 +9,8 @@ from uuid import uuid4
|
|
|
9
9
|
import click
|
|
10
10
|
from dotenv import load_dotenv
|
|
11
11
|
|
|
12
|
+
from uipath._cli._utils._debug import setup_debugging
|
|
13
|
+
|
|
12
14
|
from .._utils.constants import (
|
|
13
15
|
ENV_JOB_ID,
|
|
14
16
|
)
|
|
@@ -27,7 +29,9 @@ load_dotenv(override=True)
|
|
|
27
29
|
|
|
28
30
|
|
|
29
31
|
def python_run_middleware(
|
|
30
|
-
entrypoint: Optional[str],
|
|
32
|
+
entrypoint: Optional[str],
|
|
33
|
+
input: Optional[str],
|
|
34
|
+
resume: bool,
|
|
31
35
|
) -> MiddlewareResult:
|
|
32
36
|
"""Middleware to handle Python script execution.
|
|
33
37
|
|
|
@@ -35,6 +39,8 @@ def python_run_middleware(
|
|
|
35
39
|
entrypoint: Path to the Python script to execute
|
|
36
40
|
input: JSON string with input data
|
|
37
41
|
resume: Flag indicating if this is a resume execution
|
|
42
|
+
debug: Enable debugging with debugpy
|
|
43
|
+
debug_port: Port for debug server (default: 5678)
|
|
38
44
|
|
|
39
45
|
Returns:
|
|
40
46
|
MiddlewareResult with execution status and messages
|
|
@@ -112,9 +118,25 @@ Usage: `uipath run <entrypoint_path> <input_arguments> [-f <input_json_file_path
|
|
|
112
118
|
type=click.Path(exists=True),
|
|
113
119
|
help="File path for the .json input",
|
|
114
120
|
)
|
|
121
|
+
@click.option(
|
|
122
|
+
"--debug",
|
|
123
|
+
is_flag=True,
|
|
124
|
+
help="Enable debugging with debugpy. The process will wait for a debugger to attach.",
|
|
125
|
+
)
|
|
126
|
+
@click.option(
|
|
127
|
+
"--debug-port",
|
|
128
|
+
type=int,
|
|
129
|
+
default=5678,
|
|
130
|
+
help="Port for the debug server (default: 5678)",
|
|
131
|
+
)
|
|
115
132
|
@track(when=lambda *_a, **_kw: env.get(ENV_JOB_ID) is None)
|
|
116
133
|
def run(
|
|
117
|
-
entrypoint: Optional[str],
|
|
134
|
+
entrypoint: Optional[str],
|
|
135
|
+
input: Optional[str],
|
|
136
|
+
resume: bool,
|
|
137
|
+
file: Optional[str],
|
|
138
|
+
debug: bool,
|
|
139
|
+
debug_port: int,
|
|
118
140
|
) -> None:
|
|
119
141
|
"""Execute the project."""
|
|
120
142
|
if file:
|
|
@@ -123,12 +145,19 @@ def run(
|
|
|
123
145
|
console.error("Input file extension must be '.json'.")
|
|
124
146
|
with open(file) as f:
|
|
125
147
|
input = f.read()
|
|
148
|
+
# Setup debugging if requested
|
|
149
|
+
|
|
150
|
+
if not setup_debugging(debug, debug_port):
|
|
151
|
+
console.error(f"Failed to start debug server on port {debug_port}")
|
|
152
|
+
|
|
126
153
|
# Process through middleware chain
|
|
127
154
|
result = Middlewares.next("run", entrypoint, input, resume)
|
|
128
155
|
|
|
129
156
|
if result.should_continue:
|
|
130
157
|
result = python_run_middleware(
|
|
131
|
-
entrypoint=entrypoint,
|
|
158
|
+
entrypoint=entrypoint,
|
|
159
|
+
input=input,
|
|
160
|
+
resume=resume,
|
|
132
161
|
)
|
|
133
162
|
|
|
134
163
|
# Handle result from middleware
|