Skip to content

feat(cli): serve the pre-warmed runtime over uipath-ipc alongside HTTP [ROBO-5779]#1809

Open
eduard-dumitru wants to merge 5 commits into
mainfrom
feat/ROBO-5779-server-ipc-transport
Open

feat(cli): serve the pre-warmed runtime over uipath-ipc alongside HTTP [ROBO-5779]#1809
eduard-dumitru wants to merge 5 commits into
mainfrom
feat/ROBO-5779-server-ipc-transport

Conversation

@eduard-dumitru

@eduard-dumitru eduard-dumitru commented Jul 13, 2026

Copy link
Copy Markdown

Adds a uipath-ipc named-pipe transport to uipath server, served alongside the existing HTTP-over-socket path (ROBO-5779).

What

  • uipath server serves both channels concurrently: HTTP (aiohttp over a Unix socket, or TCP on Windows) and — when --server-socket is given — a uipath-ipc named pipe. HTTP is never torn down; the IPC pipe name is the socket's basename, so the executor spawns the server the same way regardless of channel.
  • IPC hosts IPythonRuntimeServer (StartJob / StopJob) via NamedPipeServerTransport; both edges run jobs through one env/cwd-isolated core (_run_command_isolated).
  • Contract DTOs are typed dataclasses (PythonRunRequest / PythonRunResult) mirroring the .NET side. StopJob returns a bool so CoreIPC treats it as request/response, not fire-and-forget — cancellation itself is a no-op for now (Phase 1).
  • Adds uipath-ipc>=2.5.1 (internal Azure Artifacts feed for now — see the pyproject note; a public-PyPI uipath-ipc release is a prerequisite for a public pip install uipath).
  • Tests: test_server_ipc.py (IPC server) and test_server_transport.py (channel composition / _run_server arg resolution / CLI wiring).

Notes

  • Which transport a given job uses is decided on the .NET Handler side (the PythonRuntimePreferIpc FPS feature flag, Low-Code only) — separate PR in UiPath/hdens.
  • Rebased onto current main; pending green CI (cross-tests + Sonar) before ready.

🤖 Generated with Claude Code

@github-actions github-actions Bot added test:uipath-langchain Triggers tests in the uipath-langchain-python repository test:uipath-runtime test:uipath-integrations labels Jul 13, 2026
@eduard-dumitru
eduard-dumitru force-pushed the feat/ROBO-5779-server-ipc-transport branch from 72b8383 to 952d047 Compare July 21, 2026 11:08
@eduard-dumitru eduard-dumitru changed the title feat(cli): add opt-in uipath-ipc transport to uipath server [ROBO-5779] feat(cli): serve the pre-warmed runtime over uipath-ipc alongside HTTP [ROBO-5779] Jul 21, 2026
@eduard-dumitru
eduard-dumitru force-pushed the feat/ROBO-5779-server-ipc-transport branch 2 times, most recently from 832a0f2 to a641162 Compare July 22, 2026 10:27
eduard-dumitru and others added 4 commits July 23, 2026 10:27
…P [ROBO-5779]

`uipath server` serves an HTTP channel and, when --server-socket is given, a
uipath-ipc named-pipe channel concurrently — both behind one env/cwd-isolated job
core. Adds the IPythonRuntimeServer contract (StartJob/StopJob) with typed
PythonRunRequest/PythonRunResult dataclasses mirroring the .NET side, plus tests.
Adds uipath-ipc as a dependency.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…OBO-5779]

Move the wire-dictated PascalCase surface (PythonRunRequest/PythonRunResult,
IPythonRuntimeServer, PythonRuntimeService, start_ipc_server) out of cli_server
into cli_server_ipc, re-exported for backward compatibility. Scopes the Sonar
S100/S116 suppression to that single file so the rest of the tree stays strict.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Cover the missing/empty-Command rejection and the StopJob bool ack over the
uipath-ipc channel, taking cli_server_ipc to full new-code coverage.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Sonar: use resourceKey (not resourcePath) for the multicriteria issue ignore.
- version: bump uipath 2.13.13 -> 2.13.14 (2.13.13 already on PyPI).
- mypy: parametrize dict annotations in the server tests; ignore [type-abstract]
  on get_proxy(IPythonRuntimeServer) (proxying an interface is intended).
- ruff: wrap over-long lines to the 88-col format.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@eduard-dumitru
eduard-dumitru force-pushed the feat/ROBO-5779-server-ipc-transport branch from c3a6d7d to 7e8f4fb Compare July 23, 2026 08:49
@eduard-dumitru
eduard-dumitru marked this pull request as ready for review July 23, 2026 08:58
Copilot AI review requested due to automatic review settings July 23, 2026 08:58
@github-actions

Copy link
Copy Markdown

🚨 Heads up: uipath-langchain cross-tests are FAILING 🚨

Your changes may break the uipath-langchain-python integration.

⚠️ These checks are NOT enforced by branch protection rules. Please review the failures before merging.

🔍 Inspect the failed run →

Add direct unit tests for _run_command_isolated's error paths (uninitialized
state, bad working directory, SystemExit exit-code mapping, unexpected
exception), lifting new-code coverage over the SonarCloud 90% gate.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@eduard-dumitru
eduard-dumitru force-pushed the feat/ROBO-5779-server-ipc-transport branch from 7e8f4fb to f8eff08 Compare July 23, 2026 09:00

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a uipath-ipc named-pipe transport to uipath server, served concurrently with the existing HTTP transport, and refactors shared job execution into a single core path used by both transports.

Changes:

  • Introduces an IPC contract/service (IPythonRuntimeServer, DTOs, start_ipc_server) and runs it alongside the HTTP server when --server-socket is provided.
  • Extracts shared job execution into _run_command_isolated and routes HTTP /start through it.
  • Adds unit/integration tests covering transport composition, IPC behavior, and job-core error branches; updates packaging/sonar config for the new IPC module.

Reviewed changes

Copilot reviewed 7 out of 8 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
sonar-project.properties Suppresses Sonar naming rules for PascalCase IPC contract/DTOs in cli_server_ipc.py only.
packages/uipath/uv.lock Bumps uipath version and locks uipath-ipc dependency from internal feed.
packages/uipath/tests/cli/test_server_transport.py Verifies _serve composes HTTP+IPC correctly and CLI wires args through.
packages/uipath/tests/cli/test_server_job_core.py Unit tests for _run_command_isolated error/edge branches.
packages/uipath/tests/cli/test_server_ipc.py IPC server tests (StartJob/StopJob + env isolation).
packages/uipath/src/uipath/_cli/cli_server.py Adds IPC integration, shared job core, and updates HTTP handler to use it.
packages/uipath/src/uipath/_cli/cli_server_ipc.py New IPC contract/DTOs/service and server bootstrap.
packages/uipath/pyproject.toml Adds uipath-ipc to project dependencies and configures uv index pinning.
Comments suppressed due to low confidence (1)

packages/uipath/src/uipath/_cli/cli_server.py:292

  • When _run_command_isolated reports a request-shaped failure (e.g., invalid working directory), the HTTP response should keep a 4xx status instead of always defaulting to 200 for any nonzero ExitCode.
    return web.json_response(
        {"success": False, "job_key": job_key, "error": result["Error"]}
    )

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +163 to +168
return {
"ExitCode": 1,
"Error": f"Cannot change to working directory: {e}",
"Result": None,
"Unexpected": False,
}

JobKey: str = ""
Command: str = ""
Args: str | None = None
"uipath-core>=0.5.30, <0.6.0",
"uipath-runtime>=0.12.2, <0.13.0",
"uipath-platform>=0.2.4, <0.3.0",
"uipath-ipc>=2.5.1",
Comment on lines +57 to +59
thread = threading.Thread(target=run_server, daemon=True)
thread.start()
time.sleep(0.5)
@sonarqubecloud

Copy link
Copy Markdown

@radu-mocanu radu-mocanu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocking: public install is broken

Please remove uipath-ipc from the required uipath dependencies, or publish it to public PyPI before merging. The PR note says the package currently resolves only from the internal Azure feed. That uv configuration is not included in the published wheel, so public pip install uipath cannot resolve this required dependency.

Also bound the runtime dependency’s minor version when it is released publicly, for example uipath-ipc>=2.5.1,<2.6.0, to protect consumers from incompatible minor releases.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

test:uipath-integrations test:uipath-langchain Triggers tests in the uipath-langchain-python repository test:uipath-runtime

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants