@elizaos/plugin-computeruse 2.0.0-beta.1 → 2.0.3-beta.3

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.
Files changed (176) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/dist/actions/clipboard.d.ts +22 -0
  4. package/dist/actions/clipboard.d.ts.map +1 -0
  5. package/dist/actions/progress.d.ts +26 -0
  6. package/dist/actions/progress.d.ts.map +1 -0
  7. package/dist/actions/use-computer-agent.d.ts +113 -0
  8. package/dist/actions/use-computer-agent.d.ts.map +1 -0
  9. package/dist/actions/use-computer.d.ts.map +1 -1
  10. package/dist/actions/window-handlers.d.ts +11 -0
  11. package/dist/actions/window-handlers.d.ts.map +1 -0
  12. package/dist/actions/window.d.ts +11 -0
  13. package/dist/actions/window.d.ts.map +1 -0
  14. package/dist/actor/actor.d.ts +84 -0
  15. package/dist/actor/actor.d.ts.map +1 -0
  16. package/dist/actor/agent-callbacks.d.ts +128 -0
  17. package/dist/actor/agent-callbacks.d.ts.map +1 -0
  18. package/dist/actor/agent-loop.d.ts +134 -0
  19. package/dist/actor/agent-loop.d.ts.map +1 -0
  20. package/dist/actor/aosp-input-actor.d.ts +87 -0
  21. package/dist/actor/aosp-input-actor.d.ts.map +1 -0
  22. package/dist/actor/brain.d.ts +195 -0
  23. package/dist/actor/brain.d.ts.map +1 -0
  24. package/dist/actor/cascade.d.ts +92 -0
  25. package/dist/actor/cascade.d.ts.map +1 -0
  26. package/dist/actor/computer-interface.d.ts +276 -0
  27. package/dist/actor/computer-interface.d.ts.map +1 -0
  28. package/dist/actor/dispatch.d.ts +24 -0
  29. package/dist/actor/dispatch.d.ts.map +1 -0
  30. package/dist/actor/index.d.ts +12 -0
  31. package/dist/actor/index.d.ts.map +1 -0
  32. package/dist/actor/types.d.ts +94 -0
  33. package/dist/actor/types.d.ts.map +1 -0
  34. package/dist/approval-manager.d.ts.map +1 -1
  35. package/dist/index.d.ts +19 -6
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +12001 -5484
  38. package/dist/index.js.map +59 -25
  39. package/dist/mcp/index.d.ts +8 -0
  40. package/dist/mcp/index.d.ts.map +1 -0
  41. package/dist/mcp/server.d.ts +42 -0
  42. package/dist/mcp/server.d.ts.map +1 -0
  43. package/dist/mcp/tools.d.ts +53 -0
  44. package/dist/mcp/tools.d.ts.map +1 -0
  45. package/dist/mobile/android-bridge.d.ts +263 -0
  46. package/dist/mobile/android-bridge.d.ts.map +1 -0
  47. package/dist/mobile/android-scene.d.ts +52 -0
  48. package/dist/mobile/android-scene.d.ts.map +1 -0
  49. package/dist/mobile/android-trajectory.d.ts +66 -0
  50. package/dist/mobile/android-trajectory.d.ts.map +1 -0
  51. package/dist/mobile/index.d.ts +19 -0
  52. package/dist/mobile/index.d.ts.map +1 -0
  53. package/dist/mobile/ios-app-intent-registry.d.ts +20 -0
  54. package/dist/mobile/ios-app-intent-registry.d.ts.map +1 -0
  55. package/dist/mobile/ios-bridge.d.ts +359 -0
  56. package/dist/mobile/ios-bridge.d.ts.map +1 -0
  57. package/dist/mobile/ios-computer-interface.d.ts +160 -0
  58. package/dist/mobile/ios-computer-interface.d.ts.map +1 -0
  59. package/dist/mobile/mobile-computer-interface.d.ts +142 -0
  60. package/dist/mobile/mobile-computer-interface.d.ts.map +1 -0
  61. package/dist/mobile/mobile-screen-capture.d.ts +64 -0
  62. package/dist/mobile/mobile-screen-capture.d.ts.map +1 -0
  63. package/dist/mobile/ocr-provider.d.ts +187 -0
  64. package/dist/mobile/ocr-provider.d.ts.map +1 -0
  65. package/dist/mobile/ocr-provider.js +111 -0
  66. package/dist/mobile/ocr-provider.js.map +10 -0
  67. package/dist/osworld/action-converter.d.ts +4 -1
  68. package/dist/osworld/action-converter.d.ts.map +1 -1
  69. package/dist/osworld/adapter.d.ts +1 -0
  70. package/dist/osworld/adapter.d.ts.map +1 -1
  71. package/dist/parity/index.d.ts +9 -0
  72. package/dist/parity/index.d.ts.map +1 -0
  73. package/dist/parity/parity-matrix.d.ts +82 -0
  74. package/dist/parity/parity-matrix.d.ts.map +1 -0
  75. package/dist/parity/screenspot.d.ts +56 -0
  76. package/dist/parity/screenspot.d.ts.map +1 -0
  77. package/dist/platform/a11y.d.ts +29 -1
  78. package/dist/platform/a11y.d.ts.map +1 -1
  79. package/dist/platform/browser.d.ts +1 -1
  80. package/dist/platform/browser.d.ts.map +1 -1
  81. package/dist/platform/capabilities.d.ts +23 -0
  82. package/dist/platform/capabilities.d.ts.map +1 -1
  83. package/dist/platform/capture.d.ts +65 -0
  84. package/dist/platform/capture.d.ts.map +1 -0
  85. package/dist/platform/clipboard.d.ts +24 -0
  86. package/dist/platform/clipboard.d.ts.map +1 -0
  87. package/dist/platform/coords.d.ts +73 -0
  88. package/dist/platform/coords.d.ts.map +1 -0
  89. package/dist/platform/desktop.d.ts +23 -0
  90. package/dist/platform/desktop.d.ts.map +1 -1
  91. package/dist/platform/displays.d.ts +97 -0
  92. package/dist/platform/displays.d.ts.map +1 -0
  93. package/dist/platform/driver.d.ts +22 -0
  94. package/dist/platform/driver.d.ts.map +1 -1
  95. package/dist/platform/file-ops.d.ts +17 -0
  96. package/dist/platform/file-ops.d.ts.map +1 -1
  97. package/dist/platform/helpers.d.ts +2 -3
  98. package/dist/platform/helpers.d.ts.map +1 -1
  99. package/dist/platform/launch.d.ts +54 -0
  100. package/dist/platform/launch.d.ts.map +1 -0
  101. package/dist/platform/normalized-coords.d.ts +46 -0
  102. package/dist/platform/normalized-coords.d.ts.map +1 -0
  103. package/dist/platform/nut-driver.d.ts +67 -0
  104. package/dist/platform/nut-driver.d.ts.map +1 -1
  105. package/dist/platform/permissions.d.ts +12 -0
  106. package/dist/platform/permissions.d.ts.map +1 -1
  107. package/dist/platform/process-list.d.ts +32 -0
  108. package/dist/platform/process-list.d.ts.map +1 -0
  109. package/dist/platform/ps-host.d.ts +77 -0
  110. package/dist/platform/ps-host.d.ts.map +1 -0
  111. package/dist/platform/screenshot-errors.d.ts +54 -0
  112. package/dist/platform/screenshot-errors.d.ts.map +1 -0
  113. package/dist/platform/screenshot-quality.d.ts +11 -0
  114. package/dist/platform/screenshot-quality.d.ts.map +1 -0
  115. package/dist/platform/screenshot.d.ts.map +1 -1
  116. package/dist/platform/security.d.ts +8 -0
  117. package/dist/platform/security.d.ts.map +1 -1
  118. package/dist/platform/wayland-portal.d.ts +25 -0
  119. package/dist/platform/wayland-portal.d.ts.map +1 -0
  120. package/dist/platform/windows-list.d.ts +43 -1
  121. package/dist/platform/windows-list.d.ts.map +1 -1
  122. package/dist/providers/computer-state.d.ts.map +1 -1
  123. package/dist/providers/scene.d.ts +21 -0
  124. package/dist/providers/scene.d.ts.map +1 -0
  125. package/dist/register-routes.js +11715 -4990
  126. package/dist/register-routes.js.map +61 -24
  127. package/dist/routes/computer-use-compat-routes.d.ts +1 -1
  128. package/dist/routes/computer-use-compat-routes.d.ts.map +1 -1
  129. package/dist/sandbox/docker-backend.d.ts +69 -0
  130. package/dist/sandbox/docker-backend.d.ts.map +1 -0
  131. package/dist/sandbox/index.d.ts +62 -0
  132. package/dist/sandbox/index.d.ts.map +1 -0
  133. package/dist/sandbox/qemu-backend.d.ts +48 -0
  134. package/dist/sandbox/qemu-backend.d.ts.map +1 -0
  135. package/dist/sandbox/remote-guest.d.ts +72 -0
  136. package/dist/sandbox/remote-guest.d.ts.map +1 -0
  137. package/dist/sandbox/sandbox-driver.d.ts +41 -0
  138. package/dist/sandbox/sandbox-driver.d.ts.map +1 -0
  139. package/dist/sandbox/surface-types.d.ts +17 -0
  140. package/dist/sandbox/surface-types.d.ts.map +1 -0
  141. package/dist/sandbox/types.d.ts +138 -0
  142. package/dist/sandbox/types.d.ts.map +1 -0
  143. package/dist/sandbox/wsb-backend.d.ts +48 -0
  144. package/dist/sandbox/wsb-backend.d.ts.map +1 -0
  145. package/dist/scene/a11y-provider.d.ts +83 -0
  146. package/dist/scene/a11y-provider.d.ts.map +1 -0
  147. package/dist/scene/apps.d.ts +39 -0
  148. package/dist/scene/apps.d.ts.map +1 -0
  149. package/dist/scene/dhash.d.ts +105 -0
  150. package/dist/scene/dhash.d.ts.map +1 -0
  151. package/dist/scene/ocr-adapter.d.ts +64 -0
  152. package/dist/scene/ocr-adapter.d.ts.map +1 -0
  153. package/dist/scene/scene-builder.d.ts +107 -0
  154. package/dist/scene/scene-builder.d.ts.map +1 -0
  155. package/dist/scene/scene-types.d.ts +70 -0
  156. package/dist/scene/scene-types.d.ts.map +1 -0
  157. package/dist/scene/screen-state.d.ts +105 -0
  158. package/dist/scene/screen-state.d.ts.map +1 -0
  159. package/dist/scene/serialize.d.ts +28 -0
  160. package/dist/scene/serialize.d.ts.map +1 -0
  161. package/dist/security/browser-script-policy.d.ts +9 -0
  162. package/dist/security/browser-script-policy.d.ts.map +1 -0
  163. package/dist/services/computer-use-service.d.ts +78 -2
  164. package/dist/services/computer-use-service.d.ts.map +1 -1
  165. package/dist/services/index.d.ts +7 -0
  166. package/dist/services/index.d.ts.map +1 -0
  167. package/dist/services/vision-context-provider.d.ts +32 -0
  168. package/dist/services/vision-context-provider.d.ts.map +1 -0
  169. package/dist/types.d.ts +115 -5
  170. package/dist/types.d.ts.map +1 -1
  171. package/package.json +47 -10
  172. package/registry-entry.json +74 -0
  173. package/dist/actions/desktop-handlers.d.ts +0 -20
  174. package/dist/actions/desktop-handlers.d.ts.map +0 -1
  175. package/dist/actions/desktop.d.ts +0 -11
  176. package/dist/actions/desktop.d.ts.map +0 -1
@@ -21,7 +21,7 @@ type CompatRuntimeState = {
21
21
  export declare function handleComputerUseCompatRoutes(req: http.IncomingMessage, res: http.ServerResponse, state: CompatRuntimeState): Promise<boolean>;
22
22
  /**
23
23
  * Runtime plugin route adapter. The runtime plugin route bridge passes
24
- * `(req, res, runtime)` — wrap into a CompatRuntimeState stub for the
24
+ * `(req, res, runtime)` — wrap into a CompatRuntimeState adapter for the
25
25
  * shared dispatcher.
26
26
  */
27
27
  export declare function computerUseRouteHandler(): (req: unknown, res: unknown, runtime: unknown) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"computer-use-compat-routes.d.ts","sourceRoot":"","sources":["../../src/routes/computer-use-compat-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE;QACP,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;KACxC,GAAG,IAAI,CAAC;CACV,CAAC;AAyRF,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,OAAO,CAAC,CA+JlB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,KAEnC,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,SAAS,OAAO,KACf,OAAO,CAAC,IAAI,CAAC,CAMjB"}
1
+ {"version":3,"file":"computer-use-compat-routes.d.ts","sourceRoot":"","sources":["../../src/routes/computer-use-compat-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,KAAK,kBAAkB,GAAG;IACxB,OAAO,EAAE;QACP,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;KACxC,GAAG,IAAI,CAAC;CACV,CAAC;AA6RF,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,IAAI,CAAC,eAAe,EACzB,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,OAAO,CAAC,CA+JlB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,KAEnC,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,SAAS,OAAO,KACf,OAAO,CAAC,IAAI,CAAC,CAMjB"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Docker sandbox backend.
3
+ *
4
+ * Spawns a Docker container with X11 + xdotool + scrot pre-installed (the
5
+ * caller must build or pull such an image — default name `cua/linux:latest`)
6
+ * and proxies every CUA op through `docker exec` against an in-container
7
+ * helper. The helper is a self-contained Python script that this backend
8
+ * `docker cp`s into the running container at `start()`.
9
+ *
10
+ * Why a helper instead of running each op as its own xdotool/scrot shell?
11
+ * - Single entry point makes the wire format consistent across all ops.
12
+ * - Saves us from re-encoding key/modifier mappings per call.
13
+ * - Keeps the transport isolated from the driver operation mapping.
14
+ *
15
+ * The image MUST satisfy:
16
+ * - python3 on PATH
17
+ * - xdotool, scrot installed
18
+ * - an X session reachable on $DISPLAY (or Xvfb running)
19
+ * - bash on PATH
20
+ *
21
+ * We do NOT ship the image. The default name `cua/linux:latest` is a
22
+ * convention only; operators bring their own.
23
+ */
24
+ import { type ChildProcessWithoutNullStreams } from "node:child_process";
25
+ import { type SandboxBackend, type SandboxOp } from "./types.js";
26
+ export interface DockerBackendOptions {
27
+ /** Container image (default `cua/linux:latest`). */
28
+ image: string;
29
+ /** Extra `docker run` args (mounts, networks, ...). Optional. */
30
+ runArgs?: string[];
31
+ /** Env vars exposed inside the container. */
32
+ env?: Record<string, string>;
33
+ /** Override the Docker CLI binary (default `docker`). */
34
+ dockerBinary?: string;
35
+ /**
36
+ * Override the helper transport. Tests inject a fake that bypasses the
37
+ * actual `docker exec` spawn. Production code does not pass this.
38
+ */
39
+ spawnExec?: (binary: string, args: string[]) => ChildProcessWithoutNullStreams;
40
+ /**
41
+ * Override the synchronous shell-out used for `docker run`/`docker rm`/
42
+ * `docker cp`. Tests inject a fake.
43
+ */
44
+ runShell?: (binary: string, args: string[]) => Promise<{
45
+ stdout: string;
46
+ stderr: string;
47
+ code: number;
48
+ }>;
49
+ }
50
+ export declare class DockerBackend implements SandboxBackend {
51
+ readonly name = "docker";
52
+ private containerId;
53
+ private helper;
54
+ private pending;
55
+ private stdoutBuffer;
56
+ private readonly image;
57
+ private readonly runArgs;
58
+ private readonly env;
59
+ private readonly dockerBinary;
60
+ private readonly spawnExec;
61
+ private readonly runShell;
62
+ constructor(options?: DockerBackendOptions);
63
+ start(): Promise<void>;
64
+ stop(): Promise<void>;
65
+ invoke<TResult>(op: SandboxOp): Promise<TResult>;
66
+ private handleStdout;
67
+ private handleHelperExit;
68
+ }
69
+ //# sourceMappingURL=docker-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-backend.d.ts","sourceRoot":"","sources":["../../src/sandbox/docker-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,KAAK,8BAA8B,EAAS,MAAM,oBAAoB,CAAC;AAIhF,OAAO,EACL,KAAK,cAAc,EAGnB,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,CACV,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,KACX,8BAA8B,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,KACX,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE;AAoMD,qBAAa,aAAc,YAAW,cAAc;IAClD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,MAAM,CAA+C;IAC7D,OAAO,CAAC,OAAO,CAIN;IACT,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyB;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiD;IAC3E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgD;gBAE7D,OAAO,GAAE,oBAA+C;IAY9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBrB,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IActD,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,gBAAgB;CAWzB"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Sandbox subsystem barrel + mode-selection seam.
3
+ *
4
+ * This module is the single dispatch site for picking between the host
5
+ * (`yolo`) execution path and a sandboxed (`sandbox`) execution path. Nothing
6
+ * downstream branches on `mode`; callers receive a `Driver` and use it.
7
+ *
8
+ * - `createSandboxDriver(opts)` constructs a `SandboxDriver` wired to the
9
+ * requested backend (`docker`). Throws
10
+ * `SandboxBackendUnavailableError` if the backend cannot be constructed.
11
+ * - `getCurrentDriver(runtime)` consults `ComputerUseService.getConfig()`
12
+ * and returns either the host driver shim or a sandbox driver. This is
13
+ * the canonical mode-selection seam; if you find yourself writing
14
+ * `if (mode === 'sandbox')` somewhere, route through this instead.
15
+ */
16
+ import type { IAgentRuntime } from "@elizaos/core";
17
+ import type { ComputerUseMode, SandboxBackendName, SandboxBackendOptions, SandboxConfig } from "../types.js";
18
+ import { type DockerBackendOptions } from "./docker-backend.js";
19
+ import { SandboxDriver } from "./sandbox-driver.js";
20
+ import { type Driver, type SandboxBackend } from "./types.js";
21
+ export interface CreateSandboxDriverOptions {
22
+ backend: SandboxBackendName;
23
+ image: string;
24
+ options?: SandboxBackendOptions;
25
+ /**
26
+ * Test-only hook: inject a pre-built backend instead of constructing one.
27
+ * Production callers do not pass this.
28
+ */
29
+ backendOverride?: SandboxBackend;
30
+ /** Test-only Docker constructor overrides. */
31
+ dockerOverrides?: Pick<DockerBackendOptions, "spawnExec" | "runShell" | "dockerBinary">;
32
+ }
33
+ /**
34
+ * Construct a `SandboxDriver` for the requested backend. The driver is not
35
+ * started here — `SandboxDriver` lazily boots on first op so callers don't
36
+ * pay for a container start until they actually need one.
37
+ */
38
+ export declare function createSandboxDriver(opts: CreateSandboxDriverOptions): SandboxDriver;
39
+ /**
40
+ * Mode-selection seam. Returns either the host driver (yolo) or a sandbox
41
+ * driver (sandbox). Called by the dispatch layer; never branched on by
42
+ * callers.
43
+ *
44
+ * NOTE: when `mode === 'yolo'` we currently return `null`. The host
45
+ * `Driver`-shaped wrapper around `platform/driver.ts` lands in the same
46
+ * series as the rest of the dispatch refactor; the existing
47
+ * `ComputerUseService` calls into `platform/driver.ts` directly. Treat
48
+ * `null` as "use the legacy in-service host path".
49
+ */
50
+ export declare function getCurrentDriver(runtime: IAgentRuntime): Driver | null;
51
+ /** Resolve the `ComputerUseMode` from raw env input. Exported for testing. */
52
+ export declare function resolveModeFromEnv(raw: string | undefined): ComputerUseMode;
53
+ export type { DockerBackendOptions } from "./docker-backend.js";
54
+ export { DockerBackend } from "./docker-backend.js";
55
+ export { QEMUBackend, type QemuBackendOptions, type QemuLauncher, } from "./qemu-backend.js";
56
+ export { type GuestRpcRequest, type GuestRpcResponse, HttpGuestTransport, RemoteGuestBackend, type RemoteGuestTransport, resolveGuestRpcUrl, sandboxOpToRpc, } from "./remote-guest.js";
57
+ export { SandboxDriver } from "./sandbox-driver.js";
58
+ export type { FileActionResult, ProcessInfoLite, ScreenRegion, TerminalActionResult, WindowInfo, } from "./surface-types.js";
59
+ export { type Driver, type SandboxBackend, SandboxBackendUnavailableError, SandboxInvocationError, type SandboxOp, type ScrollDirection, } from "./types.js";
60
+ export { isWindowsSandboxAvailable, WSBBackend, type WsbBackendOptions, type WsbLauncher, } from "./wsb-backend.js";
61
+ export type { SandboxConfig };
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sandbox/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAiB,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,KAAK,MAAM,EACX,KAAK,cAAc,EAEpB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC;;;OAGG;IACH,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,8CAA8C;IAC9C,eAAe,CAAC,EAAE,IAAI,CACpB,oBAAoB,EACpB,WAAW,GAAG,UAAU,GAAG,cAAc,CAC1C,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,0BAA0B,GAC/B,aAAa,CAsCf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAmBtE;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe,CAG3E;AAED,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,kBAAkB,EAClB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,MAAM,EACX,KAAK,cAAc,EACnB,8BAA8B,EAC9B,sBAAsB,EACtB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yBAAyB,EACzB,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * QEMU provider backend (#9170 M13).
3
+ *
4
+ * QEMU boots a full guest VM (any OS image) and forwards a host port to the
5
+ * in-guest computer-server (`-netdev user,hostfwd=tcp::<port>-:<port>`). The
6
+ * host then drives it over the generic remote-guest RPC (`{command,params}` →
7
+ * `{success,result}`) — see `remote-guest.ts`.
8
+ *
9
+ * Availability is gated on a `qemu-system-*` binary being present; absent, the
10
+ * backend throws `SandboxBackendUnavailableError` rather than silently falling
11
+ * back to the host. The launcher + transport are injectable so boot/teardown is
12
+ * unit-testable without a real hypervisor.
13
+ */
14
+ import { RemoteGuestBackend, type RemoteGuestTransport } from "./remote-guest.js";
15
+ /** Host-side controller for the QEMU VM lifecycle (injectable for tests). */
16
+ export interface QemuLauncher {
17
+ /** Boot QEMU with the guest image + host-forwarded RPC port. */
18
+ launch(args: {
19
+ image: string;
20
+ rpcPort: number;
21
+ }): Promise<void>;
22
+ /** Power off / kill the VM. */
23
+ shutdown(): Promise<void>;
24
+ /** Probe whether a usable qemu-system binary exists. */
25
+ isAvailable(): boolean;
26
+ }
27
+ export interface QemuBackendOptions {
28
+ image: string;
29
+ rpcUrl?: string;
30
+ rpcPort?: number;
31
+ transport?: RemoteGuestTransport;
32
+ launcher?: QemuLauncher;
33
+ /** Availability override (tests). */
34
+ available?: boolean;
35
+ }
36
+ export declare class QEMUBackend extends RemoteGuestBackend {
37
+ readonly name = "qemu";
38
+ private readonly image;
39
+ private readonly rpcPort;
40
+ private readonly _transport;
41
+ private readonly launcher;
42
+ private started;
43
+ constructor(opts: QemuBackendOptions);
44
+ protected transport(): RemoteGuestTransport;
45
+ start(): Promise<void>;
46
+ stop(): Promise<void>;
47
+ }
48
+ //# sourceMappingURL=qemu-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qemu-backend.d.ts","sourceRoot":"","sources":["../../src/sandbox/qemu-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAEL,kBAAkB,EAClB,KAAK,oBAAoB,EAE1B,MAAM,mBAAmB,CAAC;AAG3B,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,MAAM,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,+BAA+B;IAC/B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,wDAAwD;IACxD,WAAW,IAAI,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,qBAAa,WAAY,SAAQ,kBAAkB;IACjD,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,kBAAkB;IAoBpC,SAAS,CAAC,SAAS,IAAI,oBAAoB;IAIrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAK5B"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Remote-guest RPC seam (#9170 M13).
3
+ *
4
+ * trycua/cua's host talks to an in-guest `computer-server` over a single
5
+ * generic RPC: send `{command, params}` and get back `{success, result}`. Every
6
+ * VM/sandbox provider (Windows Sandbox, QEMU, cloud) is just a different way of
7
+ * (a) booting the guest and (b) transporting that one RPC.
8
+ *
9
+ * elizaOS already has a typed `SandboxOp` envelope and a Docker backend that
10
+ * speaks it. This module bridges the two: `RemoteGuestBackend` is a
11
+ * `SandboxBackend` whose `invoke(op)` translates the typed op into the generic
12
+ * `{command, params}` RPC, sends it through a pluggable `RemoteGuestTransport`,
13
+ * and maps the `{success, result}` response back. Provider backends (WSB, QEMU)
14
+ * subclass it and only supply boot/teardown + a transport.
15
+ *
16
+ * The transport is injectable so the whole path is unit-testable with a fake
17
+ * (no VM, no network), and so a provider can swap HTTP for virtio-serial etc.
18
+ */
19
+ import { type SandboxBackend, type SandboxOp } from "./types.js";
20
+ /** The generic cua RPC request: a command name + arbitrary params. */
21
+ export interface GuestRpcRequest {
22
+ command: string;
23
+ params: Record<string, unknown>;
24
+ }
25
+ /** The generic cua RPC response. `result` is present on success. */
26
+ export interface GuestRpcResponse {
27
+ success: boolean;
28
+ result?: unknown;
29
+ error?: string;
30
+ }
31
+ /** Transport for the `{command, params}` → `{success, result}` RPC. */
32
+ export interface RemoteGuestTransport {
33
+ readonly name: string;
34
+ dispatch(request: GuestRpcRequest): Promise<GuestRpcResponse>;
35
+ }
36
+ /**
37
+ * Translate a typed `SandboxOp` into the generic cua `{command, params}` RPC.
38
+ * Pure — exported for unit tests. Command names follow cua's computer-server
39
+ * verb vocabulary so a stock cua guest answers them unchanged.
40
+ */
41
+ export declare function sandboxOpToRpc(op: SandboxOp): GuestRpcRequest;
42
+ /** HTTP transport: POSTs the RPC as JSON to a guest URL via `fetch`. */
43
+ export declare class HttpGuestTransport implements RemoteGuestTransport {
44
+ readonly name = "http";
45
+ private readonly url;
46
+ private readonly fetchImpl;
47
+ private readonly timeoutMs;
48
+ constructor(opts: {
49
+ url: string;
50
+ fetchImpl?: typeof fetch;
51
+ timeoutMs?: number;
52
+ });
53
+ dispatch(request: GuestRpcRequest): Promise<GuestRpcResponse>;
54
+ }
55
+ /**
56
+ * A `SandboxBackend` that speaks the generic remote-guest RPC. Subclasses
57
+ * (WSB, QEMU) supply boot/teardown and a transport; everything else — the
58
+ * op→RPC translation and the response unwrap — is shared here.
59
+ */
60
+ export declare abstract class RemoteGuestBackend implements SandboxBackend {
61
+ abstract readonly name: string;
62
+ protected abstract transport(): RemoteGuestTransport;
63
+ abstract start(): Promise<void>;
64
+ abstract stop(): Promise<void>;
65
+ invoke<TResult>(op: SandboxOp): Promise<TResult>;
66
+ }
67
+ /** Resolve the guest RPC URL from explicit url → port → default. Pure. */
68
+ export declare function resolveGuestRpcUrl(opts: {
69
+ rpcUrl?: string;
70
+ rpcPort?: number;
71
+ }): string;
72
+ //# sourceMappingURL=remote-guest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-guest.d.ts","sourceRoot":"","sources":["../../src/sandbox/remote-guest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAEpB,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC/D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,GAAG,eAAe,CAkE7D;AAWD,wEAAwE;AACxE,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,IAAI,EAAE;QAChB,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAMK,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAwBpE;AAED;;;;GAIG;AACH,8BAAsB,kBAAmB,YAAW,cAAc;IAChE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,oBAAoB;IAEpD,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAC/B,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;CAavD;AAED,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAIT"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * `SandboxDriver` — implements the host-equivalent `Driver` interface by
3
+ * proxying every CUA op to a `SandboxBackend`. The mode-selection seam in
4
+ * `services/computer-use-service.ts` instantiates either this or the host
5
+ * driver exactly once at start; nothing downstream knows which.
6
+ *
7
+ * Inspired by the architecture of trycua/cua's BaseComputer/BaseProvider split
8
+ * (MIT, https://github.com/trycua/cua) — but a clean re-implementation. We
9
+ * make no runtime dependency on the trycua Python library.
10
+ */
11
+ import type { FileActionResult, ProcessInfoLite, ScreenRegion, TerminalActionResult, WindowInfo } from "./surface-types.js";
12
+ import type { Driver, SandboxBackend, ScrollDirection } from "./types.js";
13
+ export declare class SandboxDriver implements Driver {
14
+ private readonly backend;
15
+ readonly name: string;
16
+ private started;
17
+ constructor(backend: SandboxBackend);
18
+ /** Lazily boots the backend on first op. Idempotent. */
19
+ private ensureStarted;
20
+ mouseMove(x: number, y: number): Promise<void>;
21
+ mouseClick(x: number, y: number): Promise<void>;
22
+ mouseDoubleClick(x: number, y: number): Promise<void>;
23
+ mouseRightClick(x: number, y: number): Promise<void>;
24
+ mouseDrag(x1: number, y1: number, x2: number, y2: number): Promise<void>;
25
+ mouseScroll(x: number, y: number, direction: ScrollDirection, amount: number): Promise<void>;
26
+ keyboardType(text: string): Promise<void>;
27
+ keyboardKeyPress(key: string): Promise<void>;
28
+ keyboardHotkey(combo: string): Promise<void>;
29
+ screenshot(region?: ScreenRegion): Promise<Buffer>;
30
+ listWindows(): Promise<WindowInfo[]>;
31
+ focusWindow(windowId: string): Promise<void>;
32
+ listProcesses(): Promise<ProcessInfoLite[]>;
33
+ runCommand(command: string, options?: {
34
+ cwd?: string;
35
+ timeoutSeconds?: number;
36
+ }): Promise<TerminalActionResult>;
37
+ readFile(targetPath: string): Promise<FileActionResult>;
38
+ writeFile(targetPath: string, content: string): Promise<FileActionResult>;
39
+ dispose(): Promise<void>;
40
+ }
41
+ //# sourceMappingURL=sandbox-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox-driver.d.ts","sourceRoot":"","sources":["../../src/sandbox/sandbox-driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAkB1E,qBAAa,aAAc,YAAW,MAAM;IAI9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEK,OAAO,EAAE,cAAc;IAIpD,wDAAwD;YAC1C,aAAa;IAQrB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD,SAAS,CACb,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC;IAKV,WAAW,CACf,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAaV,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAWlD,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQpC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,aAAa,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAU3C,UAAU,CACd,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,GAClD,OAAO,CAAC,oBAAoB,CAAC;IAU1B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQvD,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC;IAStB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Re-exports of the shared CUA surface types the driver layer consumes. Kept
3
+ * separate from `./types.ts` to keep the sandbox barrel free of churn when
4
+ * upstream `../types.ts` evolves.
5
+ */
6
+ export type { FileActionResult, ScreenRegion, TerminalActionResult, WindowInfo, } from "../types.js";
7
+ /**
8
+ * Subset of `ProcessInfo` exposed across the driver boundary. The full type
9
+ * lives in `platform/process-list.ts` which depends on host-only modules; we
10
+ * deliberately keep the sandbox surface minimal so backends don't have to
11
+ * reproduce any host-only fields.
12
+ */
13
+ export interface ProcessInfoLite {
14
+ pid: number;
15
+ name: string;
16
+ }
17
+ //# sourceMappingURL=surface-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-types.d.ts","sourceRoot":"","sources":["../../src/sandbox/surface-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Driver / sandbox-backend types.
3
+ *
4
+ * The `Driver` interface is the single dispatch surface that both the yolo
5
+ * (host) path and the sandbox path implement. Anything that wants to drive a
6
+ * machine — host path or Docker container — implements this one shape. The mode-selection seam in
7
+ * `services/computer-use-service.ts` picks an instance once at start; nothing
8
+ * downstream branches on `mode`.
9
+ */
10
+ import type { FileActionResult, ProcessInfoLite, ScreenRegion, TerminalActionResult, WindowInfo } from "./surface-types.js";
11
+ export type ScrollDirection = "up" | "down" | "left" | "right";
12
+ /**
13
+ * Single dispatch surface for a CUA executor (host or sandbox).
14
+ *
15
+ * Methods are deliberately kept narrow and primitive. The richer
16
+ * approval/normalisation/screenshot-after-action policy lives one layer up in
17
+ * `ComputerUseService`; the driver only knows how to talk to its target.
18
+ */
19
+ export interface Driver {
20
+ /** Stable name for diagnostics + tests. */
21
+ readonly name: string;
22
+ mouseMove(x: number, y: number): Promise<void>;
23
+ mouseClick(x: number, y: number): Promise<void>;
24
+ mouseDoubleClick(x: number, y: number): Promise<void>;
25
+ mouseRightClick(x: number, y: number): Promise<void>;
26
+ mouseDrag(x1: number, y1: number, x2: number, y2: number): Promise<void>;
27
+ mouseScroll(x: number, y: number, direction: ScrollDirection, amount: number): Promise<void>;
28
+ keyboardType(text: string): Promise<void>;
29
+ keyboardKeyPress(key: string): Promise<void>;
30
+ keyboardHotkey(combo: string): Promise<void>;
31
+ screenshot(region?: ScreenRegion): Promise<Buffer>;
32
+ listWindows(): Promise<WindowInfo[]>;
33
+ focusWindow(windowId: string): Promise<void>;
34
+ listProcesses(): Promise<ProcessInfoLite[]>;
35
+ runCommand(command: string, options?: {
36
+ cwd?: string;
37
+ timeoutSeconds?: number;
38
+ }): Promise<TerminalActionResult>;
39
+ readFile(targetPath: string): Promise<FileActionResult>;
40
+ writeFile(targetPath: string, content: string): Promise<FileActionResult>;
41
+ /** Free any sandbox/container/process resources. Called once at service stop. */
42
+ dispose(): Promise<void>;
43
+ }
44
+ /**
45
+ * Backend-internal contract: the smallest surface a sandbox backend
46
+ * (Docker) must expose. The `SandboxDriver` proxies every
47
+ * `Driver` method through this. Keeping this separate from `Driver` lets the
48
+ * driver implement coordinate normalisation, screenshot decoding, etc. once
49
+ * for all backends.
50
+ */
51
+ export interface SandboxBackend {
52
+ readonly name: string;
53
+ /** Boot the underlying sandbox (start container / VM, install helper). */
54
+ start(): Promise<void>;
55
+ /** Tear down the sandbox. Must be idempotent. */
56
+ stop(): Promise<void>;
57
+ /**
58
+ * Send one command to the in-sandbox helper and get a typed response.
59
+ * Backends are responsible for transport (docker exec, virtio-serial, ...).
60
+ */
61
+ invoke<TResult>(op: SandboxOp): Promise<TResult>;
62
+ }
63
+ /** Tagged operation envelope sent to the sandbox helper. */
64
+ export type SandboxOp = {
65
+ kind: "screenshot";
66
+ region?: ScreenRegion;
67
+ } | {
68
+ kind: "mouse_move";
69
+ x: number;
70
+ y: number;
71
+ } | {
72
+ kind: "mouse_click";
73
+ x: number;
74
+ y: number;
75
+ } | {
76
+ kind: "mouse_double_click";
77
+ x: number;
78
+ y: number;
79
+ } | {
80
+ kind: "mouse_right_click";
81
+ x: number;
82
+ y: number;
83
+ } | {
84
+ kind: "mouse_drag";
85
+ x1: number;
86
+ y1: number;
87
+ x2: number;
88
+ y2: number;
89
+ } | {
90
+ kind: "mouse_scroll";
91
+ x: number;
92
+ y: number;
93
+ direction: ScrollDirection;
94
+ amount: number;
95
+ } | {
96
+ kind: "keyboard_type";
97
+ text: string;
98
+ } | {
99
+ kind: "keyboard_key_press";
100
+ key: string;
101
+ } | {
102
+ kind: "keyboard_hotkey";
103
+ combo: string;
104
+ } | {
105
+ kind: "list_windows";
106
+ } | {
107
+ kind: "focus_window";
108
+ window_id: string;
109
+ } | {
110
+ kind: "list_processes";
111
+ } | {
112
+ kind: "run_command";
113
+ command: string;
114
+ cwd?: string;
115
+ timeout_seconds?: number;
116
+ } | {
117
+ kind: "read_file";
118
+ path: string;
119
+ } | {
120
+ kind: "write_file";
121
+ path: string;
122
+ content: string;
123
+ };
124
+ /**
125
+ * Thrown when a backend cannot be constructed (for example, missing docker
126
+ * binary). Callers should bubble this to the operator so the
127
+ * misconfiguration is loud, never silent.
128
+ */
129
+ export declare class SandboxBackendUnavailableError extends Error {
130
+ readonly backend: string;
131
+ constructor(message: string, backend: string);
132
+ }
133
+ /** Thrown when the in-sandbox helper returns a structured error. */
134
+ export declare class SandboxInvocationError extends Error {
135
+ readonly op: SandboxOp["kind"];
136
+ constructor(message: string, op: SandboxOp["kind"]);
137
+ }
138
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Windows Sandbox (WSB) provider backend (#9170 M13).
3
+ *
4
+ * Windows Sandbox is a disposable, hardware-isolated Windows VM shipped with
5
+ * Windows Pro/Enterprise. The host launches it from a `.wsb` config that maps a
6
+ * folder and runs a logon command (here: start the in-guest computer-server),
7
+ * then drives it over the generic remote-guest RPC (`{command,params}` →
8
+ * `{success,result}`) — see `remote-guest.ts`.
9
+ *
10
+ * Availability is gated: WSB only exists on Windows with the optional feature
11
+ * installed. When absent, construction throws `SandboxBackendUnavailableError`
12
+ * so the misconfiguration is loud, never a silent host fallback.
13
+ *
14
+ * The launcher + transport are injectable so the boot/teardown logic is
15
+ * unit-testable without a real Windows Sandbox.
16
+ */
17
+ import { RemoteGuestBackend, type RemoteGuestTransport } from "./remote-guest.js";
18
+ /** Host-side controller for the WSB VM lifecycle (injectable for tests). */
19
+ export interface WsbLauncher {
20
+ /** Launch Windows Sandbox with the computer-server logon command. */
21
+ launch(args: {
22
+ rpcPort: number;
23
+ }): Promise<void>;
24
+ /** Stop the running sandbox (best-effort; WSB tears down on close). */
25
+ shutdown(): Promise<void>;
26
+ }
27
+ export interface WsbBackendOptions {
28
+ rpcUrl?: string;
29
+ rpcPort?: number;
30
+ transport?: RemoteGuestTransport;
31
+ launcher?: WsbLauncher;
32
+ /** Availability override (tests). */
33
+ available?: boolean;
34
+ }
35
+ /** Best-effort probe: WSB exists only on Windows with the feature installed. */
36
+ export declare function isWindowsSandboxAvailable(): boolean;
37
+ export declare class WSBBackend extends RemoteGuestBackend {
38
+ readonly name = "wsb";
39
+ private readonly rpcPort;
40
+ private readonly _transport;
41
+ private readonly launcher;
42
+ private started;
43
+ constructor(opts?: WsbBackendOptions);
44
+ protected transport(): RemoteGuestTransport;
45
+ start(): Promise<void>;
46
+ stop(): Promise<void>;
47
+ }
48
+ //# sourceMappingURL=wsb-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsb-backend.d.ts","sourceRoot":"","sources":["../../src/sandbox/wsb-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAEL,kBAAkB,EAClB,KAAK,oBAAoB,EAE1B,MAAM,mBAAmB,CAAC;AAG3B,4EAA4E;AAC5E,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,uEAAuE;IACvE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAKD,gFAAgF;AAChF,wBAAgB,yBAAyB,IAAI,OAAO,CAGnD;AAED,qBAAa,UAAW,SAAQ,kBAAkB;IAChD,QAAQ,CAAC,IAAI,SAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,GAAE,iBAAsB;IAoBxC,SAAS,CAAC,SAAS,IAAI,oBAAoB;IAIrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAK5B"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * AccessibilityProvider — thin abstraction over platform-specific a11y trees.
3
+ *
4
+ * The scene-builder needs structured a11y nodes (role, label, bbox, actions)
5
+ * tagged with a stable id so the planner can say "click element a47" across
6
+ * turns. The existing `platform/a11y.ts::extractA11yTree()` returns a single
7
+ * flat string — useful for prompts but not structured. This module wraps it
8
+ * with a typed-node interface and adds:
9
+ *
10
+ * - Native impls per-OS that prefer structured JSON output where the
11
+ * platform supports it (AT-SPI emits structured data we just need to
12
+ * marshal; UIA/AX similarly).
13
+ * - A Wayland-compositor fallback (`hyprctl clients -j`, `swaymsg -t
14
+ * get_tree`) so Linux Wayland-only environments still surface windowable
15
+ * nodes even when AT-SPI is locked down.
16
+ * - A `NullAccessibilityProvider` for platforms / contexts where a11y is
17
+ * intentionally disabled (CI, headless runners).
18
+ *
19
+ * Stable id strategy:
20
+ * - Each provider emits `a<displayId>-<seq>` IDs. The same logical element
21
+ * keeps the same id across consecutive frames AS LONG AS the provider's
22
+ * in-memory map is preserved — we re-key when role + label + bbox
23
+ * intersect significantly with a previous frame's node. This is the
24
+ * contract WS7's "click element a47" depends on.
25
+ *
26
+ * The Android `AccessibilityService` impl is owned by WS8 and registers via
27
+ * `setAccessibilityProvider()` at runtime — this module exposes the seam
28
+ * but does not ship a JS-side implementation.
29
+ */
30
+ import type { SceneAxNode } from "./scene-types.js";
31
+ export interface AccessibilityProvider {
32
+ readonly name: string;
33
+ /**
34
+ * Whether this provider can produce structured nodes on the current host.
35
+ * Used by `resolveAccessibilityProvider` to pick the best chain entry.
36
+ */
37
+ available(): boolean;
38
+ /**
39
+ * Capture the live a11y tree and return per-display node lists. Returns
40
+ * an empty array when no nodes are reachable (vs throwing) so the
41
+ * scene-builder always produces a Scene.
42
+ */
43
+ snapshot(): Promise<SceneAxNode[]>;
44
+ }
45
+ declare class NullAccessibilityProvider implements AccessibilityProvider {
46
+ readonly name = "null";
47
+ available(): boolean;
48
+ snapshot(): Promise<SceneAxNode[]>;
49
+ }
50
+ /**
51
+ * Replace the active provider (used by Android/WS8 to inject the native
52
+ * `AccessibilityService` adapter, and by tests).
53
+ */
54
+ export declare function setAccessibilityProvider(provider: AccessibilityProvider): void;
55
+ export declare function resolveAccessibilityProvider(): AccessibilityProvider;
56
+ interface IdAssignerState {
57
+ seq: Map<number, number>;
58
+ }
59
+ export declare function makeIdAssigner(): IdAssignerState;
60
+ export declare function assignAxId(state: IdAssignerState, displayId: number): string;
61
+ export declare class LinuxAccessibilityProvider implements AccessibilityProvider {
62
+ readonly name = "linux";
63
+ available(): boolean;
64
+ snapshot(): Promise<SceneAxNode[]>;
65
+ private tryAtspi;
66
+ private tryWaylandCompositor;
67
+ private tryHyprland;
68
+ private trySway;
69
+ }
70
+ export declare function parseHyprlandClients(text: string): SceneAxNode[];
71
+ export declare function parseSwayTree(text: string): SceneAxNode[];
72
+ export declare class DarwinAccessibilityProvider implements AccessibilityProvider {
73
+ readonly name = "darwin";
74
+ available(): boolean;
75
+ snapshot(): Promise<SceneAxNode[]>;
76
+ }
77
+ export declare class WindowsAccessibilityProvider implements AccessibilityProvider {
78
+ readonly name = "win32";
79
+ available(): boolean;
80
+ snapshot(): Promise<SceneAxNode[]>;
81
+ }
82
+ export { NullAccessibilityProvider };
83
+ //# sourceMappingURL=a11y-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y-provider.d.ts","sourceRoot":"","sources":["../../src/scene/a11y-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC;IACrB;;;;OAIG;IACH,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CACpC;AAED,cAAM,yBAA0B,YAAW,qBAAqB;IAC9D,QAAQ,CAAC,IAAI,UAAU;IACvB,SAAS,IAAI,OAAO;IAGd,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAGzC;AAID;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,qBAAqB,GAC9B,IAAI,CAEN;AAED,wBAAgB,4BAA4B,IAAI,qBAAqB,CAOpE;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1B;AAED,wBAAgB,cAAc,IAAI,eAAe,CAEhD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAK5E;AAID,qBAAa,0BAA2B,YAAW,qBAAqB;IACtE,QAAQ,CAAC,IAAI,WAAW;IAExB,SAAS,IAAI,OAAO;IAUd,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IASxC,OAAO,CAAC,QAAQ;IA0DhB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,OAAO;CAYhB;AAaD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAiChE;AAcD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CA4CzD;AAuBD,qBAAa,2BAA4B,YAAW,qBAAqB;IACvE,QAAQ,CAAC,IAAI,YAAY;IAEzB,SAAS,IAAI,OAAO;IAId,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAuDzC;AAID,qBAAa,4BAA6B,YAAW,qBAAqB;IACxE,QAAQ,CAAC,IAAI,WAAW;IAExB,SAAS,IAAI,OAAO;IAId,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAqDzC;AAED,OAAO,EAAE,yBAAyB,EAAE,CAAC"}