hyperbrane 0.1.2 → 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.
Files changed (300) hide show
  1. package/README.md +105 -23
  2. package/dist/agent/agentClient.d.ts +5 -0
  3. package/dist/agent/agentClient.js +4 -0
  4. package/dist/agent/agentService.d.ts +9 -37
  5. package/dist/agent/agentService.js +64 -323
  6. package/dist/agent/agentStorage.d.ts +1 -20
  7. package/dist/agent/agentStorage.js +0 -30
  8. package/dist/agent/api.d.ts +105 -152
  9. package/dist/agent/api.js +1 -8
  10. package/dist/agent/client.d.ts +3 -1
  11. package/dist/agent/client.js +2 -3
  12. package/dist/agent/control.d.ts +23 -0
  13. package/dist/agent/control.js +479 -0
  14. package/dist/agent/dimensionAgentClient.d.ts +8 -0
  15. package/dist/agent/dimensionAgentClient.js +99 -0
  16. package/dist/agent/hostTranscript.d.ts +0 -6
  17. package/dist/agent/hostTranscript.js +3 -14
  18. package/dist/agent/session/backend.d.ts +18 -32
  19. package/dist/agent/session/claude/home.d.ts +0 -1
  20. package/dist/agent/session/claude/home.js +0 -1
  21. package/dist/agent/session/claude/provision.d.ts +10 -0
  22. package/dist/agent/session/claude/provision.js +17 -0
  23. package/dist/agent/session/claude/transcript.d.ts +3 -7
  24. package/dist/agent/session/claude/transcript.js +68 -14
  25. package/dist/agent/session/client.d.ts +1 -10
  26. package/dist/agent/session/client.js +0 -3
  27. package/dist/agent/session/codex/provision.d.ts +14 -0
  28. package/dist/agent/session/codex/provision.js +25 -0
  29. package/dist/agent/session/fileTranscript.d.ts +6 -49
  30. package/dist/agent/session/fileTranscript.js +26 -82
  31. package/dist/agent/session/install.d.ts +5 -0
  32. package/dist/agent/session/install.js +35 -0
  33. package/dist/agent/session/sessionStorage.d.ts +4 -35
  34. package/dist/agent/session/sessionStorage.js +10 -16
  35. package/dist/agent/session/sharedConnection.d.ts +0 -8
  36. package/dist/agent/session/sharedConnection.js +0 -7
  37. package/dist/agent/session/storedTranscripts.d.ts +1 -6
  38. package/dist/agent/session/storedTranscripts.js +0 -3
  39. package/dist/agent/session/worker/jsonRpc.d.ts +2 -13
  40. package/dist/agent/session/worker/jsonRpc.js +2 -11
  41. package/dist/agent/session/worker/protocol.d.ts +30 -21
  42. package/dist/agent/session/worker/protocol.js +29 -18
  43. package/dist/agent/session/worker/workerParams.d.ts +0 -5
  44. package/dist/agent/session/worker/workerParams.js +24 -17
  45. package/dist/agent/session/workerConnection.d.ts +2 -13
  46. package/dist/agent/session/workerConnection.js +7 -12
  47. package/dist/agent/session/workerGatewayConnection.d.ts +18 -0
  48. package/dist/agent/session/workerGatewayConnection.js +86 -0
  49. package/dist/agent/vendor-types/manifest.json +32 -0
  50. package/dist/agent/workerBundle.d.ts +4 -19
  51. package/dist/agent/workerBundle.generated.js +1 -1
  52. package/dist/agent/workerBundle.js +3 -30
  53. package/dist/agent/workerReplacement.d.ts +3 -0
  54. package/dist/agent/workerReplacement.js +49 -0
  55. package/dist/cli/agent.js +31 -16
  56. package/dist/cli/command.d.ts +10 -11
  57. package/dist/cli/command.js +0 -4
  58. package/dist/cli/dimension.js +6 -6
  59. package/dist/cli/gateway.js +3 -6
  60. package/dist/cli/main.js +14 -31
  61. package/dist/cli/streamPrinter.d.ts +2 -10
  62. package/dist/cli/streamPrinter.js +16 -46
  63. package/dist/cli/table.d.ts +0 -3
  64. package/dist/cli/table.js +0 -4
  65. package/dist/dimension/api.d.ts +42 -27
  66. package/dist/dimension/api.js +28 -47
  67. package/dist/dimension/client.d.ts +5 -0
  68. package/dist/dimension/client.js +4 -0
  69. package/dist/dimension/control.d.ts +22 -0
  70. package/dist/dimension/control.js +346 -0
  71. package/dist/dimension/image.d.ts +0 -5
  72. package/dist/dimension/image.js +0 -8
  73. package/dist/dimension/imageFiles.generated.js +1 -1
  74. package/dist/dimension/paths.d.ts +5 -4
  75. package/dist/dimension/paths.js +15 -6
  76. package/dist/dimension/service.d.ts +8 -24
  77. package/dist/dimension/service.js +85 -227
  78. package/dist/dimension/transport-worker.d.ts +1 -0
  79. package/dist/dimension/transport-worker.js +151 -0
  80. package/dist/dimension/transportBundle.d.ts +2 -0
  81. package/dist/dimension/transportBundle.generated.d.ts +1 -0
  82. package/dist/dimension/transportBundle.generated.js +2 -0
  83. package/dist/dimension/transportBundle.js +4 -0
  84. package/dist/dimension/transportClient.d.ts +10 -0
  85. package/dist/dimension/transportClient.js +115 -0
  86. package/dist/dimension/transportProtocol.d.ts +53 -0
  87. package/dist/dimension/transportProtocol.js +8 -0
  88. package/dist/index.d.ts +7 -9
  89. package/dist/index.js +7 -19
  90. package/dist/lib/control.d.ts +11 -0
  91. package/dist/lib/control.js +62 -0
  92. package/dist/lib/docker.d.ts +0 -22
  93. package/dist/lib/docker.js +0 -10
  94. package/dist/lib/image.d.ts +0 -3
  95. package/dist/lib/image.js +0 -2
  96. package/dist/lib/jsonDirectory.d.ts +0 -13
  97. package/dist/lib/jsonDirectory.js +34 -18
  98. package/dist/lib/scriptBundle.d.ts +6 -0
  99. package/dist/lib/scriptBundle.js +28 -0
  100. package/dist/lib/sh.d.ts +2 -0
  101. package/dist/lib/sh.js +8 -0
  102. package/dist/lib/sleep.d.ts +0 -1
  103. package/dist/lib/sleep.js +0 -1
  104. package/dist/lib/streamFetch.d.ts +15 -0
  105. package/dist/lib/streamFetch.js +150 -0
  106. package/dist/lib/tar.d.ts +0 -1
  107. package/dist/lib/tar.js +5 -11
  108. package/dist/lib/unixSocket.d.ts +2 -0
  109. package/dist/lib/unixSocket.js +28 -0
  110. package/dist/portal-gateway/api.d.ts +14 -44
  111. package/dist/portal-gateway/api.js +1 -3
  112. package/dist/portal-gateway/control.d.ts +42 -0
  113. package/dist/portal-gateway/control.js +657 -0
  114. package/dist/portal-gateway/gatewayClient.d.ts +5 -0
  115. package/dist/portal-gateway/gatewayClient.js +4 -0
  116. package/dist/portal-gateway/gatewayService.d.ts +8 -38
  117. package/dist/portal-gateway/gatewayService.js +82 -254
  118. package/dist/portal-gateway/image.d.ts +0 -1
  119. package/dist/portal-gateway/image.js +0 -2
  120. package/dist/portal-gateway/imageFiles.generated.js +2 -2
  121. package/dist/portal-gateway/portalClient.d.ts +5 -0
  122. package/dist/portal-gateway/portalClient.js +4 -0
  123. package/dist/portal-gateway/portalService.d.ts +5 -47
  124. package/dist/portal-gateway/portalService.js +19 -349
  125. package/dist/portal-gateway/transport-worker.d.ts +1 -0
  126. package/dist/portal-gateway/transport-worker.js +205 -0
  127. package/dist/portal-gateway/transportBundle.d.ts +2 -0
  128. package/dist/portal-gateway/transportBundle.generated.d.ts +1 -0
  129. package/dist/portal-gateway/transportBundle.generated.js +2 -0
  130. package/dist/portal-gateway/transportBundle.js +4 -0
  131. package/dist/portal-gateway/upstream.d.ts +0 -81
  132. package/dist/portal-gateway/upstream.js +0 -1
  133. package/dist/restore.d.ts +9 -0
  134. package/dist/restore.js +10 -0
  135. package/dist/sandbox/api.d.ts +126 -187
  136. package/dist/sandbox/api.js +5 -7
  137. package/dist/sandbox/client.d.ts +3 -0
  138. package/dist/sandbox/client.js +7 -0
  139. package/dist/sandbox/data-endpoints/dataEndpoints.d.ts +13 -0
  140. package/dist/sandbox/data-endpoints/dataEndpoints.js +100 -0
  141. package/dist/sandbox/data-endpoints/firewalledPorts.d.ts +4 -0
  142. package/dist/sandbox/data-endpoints/firewalledPorts.js +28 -0
  143. package/dist/sandbox/lib/httpOverStream.d.ts +3 -0
  144. package/dist/sandbox/lib/httpOverStream.js +21 -0
  145. package/dist/sandbox/lib/remoteFileOperations.d.ts +10 -0
  146. package/dist/sandbox/lib/remoteFileOperations.js +70 -0
  147. package/dist/sandbox/lib/shellCommand.d.ts +3 -0
  148. package/dist/sandbox/lib/shellCommand.js +7 -0
  149. package/dist/sandbox/lib/sshKey.d.ts +6 -0
  150. package/dist/sandbox/lib/sshKey.js +75 -0
  151. package/dist/sandbox/providers/boat/boatService.d.ts +3 -0
  152. package/dist/sandbox/providers/boat/boatService.js +373 -0
  153. package/dist/sandbox/providers/exedev/exeDevService.d.ts +2 -0
  154. package/dist/sandbox/providers/exedev/exeDevService.js +129 -0
  155. package/dist/sandbox/providers/exedev/exeDevToken.d.ts +1 -0
  156. package/dist/sandbox/providers/exedev/exeDevToken.js +50 -0
  157. package/dist/sandbox/providers/local/localService.d.ts +2 -0
  158. package/dist/sandbox/providers/local/localService.js +197 -0
  159. package/dist/sandbox/providers/ssh/sshService.d.ts +2 -0
  160. package/dist/sandbox/providers/ssh/sshService.js +83 -0
  161. package/dist/sandbox/providers/ssh/sshTransport.d.ts +12 -0
  162. package/dist/sandbox/providers/ssh/sshTransport.js +216 -0
  163. package/dist/sandbox/service.d.ts +3 -0
  164. package/dist/sandbox/service.js +26 -0
  165. package/dist/sandbox/storage/descriptors.d.ts +6 -0
  166. package/dist/sandbox/storage/descriptors.js +25 -0
  167. package/dist/sandbox/storage/sandboxStorage.d.ts +11 -0
  168. package/dist/sandbox/storage/sandboxStorage.js +42 -0
  169. package/dist/upstreams/anthropic.d.ts +0 -5
  170. package/dist/upstreams/anthropic.js +1 -8
  171. package/dist/upstreams/index.d.ts +2 -6
  172. package/dist/upstreams/index.js +0 -4
  173. package/dist/upstreams/openai.d.ts +0 -5
  174. package/dist/upstreams/openai.js +1 -13
  175. package/dist/vendor-types/claude/agent-sdk/bridge.d.ts +20 -4
  176. package/dist/vendor-types/claude/agent-sdk/browser-sdk.d.ts +24 -0
  177. package/dist/vendor-types/claude/agent-sdk/core.d.ts +2 -0
  178. package/dist/vendor-types/claude/agent-sdk/sdk-tools.d.ts +75 -6
  179. package/dist/vendor-types/claude/agent-sdk/sdk.d.ts +569 -100
  180. package/package.json +13 -4
  181. package/dist/agent/gatewaySignIns.d.ts +0 -5
  182. package/dist/agent/gatewaySignIns.js +0 -11
  183. package/dist/agent/session/codex/home.d.ts +0 -2
  184. package/dist/agent/session/codex/home.js +0 -4
  185. package/dist/agent/session/codex/messages.d.ts +0 -30
  186. package/dist/agent/session/codex/messages.js +0 -135
  187. package/dist/agent/session/codex/transcript.d.ts +0 -12
  188. package/dist/agent/session/codex/transcript.js +0 -22
  189. package/dist/agent/session/sdkMessages.d.ts +0 -15
  190. package/dist/agent/session/sdkMessages.js +0 -28
  191. package/dist/agent/session/workerSseConnection.d.ts +0 -31
  192. package/dist/agent/session/workerSseConnection.js +0 -76
  193. package/dist/agent/vendor-types/codex/app-server/AbsolutePathBuf.d.ts +0 -10
  194. package/dist/agent/vendor-types/codex/app-server/AbsolutePathBuf.js +0 -2
  195. package/dist/agent/vendor-types/codex/app-server/FunctionCallOutputBody.d.ts +0 -2
  196. package/dist/agent/vendor-types/codex/app-server/FunctionCallOutputBody.js +0 -2
  197. package/dist/agent/vendor-types/codex/app-server/FunctionCallOutputContentItem.d.ts +0 -22
  198. package/dist/agent/vendor-types/codex/app-server/FunctionCallOutputContentItem.js +0 -2
  199. package/dist/agent/vendor-types/codex/app-server/ImageDetail.d.ts +0 -1
  200. package/dist/agent/vendor-types/codex/app-server/ImageDetail.js +0 -2
  201. package/dist/agent/vendor-types/codex/app-server/ImageGenerationFailure.d.ts +0 -5
  202. package/dist/agent/vendor-types/codex/app-server/ImageGenerationFailure.js +0 -2
  203. package/dist/agent/vendor-types/codex/app-server/ImageGenerationItem.d.ts +0 -11
  204. package/dist/agent/vendor-types/codex/app-server/ImageGenerationItem.js +0 -2
  205. package/dist/agent/vendor-types/codex/app-server/LegacyAppPathString.d.ts +0 -23
  206. package/dist/agent/vendor-types/codex/app-server/LegacyAppPathString.js +0 -2
  207. package/dist/agent/vendor-types/codex/app-server/MessagePhase.d.ts +0 -7
  208. package/dist/agent/vendor-types/codex/app-server/MessagePhase.js +0 -2
  209. package/dist/agent/vendor-types/codex/app-server/ReasoningEffort.d.ts +0 -4
  210. package/dist/agent/vendor-types/codex/app-server/ReasoningEffort.js +0 -2
  211. package/dist/agent/vendor-types/codex/app-server/SleepItem.d.ts +0 -7
  212. package/dist/agent/vendor-types/codex/app-server/SleepItem.js +0 -2
  213. package/dist/agent/vendor-types/codex/app-server/WebSearchItem.d.ts +0 -14
  214. package/dist/agent/vendor-types/codex/app-server/WebSearchItem.js +0 -2
  215. package/dist/agent/vendor-types/codex/app-server/serde_json/JsonValue.d.ts +0 -3
  216. package/dist/agent/vendor-types/codex/app-server/serde_json/JsonValue.js +0 -2
  217. package/dist/agent/vendor-types/codex/app-server/v2/AgentMessageDelivery.d.ts +0 -1
  218. package/dist/agent/vendor-types/codex/app-server/v2/AgentMessageDelivery.js +0 -2
  219. package/dist/agent/vendor-types/codex/app-server/v2/AsyncUserInputQuestion.d.ts +0 -4
  220. package/dist/agent/vendor-types/codex/app-server/v2/AsyncUserInputQuestion.js +0 -2
  221. package/dist/agent/vendor-types/codex/app-server/v2/ByteRange.d.ts +0 -4
  222. package/dist/agent/vendor-types/codex/app-server/v2/ByteRange.js +0 -2
  223. package/dist/agent/vendor-types/codex/app-server/v2/CollabAgentState.d.ts +0 -5
  224. package/dist/agent/vendor-types/codex/app-server/v2/CollabAgentState.js +0 -2
  225. package/dist/agent/vendor-types/codex/app-server/v2/CollabAgentStatus.d.ts +0 -1
  226. package/dist/agent/vendor-types/codex/app-server/v2/CollabAgentStatus.js +0 -2
  227. package/dist/agent/vendor-types/codex/app-server/v2/CollabAgentTool.d.ts +0 -1
  228. package/dist/agent/vendor-types/codex/app-server/v2/CollabAgentTool.js +0 -2
  229. package/dist/agent/vendor-types/codex/app-server/v2/CollabAgentToolCallStatus.d.ts +0 -1
  230. package/dist/agent/vendor-types/codex/app-server/v2/CollabAgentToolCallStatus.js +0 -2
  231. package/dist/agent/vendor-types/codex/app-server/v2/CommandAction.d.ts +0 -19
  232. package/dist/agent/vendor-types/codex/app-server/v2/CommandAction.js +0 -2
  233. package/dist/agent/vendor-types/codex/app-server/v2/CommandExecutionSource.d.ts +0 -1
  234. package/dist/agent/vendor-types/codex/app-server/v2/CommandExecutionSource.js +0 -2
  235. package/dist/agent/vendor-types/codex/app-server/v2/CommandExecutionStatus.d.ts +0 -1
  236. package/dist/agent/vendor-types/codex/app-server/v2/CommandExecutionStatus.js +0 -2
  237. package/dist/agent/vendor-types/codex/app-server/v2/DynamicToolCallOutputContentItem.d.ts +0 -10
  238. package/dist/agent/vendor-types/codex/app-server/v2/DynamicToolCallOutputContentItem.js +0 -2
  239. package/dist/agent/vendor-types/codex/app-server/v2/DynamicToolCallStatus.d.ts +0 -1
  240. package/dist/agent/vendor-types/codex/app-server/v2/DynamicToolCallStatus.js +0 -2
  241. package/dist/agent/vendor-types/codex/app-server/v2/FileUpdateChange.d.ts +0 -6
  242. package/dist/agent/vendor-types/codex/app-server/v2/FileUpdateChange.js +0 -2
  243. package/dist/agent/vendor-types/codex/app-server/v2/HookPromptFragment.d.ts +0 -4
  244. package/dist/agent/vendor-types/codex/app-server/v2/HookPromptFragment.js +0 -2
  245. package/dist/agent/vendor-types/codex/app-server/v2/McpAppDisplayMode.d.ts +0 -1
  246. package/dist/agent/vendor-types/codex/app-server/v2/McpAppDisplayMode.js +0 -2
  247. package/dist/agent/vendor-types/codex/app-server/v2/McpAppUi.d.ts +0 -8
  248. package/dist/agent/vendor-types/codex/app-server/v2/McpAppUi.js +0 -2
  249. package/dist/agent/vendor-types/codex/app-server/v2/McpToolCallAppContext.d.ts +0 -7
  250. package/dist/agent/vendor-types/codex/app-server/v2/McpToolCallAppContext.js +0 -2
  251. package/dist/agent/vendor-types/codex/app-server/v2/McpToolCallError.d.ts +0 -3
  252. package/dist/agent/vendor-types/codex/app-server/v2/McpToolCallError.js +0 -2
  253. package/dist/agent/vendor-types/codex/app-server/v2/McpToolCallResult.d.ts +0 -6
  254. package/dist/agent/vendor-types/codex/app-server/v2/McpToolCallResult.js +0 -2
  255. package/dist/agent/vendor-types/codex/app-server/v2/McpToolCallStatus.d.ts +0 -1
  256. package/dist/agent/vendor-types/codex/app-server/v2/McpToolCallStatus.js +0 -2
  257. package/dist/agent/vendor-types/codex/app-server/v2/MemoryCitation.d.ts +0 -5
  258. package/dist/agent/vendor-types/codex/app-server/v2/MemoryCitation.js +0 -2
  259. package/dist/agent/vendor-types/codex/app-server/v2/MemoryCitationEntry.d.ts +0 -6
  260. package/dist/agent/vendor-types/codex/app-server/v2/MemoryCitationEntry.js +0 -2
  261. package/dist/agent/vendor-types/codex/app-server/v2/PatchApplyStatus.d.ts +0 -1
  262. package/dist/agent/vendor-types/codex/app-server/v2/PatchApplyStatus.js +0 -2
  263. package/dist/agent/vendor-types/codex/app-server/v2/PatchChangeKind.d.ts +0 -8
  264. package/dist/agent/vendor-types/codex/app-server/v2/PatchChangeKind.js +0 -2
  265. package/dist/agent/vendor-types/codex/app-server/v2/SubAgentActivityKind.d.ts +0 -1
  266. package/dist/agent/vendor-types/codex/app-server/v2/SubAgentActivityKind.js +0 -2
  267. package/dist/agent/vendor-types/codex/app-server/v2/TextElement.d.ts +0 -11
  268. package/dist/agent/vendor-types/codex/app-server/v2/TextElement.js +0 -2
  269. package/dist/agent/vendor-types/codex/app-server/v2/ThreadItem.d.ts +0 -215
  270. package/dist/agent/vendor-types/codex/app-server/v2/ThreadItem.js +0 -2
  271. package/dist/agent/vendor-types/codex/app-server/v2/UserInput.d.ts +0 -35
  272. package/dist/agent/vendor-types/codex/app-server/v2/UserInput.js +0 -2
  273. package/dist/agent/vendor-types/codex/app-server/v2/WebSearchAction.d.ts +0 -14
  274. package/dist/agent/vendor-types/codex/app-server/v2/WebSearchAction.js +0 -2
  275. package/dist/cli/services.d.ts +0 -19
  276. package/dist/cli/services.js +0 -34
  277. package/dist/dimension/http.d.ts +0 -7
  278. package/dist/dimension/http.js +0 -77
  279. package/dist/dimension/storage.d.ts +0 -39
  280. package/dist/dimension/storage.js +0 -79
  281. package/dist/portal-gateway/fakes.d.ts +0 -3
  282. package/dist/portal-gateway/fakes.js +0 -11
  283. package/dist/portal-gateway/gatewayStorage.d.ts +0 -66
  284. package/dist/portal-gateway/gatewayStorage.js +0 -125
  285. package/dist/portal-gateway/portalStorage.d.ts +0 -34
  286. package/dist/portal-gateway/portalStorage.js +0 -44
  287. package/dist/sandbox/boatService.d.ts +0 -52
  288. package/dist/sandbox/boatService.js +0 -343
  289. package/dist/sandbox/containerService.d.ts +0 -15
  290. package/dist/sandbox/containerService.js +0 -184
  291. package/dist/sandbox/endpointProxy.d.ts +0 -90
  292. package/dist/sandbox/endpointProxy.js +0 -716
  293. package/dist/sandbox/exeDevAuth.d.ts +0 -16
  294. package/dist/sandbox/exeDevAuth.js +0 -49
  295. package/dist/sandbox/localService.d.ts +0 -19
  296. package/dist/sandbox/localService.js +0 -200
  297. package/dist/sandbox/sseConnection.d.ts +0 -41
  298. package/dist/sandbox/sseConnection.js +0 -166
  299. package/dist/sandbox/sshService.d.ts +0 -30
  300. package/dist/sandbox/sshService.js +0 -680
package/README.md CHANGED
@@ -1,14 +1,15 @@
1
1
  # hyperbrane
2
2
 
3
3
  Dimensions (containers bound to a host directory), the portal gateways they reach the outside
4
- through, and agents (Claude Code, Codex) running in them, on a machine reached locally, over SSH, or
5
- as a Boat sandbox.
4
+ through, and agents (Claude Code, Codex) running in them, on a machine reached locally, over SSH, as
5
+ an exe.dev VM or as a Boat sandbox.
6
6
 
7
7
  ## Requirements
8
8
 
9
9
  - The library: Node ≥ 20.11 or Bun.
10
10
  - The CLI: Bun.
11
- - On the machine driven: docker, and python3 for accessible endpoints.
11
+ - On the machine driven: docker, python3, and curl (or wget) to fetch bun once for gateways' transport
12
+ workers, unless the machine has bun 1.4.3 already.
12
13
 
13
14
  ## CLI
14
15
 
@@ -21,10 +22,14 @@ hyperbrane dimension create --dir ~/work -m 4G --cpus 2 work
21
22
  ## Library
22
23
 
23
24
  ```ts
24
- import { createServices, createSshSandbox, MemoryLimit, CPULimit } from "hyperbrane";
25
-
26
- const host = createSshSandbox("server.example.com", { user: "me", privateKey });
27
- const { gateways, dimensions, portals, agents } = createServices(host);
25
+ import { createAgentClient, createDimensionClient, createGatewayClient, createPortalClient, createSandboxClient, listSandboxes, MemoryLimit, CPULimit } from "hyperbrane";
26
+
27
+ const host = createSandboxClient({ kind: "ssh", sshHost: "server.example.com", sshUser: "me", sshKey: privateKey });
28
+ // A client per part, over the sandbox: making one does nothing.
29
+ const gateways = createGatewayClient(host);
30
+ const dimensions = createDimensionClient(host);
31
+ const portals = createPortalClient(host);
32
+ const agents = createAgentClient(host);
28
33
  // The gateway keeps the sign-ins, under its name: a gateway by another name starts with none.
29
34
  await gateways.createGateway({ name: "main" });
30
35
  await dimensions.createDimension({ name: "work", directory: "work", memoryLimit: MemoryLimit("4G"), cpuLimit: CPULimit("2") });
@@ -32,19 +37,72 @@ await dimensions.createDimension({ name: "work", directory: "work", memoryLimit:
32
37
  await portals.createPortal({ name: "work-main", dimensionName: "work", gatewayName: "main" });
33
38
  await agents.createAgent({ name: "dev", dimensionName: "work" });
34
39
  await agents.install("dev", "claude");
40
+ // A command in the dimension, as its user, in its workspace unless given a cwd.
41
+ const { exitCode, stdout } = await dimensions.runCommand("work", ["git", "status"], { cwd: "repo" });
35
42
  ```
36
43
 
37
44
  Each call resolves once what it made is usable: a gateway once it intercepts, a portal once traffic
38
45
  flows through it, an install once the backend runs. Re-running any of them converges.
39
46
 
40
- hyperbrane runs where the application does and drives the machine from there: over SSH, or for Boat
41
- through Boat's API, so the application needs nothing from the machine's own network or DNS. A
42
- browser reaches an agent through `agents.exposeAgent`'s endpoint, and give it the page's origin:
43
- origins add up, so a call without one removes nothing. The endpoint's URL lasts, but its proxy stops
44
- with a reboot or Boat archive, and a page connecting then sees a CORS error. `exposeAgent` starts it
45
- again, at the same URL: give `workerSseConnector` a function that calls it (through the page's server),
46
- and it does so again whenever a connection fails to open, then throws `EndpointUnreachableError` if
47
- that didn't help.
47
+ `sshKey` is an unencrypted private key, in OpenSSH format (as `ssh-keygen` writes it), PKCS#8 (as
48
+ Node's `crypto` exports Ed25519, RSA and ECDSA keys), PKCS#1 (RSA) or SEC1 (ECDSA).
49
+
50
+ hyperbrane runs where the application does and drives the machine from there, each call over a
51
+ connection of its own (SSH, Boat's API): nothing is kept between calls, so it runs in serverless
52
+ functions too. A browser reaches the machine through data endpoints instead: ports the sandbox makes
53
+ reachable, one per gateway, each served by its gateway's transport worker. Where they're reached is
54
+ given when the sandbox is created:
55
+
56
+ ```ts
57
+ // Data endpoints at server.example.com, on ports 8443-8542, each opened in ufw.
58
+ await host.create({ name: "server", dataEndpointOptions: { url: "https://server.example.com", ports: { from: 8443, to: 8542 }, needsFirewall: true } });
59
+ // An exe.dev VM, over exe.dev's SSH with a key added to the account; its endpoints behind exe.dev's proxy.
60
+ const vm = createSandboxClient({ kind: "exe.dev", id: "bloggy", sshKey });
61
+ // Boat's machine is the SDK's, created with its state saved in it.
62
+ const boat = createSandboxClient({ kind: "boat", sshKey }); // BOAT_API_KEY; reaches nothing yet
63
+ const [ctx] = await boat.create({ name: "box" }); // ctx, now with the sandbox's id, is what's kept
64
+ // Elsewhere, with ctx alone: its operations read its state; open() resumes it first.
65
+ const again = createSandboxClient(ctx);
66
+ // Or found by its name, with the API key alone: every sandbox the key sees, and names can repeat.
67
+ const [found] = (await listSandboxes({ kind: "boat" })).filter((sandbox) => sandbox.name === "box");
68
+ ```
69
+
70
+ Under a `url` with a root path, every endpoint is at `<url>/<name>` (with
71
+ `dataEndpointOptions: { url: "https://server.example.com/hyb" }`, the gateway `main`'s is at
72
+ `https://server.example.com/hyb/gateway-main`): whatever serves that path routes it to the endpoint's
73
+ port, which `listEndpoints()` gives.
74
+
75
+ A browser streams an agent through the gateway its dimension is wired to: hand the page
76
+ `await gateways.endpoint("main")` (the gateway's URL and credentials, which expire in 12 hours) and
77
+ the dimension's name, and it connects with
78
+ `createWorkerClient(workerGatewayConnector(access, { dimensionName, agentName }))` from
79
+ `hyperbrane/agent/client`. The agent's worker must be running (any call through `agents` starts it).
80
+ On exe.dev the credentials carry a VM token, sent in `X-Exedev-Authorization` as exe.dev documents
81
+ ([HTTPS tokens for VMs](https://exe.dev/docs/https-tokens-for-vms.md)). A browser on another site
82
+ can't get through to a private port: exe.dev answers the header's CORS preflight with a redirect to
83
+ its login. There, give the endpoints a `url` with a root path on the VM's public port (the
84
+ `https://<vm>.exe.xyz/hyb` of a server routing `/hyb/<name>` to each endpoint's port). A page
85
+ can be told `EndpointUnreachableError` or `EndpointCredentialsError` (get new ones). Clients of one
86
+ agent can share one connection: `sharedConnector(workerGatewayConnector(...))` opens it on first use
87
+ and keeps it until `close()`.
88
+
89
+ Code running in a dimension (a script a session runs, a service in the workspace) drives the
90
+ dimension's agents over their workers' sockets, under `/run/hyperbrane`:
91
+
92
+ ```ts
93
+ import { createDimensionAgentClient, currentSession } from "hyperbrane";
94
+
95
+ const agents = createDimensionAgentClient();
96
+ const me = currentSession(); // the session this code runs under ({ agentName, sessionName }), or null
97
+ await agents.createSession(me!.agentName, { name: "helper", backend: "claude", memoryLimit: MemoryLimit("2G"), cpuLimit: CPULimit("1") });
98
+ ```
99
+
100
+ It does what the agents' workers do: sessions, their streams, transcripts, permissions and the
101
+ rest, and installing backends. Making or stopping agents, and starting their workers, take the
102
+ machine: `listAgents()` names the agents whose workers run, and a call to an agent whose worker
103
+ doesn't gets `AgentConflictError` until a call through the machine's `agents` starts it. Its
104
+ `login` doesn't know whether the gateway already holds a sign-in, so it signs in as the backend
105
+ does. Anything in the dimension can drive its agents this way, a session itself included.
48
106
 
49
107
  What lasts:
50
108
 
@@ -52,20 +110,43 @@ What lasts:
52
110
  |---|---|---|---|
53
111
  | Workspace, sessions, sign-ins, installed backends | kept | kept | kept |
54
112
  | Agent workers | started again by the next call (or `agents.restoreAgents()`) | same | same |
55
- | Portals | re-wired by `restartDimension` and `restartGateway`; otherwise as on the right | re-wired by the next agent call, `portals.restorePortals()`, or `createPortalWatcher` (running) | same |
113
+ | A gateway's transport worker (on the machine) | kept | kept | started again by `restore` (or `gateways.restoreGateways()`) |
114
+ | A dimension's transport worker (in it) | started again by `restartDimension` or `restore` | started by `createDimension` | started again by `restore` (or `dimensions.restoreDimensions()`) |
115
+ | Portals | re-wired by `restartDimension` and `restartGateway`; otherwise as on the right | re-wired by the next agent call, or `portals.restorePortals()` | same |
116
+
117
+ After a reboot or a Boat resume, one call starts again whatever didn't survive, in the order it
118
+ needs: the gateways' transport workers and the dimensions' (without restarting their containers),
119
+ then the portals, then the agents' workers. It's safe to call any time, and does nothing more where
120
+ everything runs:
121
+
122
+ ```ts
123
+ import { restore } from "hyperbrane";
124
+
125
+ await sandbox.open(); // resumes a stopped Boat sandbox
126
+ const { gateways, dimensions, agents } = await restore(sandbox); // what it started again
127
+ ```
128
+
129
+ A Boat sandbox stops itself after a while; `sandbox.hasExpiration()` tells a sandbox that does, and
130
+ `setExpiration` moves it.
56
131
 
57
- A Boat sandbox stops itself after a while; `hasExpiration(sandbox)` tells a sandbox that does, and
58
- `setExpiration` moves it (`createBoatSandbox`'s own type has both).
132
+ On Boat, `readFile`, `readFileRange`, `writeFile` and `writeFileExclusive` reach what Boat's file API
133
+ does: files under `/home/user` and `/tmp`. Another path is a `SandboxPathError`, which says why.
59
134
 
60
- The root module exports the services, the sandboxes (`createLocalSandbox`, `createSshSandbox`,
61
- `createContainerSandbox`, `createBoatSandbox`), the endpoint auths and the agent client. For a
135
+ The root module exports the clients (`createDimensionClient`, `createGatewayClient`,
136
+ `createPortalClient`, `createAgentClient`), the sandbox of any kind (`createSandboxClient`) and the
137
+ agent's worker client. An upstream of your own is a `defineUpstream({ name, modes })`, given to a
138
+ gateway with `registerUpstream` (the built-in ones are `BUILTIN_UPSTREAMS`). `dimensionLayout` says
139
+ where a dimension keeps things: its workspace, run and state paths and CA bundle in the container,
140
+ its directories and transport worker's socket on the machine, and its container's name.
141
+ A client is an interface (`DimensionClient`, ...); these drive the machine from this process, through
142
+ the services behind them, and another transport may implement the same interfaces. For a
62
143
  browser, which can't take the server side along, the package also exports each part's API
63
144
  (`hyperbrane/sandbox/api`, `hyperbrane/dimension/api`, `hyperbrane/portal-gateway/api`,
64
145
  `hyperbrane/agent/api`) and the agent's worker client (`hyperbrane/agent/client`). Nothing else is
65
146
  importable.
66
147
 
67
148
  What a client may rely on, as the types say: a `readonly` field is set by the package, for the client
68
- to read; a type marked `@sealed` (the services, sandboxes, clients) is made by the package, for the
149
+ to read; a type marked `@sealed` (the clients, sandboxes, services) is made by the package, for the
69
150
  client to use, not implement. Both may gain members in any release; anything else gains only optional
70
151
  ones, until a breaking release (`bun run api:diff --breaking` shows what would break).
71
152
 
@@ -74,6 +155,7 @@ ones, until a breaking release (`bun run api:diff --breaking` shows what would b
74
155
  ```sh
75
156
  bun run build # dist/
76
157
  bun run check:package # packs it, installs the tarball elsewhere and uses it under Node and Bun
77
- bun run api:diff [REF] # how the public interface changed since REF (HEAD): git diff of just that
78
- bun run api:diff --breaking [REF] # only its breaking changes: removed, renamed, newly required, retyped
158
+ bun run api:diff [FROM [TO]] # how the public interface changed from FROM (HEAD) to TO (the working tree): git diff of just that
159
+ bun run api:diff FROM..TO # the same over a range of commits, e.g. v0.1.2..HEAD
160
+ bun run api:diff --breaking [FROM [TO] | FROM..TO] # only its breaking changes: removed, renamed, newly required, retyped
79
161
  ```
@@ -0,0 +1,5 @@
1
+ import type { Sandbox } from "../sandbox/api.ts";
2
+ import type { AgentClient, AgentProvision, AgentSessionCapabilities } from "./api.ts";
3
+ export declare function createAgentClient(sandbox: Sandbox, options?: {
4
+ dataDirectory?: string;
5
+ }): AgentClient & AgentProvision & AgentSessionCapabilities;
@@ -0,0 +1,4 @@
1
+ import { createAgentService } from "./agentService.js";
2
+ export function createAgentClient(sandbox, options = {}) {
3
+ return createAgentService(sandbox, options);
4
+ }
@@ -1,39 +1,11 @@
1
- import type { DockerClient } from "../lib/docker.ts";
2
- import type { Sandbox, SandboxAccessibleEndpoint } from "../sandbox/api.ts";
3
- import type { AgentStorage } from "./agentStorage.ts";
4
- import type { GatewaySignIns } from "./gatewaySignIns.ts";
5
- import { type AgentClient, type AgentEndpoint, type AgentProvision, type AgentSessionCapabilities } from "./api.ts";
6
- import type { PortalService } from "../portal-gateway/portalService.ts";
1
+ import type { Sandbox } from "../sandbox/api.ts";
2
+ import { type AgentClient, type AgentProvision, type AgentSessionCapabilities } from "./api.ts";
7
3
  /** @sealed */
8
- export interface AgentService extends AgentClient, AgentProvision, AgentSessionCapabilities, AgentEndpoint {
9
- /** Starts the workers that a restart took down (their dimension runs again); returns their agents' names. */
10
- restoreAgents(): Promise<string[]>;
4
+ export interface AgentService extends AgentClient, AgentProvision, AgentSessionCapabilities {
11
5
  }
12
- /**
13
- * In the dimension: where the backends are installed (a package with its node_modules). Shared by
14
- * agents. In the state directory, so they last as long as the dimension: a container recreated (or a
15
- * machine whose docker kept nothing) doesn't take them, and nothing is installed twice.
16
- */
17
- export declare const WORKER_DIR = "/var/lib/hyperbrane/worker";
18
- /**
19
- * In the dimension: the worker's script. Outside WORKER_DIR on purpose: bun caches the listing of the
20
- * directory a script is loaded from, and packages installed there afterwards didn't resolve.
21
- */
22
- export declare const WORKER_SCRIPT = "/opt/hyperbrane/worker.js";
23
- /**
24
- * Runs each agent as a session worker inside its dimension (agent/session/main.ts) and talks
25
- * JSON-RPC to it over the worker's unix socket, which the host reaches through the dimension's
26
- * mounted run directory (through `host`). Keeps no state between calls beyond the agent records: every call finds
27
- * the worker again.
28
- */
29
- /**
30
- * `gatewaySignIns` tells whether a dimension's gateway already holds a backend's sign-in, so a
31
- * session's login can complete without anyone; without it every login waits for the user.
32
- */
33
- /**
34
- * `host` is the machine docker runs on: workers' sockets and logs are reached through it, and agents
35
- * are exposed through its endpoints when it declares them.
36
- */
37
- export declare function createAgentService(storage: AgentStorage, docker: DockerClient, host: Sandbox | (Sandbox & SandboxAccessibleEndpoint), gatewaySignIns?: GatewaySignIns,
38
- /** Re-wires a dimension's portals: what a restart (its container's, the machine's) took. */
39
- restoring?: Pick<PortalService, "restorePortals">): AgentService;
6
+ export type AgentServiceWithSockets = AgentService & {
7
+ workerSocket(agentName: string): Promise<string>;
8
+ };
9
+ export declare function createAgentService(host: Sandbox, { dataDirectory }?: {
10
+ dataDirectory?: string;
11
+ }): AgentServiceWithSockets;