@usine/executor 0.3.0 → 0.4.1-next.240.g158c84b

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 (185) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +116 -19
  3. package/dist/child-command.d.ts +1 -1
  4. package/dist/child-command.d.ts.map +1 -1
  5. package/dist/child-command.js +6 -4
  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 +3 -2
  12. package/dist/claude-login-lock.d.ts.map +1 -1
  13. package/dist/claude-login-lock.js +10 -4
  14. package/dist/claude-login-lock.js.map +1 -1
  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/durable-session.d.ts +21 -3
  36. package/dist/durable-session.d.ts.map +1 -1
  37. package/dist/durable-session.js +69 -10
  38. package/dist/durable-session.js.map +1 -1
  39. package/dist/exe-dev/commands.d.ts +1 -1
  40. package/dist/exe-dev/commands.d.ts.map +1 -1
  41. package/dist/exe-dev/exe-dev.d.ts +1 -1
  42. package/dist/exe-dev/exe-dev.d.ts.map +1 -1
  43. package/dist/exe-dev/exe-dev.js +9 -1
  44. package/dist/exe-dev/exe-dev.js.map +1 -1
  45. package/dist/exe-dev/preflight.d.ts +2 -2
  46. package/dist/exe-dev/preflight.d.ts.map +1 -1
  47. package/dist/exe-dev/preflight.js +5 -4
  48. package/dist/exe-dev/preflight.js.map +1 -1
  49. package/dist/executor.d.ts +164 -15
  50. package/dist/executor.d.ts.map +1 -1
  51. package/dist/executor.js +100 -3
  52. package/dist/executor.js.map +1 -1
  53. package/dist/guard.d.ts.map +1 -1
  54. package/dist/guard.js +1 -0
  55. package/dist/guard.js.map +1 -1
  56. package/dist/harness-preflight.d.ts +9 -8
  57. package/dist/harness-preflight.d.ts.map +1 -1
  58. package/dist/harness-preflight.js +15 -10
  59. package/dist/harness-preflight.js.map +1 -1
  60. package/dist/local/local.d.ts +1 -1
  61. package/dist/local/local.d.ts.map +1 -1
  62. package/dist/local/local.js +76 -37
  63. package/dist/local/local.js.map +1 -1
  64. package/dist/memory-preflight.d.ts +3 -1
  65. package/dist/memory-preflight.d.ts.map +1 -1
  66. package/dist/memory-preflight.js +1 -1
  67. package/dist/memory-preflight.js.map +1 -1
  68. package/dist/pre-push-hook.d.ts +1 -1
  69. package/dist/pre-push-hook.js +1 -1
  70. package/dist/prepared-attempt.d.ts +8 -0
  71. package/dist/prepared-attempt.d.ts.map +1 -1
  72. package/dist/prepared-attempt.js.map +1 -1
  73. package/dist/provision.d.ts +64 -13
  74. package/dist/provision.d.ts.map +1 -1
  75. package/dist/provision.js +99 -42
  76. package/dist/provision.js.map +1 -1
  77. package/dist/remote/commands.d.ts +1 -1
  78. package/dist/remote/commands.d.ts.map +1 -1
  79. package/dist/remote/commands.js +1 -1
  80. package/dist/remote/commands.js.map +1 -1
  81. package/dist/remote/container.d.ts +90 -0
  82. package/dist/remote/container.d.ts.map +1 -0
  83. package/dist/remote/container.js +480 -0
  84. package/dist/remote/container.js.map +1 -0
  85. package/dist/remote/liveness.d.ts +1 -1
  86. package/dist/remote/liveness.d.ts.map +1 -1
  87. package/dist/remote/liveness.js +6 -4
  88. package/dist/remote/liveness.js.map +1 -1
  89. package/dist/remote/machine.d.ts +52 -6
  90. package/dist/remote/machine.d.ts.map +1 -1
  91. package/dist/remote/remote.d.ts +11 -7
  92. package/dist/remote/remote.d.ts.map +1 -1
  93. package/dist/remote/remote.js +340 -92
  94. package/dist/remote/remote.js.map +1 -1
  95. package/dist/remote/sweep.d.ts +3 -1
  96. package/dist/remote/sweep.d.ts.map +1 -1
  97. package/dist/remote/sweep.js +2 -1
  98. package/dist/remote/sweep.js.map +1 -1
  99. package/dist/salvage.d.ts +18 -10
  100. package/dist/salvage.d.ts.map +1 -1
  101. package/dist/salvage.js +123 -29
  102. package/dist/salvage.js.map +1 -1
  103. package/dist/ssh/api-keys.d.ts +36 -0
  104. package/dist/ssh/api-keys.d.ts.map +1 -0
  105. package/dist/ssh/api-keys.js +72 -0
  106. package/dist/ssh/api-keys.js.map +1 -0
  107. package/dist/ssh/codex-homes.d.ts +21 -0
  108. package/dist/ssh/codex-homes.d.ts.map +1 -0
  109. package/dist/ssh/codex-homes.js +78 -0
  110. package/dist/ssh/codex-homes.js.map +1 -0
  111. package/dist/ssh/container.d.ts +32 -0
  112. package/dist/ssh/container.d.ts.map +1 -0
  113. package/dist/ssh/container.js +282 -0
  114. package/dist/ssh/container.js.map +1 -0
  115. package/dist/ssh/credentials.d.ts +3 -0
  116. package/dist/ssh/credentials.d.ts.map +1 -1
  117. package/dist/ssh/credentials.js +3 -0
  118. package/dist/ssh/credentials.js.map +1 -1
  119. package/dist/ssh/gateway/admin.d.ts +1 -1
  120. package/dist/ssh/gateway/admin.d.ts.map +1 -1
  121. package/dist/ssh/gateway/admin.js +2 -2
  122. package/dist/ssh/gateway/admin.js.map +1 -1
  123. package/dist/ssh/gateway/attachments.d.ts +15 -6
  124. package/dist/ssh/gateway/attachments.d.ts.map +1 -1
  125. package/dist/ssh/gateway/attachments.js +39 -25
  126. package/dist/ssh/gateway/attachments.js.map +1 -1
  127. package/dist/ssh/gateway/environment.d.ts +21 -2
  128. package/dist/ssh/gateway/environment.d.ts.map +1 -1
  129. package/dist/ssh/gateway/environment.js +76 -6
  130. package/dist/ssh/gateway/environment.js.map +1 -1
  131. package/dist/ssh/gateway/forward.d.ts +1 -1
  132. package/dist/ssh/gateway/forward.d.ts.map +1 -1
  133. package/dist/ssh/gateway/forward.js +1 -1
  134. package/dist/ssh/gateway/forward.js.map +1 -1
  135. package/dist/ssh/gateway/preflight.d.ts +51 -12
  136. package/dist/ssh/gateway/preflight.d.ts.map +1 -1
  137. package/dist/ssh/gateway/preflight.js +155 -69
  138. package/dist/ssh/gateway/preflight.js.map +1 -1
  139. package/dist/ssh/limits.d.ts +60 -0
  140. package/dist/ssh/limits.d.ts.map +1 -0
  141. package/dist/ssh/limits.js +84 -0
  142. package/dist/ssh/limits.js.map +1 -0
  143. package/dist/ssh/model.d.ts +97 -9
  144. package/dist/ssh/model.d.ts.map +1 -1
  145. package/dist/ssh/preflight.d.ts +26 -7
  146. package/dist/ssh/preflight.d.ts.map +1 -1
  147. package/dist/ssh/preflight.js +50 -10
  148. package/dist/ssh/preflight.js.map +1 -1
  149. package/dist/ssh/provisioner/boat.d.ts +33 -0
  150. package/dist/ssh/provisioner/boat.d.ts.map +1 -0
  151. package/dist/ssh/provisioner/boat.js +247 -0
  152. package/dist/ssh/provisioner/boat.js.map +1 -0
  153. package/dist/ssh/provisioner/hetzner.d.ts +32 -0
  154. package/dist/ssh/provisioner/hetzner.d.ts.map +1 -0
  155. package/dist/ssh/provisioner/hetzner.js +337 -0
  156. package/dist/ssh/provisioner/hetzner.js.map +1 -0
  157. package/dist/ssh/provisioner/host-key.d.ts +11 -0
  158. package/dist/ssh/provisioner/host-key.d.ts.map +1 -0
  159. package/dist/ssh/provisioner/host-key.js +57 -0
  160. package/dist/ssh/provisioner/host-key.js.map +1 -0
  161. package/dist/ssh/provisioner/http.d.ts +45 -0
  162. package/dist/ssh/provisioner/http.d.ts.map +1 -0
  163. package/dist/ssh/provisioner/http.js +72 -0
  164. package/dist/ssh/provisioner/http.js.map +1 -0
  165. package/dist/ssh/provisioner/machines.d.ts +48 -0
  166. package/dist/ssh/provisioner/machines.d.ts.map +1 -0
  167. package/dist/ssh/provisioner/machines.js +686 -0
  168. package/dist/ssh/provisioner/machines.js.map +1 -0
  169. package/dist/ssh/provisioner/model.d.ts +92 -0
  170. package/dist/ssh/provisioner/model.d.ts.map +1 -0
  171. package/dist/ssh/provisioner/model.js +37 -0
  172. package/dist/ssh/provisioner/model.js.map +1 -0
  173. package/dist/ssh/ssh.d.ts +14 -11
  174. package/dist/ssh/ssh.d.ts.map +1 -1
  175. package/dist/ssh/ssh.js +94 -27
  176. package/dist/ssh/ssh.js.map +1 -1
  177. package/dist/ssh/worker-records.d.ts +18 -0
  178. package/dist/ssh/worker-records.d.ts.map +1 -0
  179. package/dist/ssh/worker-records.js +100 -0
  180. package/dist/ssh/worker-records.js.map +1 -0
  181. package/dist/ssh/workers.d.ts +34 -7
  182. package/dist/ssh/workers.d.ts.map +1 -1
  183. package/dist/ssh/workers.js +92 -18
  184. package/dist/ssh/workers.js.map +1 -1
  185. package/package.json +19 -11
@@ -0,0 +1,72 @@
1
+ import { Data, Effect, Option, Schema } from "effect";
2
+ import { HttpClient, HttpClientError, HttpClientRequest } from "effect/http";
3
+ /** The timeout for one provider API request. */
4
+ const REQUEST_TIMEOUT = "30 seconds";
5
+ /** A provider API request that got no response or an unreadable one. */
6
+ export class ProviderUnanswered extends Data.TaggedError("ProviderUnanswered") {
7
+ }
8
+ /** A provider API response with an error status, with the provider's error code and message. */
9
+ class ProviderRefused extends Data.TaggedError("ProviderRefused") {
10
+ }
11
+ const ErrorFields = Schema.Struct({
12
+ code: Schema.optionalKey(Schema.String),
13
+ message: Schema.optionalKey(Schema.String),
14
+ });
15
+ /** Hetzner's error body, `{ error: { code, message } }`. */
16
+ const NestedErrorBody = Schema.Struct({ error: ErrorFields });
17
+ const decodeNestedError = Schema.decodeUnknownOption(NestedErrorBody);
18
+ const decodeFlatError = Schema.decodeUnknownOption(ErrorFields);
19
+ const decodeJson = Schema.decodeEffect(Schema.fromJsonString(Schema.Json));
20
+ /** Returns the code and message of Hetzner's or Boat's error body (Boat's are top-level). */
21
+ const errorOf = (response) => {
22
+ const fields = Option.orElse(Option.map(decodeNestedError(response.body), ({ error }) => error), () => decodeFlatError(response.body));
23
+ return {
24
+ code: Option.flatMap(fields, ({ code }) => Option.fromNullishOr(code)),
25
+ message: Option.getOrElse(Option.flatMap(fields, ({ message }) => Option.fromNullishOr(message)), () => "no message"),
26
+ };
27
+ };
28
+ /**
29
+ * Returns a client for a provider's JSON API at `base` with `token` as its bearer token. Each
30
+ * request has a timeout, and an error status fails with the provider's code and message. The
31
+ * token and request body never appear in a failure.
32
+ */
33
+ export const providerApiFor = (provider, base, token) => Effect.gen(function* () {
34
+ const http = yield* HttpClient.HttpClient;
35
+ const send = Effect.fn("ProviderApi.send")(function* (method, path, options = {}) {
36
+ yield* Effect.annotateCurrentSpan({ provider, method, path });
37
+ const url = new URL(`${base}${path}`);
38
+ for (const [key, value] of Object.entries(options.query ?? {}))
39
+ url.searchParams.set(key, value);
40
+ const request = HttpClientRequest.make(method)(url).pipe(HttpClientRequest.bearerToken(token), HttpClientRequest.acceptJson, HttpClientRequest.setHeaders(options.headers ?? {}), options.body === undefined
41
+ ? (unchanged) => unchanged
42
+ : HttpClientRequest.bodyJsonUnsafe(options.body));
43
+ const response = yield* http.execute(request).pipe(Effect.timeout(REQUEST_TIMEOUT), Effect.mapError((cause) => HttpClientError.isHttpClientError(cause)
44
+ ? new ProviderUnanswered({ detail: `no response (${cause.reason._tag})` })
45
+ : new ProviderUnanswered({ detail: `no response within ${REQUEST_TIMEOUT}` })));
46
+ const text = yield* response.text.pipe(Effect.mapError(() => new ProviderUnanswered({ detail: "the response body can't be read" })));
47
+ const body = text === ""
48
+ ? null
49
+ : yield* decodeJson(text).pipe(Effect.mapError(() => new ProviderUnanswered({
50
+ detail: `the response with status ${String(response.status)} isn't JSON`,
51
+ })));
52
+ const answer = { status: response.status, body };
53
+ if (response.status >= 400) {
54
+ const { code, message } = errorOf(answer);
55
+ return yield* new ProviderRefused({ status: response.status, code, message });
56
+ }
57
+ return answer;
58
+ });
59
+ /** Decodes a response body with `schema`; an unexpected shape counts as unanswered. */
60
+ const decode = (schema, operation) => (response) => Schema.decodeUnknownEffect(schema)(response.body).pipe(Effect.mapError(() => new ProviderUnanswered({
61
+ detail: `the response to ${operation} doesn't have the documented shape`,
62
+ })));
63
+ return { send, decode };
64
+ });
65
+ /** Returns a failure as an operator-facing clause. */
66
+ export const failureText = (failure) => failure._tag === "ProviderUnanswered"
67
+ ? failure.detail
68
+ : `status ${String(failure.status)}${Option.match(failure.code, {
69
+ onNone: () => "",
70
+ onSome: (code) => ` ${code}`,
71
+ })}: ${failure.message}`;
72
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/ssh/provisioner/http.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAiB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE7E,gDAAgD;AAChD,MAAM,eAAe,GAAG,YAAY,CAAC;AAErC,wEAAwE;AACxE,MAAM,OAAO,kBAAmB,SAAQ,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAE3E;CAAG;AAEL,gGAAgG;AAChG,MAAM,eAAgB,SAAQ,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAI9D;CAAG;AAiBL,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;CAC3C,CAAC,CAAC;AAEH,4DAA4D;AAC5D,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;AAE9D,MAAM,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;AACtE,MAAM,eAAe,GAAG,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;AAChE,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAE3E,6FAA6F;AAC7F,MAAM,OAAO,GAAG,CAAC,QAA0B,EAAiB,EAAE;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAC1B,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAClE,GAAG,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CACrC,CAAC;IACF,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO,EAAE,MAAM,CAAC,SAAS,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EACtE,GAAG,EAAE,CAAC,YAAY,CACnB;KACF,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,QAAyB,EACzB,IAAY,EACZ,KAAgC,EAChC,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,EAClD,MAAmD,EACnD,IAAY,EACZ,OAAO,GAIH,EAAE;QAEN,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CACtD,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,EACpC,iBAAiB,CAAC,UAAU,EAC5B,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EACnD,OAAO,CAAC,IAAI,KAAK,SAAS;YACxB,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS;YAC1B,CAAC,CAAC,iBAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CACnD,CAAC;QACF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAChD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAC/B,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC;YACtC,CAAC,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,gBAAgB,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YAC1E,CAAC,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,sBAAsB,eAAe,EAAE,EAAE,CAAC,CAChF,CACF,CAAC;QACF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CACpC,MAAM,CAAC,QAAQ,CACb,GAAG,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC,CAC5E,CACF,CAAC;QACF,MAAM,IAAI,GACR,IAAI,KAAK,EAAE;YACT,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAC1B,MAAM,CAAC,QAAQ,CACb,GAAG,EAAE,CACH,IAAI,kBAAkB,CAAC;gBACrB,MAAM,EAAE,4BAA4B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa;aACzE,CAAC,CACL,CACF,CAAC;QACR,MAAM,MAAM,GAAqB,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACnE,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC3B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC,CAAC,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,uFAAuF;IACvF,MAAM,MAAM,GACV,CAA8B,MAAS,EAAE,SAAiB,EAAE,EAAE,CAC9D,CACE,QAA0B,EAC2C,EAAE,CACvE,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CACpD,MAAM,CAAC,QAAQ,CACb,GAAG,EAAE,CACH,IAAI,kBAAkB,CAAC;QACrB,MAAM,EAAE,mBAAmB,SAAS,oCAAoC;KACzE,CAAC,CACL,CACF,CAAC;IAEN,OAAO,EAAE,IAAI,EAAE,MAAM,EAAW,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL,sDAAsD;AACtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAwB,EAAU,EAAE,CAC9D,OAAO,CAAC,IAAI,KAAK,oBAAoB;IACnC,CAAC,CAAC,OAAO,CAAC,MAAM;IAChB,CAAC,CAAC,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QAC5D,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE;QAChB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE;KAC7B,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { BrainSpec } from "@usine/core/agent/brain";
2
+ import type { AttemptId } from "@usine/core/attempt";
3
+ import type { RunId } from "@usine/core/run";
4
+ import type { MachineId, WorkerName } from "@usine/core/worker";
5
+ import { Effect, FileSystem, Option, Path } from "effect";
6
+ import { type ExecutorError, ExecutorOperationError, MachineGrant, MachineHold, MachineStatus, MachineUnavailableError, type PreflightReport, WorkerCapabilityError } from "../../executor.ts";
7
+ import type { RemoteCommands } from "../../remote/commands.ts";
8
+ import type { MachineGateway, SshExecutorOptions, SshMachine } from "../model.ts";
9
+ import { type PinnedHostKey, type SshWorkerEntry } from "../workers.ts";
10
+ import { type MachineEndpoint } from "./model.ts";
11
+ export interface ProvisionedMachinesOptions {
12
+ readonly instance: string;
13
+ readonly commands: RemoteCommands;
14
+ readonly workerFor: (worker: WorkerName) => Effect.Effect<SshWorkerEntry, ExecutorError>;
15
+ readonly entries: Effect.Effect<ReadonlyArray<SshWorkerEntry>>;
16
+ readonly machineAt: (entry: SshWorkerEntry, id: MachineId, endpoint: MachineEndpoint, hostKey: PinnedHostKey) => SshMachine;
17
+ /** The machine preflight of `sshMachinePreflightFor`. */
18
+ readonly verifyMachine: (machine: SshMachine, brains: ReadonlyArray<BrainSpec>, maxConcurrentAttempts: number) => Effect.Effect<PreflightReport, ExecutorError>;
19
+ readonly verifyGatewayAdmin: (worker: WorkerName, gateway: MachineGateway) => Effect.Effect<void, WorkerCapabilityError>;
20
+ readonly settings: Pick<SshExecutorOptions, "knownHostsDirectory" | "providerEndpoints" | "machineReadyTimeout" | "machinePollInterval">;
21
+ }
22
+ /**
23
+ * Returns the machines of the SSH executor's provisioned Workers: the `WorkerMachines` port for
24
+ * the scheduler, the machine of each Attempt for preparation and recovery, and the provisioned
25
+ * Workers' preflight. Requires Node for the key and host key files.
26
+ */
27
+ export declare const provisionedMachinesFor: (options: ProvisionedMachinesOptions) => Effect.Effect<{
28
+ port: {
29
+ readonly provisions: (worker: WorkerName) => Effect.Effect<boolean>;
30
+ readonly create: (worker: WorkerName, runId: RunId, brains: ReadonlyArray<BrainSpec>) => Effect.Effect<MachineGrant, MachineUnavailableError | WorkerCapabilityError>;
31
+ readonly assign: (hold: MachineHold, attemptId: AttemptId) => Effect.Effect<void, ExecutorOperationError>;
32
+ readonly adopt: (worker: WorkerName, attemptId: AttemptId) => Effect.Effect<Option.Option<MachineHold>>;
33
+ readonly release: (hold: MachineHold) => Effect.Effect<void>;
34
+ readonly sweep: Effect.Effect<void>;
35
+ readonly machines: Effect.Effect<ReadonlyArray<MachineStatus>>;
36
+ };
37
+ attemptMachine: (worker: string & import("effect/Brand").Brand<"WorkerName">, attemptId: string & import("effect/Brand").Brand<"AttemptId">) => Effect.Effect<SshMachine, ExecutorOperationError, never>;
38
+ recoveryMachine: (worker: WorkerName, attemptId: AttemptId) => Effect.Effect<Option.Option<SshMachine>, ExecutorOperationError, never>;
39
+ recovered: (attemptId: string & import("effect/Brand").Brand<"AttemptId">, succeeded: boolean) => Effect.Effect<void, never, never>;
40
+ checkoutHeld: (attemptId: string & import("effect/Brand").Brand<"AttemptId">, held: boolean) => Effect.Effect<void, never, never>;
41
+ verifyProvisioned: (entry: SshWorkerEntry, brains: readonly BrainSpec[], maxConcurrentAttempts: number) => Effect.Effect<{
42
+ degraded: Option.Option<string>;
43
+ deferred: Option.Option<string>;
44
+ containerLimits: Option.Option<import("@usine/core/worker").ContainerLimits>;
45
+ }, import("../../executor.ts").CredentialUnavailableError | ExecutorOperationError | WorkerCapabilityError, never>;
46
+ provisions: (worker: WorkerName) => Effect.Effect<boolean, never, never>;
47
+ }, import("effect/PlatformError").PlatformError, FileSystem.FileSystem | import("effect/http/HttpClient").HttpClient | Path.Path | import("effect/Scope").Scope>;
48
+ //# sourceMappingURL=machines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machines.d.ts","sourceRoot":"","sources":["../../../src/ssh/provisioner/machines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAEV,SAAS,EAET,UAAU,EACX,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAKL,MAAM,EAEN,UAAU,EACV,MAAM,EACN,IAAI,EAIL,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,KAAK,aAAa,EAClB,sBAAsB,EAEtB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,uBAAuB,EACvB,KAAK,eAAe,EACpB,qBAAqB,EAEtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AAClG,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAKL,KAAK,eAAe,EAGrB,MAAM,YAAY,CAAC;AA+FpB,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IACzF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,cAAc,EACrB,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,aAAa,KACnB,UAAU,CAAC;IAChB,yDAAyD;IACzD,QAAQ,CAAC,aAAa,EAAE,CACtB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,EAChC,qBAAqB,EAAE,MAAM,KAC1B,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IACnD,QAAQ,CAAC,kBAAkB,EAAE,CAC3B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,cAAc,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,IAAI,CACrB,kBAAkB,EAClB,qBAAqB,GAAG,mBAAmB,GAAG,qBAAqB,GAAG,qBAAqB,CAC5F,CAAC;CACH;AAqBD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;8BA+vBA,UAAU,aAAa,SAAS;;;;;;;;yBAuErC,UAAU;gKAuBtC,CAAC"}