@usine/executor 0.2.1 → 0.4.0

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 (250) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +212 -37
  3. package/dist/child-command.d.ts +5 -8
  4. package/dist/child-command.d.ts.map +1 -1
  5. package/dist/child-command.js +10 -14
  6. package/dist/child-command.js.map +1 -1
  7. package/dist/child-environment.d.ts +19 -0
  8. package/dist/child-environment.d.ts.map +1 -0
  9. package/dist/child-environment.js +18 -0
  10. package/dist/child-environment.js.map +1 -0
  11. package/dist/claude-login-lock.d.ts +9 -0
  12. package/dist/claude-login-lock.d.ts.map +1 -0
  13. package/dist/claude-login-lock.js +15 -0
  14. package/dist/claude-login-lock.js.map +1 -0
  15. package/dist/cloudflare/client.d.ts +50 -0
  16. package/dist/cloudflare/client.d.ts.map +1 -0
  17. package/dist/cloudflare/client.js +108 -0
  18. package/dist/cloudflare/client.js.map +1 -0
  19. package/dist/cloudflare/cloudflare.d.ts +17 -0
  20. package/dist/cloudflare/cloudflare.d.ts.map +1 -0
  21. package/dist/cloudflare/cloudflare.js +704 -0
  22. package/dist/cloudflare/cloudflare.js.map +1 -0
  23. package/dist/cloudflare/model.d.ts +42 -0
  24. package/dist/cloudflare/model.d.ts.map +1 -0
  25. package/dist/cloudflare/model.js +2 -0
  26. package/dist/cloudflare/model.js.map +1 -0
  27. package/dist/cloudflare/shell/environment.d.ts +12 -0
  28. package/dist/cloudflare/shell/environment.d.ts.map +1 -0
  29. package/dist/cloudflare/shell/environment.js +12 -0
  30. package/dist/cloudflare/shell/environment.js.map +1 -0
  31. package/dist/cloudflare/shell/shell.d.ts +2 -0
  32. package/dist/cloudflare/shell/shell.d.ts.map +1 -0
  33. package/dist/cloudflare/shell/shell.js +155 -0
  34. package/dist/cloudflare/shell/shell.js.map +1 -0
  35. package/dist/credential-environment.d.ts +20 -0
  36. package/dist/credential-environment.d.ts.map +1 -0
  37. package/dist/credential-environment.js +20 -0
  38. package/dist/credential-environment.js.map +1 -0
  39. package/dist/durable-session.d.ts +81 -0
  40. package/dist/durable-session.d.ts.map +1 -0
  41. package/dist/durable-session.js +550 -0
  42. package/dist/durable-session.js.map +1 -0
  43. package/dist/exe-dev/commands.d.ts +23 -13
  44. package/dist/exe-dev/commands.d.ts.map +1 -1
  45. package/dist/exe-dev/commands.js +11 -57
  46. package/dist/exe-dev/commands.js.map +1 -1
  47. package/dist/exe-dev/exe-dev.d.ts +9 -3
  48. package/dist/exe-dev/exe-dev.d.ts.map +1 -1
  49. package/dist/exe-dev/exe-dev.js +61 -128
  50. package/dist/exe-dev/exe-dev.js.map +1 -1
  51. package/dist/exe-dev/grants.d.ts.map +1 -1
  52. package/dist/exe-dev/grants.js +35 -15
  53. package/dist/exe-dev/grants.js.map +1 -1
  54. package/dist/exe-dev/model.d.ts +15 -19
  55. package/dist/exe-dev/model.d.ts.map +1 -1
  56. package/dist/exe-dev/model.js +9 -12
  57. package/dist/exe-dev/model.js.map +1 -1
  58. package/dist/exe-dev/preflight.d.ts +8 -4
  59. package/dist/exe-dev/preflight.d.ts.map +1 -1
  60. package/dist/exe-dev/preflight.js +26 -35
  61. package/dist/exe-dev/preflight.js.map +1 -1
  62. package/dist/executor.d.ts +292 -44
  63. package/dist/executor.d.ts.map +1 -1
  64. package/dist/executor.js +187 -19
  65. package/dist/executor.js.map +1 -1
  66. package/dist/guard.d.ts +57 -7
  67. package/dist/guard.d.ts.map +1 -1
  68. package/dist/guard.js +274 -59
  69. package/dist/guard.js.map +1 -1
  70. package/dist/harness-preflight.d.ts +27 -5
  71. package/dist/harness-preflight.d.ts.map +1 -1
  72. package/dist/harness-preflight.js +32 -31
  73. package/dist/harness-preflight.js.map +1 -1
  74. package/dist/keyed-lock.d.ts +2 -3
  75. package/dist/keyed-lock.d.ts.map +1 -1
  76. package/dist/keyed-lock.js +2 -3
  77. package/dist/keyed-lock.js.map +1 -1
  78. package/dist/leftovers.d.ts +9 -0
  79. package/dist/leftovers.d.ts.map +1 -0
  80. package/dist/leftovers.js +14 -0
  81. package/dist/leftovers.js.map +1 -0
  82. package/dist/local/credentials.d.ts +21 -0
  83. package/dist/local/credentials.d.ts.map +1 -0
  84. package/dist/local/credentials.js +39 -0
  85. package/dist/local/credentials.js.map +1 -0
  86. package/dist/local/leftovers.d.ts +8 -0
  87. package/dist/local/leftovers.d.ts.map +1 -0
  88. package/dist/local/leftovers.js +23 -0
  89. package/dist/local/leftovers.js.map +1 -0
  90. package/dist/local/local.d.ts +17 -11
  91. package/dist/local/local.d.ts.map +1 -1
  92. package/dist/local/local.js +205 -132
  93. package/dist/local/local.js.map +1 -1
  94. package/dist/memory-preflight.d.ts +27 -0
  95. package/dist/memory-preflight.d.ts.map +1 -0
  96. package/dist/memory-preflight.js +83 -0
  97. package/dist/memory-preflight.js.map +1 -0
  98. package/dist/pre-push-hook.d.ts +20 -0
  99. package/dist/pre-push-hook.d.ts.map +1 -0
  100. package/dist/pre-push-hook.js +33 -0
  101. package/dist/pre-push-hook.js.map +1 -0
  102. package/dist/prepared-attempt.d.ts +41 -3
  103. package/dist/prepared-attempt.d.ts.map +1 -1
  104. package/dist/prepared-attempt.js +109 -31
  105. package/dist/prepared-attempt.js.map +1 -1
  106. package/dist/provision.d.ts +129 -15
  107. package/dist/provision.d.ts.map +1 -1
  108. package/dist/provision.js +428 -69
  109. package/dist/provision.js.map +1 -1
  110. package/dist/remote/commands.d.ts +51 -0
  111. package/dist/remote/commands.d.ts.map +1 -0
  112. package/dist/remote/commands.js +94 -0
  113. package/dist/remote/commands.js.map +1 -0
  114. package/dist/remote/container.d.ts +90 -0
  115. package/dist/remote/container.d.ts.map +1 -0
  116. package/dist/remote/container.js +480 -0
  117. package/dist/remote/container.js.map +1 -0
  118. package/dist/remote/leftovers.d.ts +14 -0
  119. package/dist/remote/leftovers.d.ts.map +1 -0
  120. package/dist/remote/leftovers.js +22 -0
  121. package/dist/remote/leftovers.js.map +1 -0
  122. package/dist/remote/liveness.d.ts +33 -0
  123. package/dist/remote/liveness.d.ts.map +1 -0
  124. package/dist/remote/liveness.js +196 -0
  125. package/dist/remote/liveness.js.map +1 -0
  126. package/dist/remote/machine.d.ts +110 -0
  127. package/dist/remote/machine.d.ts.map +1 -0
  128. package/dist/remote/machine.js +2 -0
  129. package/dist/remote/machine.js.map +1 -0
  130. package/dist/remote/remote.d.ts +28 -0
  131. package/dist/remote/remote.d.ts.map +1 -0
  132. package/dist/remote/remote.js +556 -0
  133. package/dist/remote/remote.js.map +1 -0
  134. package/dist/remote/sweep.d.ts +17 -0
  135. package/dist/remote/sweep.d.ts.map +1 -0
  136. package/dist/remote/sweep.js +117 -0
  137. package/dist/remote/sweep.js.map +1 -0
  138. package/dist/renewable-credential.d.ts +17 -0
  139. package/dist/renewable-credential.d.ts.map +1 -0
  140. package/dist/renewable-credential.js +58 -0
  141. package/dist/renewable-credential.js.map +1 -0
  142. package/dist/salvage.d.ts +38 -0
  143. package/dist/salvage.d.ts.map +1 -0
  144. package/dist/salvage.js +198 -0
  145. package/dist/salvage.js.map +1 -0
  146. package/dist/ssh/api-keys.d.ts +36 -0
  147. package/dist/ssh/api-keys.d.ts.map +1 -0
  148. package/dist/ssh/api-keys.js +72 -0
  149. package/dist/ssh/api-keys.js.map +1 -0
  150. package/dist/ssh/codex-homes.d.ts +21 -0
  151. package/dist/ssh/codex-homes.d.ts.map +1 -0
  152. package/dist/ssh/codex-homes.js +78 -0
  153. package/dist/ssh/codex-homes.js.map +1 -0
  154. package/dist/ssh/container.d.ts +32 -0
  155. package/dist/ssh/container.d.ts.map +1 -0
  156. package/dist/ssh/container.js +282 -0
  157. package/dist/ssh/container.js.map +1 -0
  158. package/dist/ssh/credentials.d.ts +43 -0
  159. package/dist/ssh/credentials.d.ts.map +1 -0
  160. package/dist/ssh/credentials.js +86 -0
  161. package/dist/ssh/credentials.js.map +1 -0
  162. package/dist/ssh/gateway/admin.d.ts +45 -0
  163. package/dist/ssh/gateway/admin.d.ts.map +1 -0
  164. package/dist/ssh/gateway/admin.js +129 -0
  165. package/dist/ssh/gateway/admin.js.map +1 -0
  166. package/dist/ssh/gateway/attachments.d.ts +31 -0
  167. package/dist/ssh/gateway/attachments.d.ts.map +1 -0
  168. package/dist/ssh/gateway/attachments.js +168 -0
  169. package/dist/ssh/gateway/attachments.js.map +1 -0
  170. package/dist/ssh/gateway/environment.d.ts +71 -0
  171. package/dist/ssh/gateway/environment.d.ts.map +1 -0
  172. package/dist/ssh/gateway/environment.js +148 -0
  173. package/dist/ssh/gateway/environment.js.map +1 -0
  174. package/dist/ssh/gateway/forward.d.ts +74 -0
  175. package/dist/ssh/gateway/forward.d.ts.map +1 -0
  176. package/dist/ssh/gateway/forward.js +247 -0
  177. package/dist/ssh/gateway/forward.js.map +1 -0
  178. package/dist/ssh/gateway/preflight.d.ts +67 -0
  179. package/dist/ssh/gateway/preflight.d.ts.map +1 -0
  180. package/dist/ssh/gateway/preflight.js +320 -0
  181. package/dist/ssh/gateway/preflight.js.map +1 -0
  182. package/dist/ssh/limits.d.ts +60 -0
  183. package/dist/ssh/limits.d.ts.map +1 -0
  184. package/dist/ssh/limits.js +84 -0
  185. package/dist/ssh/limits.js.map +1 -0
  186. package/dist/ssh/model.d.ts +153 -0
  187. package/dist/ssh/model.d.ts.map +1 -0
  188. package/dist/ssh/model.js +2 -0
  189. package/dist/ssh/model.js.map +1 -0
  190. package/dist/ssh/preflight.d.ts +35 -0
  191. package/dist/ssh/preflight.d.ts.map +1 -0
  192. package/dist/ssh/preflight.js +87 -0
  193. package/dist/ssh/preflight.js.map +1 -0
  194. package/dist/ssh/provisioner/boat.d.ts +33 -0
  195. package/dist/ssh/provisioner/boat.d.ts.map +1 -0
  196. package/dist/ssh/provisioner/boat.js +247 -0
  197. package/dist/ssh/provisioner/boat.js.map +1 -0
  198. package/dist/ssh/provisioner/hetzner.d.ts +32 -0
  199. package/dist/ssh/provisioner/hetzner.d.ts.map +1 -0
  200. package/dist/ssh/provisioner/hetzner.js +337 -0
  201. package/dist/ssh/provisioner/hetzner.js.map +1 -0
  202. package/dist/ssh/provisioner/host-key.d.ts +11 -0
  203. package/dist/ssh/provisioner/host-key.d.ts.map +1 -0
  204. package/dist/ssh/provisioner/host-key.js +57 -0
  205. package/dist/ssh/provisioner/host-key.js.map +1 -0
  206. package/dist/ssh/provisioner/http.d.ts +45 -0
  207. package/dist/ssh/provisioner/http.d.ts.map +1 -0
  208. package/dist/ssh/provisioner/http.js +72 -0
  209. package/dist/ssh/provisioner/http.js.map +1 -0
  210. package/dist/ssh/provisioner/machines.d.ts +48 -0
  211. package/dist/ssh/provisioner/machines.d.ts.map +1 -0
  212. package/dist/ssh/provisioner/machines.js +686 -0
  213. package/dist/ssh/provisioner/machines.js.map +1 -0
  214. package/dist/ssh/provisioner/model.d.ts +92 -0
  215. package/dist/ssh/provisioner/model.d.ts.map +1 -0
  216. package/dist/ssh/provisioner/model.js +37 -0
  217. package/dist/ssh/provisioner/model.js.map +1 -0
  218. package/dist/ssh/ssh.d.ts +23 -0
  219. package/dist/ssh/ssh.d.ts.map +1 -0
  220. package/dist/ssh/ssh.js +145 -0
  221. package/dist/ssh/ssh.js.map +1 -0
  222. package/dist/ssh/worker-records.d.ts +18 -0
  223. package/dist/ssh/worker-records.d.ts.map +1 -0
  224. package/dist/ssh/worker-records.js +100 -0
  225. package/dist/ssh/worker-records.js.map +1 -0
  226. package/dist/ssh/workers.d.ts +80 -0
  227. package/dist/ssh/workers.d.ts.map +1 -0
  228. package/dist/ssh/workers.js +247 -0
  229. package/dist/ssh/workers.js.map +1 -0
  230. package/package.json +25 -9
  231. package/dist/exe-dev/channel.d.ts +0 -12
  232. package/dist/exe-dev/channel.d.ts.map +0 -1
  233. package/dist/exe-dev/channel.js +0 -42
  234. package/dist/exe-dev/channel.js.map +0 -1
  235. package/dist/exe-dev/shell.d.ts +0 -12
  236. package/dist/exe-dev/shell.d.ts.map +0 -1
  237. package/dist/exe-dev/shell.js +0 -31
  238. package/dist/exe-dev/shell.js.map +0 -1
  239. package/dist/exe-dev/sweep.d.ts +0 -10
  240. package/dist/exe-dev/sweep.d.ts.map +0 -1
  241. package/dist/exe-dev/sweep.js +0 -117
  242. package/dist/exe-dev/sweep.js.map +0 -1
  243. package/dist/invalid-frame.d.ts +0 -17
  244. package/dist/invalid-frame.d.ts.map +0 -1
  245. package/dist/invalid-frame.js +0 -111
  246. package/dist/invalid-frame.js.map +0 -1
  247. package/dist/run-host-session.d.ts +0 -27
  248. package/dist/run-host-session.d.ts.map +0 -1
  249. package/dist/run-host-session.js +0 -303
  250. package/dist/run-host-session.js.map +0 -1
@@ -0,0 +1,94 @@
1
+ import { RemoteShell, sshArguments, } from "@usine/agents/child-host";
2
+ import { Effect, Redacted, Stream } from "effect";
3
+ import { ChildProcessSpawner } from "effect/process";
4
+ import { allowlistedEnvironment, collectCommand, requireSuccess, } from "../child-command.js";
5
+ /**
6
+ * The variables the local SSH client inherits. GitHub and factory credentials in the
7
+ * orchestrator environment aren't passed to the client or the machine.
8
+ */
9
+ export const SSH_ENVIRONMENT_ALLOWLIST = [
10
+ "HOME",
11
+ "LANG",
12
+ "LC_ALL",
13
+ "PATH",
14
+ "SHELL",
15
+ "SSH_AGENT_PID",
16
+ "SSH_AUTH_SOCK",
17
+ "TMPDIR",
18
+ "USER",
19
+ ];
20
+ /**
21
+ * The default SSH client for remote Workers. Its keepalive options make a dead TCP connection
22
+ * exit non-zero instead of hanging.
23
+ */
24
+ export const DEFAULT_SSH = {
25
+ command: "ssh",
26
+ args: ["-o", "BatchMode=yes", "-o", "ServerAliveInterval=30", "-o", "ServerAliveCountMax=4"],
27
+ };
28
+ const encoder = new TextEncoder();
29
+ /**
30
+ * Returns `shell` with `variables` sent through OpenSSH `SendEnv` instead of the command line,
31
+ * so the values aren't in arguments, logs, or process listings. The remote sshd drops names
32
+ * not in its `AcceptEnv`.
33
+ */
34
+ export const sendingShell = (shell, variables) => {
35
+ const entries = Object.entries(variables);
36
+ if (entries.length === 0)
37
+ return shell;
38
+ return new RemoteShell({
39
+ ssh: {
40
+ command: shell.ssh.command,
41
+ args: [...shell.ssh.args, "-o", `SendEnv=${entries.map(([name]) => name).join(" ")}`],
42
+ },
43
+ sshEnvironment: {
44
+ ...shell.sshEnvironment,
45
+ ...Object.fromEntries(entries.map(([name, value]) => [name, Redacted.value(value)])),
46
+ },
47
+ destination: shell.destination,
48
+ });
49
+ };
50
+ /** The `RemoteCommands` that use this process's spawner and the allowlisted SSH environment. */
51
+ export const remoteCommandsFor = Effect.gen(function* () {
52
+ const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
53
+ const environment = yield* allowlistedEnvironment(SSH_ENVIRONMENT_ALLOWLIST);
54
+ const shellFor = (ssh, destination) => new RemoteShell({ ssh, sshEnvironment: environment, destination });
55
+ const executeRaw = Effect.fn("RemoteExecutor.executeRaw")(function* (operation, host, command, args, clientEnvironment) {
56
+ yield* Effect.annotateCurrentSpan({ host, operation });
57
+ return yield* collectCommand(spawner, operation, command, args, {
58
+ env: { ...clientEnvironment },
59
+ extendEnv: false,
60
+ });
61
+ });
62
+ const local = Effect.fn("RemoteExecutor.local")(function* (operation, host, command, args) {
63
+ const result = yield* executeRaw(operation, host, command, args, environment);
64
+ return yield* requireSuccess(operation, host, command, args, result);
65
+ });
66
+ const inspect = (operation, shell, command, args) => executeRaw(operation, shell.destination, shell.ssh.command, sshArguments(shell, { command, args }), shell.sshEnvironment);
67
+ const run = Effect.fn("RemoteExecutor.run")(function* (operation, shell, command, args, context = {}) {
68
+ const sshArgs = sshArguments(shell, {
69
+ cwd: context.cwd,
70
+ environment: context.environment,
71
+ command,
72
+ args,
73
+ });
74
+ const result = yield* executeRaw(operation, shell.destination, shell.ssh.command, sshArgs, shell.sshEnvironment);
75
+ const scrub = context.scrub ?? ((text) => text);
76
+ return yield* requireSuccess(operation, shell.destination, shell.ssh.command, sshArgs, {
77
+ ...result,
78
+ stdout: scrub(result.stdout),
79
+ stderr: scrub(result.stderr),
80
+ });
81
+ });
82
+ const runWithInput = Effect.fn("RemoteExecutor.runWithInput")(function* (operation, shell, command, args, input) {
83
+ yield* Effect.annotateCurrentSpan({ host: shell.destination, operation });
84
+ const sshArgs = sshArguments(shell, { command, args });
85
+ const result = yield* collectCommand(spawner, operation, shell.ssh.command, sshArgs, {
86
+ env: { ...shell.sshEnvironment },
87
+ extendEnv: false,
88
+ stdin: Stream.make(encoder.encode(Redacted.value(input))),
89
+ });
90
+ return yield* requireSuccess(operation, shell.destination, shell.ssh.command, sshArgs, result);
91
+ });
92
+ return { shellFor, local, inspect, run, runWithInput };
93
+ });
94
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/remote/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { RemoteShell } from "@usine/agents/child-host";
2
+ import type { Harness } from "@usine/core/agent/brain";
3
+ import { type AttemptId } from "@usine/core/attempt";
4
+ import type { Sink } from "@usine/core/attempt/channel";
5
+ import type { InstanceId } from "@usine/core/instance";
6
+ import { type ContainerImage, type ContainerLimits, type WorkerName } from "@usine/core/worker";
7
+ import { Effect, Option, Redacted } from "effect";
8
+ import { ExecutorOperationError } from "../executor.ts";
9
+ import type { RemoteCommands } from "./commands.ts";
10
+ /** The container CLI on the machine. */
11
+ export declare const CONTAINER_RUNTIME = "docker";
12
+ export declare const PNPM_STORE_VOLUME = "usine-pnpm-store";
13
+ export declare const PNPM_STORE_PATH = "/home/usine/.local/share/pnpm/store";
14
+ export declare const PNPM_STORE_MOUNT = "type=volume,source=usine-pnpm-store,destination=/home/usine/.local/share/pnpm/store,volume-nocopy";
15
+ /** Initializes volume `$3` using runtime `$1`, image `$2`, mount `$4`, and path `$5`. */
16
+ export declare const PREPARE_PNPM_STORE_SCRIPT: string;
17
+ /** The image and limits of each Attempt container on a Worker. */
18
+ export interface ContainerSettings {
19
+ readonly image: ContainerImage;
20
+ readonly limits: ContainerLimits;
21
+ /** The value of the instance label, which the instances that share a GitHub App share too. */
22
+ readonly instance: string;
23
+ /** The value of the instance ID label, which tells apart the instances that share the App. */
24
+ readonly instanceId: InstanceId;
25
+ }
26
+ /** How a Worker runs an Attempt's commands on its machine. */
27
+ export type AttemptIsolation =
28
+ /** The SSH user's shell runs every command, so concurrent Attempts can read each other's files and processes. */
29
+ {
30
+ readonly _tag: "SharedUser";
31
+ }
32
+ /** Each Attempt's commands run in its own container; the SSH user's shell runs only the container's lifecycle and the cached clone's fetch. */
33
+ | {
34
+ readonly _tag: "Container";
35
+ readonly settings: ContainerSettings;
36
+ };
37
+ export declare const sharedUser: AttemptIsolation;
38
+ /** Returns the name of `attemptId`'s container. */
39
+ export declare const attemptContainerName: (attemptId: AttemptId) => string;
40
+ /**
41
+ * Returns the file whose presence records that `attemptId`'s checkout was mounted in a
42
+ * container. It's outside every container's mounts, so no Attempt can create or remove it.
43
+ */
44
+ export declare const containerCheckoutMarker: (workerDirectory: string, attemptId: AttemptId) => string;
45
+ /** One container to start on a machine. */
46
+ export interface ContainerSpec {
47
+ readonly name: string;
48
+ readonly settings: ContainerSettings;
49
+ readonly worker: WorkerName;
50
+ /** The Attempt whose commands the container runs, or `None` for a preflight's container. */
51
+ readonly attemptId: Option.Option<AttemptId>;
52
+ /**
53
+ * The Attempt's checkout, mounted read-write at its own path, and the directory that contains
54
+ * it, which is an empty directory in the container for the children's PID files.
55
+ */
56
+ readonly checkout: Option.Option<{
57
+ readonly path: string;
58
+ readonly parent: string;
59
+ }>;
60
+ /** Machine directories mounted read-only at their own paths. */
61
+ readonly readOnly: ReadonlyArray<string>;
62
+ /** Machine directories of the Attempt mounted read-write at their own paths. */
63
+ readonly writable: ReadonlyArray<string>;
64
+ /** The harnesses whose login files the container gets. */
65
+ readonly harnesses: ReadonlyArray<Harness>;
66
+ /** Variables set in the container without secrets. */
67
+ readonly environment: Readonly<Record<string, string>>;
68
+ /** Variables set in the container through the container CLI's standard input, never a command line. */
69
+ readonly secrets: Readonly<Record<string, Redacted.Redacted<string>>>;
70
+ }
71
+ /**
72
+ * Returns the operations on the containers of a machine: start one for an Attempt or a
73
+ * preflight, stop an Attempt's children in it, and remove the containers that an earlier
74
+ * process left.
75
+ */
76
+ export declare const containersFor: (commands: RemoteCommands) => {
77
+ start: (operation: "cancel" | "cleanup" | "launch" | "preflight" | "prepare", shell: RemoteShell, spec: ContainerSpec) => Effect.Effect<RemoteShell, ExecutorOperationError, import("effect/Scope").Scope>;
78
+ trackMemory: (shell: RemoteShell, spec: ContainerSpec) => Effect.Effect<{
79
+ recordKills: () => Effect.Effect<void, never, never>;
80
+ recordTo: (record: Sink["outOfMemory"]) => Effect.Effect<void, never, never>;
81
+ ensureRunning: Effect.Effect<boolean, ExecutorOperationError, never>;
82
+ }, never, never>;
83
+ stopChildren: (operation: "cancel" | "cleanup" | "launch" | "preflight" | "prepare", shell: RemoteShell, name: string, worktree: string) => Effect.Effect<void, ExecutorOperationError, never>;
84
+ sweep: (shell: RemoteShell, instance: string, instanceId: string & import("effect/Brand").Brand<"InstanceId">, worker: string & import("effect/Brand").Brand<"WorkerName">, kept: ReadonlySet<string>) => Effect.Effect<string[], ExecutorOperationError, never>;
85
+ remove: (shell: RemoteShell, name: string) => Effect.Effect<void, never, never>;
86
+ mark: (operation: "cancel" | "cleanup" | "launch" | "preflight" | "prepare", shell: RemoteShell, marker: string) => Effect.Effect<void, ExecutorOperationError, never>;
87
+ marked: (operation: "cancel" | "cleanup" | "launch" | "preflight" | "prepare", shell: RemoteShell, marker: string) => Effect.Effect<boolean, ExecutorOperationError, never>;
88
+ prepareStore: (operation: "cancel" | "cleanup" | "launch" | "preflight" | "prepare", shell: RemoteShell, image: string & import("effect/Brand").Brand<"ContainerImage">, worker: string & import("effect/Brand").Brand<"WorkerName">) => Effect.Effect<undefined, ExecutorOperationError, never>;
89
+ };
90
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/remote/container.ts"],"names":[],"mappings":"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"}