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.
Files changed (255) hide show
  1. {uipath-2.1.31 → uipath-2.1.33}/PKG-INFO +1 -1
  2. {uipath-2.1.31 → uipath-2.1.33}/pyproject.toml +1 -1
  3. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/__init__.py +42 -9
  4. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_components/_details.py +83 -57
  5. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_components/_history.py +18 -6
  6. uipath-2.1.33/src/uipath/_cli/_dev/_terminal/_components/_json_input.py +23 -0
  7. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_components/_new.py +28 -27
  8. uipath-2.1.33/src/uipath/_cli/_dev/_terminal/_components/_resume.py +35 -0
  9. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_models/_execution.py +29 -8
  10. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_styles/terminal.tcss +10 -147
  11. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_runtime.py +1 -1
  12. {uipath-2.1.31 → uipath-2.1.33}/uv.lock +1 -1
  13. {uipath-2.1.31 → uipath-2.1.33}/.cursorrules +0 -0
  14. {uipath-2.1.31 → uipath-2.1.33}/.editorconfig +0 -0
  15. {uipath-2.1.31 → uipath-2.1.33}/.gitattributes +0 -0
  16. {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/cd.yml +0 -0
  17. {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/ci.yml +0 -0
  18. {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/commitlint.yml +0 -0
  19. {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/lint.yml +0 -0
  20. {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/publish-dev.yml +0 -0
  21. {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/publish-docs.yml +0 -0
  22. {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/slack.yml +0 -0
  23. {uipath-2.1.31 → uipath-2.1.33}/.github/workflows/test.yml +0 -0
  24. {uipath-2.1.31 → uipath-2.1.33}/.gitignore +0 -0
  25. {uipath-2.1.31 → uipath-2.1.33}/.pre-commit-config.yaml +0 -0
  26. {uipath-2.1.31 → uipath-2.1.33}/.python-version +0 -0
  27. {uipath-2.1.31 → uipath-2.1.33}/.vscode/extensions.json +0 -0
  28. {uipath-2.1.31 → uipath-2.1.33}/.vscode/launch.json +0 -0
  29. {uipath-2.1.31 → uipath-2.1.33}/.vscode/settings.json +0 -0
  30. {uipath-2.1.31 → uipath-2.1.33}/CONTRIBUTING.md +0 -0
  31. {uipath-2.1.31 → uipath-2.1.33}/LICENSE +0 -0
  32. {uipath-2.1.31 → uipath-2.1.33}/README.md +0 -0
  33. {uipath-2.1.31 → uipath-2.1.33}/docs/CONTRIBUTING.md +0 -0
  34. {uipath-2.1.31 → uipath-2.1.33}/docs/FAQ.md +0 -0
  35. {uipath-2.1.31 → uipath-2.1.33}/docs/assets/env-preparation-failed-dark.png +0 -0
  36. {uipath-2.1.31 → uipath-2.1.33}/docs/assets/env-preparation-failed-light.png +0 -0
  37. {uipath-2.1.31 → uipath-2.1.33}/docs/assets/favicon.png +0 -0
  38. {uipath-2.1.31 → uipath-2.1.33}/docs/assets/logo-dark.svg +0 -0
  39. {uipath-2.1.31 → uipath-2.1.33}/docs/assets/logo-light.svg +0 -0
  40. {uipath-2.1.31 → uipath-2.1.33}/docs/cli/index.md +0 -0
  41. {uipath-2.1.31 → uipath-2.1.33}/docs/core/actions.md +0 -0
  42. {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/cloud_env_var_dark.gif +0 -0
  43. {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/cloud_env_var_light.gif +0 -0
  44. {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/cloud_env_var_secret_dark.png +0 -0
  45. {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/cloud_env_var_secret_light.png +0 -0
  46. {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/copy_path_dark.png +0 -0
  47. {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets/copy_path_light.png +0 -0
  48. {uipath-2.1.31 → uipath-2.1.33}/docs/core/assets.md +0 -0
  49. {uipath-2.1.31 → uipath-2.1.33}/docs/core/attachments.md +0 -0
  50. {uipath-2.1.31 → uipath-2.1.33}/docs/core/buckets.md +0 -0
  51. {uipath-2.1.31 → uipath-2.1.33}/docs/core/connections.md +0 -0
  52. {uipath-2.1.31 → uipath-2.1.33}/docs/core/context_grounding.md +0 -0
  53. {uipath-2.1.31 → uipath-2.1.33}/docs/core/environment_variables.md +0 -0
  54. {uipath-2.1.31 → uipath-2.1.33}/docs/core/getting_started.md +0 -0
  55. {uipath-2.1.31 → uipath-2.1.33}/docs/core/jobs.md +0 -0
  56. {uipath-2.1.31 → uipath-2.1.33}/docs/core/llm_gateway.md +0 -0
  57. {uipath-2.1.31 → uipath-2.1.33}/docs/core/processes.md +0 -0
  58. {uipath-2.1.31 → uipath-2.1.33}/docs/core/queues.md +0 -0
  59. {uipath-2.1.31 → uipath-2.1.33}/docs/core/traced.md +0 -0
  60. {uipath-2.1.31 → uipath-2.1.33}/docs/hooks.py +0 -0
  61. {uipath-2.1.31 → uipath-2.1.33}/docs/index.md +0 -0
  62. {uipath-2.1.31 → uipath-2.1.33}/docs/javascripts/extra.js +0 -0
  63. {uipath-2.1.31 → uipath-2.1.33}/docs/overrides/main.html +0 -0
  64. {uipath-2.1.31 → uipath-2.1.33}/docs/overrides/partials/actions.html +0 -0
  65. {uipath-2.1.31 → uipath-2.1.33}/docs/overrides/partials/logo.html +0 -0
  66. {uipath-2.1.31 → uipath-2.1.33}/docs/release_policy.md +0 -0
  67. {uipath-2.1.31 → uipath-2.1.33}/docs/sample_images/google-ADK-agent/agent-output.png +0 -0
  68. {uipath-2.1.31 → uipath-2.1.33}/docs/stylesheets/extra.css +0 -0
  69. {uipath-2.1.31 → uipath-2.1.33}/justfile +0 -0
  70. {uipath-2.1.31 → uipath-2.1.33}/mkdocs.yml +0 -0
  71. {uipath-2.1.31 → uipath-2.1.33}/py.typed +0 -0
  72. {uipath-2.1.31 → uipath-2.1.33}/samples/event-trigger/.python-version +0 -0
  73. {uipath-2.1.31 → uipath-2.1.33}/samples/event-trigger/README.md +0 -0
  74. {uipath-2.1.31 → uipath-2.1.33}/samples/event-trigger/main.py +0 -0
  75. {uipath-2.1.31 → uipath-2.1.33}/samples/event-trigger/pyproject.toml +0 -0
  76. {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/.env.example +0 -0
  77. {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/README.md +0 -0
  78. {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/input.json +0 -0
  79. {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/multi_tool_agent/__init__.py +0 -0
  80. {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/multi_tool_agent/agent.py +0 -0
  81. {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/pyproject.toml +0 -0
  82. {uipath-2.1.31 → uipath-2.1.33}/samples/google-ADK-agent/uv.lock +0 -0
  83. {uipath-2.1.31 → uipath-2.1.33}/scripts/debug_test.py +0 -0
  84. {uipath-2.1.31 → uipath-2.1.33}/scripts/lint_httpx_client.py +0 -0
  85. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/__init__.py +0 -0
  86. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/README.md +0 -0
  87. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/__init__.py +0 -0
  88. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_auth_server.py +0 -0
  89. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_client_credentials.py +0 -0
  90. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_models.py +0 -0
  91. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_oidc_utils.py +0 -0
  92. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_portal_service.py +0 -0
  93. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_url_utils.py +0 -0
  94. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/_utils.py +0 -0
  95. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/auth_config.json +0 -0
  96. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/index.html +0 -0
  97. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/localhost.crt +0 -0
  98. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_auth/localhost.key +0 -0
  99. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_models/_messages.py +0 -0
  100. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_traces/_exporter.py +0 -0
  101. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_dev/_terminal/_traces/_logger.py +0 -0
  102. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/__init__.py +0 -0
  103. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_deterministic_evaluator_base.py +0 -0
  104. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_evaluator_base.py +0 -0
  105. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_evaluator_factory.py +0 -0
  106. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_exact_match_evaluator.py +0 -0
  107. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_json_similarity_evaluator.py +0 -0
  108. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_llm_as_judge_evaluator.py +0 -0
  109. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_evaluators/_trajectory_evaluator.py +0 -0
  110. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_models/__init__.py +0 -0
  111. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_models/_evaluation_set.py +0 -0
  112. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/_models/_evaluators.py +0 -0
  113. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/evaluation_service.py +0 -0
  114. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_evals/progress_reporter.py +0 -0
  115. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_push/sw_file_handler.py +0 -0
  116. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_contracts.py +0 -0
  117. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_escalation.py +0 -0
  118. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_hitl.py +0 -0
  119. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_runtime/_logging.py +0 -0
  120. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/.psmdcp.template +0 -0
  121. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/.rels.template +0 -0
  122. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/[Content_Types].xml.template +0 -0
  123. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/main.py.template +0 -0
  124. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_templates/package.nuspec.template +0 -0
  125. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_common.py +0 -0
  126. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_console.py +0 -0
  127. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_constants.py +0 -0
  128. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_debug.py +0 -0
  129. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_folders.py +0 -0
  130. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_input_args.py +0 -0
  131. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_parse_ast.py +0 -0
  132. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_processes.py +0 -0
  133. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_project_files.py +0 -0
  134. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_studio_project.py +0 -0
  135. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_tracing.py +0 -0
  136. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/_utils/_uv_helpers.py +0 -0
  137. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_auth.py +0 -0
  138. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_deploy.py +0 -0
  139. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_dev.py +0 -0
  140. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_eval.py +0 -0
  141. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_init.py +0 -0
  142. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_invoke.py +0 -0
  143. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_new.py +0 -0
  144. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_pack.py +0 -0
  145. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_publish.py +0 -0
  146. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_pull.py +0 -0
  147. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_push.py +0 -0
  148. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/cli_run.py +0 -0
  149. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/middlewares.py +0 -0
  150. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_cli/spinner.py +0 -0
  151. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_config.py +0 -0
  152. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_execution_context.py +0 -0
  153. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_folder_context.py +0 -0
  154. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/__init__.py +0 -0
  155. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/_base_service.py +0 -0
  156. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/actions_service.py +0 -0
  157. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/api_client.py +0 -0
  158. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/assets_service.py +0 -0
  159. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/attachments_service.py +0 -0
  160. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/buckets_service.py +0 -0
  161. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/connections_service.py +0 -0
  162. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/context_grounding_service.py +0 -0
  163. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/folder_service.py +0 -0
  164. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/jobs_service.py +0 -0
  165. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/llm_gateway_service.py +0 -0
  166. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/processes_service.py +0 -0
  167. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_services/queues_service.py +0 -0
  168. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_uipath.py +0 -0
  169. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/__init__.py +0 -0
  170. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_endpoint.py +0 -0
  171. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_infer_bindings.py +0 -0
  172. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_logs.py +0 -0
  173. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_read_overwrites.py +0 -0
  174. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_request_override.py +0 -0
  175. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_request_spec.py +0 -0
  176. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_ssl_context.py +0 -0
  177. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_url.py +0 -0
  178. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/_user_agent.py +0 -0
  179. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/_utils/constants.py +0 -0
  180. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/__init__.py +0 -0
  181. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/action_schema.py +0 -0
  182. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/actions.py +0 -0
  183. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/assets.py +0 -0
  184. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/attachment.py +0 -0
  185. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/buckets.py +0 -0
  186. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/connections.py +0 -0
  187. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/context_grounding.py +0 -0
  188. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/context_grounding_index.py +0 -0
  189. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/errors.py +0 -0
  190. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/exceptions.py +0 -0
  191. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/interrupt_models.py +0 -0
  192. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/job.py +0 -0
  193. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/llm_gateway.py +0 -0
  194. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/processes.py +0 -0
  195. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/models/queues.py +0 -0
  196. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/py.typed +0 -0
  197. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/telemetry/__init__.py +0 -0
  198. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/telemetry/_constants.py +0 -0
  199. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/telemetry/_track.py +0 -0
  200. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/tracing/__init__.py +0 -0
  201. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/tracing/_otel_exporters.py +0 -0
  202. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/tracing/_traced.py +0 -0
  203. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/tracing/_utils.py +0 -0
  204. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/utils/__init__.py +0 -0
  205. {uipath-2.1.31 → uipath-2.1.33}/src/uipath/utils/_endpoints_manager.py +0 -0
  206. {uipath-2.1.31 → uipath-2.1.33}/tests/__init__.py +0 -0
  207. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/conftest.py +0 -0
  208. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/evaluators/test_json_similarity_evaluator.py +0 -0
  209. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/bindings_script.py +0 -0
  210. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/pyproject.toml +0 -0
  211. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/simple_script.py +0 -0
  212. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/uipath-mock.json +0 -0
  213. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/mocks/uipath-simple-script-mock.json +0 -0
  214. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_auth.py +0 -0
  215. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_hitl.py +0 -0
  216. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_init.py +0 -0
  217. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_input_args.py +0 -0
  218. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_invoke.py +0 -0
  219. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_new.py +0 -0
  220. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_pack.py +0 -0
  221. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_portal_service_ensure_valid_token.py +0 -0
  222. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_portal_service_refresh_token.py +0 -0
  223. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_publish.py +0 -0
  224. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_pull.py +0 -0
  225. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_push.py +0 -0
  226. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_run.py +0 -0
  227. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/test_utils.py +0 -0
  228. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/utils/common.py +0 -0
  229. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/utils/project_details.py +0 -0
  230. {uipath-2.1.31 → uipath-2.1.33}/tests/cli/utils/uipath_json.py +0 -0
  231. {uipath-2.1.31 → uipath-2.1.33}/tests/conftest.py +0 -0
  232. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/conftest.py +0 -0
  233. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_actions_service.py +0 -0
  234. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_api_client.py +0 -0
  235. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_assets_service.py +0 -0
  236. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_attachments_service.py +0 -0
  237. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_base_service.py +0 -0
  238. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_buckets_service.py +0 -0
  239. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_connections_service.py +0 -0
  240. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_context_grounding_service.py +0 -0
  241. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_folder_service.py +0 -0
  242. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_jobs_service.py +0 -0
  243. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_llm_integration.py +0 -0
  244. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_llm_schema_cleanup.py +0 -0
  245. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_llm_service.py +0 -0
  246. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_processes_service.py +0 -0
  247. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_queues_service.py +0 -0
  248. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/services/test_uipath_llm_integration.py +0 -0
  249. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/test_bindings_inference.py +0 -0
  250. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/test_config.py +0 -0
  251. {uipath-2.1.31 → uipath-2.1.33}/tests/sdk/test_overwrites.py +0 -0
  252. {uipath-2.1.31 → uipath-2.1.33}/tests/tracing/test_otel_exporters.py +0 -0
  253. {uipath-2.1.31 → uipath-2.1.33}/tests/tracing/test_span_utils.py +0 -0
  254. {uipath-2.1.31 → uipath-2.1.33}/tests/tracing/test_traced.py +0 -0
  255. {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.31
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.31"
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 Run"),
38
- Binding("r", "execute_run", "Execute"),
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, input_data)
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
- self._add_info_log(run, f"Starting execution: {run.entrypoint}")
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
- run.output_data = json.dumps(result.output)
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
- # Input section
195
- if hasattr(run, "input_data") and run.input_data is not None:
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
- run_details_log.write(json.dumps(run.input_data, indent=2))
206
- else:
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
- run_details_log.write("")
210
-
211
- # Output section
212
- if hasattr(run, "output_data") and run.output_data is not None:
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 Button, ListItem, ListView, Static
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 Vertical():
20
- yield ListView(id="run-list", classes="run-list")
21
- yield Button(
22
- "+ New Run", id="new-run-btn", variant="primary", classes="new-run-btn"
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 Vertical():
67
- options = [(path, path) for path in self.entrypoint_paths]
68
- yield Select(
69
- options,
70
- id="entrypoint-select",
71
- value=self.selected_entrypoint,
72
- allow_blank=False,
73
- )
74
-
75
- yield TextArea(
76
- text=self.initial_input,
77
- language="json",
78
- id="json-input",
79
- classes="input-field json-input",
80
- )
81
-
82
- with Horizontal(classes="run-actions"):
83
- yield Button(
84
- "▶ Run", id="execute-btn", variant="primary", classes="action-btn"
85
- )
86
- yield Button(
87
- "Cancel",
88
- id="cancel-btn",
89
- variant="default",
90
- classes="action-btn cancel-btn",
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.output_data: Optional[str] = None
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) -> str:
36
- status_icon = {"running": "⚙️", "completed": "✅", "failed": "❌"}.get(
37
- self.status, ""
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 f"{status_icon} {script_name} ({time_str}) [{self.duration}]"
66
+ return text