uipath 2.1.92__tar.gz → 2.1.94__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of uipath might be problematic. Click here for more details.

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