@usine/executor 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -21
- package/dist/child-command.d.ts +8 -5
- package/dist/child-command.d.ts.map +1 -1
- package/dist/child-command.js +10 -7
- package/dist/child-command.js.map +1 -1
- package/dist/exe-dev/channel.d.ts +8 -4
- package/dist/exe-dev/channel.d.ts.map +1 -1
- package/dist/exe-dev/channel.js +16 -19
- package/dist/exe-dev/channel.js.map +1 -1
- package/dist/exe-dev/commands.d.ts +1 -1
- package/dist/exe-dev/commands.d.ts.map +1 -1
- package/dist/exe-dev/commands.js +7 -8
- package/dist/exe-dev/commands.js.map +1 -1
- package/dist/exe-dev/exe-dev.d.ts +8 -0
- package/dist/exe-dev/exe-dev.d.ts.map +1 -0
- package/dist/exe-dev/exe-dev.js +154 -0
- package/dist/exe-dev/exe-dev.js.map +1 -0
- package/dist/exe-dev/grants.d.ts +3 -4
- package/dist/exe-dev/grants.d.ts.map +1 -1
- package/dist/exe-dev/grants.js +31 -15
- package/dist/exe-dev/grants.js.map +1 -1
- package/dist/exe-dev/model.d.ts +8 -23
- package/dist/exe-dev/model.d.ts.map +1 -1
- package/dist/exe-dev/model.js +5 -12
- package/dist/exe-dev/model.js.map +1 -1
- package/dist/exe-dev/preflight.d.ts +3 -2
- package/dist/exe-dev/preflight.d.ts.map +1 -1
- package/dist/exe-dev/preflight.js +8 -8
- package/dist/exe-dev/preflight.js.map +1 -1
- package/dist/exe-dev/shell.d.ts +5 -5
- package/dist/exe-dev/shell.d.ts.map +1 -1
- package/dist/exe-dev/shell.js +7 -7
- package/dist/exe-dev/shell.js.map +1 -1
- package/dist/exe-dev/sweep.d.ts +3 -5
- package/dist/exe-dev/sweep.d.ts.map +1 -1
- package/dist/exe-dev/sweep.js +8 -10
- package/dist/exe-dev/sweep.js.map +1 -1
- package/dist/executor.d.ts +122 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +100 -0
- package/dist/executor.js.map +1 -0
- package/dist/guard.d.ts +11 -0
- package/dist/guard.d.ts.map +1 -0
- package/dist/guard.js +74 -0
- package/dist/guard.js.map +1 -0
- package/dist/harness-preflight.d.ts +6 -0
- package/dist/harness-preflight.d.ts.map +1 -0
- package/dist/harness-preflight.js +50 -0
- package/dist/harness-preflight.js.map +1 -0
- package/dist/invalid-frame.d.ts +1 -1
- package/dist/invalid-frame.d.ts.map +1 -1
- package/dist/invalid-frame.js +2 -1
- package/dist/invalid-frame.js.map +1 -1
- package/dist/keyed-lock.d.ts +2 -2
- package/dist/keyed-lock.js +2 -2
- package/dist/local/local.d.ts +20 -0
- package/dist/local/local.d.ts.map +1 -0
- package/dist/local/{index.js → local.js} +87 -115
- package/dist/local/local.js.map +1 -0
- package/dist/prepared-attempt.d.ts +5 -0
- package/dist/prepared-attempt.d.ts.map +1 -0
- package/dist/prepared-attempt.js +32 -0
- package/dist/prepared-attempt.js.map +1 -0
- package/dist/provision.d.ts +20 -10
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +94 -23
- package/dist/provision.js.map +1 -1
- package/dist/run-host-session.d.ts +13 -8
- package/dist/run-host-session.d.ts.map +1 -1
- package/dist/run-host-session.js +116 -41
- package/dist/run-host-session.js.map +1 -1
- package/package.json +11 -11
- package/dist/exe-dev/index.d.ts +0 -8
- package/dist/exe-dev/index.d.ts.map +0 -1
- package/dist/exe-dev/index.js +0 -239
- package/dist/exe-dev/index.js.map +0 -1
- package/dist/index.d.ts +0 -82
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -82
- package/dist/index.js.map +0 -1
- package/dist/local/index.d.ts +0 -15
- package/dist/local/index.d.ts.map +0 -1
- package/dist/local/index.js.map +0 -1
package/dist/exe-dev/grants.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { AttemptId } from "@usine/core/attempt";
|
|
2
|
+
import { RepositoryName } from "@usine/core/repository";
|
|
3
|
+
import { WorkerName } from "@usine/core/worker";
|
|
4
|
+
import { Effect, Ref, Scope } from "effect";
|
|
5
|
+
import { CredentialUnavailableError } from "../executor.js";
|
|
4
6
|
import { keyedLockFor } from "../keyed-lock.js";
|
|
5
7
|
import { CredentialGrantMinutes, } from "./model.js";
|
|
6
8
|
const grantKey = (worker, integration) => `${worker} ${integration}`;
|
|
@@ -8,11 +10,24 @@ export const credentialGrantsFor = Effect.fn("ExeDevExecutor.credentialGrantsFor
|
|
|
8
10
|
const locks = yield* keyedLockFor();
|
|
9
11
|
const counts = yield* Ref.make(new Map());
|
|
10
12
|
const grantMinutes = options.credentialGrantMinutes ?? CredentialGrantMinutes.make(65);
|
|
11
|
-
const acquire = Effect.fn("ExeDevExecutor.acquireGrant")(function* (worker, repository, integration) {
|
|
13
|
+
const acquire = Effect.fn("ExeDevExecutor.acquireGrant")(function* (attemptId, worker, repository, integration) {
|
|
14
|
+
yield* Effect.annotateCurrentSpan({ attemptId, worker, repository, integration });
|
|
15
|
+
const scope = yield* Effect.scope;
|
|
12
16
|
const key = grantKey(worker, integration);
|
|
13
|
-
yield* locks.withLock(key)(Effect.gen(function* () {
|
|
17
|
+
yield* locks.withLock(key)(Effect.uninterruptibleMask((restore) => Effect.gen(function* () {
|
|
14
18
|
const current = (yield* Ref.get(counts)).get(key) ?? 0;
|
|
15
|
-
|
|
19
|
+
// Own a reference before attempting the attachment: a failed SSH reply
|
|
20
|
+
// may still mean the edge accepted it. This reservation is released once
|
|
21
|
+
// by this scope, and never borrows a sibling's reference on interruption.
|
|
22
|
+
yield* Ref.update(counts, (currentCounts) => new Map(currentCounts).set(key, current + 1));
|
|
23
|
+
yield* Scope.addFinalizer(scope, release(attemptId, worker, integration).pipe(Effect.tapError((error) => Effect.logError("Attempt credential cleanup failed", {
|
|
24
|
+
attemptId,
|
|
25
|
+
worker,
|
|
26
|
+
repository,
|
|
27
|
+
integration,
|
|
28
|
+
message: error.message,
|
|
29
|
+
})), Effect.ignore));
|
|
30
|
+
yield* restore(commands
|
|
16
31
|
.lobby("prepare", [
|
|
17
32
|
"integrations",
|
|
18
33
|
"attach",
|
|
@@ -25,27 +40,25 @@ export const credentialGrantsFor = Effect.fn("ExeDevExecutor.credentialGrantsFor
|
|
|
25
40
|
repository,
|
|
26
41
|
message: `Could not attach exe.dev GitHub integration ${integration}`,
|
|
27
42
|
cause,
|
|
28
|
-
})));
|
|
43
|
+
}))));
|
|
29
44
|
yield* Effect.logInfo("Attached or refreshed time-boxed exe.dev GitHub integration", {
|
|
45
|
+
attemptId,
|
|
30
46
|
worker,
|
|
31
47
|
repository,
|
|
32
48
|
integration,
|
|
33
49
|
grantMinutes,
|
|
34
50
|
activeGrants: current + 1,
|
|
35
51
|
});
|
|
36
|
-
|
|
37
|
-
const next = new Map(currentCounts);
|
|
38
|
-
next.set(key, current + 1);
|
|
39
|
-
return next;
|
|
40
|
-
});
|
|
41
|
-
}));
|
|
52
|
+
})));
|
|
42
53
|
});
|
|
43
|
-
const release = Effect.fn("ExeDevExecutor.releaseGrant")(function* (worker, integration) {
|
|
54
|
+
const release = Effect.fn("ExeDevExecutor.releaseGrant")(function* (attemptId, worker, integration) {
|
|
55
|
+
yield* Effect.annotateCurrentSpan({ attemptId, worker, integration });
|
|
44
56
|
const key = grantKey(worker, integration);
|
|
45
57
|
yield* locks.withLock(key)(Effect.gen(function* () {
|
|
46
58
|
const current = (yield* Ref.get(counts)).get(key) ?? 0;
|
|
47
59
|
if (current === 0) {
|
|
48
60
|
yield* Effect.logDebug("Credential cleanup was already complete", {
|
|
61
|
+
attemptId,
|
|
49
62
|
worker,
|
|
50
63
|
integration,
|
|
51
64
|
});
|
|
@@ -58,6 +71,7 @@ export const credentialGrantsFor = Effect.fn("ExeDevExecutor.credentialGrantsFor
|
|
|
58
71
|
return next;
|
|
59
72
|
});
|
|
60
73
|
yield* Effect.logDebug("Kept the shared exe.dev GitHub integration", {
|
|
74
|
+
attemptId,
|
|
61
75
|
worker,
|
|
62
76
|
integration,
|
|
63
77
|
activeGrants: current - 1,
|
|
@@ -67,6 +81,7 @@ export const credentialGrantsFor = Effect.fn("ExeDevExecutor.credentialGrantsFor
|
|
|
67
81
|
yield* commands
|
|
68
82
|
.lobby("cleanup", ["integrations", "detach", integration, `vm:${worker}`])
|
|
69
83
|
.pipe(Effect.tapError((error) => Effect.logWarning("Could not detach the exe.dev GitHub integration", {
|
|
84
|
+
attemptId,
|
|
70
85
|
worker,
|
|
71
86
|
integration,
|
|
72
87
|
grantMinutes,
|
|
@@ -78,11 +93,12 @@ export const credentialGrantsFor = Effect.fn("ExeDevExecutor.credentialGrantsFor
|
|
|
78
93
|
return next;
|
|
79
94
|
})));
|
|
80
95
|
yield* Effect.logInfo("Detached exe.dev GitHub integration", {
|
|
96
|
+
attemptId,
|
|
81
97
|
worker,
|
|
82
98
|
integration,
|
|
83
99
|
});
|
|
84
100
|
}));
|
|
85
101
|
});
|
|
86
|
-
return { acquire
|
|
102
|
+
return { acquire };
|
|
87
103
|
});
|
|
88
104
|
//# sourceMappingURL=grants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/exe-dev/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/exe-dev/grants.ts"],"names":[],"mappings":"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"}
|
package/dist/exe-dev/model.d.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import type { RunHostCommand } from "../index.ts";
|
|
1
|
+
import { Schema, type Effect } from "effect";
|
|
2
|
+
import type { RunHostCommand } from "../executor.ts";
|
|
4
3
|
/** The name of one exe.dev edge-injected integration. */
|
|
5
4
|
export declare const IntegrationName: Schema.brand<Schema.String, "ExeDevIntegrationName">;
|
|
6
5
|
export type IntegrationName = typeof IntegrationName.Type;
|
|
7
6
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* must be unrepresentable, not merely unexpected.
|
|
7
|
+
* An SSH destination handed to the local `ssh` client as argv, so anything
|
|
8
|
+
* that could read as an option (`-oProxyCommand=...`) is unrepresentable.
|
|
11
9
|
*/
|
|
12
10
|
export declare const SshDestination: Schema.brand<Schema.String, "ExeDevSshDestination">;
|
|
13
11
|
export type SshDestination = typeof SshDestination.Type;
|
|
@@ -15,44 +13,31 @@ export type SshDestination = typeof SshDestination.Type;
|
|
|
15
13
|
export declare const HomePath: Schema.brand<Schema.String, "ExeDevHomePath">;
|
|
16
14
|
export type HomePath = typeof HomePath.Type;
|
|
17
15
|
declare const GitHubIntegration_base: Schema.Class<GitHubIntegration, Schema.Struct<{
|
|
18
|
-
readonly repository: Schema.brand<Schema.String, "
|
|
16
|
+
readonly repository: Schema.brand<Schema.String, "RepositoryName">;
|
|
19
17
|
readonly name: Schema.brand<Schema.String, "ExeDevIntegrationName">;
|
|
20
18
|
}>, {}>;
|
|
21
19
|
/** One standing exe.dev GitHub integration; only its VM attachment is per Attempt. */
|
|
22
20
|
export declare class GitHubIntegration extends GitHubIntegration_base {
|
|
23
21
|
}
|
|
24
|
-
|
|
25
|
-
readonly harness: Schema.NonEmptyString;
|
|
26
|
-
readonly command: Schema.NonEmptyString;
|
|
27
|
-
readonly args: Schema.$Array<Schema.String>;
|
|
28
|
-
}>, {}>;
|
|
29
|
-
/** A harness-owned command that exits zero only while its operator login remains usable. */
|
|
30
|
-
export declare class HarnessLoginCheck extends HarnessLoginCheck_base {
|
|
31
|
-
}
|
|
22
|
+
/** How long an exe.dev Worker's repository credential attachment may remain active, in minutes. */
|
|
32
23
|
export declare const CredentialGrantMinutes: Schema.brand<Schema.Int, "ExeDevCredentialGrantMinutes">;
|
|
33
24
|
export type CredentialGrantMinutes = typeof CredentialGrantMinutes.Type;
|
|
25
|
+
/** Repository access and run-host settings for the configured exe.dev Workers. */
|
|
34
26
|
export interface ExeDevExecutorOptions {
|
|
35
27
|
/** Existing native GitHub integrations, one per repository this Worker may receive. */
|
|
36
28
|
readonly githubIntegrations: ReadonlyArray<GitHubIntegration>;
|
|
37
|
-
/** Every harness used on this Worker must prove that its operator login is still valid. */
|
|
38
|
-
readonly harnessLoginChecks: readonly [HarnessLoginCheck, ...ReadonlyArray<HarnessLoginCheck>];
|
|
39
29
|
/** Installed in the baked image; defaults to the published worker executable. */
|
|
40
30
|
readonly runHost?: RunHostCommand;
|
|
41
31
|
/** Local SSH executable and its control-plane-only arguments. */
|
|
42
32
|
readonly ssh?: RunHostCommand;
|
|
43
33
|
/** Time-box for the edge credential attachment. Defaults to 65 minutes. */
|
|
44
34
|
readonly credentialGrantMinutes?: CredentialGrantMinutes;
|
|
35
|
+
/** Grace for delivering a stop request, then for the run host to exit; each wait is bounded separately. Defaults to 10 seconds. */
|
|
45
36
|
readonly interruptGrace?: Parameters<typeof Effect.timeoutOption>[1];
|
|
46
37
|
}
|
|
47
38
|
export interface VmState {
|
|
48
39
|
readonly home: HomePath;
|
|
49
40
|
readonly sshDest: SshDestination;
|
|
50
41
|
}
|
|
51
|
-
export interface PreparedState {
|
|
52
|
-
readonly cache: string;
|
|
53
|
-
readonly integration: IntegrationName;
|
|
54
|
-
readonly vm: VmState;
|
|
55
|
-
}
|
|
56
|
-
export type PreparedStates = Ref.Ref<Map<Attempt.AttemptId, PreparedState>>;
|
|
57
42
|
export {};
|
|
58
43
|
//# sourceMappingURL=model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/exe-dev/model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/exe-dev/model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,yDAAyD;AACzD,eAAO,MAAM,eAAe,sDAIiB,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,cAAc,qDAIiB,CAAC;AAC7C,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAC;AAExD,sFAAsF;AACtF,eAAO,MAAM,QAAQ,+CAIiB,CAAC;AACvC,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAC;;;;;AAE5C,sFAAsF;AACtF,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG;AAEL,mGAAmG;AACnG,eAAO,MAAM,sBAAsB,0DAElC,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,OAAO,sBAAsB,CAAC,IAAI,CAAC;AAExE,kFAAkF;AAClF,MAAM,WAAW,qBAAqB;IACpC,uFAAuF;IACvF,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC9D,iFAAiF;IACjF,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,iEAAiE;IACjE,QAAQ,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IACzD,mIAAmI;IACnI,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC"}
|
package/dist/exe-dev/model.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RepositoryName } from "@usine/core/repository";
|
|
2
2
|
import { Schema } from "effect";
|
|
3
3
|
/** The name of one exe.dev edge-injected integration. */
|
|
4
4
|
export const IntegrationName = Schema.String.check(Schema.isPattern(/^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$/u, {
|
|
5
5
|
message: "Expected an exe.dev integration name safe for the lobby command boundary",
|
|
6
6
|
})).pipe(Schema.brand("ExeDevIntegrationName"));
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* must be unrepresentable, not merely unexpected.
|
|
8
|
+
* An SSH destination handed to the local `ssh` client as argv, so anything
|
|
9
|
+
* that could read as an option (`-oProxyCommand=...`) is unrepresentable.
|
|
11
10
|
*/
|
|
12
11
|
export const SshDestination = Schema.String.check(Schema.isPattern(/^(?:[A-Za-z0-9._-]+@)?[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?$/u, {
|
|
13
12
|
message: "Expected an exe.dev SSH hostname, optionally prefixed by a user",
|
|
@@ -18,16 +17,10 @@ export const HomePath = Schema.String.check(Schema.isPattern(/^\/[^\0\r\n]*$/u,
|
|
|
18
17
|
})).pipe(Schema.brand("ExeDevHomePath"));
|
|
19
18
|
/** One standing exe.dev GitHub integration; only its VM attachment is per Attempt. */
|
|
20
19
|
export class GitHubIntegration extends Schema.Class("@usine/executor/ExeDevGitHubIntegration")({
|
|
21
|
-
repository:
|
|
20
|
+
repository: RepositoryName,
|
|
22
21
|
name: IntegrationName,
|
|
23
22
|
}) {
|
|
24
23
|
}
|
|
25
|
-
/**
|
|
26
|
-
export class HarnessLoginCheck extends Schema.Class("@usine/executor/ExeDevHarnessLoginCheck")({
|
|
27
|
-
harness: Schema.NonEmptyString,
|
|
28
|
-
command: Schema.NonEmptyString,
|
|
29
|
-
args: Schema.Array(Schema.String),
|
|
30
|
-
}) {
|
|
31
|
-
}
|
|
24
|
+
/** How long an exe.dev Worker's repository credential attachment may remain active, in minutes. */
|
|
32
25
|
export const CredentialGrantMinutes = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)).pipe(Schema.brand("ExeDevCredentialGrantMinutes"));
|
|
33
26
|
//# sourceMappingURL=model.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/exe-dev/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/exe-dev/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAG7C,yDAAyD;AACzD,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAChD,MAAM,CAAC,SAAS,CAAC,uCAAuC,EAAE;IACxD,OAAO,EAAE,0EAA0E;CACpF,CAAC,CACH,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;AAG9C;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAC/C,MAAM,CAAC,SAAS,CAAC,mEAAmE,EAAE;IACpF,OAAO,EAAE,iEAAiE;CAC3E,CAAC,CACH,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAG7C,sFAAsF;AACtF,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CACzC,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE;IAClC,OAAO,EAAE,kEAAkE;CAC5E,CAAC,CACH,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAGvC,sFAAsF;AACtF,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,KAAK,CACjD,yCAAyC,CAC1C,CAAC;IACA,UAAU,EAAE,cAAc;IAC1B,IAAI,EAAE,eAAe;CACtB,CAAC;CAAG;AAEL,mGAAmG;AACnG,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAC3F,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAC7C,CAAC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import type { BrainSpec } from "@usine/core/agent/brain";
|
|
1
2
|
import { Effect } from "effect";
|
|
2
|
-
import { ExecutorOperationError, type RunHostCommand, WorkerCapabilityError } from "../
|
|
3
|
+
import { ExecutorOperationError, type RunHostCommand, WorkerCapabilityError } from "../executor.ts";
|
|
3
4
|
import type { ExeDevCommands } from "./commands.ts";
|
|
4
5
|
import { type ExeDevExecutorOptions, type VmState } from "./model.ts";
|
|
5
6
|
export declare const preflightFor: (options: ExeDevExecutorOptions, commands: ExeDevCommands, runHost: RunHostCommand) => Effect.Effect<{
|
|
6
|
-
preflight: (worker: string & import("effect/Brand").Brand<"WorkerName"
|
|
7
|
+
preflight: (worker: string & import("effect/Brand").Brand<"WorkerName">, brains: readonly BrainSpec[]) => Effect.Effect<undefined, import("../executor.ts").CredentialUnavailableError | ExecutorOperationError | WorkerCapabilityError, never>;
|
|
7
8
|
vmFor: (worker: string & import("effect/Brand").Brand<"WorkerName">) => Effect.Effect<VmState, ExecutorOperationError | WorkerCapabilityError, never>;
|
|
8
9
|
}, never, never>;
|
|
9
10
|
//# sourceMappingURL=preflight.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/exe-dev/preflight.ts"],"names":[],"mappings":"
|
|
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,6 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as AttemptChannel from "@usine/core/attempt/channel";
|
|
2
|
+
import { WorkerName } from "@usine/core/worker";
|
|
2
3
|
import { Effect, Ref, Schema } from "effect";
|
|
3
|
-
import { ExecutorOperationError, logPreflightFailure, WorkerCapabilityError, } from "../
|
|
4
|
+
import { ExecutorOperationError, logPreflightFailure, WorkerCapabilityError, } from "../executor.js";
|
|
5
|
+
import { verifyHarnesses } from "../harness-preflight.js";
|
|
4
6
|
import { HomePath, SshDestination } from "./model.js";
|
|
5
7
|
const MINIMUM_NODE_MAJOR = 22;
|
|
6
8
|
const Vm = Schema.Struct({
|
|
@@ -29,7 +31,7 @@ export const preflightFor = Effect.fn("ExeDevExecutor.preflightFor")(function* (
|
|
|
29
31
|
return { home, sshDest: vm.sshDest };
|
|
30
32
|
});
|
|
31
33
|
const asCapability = (worker, capability, message, effect) => effect.pipe(Effect.mapError((cause) => capabilityError(worker, capability, message, cause)));
|
|
32
|
-
const preflight = Effect.fn("ExeDevExecutor.preflight")(function* (worker) {
|
|
34
|
+
const preflight = Effect.fn("ExeDevExecutor.preflight")(function* (worker, brains) {
|
|
33
35
|
const vm = yield* resolveVm(worker).pipe(Effect.catchTag("ExecutorOperationError", (cause) => capabilityError(worker, "machine", `Could not reach exe.dev Worker ${worker}`, cause)));
|
|
34
36
|
yield* Effect.annotateCurrentSpan({ worker, host: vm.sshDest });
|
|
35
37
|
const gitVersion = (yield* asCapability(worker, "toolchain", `Worker ${worker} cannot run Git`, commands.remote("preflight", vm.sshDest, "git", ["--version"]))).trim();
|
|
@@ -48,9 +50,7 @@ export const preflightFor = Effect.fn("ExeDevExecutor.preflightFor")(function* (
|
|
|
48
50
|
if (protocol !== String(AttemptChannel.PROTOCOL_VERSION)) {
|
|
49
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"));
|
|
50
52
|
}
|
|
51
|
-
|
|
52
|
-
yield* asCapability(worker, "harness-login", `${check.harness} is not logged in on Worker ${worker}`, commands.remote("preflight", vm.sshDest, check.command, check.args));
|
|
53
|
-
}
|
|
53
|
+
yield* verifyHarnesses(worker, brains, runHost, (command, args) => commands.remote("preflight", vm.sshDest, command, args));
|
|
54
54
|
for (const integration of options.githubIntegrations) {
|
|
55
55
|
yield* asCapability(worker, "credentials", `exe.dev GitHub integration ${integration.name} is not ready for ${integration.repository}`, commands.lobby("preflight", ["integrations", "test", integration.name]));
|
|
56
56
|
}
|
|
@@ -65,11 +65,11 @@ export const preflightFor = Effect.fn("ExeDevExecutor.preflightFor")(function* (
|
|
|
65
65
|
gitVersion,
|
|
66
66
|
nodeVersion,
|
|
67
67
|
protocolVersion: AttemptChannel.PROTOCOL_VERSION,
|
|
68
|
-
harnesses:
|
|
68
|
+
harnesses: [...new Set(brains.map(({ harness }) => harness))].join(","),
|
|
69
69
|
integrations: options.githubIntegrations.length,
|
|
70
70
|
});
|
|
71
71
|
}, logPreflightFailure);
|
|
72
|
-
// Both resolveVm failures
|
|
72
|
+
// Both resolveVm failures are members of the ExecutorError union prepare
|
|
73
73
|
// reports, so a stopped VM keeps its typed capability shape.
|
|
74
74
|
const vmFor = Effect.fn("ExeDevExecutor.vmFor")(function* (worker) {
|
|
75
75
|
const cached = (yield* Ref.get(workers)).get(worker);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/exe-dev/preflight.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/exe-dev/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/exe-dev/shell.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/** Quotes a command and its arguments into one string safe for OpenSSH's remote-command boundary. */
|
|
2
2
|
export declare const shellCommand: (command: string, args: ReadonlyArray<string>) => string;
|
|
3
|
-
/**
|
|
3
|
+
/** The pid file sits beside the worktree so the sweep reclaims both together. */
|
|
4
4
|
export declare const runHostPidFile: (worktree: string) => string;
|
|
5
|
-
/** The run host
|
|
5
|
+
/** The remote command that starts the run host in its worktree with the edge GitHub host selected. */
|
|
6
6
|
export declare const runHostShellCommand: (worktree: string, command: string, args: ReadonlyArray<string>) => string;
|
|
7
7
|
/**
|
|
8
|
-
* Confirms a recorded run host is dead before workspace removal: TERM
|
|
9
|
-
*
|
|
8
|
+
* Confirms a recorded run host is dead before workspace removal: TERM, a
|
|
9
|
+
* bounded wait, then KILL. `$1` is the pid file; stdout reports the outcome.
|
|
10
10
|
*/
|
|
11
11
|
export declare const RUN_HOST_KILL_SCRIPT: string;
|
|
12
12
|
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/exe-dev/shell.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/exe-dev/shell.ts"],"names":[],"mappings":"AAEA,qGAAqG;AACrG,eAAO,MAAM,YAAY,YAAa,MAAM,QAAQ,aAAa,CAAC,MAAM,CAAC,KAAG,MACzB,CAAC;AAEpD,iFAAiF;AACjF,eAAO,MAAM,cAAc,aAAc,MAAM,KAAG,MAA2B,CAAC;AAE9E,sGAAsG;AACtG,eAAO,MAAM,mBAAmB,aACpB,MAAM,WACP,MAAM,QACT,aAAa,CAAC,MAAM,CAAC,KAC1B,MAIsJ,CAAC;AAE1J;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAczB,CAAC"}
|
package/dist/exe-dev/shell.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
const quote = (value) => `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
2
|
-
/**
|
|
2
|
+
/** Quotes a command and its arguments into one string safe for OpenSSH's remote-command boundary. */
|
|
3
3
|
export const shellCommand = (command, args) => `exec ${[command, ...args].map(quote).join(" ")}`;
|
|
4
|
-
/**
|
|
4
|
+
/** The pid file sits beside the worktree so the sweep reclaims both together. */
|
|
5
5
|
export const runHostPidFile = (worktree) => `${worktree}.pid`;
|
|
6
|
-
/** The run host
|
|
6
|
+
/** The remote command that starts the run host in its worktree with the edge GitHub host selected. */
|
|
7
7
|
export const runHostShellCommand = (worktree, command, args) =>
|
|
8
8
|
// `$$` names the remote shell that `exec` replaces with the run host, so the
|
|
9
|
-
// pid file identifies the run host itself
|
|
10
|
-
// process is gone before
|
|
9
|
+
// pid file identifies the run host itself. Cleanup uses it to confirm the
|
|
10
|
+
// process is gone before removing the worktree.
|
|
11
11
|
`cd ${quote(worktree)} && export GH_HOST=github.int.exe.xyz && printf '%s' "$$" > ${quote(runHostPidFile(worktree))} && ${shellCommand(command, args)}`;
|
|
12
12
|
/**
|
|
13
|
-
* Confirms a recorded run host is dead before workspace removal: TERM
|
|
14
|
-
*
|
|
13
|
+
* Confirms a recorded run host is dead before workspace removal: TERM, a
|
|
14
|
+
* bounded wait, then KILL. `$1` is the pid file; stdout reports the outcome.
|
|
15
15
|
*/
|
|
16
16
|
export const RUN_HOST_KILL_SCRIPT = `
|
|
17
17
|
if test -f "$1"; then
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/exe-dev/shell.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAE/E,
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/exe-dev/shell.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAE/E,qGAAqG;AACrG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,IAA2B,EAAU,EAAE,CACnF,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAEpD,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,GAAG,QAAQ,MAAM,CAAC;AAE9E,sGAAsG;AACtG,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAAgB,EAChB,OAAe,EACf,IAA2B,EACnB,EAAE;AACV,6EAA6E;AAC7E,0EAA0E;AAC1E,gDAAgD;AAChD,MAAM,KAAK,CAAC,QAAQ,CAAC,+DAA+D,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,OAAO,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;AAE1J;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;CAcnC,CAAC,IAAI,EAAE,CAAC"}
|
package/dist/exe-dev/sweep.d.ts
CHANGED
|
@@ -2,11 +2,9 @@ import { Effect } from "effect";
|
|
|
2
2
|
import type { ExeDevCommands } from "./commands.ts";
|
|
3
3
|
import type { VmState } from "./model.ts";
|
|
4
4
|
/**
|
|
5
|
-
* Reclaims crash leftovers once
|
|
6
|
-
*
|
|
7
|
-
* sweep's siblings or
|
|
8
|
-
* sweep is marked done even when parts of it failed, and each failure is
|
|
9
|
-
* logged instead of propagated.
|
|
5
|
+
* Reclaims crash leftovers once per Worker before this process starts work on
|
|
6
|
+
* its VM. Each removal is isolated and each failure is logged, so one immovable
|
|
7
|
+
* leftover never blocks the sweep's siblings or a future prepare.
|
|
10
8
|
*/
|
|
11
9
|
export declare const abandonedWorktreeSweepFor: (commands: ExeDevCommands) => Effect.Effect<(attemptId: string & import("effect/Brand").Brand<"AttemptId">, worker: string & import("effect/Brand").Brand<"WorkerName">, vm: VmState, root: string) => Effect.Effect<void, never, never>, never, never>;
|
|
12
10
|
//# sourceMappingURL=sweep.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweep.d.ts","sourceRoot":"","sources":["../../src/exe-dev/sweep.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sweep.d.ts","sourceRoot":"","sources":["../../src/exe-dev/sweep.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAG7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAwC1C;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,yPAiIrC,CAAC"}
|
package/dist/exe-dev/sweep.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AttemptId } from "@usine/core/attempt";
|
|
2
|
+
import { WorkerName } from "@usine/core/worker";
|
|
2
3
|
import { Effect, Ref, Schema } from "effect";
|
|
3
|
-
import { ExecutorOperationError } from "../
|
|
4
|
+
import { ExecutorOperationError } from "../executor.js";
|
|
4
5
|
import { keyedLockFor } from "../keyed-lock.js";
|
|
5
6
|
const SWEEP_CONCURRENCY = 4;
|
|
6
7
|
const directChildSchema = (parent) => {
|
|
@@ -20,11 +21,9 @@ const directChildren = (parent, output) => Schema.decodeUnknownEffect(Schema.Arr
|
|
|
20
21
|
cause,
|
|
21
22
|
})));
|
|
22
23
|
/**
|
|
23
|
-
* Reclaims crash leftovers once
|
|
24
|
-
*
|
|
25
|
-
* sweep's siblings or
|
|
26
|
-
* sweep is marked done even when parts of it failed, and each failure is
|
|
27
|
-
* logged instead of propagated.
|
|
24
|
+
* Reclaims crash leftovers once per Worker before this process starts work on
|
|
25
|
+
* its VM. Each removal is isolated and each failure is logged, so one immovable
|
|
26
|
+
* leftover never blocks the sweep's siblings or a future prepare.
|
|
28
27
|
*/
|
|
29
28
|
export const abandonedWorktreeSweepFor = Effect.fn("ExeDevExecutor.abandonedWorktreeSweepFor")(function* (commands) {
|
|
30
29
|
const locks = yield* keyedLockFor();
|
|
@@ -40,9 +39,8 @@ export const abandonedWorktreeSweepFor = Effect.fn("ExeDevExecutor.abandonedWork
|
|
|
40
39
|
});
|
|
41
40
|
return;
|
|
42
41
|
}
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
// rely on the next process start to reclaim what failed today.
|
|
42
|
+
// Mark the sweep done before it runs. A partial sweep must not retry in
|
|
43
|
+
// front of every prepare; the next process start reclaims what failed.
|
|
46
44
|
yield* Ref.update(swept, (current) => new Set(current).add(worker));
|
|
47
45
|
const attemptsRoot = `${root}/attempts`;
|
|
48
46
|
const reposRoot = `${root}/repos`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/exe-dev/sweep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/exe-dev/sweep.ts"],"names":[],"mappings":"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"}
|