@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
@@ -1,10 +1,14 @@
1
+ import type { RemoteShell } from "@usine/agents/child-host";
2
+ import { ClaudeLoginLock } from "@usine/agents/runtime";
1
3
  import type { BrainSpec } from "@usine/core/agent/brain";
2
4
  import { Effect } from "effect";
3
- import { ExecutorOperationError, type RunHostCommand, WorkerCapabilityError } from "../executor.ts";
5
+ import { ChildProcessSpawner } from "effect/process";
6
+ import { ExecutorOperationError, WorkerCapabilityError } from "../executor.ts";
4
7
  import type { ExeDevCommands } from "./commands.ts";
5
8
  import { type ExeDevExecutorOptions, type VmState } from "./model.ts";
6
- export declare const preflightFor: (options: ExeDevExecutorOptions, commands: ExeDevCommands, runHost: RunHostCommand) => Effect.Effect<{
7
- preflight: (worker: string & import("effect/Brand").Brand<"WorkerName">, brains: readonly BrainSpec[]) => Effect.Effect<undefined, import("../executor.ts").CredentialUnavailableError | ExecutorOperationError | WorkerCapabilityError, never>;
9
+ export declare const preflightFor: (options: ExeDevExecutorOptions, commands: ExeDevCommands) => Effect.Effect<{
10
+ preflight: (worker: string & import("effect/Brand").Brand<"WorkerName">, brains: readonly BrainSpec[], maxConcurrentAttempts: number) => Effect.Effect<import("../executor.ts").PreflightReport, import("../executor.ts").CredentialUnavailableError | ExecutorOperationError | WorkerCapabilityError, never>;
8
11
  vmFor: (worker: string & import("effect/Brand").Brand<"WorkerName">) => Effect.Effect<VmState, ExecutorOperationError | WorkerCapabilityError, never>;
9
- }, never, never>;
12
+ harnessProbe: (shell: RemoteShell) => import("../harness-preflight.ts").HarnessProbe;
13
+ }, never, ChildProcessSpawner.ChildProcessSpawner | ClaudeLoginLock>;
10
14
  //# sourceMappingURL=preflight.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/exe-dev/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAC7C,OAAO,EACL,sBAAsB,EAEtB,KAAK,cAAc,EACnB,qBAAqB,EAEtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAA4B,KAAK,qBAAqB,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAoBhG,eAAO,MAAM,YAAY;;;gBA2JvB,CAAC"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/exe-dev/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,EAAE,MAAM,EAAuB,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EACL,sBAAsB,EAGtB,qBAAqB,EAEtB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAY,KAAK,qBAAqB,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAkBhF,eAAO,MAAM,YAAY;;;0BASM,WAAW;oEA2HxC,CAAC"}
@@ -1,10 +1,11 @@
1
- import * as AttemptChannel from "@usine/core/attempt/channel";
2
- import { WorkerName } from "@usine/core/worker";
3
- import { Effect, Ref, Schema } from "effect";
4
- import { ExecutorOperationError, logPreflightFailure, WorkerCapabilityError, } from "../executor.js";
5
- import { verifyHarnesses } from "../harness-preflight.js";
6
- import { HomePath, SshDestination } from "./model.js";
7
- const MINIMUM_NODE_MAJOR = 22;
1
+ import { ClaudeLoginLock } from "@usine/agents/runtime";
2
+ import { SshDestination, WorkerName } from "@usine/core/worker";
3
+ import { Effect, Option, Ref, Schema } from "effect";
4
+ import { ChildProcessSpawner } from "effect/process";
5
+ import { ExecutorOperationError, fullPreflight, logPreflightFailure, WorkerCapabilityError, } from "../executor.js";
6
+ import { agentsHarnessProbe, verifyHarnessReadiness } from "../harness-preflight.js";
7
+ import { verifyLinuxMemory } from "../memory-preflight.js";
8
+ import { HomePath } from "./model.js";
8
9
  const Vm = Schema.Struct({
9
10
  vmName: Schema.NonEmptyString,
10
11
  sshDest: SshDestination,
@@ -14,45 +15,38 @@ const VmList = Schema.Struct({ vms: Schema.Array(Vm) });
14
15
  const decodeVmList = Schema.decodeUnknownEffect(Schema.fromJsonString(VmList));
15
16
  const decodeHome = Schema.decodeUnknownEffect(HomePath);
16
17
  const capabilityError = (worker, capability, message, cause) => new WorkerCapabilityError({ worker, capability, message, cause });
17
- export const preflightFor = Effect.fn("ExeDevExecutor.preflightFor")(function* (options, commands, runHost) {
18
+ export const preflightFor = Effect.fn("ExeDevExecutor.preflightFor")(function* (options, commands) {
19
+ const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
20
+ const logins = yield* ClaudeLoginLock;
18
21
  const workers = yield* Ref.make(new Map());
22
+ /** Returns a harness probe that runs on the VM with no extra environment variables. */
23
+ const harnessProbe = (shell) => agentsHarnessProbe(spawner, shell, {});
19
24
  const resolveVm = Effect.fn("ExeDevExecutor.resolveVm")(function* (worker) {
20
25
  const response = yield* commands.lobbyJson("preflight", ["ls", worker]);
21
- const decoded = yield* decodeVmList(response).pipe(Effect.mapError((cause) => capabilityError(worker, "machine", `exe.dev returned invalid machine metadata for Worker ${worker}`, cause)));
26
+ const decoded = yield* decodeVmList(response).pipe(Effect.mapError((cause) => capabilityError(worker, "machine", `exe.dev returned invalid machine metadata for worker "${worker}"`, cause)));
22
27
  const vm = decoded.vms.find(({ vmName }) => vmName === worker);
23
28
  if (vm === undefined) {
24
- return yield* capabilityError(worker, "machine", `exe.dev has no VM named ${worker}`, new Error("worker VM missing"));
29
+ return yield* capabilityError(worker, "machine", `exe.dev has no VM named "${worker}"`, new Error("worker VM missing"));
25
30
  }
26
31
  if (vm.status !== "running") {
27
- return yield* capabilityError(worker, "machine", `exe.dev VM ${worker} is ${vm.status}, not running`, new Error(`VM status: ${vm.status}`));
32
+ return yield* capabilityError(worker, "machine", `exe.dev VM "${worker}" is ${vm.status}, not running`, new Error(`VM status: ${vm.status}`));
28
33
  }
29
34
  const reported = (yield* commands.remote("preflight", vm.sshDest, "printenv", ["HOME"])).trim();
30
- const home = yield* decodeHome(reported).pipe(Effect.mapError((cause) => capabilityError(worker, "toolchain", `exe.dev VM ${worker} returned an invalid home directory`, cause)));
35
+ const home = yield* decodeHome(reported).pipe(Effect.mapError((cause) => capabilityError(worker, "toolchain", `exe.dev VM "${worker}" returned an invalid home directory`, cause)));
31
36
  return { home, sshDest: vm.sshDest };
32
37
  });
33
38
  const asCapability = (worker, capability, message, effect) => effect.pipe(Effect.mapError((cause) => capabilityError(worker, capability, message, cause)));
34
- const preflight = Effect.fn("ExeDevExecutor.preflight")(function* (worker, brains) {
35
- const vm = yield* resolveVm(worker).pipe(Effect.catchTag("ExecutorOperationError", (cause) => capabilityError(worker, "machine", `Could not reach exe.dev Worker ${worker}`, cause)));
39
+ const preflight = Effect.fn("ExeDevExecutor.preflight")(function* (worker, brains, maxConcurrentAttempts) {
40
+ const vm = yield* resolveVm(worker).pipe(Effect.catchTag("ExecutorOperationError", (cause) => capabilityError(worker, "machine", `Can't reach exe.dev worker "${worker}"`, cause)));
36
41
  yield* Effect.annotateCurrentSpan({ worker, host: vm.sshDest });
37
- const gitVersion = (yield* asCapability(worker, "toolchain", `Worker ${worker} cannot run Git`, commands.remote("preflight", vm.sshDest, "git", ["--version"]))).trim();
42
+ const gitVersion = (yield* asCapability(worker, "toolchain", `Worker "${worker}" can't run Git`, commands.remote("preflight", vm.sshDest, "git", ["--version"]))).trim();
38
43
  if (!gitVersion.startsWith("git version ")) {
39
- return yield* capabilityError(worker, "toolchain", `Worker ${worker} returned an unrecognized Git version`, new Error(gitVersion));
44
+ return yield* capabilityError(worker, "toolchain", `Worker "${worker}" returned an unrecognized Git version`, new Error(gitVersion));
40
45
  }
41
- const nodeVersion = (yield* asCapability(worker, "toolchain", `Worker ${worker} cannot run Node.js`, commands.remote("preflight", vm.sshDest, "node", ["--version"]))).trim();
42
- const nodeMajor = Number(/^v(?<major>\d+)/u.exec(nodeVersion)?.groups?.major ?? Number.NaN);
43
- if (!Number.isSafeInteger(nodeMajor) || nodeMajor < MINIMUM_NODE_MAJOR) {
44
- return yield* capabilityError(worker, "toolchain", `Worker ${worker} has Node.js ${nodeVersion || "unknown"}; expected ${MINIMUM_NODE_MAJOR}+`, new Error("Node.js version mismatch"));
45
- }
46
- const protocol = (yield* asCapability(worker, "run-host", `Worker ${worker} cannot run ${runHost.command}`, commands.remote("preflight", vm.sshDest, runHost.command, [
47
- ...runHost.args,
48
- "--protocol-version",
49
- ]))).trim();
50
- if (protocol !== String(AttemptChannel.PROTOCOL_VERSION)) {
51
- return yield* capabilityError(worker, "run-host", `Worker ${worker} has run-host protocol ${protocol || "unknown"}; expected ${AttemptChannel.PROTOCOL_VERSION}`, new Error("run-host protocol mismatch"));
52
- }
53
- yield* verifyHarnesses(worker, brains, runHost, (command, args) => commands.remote("preflight", vm.sshDest, command, args));
46
+ yield* verifyLinuxMemory(worker, maxConcurrentAttempts, commands.remote("preflight", vm.sshDest, "cat", ["/proc/meminfo"]));
47
+ yield* verifyHarnessReadiness(worker, Option.none(), brains, harnessProbe(commands.childHost(vm.sshDest)), logins);
54
48
  for (const integration of options.githubIntegrations) {
55
- yield* asCapability(worker, "credentials", `exe.dev GitHub integration ${integration.name} is not ready for ${integration.repository}`, commands.lobby("preflight", ["integrations", "test", integration.name]));
49
+ yield* asCapability(worker, "credentials", `exe.dev GitHub integration "${integration.name}" isn't ready for ${integration.repository}`, commands.lobby("preflight", ["integrations", "test", integration.name]));
56
50
  }
57
51
  yield* Ref.update(workers, (current) => {
58
52
  const next = new Map(current);
@@ -63,20 +57,17 @@ export const preflightFor = Effect.fn("ExeDevExecutor.preflightFor")(function* (
63
57
  worker,
64
58
  host: vm.sshDest,
65
59
  gitVersion,
66
- nodeVersion,
67
- protocolVersion: AttemptChannel.PROTOCOL_VERSION,
68
60
  harnesses: [...new Set(brains.map(({ harness }) => harness))].join(","),
69
61
  integrations: options.githubIntegrations.length,
70
62
  });
63
+ return fullPreflight;
71
64
  }, logPreflightFailure);
72
- // Both resolveVm failures are members of the ExecutorError union prepare
73
- // reports, so a stopped VM keeps its typed capability shape.
74
65
  const vmFor = Effect.fn("ExeDevExecutor.vmFor")(function* (worker) {
75
66
  const cached = (yield* Ref.get(workers)).get(worker);
76
67
  if (cached !== undefined)
77
68
  return cached;
78
69
  return yield* resolveVm(worker);
79
70
  });
80
- return { preflight, vmFor };
71
+ return { preflight, vmFor, harnessProbe };
81
72
  });
82
73
  //# sourceMappingURL=preflight.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/exe-dev/preflight.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/exe-dev/preflight.ts"],"names":[],"mappings":"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"}
@@ -1,122 +1,370 @@
1
+ import type { AttemptRecovery, RecoverySink } from "@usine/core/attempt/salvage";
1
2
  import { Agent } from "@usine/core/agent";
2
3
  import { BrainSpec } from "@usine/core/agent/brain";
3
- import { AttemptId } from "@usine/core/attempt";
4
+ import { AttemptId, type StopReason } from "@usine/core/attempt";
4
5
  import * as AttemptChannel from "@usine/core/attempt/channel";
5
6
  import { AttemptFailure } from "@usine/core/attempt/failure";
7
+ import { LoopPermissions } from "@usine/core/loop";
8
+ import { SalvagePushed } from "@usine/core/attempt/salvage";
6
9
  import { RepositoryName } from "@usine/core/repository";
7
- import { WorkerName, WorkerKind } from "@usine/core/worker";
10
+ import { RunId } from "@usine/core/run";
11
+ import { BotAccount, ContainerLimits, WorkerName, WorkerKind } from "@usine/core/worker";
8
12
  import { StepResult } from "@usine/core/step/result";
9
- import { Context, Effect, Redacted, Schema, Scope } from "effect";
10
- /** The Worker operation that failed during readiness checks or an Attempt's lifecycle. */
13
+ import { Context, Effect, Option, Redacted, type Result, Schema, Scope } from "effect";
11
14
  export declare const ExecutorOperation: Schema.Literals<readonly ["preflight", "prepare", "launch", "cancel", "cleanup"]>;
12
15
  export type ExecutorOperation = typeof ExecutorOperation.Type;
13
- /** A prerequisite a Worker must satisfy before it can accept Attempts. */
14
- export declare const WorkerCapability: Schema.Literals<readonly ["machine", "toolchain", "run-host", "harness-login", "credentials"]>;
16
+ export declare const WorkerCapability: Schema.Literals<readonly ["machine", "toolchain", "memory", "harness-login", "credentials", "gateway", "container", "provider"]>;
15
17
  export type WorkerCapability = typeof WorkerCapability.Type;
16
18
  declare const ExecutorOperationError_base: Schema.Class<ExecutorOperationError, Schema.TaggedStruct<"ExecutorOperationError", {
19
+ /** `cleanup` includes removing a checkout, its credential, or credentials left by an earlier process. */
17
20
  readonly operation: Schema.Literals<readonly ["preflight", "prepare", "launch", "cancel", "cleanup"]>;
21
+ /** An operator-facing summary without the Worker name. Not part of the contract; branch on `operation`. */
18
22
  readonly message: Schema.NonEmptyString;
23
+ /** The underlying failure, for example an `Error` with the command's stderr, or a timeout. */
19
24
  readonly cause: Schema.Defect;
20
25
  }>, import("effect/Cause").YieldableError>;
21
- /** A Worker operation failed before its requested work completed. */
22
26
  export declare class ExecutorOperationError extends ExecutorOperationError_base {
23
27
  }
28
+ /**
29
+ * `refused` if a retry gets the same result: the installation doesn't cover the repository,
30
+ * lacks a permission, or is suspended, or an exe.dev Worker has no integration for it.
31
+ * `unreachable` if a retry can succeed: a GitHub outage or rate limit, or no response from a
32
+ * Gateway or exe.dev command.
33
+ */
34
+ export declare const CredentialUnavailableReason: Schema.Literals<readonly ["refused", "unreachable"]>;
35
+ export type CredentialUnavailableReason = typeof CredentialUnavailableReason.Type;
24
36
  declare const CredentialUnavailableError_base: Schema.Class<CredentialUnavailableError, Schema.TaggedStruct<"CredentialUnavailableError", {
25
37
  readonly repository: Schema.brand<Schema.String, "RepositoryName">;
38
+ readonly reason: Schema.Literals<readonly ["refused", "unreachable"]>;
39
+ /** An operator-facing summary, including GitHub's reason for a refusal. */
26
40
  readonly message: Schema.NonEmptyString;
41
+ /** The underlying failure, for example the GitHub API error from minting the token. */
27
42
  readonly cause: Schema.Defect;
28
43
  }>, import("effect/Cause").YieldableError>;
29
- /** A Worker could not obtain access to the repository assigned to an Attempt. */
30
44
  export declare class CredentialUnavailableError extends CredentialUnavailableError_base {
31
45
  }
32
46
  declare const WorkerCapabilityError_base: Schema.Class<WorkerCapabilityError, Schema.TaggedStruct<"WorkerCapabilityError", {
33
47
  readonly worker: Schema.brand<Schema.String, "WorkerName">;
34
- readonly capability: Schema.Literals<readonly ["machine", "toolchain", "run-host", "harness-login", "credentials"]>;
48
+ /**
49
+ * - `machine`: the machine or VM is absent, stopped, or unreachable, or its Worker directory
50
+ * isn't writable.
51
+ * - `toolchain`: Git or a brain's harness doesn't run.
52
+ * - `memory`: less than 1.5 GiB per concurrent Attempt, no swap for more than one, or memory
53
+ * not reported.
54
+ * - `harness-login`: a brain's harness isn't logged in.
55
+ * - `credentials`: an exe.dev integration isn't ready, or the Worker kind can't issue a
56
+ * read-only credential for a `permissions: read` Loop.
57
+ * - `gateway`: the Gateway doesn't respond or isn't reachable from the machine.
58
+ * - `container`: the machine's Docker doesn't respond to the SSH user, the SSH user can use
59
+ * Docker's socket without the `docker` CLI, the Attempt image can't be pulled, or its user ID
60
+ * differs from the SSH user's.
61
+ * - `provider`: a provisioned Worker's provider refuses its token, or its image, SSH key,
62
+ * network, server type, or location doesn't exist there.
63
+ */
64
+ readonly capability: Schema.Literals<readonly ["machine", "toolchain", "memory", "harness-login", "credentials", "gateway", "container", "provider"]>;
35
65
  readonly message: Schema.NonEmptyString;
66
+ /** The observed value, for example unrecognized `git --version` output or the harness readiness report. */
36
67
  readonly cause: Schema.Defect;
37
68
  }>, import("effect/Cause").YieldableError>;
38
- /** A verify-only preflight found a Worker capability missing or incompatible. */
69
+ /** The error when preflight finds a Worker capability missing or incompatible. */
39
70
  export declare class WorkerCapabilityError extends WorkerCapabilityError_base {
40
71
  }
41
- /** A readiness, access, or lifecycle failure reported by a Worker operation. */
72
+ /**
73
+ * `capacity` if the provider has no machine of the configured type now, `quota` if the account's
74
+ * limits are reached, `refused` if the provider refuses the token or the request, `provider` for
75
+ * an API error or rate limit, `unreachable` if the API doesn't respond, and `timeout` if the
76
+ * machine didn't answer over SSH in time. Each is retried later.
77
+ */
78
+ export declare const MachineUnavailableReason: Schema.Literals<readonly ["capacity", "quota", "refused", "provider", "unreachable", "timeout"]>;
79
+ export type MachineUnavailableReason = typeof MachineUnavailableReason.Type;
80
+ declare const MachineUnavailableError_base: Schema.Class<MachineUnavailableError, Schema.TaggedStruct<"MachineUnavailableError", {
81
+ readonly worker: Schema.brand<Schema.String, "WorkerName">;
82
+ readonly provider: Schema.Literals<readonly ["hetzner", "boat"]>;
83
+ readonly reason: Schema.Literals<readonly ["capacity", "quota", "refused", "provider", "unreachable", "timeout"]>;
84
+ /** An operator-facing summary with the provider's own message. Contains no token. */
85
+ readonly message: Schema.NonEmptyString;
86
+ }>, import("effect/Cause").YieldableError>;
87
+ /**
88
+ * The error when a provisioned Worker can't create a machine for an Attempt. The Run keeps
89
+ * waiting, and the scheduler tries again later; it isn't an Attempt failure.
90
+ */
91
+ export declare class MachineUnavailableError extends MachineUnavailableError_base {
92
+ }
42
93
  export declare const ExecutorError: Schema.Union<readonly [typeof ExecutorOperationError, typeof CredentialUnavailableError, typeof WorkerCapabilityError]>;
43
94
  export type ExecutorError = typeof ExecutorError.Type;
44
- /** Logs every preflight refusal so a missing capability is explainable from logs alone. */
45
- export declare const logPreflightFailure: <A, R>(effect: Effect.Effect<A, ExecutorError, R>) => Effect.Effect<A, ExecutorError, R>;
46
- /** Process command for a one-shot run host or a preflight capability probe. */
47
- export interface RunHostCommand {
48
- readonly command: string;
49
- readonly args: ReadonlyArray<string>;
95
+ /** The outcome of a preflight that found every capability that Attempts need. */
96
+ export interface PreflightReport {
97
+ /**
98
+ * Why the Worker runs Attempts without a capability that keeps them apart, such as an SSH
99
+ * Worker whose machine has no Docker. `None` if it has every such capability.
100
+ */
101
+ readonly degraded: Option.Option<string>;
102
+ /**
103
+ * When the brains are checked instead, if the preflight had no machine to check them on, as
104
+ * for a provisioned Worker, which checks them on its first machine each day. `None` if the
105
+ * preflight checked them.
106
+ */
107
+ readonly deferred: Option.Option<string>;
108
+ /**
109
+ * The limits of each Attempt container, the ones `usine.yaml` sets and the ones derived from
110
+ * the machine. `None` if the Worker runs no containers or the preflight checked no machine.
111
+ */
112
+ readonly containerLimits: Option.Option<ContainerLimits>;
50
113
  }
114
+ /** The report of a Worker that runs Attempts as designed, without containers. */
115
+ export declare const fullPreflight: PreflightReport;
116
+ /** Logs each preflight failure at error level. */
117
+ export declare const logPreflightFailure: <A, R>(effect: Effect.Effect<A, ExecutorError, R>) => Effect.Effect<A, ExecutorError, R>;
51
118
  declare const CheckoutRequest_base: Schema.Class<CheckoutRequest, Schema.Struct<{
119
+ /** The checkout directory name, and the key for `cancel`, `intervene`, `isLive`, and `outcome`. */
52
120
  readonly attemptId: Schema.brand<Schema.NonEmptyString, "AttemptId">;
53
121
  readonly worker: Schema.brand<Schema.String, "WorkerName">;
122
+ /** The only repository the Attempt's credential can access (ADR 0011). */
54
123
  readonly repository: Schema.brand<Schema.String, "RepositoryName">;
124
+ /** The Loop of the Attempt's Run, shown in a `read` checkout's pre-push hook message. */
125
+ readonly loop: Schema.brand<Schema.NonEmptyString, "LoopName">;
126
+ /**
127
+ * The Attempt's access to `repository` (ADR 0011). With `read`, the credential can't push, a
128
+ * pre-push hook explains rejected pushes, and an unsuccessful Attempt's checkout is removed
129
+ * without salvage. A Worker kind that can't issue such a credential fails `prepare` with a
130
+ * `credentials` capability error.
131
+ */
132
+ readonly permissions: Schema.Literals<readonly ["write", "read"]>;
133
+ /** The revision to fetch, resolved to a commit during preparation and stored as the RunSpec's `baseCommit`. */
55
134
  readonly revision: Schema.brand<Schema.String, "RepositoryRevision">;
135
+ /** The payload of the event that triggered the Run, included as JSON in the parent's prompt. */
56
136
  readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
137
+ /** The parent's task text, after Loop interpolation or operator amendment. */
57
138
  readonly task: Schema.brand<Schema.String, "AttemptTask">;
139
+ /**
140
+ * The Agent whose persona and name go in the parent's prompt and whose brain runs the
141
+ * children. Preparation verifies the brain on the Worker.
142
+ */
58
143
  readonly agent: typeof Agent;
144
+ /**
145
+ * The Pi parent's model. If `None`, uses the configured default model, then the first model
146
+ * with a credential. A model unknown to Pi fails the launch.
147
+ */
59
148
  readonly parentModel: Schema.Option<Schema.brand<Schema.String, "ModelId">>;
149
+ /** The maximum child sessions per Attempt. One more fails the Attempt with `ChildSessionBudgetFailure`. */
60
150
  readonly maxChildren: Schema.brand<Schema.Int, "ChildSessionBudget">;
61
- /** Maximum minutes of live run-host execution; preparation and resource cleanup are outside this budget. */
62
- readonly maxAttemptMinutes: Schema.Int;
63
- /** Maximum reported tokens across the parent and every child; operator Holds never pause this ceiling. */
64
- readonly maxAttemptTokens: Schema.Int;
151
+ /** The maximum minutes of Attempt execution, excluding preparation and cleanup, or `None` for no limit. */
152
+ readonly maxAttemptMinutes: Schema.Option<Schema.Int>;
153
+ /** The maximum tokens consumed by the parent and all children, or `None` for no limit. Holds don't pause it. */
154
+ readonly maxAttemptTokens: Schema.Option<Schema.Int>;
155
+ /** The Pi parent's reasoning effort. The launch fails if the model doesn't support it. */
65
156
  readonly parentEffort: Schema.Literals<readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"]>;
157
+ /** The ref that unfinished work is pushed to if the Attempt doesn't succeed. */
158
+ readonly salvageRef: Schema.brand<Schema.NonEmptyString, "SalvageRef">;
159
+ /** The previous Attempt's pushed salvage, checked out instead of `revision`. */
160
+ readonly resume: Schema.Option<typeof SalvagePushed>;
161
+ /**
162
+ * Whether the parent task is still live after an orchestrator restart. If true, preparation
163
+ * reuses the existing checkout and launch reattaches to the parent.
164
+ */
165
+ readonly reattach: Schema.withConstructorDefault<Schema.Boolean>;
166
+ /**
167
+ * The GitHub login the Attempt writes as, copied into the RunSpec; harvesting collects comments
168
+ * by this author. If `None`, harvesting asks GitHub for the credential's login.
169
+ */
170
+ readonly botLogin: Schema.withConstructorDefault<Schema.Option<Schema.brand<Schema.String, "BotLogin">>>;
171
+ /**
172
+ * The author and committer of every commit that the Attempt's parent and children make. Their
173
+ * environment sets it, so no git config on the Worker's machine applies.
174
+ */
175
+ readonly commitAuthor: typeof BotAccount;
66
176
  }>, {}>;
67
- /** The repository, revision, and Agent task assigned to a Worker for one fresh Attempt checkout. */
68
177
  export declare class CheckoutRequest extends CheckoutRequest_base {
69
178
  }
70
- /** One Attempt's disposable checkout directory. */
71
179
  export declare const WorktreePath: Schema.brand<Schema.NonEmptyString, "WorktreePath">;
72
180
  export type WorktreePath = typeof WorktreePath.Type;
73
181
  declare const AttemptWorkspace_base: Schema.Class<AttemptWorkspace, Schema.Struct<{
74
182
  readonly worker: Schema.brand<Schema.String, "WorkerName">;
183
+ /** The request's fields plus the commit that `revision` resolved to. */
75
184
  readonly spec: typeof AttemptChannel.RunSpec;
185
+ /** The checkout path on the Worker's machine, where the children run. */
76
186
  readonly worktree: Schema.brand<Schema.NonEmptyString, "WorktreePath">;
77
187
  }>, {}>;
78
- /** The serializable location and RunSpec of an Attempt checkout. Owning this record does not grant access to live resources or credentials. */
188
+ /** A serializable checkout location and RunSpec, without credentials or live resources. */
79
189
  export declare class AttemptWorkspace extends AttemptWorkspace_base {
80
190
  }
81
191
  /**
82
- * One prepared Attempt with a scoped checkout and repository access. Use it within
83
- * the scope that prepared it. Closing that scope stops any active run host before
84
- * removing the checkout and releasing credentials, including when launch never starts.
192
+ * An Attempt prepared in the caller's scope and valid only within it. Closing that scope stops
193
+ * any active session, removes the checkout, and releases credentials, whether or not `launch`
194
+ * ran. The checkout stays on disk while the parent task stays live for a reattachment or isn't
195
+ * confirmed stopped.
85
196
  */
86
197
  export interface PreparedAttempt {
87
- /** Checkout metadata suitable for inspection or serialization; contains no credentials. */
88
198
  readonly workspace: AttemptWorkspace;
89
199
  /**
90
- * Runs this Attempt once, recording channel activity through `io`. Completion,
91
- * failure, or interruption releases its resources before returning. Cleanup
92
- * failures are logged without replacing the agent's outcome or retrying its work.
93
- * Reusing an Attempt after launch or release fails with an infrastructure error.
200
+ * Runs the Attempt once, writing channel activity to `io`, and releases its resources before
201
+ * returning. Cleanup failures are logged without changing the result. Fails with an
202
+ * infrastructure `AttemptFailure` if called again or after release.
94
203
  */
95
204
  readonly launch: (io: AttemptChannel.Sink) => Effect.Effect<StepResult, AttemptFailure>;
96
205
  }
206
+ declare const WorkerCredential_base: Schema.Class<WorkerCredential, Schema.Struct<{
207
+ /**
208
+ * The token for git and gh, never written inside the checkout. Wiped when the Attempt's scope
209
+ * closes; `Redacted.value` then throws.
210
+ */
211
+ readonly value: Schema.declare<Redacted.Redacted<string>, Redacted.Redacted<string>>;
212
+ /** A new credential is requested when five minutes or less remain. */
213
+ readonly expiresAt: Schema.DateTimeUtc;
214
+ }>, {}>;
215
+ export declare class WorkerCredential extends WorkerCredential_base {
216
+ }
97
217
  declare const CredentialProvider_base: Context.ServiceClass<CredentialProvider, "@usine/executor/CredentialProvider", {
98
- readonly issue: (repository: RepositoryName, attemptId: AttemptId) => Effect.Effect<Redacted.Redacted<string>, CredentialUnavailableError>;
218
+ /**
219
+ * Returns a credential for `repository` only, with `permissions` (`read` can't push). The local
220
+ * and SSH executors call it during `prepare` and again before each expiry until the Attempt's
221
+ * resources are released; a failed renewal is logged and retried after 30 seconds.
222
+ */
223
+ readonly issue: (repository: RepositoryName, attemptId: AttemptId, permissions: LoopPermissions) => Effect.Effect<WorkerCredential, CredentialUnavailableError>;
99
224
  }>;
100
- /** Mints exactly one repository-scoped credential for each prepared Attempt. */
101
225
  export declare class CredentialProvider extends CredentialProvider_base {
102
226
  }
103
227
  declare const Executor_base: Context.ServiceClass<Executor, "@usine/executor/Executor", {
228
+ /**
229
+ * Reconciles the checkout of an Attempt that no Run reattaches, recording its salvage before
230
+ * releasing any work, even if `isLive` returns true. First stops the parent task if durable
231
+ * storage marks it live; if the task can't be confirmed stopped, fails with a `cancel`
232
+ * `ExecutorOperationError` and leaves the checkout. For an open Attempt whose parent task
233
+ * failed before the orchestrator stopped, first records the comments it posted on the Run's
234
+ * Item. `commitAuthor` returns the author and committer of the salvage commit, like
235
+ * `CheckoutRequest.commitAuthor`. It runs only before a salvage, and its failure leaves the
236
+ * checkout.
237
+ */
238
+ readonly recover: <E, A>(attempt: AttemptRecovery, record: RecoverySink<E>, commitAuthor: Effect.Effect<BotAccount, A>) => Effect.Effect<void, E | A | ExecutorError>;
239
+ /** The orchestrator doesn't start if a configured Worker has a different kind. */
104
240
  readonly kind: WorkerKind;
105
- /** Verifies Git, the run host, and each rostered brain in the Worker environment; never installs tools or logs in. */
106
- readonly preflight: (worker: WorkerName, brains: ReadonlyArray<BrainSpec>) => Effect.Effect<void, ExecutorError>;
107
241
  /**
108
- * Verifies the assigned brain before acquiring a fresh Attempt in the caller's scope. Clone, fetch, and lock waits
109
- * remain interruptible; partial preparation releases everything already acquired
110
- * before reporting failure. Each request must identify a fresh Attempt.
242
+ * Returns whether the parent task is still running, or reported success before its checkout
243
+ * was harvested. If true, the orchestrator reattaches after a restart.
244
+ */
245
+ readonly isLive: (attemptId: AttemptId) => Effect.Effect<boolean, AttemptFailure>;
246
+ /**
247
+ * Returns the result a finished parent task stored before an orchestrator restart: the
248
+ * harvested result or the parent's failure. Returns `None` if nothing is stored or `isLive` is
249
+ * true.
250
+ */
251
+ readonly outcome: (attemptId: AttemptId) => Effect.Effect<Option.Option<Result.Result<StepResult, AttemptFailure>>, AttemptFailure>;
252
+ /**
253
+ * Verifies Git, enough memory for `maxConcurrentAttempts` concurrent Attempts, and each brain
254
+ * in `brains`. Never installs tools or logs in; an SSH Worker pulls its Attempt image.
255
+ */
256
+ readonly preflight: (worker: WorkerName, brains: ReadonlyArray<BrainSpec>, maxConcurrentAttempts: number) => Effect.Effect<PreflightReport, ExecutorError>;
257
+ /**
258
+ * Verifies the Agent's brain, then acquires the checkout and credential in the caller's scope.
259
+ * Clone, fetch, and lock waits are interruptible; on failure, releases everything acquired so
260
+ * far. `attemptId` must be new unless `reattach` is set.
111
261
  */
112
262
  readonly prepare: (request: CheckoutRequest) => Effect.Effect<PreparedAttempt, ExecutorError, Scope.Scope>;
113
- /** Requests an active Attempt to stop, allowing a grace period before forcing termination. */
114
- readonly cancel: (attemptId: AttemptId) => Effect.Effect<void, ExecutorError>;
115
- /** Delivers an attributed operator action through the active Attempt's channel. */
263
+ /**
264
+ * Stops preparation and releases partial resources, or cancels the live parent task with a
265
+ * grace period before forced termination, including one not reattached after a restart.
266
+ * `reason` is why the engine stops the task, which the executor logs. Fails if the parent task
267
+ * can't be confirmed stopped. A canceled Attempt can't launch.
268
+ *
269
+ * An Attempt whose launch ended without a confirmed stop keeps its checkout on disk. Once a
270
+ * later call confirms the stop, it salvages and removes that checkout, as `recover` does, and
271
+ * logs a failure without failing.
272
+ */
273
+ readonly cancel: (attemptId: AttemptId, reason: StopReason) => Effect.Effect<void, ExecutorError>;
274
+ /** Sends an operator intervention to the Attempt's live session. */
116
275
  readonly intervene: (attemptId: AttemptId, intervention: AttemptChannel.Intervention) => Effect.Effect<void, AttemptFailure>;
276
+ /**
277
+ * Removes the files on the Workers that no Attempt holds or can use, such as the Codex home
278
+ * of an Attempt without a checkout on an SSH Worker, which a crash or a failed cleanup left.
279
+ * Run it after startup recovery, which keeps the checkouts of Attempts that a Run may
280
+ * reattach. Never fails; logs what it couldn't remove.
281
+ */
282
+ readonly sweep: Effect.Effect<void>;
117
283
  }>;
118
- /** Prepares isolated checkouts, runs Attempts on a Worker, and releases their resources (ADR 0006). */
284
+ /** The service that prepares checkouts, runs Attempts on a Worker, and releases their resources (ADR 0006). */
119
285
  export declare class Executor extends Executor_base {
120
286
  }
121
- export {};
287
+ /** The executor's hold on one provisioned machine, which `WorkerMachines.release` ends. */
288
+ export declare const MachineHold: Schema.brand<Schema.NonEmptyString, "MachineHold">;
289
+ export type MachineHold = typeof MachineHold.Type;
290
+ declare const MachineCheck_base: Schema.Class<MachineCheck, Schema.Struct<{
291
+ readonly brains: Schema.$Array<typeof BrainSpec>;
292
+ /**
293
+ * The limits of each Attempt container that the Worker's machines get until the next check,
294
+ * or `None` if the machine has no Docker.
295
+ */
296
+ readonly containerLimits: Schema.Option<typeof ContainerLimits>;
297
+ }>, {}>;
298
+ /** The machine preflight of a provisioned Worker's first machine each day. */
299
+ export declare class MachineCheck extends MachineCheck_base {
300
+ }
301
+ declare const MachineGrant_base: Schema.Class<MachineGrant, Schema.Struct<{
302
+ readonly hold: Schema.brand<Schema.NonEmptyString, "MachineHold">;
303
+ readonly id: Schema.brand<Schema.String, "MachineId">;
304
+ readonly worker: Schema.brand<Schema.String, "WorkerName">;
305
+ readonly provider: Schema.Literals<readonly ["hetzner", "boat"]>;
306
+ /** The check that this machine got as the Worker's first each day, or `None` if it got none. */
307
+ readonly checked: Schema.Option<typeof MachineCheck>;
308
+ }>, {}>;
309
+ /** A machine that a provisioned Worker created for an Attempt and holds until `release`. */
310
+ export declare class MachineGrant extends MachineGrant_base {
311
+ }
312
+ /**
313
+ * `creating` until the machine answers over SSH, `ready` while an Attempt holds it, and
314
+ * `deleting` until its deletion succeeds.
315
+ */
316
+ export declare const MachineState: Schema.Literals<readonly ["creating", "ready", "deleting"]>;
317
+ export type MachineState = typeof MachineState.Type;
318
+ declare const MachineStatus_base: Schema.Class<MachineStatus, Schema.Struct<{
319
+ readonly worker: Schema.brand<Schema.String, "WorkerName">;
320
+ readonly provider: Schema.Literals<readonly ["hetzner", "boat"]>;
321
+ readonly state: Schema.Literals<readonly ["creating", "ready", "deleting"]>;
322
+ /** `None` until the provider accepts the creation. */
323
+ readonly id: Schema.Option<Schema.brand<Schema.String, "MachineId">>;
324
+ /** The Run the machine was created for, or `None` for a machine found after a restart. */
325
+ readonly runId: Schema.Option<Schema.brand<Schema.NonEmptyString, "RunId">>;
326
+ readonly attemptId: Schema.Option<Schema.brand<Schema.NonEmptyString, "AttemptId">>;
327
+ /** When the creation started, or when the provider created a machine found after a restart. */
328
+ readonly since: Schema.DateTimeUtc;
329
+ }>, {}>;
330
+ /** A machine in flight on a provisioned Worker. */
331
+ export declare class MachineStatus extends MachineStatus_base {
332
+ }
333
+ declare const WorkerMachines_base: Context.ServiceClass<WorkerMachines, "@usine/executor/WorkerMachines", {
334
+ /** Returns whether `worker` creates a machine for each Attempt. */
335
+ readonly provisions: (worker: WorkerName) => Effect.Effect<boolean>;
336
+ /**
337
+ * Creates a machine on `worker` for the next Attempt of `runId`, labeled with the instance,
338
+ * Worker, and Run, and waits until it answers over SSH. The first machine on the Worker each
339
+ * day also gets the preflight checks of `brains`, whose failure is a `WorkerCapabilityError`.
340
+ * On failure or interruption, deletes the machine.
341
+ */
342
+ readonly create: (worker: WorkerName, runId: RunId, brains: ReadonlyArray<BrainSpec>) => Effect.Effect<MachineGrant, MachineUnavailableError | WorkerCapabilityError>;
343
+ /** Gives the held machine to the Attempt, so that `Executor.prepare` uses it and a restart finds it. */
344
+ readonly assign: (hold: MachineHold, attemptId: AttemptId) => Effect.Effect<void, ExecutorOperationError>;
345
+ /**
346
+ * Holds the machine of `attemptId`, an Attempt from before a restart on `worker`, until
347
+ * `release`. Returns `None` if `worker` isn't provisioned or the provider no longer lists the
348
+ * machine. If the provider can't be read, the hold keeps a `sweep` from deleting the machine,
349
+ * and a later use looks it up again.
350
+ */
351
+ readonly adopt: (worker: WorkerName, attemptId: AttemptId) => Effect.Effect<Option.Option<MachineHold>>;
352
+ /** Deletes the held machine. Logs a failure, and each `sweep` tries again. */
353
+ readonly release: (hold: MachineHold) => Effect.Effect<void>;
354
+ /**
355
+ * Lists each provisioned Worker's machines at its provider and deletes those that no
356
+ * Attempt or creation in this process holds. Run it after startup recovery, which adopts or
357
+ * reconciles the machines of earlier Attempts.
358
+ */
359
+ readonly sweep: Effect.Effect<void>;
360
+ /** The machines in flight, oldest first. */
361
+ readonly machines: Effect.Effect<ReadonlyArray<MachineStatus>>;
362
+ }>;
363
+ /**
364
+ * The machines of the provisioned Workers, which create one machine per Attempt and delete it
365
+ * afterwards (#550). Only the SSH executor provides it.
366
+ */
367
+ export declare class WorkerMachines extends WorkerMachines_base {
368
+ }
369
+ export { claudeLoginLockLayer } from "./claude-login-lock.ts";
122
370
  //# sourceMappingURL=executor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}