uipath 2.1.93__tar.gz → 2.1.95__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.

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