cloudflare-openhands-sdk 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Dockerfile CHANGED
@@ -14,6 +14,5 @@ RUN git clone https://github.com/OpenHands/software-agent-sdk.git && \
14
14
  cd software-agent-sdk && \
15
15
  make build
16
16
 
17
- # Required during local development to access exposed ports
18
- EXPOSE 8080
19
-
17
+ # Allows access to exposed ports from the default OpenHands port during local development
18
+ EXPOSE 8001
package/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2025 Mahesh Jaganiya
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  SDK for integrating OpenHands agent-server with Cloudflare Workers Sandbox.
4
4
 
5
+ ![Cloudflare OpenHands](assets/cf-openhands.jpeg)
6
+
5
7
  ## Installation
6
8
 
7
9
  ```bash
@@ -15,7 +17,7 @@ bun add cloudflare-openhands-sdk
15
17
  ## Prerequisites
16
18
 
17
19
  - `@cloudflare/sandbox` (peer dependency) - Install in your Worker project
18
- - Cloudflare Workers account with Sandbox support
20
+ - Cloudflare Workers Paid account
19
21
  - Custom domain (required for preview URLs)
20
22
 
21
23
  ## Quick Start
@@ -131,4 +133,6 @@ interface OpenhandsOptions {
131
133
 
132
134
  ## License
133
135
 
134
- MIT
136
+ Apache 2.0
137
+
138
+ This project is licensed under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for details.
package/dist/index.js CHANGED
@@ -286,12 +286,14 @@ function createOpenhandsHandler(options = {}) {
286
286
  }
287
287
  function attachOpenhandsRoutes(fetchHandler, options = {}) {
288
288
  const openhandsHandler = createOpenhandsHandler(options);
289
- return async (request, env) => {
290
- const openhandsResponse = await openhandsHandler(request, env);
291
- if (openhandsResponse !== null) {
292
- return openhandsResponse;
289
+ return {
290
+ fetch: async (request, env) => {
291
+ const openhandsResponse = await openhandsHandler(request, env);
292
+ if (openhandsResponse !== null) {
293
+ return openhandsResponse;
294
+ }
295
+ return fetchHandler(request, env);
293
296
  }
294
- return fetchHandler(request, env);
295
297
  };
296
298
  }
297
299
  export {
@@ -309,4 +311,4 @@ export {
309
311
  DEFAULT_AGENT_SERVER_DIR
310
312
  };
311
313
 
312
- //# debugId=B9FBDAC5E93D00D564756E2164756E21
314
+ //# debugId=09928E128FAF5D9D64756E2164756E21
package/dist/index.js.map CHANGED
@@ -5,9 +5,9 @@
5
5
  "import type { Sandbox } from '@cloudflare/sandbox';\n\n/**\n * Default path to agent-server executable\n */\nexport const DEFAULT_AGENT_SERVER_PATH =\n '/container-server/software-agent-sdk/.venv/bin/agent-server';\n\n/**\n * Default working directory for agent-server\n */\nexport const DEFAULT_AGENT_SERVER_DIR =\n '/container-server/software-agent-sdk';\n\n/**\n * Get the default agent-server executable path\n */\nexport function getDefaultAgentServerPath(): string {\n return DEFAULT_AGENT_SERVER_PATH;\n}\n\n/**\n * Get the default agent-server working directory\n */\nexport function getDefaultAgentServerDir(): string {\n return DEFAULT_AGENT_SERVER_DIR;\n}\n\n/**\n * Check if agent-server exists at the given path\n */\nexport async function checkAgentServerExists(\n sandbox: Sandbox<unknown>,\n path: string = DEFAULT_AGENT_SERVER_PATH\n): Promise<boolean> {\n try {\n const result = await sandbox.exec(\n `test -f ${path} && echo \"EXISTS\" || echo \"NOT_FOUND\"`\n );\n return result.stdout.trim() === 'EXISTS';\n } catch {\n return false;\n }\n}\n\n/**\n * Find agent-server executable by checking common locations\n */\nexport async function findAgentServerPath(\n sandbox: Sandbox<unknown>\n): Promise<string | null> {\n const locations = [\n DEFAULT_AGENT_SERVER_PATH,\n '/software-agent-sdk/.venv/bin/agent-server',\n '/root/software-agent-sdk/.venv/bin/agent-server',\n ];\n\n for (const location of locations) {\n if (await checkAgentServerExists(sandbox, location)) {\n return location;\n }\n }\n\n // Try which as fallback\n try {\n const result = await sandbox.exec('which agent-server');\n const path = result.stdout.trim();\n if (path && !path.includes('not found')) {\n return path;\n }\n } catch {\n // Ignore errors\n }\n\n return null;\n}\n\n/**\n * Build the agent-server command\n */\nexport function buildAgentServerCommand(\n port: number,\n directory?: string\n): string {\n const command = `${DEFAULT_AGENT_SERVER_PATH} --host 0.0.0.0 --port ${port}`;\n return directory && directory !== DEFAULT_AGENT_SERVER_DIR\n ? `cd ${directory} && ${command}`\n : command;\n}\n\n",
6
6
  "import type { Process } from '@cloudflare/sandbox';\n\n/**\n * Configuration options for starting OpenHands agent-server\n */\nexport interface OpenhandsOptions {\n /** Port for agent-server (default: 8001) */\n port?: number;\n /** Working directory for agent-server (default: /container-server/software-agent-sdk) */\n directory?: string;\n /** Hostname for preview URL exposure (required if exposePort is true) */\n hostname?: string;\n /** Enable preview URL exposure (default: false) */\n exposePort?: boolean;\n /** Environment variables for agent-server */\n env?: Record<string, string>;\n /** Sandbox name/session ID (default: 'my-sandbox') */\n sandboxName?: string;\n}\n\n/**\n * Server lifecycle management\n */\nexport interface OpenhandsServer {\n /** Port the server is running on */\n port: number;\n /** Base URL for server (http://localhost:{port}) */\n url: string;\n /** Preview URL if port was exposed (optional) */\n previewUrl?: string;\n /** Process ID */\n processId: string;\n /** Close the server gracefully */\n close(): Promise<void>;\n}\n\n/**\n * Context information for startup errors\n */\nexport interface OpenhandsStartupContext {\n port: number;\n stderr?: string;\n command?: string;\n processId?: string;\n}\n\n/**\n * Error thrown when agent-server fails to start\n */\nexport class OpenhandsStartupError extends Error {\n readonly code = 'OPENHANDS_STARTUP_FAILED' as const;\n readonly context: OpenhandsStartupContext;\n\n constructor(\n message: string,\n context: OpenhandsStartupContext,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = 'OpenhandsStartupError';\n this.context = context;\n }\n}\n\n",
7
7
  "import type { Sandbox, Process } from '@cloudflare/sandbox';\nimport type {\n OpenhandsOptions,\n OpenhandsServer,\n OpenhandsStartupContext,\n} from './types';\nimport { OpenhandsStartupError } from './types';\nimport {\n buildAgentServerCommand,\n DEFAULT_AGENT_SERVER_DIR,\n DEFAULT_AGENT_SERVER_PATH,\n} from '../utils/agent-server';\n\nconst DEFAULT_PORT = 8001;\n\n/**\n * Find an existing agent-server process running on the specified port.\n * Returns the process if found and still active, null otherwise.\n */\nasync function findExistingAgentServer(\n sandbox: Sandbox<unknown>,\n port: number\n): Promise<Process | null> {\n const processes = await sandbox.listProcesses();\n const commandPattern = DEFAULT_AGENT_SERVER_PATH;\n\n for (const proc of processes) {\n // Match commands that contain the agent-server path\n if (proc.command.includes(commandPattern)) {\n // Check if the command includes the port\n if (\n proc.command.includes(`--port ${port}`) ||\n proc.command.includes(`--port=${port}`)\n ) {\n if (proc.status === 'starting' || proc.status === 'running') {\n return proc;\n }\n }\n }\n }\n\n return null;\n}\n\n/**\n * Start a new agent-server process\n */\nasync function startAgentServer(\n sandbox: Sandbox<unknown>,\n port: number,\n options: OpenhandsOptions\n): Promise<Process> {\n const directory = options.directory || DEFAULT_AGENT_SERVER_DIR;\n const command = buildAgentServerCommand(port, directory);\n\n const process = await sandbox.startProcess(command, {\n cwd: directory,\n env: options.env,\n });\n\n // Wait for the server to be ready\n try {\n await process.waitForPort(port, {\n mode: 'http',\n path: '/',\n timeout: 60_000, // 60 seconds\n });\n } catch (e) {\n const logs = await process.getLogs();\n throw new OpenhandsStartupError(\n `agent-server failed to start on port ${port}. Stderr: ${logs.stderr || '(empty)'}`,\n {\n port,\n stderr: logs.stderr,\n command: process.command,\n processId: process.id,\n },\n { cause: e }\n );\n }\n\n return process;\n}\n\n/**\n * Ensures agent-server is running in the container.\n * Reuses existing process if one is already running on the specified port.\n * Handles concurrent startup attempts gracefully by retrying on failure.\n */\nasync function ensureAgentServer(\n sandbox: Sandbox<unknown>,\n port: number,\n options: OpenhandsOptions\n): Promise<Process> {\n // Check if agent-server is already running on this port\n const existingProcess = await findExistingAgentServer(sandbox, port);\n if (existingProcess) {\n // Reuse existing process - wait for it to be ready if still starting\n if (existingProcess.status === 'starting') {\n try {\n await existingProcess.waitForPort(port, {\n mode: 'http',\n path: '/',\n timeout: 60_000,\n });\n } catch (e) {\n const logs = await existingProcess.getLogs();\n throw new OpenhandsStartupError(\n `agent-server failed to start. Stderr: ${logs.stderr || '(empty)'}`,\n {\n port,\n stderr: logs.stderr,\n command: existingProcess.command,\n processId: existingProcess.id,\n },\n { cause: e }\n );\n }\n }\n return existingProcess;\n }\n\n // Try to start a new agent-server\n try {\n return await startAgentServer(sandbox, port, options);\n } catch (startupError) {\n // Startup failed - check if another concurrent request started the server\n // This handles the race condition where multiple requests try to start simultaneously\n const retryProcess = await findExistingAgentServer(sandbox, port);\n if (retryProcess) {\n // Wait for the concurrent server to be ready\n if (retryProcess.status === 'starting') {\n try {\n await retryProcess.waitForPort(port, {\n mode: 'http',\n path: '/',\n timeout: 60_000,\n });\n } catch (e) {\n const logs = await retryProcess.getLogs();\n throw new OpenhandsStartupError(\n `agent-server failed to start. Stderr: ${logs.stderr || '(empty)'}`,\n {\n port,\n stderr: logs.stderr,\n command: retryProcess.command,\n processId: retryProcess.id,\n },\n { cause: e }\n );\n }\n }\n return retryProcess;\n }\n\n // No concurrent process found, rethrow the original error\n throw startupError;\n }\n}\n\n/**\n * Starts an agent-server inside a Sandbox container.\n *\n * This function manages the server lifecycle only. If an agent-server is already\n * running on the specified port, this function will reuse it instead of starting\n * a new one.\n *\n * @param sandbox - The Sandbox instance to run agent-server in\n * @param options - Configuration options\n * @returns Promise resolving to server handle { port, url, previewUrl?, close() }\n *\n * @example\n * ```typescript\n * import { getSandbox } from '@cloudflare/sandbox'\n * import { createOpenhandsServer } from 'openhands-sdk/openhands'\n *\n * const sandbox = getSandbox(env.Sandbox, 'my-sandbox')\n * const server = await createOpenhandsServer(sandbox, {\n * port: 8001,\n * exposePort: true,\n * hostname: 'yourdomain.com'\n * })\n *\n * // Proxy requests to the server\n * return sandbox.containerFetch(request, server.port)\n *\n * // When done\n * await server.close()\n * ```\n */\nexport async function createOpenhandsServer(\n sandbox: Sandbox<unknown>,\n options: OpenhandsOptions = {}\n): Promise<OpenhandsServer> {\n const port = options.port ?? DEFAULT_PORT;\n const process = await ensureAgentServer(sandbox, port, options);\n\n let previewUrl: string | undefined;\n\n // Optionally expose port for preview URL\n if (options.exposePort) {\n if (!options.hostname) {\n throw new Error(\n 'hostname is required when exposePort is true. Provide hostname in options or extract from request URL.'\n );\n }\n\n try {\n const exposed = await sandbox.exposePort(port, {\n hostname: options.hostname,\n });\n previewUrl = typeof exposed === 'string' ? exposed : exposed.url;\n } catch (error) {\n // Log but don't fail - server is still running\n console.warn('Failed to expose port:', error);\n }\n }\n\n return {\n port,\n url: `http://localhost:${port}`,\n previewUrl,\n processId: process.id,\n async close() {\n await process.kill('SIGTERM');\n },\n };\n}\n\n/**\n * Proxy a request to the agent-server.\n *\n * This function handles proxying only - you must start the server separately\n * using `createOpenhandsServer()`.\n *\n * @param request - The incoming HTTP request\n * @param sandbox - The Sandbox instance running agent-server\n * @param server - The agent-server handle from createOpenhandsServer()\n * @returns Response from agent-server\n *\n * @example\n * ```typescript\n * import { getSandbox } from '@cloudflare/sandbox'\n * import { createOpenhandsServer, proxyToOpenhands } from 'openhands-sdk/openhands'\n *\n * export default {\n * async fetch(request: Request, env: Env) {\n * const sandbox = getSandbox(env.Sandbox, 'my-sandbox')\n * const server = await createOpenhandsServer(sandbox, {\n * port: 8001,\n * exposePort: true,\n * hostname: 'yourdomain.com'\n * })\n * return proxyToOpenhands(request, sandbox, server)\n * }\n * }\n * ```\n */\nexport function proxyToOpenhands(\n request: Request,\n sandbox: Sandbox<unknown>,\n server: OpenhandsServer\n): Response | Promise<Response> {\n return sandbox.containerFetch(request, server.port);\n}\n\n",
8
- "import { getSandbox, proxyToSandbox } from '@cloudflare/sandbox';\nimport type { Sandbox } from '@cloudflare/sandbox';\nimport {\n createOpenhandsServer,\n proxyToOpenhands,\n type OpenhandsOptions,\n type OpenhandsServer,\n} from '../openhands';\nimport { DEFAULT_AGENT_SERVER_PATH } from '../utils/agent-server';\n\n// Cloudflare Workers environment type constraint\n// Accepts any Env type that has a Sandbox property compatible with DurableObjectNamespace\n// This is a minimal structural type that matches what getSandbox and proxyToSandbox need\n// Using a more permissive type that accepts any object with the required structure\nexport type OpenhandsEnv = {\n Sandbox: {\n get(id: { toString(): string }): {\n fetch(input: string | Request, init?: RequestInit): Promise<Response>;\n };\n };\n};\n\n/**\n * Options for OpenHands route handler\n */\nexport interface OpenhandsHandlerOptions extends OpenhandsOptions {\n /** Base path for OpenHands routes (default: '') */\n basePath?: string;\n /** Custom sandbox name resolver */\n getSandboxName?: (request: Request) => string | null;\n}\n\n/**\n * Find existing OpenHands server by port\n */\nasync function findOpenhandsServer(\n sandbox: Sandbox<unknown>,\n port: number\n): Promise<OpenhandsServer | null> {\n const processes = await sandbox.listProcesses();\n\n for (const process of processes) {\n // Match agent-server processes on the specified port\n if (\n process.command.includes(DEFAULT_AGENT_SERVER_PATH) &&\n (process.command.includes(`--port ${port}`) ||\n process.command.includes(`--port=${port}`)) &&\n (process.status === 'running' || process.status === 'starting')\n ) {\n // Try to get exposed ports to find preview URL\n let previewUrl: string | undefined;\n try {\n // Try to get exposed ports - hostname is optional\n const exposedPorts = await sandbox.getExposedPorts('');\n const exposed = exposedPorts.find((p) => p.port === port);\n if (exposed) {\n previewUrl = exposed.url;\n }\n } catch {\n // Ignore errors getting exposed ports\n }\n\n return {\n port,\n url: `http://localhost:${port}`,\n previewUrl,\n processId: process.id,\n async close() {\n await process.kill('SIGTERM');\n },\n };\n }\n }\n\n return null;\n}\n\n/**\n * Creates a middleware function that handles OpenHands routes.\n * Returns null if the request doesn't match OpenHands routes (allows chaining).\n *\n * @param options - Configuration options\n * @returns Middleware function\n */\nexport function createOpenhandsHandler<Env extends OpenhandsEnv = OpenhandsEnv>(\n options: OpenhandsHandlerOptions = {}\n) {\n const basePath = options.basePath || '';\n const getSandboxName = options.getSandboxName || ((req) => {\n const url = new URL(req.url);\n return url.searchParams.get('sandbox');\n });\n\n return async (\n request: Request,\n env: Env\n ): Promise<Response | null> => {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Extract sandbox name\n const sandboxName = getSandboxName(request) || options.sandboxName || 'my-sandbox';\n const sandbox = getSandbox(env.Sandbox, sandboxName);\n\n // Handle preview URL proxying (must be first)\n const proxyResponse = await proxyToSandbox(request, env);\n if (proxyResponse) {\n return proxyResponse;\n }\n\n // Handle OpenHands routes\n if (pathname === `${basePath}/start-openhands`) {\n try {\n // Extract hostname from request if not provided\n const hostname = options.hostname || url.hostname;\n\n const server = await createOpenhandsServer(sandbox, {\n ...options,\n hostname: options.exposePort ? hostname : undefined,\n });\n\n return Response.json({\n process: {\n id: server.processId,\n port: server.port,\n status: 'running',\n },\n previewUrl: server.previewUrl\n ? { url: server.previewUrl, port: server.port }\n : undefined,\n success: true,\n });\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n if (pathname === `${basePath}/stop-openhands`) {\n try {\n const port = options.port ?? 8001;\n const server = await findOpenhandsServer(sandbox, port);\n if (server) {\n await server.close();\n return Response.json({ success: true, message: 'Server stopped' });\n }\n return Response.json(\n { success: false, message: 'No server running' },\n { status: 404 }\n );\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n if (pathname === `${basePath}/openhands-status`) {\n try {\n const port = options.port ?? 8001;\n const server = await findOpenhandsServer(sandbox, port);\n if (!server) {\n return Response.json({\n running: false,\n success: true,\n });\n }\n\n // Verify process is still running\n const processes = await sandbox.listProcesses();\n const process = processes.find((p) => p.id === server.processId);\n\n return Response.json({\n running: process?.status === 'running',\n port: server.port,\n previewUrl: server.previewUrl,\n process: process\n ? {\n id: process.id,\n status: process.status,\n command: process.command,\n }\n : null,\n success: true,\n });\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n // Request doesn't match OpenHands routes\n return null;\n };\n}\n\n/**\n * Attaches OpenHands routes to an existing fetch handler.\n * This wraps your handler with OpenHands route handling and preview URL proxying.\n *\n * @param fetchHandler - Your existing fetch handler\n * @param options - Configuration options\n * @returns Wrapped fetch handler\n *\n * @example\n * ```typescript\n * import { attachOpenhandsRoutes } from 'openhands-sdk/routes';\n *\n * export default attachOpenhandsRoutes(async (request, env) => {\n * // Your custom routes here\n * return new Response('Not found', { status: 404 });\n * }, {\n * port: 8001,\n * exposePort: true,\n * hostname: 'yourdomain.com'\n * });\n * ```\n */\nexport function attachOpenhandsRoutes<Env extends OpenhandsEnv = OpenhandsEnv>(\n fetchHandler: (\n request: Request,\n env: Env\n ) => Response | Promise<Response>,\n options: OpenhandsHandlerOptions = {}\n): (\n request: Request,\n env: Env\n) => Promise<Response> {\n const openhandsHandler = createOpenhandsHandler<Env>(options);\n\n return async (\n request: Request,\n env: Env\n ): Promise<Response> => {\n // First, try OpenHands handler\n const openhandsResponse = await openhandsHandler(request, env);\n if (openhandsResponse !== null) {\n return openhandsResponse;\n }\n\n // Fall through to user's handler\n return fetchHandler(request, env);\n };\n}\n\n"
8
+ "import { getSandbox, proxyToSandbox } from '@cloudflare/sandbox';\nimport type { Sandbox } from '@cloudflare/sandbox';\nimport {\n createOpenhandsServer,\n proxyToOpenhands,\n type OpenhandsOptions,\n type OpenhandsServer,\n} from '../openhands';\nimport { DEFAULT_AGENT_SERVER_PATH } from '../utils/agent-server';\n\n// Cloudflare Workers environment type constraint\n// Accepts any Env type that has a Sandbox property compatible with DurableObjectNamespace\n// This is a minimal structural type that matches what getSandbox and proxyToSandbox need\n// Using a more permissive type that accepts any object with the required structure\nexport type OpenhandsEnv = {\n Sandbox: {\n get(id: { toString(): string }): {\n fetch(input: string | Request, init?: RequestInit): Promise<Response>;\n };\n };\n};\n\n/**\n * Options for OpenHands route handler\n */\nexport interface OpenhandsHandlerOptions extends OpenhandsOptions {\n /** Base path for OpenHands routes (default: '') */\n basePath?: string;\n /** Custom sandbox name resolver */\n getSandboxName?: (request: Request) => string | null;\n}\n\n/**\n * Find existing OpenHands server by port\n */\nasync function findOpenhandsServer(\n sandbox: Sandbox<unknown>,\n port: number\n): Promise<OpenhandsServer | null> {\n const processes = await sandbox.listProcesses();\n\n for (const process of processes) {\n // Match agent-server processes on the specified port\n if (\n process.command.includes(DEFAULT_AGENT_SERVER_PATH) &&\n (process.command.includes(`--port ${port}`) ||\n process.command.includes(`--port=${port}`)) &&\n (process.status === 'running' || process.status === 'starting')\n ) {\n // Try to get exposed ports to find preview URL\n let previewUrl: string | undefined;\n try {\n // Try to get exposed ports - hostname is optional\n const exposedPorts = await sandbox.getExposedPorts('');\n const exposed = exposedPorts.find((p) => p.port === port);\n if (exposed) {\n previewUrl = exposed.url;\n }\n } catch {\n // Ignore errors getting exposed ports\n }\n\n return {\n port,\n url: `http://localhost:${port}`,\n previewUrl,\n processId: process.id,\n async close() {\n await process.kill('SIGTERM');\n },\n };\n }\n }\n\n return null;\n}\n\n/**\n * Creates a middleware function that handles OpenHands routes.\n * Returns null if the request doesn't match OpenHands routes (allows chaining).\n *\n * @param options - Configuration options\n * @returns Middleware function\n */\nexport function createOpenhandsHandler<Env extends OpenhandsEnv = OpenhandsEnv>(\n options: OpenhandsHandlerOptions = {}\n) {\n const basePath = options.basePath || '';\n const getSandboxName = options.getSandboxName || ((req) => {\n const url = new URL(req.url);\n return url.searchParams.get('sandbox');\n });\n\n return async (\n request: Request,\n env: Env\n ): Promise<Response | null> => {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Extract sandbox name\n const sandboxName = getSandboxName(request) || options.sandboxName || 'my-sandbox';\n const sandbox = getSandbox(env.Sandbox, sandboxName);\n\n // Handle preview URL proxying (must be first)\n const proxyResponse = await proxyToSandbox(request, env);\n if (proxyResponse) {\n return proxyResponse;\n }\n\n // Handle OpenHands routes\n if (pathname === `${basePath}/start-openhands`) {\n try {\n // Extract hostname from request if not provided\n const hostname = options.hostname || url.hostname;\n\n const server = await createOpenhandsServer(sandbox, {\n ...options,\n hostname: options.exposePort ? hostname : undefined,\n });\n\n return Response.json({\n process: {\n id: server.processId,\n port: server.port,\n status: 'running',\n },\n previewUrl: server.previewUrl\n ? { url: server.previewUrl, port: server.port }\n : undefined,\n success: true,\n });\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n if (pathname === `${basePath}/stop-openhands`) {\n try {\n const port = options.port ?? 8001;\n const server = await findOpenhandsServer(sandbox, port);\n if (server) {\n await server.close();\n return Response.json({ success: true, message: 'Server stopped' });\n }\n return Response.json(\n { success: false, message: 'No server running' },\n { status: 404 }\n );\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n if (pathname === `${basePath}/openhands-status`) {\n try {\n const port = options.port ?? 8001;\n const server = await findOpenhandsServer(sandbox, port);\n if (!server) {\n return Response.json({\n running: false,\n success: true,\n });\n }\n\n // Verify process is still running\n const processes = await sandbox.listProcesses();\n const process = processes.find((p) => p.id === server.processId);\n\n return Response.json({\n running: process?.status === 'running',\n port: server.port,\n previewUrl: server.previewUrl,\n process: process\n ? {\n id: process.id,\n status: process.status,\n command: process.command,\n }\n : null,\n success: true,\n });\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n // Request doesn't match OpenHands routes\n return null;\n };\n}\n\n/**\n * Attaches OpenHands routes to an existing fetch handler.\n * This wraps your handler with OpenHands route handling and preview URL proxying.\n *\n * @param fetchHandler - Your existing fetch handler\n * @param options - Configuration options\n * @returns Wrapped fetch handler\n *\n * @example\n * ```typescript\n * import { attachOpenhandsRoutes } from 'openhands-sdk/routes';\n *\n * export default attachOpenhandsRoutes(async (request, env) => {\n * // Your custom routes here\n * return new Response('Not found', { status: 404 });\n * }, {\n * port: 8001,\n * exposePort: true,\n * hostname: 'yourdomain.com'\n * });\n * ```\n */\nexport function attachOpenhandsRoutes<Env extends OpenhandsEnv = OpenhandsEnv>(\n fetchHandler: (\n request: Request,\n env: Env\n ) => Response | Promise<Response>,\n options: OpenhandsHandlerOptions = {}\n): {\n fetch: (request: Request, env: Env) => Promise<Response>;\n} {\n const openhandsHandler = createOpenhandsHandler<Env>(options);\n\n return {\n fetch: async (\n request: Request,\n env: Env\n ): Promise<Response> => {\n // First, try OpenHands handler\n const openhandsResponse = await openhandsHandler(request, env);\n if (openhandsResponse !== null) {\n return openhandsResponse;\n }\n\n // Fall through to user's handler\n return fetchHandler(request, env);\n },\n };\n}\n\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "B9FBDAC5E93D00D564756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "09928E128FAF5D9D64756E2164756E21",
12
12
  "names": []
13
13
  }
@@ -47,5 +47,7 @@ export declare function createOpenhandsHandler<Env extends OpenhandsEnv = Openha
47
47
  * });
48
48
  * ```
49
49
  */
50
- export declare function attachOpenhandsRoutes<Env extends OpenhandsEnv = OpenhandsEnv>(fetchHandler: (request: Request, env: Env) => Response | Promise<Response>, options?: OpenhandsHandlerOptions): (request: Request, env: Env) => Promise<Response>;
50
+ export declare function attachOpenhandsRoutes<Env extends OpenhandsEnv = OpenhandsEnv>(fetchHandler: (request: Request, env: Env) => Response | Promise<Response>, options?: OpenhandsHandlerOptions): {
51
+ fetch: (request: Request, env: Env) => Promise<Response>;
52
+ };
51
53
  //# sourceMappingURL=handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/routes/handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,gBAAgB,EAEtB,MAAM,cAAc,CAAC;AAOtB,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,EAAE;YAAE,QAAQ,IAAI,MAAM,CAAA;SAAE,GAAG;YAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;SACvE,CAAC;KACH,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;CACtD;AA+CD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,SAAS,YAAY,GAAG,YAAY,EAC5E,OAAO,GAAE,uBAA4B,IASnC,SAAS,OAAO,EAChB,KAAK,GAAG,KACP,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAiH5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,SAAS,YAAY,GAAG,YAAY,EAC3E,YAAY,EAAE,CACZ,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,KACL,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,EACjC,OAAO,GAAE,uBAA4B,GACpC,CACD,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,KACL,OAAO,CAAC,QAAQ,CAAC,CAgBrB"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/routes/handler.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,gBAAgB,EAEtB,MAAM,cAAc,CAAC;AAOtB,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,EAAE;YAAE,QAAQ,IAAI,MAAM,CAAA;SAAE,GAAG;YAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;SACvE,CAAC;KACH,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,gBAAgB;IAC/D,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;CACtD;AA+CD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,SAAS,YAAY,GAAG,YAAY,EAC5E,OAAO,GAAE,uBAA4B,IASnC,SAAS,OAAO,EAChB,KAAK,GAAG,KACP,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAiH5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,SAAS,YAAY,GAAG,YAAY,EAC3E,YAAY,EAAE,CACZ,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,KACL,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,EACjC,OAAO,GAAE,uBAA4B,GACpC;IACD,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC1D,CAkBA"}
@@ -286,12 +286,14 @@ function createOpenhandsHandler(options = {}) {
286
286
  }
287
287
  function attachOpenhandsRoutes(fetchHandler, options = {}) {
288
288
  const openhandsHandler = createOpenhandsHandler(options);
289
- return async (request, env) => {
290
- const openhandsResponse = await openhandsHandler(request, env);
291
- if (openhandsResponse !== null) {
292
- return openhandsResponse;
289
+ return {
290
+ fetch: async (request, env) => {
291
+ const openhandsResponse = await openhandsHandler(request, env);
292
+ if (openhandsResponse !== null) {
293
+ return openhandsResponse;
294
+ }
295
+ return fetchHandler(request, env);
293
296
  }
294
- return fetchHandler(request, env);
295
297
  };
296
298
  }
297
299
  export {
@@ -299,4 +301,4 @@ export {
299
301
  attachOpenhandsRoutes
300
302
  };
301
303
 
302
- //# debugId=90B6CB75CEE3F17464756E2164756E21
304
+ //# debugId=813BCCE007B8828364756E2164756E21
@@ -5,9 +5,9 @@
5
5
  "import type { Sandbox } from '@cloudflare/sandbox';\n\n/**\n * Default path to agent-server executable\n */\nexport const DEFAULT_AGENT_SERVER_PATH =\n '/container-server/software-agent-sdk/.venv/bin/agent-server';\n\n/**\n * Default working directory for agent-server\n */\nexport const DEFAULT_AGENT_SERVER_DIR =\n '/container-server/software-agent-sdk';\n\n/**\n * Get the default agent-server executable path\n */\nexport function getDefaultAgentServerPath(): string {\n return DEFAULT_AGENT_SERVER_PATH;\n}\n\n/**\n * Get the default agent-server working directory\n */\nexport function getDefaultAgentServerDir(): string {\n return DEFAULT_AGENT_SERVER_DIR;\n}\n\n/**\n * Check if agent-server exists at the given path\n */\nexport async function checkAgentServerExists(\n sandbox: Sandbox<unknown>,\n path: string = DEFAULT_AGENT_SERVER_PATH\n): Promise<boolean> {\n try {\n const result = await sandbox.exec(\n `test -f ${path} && echo \"EXISTS\" || echo \"NOT_FOUND\"`\n );\n return result.stdout.trim() === 'EXISTS';\n } catch {\n return false;\n }\n}\n\n/**\n * Find agent-server executable by checking common locations\n */\nexport async function findAgentServerPath(\n sandbox: Sandbox<unknown>\n): Promise<string | null> {\n const locations = [\n DEFAULT_AGENT_SERVER_PATH,\n '/software-agent-sdk/.venv/bin/agent-server',\n '/root/software-agent-sdk/.venv/bin/agent-server',\n ];\n\n for (const location of locations) {\n if (await checkAgentServerExists(sandbox, location)) {\n return location;\n }\n }\n\n // Try which as fallback\n try {\n const result = await sandbox.exec('which agent-server');\n const path = result.stdout.trim();\n if (path && !path.includes('not found')) {\n return path;\n }\n } catch {\n // Ignore errors\n }\n\n return null;\n}\n\n/**\n * Build the agent-server command\n */\nexport function buildAgentServerCommand(\n port: number,\n directory?: string\n): string {\n const command = `${DEFAULT_AGENT_SERVER_PATH} --host 0.0.0.0 --port ${port}`;\n return directory && directory !== DEFAULT_AGENT_SERVER_DIR\n ? `cd ${directory} && ${command}`\n : command;\n}\n\n",
6
6
  "import type { Process } from '@cloudflare/sandbox';\n\n/**\n * Configuration options for starting OpenHands agent-server\n */\nexport interface OpenhandsOptions {\n /** Port for agent-server (default: 8001) */\n port?: number;\n /** Working directory for agent-server (default: /container-server/software-agent-sdk) */\n directory?: string;\n /** Hostname for preview URL exposure (required if exposePort is true) */\n hostname?: string;\n /** Enable preview URL exposure (default: false) */\n exposePort?: boolean;\n /** Environment variables for agent-server */\n env?: Record<string, string>;\n /** Sandbox name/session ID (default: 'my-sandbox') */\n sandboxName?: string;\n}\n\n/**\n * Server lifecycle management\n */\nexport interface OpenhandsServer {\n /** Port the server is running on */\n port: number;\n /** Base URL for server (http://localhost:{port}) */\n url: string;\n /** Preview URL if port was exposed (optional) */\n previewUrl?: string;\n /** Process ID */\n processId: string;\n /** Close the server gracefully */\n close(): Promise<void>;\n}\n\n/**\n * Context information for startup errors\n */\nexport interface OpenhandsStartupContext {\n port: number;\n stderr?: string;\n command?: string;\n processId?: string;\n}\n\n/**\n * Error thrown when agent-server fails to start\n */\nexport class OpenhandsStartupError extends Error {\n readonly code = 'OPENHANDS_STARTUP_FAILED' as const;\n readonly context: OpenhandsStartupContext;\n\n constructor(\n message: string,\n context: OpenhandsStartupContext,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = 'OpenhandsStartupError';\n this.context = context;\n }\n}\n\n",
7
7
  "import type { Sandbox, Process } from '@cloudflare/sandbox';\nimport type {\n OpenhandsOptions,\n OpenhandsServer,\n OpenhandsStartupContext,\n} from './types';\nimport { OpenhandsStartupError } from './types';\nimport {\n buildAgentServerCommand,\n DEFAULT_AGENT_SERVER_DIR,\n DEFAULT_AGENT_SERVER_PATH,\n} from '../utils/agent-server';\n\nconst DEFAULT_PORT = 8001;\n\n/**\n * Find an existing agent-server process running on the specified port.\n * Returns the process if found and still active, null otherwise.\n */\nasync function findExistingAgentServer(\n sandbox: Sandbox<unknown>,\n port: number\n): Promise<Process | null> {\n const processes = await sandbox.listProcesses();\n const commandPattern = DEFAULT_AGENT_SERVER_PATH;\n\n for (const proc of processes) {\n // Match commands that contain the agent-server path\n if (proc.command.includes(commandPattern)) {\n // Check if the command includes the port\n if (\n proc.command.includes(`--port ${port}`) ||\n proc.command.includes(`--port=${port}`)\n ) {\n if (proc.status === 'starting' || proc.status === 'running') {\n return proc;\n }\n }\n }\n }\n\n return null;\n}\n\n/**\n * Start a new agent-server process\n */\nasync function startAgentServer(\n sandbox: Sandbox<unknown>,\n port: number,\n options: OpenhandsOptions\n): Promise<Process> {\n const directory = options.directory || DEFAULT_AGENT_SERVER_DIR;\n const command = buildAgentServerCommand(port, directory);\n\n const process = await sandbox.startProcess(command, {\n cwd: directory,\n env: options.env,\n });\n\n // Wait for the server to be ready\n try {\n await process.waitForPort(port, {\n mode: 'http',\n path: '/',\n timeout: 60_000, // 60 seconds\n });\n } catch (e) {\n const logs = await process.getLogs();\n throw new OpenhandsStartupError(\n `agent-server failed to start on port ${port}. Stderr: ${logs.stderr || '(empty)'}`,\n {\n port,\n stderr: logs.stderr,\n command: process.command,\n processId: process.id,\n },\n { cause: e }\n );\n }\n\n return process;\n}\n\n/**\n * Ensures agent-server is running in the container.\n * Reuses existing process if one is already running on the specified port.\n * Handles concurrent startup attempts gracefully by retrying on failure.\n */\nasync function ensureAgentServer(\n sandbox: Sandbox<unknown>,\n port: number,\n options: OpenhandsOptions\n): Promise<Process> {\n // Check if agent-server is already running on this port\n const existingProcess = await findExistingAgentServer(sandbox, port);\n if (existingProcess) {\n // Reuse existing process - wait for it to be ready if still starting\n if (existingProcess.status === 'starting') {\n try {\n await existingProcess.waitForPort(port, {\n mode: 'http',\n path: '/',\n timeout: 60_000,\n });\n } catch (e) {\n const logs = await existingProcess.getLogs();\n throw new OpenhandsStartupError(\n `agent-server failed to start. Stderr: ${logs.stderr || '(empty)'}`,\n {\n port,\n stderr: logs.stderr,\n command: existingProcess.command,\n processId: existingProcess.id,\n },\n { cause: e }\n );\n }\n }\n return existingProcess;\n }\n\n // Try to start a new agent-server\n try {\n return await startAgentServer(sandbox, port, options);\n } catch (startupError) {\n // Startup failed - check if another concurrent request started the server\n // This handles the race condition where multiple requests try to start simultaneously\n const retryProcess = await findExistingAgentServer(sandbox, port);\n if (retryProcess) {\n // Wait for the concurrent server to be ready\n if (retryProcess.status === 'starting') {\n try {\n await retryProcess.waitForPort(port, {\n mode: 'http',\n path: '/',\n timeout: 60_000,\n });\n } catch (e) {\n const logs = await retryProcess.getLogs();\n throw new OpenhandsStartupError(\n `agent-server failed to start. Stderr: ${logs.stderr || '(empty)'}`,\n {\n port,\n stderr: logs.stderr,\n command: retryProcess.command,\n processId: retryProcess.id,\n },\n { cause: e }\n );\n }\n }\n return retryProcess;\n }\n\n // No concurrent process found, rethrow the original error\n throw startupError;\n }\n}\n\n/**\n * Starts an agent-server inside a Sandbox container.\n *\n * This function manages the server lifecycle only. If an agent-server is already\n * running on the specified port, this function will reuse it instead of starting\n * a new one.\n *\n * @param sandbox - The Sandbox instance to run agent-server in\n * @param options - Configuration options\n * @returns Promise resolving to server handle { port, url, previewUrl?, close() }\n *\n * @example\n * ```typescript\n * import { getSandbox } from '@cloudflare/sandbox'\n * import { createOpenhandsServer } from 'openhands-sdk/openhands'\n *\n * const sandbox = getSandbox(env.Sandbox, 'my-sandbox')\n * const server = await createOpenhandsServer(sandbox, {\n * port: 8001,\n * exposePort: true,\n * hostname: 'yourdomain.com'\n * })\n *\n * // Proxy requests to the server\n * return sandbox.containerFetch(request, server.port)\n *\n * // When done\n * await server.close()\n * ```\n */\nexport async function createOpenhandsServer(\n sandbox: Sandbox<unknown>,\n options: OpenhandsOptions = {}\n): Promise<OpenhandsServer> {\n const port = options.port ?? DEFAULT_PORT;\n const process = await ensureAgentServer(sandbox, port, options);\n\n let previewUrl: string | undefined;\n\n // Optionally expose port for preview URL\n if (options.exposePort) {\n if (!options.hostname) {\n throw new Error(\n 'hostname is required when exposePort is true. Provide hostname in options or extract from request URL.'\n );\n }\n\n try {\n const exposed = await sandbox.exposePort(port, {\n hostname: options.hostname,\n });\n previewUrl = typeof exposed === 'string' ? exposed : exposed.url;\n } catch (error) {\n // Log but don't fail - server is still running\n console.warn('Failed to expose port:', error);\n }\n }\n\n return {\n port,\n url: `http://localhost:${port}`,\n previewUrl,\n processId: process.id,\n async close() {\n await process.kill('SIGTERM');\n },\n };\n}\n\n/**\n * Proxy a request to the agent-server.\n *\n * This function handles proxying only - you must start the server separately\n * using `createOpenhandsServer()`.\n *\n * @param request - The incoming HTTP request\n * @param sandbox - The Sandbox instance running agent-server\n * @param server - The agent-server handle from createOpenhandsServer()\n * @returns Response from agent-server\n *\n * @example\n * ```typescript\n * import { getSandbox } from '@cloudflare/sandbox'\n * import { createOpenhandsServer, proxyToOpenhands } from 'openhands-sdk/openhands'\n *\n * export default {\n * async fetch(request: Request, env: Env) {\n * const sandbox = getSandbox(env.Sandbox, 'my-sandbox')\n * const server = await createOpenhandsServer(sandbox, {\n * port: 8001,\n * exposePort: true,\n * hostname: 'yourdomain.com'\n * })\n * return proxyToOpenhands(request, sandbox, server)\n * }\n * }\n * ```\n */\nexport function proxyToOpenhands(\n request: Request,\n sandbox: Sandbox<unknown>,\n server: OpenhandsServer\n): Response | Promise<Response> {\n return sandbox.containerFetch(request, server.port);\n}\n\n",
8
- "import { getSandbox, proxyToSandbox } from '@cloudflare/sandbox';\nimport type { Sandbox } from '@cloudflare/sandbox';\nimport {\n createOpenhandsServer,\n proxyToOpenhands,\n type OpenhandsOptions,\n type OpenhandsServer,\n} from '../openhands';\nimport { DEFAULT_AGENT_SERVER_PATH } from '../utils/agent-server';\n\n// Cloudflare Workers environment type constraint\n// Accepts any Env type that has a Sandbox property compatible with DurableObjectNamespace\n// This is a minimal structural type that matches what getSandbox and proxyToSandbox need\n// Using a more permissive type that accepts any object with the required structure\nexport type OpenhandsEnv = {\n Sandbox: {\n get(id: { toString(): string }): {\n fetch(input: string | Request, init?: RequestInit): Promise<Response>;\n };\n };\n};\n\n/**\n * Options for OpenHands route handler\n */\nexport interface OpenhandsHandlerOptions extends OpenhandsOptions {\n /** Base path for OpenHands routes (default: '') */\n basePath?: string;\n /** Custom sandbox name resolver */\n getSandboxName?: (request: Request) => string | null;\n}\n\n/**\n * Find existing OpenHands server by port\n */\nasync function findOpenhandsServer(\n sandbox: Sandbox<unknown>,\n port: number\n): Promise<OpenhandsServer | null> {\n const processes = await sandbox.listProcesses();\n\n for (const process of processes) {\n // Match agent-server processes on the specified port\n if (\n process.command.includes(DEFAULT_AGENT_SERVER_PATH) &&\n (process.command.includes(`--port ${port}`) ||\n process.command.includes(`--port=${port}`)) &&\n (process.status === 'running' || process.status === 'starting')\n ) {\n // Try to get exposed ports to find preview URL\n let previewUrl: string | undefined;\n try {\n // Try to get exposed ports - hostname is optional\n const exposedPorts = await sandbox.getExposedPorts('');\n const exposed = exposedPorts.find((p) => p.port === port);\n if (exposed) {\n previewUrl = exposed.url;\n }\n } catch {\n // Ignore errors getting exposed ports\n }\n\n return {\n port,\n url: `http://localhost:${port}`,\n previewUrl,\n processId: process.id,\n async close() {\n await process.kill('SIGTERM');\n },\n };\n }\n }\n\n return null;\n}\n\n/**\n * Creates a middleware function that handles OpenHands routes.\n * Returns null if the request doesn't match OpenHands routes (allows chaining).\n *\n * @param options - Configuration options\n * @returns Middleware function\n */\nexport function createOpenhandsHandler<Env extends OpenhandsEnv = OpenhandsEnv>(\n options: OpenhandsHandlerOptions = {}\n) {\n const basePath = options.basePath || '';\n const getSandboxName = options.getSandboxName || ((req) => {\n const url = new URL(req.url);\n return url.searchParams.get('sandbox');\n });\n\n return async (\n request: Request,\n env: Env\n ): Promise<Response | null> => {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Extract sandbox name\n const sandboxName = getSandboxName(request) || options.sandboxName || 'my-sandbox';\n const sandbox = getSandbox(env.Sandbox, sandboxName);\n\n // Handle preview URL proxying (must be first)\n const proxyResponse = await proxyToSandbox(request, env);\n if (proxyResponse) {\n return proxyResponse;\n }\n\n // Handle OpenHands routes\n if (pathname === `${basePath}/start-openhands`) {\n try {\n // Extract hostname from request if not provided\n const hostname = options.hostname || url.hostname;\n\n const server = await createOpenhandsServer(sandbox, {\n ...options,\n hostname: options.exposePort ? hostname : undefined,\n });\n\n return Response.json({\n process: {\n id: server.processId,\n port: server.port,\n status: 'running',\n },\n previewUrl: server.previewUrl\n ? { url: server.previewUrl, port: server.port }\n : undefined,\n success: true,\n });\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n if (pathname === `${basePath}/stop-openhands`) {\n try {\n const port = options.port ?? 8001;\n const server = await findOpenhandsServer(sandbox, port);\n if (server) {\n await server.close();\n return Response.json({ success: true, message: 'Server stopped' });\n }\n return Response.json(\n { success: false, message: 'No server running' },\n { status: 404 }\n );\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n if (pathname === `${basePath}/openhands-status`) {\n try {\n const port = options.port ?? 8001;\n const server = await findOpenhandsServer(sandbox, port);\n if (!server) {\n return Response.json({\n running: false,\n success: true,\n });\n }\n\n // Verify process is still running\n const processes = await sandbox.listProcesses();\n const process = processes.find((p) => p.id === server.processId);\n\n return Response.json({\n running: process?.status === 'running',\n port: server.port,\n previewUrl: server.previewUrl,\n process: process\n ? {\n id: process.id,\n status: process.status,\n command: process.command,\n }\n : null,\n success: true,\n });\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n // Request doesn't match OpenHands routes\n return null;\n };\n}\n\n/**\n * Attaches OpenHands routes to an existing fetch handler.\n * This wraps your handler with OpenHands route handling and preview URL proxying.\n *\n * @param fetchHandler - Your existing fetch handler\n * @param options - Configuration options\n * @returns Wrapped fetch handler\n *\n * @example\n * ```typescript\n * import { attachOpenhandsRoutes } from 'openhands-sdk/routes';\n *\n * export default attachOpenhandsRoutes(async (request, env) => {\n * // Your custom routes here\n * return new Response('Not found', { status: 404 });\n * }, {\n * port: 8001,\n * exposePort: true,\n * hostname: 'yourdomain.com'\n * });\n * ```\n */\nexport function attachOpenhandsRoutes<Env extends OpenhandsEnv = OpenhandsEnv>(\n fetchHandler: (\n request: Request,\n env: Env\n ) => Response | Promise<Response>,\n options: OpenhandsHandlerOptions = {}\n): (\n request: Request,\n env: Env\n) => Promise<Response> {\n const openhandsHandler = createOpenhandsHandler<Env>(options);\n\n return async (\n request: Request,\n env: Env\n ): Promise<Response> => {\n // First, try OpenHands handler\n const openhandsResponse = await openhandsHandler(request, env);\n if (openhandsResponse !== null) {\n return openhandsResponse;\n }\n\n // Fall through to user's handler\n return fetchHandler(request, env);\n };\n}\n\n"
8
+ "import { getSandbox, proxyToSandbox } from '@cloudflare/sandbox';\nimport type { Sandbox } from '@cloudflare/sandbox';\nimport {\n createOpenhandsServer,\n proxyToOpenhands,\n type OpenhandsOptions,\n type OpenhandsServer,\n} from '../openhands';\nimport { DEFAULT_AGENT_SERVER_PATH } from '../utils/agent-server';\n\n// Cloudflare Workers environment type constraint\n// Accepts any Env type that has a Sandbox property compatible with DurableObjectNamespace\n// This is a minimal structural type that matches what getSandbox and proxyToSandbox need\n// Using a more permissive type that accepts any object with the required structure\nexport type OpenhandsEnv = {\n Sandbox: {\n get(id: { toString(): string }): {\n fetch(input: string | Request, init?: RequestInit): Promise<Response>;\n };\n };\n};\n\n/**\n * Options for OpenHands route handler\n */\nexport interface OpenhandsHandlerOptions extends OpenhandsOptions {\n /** Base path for OpenHands routes (default: '') */\n basePath?: string;\n /** Custom sandbox name resolver */\n getSandboxName?: (request: Request) => string | null;\n}\n\n/**\n * Find existing OpenHands server by port\n */\nasync function findOpenhandsServer(\n sandbox: Sandbox<unknown>,\n port: number\n): Promise<OpenhandsServer | null> {\n const processes = await sandbox.listProcesses();\n\n for (const process of processes) {\n // Match agent-server processes on the specified port\n if (\n process.command.includes(DEFAULT_AGENT_SERVER_PATH) &&\n (process.command.includes(`--port ${port}`) ||\n process.command.includes(`--port=${port}`)) &&\n (process.status === 'running' || process.status === 'starting')\n ) {\n // Try to get exposed ports to find preview URL\n let previewUrl: string | undefined;\n try {\n // Try to get exposed ports - hostname is optional\n const exposedPorts = await sandbox.getExposedPorts('');\n const exposed = exposedPorts.find((p) => p.port === port);\n if (exposed) {\n previewUrl = exposed.url;\n }\n } catch {\n // Ignore errors getting exposed ports\n }\n\n return {\n port,\n url: `http://localhost:${port}`,\n previewUrl,\n processId: process.id,\n async close() {\n await process.kill('SIGTERM');\n },\n };\n }\n }\n\n return null;\n}\n\n/**\n * Creates a middleware function that handles OpenHands routes.\n * Returns null if the request doesn't match OpenHands routes (allows chaining).\n *\n * @param options - Configuration options\n * @returns Middleware function\n */\nexport function createOpenhandsHandler<Env extends OpenhandsEnv = OpenhandsEnv>(\n options: OpenhandsHandlerOptions = {}\n) {\n const basePath = options.basePath || '';\n const getSandboxName = options.getSandboxName || ((req) => {\n const url = new URL(req.url);\n return url.searchParams.get('sandbox');\n });\n\n return async (\n request: Request,\n env: Env\n ): Promise<Response | null> => {\n const url = new URL(request.url);\n const pathname = url.pathname;\n\n // Extract sandbox name\n const sandboxName = getSandboxName(request) || options.sandboxName || 'my-sandbox';\n const sandbox = getSandbox(env.Sandbox, sandboxName);\n\n // Handle preview URL proxying (must be first)\n const proxyResponse = await proxyToSandbox(request, env);\n if (proxyResponse) {\n return proxyResponse;\n }\n\n // Handle OpenHands routes\n if (pathname === `${basePath}/start-openhands`) {\n try {\n // Extract hostname from request if not provided\n const hostname = options.hostname || url.hostname;\n\n const server = await createOpenhandsServer(sandbox, {\n ...options,\n hostname: options.exposePort ? hostname : undefined,\n });\n\n return Response.json({\n process: {\n id: server.processId,\n port: server.port,\n status: 'running',\n },\n previewUrl: server.previewUrl\n ? { url: server.previewUrl, port: server.port }\n : undefined,\n success: true,\n });\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n errorStack: error instanceof Error ? error.stack : undefined,\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n if (pathname === `${basePath}/stop-openhands`) {\n try {\n const port = options.port ?? 8001;\n const server = await findOpenhandsServer(sandbox, port);\n if (server) {\n await server.close();\n return Response.json({ success: true, message: 'Server stopped' });\n }\n return Response.json(\n { success: false, message: 'No server running' },\n { status: 404 }\n );\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n if (pathname === `${basePath}/openhands-status`) {\n try {\n const port = options.port ?? 8001;\n const server = await findOpenhandsServer(sandbox, port);\n if (!server) {\n return Response.json({\n running: false,\n success: true,\n });\n }\n\n // Verify process is still running\n const processes = await sandbox.listProcesses();\n const process = processes.find((p) => p.id === server.processId);\n\n return Response.json({\n running: process?.status === 'running',\n port: server.port,\n previewUrl: server.previewUrl,\n process: process\n ? {\n id: process.id,\n status: process.status,\n command: process.command,\n }\n : null,\n success: true,\n });\n } catch (error) {\n return Response.json(\n {\n error: error instanceof Error ? error.message : String(error),\n success: false,\n },\n { status: 500 }\n );\n }\n }\n\n // Request doesn't match OpenHands routes\n return null;\n };\n}\n\n/**\n * Attaches OpenHands routes to an existing fetch handler.\n * This wraps your handler with OpenHands route handling and preview URL proxying.\n *\n * @param fetchHandler - Your existing fetch handler\n * @param options - Configuration options\n * @returns Wrapped fetch handler\n *\n * @example\n * ```typescript\n * import { attachOpenhandsRoutes } from 'openhands-sdk/routes';\n *\n * export default attachOpenhandsRoutes(async (request, env) => {\n * // Your custom routes here\n * return new Response('Not found', { status: 404 });\n * }, {\n * port: 8001,\n * exposePort: true,\n * hostname: 'yourdomain.com'\n * });\n * ```\n */\nexport function attachOpenhandsRoutes<Env extends OpenhandsEnv = OpenhandsEnv>(\n fetchHandler: (\n request: Request,\n env: Env\n ) => Response | Promise<Response>,\n options: OpenhandsHandlerOptions = {}\n): {\n fetch: (request: Request, env: Env) => Promise<Response>;\n} {\n const openhandsHandler = createOpenhandsHandler<Env>(options);\n\n return {\n fetch: async (\n request: Request,\n env: Env\n ): Promise<Response> => {\n // First, try OpenHands handler\n const openhandsResponse = await openhandsHandler(request, env);\n if (openhandsResponse !== null) {\n return openhandsResponse;\n }\n\n // Fall through to user's handler\n return fetchHandler(request, env);\n },\n };\n}\n\n"
9
9
  ],
10
- "mappings": "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",
11
- "debugId": "90B6CB75CEE3F17464756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "813BCCE007B8828364756E2164756E21",
12
12
  "names": []
13
13
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloudflare-openhands-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "SDK for integrating OpenHands agent-server with Cloudflare Workers Sandbox",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -27,7 +27,8 @@
27
27
  "files": [
28
28
  "dist",
29
29
  "Dockerfile",
30
- "README.md"
30
+ "README.md",
31
+ "LICENSE"
31
32
  ],
32
33
  "scripts": {
33
34
  "build": "bun run build.ts",
@@ -47,7 +48,7 @@
47
48
  "sandbox",
48
49
  "agent-server"
49
50
  ],
50
- "license": "MIT",
51
+ "license": "Apache-2.0",
51
52
  "repository": {
52
53
  "type": "git",
53
54
  "url": "https://github.com/jagzmz/cloudflare-openhands-sdk.git"