uipath 2.1.31__tar.gz → 2.1.33__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.
- {uipath-2.1.31 → uipath-2.1.33}/PKG-INFO +1 -1
- {uipath-2.1.31 → uipath-2.1.33}/pyproject.toml +1 -1
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/__init__.py +42 -9
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_components/_details.py +83 -57
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_components/_history.py +18 -6
- uipath-2.1.33/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +23 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_components/_new.py +28 -27
- uipath-2.1.33/src/uipath/_cli/_dev/_terminal/_components/_resume.py +35 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +29 -8
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +10 -147
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_runtime.py +1 -1
- {uipath-2.1.31 → uipath-2.1.33}/uv.lock +1 -1
- {uipath-2.1.31 → uipath-2.1.33}/.cursorrules +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.editorconfig +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.gitattributes +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/cd.yml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/ci.yml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/commitlint.yml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/lint.yml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/publish-dev.yml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/publish-docs.yml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/slack.yml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/test.yml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.gitignore +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.pre-commit-config.yaml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.python-version +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.vscode/extensions.json +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.vscode/launch.json +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/.vscode/settings.json +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/CONTRIBUTING.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/LICENSE +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/README.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/CONTRIBUTING.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/FAQ.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/assets/env-preparation-failed-dark.png +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/assets/env-preparation-failed-light.png +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/assets/favicon.png +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/assets/logo-dark.svg +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/assets/logo-light.svg +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/cli/index.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/actions.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/cloud_env_var_dark.gif +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/cloud_env_var_light.gif +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/copy_path_dark.png +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/copy_path_light.png +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/attachments.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/buckets.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/connections.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/context_grounding.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/environment_variables.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/getting_started.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/jobs.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/llm_gateway.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/processes.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/queues.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/core/traced.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/hooks.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/index.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/javascripts/extra.js +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/overrides/main.html +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/overrides/partials/actions.html +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/overrides/partials/logo.html +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/release_policy.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/docs/stylesheets/extra.css +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/justfile +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/mkdocs.yml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/py.typed +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/event-trigger/.python-version +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/event-trigger/README.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/event-trigger/main.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/event-trigger/pyproject.toml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/.env.example +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/README.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/input.json +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/pyproject.toml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/uv.lock +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/scripts/debug_test.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/scripts/lint_httpx_client.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/README.md +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_auth_server.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_models.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_portal_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_url_utils.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_utils.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/auth_config.json +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/index.html +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/localhost.crt +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/localhost.key +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_traces/_exporter.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_traces/_logger.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_deterministic_evaluator_base.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_evaluator_base.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_evaluator_factory.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_exact_match_evaluator.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_json_similarity_evaluator.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_llm_as_judge_evaluator.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_trajectory_evaluator.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_models/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_models/_evaluators.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/evaluation_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/progress_reporter.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_contracts.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_escalation.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_hitl.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_logging.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/.rels.template +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/main.py.template +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_common.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_console.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_constants.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_debug.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_folders.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_input_args.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_processes.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_project_files.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_studio_project.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_tracing.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_auth.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_deploy.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_dev.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_eval.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_init.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_invoke.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_new.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_pack.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_publish.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_pull.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_push.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_run.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/middlewares.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/spinner.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_config.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_execution_context.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_folder_context.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/_base_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/actions_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/api_client.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/assets_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/attachments_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/buckets_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/connections_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/context_grounding_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/folder_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/jobs_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/llm_gateway_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/processes_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/queues_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_uipath.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_endpoint.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_infer_bindings.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_logs.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_read_overwrites.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_request_override.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_request_spec.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_ssl_context.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_url.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_user_agent.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/constants.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/action_schema.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/actions.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/assets.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/attachment.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/buckets.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/connections.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/context_grounding.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/context_grounding_index.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/errors.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/exceptions.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/interrupt_models.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/job.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/llm_gateway.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/processes.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/queues.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/py.typed +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/telemetry/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/telemetry/_constants.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/telemetry/_track.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/tracing/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/tracing/_otel_exporters.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/tracing/_traced.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/tracing/_utils.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/utils/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/src/uipath/utils/_endpoints_manager.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/__init__.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/conftest.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/bindings_script.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/pyproject.toml +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/simple_script.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/uipath-mock.json +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_auth.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_hitl.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_init.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_input_args.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_invoke.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_new.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_pack.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_portal_service_refresh_token.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_publish.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_pull.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_push.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_run.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_utils.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/utils/common.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/utils/project_details.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/cli/utils/uipath_json.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/conftest.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/conftest.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_actions_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_api_client.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_assets_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_attachments_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_base_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_buckets_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_connections_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_context_grounding_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_folder_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_jobs_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_llm_integration.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_llm_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_processes_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_queues_service.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/test_bindings_inference.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/test_config.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/test_overwrites.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/tracing/test_otel_exporters.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/tracing/test_span_utils.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/tests/tracing/test_traced.py +0 -0
- {uipath-2.1.31 → uipath-2.1.33}/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.33
|
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
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[project]
|
2
2
|
name = "uipath"
|
3
|
-
version = "2.1.
|
3
|
+
version = "2.1.33"
|
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"
|
@@ -10,17 +10,19 @@ from uuid import uuid4
|
|
10
10
|
from textual.app import App, ComposeResult
|
11
11
|
from textual.binding import Binding
|
12
12
|
from textual.containers import Container, Horizontal
|
13
|
-
from textual.widgets import Button, ListView
|
13
|
+
from textual.widgets import Button, Footer, ListView
|
14
14
|
|
15
15
|
from ..._runtime._contracts import (
|
16
16
|
UiPathErrorContract,
|
17
17
|
UiPathRuntimeContext,
|
18
18
|
UiPathRuntimeError,
|
19
19
|
UiPathRuntimeFactory,
|
20
|
+
UiPathRuntimeStatus,
|
20
21
|
)
|
21
22
|
from ._components._details import RunDetailsPanel
|
22
23
|
from ._components._history import RunHistoryPanel
|
23
24
|
from ._components._new import NewRunPanel
|
25
|
+
from ._components._resume import ResumePanel
|
24
26
|
from ._models._execution import ExecutionRun
|
25
27
|
from ._models._messages import LogMessage, TraceMessage
|
26
28
|
from ._traces._exporter import RunContextExporter
|
@@ -34,8 +36,8 @@ class UiPathDevTerminal(App[Any]):
|
|
34
36
|
|
35
37
|
BINDINGS = [
|
36
38
|
Binding("q", "quit", "Quit"),
|
37
|
-
Binding("n", "new_run", "New
|
38
|
-
Binding("r", "execute_run", "
|
39
|
+
Binding("n", "new_run", "New"),
|
40
|
+
Binding("r", "execute_run", "Run"),
|
39
41
|
Binding("c", "clear_history", "Clear History"),
|
40
42
|
Binding("escape", "cancel", "Cancel"),
|
41
43
|
]
|
@@ -76,6 +78,8 @@ class UiPathDevTerminal(App[Any]):
|
|
76
78
|
# Run details panel (initially hidden)
|
77
79
|
yield RunDetailsPanel(id="details-panel", classes="hidden")
|
78
80
|
|
81
|
+
yield Footer()
|
82
|
+
|
79
83
|
async def on_button_pressed(self, event: Button.Pressed) -> None:
|
80
84
|
"""Handle button press events."""
|
81
85
|
if event.button.id == "new-run-btn":
|
@@ -84,6 +88,8 @@ class UiPathDevTerminal(App[Any]):
|
|
84
88
|
await self.action_execute_run()
|
85
89
|
elif event.button.id == "cancel-btn":
|
86
90
|
await self.action_cancel()
|
91
|
+
elif event.button.id == "resume-btn":
|
92
|
+
await self.action_resume()
|
87
93
|
|
88
94
|
async def on_list_view_selected(self, event: ListView.Selected) -> None:
|
89
95
|
"""Handle run selection from history."""
|
@@ -107,6 +113,20 @@ class UiPathDevTerminal(App[Any]):
|
|
107
113
|
"""Cancel and return to new run view."""
|
108
114
|
await self.action_new_run()
|
109
115
|
|
116
|
+
async def action_resume(self) -> None:
|
117
|
+
"""Resume the suspended run."""
|
118
|
+
details_panel = self.query_one("#details-panel", RunDetailsPanel)
|
119
|
+
if details_panel and details_panel.current_run:
|
120
|
+
input: Dict[str, Any] = {}
|
121
|
+
input_data = self.query_one("#resume-panel", ResumePanel).get_input_values()
|
122
|
+
try:
|
123
|
+
input = json.loads(input_data)
|
124
|
+
except json.JSONDecodeError:
|
125
|
+
return
|
126
|
+
details_panel.current_run.resume_data = input
|
127
|
+
asyncio.create_task(self._execute_runtime(details_panel.current_run))
|
128
|
+
details_panel.switch_tab("run-tab")
|
129
|
+
|
110
130
|
async def action_execute_run(self) -> None:
|
111
131
|
"""Execute a new run with UiPath runtime."""
|
112
132
|
new_run_panel = self.query_one("#new-run-panel", NewRunPanel)
|
@@ -115,12 +135,14 @@ class UiPathDevTerminal(App[Any]):
|
|
115
135
|
if not entrypoint:
|
116
136
|
return
|
117
137
|
|
138
|
+
input: Dict[str, Any] = {}
|
118
139
|
try:
|
119
|
-
json.loads(input_data)
|
140
|
+
input = json.loads(input_data)
|
120
141
|
except json.JSONDecodeError:
|
121
142
|
return
|
122
143
|
|
123
|
-
run = ExecutionRun(entrypoint,
|
144
|
+
run = ExecutionRun(entrypoint, input)
|
145
|
+
|
124
146
|
self.runs[run.id] = run
|
125
147
|
|
126
148
|
self._add_run_in_history(run)
|
@@ -140,7 +162,6 @@ class UiPathDevTerminal(App[Any]):
|
|
140
162
|
try:
|
141
163
|
context: UiPathRuntimeContext = self.runtime_factory.new_context(
|
142
164
|
entrypoint=run.entrypoint,
|
143
|
-
input=run.input_data,
|
144
165
|
trace_id=str(uuid4()),
|
145
166
|
execution_id=run.id,
|
146
167
|
logs_min_level=env.get("LOG_LEVEL", "INFO"),
|
@@ -149,17 +170,29 @@ class UiPathDevTerminal(App[Any]):
|
|
149
170
|
),
|
150
171
|
)
|
151
172
|
|
152
|
-
|
173
|
+
if run.status == "suspended":
|
174
|
+
context.resume = True
|
175
|
+
context.input_json = run.resume_data
|
176
|
+
self._add_info_log(run, f"Resuming execution: {run.entrypoint}")
|
177
|
+
else:
|
178
|
+
context.input_json = run.input_data
|
179
|
+
self._add_info_log(run, f"Starting execution: {run.entrypoint}")
|
180
|
+
|
181
|
+
run.status = "running"
|
182
|
+
run.start_time = datetime.now()
|
153
183
|
|
154
184
|
result = await self.runtime_factory.execute_in_root_span(context)
|
155
185
|
|
156
186
|
if result is not None:
|
157
|
-
|
187
|
+
if result.status == UiPathRuntimeStatus.SUSPENDED.value:
|
188
|
+
run.status = "suspended"
|
189
|
+
else:
|
190
|
+
run.output_data = result.output
|
191
|
+
run.status = "completed"
|
158
192
|
if run.output_data:
|
159
193
|
self._add_info_log(run, f"Execution result: {run.output_data}")
|
160
194
|
|
161
195
|
self._add_info_log(run, "✅ Execution completed successfully")
|
162
|
-
run.status = "completed"
|
163
196
|
run.end_time = datetime.now()
|
164
197
|
|
165
198
|
except UiPathRuntimeError as e:
|
@@ -8,6 +8,7 @@ from textual.widgets.tree import TreeNode
|
|
8
8
|
|
9
9
|
from .._models._execution import ExecutionRun
|
10
10
|
from .._models._messages import LogMessage, TraceMessage
|
11
|
+
from ._resume import ResumePanel
|
11
12
|
|
12
13
|
|
13
14
|
class SpanDetailsDisplay(Container):
|
@@ -27,14 +28,7 @@ class SpanDetailsDisplay(Container):
|
|
27
28
|
details_log = self.query_one("#span-details", RichLog)
|
28
29
|
details_log.clear()
|
29
30
|
|
30
|
-
# Format span details
|
31
31
|
details_log.write(f"[bold cyan]Span: {trace_msg.span_name}[/bold cyan]")
|
32
|
-
details_log.write(f"[dim]Trace ID: {trace_msg.trace_id}[/dim]")
|
33
|
-
details_log.write(f"[dim]Span ID: {trace_msg.span_id}[/dim]")
|
34
|
-
details_log.write(f"[dim]Run ID: {trace_msg.run_id}[/dim]")
|
35
|
-
|
36
|
-
if trace_msg.parent_span_id:
|
37
|
-
details_log.write(f"[dim]Parent Span: {trace_msg.parent_span_id}[/dim]")
|
38
32
|
|
39
33
|
details_log.write("") # Empty line
|
40
34
|
|
@@ -66,6 +60,16 @@ class SpanDetailsDisplay(Container):
|
|
66
60
|
for key, value in trace_msg.attributes.items():
|
67
61
|
details_log.write(f" {key}: {value}")
|
68
62
|
|
63
|
+
details_log.write("") # Empty line
|
64
|
+
|
65
|
+
# Format span details
|
66
|
+
details_log.write(f"[dim]Trace ID: {trace_msg.trace_id}[/dim]")
|
67
|
+
details_log.write(f"[dim]Span ID: {trace_msg.span_id}[/dim]")
|
68
|
+
details_log.write(f"[dim]Run ID: {trace_msg.run_id}[/dim]")
|
69
|
+
|
70
|
+
if trace_msg.parent_span_id:
|
71
|
+
details_log.write(f"[dim]Parent Span: {trace_msg.parent_span_id}[/dim]")
|
72
|
+
|
69
73
|
|
70
74
|
class RunDetailsPanel(Container):
|
71
75
|
"""Panel showing traces and logs for selected run with tabbed interface."""
|
@@ -112,6 +116,9 @@ class RunDetailsPanel(Container):
|
|
112
116
|
classes="detail-log",
|
113
117
|
)
|
114
118
|
|
119
|
+
with TabPane("Resume", id="resume-tab"):
|
120
|
+
yield ResumePanel(id="resume-panel")
|
121
|
+
|
115
122
|
def watch_current_run(
|
116
123
|
self, old_value: Optional[ExecutionRun], new_value: Optional[ExecutionRun]
|
117
124
|
):
|
@@ -139,8 +146,69 @@ class RunDetailsPanel(Container):
|
|
139
146
|
# Clear and rebuild traces tree using TraceMessage objects
|
140
147
|
self._rebuild_spans_tree()
|
141
148
|
|
149
|
+
def switch_tab(self, tab_id: str) -> None:
|
150
|
+
"""Switch to a specific tab by id (e.g. 'run-tab', 'traces-tab')."""
|
151
|
+
tabbed = self.query_one(TabbedContent)
|
152
|
+
tabbed.active = tab_id
|
153
|
+
|
154
|
+
def _update_resume_tab(self, run: ExecutionRun) -> None:
|
155
|
+
resume_panel = self.query_one("#resume-panel", ResumePanel)
|
156
|
+
resume_panel.display = run.status == "suspended"
|
157
|
+
|
158
|
+
def _flatten_values(self, value: object, prefix: str = "") -> list[str]:
|
159
|
+
"""Flatten nested dict/list structures into dot-notation paths."""
|
160
|
+
lines: list[str] = []
|
161
|
+
|
162
|
+
if value is None:
|
163
|
+
lines.append(f"{prefix}: [dim]—[/dim]" if prefix else "[dim]—[/dim]")
|
164
|
+
|
165
|
+
elif isinstance(value, dict):
|
166
|
+
if not value:
|
167
|
+
lines.append(f"{prefix}: {{}}" if prefix else "{}")
|
168
|
+
else:
|
169
|
+
for k, v in value.items():
|
170
|
+
new_prefix = f"{prefix}.{k}" if prefix else k
|
171
|
+
lines.extend(self._flatten_values(v, new_prefix))
|
172
|
+
|
173
|
+
elif isinstance(value, list):
|
174
|
+
if not value:
|
175
|
+
lines.append(f"{prefix}: []" if prefix else "[]")
|
176
|
+
else:
|
177
|
+
for i, item in enumerate(value):
|
178
|
+
new_prefix = f"{prefix}[{i}]"
|
179
|
+
lines.extend(self._flatten_values(item, new_prefix))
|
180
|
+
|
181
|
+
elif isinstance(value, str):
|
182
|
+
if prefix:
|
183
|
+
for line in value.splitlines():
|
184
|
+
lines.append(f"{prefix}: {line}")
|
185
|
+
else:
|
186
|
+
lines.extend(value.splitlines())
|
187
|
+
|
188
|
+
else:
|
189
|
+
if prefix:
|
190
|
+
lines.append(f"{prefix}: {value}")
|
191
|
+
else:
|
192
|
+
lines.append(str(value))
|
193
|
+
|
194
|
+
return lines
|
195
|
+
|
196
|
+
def _write_block(
|
197
|
+
self, log: RichLog, title: str, data: object, style: str = "white"
|
198
|
+
) -> None:
|
199
|
+
"""Pretty-print a block with flattened dot-notation paths."""
|
200
|
+
log.write(f"[bold {style}]{title.upper()}:[/bold {style}]")
|
201
|
+
log.write("[dim]" + "=" * 50 + "[/dim]")
|
202
|
+
|
203
|
+
for line in self._flatten_values(data):
|
204
|
+
log.write(line)
|
205
|
+
|
206
|
+
log.write("")
|
207
|
+
|
142
208
|
def _show_run_details(self, run: ExecutionRun):
|
143
209
|
"""Display detailed information about the run in the Details tab."""
|
210
|
+
self._update_resume_tab(run)
|
211
|
+
|
144
212
|
run_details_log = self.query_one("#run-details-log", RichLog)
|
145
213
|
run_details_log.clear()
|
146
214
|
|
@@ -191,39 +259,16 @@ class RunDetailsPanel(Container):
|
|
191
259
|
|
192
260
|
run_details_log.write("")
|
193
261
|
|
194
|
-
|
195
|
-
|
196
|
-
run_details_log.write("[bold green]INPUT:[/bold green]")
|
197
|
-
run_details_log.write("[dim]" + "=" * 50 + "[/dim]")
|
198
|
-
|
199
|
-
# Handle different input types
|
200
|
-
if isinstance(run.input_data, str):
|
201
|
-
run_details_log.write(run.input_data)
|
202
|
-
elif isinstance(run.input_data, dict):
|
203
|
-
import json
|
262
|
+
if hasattr(run, "input_data"):
|
263
|
+
self._write_block(run_details_log, "Input", run.input_data, style="green")
|
204
264
|
|
205
|
-
|
206
|
-
|
207
|
-
run_details_log.write(str(run.input_data))
|
265
|
+
if hasattr(run, "resume_data") and run.resume_data:
|
266
|
+
self._write_block(run_details_log, "Resume", run.resume_data, style="green")
|
208
267
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
run_details_log.write("[bold magenta]OUTPUT:[/bold magenta]")
|
214
|
-
run_details_log.write("[dim]" + "=" * 50 + "[/dim]")
|
215
|
-
|
216
|
-
# Handle different output types
|
217
|
-
if isinstance(run.output_data, str):
|
218
|
-
run_details_log.write(run.output_data)
|
219
|
-
elif isinstance(run.output_data, dict):
|
220
|
-
import json
|
221
|
-
|
222
|
-
run_details_log.write(json.dumps(run.output_data, indent=2))
|
223
|
-
else:
|
224
|
-
run_details_log.write(str(run.output_data))
|
225
|
-
|
226
|
-
run_details_log.write("")
|
268
|
+
if hasattr(run, "output_data"):
|
269
|
+
self._write_block(
|
270
|
+
run_details_log, "Output", run.output_data, style="magenta"
|
271
|
+
)
|
227
272
|
|
228
273
|
# Error section (if applicable)
|
229
274
|
if hasattr(run, "error") and run.error:
|
@@ -235,25 +280,6 @@ class RunDetailsPanel(Container):
|
|
235
280
|
run_details_log.write(f"[red]\n{run.error.detail}[/red]")
|
236
281
|
run_details_log.write("")
|
237
282
|
|
238
|
-
# Additional metadata
|
239
|
-
run_details_log.write("[bold]METADATA:[/bold]")
|
240
|
-
run_details_log.write("[dim]" + "=" * 50 + "[/dim]")
|
241
|
-
|
242
|
-
# Show available attributes
|
243
|
-
for attr in ["id", "status", "start_time", "end_time", "duration_ms"]:
|
244
|
-
if hasattr(run, attr):
|
245
|
-
value = getattr(run, attr)
|
246
|
-
if value is not None:
|
247
|
-
run_details_log.write(f" {attr}: {value}")
|
248
|
-
|
249
|
-
# Show traces count
|
250
|
-
traces_count = len(run.traces) if run.traces else 0
|
251
|
-
run_details_log.write(f" traces_count: {traces_count}")
|
252
|
-
|
253
|
-
# Show logs count
|
254
|
-
logs_count = len(run.logs) if run.logs else 0
|
255
|
-
run_details_log.write(f" logs_count: {logs_count}")
|
256
|
-
|
257
283
|
def _rebuild_spans_tree(self):
|
258
284
|
"""Rebuild the spans tree from current run's traces."""
|
259
285
|
spans_tree = self.query_one("#spans-tree", Tree)
|
@@ -2,7 +2,14 @@ from typing import List, Optional
|
|
2
2
|
|
3
3
|
from textual.app import ComposeResult
|
4
4
|
from textual.containers import Container, Vertical
|
5
|
-
from textual.widgets import
|
5
|
+
from textual.widgets import (
|
6
|
+
Button,
|
7
|
+
ListItem,
|
8
|
+
ListView,
|
9
|
+
Static,
|
10
|
+
TabbedContent,
|
11
|
+
TabPane,
|
12
|
+
)
|
6
13
|
|
7
14
|
from .._models._execution import ExecutionRun
|
8
15
|
|
@@ -16,11 +23,16 @@ class RunHistoryPanel(Container):
|
|
16
23
|
self.selected_run: Optional[ExecutionRun] = None
|
17
24
|
|
18
25
|
def compose(self) -> ComposeResult:
|
19
|
-
with
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
26
|
+
with TabbedContent():
|
27
|
+
with TabPane("History", id="history-tab"):
|
28
|
+
with Vertical():
|
29
|
+
yield ListView(id="run-list", classes="run-list")
|
30
|
+
yield Button(
|
31
|
+
"+ New",
|
32
|
+
id="new-run-btn",
|
33
|
+
variant="primary",
|
34
|
+
classes="new-run-btn",
|
35
|
+
)
|
24
36
|
|
25
37
|
def add_run(self, run: ExecutionRun):
|
26
38
|
"""Add a new run to history."""
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import json
|
2
|
+
|
3
|
+
from textual.widgets import TextArea
|
4
|
+
|
5
|
+
|
6
|
+
class JsonInput(TextArea):
|
7
|
+
"""TextArea that validates JSON on change."""
|
8
|
+
|
9
|
+
def validate_json(self) -> bool:
|
10
|
+
text = self.text.strip()
|
11
|
+
if not text:
|
12
|
+
self.remove_class("invalid")
|
13
|
+
return True
|
14
|
+
try:
|
15
|
+
json.loads(text)
|
16
|
+
self.remove_class("invalid")
|
17
|
+
return True
|
18
|
+
except json.JSONDecodeError:
|
19
|
+
self.add_class("invalid")
|
20
|
+
return False
|
21
|
+
|
22
|
+
def on_text_area_changed(self, event: TextArea.Changed) -> None:
|
23
|
+
self.validate_json()
|
@@ -5,7 +5,9 @@ from typing import Any, Dict, Tuple, cast
|
|
5
5
|
from textual.app import ComposeResult
|
6
6
|
from textual.containers import Container, Horizontal, Vertical
|
7
7
|
from textual.reactive import reactive
|
8
|
-
from textual.widgets import Button, Select, TextArea
|
8
|
+
from textual.widgets import Button, Select, TabbedContent, TabPane, TextArea
|
9
|
+
|
10
|
+
from ._json_input import JsonInput
|
9
11
|
|
10
12
|
|
11
13
|
def mock_json_from_schema(schema: Dict[str, Any]) -> Dict[str, Any]:
|
@@ -63,32 +65,31 @@ class NewRunPanel(Container):
|
|
63
65
|
)
|
64
66
|
|
65
67
|
def compose(self) -> ComposeResult:
|
66
|
-
with
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
)
|
68
|
+
with TabbedContent():
|
69
|
+
with TabPane("New run", id="new-tab"):
|
70
|
+
with Vertical():
|
71
|
+
options = [(path, path) for path in self.entrypoint_paths]
|
72
|
+
yield Select(
|
73
|
+
options,
|
74
|
+
id="entrypoint-select",
|
75
|
+
value=self.selected_entrypoint,
|
76
|
+
allow_blank=False,
|
77
|
+
)
|
78
|
+
|
79
|
+
yield JsonInput(
|
80
|
+
text=self.initial_input,
|
81
|
+
language="json",
|
82
|
+
id="json-input",
|
83
|
+
classes="input-field json-input",
|
84
|
+
)
|
85
|
+
|
86
|
+
with Horizontal(classes="run-actions"):
|
87
|
+
yield Button(
|
88
|
+
"▶ Run",
|
89
|
+
id="execute-btn",
|
90
|
+
variant="primary",
|
91
|
+
classes="action-btn",
|
92
|
+
)
|
92
93
|
|
93
94
|
async def on_select_changed(self, event: Select.Changed) -> None:
|
94
95
|
"""Update JSON input when user selects an entrypoint."""
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import json
|
2
|
+
|
3
|
+
from textual.app import ComposeResult
|
4
|
+
from textual.containers import Container, Horizontal, Vertical
|
5
|
+
from textual.widgets import Button, TextArea
|
6
|
+
|
7
|
+
from ._json_input import JsonInput
|
8
|
+
|
9
|
+
|
10
|
+
class ResumePanel(Container):
|
11
|
+
"""Panel for resuming a suspended run."""
|
12
|
+
|
13
|
+
def __init__(self, **kwargs):
|
14
|
+
super().__init__(**kwargs)
|
15
|
+
|
16
|
+
def compose(self) -> ComposeResult:
|
17
|
+
with Vertical():
|
18
|
+
yield JsonInput(
|
19
|
+
text=json.dumps({"value": ""}, indent=2),
|
20
|
+
language="json",
|
21
|
+
id="resume-json-input",
|
22
|
+
classes="input-field json-input",
|
23
|
+
)
|
24
|
+
with Horizontal(classes="run-actions"):
|
25
|
+
yield Button(
|
26
|
+
"▶ Resume",
|
27
|
+
id="resume-btn",
|
28
|
+
variant="primary",
|
29
|
+
classes="action-btn",
|
30
|
+
)
|
31
|
+
|
32
|
+
def get_input_values(self) -> str:
|
33
|
+
"""Return the JSON text to resume with."""
|
34
|
+
json_input = self.query_one("#resume-json-input", TextArea)
|
35
|
+
return json_input.text.strip()
|
@@ -1,8 +1,10 @@
|
|
1
1
|
import os
|
2
2
|
from datetime import datetime
|
3
|
-
from typing import List, Optional
|
3
|
+
from typing import Any, Dict, List, Optional
|
4
4
|
from uuid import uuid4
|
5
5
|
|
6
|
+
from rich.text import Text
|
7
|
+
|
6
8
|
from ...._runtime._contracts import UiPathErrorContract
|
7
9
|
from ._messages import LogMessage, TraceMessage
|
8
10
|
|
@@ -10,11 +12,12 @@ from ._messages import LogMessage, TraceMessage
|
|
10
12
|
class ExecutionRun:
|
11
13
|
"""Represents a single execution run."""
|
12
14
|
|
13
|
-
def __init__(self, entrypoint: str, input_data: str):
|
15
|
+
def __init__(self, entrypoint: str, input_data: Dict[str, Any]):
|
14
16
|
self.id = str(uuid4())[:8]
|
15
17
|
self.entrypoint = entrypoint
|
16
18
|
self.input_data = input_data
|
17
|
-
self.
|
19
|
+
self.resume_data: Optional[Dict[str, Any]] = None
|
20
|
+
self.output_data: Optional[Dict[str, Any]] = None
|
18
21
|
self.start_time = datetime.now()
|
19
22
|
self.end_time: Optional[datetime] = None
|
20
23
|
self.status = "running" # running, completed, failed
|
@@ -32,14 +35,32 @@ class ExecutionRun:
|
|
32
35
|
return f"{delta.total_seconds():.1f}s"
|
33
36
|
|
34
37
|
@property
|
35
|
-
def display_name(self) ->
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
def display_name(self) -> Text:
|
39
|
+
status_colors = {
|
40
|
+
"running": "yellow",
|
41
|
+
"suspended": "cyan",
|
42
|
+
"completed": "green",
|
43
|
+
"failed": "red",
|
44
|
+
}
|
45
|
+
|
46
|
+
status_icon = {
|
47
|
+
"running": "▶",
|
48
|
+
"suspended": "⏸",
|
49
|
+
"completed": "✔",
|
50
|
+
"failed": "✖",
|
51
|
+
}.get(self.status, "?")
|
39
52
|
|
40
53
|
script_name = (
|
41
54
|
os.path.basename(self.entrypoint) if self.entrypoint else "untitled"
|
42
55
|
)
|
56
|
+
truncated_script = script_name[:10]
|
43
57
|
time_str = self.start_time.strftime("%H:%M:%S")
|
58
|
+
duration_str = self.duration[:6]
|
59
|
+
|
60
|
+
text = Text()
|
61
|
+
text.append(f"{status_icon:<2} ", style=status_colors.get(self.status, "white"))
|
62
|
+
text.append(f"{truncated_script:<10} ")
|
63
|
+
text.append(f"({time_str:<8}) ")
|
64
|
+
text.append(f"[{duration_str:<6}]")
|
44
65
|
|
45
|
-
return
|
66
|
+
return text
|