From 20b83bad73c522f28e4a8b2392ac185ec2ab5918 Mon Sep 17 00:00:00 2001 From: openhands Date: Sat, 12 Sep 2026 00:16:12 +0000 Subject: [PATCH 01/24] feat: add conversation-scoped runtime APIs and clients Includes canonical local routes, injectable runtime dispatch, query-route deprecation registration (1.48 to 1.53), deadline enforcement and stack-base CI coverage. openhands+astra requested by @neubig; created by an AI agent (OpenHands) on behalf of @neubig. Co-authored-by: openhands --- .github/scripts/check_deprecations.py | 25 ++ .../agent-server-rest-api-breakage.yml | 2 +- .github/workflows/api-breakage.yml | 2 +- .../workflows/persisted-settings-compat.yml | 2 +- .github/workflows/review-thread-gate.yml | 2 +- .github/workflows/server.yml | 2 +- .github/workflows/typescript-client-ci.yml | 2 +- .../typescript-client-integration-tests.yml | 2 +- .github/workflows/version-bump-guard.yml | 2 +- .../src/__tests__/conversation-scope.test.ts | 71 ++++++ clients/typescript/src/client/bash-client.ts | 2 + .../typescript/src/client/desktop-client.ts | 2 + clients/typescript/src/client/file-client.ts | 2 + clients/typescript/src/client/http-client.ts | 29 +++ clients/typescript/src/client/mcp-client.ts | 2 + .../typescript/src/client/server-client.ts | 1 + .../typescript/src/client/vscode-client.ts | 2 + .../typescript/src/models/agent-server-api.ts | 6 +- clients/typescript/src/models/api.ts | 4 + clients/typescript/src/types/base.ts | 3 + .../src/workspace/remote-workspace.ts | 3 + .../openhands/agent_server/api.py | 5 +- .../openhands/agent_server/bash_router.py | 13 ++ .../openhands/agent_server/bash_service.py | 20 +- .../openhands/agent_server/dependencies.py | 8 + .../openhands/agent_server/event_service.py | 4 + .../openhands/agent_server/file_router.py | 5 +- .../openhands/agent_server/mcp_router.py | 18 +- .../openhands/agent_server/runtime_router.py | 179 ++++++++++++++ .../agent_server/server_details_router.py | 4 + tests/agent_server/test_runtime_router.py | 221 ++++++++++++++++++ .../test_server_details_router.py | 8 +- tests/cross/test_check_deprecations.py | 28 +++ 33 files changed, 662 insertions(+), 19 deletions(-) create mode 100644 clients/typescript/src/__tests__/conversation-scope.test.ts create mode 100644 openhands-agent-server/openhands/agent_server/runtime_router.py create mode 100644 tests/agent_server/test_runtime_router.py diff --git a/.github/scripts/check_deprecations.py b/.github/scripts/check_deprecations.py index f3f362c305..79a3e2cbcc 100644 --- a/.github/scripts/check_deprecations.py +++ b/.github/scripts/check_deprecations.py @@ -299,6 +299,31 @@ def _gather_rest_route_deprecations( tree: ast.AST, path: Path, *, package: str ) -> Iterator[DeprecationRecord]: for node in ast.walk(tree): + if ( + isinstance(node, ast.Call) + and isinstance(node.func, ast.Attribute) + and node.func.attr == "add_api_route" + and isinstance( + deprecated_flag := _extract_kw(node, "deprecated"), ast.Constant + ) + and deprecated_flag.value is True + ): + identifier = ast.unparse(node.args[0]) if node.args else "" + deprecated_in, removed_in = _parse_rest_route_deprecation_docstring( + _extract_string_literal(_extract_kw(node, "description")), + path=path, + line=node.lineno, + route_identifiers=[identifier], + ) + yield DeprecationRecord( + identifier=identifier, + removed_in=removed_in, + deprecated_in=deprecated_in, + path=path, + line=node.lineno, + kind="rest_route", + package=package, + ) if not isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef): continue diff --git a/.github/workflows/agent-server-rest-api-breakage.yml b/.github/workflows/agent-server-rest-api-breakage.yml index 7f7e80260c..2cbc42c6e5 100644 --- a/.github/workflows/agent-server-rest-api-breakage.yml +++ b/.github/workflows/agent-server-rest-api-breakage.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main] + branches: [main, feat/conversation-scoped-runtime-api] jobs: agent-server-rest-api: diff --git a/.github/workflows/api-breakage.yml b/.github/workflows/api-breakage.yml index 7fdbd8af52..91e289cfad 100644 --- a/.github/workflows/api-breakage.yml +++ b/.github/workflows/api-breakage.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main] + branches: [main, feat/conversation-scoped-runtime-api] jobs: sdk-api: diff --git a/.github/workflows/persisted-settings-compat.yml b/.github/workflows/persisted-settings-compat.yml index 7a45957a41..00ee9facae 100644 --- a/.github/workflows/persisted-settings-compat.yml +++ b/.github/workflows/persisted-settings-compat.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main] + branches: [main, feat/conversation-scoped-runtime-api] jobs: persisted-settings-compat: diff --git a/.github/workflows/review-thread-gate.yml b/.github/workflows/review-thread-gate.yml index 0a4e08c4fb..2dd43f3db7 100644 --- a/.github/workflows/review-thread-gate.yml +++ b/.github/workflows/review-thread-gate.yml @@ -3,7 +3,7 @@ name: Review Thread Gate on: pull_request: - branches: [main] + branches: [main, feat/conversation-scoped-runtime-api] types: [opened, synchronize, reopened, ready_for_review, edited] permissions: diff --git a/.github/workflows/server.yml b/.github/workflows/server.yml index 2991289ff3..8671efc61f 100644 --- a/.github/workflows/server.yml +++ b/.github/workflows/server.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main] + branches: [main, feat/conversation-scoped-runtime-api] workflow_dispatch: inputs: base_image: diff --git a/.github/workflows/typescript-client-ci.yml b/.github/workflows/typescript-client-ci.yml index 999dc03390..e934b219f5 100644 --- a/.github/workflows/typescript-client-ci.yml +++ b/.github/workflows/typescript-client-ci.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main] + branches: [main, feat/conversation-scoped-runtime-api] defaults: run: diff --git a/.github/workflows/typescript-client-integration-tests.yml b/.github/workflows/typescript-client-integration-tests.yml index 319d1faf1b..3977b73c04 100644 --- a/.github/workflows/typescript-client-integration-tests.yml +++ b/.github/workflows/typescript-client-integration-tests.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main] + branches: [main, feat/conversation-scoped-runtime-api] workflow_dispatch: inputs: llm_model: diff --git a/.github/workflows/version-bump-guard.yml b/.github/workflows/version-bump-guard.yml index bd1990fa35..da5adf991e 100644 --- a/.github/workflows/version-bump-guard.yml +++ b/.github/workflows/version-bump-guard.yml @@ -3,7 +3,7 @@ name: Version bump guard on: pull_request: - branches: [main] + branches: [main, feat/conversation-scoped-runtime-api] jobs: version-bump-guard: diff --git a/clients/typescript/src/__tests__/conversation-scope.test.ts b/clients/typescript/src/__tests__/conversation-scope.test.ts new file mode 100644 index 0000000000..5d82da7449 --- /dev/null +++ b/clients/typescript/src/__tests__/conversation-scope.test.ts @@ -0,0 +1,71 @@ +import { createServer, Server } from 'node:http'; +import { AddressInfo } from 'node:net'; +import { ServerClient } from '../client/server-client'; +import { HttpClient } from '../client/http-client'; +import { RemoteWorkspace } from '../workspace/remote-workspace'; + +describe('conversation-scoped requests', () => { + let server: Server; + let host: string; + const urls: string[] = []; + let scoped = false; + beforeAll(async () => { + server = createServer((req, res) => { + urls.push(req.url!); + if (req.url === '/server_info') { + res.setHeader('content-type', 'application/json'); + res.end(JSON.stringify({ capabilities: scoped ? ['conversation_runtime_routes_v1'] : [] })); + return; + } + res.setHeader('content-type', 'application/json'); + res.end(JSON.stringify({ exit_code: 0, stdout: 'ok', stderr: '' })); + }); + await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); + host = `http://127.0.0.1:${(server.address() as AddressInfo).port}`; + }); + afterAll(async () => { + server.closeAllConnections(); + await new Promise((resolve) => server.close(() => resolve())); + }); + it('advertises client-side runtime routing support', () => { + expect(ServerClient.supportsConversationRuntimeRoutes).toBe(true); + }); + it('scopes workspace commands to their conversation', async () => { + const workspace = new RemoteWorkspace({ + host, + workingDir: '/workspace', + conversationId: 'demo-cid', + }); + const result = await workspace.executeCommand('pwd'); + expect(result.stdout).toBe('ok'); + expect(urls.pop()).toBe('/api/bash/execute_bash_command?cid=demo-cid'); + }); + it('uses canonical routes and preserves explicit context on capable servers', async () => { + scoped = true; + try { + const client = new HttpClient({ baseUrl: host, conversationId: 'default' }); + await client.get('/api/file/download', { params: { cid: 'explicit', path: '/workspace/a' } }); + expect(urls.pop()).toBe('/api/conversations/explicit/file/download?path=%2Fworkspace%2Fa'); + await client.post('/api/bash/execute_bash_command', { command: 'pwd' }); + expect(urls.pop()).toBe('/api/conversations/default/bash/execute_bash_command'); + await client.get('/api/tools/'); + expect(urls.pop()).toBe('/api/tools/'); + await client.get('/api/file/home'); + expect(urls.pop()).toBe('/api/file/home'); + await client.post('/api/mcp/test', { server: {} }); + expect(urls.pop()).toBe('/api/conversations/default/mcp/test'); + await client.get('/api/mcp/oauth/status/job'); + expect(urls.pop()).toBe('/api/mcp/oauth/status/job'); + } finally { + scoped = false; + } + }); + it('preserves unscoped behavior and explicit query context', async () => { + await new HttpClient({ baseUrl: host }).get('/api/file/home'); + expect(urls.pop()).toBe('/api/file/home'); + await new HttpClient({ baseUrl: host, conversationId: 'default' }).get('/api/file/download', { + params: { cid: 'explicit' }, + }); + expect(urls.pop()).toBe('/api/file/download?cid=explicit'); + }); +}); diff --git a/clients/typescript/src/client/bash-client.ts b/clients/typescript/src/client/bash-client.ts index 51627f541a..a376730ab0 100644 --- a/clients/typescript/src/client/bash-client.ts +++ b/clients/typescript/src/client/bash-client.ts @@ -11,6 +11,7 @@ import { export interface BashClientOptions { host: string; + conversationId?: string; apiKey?: string; timeout?: number; } @@ -25,6 +26,7 @@ export class BashClient { this.apiKey = options.apiKey; this.client = new HttpClient({ baseUrl: this.host, + conversationId: options.conversationId, apiKey: this.apiKey, timeout: options.timeout || 60000, }); diff --git a/clients/typescript/src/client/desktop-client.ts b/clients/typescript/src/client/desktop-client.ts index 465db56e88..6ec5bbc264 100644 --- a/clients/typescript/src/client/desktop-client.ts +++ b/clients/typescript/src/client/desktop-client.ts @@ -3,6 +3,7 @@ import { DesktopUrlResponse } from '../models/api'; export interface DesktopClientOptions { host: string; + conversationId?: string; apiKey?: string; timeout?: number; } @@ -17,6 +18,7 @@ export class DesktopClient { this.apiKey = options.apiKey; this.client = new HttpClient({ baseUrl: this.host, + conversationId: options.conversationId, apiKey: this.apiKey, timeout: options.timeout || 60000, }); diff --git a/clients/typescript/src/client/file-client.ts b/clients/typescript/src/client/file-client.ts index 30d2767103..f62aaa0cdb 100644 --- a/clients/typescript/src/client/file-client.ts +++ b/clients/typescript/src/client/file-client.ts @@ -9,6 +9,7 @@ import type { Success } from '../types/base'; export interface FileClientOptions { host: string; + conversationId?: string; apiKey?: string; timeout?: number; } @@ -25,6 +26,7 @@ export class FileClient { this.apiKey = options.apiKey; this.client = new HttpClient({ baseUrl: this.host, + conversationId: options.conversationId, apiKey: this.apiKey, timeout: options.timeout || 60000, }); diff --git a/clients/typescript/src/client/http-client.ts b/clients/typescript/src/client/http-client.ts index ad31f6f4e7..adbe74da03 100644 --- a/clients/typescript/src/client/http-client.ts +++ b/clients/typescript/src/client/http-client.ts @@ -4,6 +4,7 @@ export interface HttpClientOptions { baseUrl: string; + conversationId?: string; apiKey?: string; timeout?: number; } @@ -48,16 +49,25 @@ export class HttpError extends Error { } export class HttpClient { + private conversationId?: string; private baseUrl: string; private apiKey?: string; private timeout: number; + private runtimeRoutes?: Promise; constructor(options: HttpClientOptions) { this.baseUrl = options.baseUrl.replace(/\/$/, ''); this.apiKey = options.apiKey; + this.conversationId = options.conversationId; this.timeout = options.timeout || 60000; } + private isRuntimePath(path: string): boolean { + if (path === '/api/mcp/test') return true; + if (path === '/api/file/home' || path === '/api/file/search_subdirs') return false; + return /^\/api\/(bash|file|git|desktop|vscode)(\/|$)/.test(path); + } + private buildUrl(path: string, params?: Record): URL { const relativePath = path.startsWith('/') ? path.slice(1) : path; const url = new URL(relativePath, this.baseUrl + '/'); @@ -74,10 +84,29 @@ export class HttpClient { }); } + if (this.conversationId && this.isRuntimePath(path) && !url.searchParams.has('cid')) { + url.searchParams.set('cid', this.conversationId); + } return url; } async request(options: RequestOptions): Promise> { + if (this.conversationId && this.isRuntimePath(options.url)) { + this.runtimeRoutes ??= this.get<{ capabilities?: string[] }>('/server_info') + .then(({ data }) => data.capabilities?.includes('conversation_runtime_routes_v1') ?? false) + .catch((error: unknown) => { + if (error instanceof HttpError && error.status === 404) return false; + this.runtimeRoutes = undefined; + throw error; + }); + if (await this.runtimeRoutes) { + options = { + ...options, + url: `/api/conversations/${encodeURIComponent(String(options.params?.cid ?? this.conversationId))}${options.url.slice(4)}`, + params: { ...options.params, cid: undefined }, + }; + } + } // `fetch` (and browsers) reject a body on a GET request, but a few // agent-server batch endpoints (e.g. `GET /api/bash/bash_events/` and // `GET /api/conversations/{id}/events`) are declared as GET-with-required-body. diff --git a/clients/typescript/src/client/mcp-client.ts b/clients/typescript/src/client/mcp-client.ts index 20cb781422..b23ad2b21a 100644 --- a/clients/typescript/src/client/mcp-client.ts +++ b/clients/typescript/src/client/mcp-client.ts @@ -20,6 +20,7 @@ import type { export interface MCPClientOptions { host: string; + conversationId?: string; apiKey?: string; timeout?: number; } @@ -34,6 +35,7 @@ export class MCPClient { this.apiKey = options.apiKey; this.client = new HttpClient({ baseUrl: this.host, + conversationId: options.conversationId, apiKey: this.apiKey, timeout: options.timeout || 60000, }); diff --git a/clients/typescript/src/client/server-client.ts b/clients/typescript/src/client/server-client.ts index 1fc8fdb01d..b0332b2eea 100644 --- a/clients/typescript/src/client/server-client.ts +++ b/clients/typescript/src/client/server-client.ts @@ -9,6 +9,7 @@ export interface ServerClientOptions { } export class ServerClient { + public static readonly supportsConversationRuntimeRoutes = true; public readonly host: string; public readonly apiKey?: string; private readonly client: HttpClient; diff --git a/clients/typescript/src/client/vscode-client.ts b/clients/typescript/src/client/vscode-client.ts index e36409bd73..e09984decb 100644 --- a/clients/typescript/src/client/vscode-client.ts +++ b/clients/typescript/src/client/vscode-client.ts @@ -3,6 +3,7 @@ import { VSCodeStatusResponse, VSCodeUrlResponse } from '../models/api'; export interface VSCodeClientOptions { host: string; + conversationId?: string; apiKey?: string; timeout?: number; } @@ -22,6 +23,7 @@ export class VSCodeClient { this.apiKey = options.apiKey; this.client = new HttpClient({ baseUrl: this.host, + conversationId: options.conversationId, apiKey: this.apiKey, timeout: options.timeout || 60000, }); diff --git a/clients/typescript/src/models/agent-server-api.ts b/clients/typescript/src/models/agent-server-api.ts index 549e83d9ae..bd66b22f84 100644 --- a/clients/typescript/src/models/agent-server-api.ts +++ b/clients/typescript/src/models/agent-server-api.ts @@ -29,7 +29,11 @@ export type AgentServerSettingsPatchRequest = UpdateSettingsApiSettingsPatchData export type AgentServerSettingsPatchResponse = UpdateSettingsApiSettingsPatchResponse; export type AgentServerMCPTestRequest = TestMcpServerApiMcpTestPostData['body']; -export type AgentServerMCPTestResponse = TestMcpServerApiMcpTestPostResponse; +export type AgentServerMCPTestResponse = TestMcpServerApiMcpTestPostResponse & { + /** Absent on older servers. Host success does not verify a conversation runtime. */ + scope?: 'host' | 'runtime'; + runtime_verified?: boolean; +}; export type AgentServerMCPToolCall = McpToolCallSpec; export type AgentServerMCPStartOAuthRequest = StartMcpOauthApiMcpOauthStartPostData['body']; export type AgentServerMCPStartOAuthResponse = StartMcpOauthApiMcpOauthStartPostResponse; diff --git a/clients/typescript/src/models/api.ts b/clients/typescript/src/models/api.ts index b0c44c6d11..eaa58e8039 100644 --- a/clients/typescript/src/models/api.ts +++ b/clients/typescript/src/models/api.ts @@ -592,6 +592,8 @@ export interface MCPToolCallResult { } export interface MCPTestSuccess { + scope?: 'host' | 'runtime'; + runtime_verified?: boolean; ok: true; tools: string[]; tool_result?: MCPToolCallResult | null; @@ -602,6 +604,8 @@ export interface MCPTestSuccess { export type MCPTestFailureKind = 'timeout' | 'connection' | 'unknown'; export interface MCPTestFailure { + scope?: 'host' | 'runtime'; + runtime_verified?: boolean; ok: false; error: string; error_kind: MCPTestFailureKind; diff --git a/clients/typescript/src/types/base.ts b/clients/typescript/src/types/base.ts index 55168c9a79..9589c1d64b 100644 --- a/clients/typescript/src/types/base.ts +++ b/clients/typescript/src/types/base.ts @@ -74,6 +74,9 @@ export interface ServerInfo { build_git_sha?: string; build_git_date?: string; build_semver?: string; + capabilities?: string[]; + conversation_runtime?: 'local' | 'docker'; + workspace_mode?: 'host' | 'isolated'; [key: string]: unknown; } diff --git a/clients/typescript/src/workspace/remote-workspace.ts b/clients/typescript/src/workspace/remote-workspace.ts index 8f7db7226d..c0bb5cce01 100644 --- a/clients/typescript/src/workspace/remote-workspace.ts +++ b/clients/typescript/src/workspace/remote-workspace.ts @@ -23,6 +23,7 @@ import { IWorkspace, BaseWorkspaceOptions, GitQueryOptions } from './base'; export interface RemoteWorkspaceOptions extends BaseWorkspaceOptions { /** The remote host URL for the workspace (e.g., 'http://localhost:8000') */ host: string; + conversationId?: string; /** API key for authenticating with the remote host (optional) */ apiKey?: string; } @@ -48,12 +49,14 @@ export class RemoteWorkspace implements IWorkspace { this.client = new HttpClient({ baseUrl: this.host, + conversationId: options.conversationId, apiKey: this.apiKey, timeout: 60000, }); this.bash = new BashClient({ host: this.host, + conversationId: options.conversationId, ...(this.apiKey ? { apiKey: this.apiKey } : {}), }); } diff --git a/openhands-agent-server/openhands/agent_server/api.py b/openhands-agent-server/openhands/agent_server/api.py index fe25417df5..6ef5d14886 100644 --- a/openhands-agent-server/openhands/agent_server/api.py +++ b/openhands-agent-server/openhands/agent_server/api.py @@ -40,7 +40,7 @@ ) from openhands.agent_server.desktop_router import desktop_router from openhands.agent_server.event_router import event_router -from openhands.agent_server.file_router import file_router +from openhands.agent_server.file_router import file_discovery_router, file_router from openhands.agent_server.git_router import git_router from openhands.agent_server.hooks_router import hooks_router from openhands.agent_server.init_router import ( @@ -60,6 +60,7 @@ from openhands.agent_server.provider_connections_router import ( provider_connections_router, ) +from openhands.agent_server.runtime_router import create_runtime_router from openhands.agent_server.server_details_router import ( get_server_info, mark_initialization_complete, @@ -411,6 +412,8 @@ def _add_api_routes(app: FastAPI) -> None: ] api_router = APIRouter(prefix="/api", dependencies=dependencies) + api_router.include_router(file_discovery_router) + api_router.include_router(create_runtime_router()) api_router.include_router(event_router) api_router.include_router(conversation_router) api_router.include_router(credential_binding_router) diff --git a/openhands-agent-server/openhands/agent_server/bash_router.py b/openhands-agent-server/openhands/agent_server/bash_router.py index b6188e6d16..494bdece39 100644 --- a/openhands-agent-server/openhands/agent_server/bash_router.py +++ b/openhands-agent-server/openhands/agent_server/bash_router.py @@ -2,6 +2,7 @@ import logging from datetime import datetime +from pathlib import Path from typing import Annotated, Literal, cast from uuid import UUID @@ -104,6 +105,7 @@ async def start_bash_command( ) -> BashCommand: """Execute a bash command in the background""" update_last_execution_time() + _validate_cwd(request, bash_event_service) command, _ = await bash_event_service.start_bash_command(request) return command @@ -115,6 +117,7 @@ async def execute_bash_command( ) -> BashOutput: """Execute a bash command and wait for a result""" update_last_execution_time() + _validate_cwd(request, bash_event_service) command, task = await bash_event_service.start_bash_command(request) await task page = await bash_event_service.search_bash_events(command_id__eq=command.id) @@ -129,3 +132,13 @@ async def clear_all_bash_events( """Clear all bash events from storage""" count = await bash_event_service.clear_all_events() return {"cleared_count": count} + + +def _validate_cwd(request: ExecuteBashRequest, service: BashEventService) -> None: + if service.default_cwd is not None and request.cwd is not None: + if ( + not Path(request.cwd) + .resolve() + .is_relative_to(Path(service.default_cwd).resolve()) + ): + raise HTTPException(422, "cwd must be inside the conversation workspace") diff --git a/openhands-agent-server/openhands/agent_server/bash_service.py b/openhands-agent-server/openhands/agent_server/bash_service.py index fd4c0fedbf..e15cac2439 100644 --- a/openhands-agent-server/openhands/agent_server/bash_service.py +++ b/openhands-agent-server/openhands/agent_server/bash_service.py @@ -31,6 +31,9 @@ class BashEventService: will not be visible to the agent.""" bash_events_dir: Path = field() + default_cwd: str | None = None + _tasks: set[asyncio.Task] = field(default_factory=set, init=False) + _closed: bool = field(default=False, init=False) _pub_sub: PubSub[BashEventBase] = field( default_factory=lambda: PubSub[BashEventBase](max_subscribers=50), init=False, @@ -255,13 +258,17 @@ async def start_bash_command( self, request: ExecuteBashRequest ) -> tuple[BashCommand, asyncio.Task]: """Execute a bash command. The output will be published separately.""" - command = BashCommand(**request.model_dump()) + if self._closed: + raise RuntimeError("Bash event service is closed") + cwd = request.cwd or self.default_cwd + command = BashCommand(**{**request.model_dump(), "cwd": cwd}) self._save_event_to_file(command) await self._pub_sub(command) # Execute the bash command in a background task task = asyncio.create_task(self._execute_bash_command(command)) - + self._tasks.add(task) + task.add_done_callback(self._tasks.discard) return command, task async def _execute_bash_command(self, command: BashCommand) -> None: @@ -347,6 +354,10 @@ async def read_stream(stream, is_stderr=False): timeout=command.timeout, ) exit_code = process.returncode + except asyncio.CancelledError: + self._signal_process_group(process, signal.SIGKILL) + await process.wait() + raise except TimeoutError: # Send SIGTERM to the whole process group so user-installed # cleanup traps can run, then escalate to SIGKILL if needed. @@ -509,6 +520,11 @@ async def clear_all_events(self) -> int: async def close(self): """Close the bash event service and clean up resources.""" + self._closed = True + tasks = list(self._tasks) + for task in tasks: + task.cancel() + await asyncio.gather(*tasks, return_exceptions=True) await self._pub_sub.close() async def __aenter__(self): diff --git a/openhands-agent-server/openhands/agent_server/dependencies.py b/openhands-agent-server/openhands/agent_server/dependencies.py index 710f95e62e..99a43bb4c4 100644 --- a/openhands-agent-server/openhands/agent_server/dependencies.py +++ b/openhands-agent-server/openhands/agent_server/dependencies.py @@ -71,6 +71,14 @@ def get_conversation_service(request: Request) -> ConversationService: def get_bash_event_service(request: Request) -> BashEventService: + if "runtime_conversation_id" in request.path_params: + event_service: EventService = request.state.runtime_event_service + if event_service.bash_event_service is None: + event_service.bash_event_service = BashEventService( + bash_events_dir=event_service.conversation_dir / "bash_events", + default_cwd=event_service.get_conversation().workspace.working_dir, + ) + return event_service.bash_event_service service = getattr(request.app.state, "bash_event_service", None) if service is None: raise HTTPException( diff --git a/openhands-agent-server/openhands/agent_server/event_service.py b/openhands-agent-server/openhands/agent_server/event_service.py index ab37658090..be659e215d 100644 --- a/openhands-agent-server/openhands/agent_server/event_service.py +++ b/openhands-agent-server/openhands/agent_server/event_service.py @@ -11,6 +11,7 @@ from pydantic import ValidationError +from openhands.agent_server.bash_service import BashEventService from openhands.agent_server.conversation_lease import ( DEFAULT_LEASE_TTL_SECONDS, ConversationLease, @@ -130,6 +131,7 @@ class EventService: credential_bindings: dict[str, VersionedCredentialBinding] = field( default_factory=dict ) + bash_event_service: BashEventService | None = field(default=None, init=False) owner_instance_id: str = field(default_factory=lambda: uuid4().hex) lease_ttl_seconds: float = DEFAULT_LEASE_TTL_SECONDS _conversation: LocalConversation | None = field(default=None, init=False) @@ -1771,6 +1773,8 @@ async def switch_acp_model(self, model: str) -> None: await loop.run_in_executor(None, self._conversation.switch_acp_model, model) async def close(self): + if self.bash_event_service is not None: + await self.bash_event_service.close() self._closing = True self._explicit_interrupt_generation += 1 self._rerun_requested = False diff --git a/openhands-agent-server/openhands/agent_server/file_router.py b/openhands-agent-server/openhands/agent_server/file_router.py index 8c3f63d47e..9a5461aaed 100644 --- a/openhands-agent-server/openhands/agent_server/file_router.py +++ b/openhands-agent-server/openhands/agent_server/file_router.py @@ -63,6 +63,7 @@ class HomeResponse(BaseModel): logger = get_logger(__name__) file_router = APIRouter(prefix="/file", tags=["Files"]) +file_discovery_router = APIRouter(prefix="/file", tags=["Files"]) async def _upload_file(path: str, file: UploadFile) -> Success: @@ -757,7 +758,7 @@ def _list_root_locations() -> list[FileBrowserEntry]: return [FileBrowserEntry(label="/", path="/")] -@file_router.get("/home") +@file_discovery_router.get("/home") async def get_home_directory( include_hidden: Annotated[ bool, @@ -780,7 +781,7 @@ async def get_home_directory( ) -@file_router.get("/search_subdirs") +@file_discovery_router.get("/search_subdirs") async def search_subdirs( path: Annotated[ str, diff --git a/openhands-agent-server/openhands/agent_server/mcp_router.py b/openhands-agent-server/openhands/agent_server/mcp_router.py index be518b2117..6e89207bb1 100644 --- a/openhands-agent-server/openhands/agent_server/mcp_router.py +++ b/openhands-agent-server/openhands/agent_server/mcp_router.py @@ -234,7 +234,15 @@ class MCPToolCallResult(BaseModel): text: str = Field(description="Concatenated text content of the result.") -class MCPTestSuccess(BaseModel): +class MCPProbeScope(BaseModel): + scope: Literal["host", "runtime"] = "host" + runtime_verified: bool = Field( + default=False, + description="True only when a conversation runtime probe succeeded.", + ) + + +class MCPTestSuccess(MCPProbeScope): """Response when the candidate server connects and lists its tools.""" ok: Literal[True] = True @@ -263,7 +271,7 @@ class MCPTestSuccess(BaseModel): ) -class MCPTestFailure(BaseModel): +class MCPTestFailure(MCPProbeScope): """Response when the candidate server fails to connect or list tools. The endpoint returns HTTP 200 in both success and failure cases: a @@ -657,7 +665,11 @@ async def test_mcp_server( # reach back into ``http_request.app.state``. cipher = get_cipher(http_request) loop = asyncio.get_running_loop() - return await loop.run_in_executor(None, _probe_mcp_server, request, cipher) + result = await loop.run_in_executor(None, _probe_mcp_server, request, cipher) + if "runtime_conversation_id" in http_request.path_params: + result.scope = "runtime" + result.runtime_verified = result.ok + return result def _run_oauth_probe_job(job: _MCPOAuthProbeJob) -> None: diff --git a/openhands-agent-server/openhands/agent_server/runtime_router.py b/openhands-agent-server/openhands/agent_server/runtime_router.py new file mode 100644 index 0000000000..e6934f765a --- /dev/null +++ b/openhands-agent-server/openhands/agent_server/runtime_router.py @@ -0,0 +1,179 @@ +"""Conversation-addressed APIs with workspace and terminal-history context. + +Local processes and desktop/VSCode services still share the host; these path +checks are routing safeguards, not a sandbox for arbitrary shell commands. +""" + +from collections.abc import Callable +from pathlib import Path +from typing import Any +from uuid import UUID + +from fastapi import APIRouter, Depends, HTTPException, Request +from fastapi.responses import FileResponse +from fastapi.routing import APIRoute + +from openhands.agent_server.bash_router import bash_router +from openhands.agent_server.dependencies import ( + get_conversation_service, + get_event_service, +) +from openhands.agent_server.desktop_router import desktop_router +from openhands.agent_server.file_router import file_router +from openhands.agent_server.git_router import git_router +from openhands.agent_server.mcp_router import MCPTestResponse, test_mcp_server +from openhands.agent_server.vscode_router import ( + VSCodeUrlResponse, + get_vscode_url, + vscode_router, +) + + +async def require_local_runtime( + runtime_conversation_id: UUID, request: Request +) -> None: + service = get_conversation_service(request) + event_service = await get_event_service(runtime_conversation_id, service) + request.state.runtime_event_service = event_service + root = Path(event_service.get_conversation().workspace.working_dir).resolve() + for name in ("path", "workspace_dir"): + path = request.path_params.get(name) or request.query_params.get(name) + if path is not None and ( + not Path(path).is_absolute() + or not Path(path).resolve().is_relative_to(root) + ): + raise HTTPException( + 422, f"{name} must be inside the conversation workspace" + ) + trajectory_id = request.path_params.get("conversation_id") + if trajectory_id is not None: + try: + matches = UUID(trajectory_id) == runtime_conversation_id + except ValueError as exc: + raise HTTPException(422, "Invalid trajectory conversation id") from exc + if not matches: + raise HTTPException( + 422, "Trajectory must belong to the selected conversation" + ) + + +class RuntimeRouter(APIRouter): + def add_api_route( + self, path: str, endpoint: Callable[..., Any], **kwargs: Any + ) -> None: + kwargs["route_class_override"] = self.route_class + if path in { + "/file/download", + "/file/archive", + "/file/download-trajectory/{conversation_id}", + }: + kwargs["response_class"] = FileResponse + kwargs["responses"] = { + **(kwargs.get("responses") or {}), + 200: { + "content": { + "application/octet-stream": { + "schema": {"type": "string", "format": "binary"} + } + } + }, + } + super().add_api_route(path, endpoint, **kwargs) + + +def create_runtime_router(route_class: type[APIRoute] = APIRoute) -> APIRouter: + router = RuntimeRouter( + prefix="/conversations/{runtime_conversation_id}", + route_class=route_class, + dependencies=[Depends(require_local_runtime)], + ) + for source in ( + bash_router, + file_router, + git_router, + desktop_router, + ): + for route in source.routes: + if isinstance(route, APIRoute): + router.add_api_route( + route.path, + route.endpoint, + methods=list(route.methods), + response_model=route.response_model, + status_code=route.status_code, + tags=route.tags, + dependencies=route.dependencies, + summary=route.summary, + description=route.description, + response_description=route.response_description, + responses=route.responses, + deprecated=route.deprecated, + response_model_include=route.response_model_include, + response_model_exclude=route.response_model_exclude, + response_model_by_alias=route.response_model_by_alias, + response_model_exclude_unset=route.response_model_exclude_unset, + response_model_exclude_defaults=route.response_model_exclude_defaults, + response_model_exclude_none=route.response_model_exclude_none, + response_class=route.response_class, + name=route.name, + callbacks=route.callbacks, + openapi_extra=route.openapi_extra, + ) + router.add_api_route("/vscode/url", get_runtime_vscode_url, methods=["GET"]) + for route in vscode_router.routes: + if isinstance(route, APIRoute) and route.path != "/vscode/url": + router.add_api_route( + route.path, route.endpoint, methods=list(route.methods) + ) + router.add_api_route( + "/mcp/test", + test_mcp_server, + methods=["POST"], + response_model=MCPTestResponse, + response_model_exclude_none=True, + ) + return router + + +async def get_runtime_vscode_url( + request: Request, + base_url: str | None = None, + workspace_dir: str | None = None, +) -> VSCodeUrlResponse: + event_service = request.state.runtime_event_service + return await get_vscode_url( + base_url, + workspace_dir or event_service.get_conversation().workspace.working_dir, + ) + + +def add_legacy_runtime_routes( + router: APIRouter, + prefix: str, + endpoint: Callable[..., Any], + bare_endpoint: Callable[..., Any], +) -> None: + """Register the deprecated query-scoped runtime compatibility contract.""" + methods = ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD"] + router.add_api_route( + f"/{prefix}/{{tail:path}}", + endpoint, + methods=methods, + deprecated=True, + description=( + "Deprecated since v1.48.0 and scheduled for removal in v1.53.0. " + "Use /api/conversations/{id}/{service}/... instead of ?cid={id} " + "routing. This deprecation applies only to Docker compatibility routes." + ), + ) + router.add_api_route( + f"/{prefix}", + bare_endpoint, + methods=methods, + deprecated=True, + description=( + "Deprecated since v1.48.0 and scheduled for removal in v1.53.0. " + "Use /api/conversations/{id}/{service}/... instead of ?cid={id} " + "routing. This deprecation applies only to Docker compatibility routes." + ), + ) diff --git a/openhands-agent-server/openhands/agent_server/server_details_router.py b/openhands-agent-server/openhands/agent_server/server_details_router.py index 3ee830ed2a..51031a5458 100644 --- a/openhands-agent-server/openhands/agent_server/server_details_router.py +++ b/openhands-agent-server/openhands/agent_server/server_details_router.py @@ -3,6 +3,7 @@ import sys import time from importlib.metadata import version +from typing import Literal from fastapi import APIRouter, Response from pydantic import BaseModel, Field @@ -58,8 +59,11 @@ class ServerInfo(BaseModel): runtime_idle_timeout_seconds: float | None = Field( default_factory=lambda: get_runtime_idle_timeout_seconds() ) + conversation_runtime: Literal["local", "docker"] = "local" + workspace_mode: Literal["host", "isolated"] = "host" capabilities: list[str] = Field( default_factory=lambda: [ + "conversation_runtime_routes_v1", "credential_binding_v1", "credential_binding_readiness_probe_v1", "credential_binding_activation_guard_v1", diff --git a/tests/agent_server/test_runtime_router.py b/tests/agent_server/test_runtime_router.py new file mode 100644 index 0000000000..8502af4691 --- /dev/null +++ b/tests/agent_server/test_runtime_router.py @@ -0,0 +1,221 @@ +import asyncio +import os +import sys +from uuid import UUID, uuid4 + +import httpx +import pytest +from fastapi import APIRouter, FastAPI +from fastapi.routing import APIRoute + +import openhands.agent_server.vscode_service as vscode_service_module +from openhands.agent_server.api import create_app +from openhands.agent_server.bash_service import BashEventService +from openhands.agent_server.config import Config +from openhands.agent_server.conversation_service import ConversationService +from openhands.agent_server.runtime_router import ( + add_legacy_runtime_routes, + create_runtime_router, +) +from openhands.agent_server.vscode_service import VSCodeService + + +@pytest.fixture +async def runtime_client(tmp_path): + config = Config( + conversations_path=tmp_path / "conversations", + session_api_keys=["runtime-route-test-key"], + ) + app = create_app(config) + async with ConversationService( + conversations_dir=config.conversations_path + ) as service: + app.state.conversation_service = service + app.state.bash_event_service = BashEventService(tmp_path / "global-bash") + async with httpx.AsyncClient( + transport=httpx.ASGITransport(app=app), + base_url="http://test", + headers={"X-Session-API-Key": "runtime-route-test-key"}, + ) as client: + yield client, app + + +async def _create(client, directory): + response = await client.post( + "/api/conversations", + json={ + "workspace": {"working_dir": str(directory)}, + "agent": { + "kind": "Agent", + "llm": {"model": "openai/test", "usage_id": "test"}, + }, + }, + ) + assert response.status_code == 201, response.text + return response.json()["id"] + + +@pytest.mark.asyncio +async def test_local_runtime_workspace_and_terminal_context(runtime_client, tmp_path): + client, _ = runtime_client + first_dir, second_dir = tmp_path / "first", tmp_path / "second" + first = await _create(client, first_dir) + second = await _create(client, second_dir) + prefix = f"/api/conversations/{first}" + other = f"/api/conversations/{second}" + result = await client.post( + prefix + "/bash/execute_bash_command", + json={"command": "pwd; printf first > marker"}, + ) + assert result.status_code == 200, result.text + assert str(first_dir) in result.json()["stdout"] + assert (first_dir / "marker").read_text() == "first" + assert not (second_dir / "marker").exists() + history = await client.get(other + "/bash/bash_events/search") + assert history.json()["items"] == [] + wrong_cwd = await client.post( + other + "/bash/execute_bash_command", + json={"command": "pwd", "cwd": str(first_dir)}, + ) + assert wrong_cwd.status_code == 422 + own_file = await client.get( + prefix + "/file/download", params={"path": str(first_dir / "marker")} + ) + assert own_file.text == "first" + wrong_file = await client.get( + other + "/file/download", params={"path": str(first_dir / "marker")} + ) + assert wrong_file.status_code == 422 + legacy = await client.get( + "/api/file/download", params={"path": str(first_dir / "marker")} + ) + assert legacy.text == "first" + missing = await client.get( + f"/api/conversations/{uuid4()}/git/changes", params={"path": str(first_dir)} + ) + assert missing.status_code == 404 + unauthorized = await client.get( + prefix + "/bash/bash_events/search", headers={"X-Session-API-Key": "wrong"} + ) + assert unauthorized.status_code == 401 + info = (await client.get("/server_info")).json() + assert info["workspace_mode"] == "host" + assert info["conversation_runtime"] == "local" + assert "conversation_runtime_routes_v1" in info["capabilities"] + + +def test_canonical_runtime_openapi_preserves_methods_and_schemas(): + schema = create_app(Config()).openapi() + paths = schema["paths"] + for resource, method, endpoint in [ + ("bash", "post", "execute_bash_command"), + ("file", "get", "download"), + ("git", "get", "changes"), + ("desktop", "get", "url"), + ("vscode", "get", "url"), + ("mcp", "post", "test"), + ]: + operation = paths[ + f"/api/conversations/{{runtime_conversation_id}}/{resource}/{endpoint}" + ][method] + assert any( + p["in"] == "path" and p["name"] == "runtime_conversation_id" + for p in operation["parameters"] + ) + assert operation["responses"]["200"] + assert not any("runtime_conversation_id}/mcp/oauth" in path for path in paths) + for endpoint in ("download", "archive", "download-trajectory/{conversation_id}"): + content = paths[ + f"/api/conversations/{{runtime_conversation_id}}/file/{endpoint}" + ]["get"]["responses"]["200"]["content"] + assert "application/json" not in content + assert content["application/octet-stream"]["schema"] == { + "type": "string", + "format": "binary", + } + + +@pytest.mark.asyncio +async def test_mcp_probe_scope_and_workspace_validation(runtime_client, tmp_path): + client, _ = runtime_client + root = tmp_path / "workspace" + cid = await _create(client, root) + script = root / "mcp_server.py" + script.write_text( + "from fastmcp import FastMCP\nm = FastMCP('test')\n@m.tool()\n" + "def echo(text: str) -> str: return text\nm.run()\n" + ) + payload = {"server": {"command": sys.executable, "args": [str(script)]}} + host = await client.post("/api/mcp/test", json=payload) + assert host.json()["ok"] is True, host.text + assert host.json()["scope"] == "host" + assert host.json()["runtime_verified"] is False + runtime = await client.post(f"/api/conversations/{cid}/mcp/test", json=payload) + assert runtime.json()["ok"] is True, runtime.text + assert runtime.json()["scope"] == "runtime" + assert runtime.json()["runtime_verified"] is True + relative = await client.get( + f"/api/conversations/{cid}/file/download", params={"path": "mcp_server.py"} + ) + assert relative.status_code == 422 + + +@pytest.mark.asyncio +async def test_conversation_close_stops_runtime_terminal(runtime_client, tmp_path): + client, app = runtime_client + root = tmp_path / "workspace" + cid = await _create(client, root) + response = await client.post( + f"/api/conversations/{cid}/bash/start_bash_command", + json={"command": "echo $$ > pid; sleep 60"}, + ) + assert response.status_code == 200 + async with asyncio.timeout(5): + while not (root / "pid").exists(): + await asyncio.sleep(0.01) + pid = int((root / "pid").read_text()) + service = await app.state.conversation_service.get_event_service(UUID(cid)) + await service.close() + with pytest.raises(ProcessLookupError): + os.kill(pid, 0) + + +@pytest.mark.asyncio +async def test_scoped_vscode_defaults_to_conversation_workspace( + runtime_client, tmp_path, monkeypatch +): + client, _ = runtime_client + root = tmp_path / "workspace" + cid = await _create(client, root) + service = VSCodeService(port=18765) + monkeypatch.setattr(vscode_service_module, "_vscode_service", service) + response = await client.get(f"/api/conversations/{cid}/vscode/url") + assert response.status_code == 200, response.text + assert response.json()["url"] == service.get_vscode_url(workspace_dir=str(root)) + + +def test_runtime_routes_are_registered_with_dispatch_adapter(): + class CustomRuntimeRoute(APIRoute): + pass + + router = create_runtime_router(CustomRuntimeRoute) + assert router.routes + assert all(isinstance(route, CustomRuntimeRoute) for route in router.routes) + + +def test_legacy_registration_exposes_deprecation_without_deprecating_local_routes(): + async def endpoint(): + return {"ok": True} + + legacy = APIRouter() + add_legacy_runtime_routes(legacy, "bash", endpoint, endpoint) + app = FastAPI() + app.include_router(legacy, prefix="/api") + for operations in app.openapi()["paths"].values(): + for operation in operations.values(): + assert operation["deprecated"] + assert "v1.53.0" in operation["description"] + paths = create_app(Config()).openapi()["paths"] + for path, operations in paths.items(): + if "/bash/" in path: + assert all(not op.get("deprecated", False) for op in operations.values()) diff --git a/tests/agent_server/test_server_details_router.py b/tests/agent_server/test_server_details_router.py index 7705748627..77a0ea31b7 100644 --- a/tests/agent_server/test_server_details_router.py +++ b/tests/agent_server/test_server_details_router.py @@ -76,11 +76,15 @@ def test_server_info_reports_credential_binding_probe(client): response = client.get("/server_info") assert response.status_code == 200 - assert response.json()["capabilities"] == [ + payload = response.json() + assert { "credential_binding_v1", "credential_binding_readiness_probe_v1", "credential_binding_activation_guard_v1", - ] + "conversation_runtime_routes_v1", + } <= set(payload["capabilities"]) + assert payload["conversation_runtime"] == "local" + assert payload["workspace_mode"] == "host" def test_server_info_reports_runtime_timeout_cap( diff --git a/tests/cross/test_check_deprecations.py b/tests/cross/test_check_deprecations.py index f4890a22ac..68f0453baf 100644 --- a/tests/cross/test_check_deprecations.py +++ b/tests/cross/test_check_deprecations.py @@ -10,6 +10,8 @@ import pytest +from openhands.agent_server import runtime_router as routers + def _load_prod_module(): repo_root = Path(__file__).resolve().parents[2] @@ -336,3 +338,29 @@ def test_runway_error_skips_cleanup_and_date_based_removals(): assert _runway_error(cleanup_record) is None assert _runway_error(date_record) is None + + +def test_programmatic_docker_routes_have_enforced_schedule(): + path = Path(routers.__file__) + records = list( + _gather_rest_route_deprecations( + ast.parse(path.read_text()), path, package="openhands-agent-server" + ) + ) + assert len(records) == 2 + for record in records: + assert record.deprecated_in == "1.48.0" + assert record.removed_in == "1.53.0" + assert _runway_error(record) is None + assert not _should_fail("1.52.0", record) + assert _should_fail("1.53.0", record) + + +def test_programmatic_deprecated_route_requires_schedule(tmp_path): + tree = ast.parse('router.add_api_route("/old", handler, deprecated=True)') + with pytest.raises(SystemExit, match="Deprecated since"): + list( + _gather_rest_route_deprecations( + tree, tmp_path / "router.py", package="openhands-agent-server" + ) + ) From f638e0e1165a797a7fb5d721496a1d80b33c71b9 Mon Sep 17 00:00:00 2001 From: openhands Date: Sat, 12 Sep 2026 00:16:27 +0000 Subject: [PATCH 02/24] fix(ci): recognize upstream approved LLM.modify_params removal Explicit prerequisite CI repair for upstream #4954; unrelated removals remain rejected. openhands+astra requested by @neubig; created by an AI agent (OpenHands) on behalf of @neubig. Co-authored-by: openhands --- .github/scripts/check_sdk_api_breakage.py | 25 ++++++++++------- tests/cross/test_check_sdk_api_breakage.py | 31 ++++++++++++++++++++++ 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/.github/scripts/check_sdk_api_breakage.py b/.github/scripts/check_sdk_api_breakage.py index 47a182a2db..1b3800813d 100755 --- a/.github/scripts/check_sdk_api_breakage.py +++ b/.github/scripts/check_sdk_api_breakage.py @@ -89,12 +89,20 @@ class FieldDefaultChange: DEPRECATION_RUNWAY_MINOR_RELEASES = 5 FIELD_DEFAULT_CHANGE_REPORT_ENV = "SDK_API_BREAKAGE_REPORT_PATH" -_ACCEPTED_REMOVED_MEMBERS: frozenset[tuple[str, str]] = frozenset( - { - ("openhands.workspace", "DockerDevWorkspace.mount_dir"), - ("openhands.workspace", "DockerWorkspace.mount_dir"), - } -) +_ACCEPTED_REMOVED_MEMBERS: dict[tuple[str, str], str] = { + ("openhands.workspace", "DockerDevWorkspace.mount_dir"): ( + "Maintainers explicitly accepted this long-deprecated API break in " + "PR #3822, and that PR is labeled release-note-required." + ), + ("openhands.workspace", "DockerWorkspace.mount_dir"): ( + "Maintainers explicitly accepted this long-deprecated API break in " + "PR #3822, and that PR is labeled release-note-required." + ), + ("openhands.sdk", "LLM.modify_params"): ( + "Removed upstream in PR #4954 after its v1.42.0 to v1.47.0 " + "deprecation runway; legacy persisted settings are migrated on load." + ), +} def _is_accepted_removed_member(package: str, feature: str) -> bool: @@ -787,9 +795,8 @@ def _collect_breakages_pairs( if emit_diagnostics: print( f"::notice title={title}::Accepted removal of " - f"{feature}. Maintainers explicitly accepted " - "this long-deprecated API break in PR #3822, " - "and that PR is labeled release-note-required." + f"{feature}. " + f"{_ACCEPTED_REMOVED_MEMBERS[package, feature]}" ) continue diff --git a/tests/cross/test_check_sdk_api_breakage.py b/tests/cross/test_check_sdk_api_breakage.py index 3667656dd9..199772a58e 100644 --- a/tests/cross/test_check_sdk_api_breakage.py +++ b/tests/cross/test_check_sdk_api_breakage.py @@ -617,6 +617,37 @@ def test_accepted_docker_mount_dir_removal_is_not_breaking(tmp_path, capsys): assert "Accepted removal of DockerWorkspace.mount_dir" in captured.out +def test_accepted_llm_modify_params_removal_is_exact(tmp_path, capsys): + assert _is_accepted_removed_member("openhands.sdk", "LLM.modify_params") + assert not _is_accepted_removed_member("openhands.sdk", "LLM.drop_params") + assert not _is_accepted_removed_member("openhands.workspace", "LLM.modify_params") + old_pkg = _write_pkg_init(tmp_path, "old", ["LLM"]) + new_pkg = _write_pkg_init(tmp_path, "new", ["LLM"]) + old_pkg.joinpath("__init__.py").write_text( + "from pydantic import BaseModel, Field\n" + "__all__ = ['LLM']\n" + "class LLM(BaseModel):\n" + " modify_params: bool = Field(default=True)\n" + " drop_params: bool = Field(default=True)\n" + ) + new_pkg.joinpath("__init__.py").write_text( + "from pydantic import BaseModel\n" + "__all__ = ['LLM']\n" + "class LLM(BaseModel):\n" + " pass\n" + ) + old_root = griffe.load("openhands.sdk", search_paths=[str(tmp_path / "old")]) + new_root = griffe.load("openhands.sdk", search_paths=[str(tmp_path / "new")]) + total_breaks, removal_policy_errors = _prod._compute_breakages( + old_root, new_root, _SDK_CFG, current_version="1.47.0" + ) + assert total_breaks == 1 + assert removal_policy_errors == 1 + output = capsys.readouterr().out + assert "Accepted removal of LLM.modify_params" in output + assert "PR #4954" in output + + def test_unresolved_alias_exports_do_not_crash_breakage_detection(tmp_path): """Unresolvable aliases should not abort checking other exports. From 954892d0c9da8899ff34de46347edc1a1ed6605c Mon Sep 17 00:00:00 2001 From: openhands Date: Sat, 12 Sep 2026 01:57:57 +0000 Subject: [PATCH 03/24] refactor(client): bind runtime services to explicit conversation ownership Share server capability discovery; keep HTTP domain-neutral and global setup separate. Bind create/load/fork workspaces to scoped runtimes. openhands+astra requested by @neubig. Created by an AI agent (OpenHands) on behalf of @neubig. Co-authored-by: openhands --- .../src/__tests__/conversation-scope.test.ts | 175 ++++++++++++++++-- clients/typescript/src/client/bash-client.ts | 24 +-- .../typescript/src/client/desktop-client.ts | 23 +-- clients/typescript/src/client/file-client.ts | 34 ++-- clients/typescript/src/client/git-client.ts | 29 +++ clients/typescript/src/client/http-client.ts | 31 +--- clients/typescript/src/client/mcp-client.ts | 39 ++-- .../typescript/src/client/openhands-client.ts | 16 +- .../typescript/src/client/runtime-client.ts | 59 ++++++ .../src/client/runtime-transport.ts | 73 ++++++++ .../typescript/src/client/server-client.ts | 14 +- .../src/client/server-connection.ts | 33 ++++ .../typescript/src/client/vscode-client.ts | 23 +-- clients/typescript/src/clients.ts | 7 + .../src/conversation/conversation-manager.ts | 16 +- .../src/conversation/remote-conversation.ts | 48 ++++- .../src/workspace/remote-workspace.ts | 84 +++++---- 17 files changed, 537 insertions(+), 191 deletions(-) create mode 100644 clients/typescript/src/client/git-client.ts create mode 100644 clients/typescript/src/client/runtime-client.ts create mode 100644 clients/typescript/src/client/runtime-transport.ts create mode 100644 clients/typescript/src/client/server-connection.ts diff --git a/clients/typescript/src/__tests__/conversation-scope.test.ts b/clients/typescript/src/__tests__/conversation-scope.test.ts index 5d82da7449..c7be71e4bd 100644 --- a/clients/typescript/src/__tests__/conversation-scope.test.ts +++ b/clients/typescript/src/__tests__/conversation-scope.test.ts @@ -1,7 +1,12 @@ import { createServer, Server } from 'node:http'; import { AddressInfo } from 'node:net'; import { ServerClient } from '../client/server-client'; +import { ConversationManager } from '../conversation/conversation-manager'; +import { FileClient } from '../client/file-client'; +import { MCPClient } from '../client/mcp-client'; import { HttpClient } from '../client/http-client'; +import { RuntimeClient } from '../client/runtime-client'; +import type { AgentBase } from '../types/base'; import { RemoteWorkspace } from '../workspace/remote-workspace'; describe('conversation-scoped requests', () => { @@ -9,12 +14,34 @@ describe('conversation-scoped requests', () => { let host: string; const urls: string[] = []; let scoped = false; + let discoveryStatus = 200; beforeAll(async () => { server = createServer((req, res) => { urls.push(req.url!); if (req.url === '/server_info') { + res.statusCode = discoveryStatus; res.setHeader('content-type', 'application/json'); - res.end(JSON.stringify({ capabilities: scoped ? ['conversation_runtime_routes_v1'] : [] })); + res.end( + JSON.stringify({ + version: '1.47.0', + capabilities: scoped ? ['conversation_runtime_routes_v1'] : [], + }) + ); + return; + } + if ( + req.url === '/api/conversations' || + req.url === '/api/conversations/created' || + req.url === '/api/conversations/created/fork' + ) { + res.setHeader('content-type', 'application/json'); + res.end( + JSON.stringify({ + id: req.url.endsWith('/fork') ? 'forked' : 'created', + agent: { kind: 'Agent' }, + workspace: { working_dir: '/workspace' }, + }) + ); return; } res.setHeader('content-type', 'application/json'); @@ -40,32 +67,144 @@ describe('conversation-scoped requests', () => { expect(result.stdout).toBe('ok'); expect(urls.pop()).toBe('/api/bash/execute_bash_command?cid=demo-cid'); }); - it('uses canonical routes and preserves explicit context on capable servers', async () => { + it('keeps runtime services scoped and setup operations global', async () => { + scoped = true; + try { + const manager = new ConversationManager({ host }); + const runtime = manager.runtime('selected'); + await runtime.files.downloadFile('/workspace/a'); + expect(urls.pop()).toBe('/api/conversations/selected/file/download?path=%2Fworkspace%2Fa'); + await runtime.bash.executeCommand({ command: 'pwd' }); + expect(urls.pop()).toBe('/api/conversations/selected/bash/execute_bash_command'); + await manager.files.getHome(); + expect(urls.pop()).toBe('/api/file/home'); + await runtime.mcp.testServer({ server: { command: 'echo' } }); + expect(urls.pop()).toBe('/api/conversations/selected/mcp/test'); + await manager.mcp.getOAuthStatus('job'); + expect(urls.pop()).toBe('/api/mcp/oauth/status/job'); + } finally { + scoped = false; + } + }); + it('preserves mixed-scope legacy constructors without classifying URLs', async () => { scoped = true; try { - const client = new HttpClient({ baseUrl: host, conversationId: 'default' }); - await client.get('/api/file/download', { params: { cid: 'explicit', path: '/workspace/a' } }); - expect(urls.pop()).toBe('/api/conversations/explicit/file/download?path=%2Fworkspace%2Fa'); - await client.post('/api/bash/execute_bash_command', { command: 'pwd' }); - expect(urls.pop()).toBe('/api/conversations/default/bash/execute_bash_command'); - await client.get('/api/tools/'); - expect(urls.pop()).toBe('/api/tools/'); - await client.get('/api/file/home'); + const files = new FileClient({ host, conversationId: 'legacy' }); + await files.getHome(); expect(urls.pop()).toBe('/api/file/home'); - await client.post('/api/mcp/test', { server: {} }); - expect(urls.pop()).toBe('/api/conversations/default/mcp/test'); - await client.get('/api/mcp/oauth/status/job'); + await files.downloadFile('/workspace/a'); + expect(urls.pop()).toContain('/api/conversations/legacy/file/download'); + const mcp = new MCPClient({ host, conversationId: 'legacy' }); + await mcp.getOAuthStatus('job'); expect(urls.pop()).toBe('/api/mcp/oauth/status/job'); } finally { scoped = false; } }); - it('preserves unscoped behavior and explicit query context', async () => { - await new HttpClient({ baseUrl: host }).get('/api/file/home'); - expect(urls.pop()).toBe('/api/file/home'); - await new HttpClient({ baseUrl: host, conversationId: 'default' }).get('/api/file/download', { + it('rejects attempts to override immutable runtime identity', async () => { + const runtime = new RuntimeClient({ host, conversationId: 'selected' }); + await expect(runtime.url('/api/file/download', { cid: 'other' })).rejects.toThrow( + 'cannot be overridden' + ); + await expect(runtime.url('/api/file/../../settings')).rejects.toThrow('API path'); + await expect(runtime.files.downloadTrajectory('other')).rejects.toThrow('selected runtime'); + expect(() => new RuntimeClient({ host, conversationId: '' })).toThrow('conversation ID'); + }); + it('leaves generic HTTP requests untouched without discovery', async () => { + const start = urls.length; + await new HttpClient({ baseUrl: host }).get('/api/file/download', { params: { cid: 'explicit' }, }); - expect(urls.pop()).toBe('/api/file/download?cid=explicit'); + expect(urls.slice(start)).toEqual(['/api/file/download?cid=explicit']); + }); + it('coalesces capability discovery across concurrent runtime requests', async () => { + scoped = true; + const start = urls.length; + const manager = new ConversationManager({ host }); + const client = manager.runtime('shared'); + const other = manager.runtime('other'); + try { + await Promise.all([ + client.git.changes('/workspace'), + other.files.downloadFile('/workspace/a'), + ]); + expect(urls.slice(start).filter((url) => url === '/server_info')).toHaveLength(1); + expect(urls.slice(start)).toContain( + '/api/conversations/shared/git/changes?path=%2Fworkspace' + ); + expect(urls.slice(start)).toContain( + '/api/conversations/other/file/download?path=%2Fworkspace%2Fa' + ); + } finally { + scoped = false; + } + }); + it('retries discovery after errors without silently downgrading', async () => { + discoveryStatus = 503; + const client = new RuntimeClient({ host, conversationId: 'retry' }); + const start = urls.length; + try { + await expect(client.files.downloadFile('/workspace/a')).rejects.toMatchObject({ + status: 503, + }); + expect(urls.slice(start)).toEqual(['/server_info']); + discoveryStatus = 200; + scoped = true; + await client.files.downloadFile('/workspace/a'); + expect(urls.pop()).toBe('/api/conversations/retry/file/download?path=%2Fworkspace%2Fa'); + } finally { + discoveryStatus = 200; + scoped = false; + } + }); + it('falls back when server info is unavailable on an older server', async () => { + discoveryStatus = 404; + try { + const client = new RuntimeClient({ host, conversationId: 'legacy' }); + await client.files.downloadFile('/workspace/a'); + expect(urls.pop()).toBe('/api/file/download?path=%2Fworkspace%2Fa&cid=legacy'); + } finally { + discoveryStatus = 200; + } + }); + it('shares the runtime instance with workspaces and keeps sessions global', async () => { + scoped = true; + try { + const runtime = new ConversationManager({ host }).runtime('preview'); + const workspace = new RemoteWorkspace({ host, workingDir: '/workspace', runtime }); + expect(workspace.bash).toBe(runtime.bash); + expect(workspace.client).toBe(runtime.transport); + expect(await workspace.startWorkspaceSession('preview')).toBe( + `${host}/api/conversations/preview/workspace/` + ); + expect(urls.pop()).toBe('/api/auth/workspace-session'); + await expect(workspace.startWorkspaceSession('other')).rejects.toThrow('selected runtime'); + expect(await runtime.url('/api/file/download', { path: '/workspace/a' })).toBe( + `${host}/api/conversations/preview/file/download?path=%2Fworkspace%2Fa` + ); + } finally { + scoped = false; + } + }); + it('binds created, loaded and forked workspaces to their own runtimes', async () => { + scoped = true; + try { + const manager = new ConversationManager({ host }); + const created = await manager.createConversation({ kind: 'Agent' } as AgentBase, { + workingDir: '/workspace', + }); + expect(created.workspace.runtime?.conversationId).toBe('created'); + await created.workspace.executeCommand('pwd'); + expect(urls.pop()).toBe('/api/conversations/created/bash/execute_bash_command'); + const loaded = await manager.loadConversation('created', '/workspace'); + expect(loaded.workspace.connection).toBe(created.workspace.connection); + const forked = await created.fork(); + expect(forked.workspace.runtime?.conversationId).toBe('forked'); + await forked.workspace.executeCommand('pwd'); + expect(urls.pop()).toBe('/api/conversations/forked/bash/execute_bash_command'); + expect(created.workspace.runtime?.conversationId).toBe('created'); + } finally { + scoped = false; + } }); }); diff --git a/clients/typescript/src/client/bash-client.ts b/clients/typescript/src/client/bash-client.ts index a376730ab0..8c770b3415 100644 --- a/clients/typescript/src/client/bash-client.ts +++ b/clients/typescript/src/client/bash-client.ts @@ -1,4 +1,7 @@ -import { HttpClient, HttpError } from './http-client'; +import { HttpError } from './http-client'; +import { runtimeServiceConnections } from './runtime-transport'; +import type { RuntimeServiceOptions } from './runtime-transport'; +import type { HttpClient } from './http-client'; import { BashCommand, BashEvent, @@ -9,12 +12,7 @@ import { ExecuteBashRequest, } from '../models/workspace'; -export interface BashClientOptions { - host: string; - conversationId?: string; - apiKey?: string; - timeout?: number; -} +export type BashClientOptions = RuntimeServiceOptions; export class BashClient { public readonly host: string; @@ -22,14 +20,10 @@ export class BashClient { private readonly client: HttpClient; constructor(options: BashClientOptions) { - this.host = options.host.replace(/\/$/, ''); - this.apiKey = options.apiKey; - this.client = new HttpClient({ - baseUrl: this.host, - conversationId: options.conversationId, - apiKey: this.apiKey, - timeout: options.timeout || 60000, - }); + const { server, runtime } = runtimeServiceConnections(options); + this.host = server.host; + this.apiKey = server.sessionApiKey; + this.client = runtime; } async searchEvents(options: BashEventSearchOptions = {}): Promise { diff --git a/clients/typescript/src/client/desktop-client.ts b/clients/typescript/src/client/desktop-client.ts index 6ec5bbc264..7d9da7a006 100644 --- a/clients/typescript/src/client/desktop-client.ts +++ b/clients/typescript/src/client/desktop-client.ts @@ -1,12 +1,9 @@ -import { HttpClient } from './http-client'; +import { runtimeServiceConnections } from './runtime-transport'; +import type { RuntimeServiceOptions } from './runtime-transport'; +import type { HttpClient } from './http-client'; import { DesktopUrlResponse } from '../models/api'; -export interface DesktopClientOptions { - host: string; - conversationId?: string; - apiKey?: string; - timeout?: number; -} +export type DesktopClientOptions = RuntimeServiceOptions; export class DesktopClient { public readonly host: string; @@ -14,14 +11,10 @@ export class DesktopClient { private readonly client: HttpClient; constructor(options: DesktopClientOptions) { - this.host = options.host.replace(/\/$/, ''); - this.apiKey = options.apiKey; - this.client = new HttpClient({ - baseUrl: this.host, - conversationId: options.conversationId, - apiKey: this.apiKey, - timeout: options.timeout || 60000, - }); + const { server, runtime } = runtimeServiceConnections(options); + this.host = server.host; + this.apiKey = server.sessionApiKey; + this.client = runtime; } async getUrl(baseUrl?: string): Promise { diff --git a/clients/typescript/src/client/file-client.ts b/clients/typescript/src/client/file-client.ts index f62aaa0cdb..db273dccf4 100644 --- a/clients/typescript/src/client/file-client.ts +++ b/clients/typescript/src/client/file-client.ts @@ -1,4 +1,6 @@ -import { HttpClient } from './http-client'; +import { runtimeServiceConnections } from './runtime-transport'; +import type { RuntimeServiceOptions } from './runtime-transport'; +import type { HttpClient } from './http-client'; import type { FileHomeOptions, FileHomeResponse, @@ -7,12 +9,7 @@ import type { } from '../models/api'; import type { Success } from '../types/base'; -export interface FileClientOptions { - host: string; - conversationId?: string; - apiKey?: string; - timeout?: number; -} +export type FileClientOptions = RuntimeServiceOptions; export type FileUploadContent = string | Blob | File; @@ -20,23 +17,23 @@ export class FileClient { public readonly host: string; public readonly apiKey?: string; private readonly client: HttpClient; + private readonly server: HttpClient; + private readonly conversationId?: string; constructor(options: FileClientOptions) { - this.host = options.host.replace(/\/$/, ''); - this.apiKey = options.apiKey; - this.client = new HttpClient({ - baseUrl: this.host, - conversationId: options.conversationId, - apiKey: this.apiKey, - timeout: options.timeout || 60000, - }); + const { server, runtime } = runtimeServiceConnections(options); + this.host = server.host; + this.apiKey = server.sessionApiKey; + this.client = runtime; + this.server = server; + this.conversationId = options.runtimeTransport?.conversationId ?? options.conversationId; } async searchSubdirectories( path: string, options: FileSearchSubdirsOptions = {} ): Promise { - const response = await this.client.get('/api/file/search_subdirs', { + const response = await this.server.get('/api/file/search_subdirs', { params: { path, page_id: options.pageId, @@ -48,7 +45,7 @@ export class FileClient { } async getHome(options: FileHomeOptions = {}): Promise { - const response = await this.client.get('/api/file/home', { + const response = await this.server.get('/api/file/home', { params: { include_hidden: options.includeHidden || undefined, }, @@ -99,6 +96,9 @@ export class FileClient { } async downloadTrajectory(conversationId: string): Promise { + if (this.conversationId !== undefined && conversationId !== this.conversationId) { + throw new Error('Trajectory must belong to the selected runtime'); + } const response = await this.client.get( `/api/file/download-trajectory/${encodeURIComponent(conversationId)}`, { responseType: 'blob' } diff --git a/clients/typescript/src/client/git-client.ts b/clients/typescript/src/client/git-client.ts new file mode 100644 index 0000000000..5f2229d89a --- /dev/null +++ b/clients/typescript/src/client/git-client.ts @@ -0,0 +1,29 @@ +import { runtimeServiceConnections } from './runtime-transport'; +import type { RuntimeServiceOptions } from './runtime-transport'; +import type { HttpClient } from './http-client'; +import type { GitChange, GitDiff } from '../models/workspace'; +import type { GitQueryOptions } from '../workspace/base'; + +export class GitClient { + private readonly client: HttpClient; + + constructor(options: RuntimeServiceOptions) { + this.client = runtimeServiceConnections(options).runtime; + } + + async changes(path: string, options: GitQueryOptions = {}): Promise { + return ( + await this.client.get('/api/git/changes', { + params: { path, ref: options.ref }, + }) + ).data; + } + + async diff(path: string, options: GitQueryOptions = {}): Promise { + return ( + await this.client.get('/api/git/diff', { + params: { path, ref: options.ref }, + }) + ).data; + } +} diff --git a/clients/typescript/src/client/http-client.ts b/clients/typescript/src/client/http-client.ts index adbe74da03..e0ade0ad84 100644 --- a/clients/typescript/src/client/http-client.ts +++ b/clients/typescript/src/client/http-client.ts @@ -4,7 +4,6 @@ export interface HttpClientOptions { baseUrl: string; - conversationId?: string; apiKey?: string; timeout?: number; } @@ -49,26 +48,17 @@ export class HttpError extends Error { } export class HttpClient { - private conversationId?: string; private baseUrl: string; private apiKey?: string; private timeout: number; - private runtimeRoutes?: Promise; constructor(options: HttpClientOptions) { this.baseUrl = options.baseUrl.replace(/\/$/, ''); this.apiKey = options.apiKey; - this.conversationId = options.conversationId; this.timeout = options.timeout || 60000; } - private isRuntimePath(path: string): boolean { - if (path === '/api/mcp/test') return true; - if (path === '/api/file/home' || path === '/api/file/search_subdirs') return false; - return /^\/api\/(bash|file|git|desktop|vscode)(\/|$)/.test(path); - } - - private buildUrl(path: string, params?: Record): URL { + protected buildUrl(path: string, params?: Record): URL { const relativePath = path.startsWith('/') ? path.slice(1) : path; const url = new URL(relativePath, this.baseUrl + '/'); @@ -84,29 +74,10 @@ export class HttpClient { }); } - if (this.conversationId && this.isRuntimePath(path) && !url.searchParams.has('cid')) { - url.searchParams.set('cid', this.conversationId); - } return url; } async request(options: RequestOptions): Promise> { - if (this.conversationId && this.isRuntimePath(options.url)) { - this.runtimeRoutes ??= this.get<{ capabilities?: string[] }>('/server_info') - .then(({ data }) => data.capabilities?.includes('conversation_runtime_routes_v1') ?? false) - .catch((error: unknown) => { - if (error instanceof HttpError && error.status === 404) return false; - this.runtimeRoutes = undefined; - throw error; - }); - if (await this.runtimeRoutes) { - options = { - ...options, - url: `/api/conversations/${encodeURIComponent(String(options.params?.cid ?? this.conversationId))}${options.url.slice(4)}`, - params: { ...options.params, cid: undefined }, - }; - } - } // `fetch` (and browsers) reject a body on a GET request, but a few // agent-server batch endpoints (e.g. `GET /api/bash/bash_events/` and // `GET /api/conversations/{id}/events`) are declared as GET-with-required-body. diff --git a/clients/typescript/src/client/mcp-client.ts b/clients/typescript/src/client/mcp-client.ts index b23ad2b21a..efc2bb8faa 100644 --- a/clients/typescript/src/client/mcp-client.ts +++ b/clients/typescript/src/client/mcp-client.ts @@ -2,7 +2,9 @@ import { AgentServerFeatureRequirements, assertAgentServerSupports, } from './agent-server-compatibility'; -import { HttpClient } from './http-client'; +import { runtimeServiceConnections } from './runtime-transport'; +import type { RuntimeServiceOptions } from './runtime-transport'; +import type { HttpClient } from './http-client'; import type { AgentServerMCPOAuthCallbackRequest, AgentServerMCPOAuthCallbackResponse, @@ -18,27 +20,20 @@ import type { MCPTestResponse as LegacyMCPTestResponse, } from '../models/api'; -export interface MCPClientOptions { - host: string; - conversationId?: string; - apiKey?: string; - timeout?: number; -} +export type MCPClientOptions = RuntimeServiceOptions; export class MCPClient { public readonly host: string; public readonly apiKey?: string; private readonly client: HttpClient; + private readonly server: HttpClient; constructor(options: MCPClientOptions) { - this.host = options.host.replace(/\/$/, ''); - this.apiKey = options.apiKey; - this.client = new HttpClient({ - baseUrl: this.host, - conversationId: options.conversationId, - apiKey: this.apiKey, - timeout: options.timeout || 60000, - }); + const { server, runtime } = runtimeServiceConnections(options); + this.host = server.host; + this.apiKey = server.sessionApiKey; + this.client = runtime; + this.server = server; } async testServer(request: AgentServerMCPTestRequest): Promise; @@ -50,7 +45,7 @@ export class MCPClient { async testServer( request: LegacyMCPTestRequest | AgentServerMCPTestRequest ): Promise { - await assertAgentServerSupports(this.client, AgentServerFeatureRequirements.mcpTest); + await assertAgentServerSupports(this.server, AgentServerFeatureRequirements.mcpTest); const response = await this.client.post('/api/mcp/test', request, { timeout: (request.timeout ?? 15) * 1000 + 5000, }); @@ -68,8 +63,8 @@ export class MCPClient { async startOAuth( request: LegacyMCPTestRequest | AgentServerMCPStartOAuthRequest ): Promise { - await assertAgentServerSupports(this.client, AgentServerFeatureRequirements.mcpOAuth); - const response = await this.client.post( + await assertAgentServerSupports(this.server, AgentServerFeatureRequirements.mcpOAuth); + const response = await this.server.post( '/api/mcp/oauth/start', request, { @@ -80,8 +75,8 @@ export class MCPClient { } async getOAuthStatus(jobId: string): Promise { - await assertAgentServerSupports(this.client, AgentServerFeatureRequirements.mcpOAuth); - const response = await this.client.get( + await assertAgentServerSupports(this.server, AgentServerFeatureRequirements.mcpOAuth); + const response = await this.server.get( `/api/mcp/oauth/status/${encodeURIComponent(jobId)}` ); return response.data; @@ -91,8 +86,8 @@ export class MCPClient { jobId: string, request: AgentServerMCPOAuthCallbackRequest ): Promise { - await assertAgentServerSupports(this.client, AgentServerFeatureRequirements.mcpOAuth); - const response = await this.client.post( + await assertAgentServerSupports(this.server, AgentServerFeatureRequirements.mcpOAuth); + const response = await this.server.post( `/api/mcp/oauth/callback/${encodeURIComponent(jobId)}`, request ); diff --git a/clients/typescript/src/client/openhands-client.ts b/clients/typescript/src/client/openhands-client.ts index d01e1ba34e..28cbc167b4 100644 --- a/clients/typescript/src/client/openhands-client.ts +++ b/clients/typescript/src/client/openhands-client.ts @@ -11,6 +11,8 @@ import { MetaProfilesClient } from './meta-profiles-client'; import { PluginsClient } from './plugins-client'; import { ProfilesClient } from './profiles-client'; import { ServerClient } from './server-client'; +import { ServerConnection } from './server-connection'; +import { RuntimeClient } from './runtime-client'; import { SettingsClient } from './settings-client'; import { SharedClient } from './shared-client'; import { SkillsClient } from './skills-client'; @@ -141,21 +143,17 @@ export class AgentServerClient extends OpenHandsClient { readonly llm: LLMMetadataClient; readonly workspaces: WorkspacesClient; - private readonly client: HttpClient; + private readonly client: ServerConnection; constructor(options: OpenHandsClientOptions) { super(options); + this.client = new ServerConnection(options); const clientOptions = { host: this.host, apiKey: this.apiKey, timeout: this.timeout, + connection: this.client, }; - - this.client = new HttpClient({ - baseUrl: this.host, - apiKey: this.apiKey, - timeout: this.timeout, - }); this.server = new ServerClient(clientOptions); this.conversations = new ConversationClient(clientOptions); this.files = new FileClient(clientOptions); @@ -177,6 +175,10 @@ export class AgentServerClient extends OpenHandsClient { this.workspaces = new WorkspacesClient(clientOptions); } + runtime(conversationId: string): RuntimeClient { + return new RuntimeClient({ host: this.host, connection: this.client, conversationId }); + } + async request(options: OpenHandsRequestOptions): Promise { const host = options.hostOverride?.replace(/\/+$/, '') ?? this.host; const apiKey = diff --git a/clients/typescript/src/client/runtime-client.ts b/clients/typescript/src/client/runtime-client.ts new file mode 100644 index 0000000000..5ad9512bec --- /dev/null +++ b/clients/typescript/src/client/runtime-client.ts @@ -0,0 +1,59 @@ +import { BashClient } from './bash-client'; +import { DesktopClient } from './desktop-client'; +import { FileClient } from './file-client'; +import { GitClient } from './git-client'; +import { MCPClient } from './mcp-client'; +import { VSCodeClient } from './vscode-client'; +import { ServerConnection } from './server-connection'; +import type { ServerConnectionOptions } from './server-connection'; +import { RuntimeTransport } from './runtime-transport'; + +export interface RuntimeClientOptions extends ServerConnectionOptions { + conversationId: string; + connection?: ServerConnection; +} + +/** Services belonging to one immutable conversation runtime. */ +export class RuntimeClient { + readonly conversationId: string; + readonly connection: ServerConnection; + readonly transport: RuntimeTransport; + readonly files: Pick< + FileClient, + 'downloadFile' | 'downloadTextFile' | 'uploadFile' | 'uploadTextFile' | 'downloadTrajectory' + >; + readonly bash: BashClient; + readonly git: GitClient; + readonly desktop: DesktopClient; + readonly vscode: VSCodeClient; + readonly mcp: Pick; + + constructor(options: RuntimeClientOptions) { + this.conversationId = options.conversationId; + this.connection = options.connection ?? new ServerConnection(options); + this.transport = new RuntimeTransport(this.connection, this.conversationId); + const services = { + host: this.connection.host, + apiKey: this.connection.sessionApiKey, + runtimeTransport: this.transport, + }; + this.files = new FileClient(services); + this.bash = new BashClient(services); + this.git = new GitClient(services); + this.desktop = new DesktopClient(services); + this.vscode = new VSCodeClient(services); + this.mcp = new MCPClient(services); + } + + /** URL construction never includes the session API key. */ + url(path: string, params?: Record): Promise { + return this.transport.url(path, params); + } + + async startWorkspaceSession(): Promise { + await this.connection.post('/api/auth/workspace-session', undefined, { + credentials: 'include', + }); + return `${this.connection.host}/api/conversations/${encodeURIComponent(this.conversationId)}/workspace/`; + } +} diff --git a/clients/typescript/src/client/runtime-transport.ts b/clients/typescript/src/client/runtime-transport.ts new file mode 100644 index 0000000000..53574d0f5a --- /dev/null +++ b/clients/typescript/src/client/runtime-transport.ts @@ -0,0 +1,73 @@ +import { HttpClient } from './http-client'; +import type { HttpResponse, RequestOptions } from './http-client'; +import { ServerConnection } from './server-connection'; +import type { ServerConnectionOptions } from './server-connection'; + +export interface RuntimeServiceOptions extends ServerConnectionOptions { + conversationId?: string; + connection?: ServerConnection; + runtimeTransport?: RuntimeTransport; +} + +/** Routes only runtime requests. Global operations must use the server connection. */ +export class RuntimeTransport extends HttpClient { + constructor( + readonly connection: ServerConnection, + readonly conversationId: string + ) { + super({ baseUrl: connection.host, apiKey: connection.sessionApiKey }); + if (!conversationId.trim()) throw new Error('A runtime requires a conversation ID'); + } + + private async scope(options: RequestOptions): Promise { + if ( + !options.url.startsWith('/api/') || + options.url.includes('?') || + options.url.includes('#') || + options.url.includes('\\') || + options.url.split('/').some((segment) => ['.', '..'].includes(decodeURIComponent(segment))) + ) { + throw new Error('Runtime requests require an API path and separate query parameters'); + } + if (options.params?.cid != null) { + throw new Error('A runtime conversation cannot be overridden; select another RuntimeClient'); + } + if (await this.connection.supportsRuntimeRoutes()) { + return { + ...options, + url: `/api/conversations/${encodeURIComponent(this.conversationId)}${options.url.slice(4)}`, + }; + } + return { ...options, params: { ...options.params, cid: this.conversationId } }; + } + + override async request(options: RequestOptions): Promise> { + return this.connection.request(await this.scope(options)); + } + + async url(path: string, params?: Record): Promise { + const scoped = await this.scope({ method: 'GET', url: path, params }); + return this.buildUrl(scoped.url, scoped.params).toString(); + } +} + +export function runtimeServiceConnections(options: RuntimeServiceOptions): { + server: ServerConnection; + runtime: HttpClient; +} { + const server = + options.runtimeTransport?.connection ?? options.connection ?? new ServerConnection(options); + if ( + options.runtimeTransport && + options.conversationId !== undefined && + options.conversationId !== options.runtimeTransport.conversationId + ) { + throw new Error('Conflicting runtime conversation IDs'); + } + const runtime = + options.runtimeTransport ?? + (options.conversationId !== undefined + ? new RuntimeTransport(server, options.conversationId) + : server); + return { server, runtime }; +} diff --git a/clients/typescript/src/client/server-client.ts b/clients/typescript/src/client/server-client.ts index b0332b2eea..624a9e73ec 100644 --- a/clients/typescript/src/client/server-client.ts +++ b/clients/typescript/src/client/server-client.ts @@ -1,9 +1,11 @@ import { HttpClient } from './http-client'; +import type { ServerConnection } from './server-connection'; import { AliveStatus, HealthStatus, ReadyStatus } from '../models/api'; import { ServerInfo } from '../types/base'; export interface ServerClientOptions { host: string; + connection?: ServerConnection; apiKey?: string; timeout?: number; } @@ -17,11 +19,13 @@ export class ServerClient { constructor(options: ServerClientOptions) { this.host = options.host.replace(/\/$/, ''); this.apiKey = options.apiKey; - this.client = new HttpClient({ - baseUrl: this.host, - apiKey: this.apiKey, - timeout: options.timeout || 60000, - }); + this.client = + options.connection ?? + new HttpClient({ + baseUrl: this.host, + apiKey: this.apiKey, + timeout: options.timeout || 60000, + }); } async getRoot(): Promise { diff --git a/clients/typescript/src/client/server-connection.ts b/clients/typescript/src/client/server-connection.ts new file mode 100644 index 0000000000..af565cc69d --- /dev/null +++ b/clients/typescript/src/client/server-connection.ts @@ -0,0 +1,33 @@ +import { HttpClient, HttpError } from './http-client'; +import { clearAgentServerInfoCache, getCachedAgentServerInfo } from './agent-server-compatibility'; + +export interface ServerConnectionOptions { + host: string; + apiKey?: string; + timeout?: number; +} + +/** One authenticated server connection, shared by its runtime clients. */ +export class ServerConnection extends HttpClient { + readonly host: string; + readonly sessionApiKey?: string; + private runtimeRoutes?: Promise; + + constructor(options: ServerConnectionOptions) { + super({ baseUrl: options.host, apiKey: options.apiKey, timeout: options.timeout }); + this.host = options.host.replace(/\/$/, ''); + this.sessionApiKey = options.apiKey; + } + + supportsRuntimeRoutes(): Promise { + this.runtimeRoutes ??= getCachedAgentServerInfo(this) + .then((info) => info.capabilities?.includes('conversation_runtime_routes_v1') ?? false) + .catch((error: unknown) => { + if (error instanceof HttpError && error.status === 404) return false; + this.runtimeRoutes = undefined; + clearAgentServerInfoCache(this); + throw error; + }); + return this.runtimeRoutes; + } +} diff --git a/clients/typescript/src/client/vscode-client.ts b/clients/typescript/src/client/vscode-client.ts index e09984decb..caf8cf7c4e 100644 --- a/clients/typescript/src/client/vscode-client.ts +++ b/clients/typescript/src/client/vscode-client.ts @@ -1,12 +1,9 @@ -import { HttpClient } from './http-client'; +import { runtimeServiceConnections } from './runtime-transport'; +import type { RuntimeServiceOptions } from './runtime-transport'; +import type { HttpClient } from './http-client'; import { VSCodeStatusResponse, VSCodeUrlResponse } from '../models/api'; -export interface VSCodeClientOptions { - host: string; - conversationId?: string; - apiKey?: string; - timeout?: number; -} +export type VSCodeClientOptions = RuntimeServiceOptions; export interface GetVSCodeUrlOptions { baseUrl?: string; @@ -19,14 +16,10 @@ export class VSCodeClient { private readonly client: HttpClient; constructor(options: VSCodeClientOptions) { - this.host = options.host.replace(/\/$/, ''); - this.apiKey = options.apiKey; - this.client = new HttpClient({ - baseUrl: this.host, - conversationId: options.conversationId, - apiKey: this.apiKey, - timeout: options.timeout || 60000, - }); + const { server, runtime } = runtimeServiceConnections(options); + this.host = server.host; + this.apiKey = server.sessionApiKey; + this.client = runtime; } async getUrl(options: GetVSCodeUrlOptions = {}): Promise { diff --git a/clients/typescript/src/clients.ts b/clients/typescript/src/clients.ts index 4e345376d1..27ad130f7b 100644 --- a/clients/typescript/src/clients.ts +++ b/clients/typescript/src/clients.ts @@ -158,3 +158,10 @@ export type { DeviceTokenResponse, PollDeviceTokenOptions, } from './client/device-flow-client'; + +export { RuntimeClient } from './client/runtime-client'; +export type { RuntimeClientOptions } from './client/runtime-client'; + +export { ServerConnection } from './client/server-connection'; +export type { ServerConnectionOptions } from './client/server-connection'; +export { GitClient } from './client/git-client'; diff --git a/clients/typescript/src/conversation/conversation-manager.ts b/clients/typescript/src/conversation/conversation-manager.ts index c7783263c2..8322659a31 100644 --- a/clients/typescript/src/conversation/conversation-manager.ts +++ b/clients/typescript/src/conversation/conversation-manager.ts @@ -2,7 +2,8 @@ * Conversation manager for handling multiple conversations */ -import { HttpClient } from '../client/http-client'; +import { ServerConnection } from '../client/server-connection'; +import { RuntimeClient } from '../client/runtime-client'; import { AgentProfilesClient } from '../client/agent-profiles-client'; import { DesktopClient } from '../client/desktop-client'; import { FileClient } from '../client/file-client'; @@ -77,7 +78,7 @@ export interface ConversationManagerOptions { } export class ConversationManager { - private readonly client: HttpClient; + private readonly client: ServerConnection; public readonly host: string; public readonly apiKey?: string; public readonly server: ServerClient; @@ -102,13 +103,14 @@ export class ConversationManager { this.host = options.host.replace(/\/$/, ''); this.apiKey = options.apiKey; - this.client = new HttpClient({ - baseUrl: this.host, + this.client = new ServerConnection({ + host: this.host, apiKey: this.apiKey, timeout: 60000, }); const clientOptions = { + connection: this.client, host: this.host, ...(this.apiKey ? { apiKey: this.apiKey } : {}), }; @@ -132,6 +134,10 @@ export class ConversationManager { this.acp = new ACPConversationNamespace(this); } + runtime(conversationId: ConversationID): RuntimeClient { + return new RuntimeClient({ host: this.host, connection: this.client, conversationId }); + } + /** * Search/list conversations */ @@ -217,6 +223,7 @@ export class ConversationManager { ): Promise { const workspace = new RemoteWorkspace({ host: this.host, + connection: this.client, workingDir: options.workingDir || '/tmp', apiKey: this.apiKey, }); @@ -247,6 +254,7 @@ export class ConversationManager { const workspace = new RemoteWorkspace({ host: this.host, workingDir, + runtime: this.runtime(conversationId), apiKey: this.apiKey, }); diff --git a/clients/typescript/src/conversation/remote-conversation.ts b/clients/typescript/src/conversation/remote-conversation.ts index 334f24f203..9eac10eda1 100644 --- a/clients/typescript/src/conversation/remote-conversation.ts +++ b/clients/typescript/src/conversation/remote-conversation.ts @@ -83,7 +83,7 @@ export interface RemoteConversationOptions extends BaseConversationOptions { */ export class RemoteConversation implements IConversation { public readonly agent: AgentBase; - public readonly workspace: RemoteWorkspace; + private _workspace: RemoteWorkspace; private _conversationId?: string; private _state?: RemoteState; private client: HttpClient; @@ -99,7 +99,15 @@ export class RemoteConversation implements IConversation { options: RemoteConversationOptions = {} ) { this.agent = agent; - this.workspace = workspace; + this._workspace = + options.conversationId && workspace.runtime?.conversationId !== options.conversationId + ? new RemoteWorkspace({ + host: workspace.host, + workingDir: workspace.workingDir, + connection: workspace.connection, + conversationId: options.conversationId, + }) + : workspace; this.callback = options.callback; this.onError = options.onError; this._conversationId = options.conversationId; @@ -113,6 +121,10 @@ export class RemoteConversation implements IConversation { }); } + get workspace(): RemoteWorkspace { + return this._workspace; + } + get id(): ConversationID { if (!this._conversationId) { throw new Error('Conversation ID not set. Call start() to initialize the conversation.'); @@ -142,8 +154,11 @@ export class RemoteConversation implements IConversation { } = {} ): Promise { if (this._conversationId) { - // Existing conversation - verify it exists - await this.client.get(`/api/conversations/${this._conversationId}`); + // Existing conversation - verify it exists and use its actual workspace. + const { data } = await this.client.get( + `/api/conversations/${this._conversationId}` + ); + this.bindWorkspace(data); return; } @@ -173,6 +188,26 @@ export class RemoteConversation implements IConversation { const response = await this.client.post('/api/conversations', request); const conversationInfo = response.data; this._conversationId = conversationInfo.id; + this.bindWorkspace(conversationInfo); + } + + private workspaceWorkingDir(info: ConversationInfo): string { + const workspace = info.workspace; + return workspace && + typeof workspace === 'object' && + 'working_dir' in workspace && + typeof workspace.working_dir === 'string' + ? workspace.working_dir + : this.workspace.workingDir; + } + + private bindWorkspace(info: ConversationInfo): void { + this._workspace = new RemoteWorkspace({ + host: this.workspace.host, + workingDir: this.workspaceWorkingDir(info), + connection: this.workspace.connection, + conversationId: info.id, + }); } /** @@ -360,8 +395,9 @@ export class RemoteConversation implements IConversation { const forkWorkspace = new RemoteWorkspace({ host: this.workspace.host, - workingDir: this.workspace.workingDir, - apiKey: this.workspace.apiKey, + workingDir: this.workspaceWorkingDir(response.data), + connection: this.workspace.connection, + conversationId: response.data.id, }); return new RemoteConversation(response.data.agent, forkWorkspace, { diff --git a/clients/typescript/src/workspace/remote-workspace.ts b/clients/typescript/src/workspace/remote-workspace.ts index c0bb5cce01..2a8ae322c5 100644 --- a/clients/typescript/src/workspace/remote-workspace.ts +++ b/clients/typescript/src/workspace/remote-workspace.ts @@ -6,7 +6,10 @@ */ import { BashClient } from '../client/bash-client'; -import { HttpClient } from '../client/http-client'; +import { RuntimeClient } from '../client/runtime-client'; +import { ServerConnection } from '../client/server-connection'; +import type { HttpClient } from '../client/http-client'; +import { GitClient } from '../client/git-client'; import { CommandResult, FileOperationResult, @@ -23,6 +26,8 @@ import { IWorkspace, BaseWorkspaceOptions, GitQueryOptions } from './base'; export interface RemoteWorkspaceOptions extends BaseWorkspaceOptions { /** The remote host URL for the workspace (e.g., 'http://localhost:8000') */ host: string; + runtime?: RuntimeClient; + connection?: ServerConnection; conversationId?: string; /** API key for authenticating with the remote host (optional) */ apiKey?: string; @@ -40,25 +45,37 @@ export class RemoteWorkspace implements IWorkspace { public readonly workingDir: string; public readonly apiKey?: string; public readonly client: HttpClient; + public readonly connection: ServerConnection; + public readonly runtime?: RuntimeClient; + private readonly git: GitClient; public readonly bash: BashClient; constructor(options: RemoteWorkspaceOptions) { - this.host = options.host.replace(/\/$/, ''); + this.connection = + options.runtime?.connection ?? options.connection ?? new ServerConnection(options); + this.host = this.connection.host; this.workingDir = options.workingDir; - this.apiKey = options.apiKey; - - this.client = new HttpClient({ - baseUrl: this.host, - conversationId: options.conversationId, - apiKey: this.apiKey, - timeout: 60000, - }); - - this.bash = new BashClient({ - host: this.host, - conversationId: options.conversationId, - ...(this.apiKey ? { apiKey: this.apiKey } : {}), - }); + this.apiKey = this.connection.sessionApiKey; + if ( + options.runtime && + options.conversationId !== undefined && + options.conversationId !== options.runtime.conversationId + ) { + throw new Error('Conflicting workspace runtime IDs'); + } + this.runtime = + options.runtime ?? + (options.conversationId !== undefined + ? new RuntimeClient({ + host: this.host, + connection: this.connection, + conversationId: options.conversationId, + }) + : undefined); + this.client = this.runtime?.transport ?? this.connection; + this.bash = + this.runtime?.bash ?? new BashClient({ host: this.host, connection: this.connection }); + this.git = this.runtime?.git ?? new GitClient({ host: this.host, connection: this.connection }); } /** @@ -90,14 +107,21 @@ export class RemoteWorkspace implements IWorkspace { * suitable for joining a relative path onto. */ async startWorkspaceSession(conversationId: ConversationID): Promise { - await this.client.post('/api/auth/workspace-session', undefined, { - credentials: 'include', - }); - return `${this.host}/api/conversations/${conversationId}/workspace/`; + if (this.runtime && this.runtime.conversationId !== conversationId) { + throw new Error('Workspace session must belong to the selected runtime'); + } + return ( + this.runtime ?? + new RuntimeClient({ + host: this.host, + connection: this.connection, + conversationId, + }) + ).startWorkspaceSession(); } async deleteWorkspaceSession(): Promise { - await this.client.delete('/api/auth/workspace-session', { + await this.connection.delete('/api/auth/workspace-session', { credentials: 'include', acceptableStatusCodes: new Set([204]), }); @@ -207,15 +231,8 @@ export class RemoteWorkspace implements IWorkspace { } async gitChanges(path: string, options: GitQueryOptions = {}): Promise { - const params: Record = { path }; - if (options.ref !== undefined) { - params.ref = options.ref; - } try { - const response = await this.client.get('/api/git/changes', { - params, - }); - return response.data; + return await this.git.changes(path, options); } catch (error) { throw new Error( `Failed to get git changes: ${error instanceof Error ? error.message : String(error)}`, @@ -225,15 +242,8 @@ export class RemoteWorkspace implements IWorkspace { } async gitDiff(path: string, options: GitQueryOptions = {}): Promise { - const params: Record = { path }; - if (options.ref !== undefined) { - params.ref = options.ref; - } try { - const response = await this.client.get('/api/git/diff', { - params, - }); - return response.data; + return await this.git.diff(path, options); } catch (error) { throw new Error( `Failed to get git diff: ${error instanceof Error ? error.message : String(error)}`, From 29184d83e450aa421b1680cda3aebae3a1a660e0 Mon Sep 17 00:00:00 2001 From: openhands Date: Sat, 12 Sep 2026 02:07:03 +0000 Subject: [PATCH 04/24] fix(client): keep runtime URL parameters within public type budget openhands+astra requested by @neubig. AI-generated by OpenHands on behalf of @neubig. Co-authored-by: openhands --- clients/typescript/src/client/http-client.ts | 2 +- clients/typescript/src/client/runtime-client.ts | 3 ++- clients/typescript/src/client/runtime-transport.ts | 11 +++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/clients/typescript/src/client/http-client.ts b/clients/typescript/src/client/http-client.ts index e0ade0ad84..b952448aff 100644 --- a/clients/typescript/src/client/http-client.ts +++ b/clients/typescript/src/client/http-client.ts @@ -58,7 +58,7 @@ export class HttpClient { this.timeout = options.timeout || 60000; } - protected buildUrl(path: string, params?: Record): URL { + protected buildUrl(path: string, params?: RequestOptions['params']): URL { const relativePath = path.startsWith('/') ? path.slice(1) : path; const url = new URL(relativePath, this.baseUrl + '/'); diff --git a/clients/typescript/src/client/runtime-client.ts b/clients/typescript/src/client/runtime-client.ts index 5ad9512bec..89b2689605 100644 --- a/clients/typescript/src/client/runtime-client.ts +++ b/clients/typescript/src/client/runtime-client.ts @@ -6,6 +6,7 @@ import { MCPClient } from './mcp-client'; import { VSCodeClient } from './vscode-client'; import { ServerConnection } from './server-connection'; import type { ServerConnectionOptions } from './server-connection'; +import type { RuntimeUrlParams } from './runtime-transport'; import { RuntimeTransport } from './runtime-transport'; export interface RuntimeClientOptions extends ServerConnectionOptions { @@ -46,7 +47,7 @@ export class RuntimeClient { } /** URL construction never includes the session API key. */ - url(path: string, params?: Record): Promise { + url(path: string, params?: RuntimeUrlParams): Promise { return this.transport.url(path, params); } diff --git a/clients/typescript/src/client/runtime-transport.ts b/clients/typescript/src/client/runtime-transport.ts index 53574d0f5a..8508519b8a 100644 --- a/clients/typescript/src/client/runtime-transport.ts +++ b/clients/typescript/src/client/runtime-transport.ts @@ -3,6 +3,11 @@ import type { HttpResponse, RequestOptions } from './http-client'; import { ServerConnection } from './server-connection'; import type { ServerConnectionOptions } from './server-connection'; +export type RuntimeUrlParams = Record< + string, + string | number | boolean | Array | null | undefined +>; + export interface RuntimeServiceOptions extends ServerConnectionOptions { conversationId?: string; connection?: ServerConnection; @@ -41,11 +46,13 @@ export class RuntimeTransport extends HttpClient { return { ...options, params: { ...options.params, cid: this.conversationId } }; } - override async request(options: RequestOptions): Promise> { + override async request( + options: RequestOptions + ): Promise> { return this.connection.request(await this.scope(options)); } - async url(path: string, params?: Record): Promise { + async url(path: string, params?: RuntimeUrlParams): Promise { const scoped = await this.scope({ method: 'GET', url: path, params }); return this.buildUrl(scoped.url, scoped.params).toString(); } From 584aa4a620b3a13335cd09eb4e1fd220d7368bbc Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 13 Sep 2026 00:07:42 +0000 Subject: [PATCH 05/24] feat: expose runtime lifecycle contracts independently of Docker --- .../src/__tests__/api-clients.test.ts | 12 +++++ .../src/client/conversation-client.ts | 16 +++++++ clients/typescript/src/index.ts | 3 ++ clients/typescript/src/models/conversation.ts | 24 ++++++++++ .../agent_server/conversation_router.py | 25 +++++++++++ .../openhands/agent_server/models.py | 37 ++++++++++++++++ .../agent_server/test_conversation_router.py | 44 ++++++++++++------- .../test_remote_conversation_live_server.py | 14 ++++++ 8 files changed, 159 insertions(+), 16 deletions(-) diff --git a/clients/typescript/src/__tests__/api-clients.test.ts b/clients/typescript/src/__tests__/api-clients.test.ts index 3efa1d0004..cb19b0d8af 100644 --- a/clients/typescript/src/__tests__/api-clients.test.ts +++ b/clients/typescript/src/__tests__/api-clients.test.ts @@ -2285,6 +2285,8 @@ describe('Auxiliary API clients', () => { await client.respondToConfirmation('c1', { accept: true }); await client.deleteConversation('c1'); await client.updateConversation('c1', { title: 'New title' }); + await client.getRuntime('c1'); + await client.reprovisionRuntime('c1'); expect(global.fetch).toHaveBeenNthCalledWith( 1, @@ -2314,6 +2316,16 @@ describe('Auxiliary API clients', () => { 'http://example.com/api/conversations/c1', expect.objectContaining({ method: 'PATCH', body: JSON.stringify({ title: 'New title' }) }) ); + expect(global.fetch).toHaveBeenNthCalledWith( + 9, + 'http://example.com/api/conversations/c1/runtime', + expect.objectContaining({ method: 'GET' }) + ); + expect(global.fetch).toHaveBeenNthCalledWith( + 10, + 'http://example.com/api/conversations/c1/runtime/reprovision', + expect.objectContaining({ method: 'POST', body: JSON.stringify({}) }) + ); }); it('ConversationClient wraps SDK v1.23.0 conversation endpoints', async () => { diff --git a/clients/typescript/src/client/conversation-client.ts b/clients/typescript/src/client/conversation-client.ts index a636c7a307..6b001064f8 100644 --- a/clients/typescript/src/client/conversation-client.ts +++ b/clients/typescript/src/client/conversation-client.ts @@ -9,6 +9,7 @@ import type { ConversationEventPage, ConversationEventSearchOptions, ConversationInfo, + ConversationRuntimeInfo, ConversationSearchRequest, ConversationSearchResponse, ForkConversationRequest, @@ -108,6 +109,21 @@ export class ConversationClient { return response.data; } + async getRuntime(conversationId: string): Promise { + const response = await this.client.get( + `/api/conversations/${conversationId}/runtime` + ); + return response.data; + } + + async reprovisionRuntime(conversationId: string): Promise { + const response = await this.client.post( + `/api/conversations/${conversationId}/runtime/reprovision`, + {} + ); + return response.data; + } + async searchEvents( conversationId: string, options: ConversationEventSearchOptions = {} diff --git a/clients/typescript/src/index.ts b/clients/typescript/src/index.ts index b042546fef..89d01a9717 100644 --- a/clients/typescript/src/index.ts +++ b/clients/typescript/src/index.ts @@ -255,6 +255,9 @@ export type { SwitchPlan } from './profiles/derive-switch-plan'; // Conversation models export type { ConversationInfo, + ConversationRuntimeStatus, + ConversationRuntimeError, + ConversationRuntimeInfo, ACPAgentConfig, ACPConversationInfo, SendMessageRequest, diff --git a/clients/typescript/src/models/conversation.ts b/clients/typescript/src/models/conversation.ts index 0eb5f5d13e..d5c57d9b78 100644 --- a/clients/typescript/src/models/conversation.ts +++ b/clients/typescript/src/models/conversation.ts @@ -23,6 +23,24 @@ export enum ConversationSortOrder { UPDATED_AT_DESC = 'UPDATED_AT_DESC', } +export type ConversationRuntimeStatus = + | 'available' + | 'starting' + | 'missing' + | 'ownership_lost' + | 'error'; + +export interface ConversationRuntimeError { + code: string; + message: string; +} + +export interface ConversationRuntimeInfo { + runtime_status: ConversationRuntimeStatus; + can_resume: boolean; + runtime_error: ConversationRuntimeError | null; +} + export interface ConversationInfo { id: ConversationID; /** @@ -30,6 +48,12 @@ export interface ConversationInfo { * Note: This field was renamed from agent_status to execution_status in the API. */ execution_status: ConversationExecutionStatus; + /** Runtime availability. Absent on agent-server versions before this contract. */ + runtime_status?: ConversationRuntimeStatus; + /** Whether retained state permits explicit execution resumption. */ + can_resume?: boolean; + /** Latest structured runtime failure, when known. */ + runtime_error?: ConversationRuntimeError | null; /** * @deprecated Use execution_status instead. This field is kept for backward compatibility. */ diff --git a/openhands-agent-server/openhands/agent_server/conversation_router.py b/openhands-agent-server/openhands/agent_server/conversation_router.py index 6e252f667c..4beeaaa00b 100644 --- a/openhands-agent-server/openhands/agent_server/conversation_router.py +++ b/openhands-agent-server/openhands/agent_server/conversation_router.py @@ -31,6 +31,8 @@ AskAgentResponse, ConversationInfo, ConversationPage, + ConversationRuntimeInfo, + ConversationRuntimeStatus, ConversationSortOrder, ForkConversationRequest, NavigateConversationRequest, @@ -158,6 +160,29 @@ async def get_conversation( return conversation +@conversation_router.get("/{conversation_id}/runtime") +async def get_local_conversation_runtime( + conversation_id: UUID, + conversation_service: ConversationService = Depends(get_conversation_service), +) -> ConversationRuntimeInfo: + """Inspect the always-available in-process runtime.""" + if await conversation_service.get_conversation(conversation_id) is None: + raise HTTPException(status.HTTP_404_NOT_FOUND) + return ConversationRuntimeInfo( + runtime_status=ConversationRuntimeStatus.AVAILABLE, + can_resume=True, + ) + + +@conversation_router.post("/{conversation_id}/runtime/reprovision") +async def reprovision_local_conversation_runtime( + conversation_id: UUID, + conversation_service: ConversationService = Depends(get_conversation_service), +) -> ConversationRuntimeInfo: + """Return local runtime state; local mode has no infrastructure to provision.""" + return await get_local_conversation_runtime(conversation_id, conversation_service) + + @conversation_router.get( "/{conversation_id}/agent_final_response", responses={404: {"description": "Conversation not found"}}, diff --git a/openhands-agent-server/openhands/agent_server/models.py b/openhands-agent-server/openhands/agent_server/models.py index 0182ccf1aa..05311ea22b 100644 --- a/openhands-agent-server/openhands/agent_server/models.py +++ b/openhands-agent-server/openhands/agent_server/models.py @@ -45,6 +45,31 @@ from openhands.sdk.workspace.base import BaseWorkspace +class ConversationRuntimeStatus(StrEnum): + """Availability of the runtime that executes a conversation.""" + + AVAILABLE = "available" + STARTING = "starting" + MISSING = "missing" + OWNERSHIP_LOST = "ownership_lost" + ERROR = "error" + + +class ConversationRuntimeError(BaseModel): + """Structured details for the latest runtime lifecycle failure.""" + + code: str + message: str + + +class ConversationRuntimeInfo(BaseModel): + """Runtime availability and recovery information for a conversation.""" + + runtime_status: ConversationRuntimeStatus + can_resume: bool + runtime_error: ConversationRuntimeError | None = None + + class ServerErrorEvent(Event): """Event emitted by the agent server when a server-level error occurs. @@ -150,6 +175,18 @@ class _ConversationInfoBase(BaseModel): execution_status: ConversationExecutionStatus = Field( default=ConversationExecutionStatus.IDLE ) + runtime_status: ConversationRuntimeStatus = Field( + default=ConversationRuntimeStatus.AVAILABLE, + description="Availability of the runtime that executes this conversation.", + ) + can_resume: bool = Field( + default=True, + description="Whether retained state allows explicit execution resumption.", + ) + runtime_error: ConversationRuntimeError | None = Field( + default=None, + description="Latest runtime lifecycle failure, if one is known.", + ) confirmation_policy: ConfirmationPolicyBase = Field(default=NeverConfirm()) security_analyzer: SecurityAnalyzerBase | None = Field( default=None, diff --git a/tests/agent_server/test_conversation_router.py b/tests/agent_server/test_conversation_router.py index 22158ef5a7..822730c2f7 100644 --- a/tests/agent_server/test_conversation_router.py +++ b/tests/agent_server/test_conversation_router.py @@ -1102,8 +1102,8 @@ def test_start_goal_in_conversation_success( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.start_goal_loop.return_value = None - client.app.dependency_overrides[get_conversation_service] = ( - lambda: mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = lambda: ( + mock_conversation_service ) try: response = client.post( @@ -1125,8 +1125,8 @@ def test_start_goal_in_conversation_not_found( """/goal returns 404 when the conversation is unknown.""" mock_conversation_service.get_event_service.return_value = None - client.app.dependency_overrides[get_conversation_service] = ( - lambda: mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = lambda: ( + mock_conversation_service ) try: response = client.post( @@ -1145,8 +1145,8 @@ def test_start_goal_in_conversation_rejects_busy_loop( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.start_goal_loop.side_effect = ValueError("goal_already_running") - client.app.dependency_overrides[get_conversation_service] = ( - lambda: mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = lambda: ( + mock_conversation_service ) try: response = client.post( @@ -1165,8 +1165,8 @@ def test_stop_goal_in_conversation_success( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.stop_goal_loop.return_value = True - client.app.dependency_overrides[get_conversation_service] = ( - lambda: mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = lambda: ( + mock_conversation_service ) try: response = client.post(f"/api/conversations/{sample_conversation_id}/goal/stop") @@ -1183,8 +1183,8 @@ def test_stop_goal_in_conversation_not_found( """/goal/stop returns 404 when the conversation is unknown.""" mock_conversation_service.get_event_service.return_value = None - client.app.dependency_overrides[get_conversation_service] = ( - lambda: mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = lambda: ( + mock_conversation_service ) try: response = client.post(f"/api/conversations/{sample_conversation_id}/goal/stop") @@ -1200,8 +1200,8 @@ def test_resume_goal_in_conversation_success( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.resume_goal_loop.return_value = None - client.app.dependency_overrides[get_conversation_service] = ( - lambda: mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = lambda: ( + mock_conversation_service ) try: response = client.post( @@ -1220,8 +1220,8 @@ def test_resume_goal_in_conversation_not_found( """/goal/resume returns 404 when the conversation is unknown.""" mock_conversation_service.get_event_service.return_value = None - client.app.dependency_overrides[get_conversation_service] = ( - lambda: mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = lambda: ( + mock_conversation_service ) try: response = client.post( @@ -1239,8 +1239,8 @@ def test_resume_goal_in_conversation_no_resumable( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.resume_goal_loop.side_effect = ValueError("no_resumable_goal") - client.app.dependency_overrides[get_conversation_service] = ( - lambda: mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = lambda: ( + mock_conversation_service ) try: response = client.post( @@ -2694,3 +2694,15 @@ def test_start_conversation_client_tool_registration_error_returns_422( assert "collides with an existing non-client tool" in response.json()["detail"] finally: client.app.dependency_overrides.clear() + + +@pytest.mark.parametrize("method,suffix", [("get", ""), ("post", "/reprovision")]) +def test_runtime_requires_existing_conversation( + client, mock_conversation_service, method, suffix +): + mock_conversation_service.get_conversation.return_value = None + client.app.dependency_overrides[get_conversation_service] = lambda: ( + mock_conversation_service + ) + response = client.request(method, f"/api/conversations/{uuid4()}/runtime{suffix}") + assert response.status_code == 404 diff --git a/tests/cross/test_remote_conversation_live_server.py b/tests/cross/test_remote_conversation_live_server.py index f0b87be8af..b501c3b3a4 100644 --- a/tests/cross/test_remote_conversation_live_server.py +++ b/tests/cross/test_remote_conversation_live_server.py @@ -580,6 +580,20 @@ def test_remote_conversation_over_real_server(server_env, patched_llm): agent=agent, workspace=workspace ) # RemoteConversation + # Lifecycle inspection/reprovision is available without a Docker backend. + runtime_url = f"{server_env['host']}/api/conversations/{conv.id}/runtime" + with httpx.Client() as client: + before = client.get(runtime_url) + before.raise_for_status() + assert before.json() == { + "runtime_status": "available", + "can_resume": True, + "runtime_error": None, + } + after = client.post(runtime_url + "/reprovision") + after.raise_for_status() + assert after.json() == before.json() + # Send a message and run conv.send_message("Say hello") conv.run() From f64e34fbf0213ad29ef3cb21eb5b6e37478bc2ab Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 13 Sep 2026 00:10:11 +0000 Subject: [PATCH 06/24] chore: keep runtime lifecycle tests focused --- .../agent_server/test_conversation_router.py | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/agent_server/test_conversation_router.py b/tests/agent_server/test_conversation_router.py index 822730c2f7..02d12911c5 100644 --- a/tests/agent_server/test_conversation_router.py +++ b/tests/agent_server/test_conversation_router.py @@ -1102,8 +1102,8 @@ def test_start_goal_in_conversation_success( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.start_goal_loop.return_value = None - client.app.dependency_overrides[get_conversation_service] = lambda: ( - mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = ( + lambda: mock_conversation_service ) try: response = client.post( @@ -1125,8 +1125,8 @@ def test_start_goal_in_conversation_not_found( """/goal returns 404 when the conversation is unknown.""" mock_conversation_service.get_event_service.return_value = None - client.app.dependency_overrides[get_conversation_service] = lambda: ( - mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = ( + lambda: mock_conversation_service ) try: response = client.post( @@ -1145,8 +1145,8 @@ def test_start_goal_in_conversation_rejects_busy_loop( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.start_goal_loop.side_effect = ValueError("goal_already_running") - client.app.dependency_overrides[get_conversation_service] = lambda: ( - mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = ( + lambda: mock_conversation_service ) try: response = client.post( @@ -1165,8 +1165,8 @@ def test_stop_goal_in_conversation_success( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.stop_goal_loop.return_value = True - client.app.dependency_overrides[get_conversation_service] = lambda: ( - mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = ( + lambda: mock_conversation_service ) try: response = client.post(f"/api/conversations/{sample_conversation_id}/goal/stop") @@ -1183,8 +1183,8 @@ def test_stop_goal_in_conversation_not_found( """/goal/stop returns 404 when the conversation is unknown.""" mock_conversation_service.get_event_service.return_value = None - client.app.dependency_overrides[get_conversation_service] = lambda: ( - mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = ( + lambda: mock_conversation_service ) try: response = client.post(f"/api/conversations/{sample_conversation_id}/goal/stop") @@ -1200,8 +1200,8 @@ def test_resume_goal_in_conversation_success( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.resume_goal_loop.return_value = None - client.app.dependency_overrides[get_conversation_service] = lambda: ( - mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = ( + lambda: mock_conversation_service ) try: response = client.post( @@ -1220,8 +1220,8 @@ def test_resume_goal_in_conversation_not_found( """/goal/resume returns 404 when the conversation is unknown.""" mock_conversation_service.get_event_service.return_value = None - client.app.dependency_overrides[get_conversation_service] = lambda: ( - mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = ( + lambda: mock_conversation_service ) try: response = client.post( @@ -1239,8 +1239,8 @@ def test_resume_goal_in_conversation_no_resumable( mock_conversation_service.get_event_service.return_value = mock_event_service mock_event_service.resume_goal_loop.side_effect = ValueError("no_resumable_goal") - client.app.dependency_overrides[get_conversation_service] = lambda: ( - mock_conversation_service + client.app.dependency_overrides[get_conversation_service] = ( + lambda: mock_conversation_service ) try: response = client.post( From ad086086752d9f92ad7f83f345578e242f4414b1 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 13 Sep 2026 00:19:43 +0000 Subject: [PATCH 07/24] style: format extracted runtime lifecycle model --- clients/typescript/src/models/conversation.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/clients/typescript/src/models/conversation.ts b/clients/typescript/src/models/conversation.ts index d5c57d9b78..d6d401a438 100644 --- a/clients/typescript/src/models/conversation.ts +++ b/clients/typescript/src/models/conversation.ts @@ -24,11 +24,7 @@ export enum ConversationSortOrder { } export type ConversationRuntimeStatus = - | 'available' - | 'starting' - | 'missing' - | 'ownership_lost' - | 'error'; + 'available' | 'starting' | 'missing' | 'ownership_lost' | 'error'; export interface ConversationRuntimeError { code: string; From b8e0d3c5fd8f76f5d2d06a1d566e6bcba23d41b7 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 13 Sep 2026 00:40:54 +0000 Subject: [PATCH 08/24] ci: use the native stack base instead of temporary branch filters --- .github/workflows/agent-server-rest-api-breakage.yml | 2 +- .github/workflows/persisted-settings-compat.yml | 2 +- .github/workflows/review-thread-gate.yml | 2 +- .github/workflows/server.yml | 2 +- .github/workflows/typescript-client-ci.yml | 2 +- .github/workflows/typescript-client-integration-tests.yml | 2 +- .github/workflows/version-bump-guard.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/agent-server-rest-api-breakage.yml b/.github/workflows/agent-server-rest-api-breakage.yml index 2cbc42c6e5..7f7e80260c 100644 --- a/.github/workflows/agent-server-rest-api-breakage.yml +++ b/.github/workflows/agent-server-rest-api-breakage.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main, feat/conversation-scoped-runtime-api] + branches: [main] jobs: agent-server-rest-api: diff --git a/.github/workflows/persisted-settings-compat.yml b/.github/workflows/persisted-settings-compat.yml index 00ee9facae..7a45957a41 100644 --- a/.github/workflows/persisted-settings-compat.yml +++ b/.github/workflows/persisted-settings-compat.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main, feat/conversation-scoped-runtime-api] + branches: [main] jobs: persisted-settings-compat: diff --git a/.github/workflows/review-thread-gate.yml b/.github/workflows/review-thread-gate.yml index 2dd43f3db7..0a4e08c4fb 100644 --- a/.github/workflows/review-thread-gate.yml +++ b/.github/workflows/review-thread-gate.yml @@ -3,7 +3,7 @@ name: Review Thread Gate on: pull_request: - branches: [main, feat/conversation-scoped-runtime-api] + branches: [main] types: [opened, synchronize, reopened, ready_for_review, edited] permissions: diff --git a/.github/workflows/server.yml b/.github/workflows/server.yml index 8671efc61f..2991289ff3 100644 --- a/.github/workflows/server.yml +++ b/.github/workflows/server.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main, feat/conversation-scoped-runtime-api] + branches: [main] workflow_dispatch: inputs: base_image: diff --git a/.github/workflows/typescript-client-ci.yml b/.github/workflows/typescript-client-ci.yml index e934b219f5..999dc03390 100644 --- a/.github/workflows/typescript-client-ci.yml +++ b/.github/workflows/typescript-client-ci.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main, feat/conversation-scoped-runtime-api] + branches: [main] defaults: run: diff --git a/.github/workflows/typescript-client-integration-tests.yml b/.github/workflows/typescript-client-integration-tests.yml index 3977b73c04..319d1faf1b 100644 --- a/.github/workflows/typescript-client-integration-tests.yml +++ b/.github/workflows/typescript-client-integration-tests.yml @@ -5,7 +5,7 @@ on: push: branches: [main] pull_request: - branches: [main, feat/conversation-scoped-runtime-api] + branches: [main] workflow_dispatch: inputs: llm_model: diff --git a/.github/workflows/version-bump-guard.yml b/.github/workflows/version-bump-guard.yml index e57d1c736a..f02ac398ca 100644 --- a/.github/workflows/version-bump-guard.yml +++ b/.github/workflows/version-bump-guard.yml @@ -3,7 +3,7 @@ name: Version bump guard on: pull_request: - branches: [main, feat/conversation-scoped-runtime-api] + branches: [main] jobs: version-bump-guard: From d5719d42e5a43d20a6e9b89e8edb5541bd66cd21 Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 13 Sep 2026 15:51:24 +0000 Subject: [PATCH 09/24] docs: capture live Canvas evidence for #4966 --- .pr/sdk4966-scoped-runtime.gif | Bin 0 -> 359447 bytes .pr/sdk4966-scoped-runtime.json | 65 ++++++++++++++++++++++++++++++++ .pr/sdk4966-scoped-runtime.md | 13 +++++++ 3 files changed, 78 insertions(+) create mode 100644 .pr/sdk4966-scoped-runtime.gif create mode 100644 .pr/sdk4966-scoped-runtime.json create mode 100644 .pr/sdk4966-scoped-runtime.md diff --git a/.pr/sdk4966-scoped-runtime.gif b/.pr/sdk4966-scoped-runtime.gif new file mode 100644 index 0000000000000000000000000000000000000000..3df2fa812a0da51c7079b26b46608baa8980c6d2 GIT binary patch literal 359447 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%0AmmfZ1|C0`;97W3xN}stSCtfR86?=461G?o{eK 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