@usine/orchestrator 0.2.1 → 0.3.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.
- package/README.md +151 -52
- package/dist/board/items.d.ts +9 -1
- package/dist/board/items.d.ts.map +1 -1
- package/dist/board/items.js +16 -4
- package/dist/board/items.js.map +1 -1
- package/dist/board/projection.d.ts +7 -1
- package/dist/board/projection.d.ts.map +1 -1
- package/dist/board/projection.js +53 -14
- package/dist/board/projection.js.map +1 -1
- package/dist/board/tasks.d.ts +14 -2
- package/dist/board/tasks.d.ts.map +1 -1
- package/dist/board/tasks.js +23 -8
- package/dist/board/tasks.js.map +1 -1
- package/dist/credentials.d.ts +5 -6
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +22 -15
- package/dist/credentials.js.map +1 -1
- package/dist/current-instance/changes.d.ts +87 -0
- package/dist/current-instance/changes.d.ts.map +1 -0
- package/dist/current-instance/changes.js +138 -0
- package/dist/current-instance/changes.js.map +1 -0
- package/dist/current-instance/current-instance.d.ts +89 -0
- package/dist/current-instance/current-instance.d.ts.map +1 -0
- package/dist/current-instance/current-instance.js +163 -0
- package/dist/current-instance/current-instance.js.map +1 -0
- package/dist/exe-dev.d.ts +6 -2
- package/dist/exe-dev.d.ts.map +1 -1
- package/dist/exe-dev.js +7 -8
- package/dist/exe-dev.js.map +1 -1
- package/dist/idle-triggers.d.ts +1 -1
- package/dist/idle-triggers.d.ts.map +1 -1
- package/dist/idle-triggers.js +1 -1
- package/dist/idle-triggers.js.map +1 -1
- package/dist/label-reconciler.d.ts +5 -2
- package/dist/label-reconciler.d.ts.map +1 -1
- package/dist/label-reconciler.js.map +1 -1
- package/dist/local.d.ts +4 -18
- package/dist/local.d.ts.map +1 -1
- package/dist/local.js +7 -45
- package/dist/local.js.map +1 -1
- package/dist/loop-matches.d.ts +28 -0
- package/dist/loop-matches.d.ts.map +1 -0
- package/dist/loop-matches.js +74 -0
- package/dist/loop-matches.js.map +1 -0
- package/dist/operator/attempt.d.ts +57 -10
- package/dist/operator/attempt.d.ts.map +1 -1
- package/dist/operator/attempt.js +49 -10
- package/dist/operator/attempt.js.map +1 -1
- package/dist/operator/board.d.ts +43 -16
- package/dist/operator/board.d.ts.map +1 -1
- package/dist/operator/board.js +43 -16
- package/dist/operator/board.js.map +1 -1
- package/dist/operator/configuration.d.ts +258 -0
- package/dist/operator/configuration.d.ts.map +1 -0
- package/dist/operator/configuration.js +410 -0
- package/dist/operator/configuration.js.map +1 -0
- package/dist/operator/desk.d.ts +181 -0
- package/dist/operator/desk.d.ts.map +1 -0
- package/dist/operator/desk.js +463 -0
- package/dist/operator/desk.js.map +1 -0
- package/dist/operator/github-changes.d.ts +88 -0
- package/dist/operator/github-changes.d.ts.map +1 -0
- package/dist/operator/github-changes.js +266 -0
- package/dist/operator/github-changes.js.map +1 -0
- package/dist/operator/http.d.ts +152 -57
- package/dist/operator/http.d.ts.map +1 -1
- package/dist/operator/http.js +140 -21
- package/dist/operator/http.js.map +1 -1
- package/dist/operator/need.d.ts +44 -11
- package/dist/operator/need.d.ts.map +1 -1
- package/dist/operator/need.js +46 -9
- package/dist/operator/need.js.map +1 -1
- package/dist/operator/operator.d.ts +109 -29
- package/dist/operator/operator.d.ts.map +1 -1
- package/dist/operator/operator.js +254 -52
- package/dist/operator/operator.js.map +1 -1
- package/dist/operator/overview.d.ts +7 -7
- package/dist/operator/overview.d.ts.map +1 -1
- package/dist/operator/overview.js +5 -5
- package/dist/operator/overview.js.map +1 -1
- package/dist/operator/projection.d.ts +54 -5
- package/dist/operator/projection.d.ts.map +1 -1
- package/dist/operator/projection.js +100 -9
- package/dist/operator/projection.js.map +1 -1
- package/dist/operator/run.d.ts +71 -6
- package/dist/operator/run.d.ts.map +1 -1
- package/dist/operator/run.js +69 -6
- package/dist/operator/run.js.map +1 -1
- package/dist/operator/task.d.ts +93 -0
- package/dist/operator/task.d.ts.map +1 -0
- package/dist/operator/task.js +204 -0
- package/dist/operator/task.js.map +1 -0
- package/dist/operator/transcript.d.ts +12 -12
- package/dist/operator/transcript.d.ts.map +1 -1
- package/dist/operator/transcript.js +11 -9
- package/dist/operator/transcript.js.map +1 -1
- package/dist/operator/usage.d.ts +111 -0
- package/dist/operator/usage.d.ts.map +1 -0
- package/dist/operator/usage.js +219 -0
- package/dist/operator/usage.js.map +1 -0
- package/dist/orchestrator.d.ts +8 -5
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +4 -2
- package/dist/orchestrator.js.map +1 -1
- package/dist/polling/cycle.d.ts +28 -10
- package/dist/polling/cycle.d.ts.map +1 -1
- package/dist/polling/cycle.js +20 -6
- package/dist/polling/cycle.js.map +1 -1
- package/dist/polling/evaluation-failures.d.ts +42 -0
- package/dist/polling/evaluation-failures.d.ts.map +1 -0
- package/dist/polling/evaluation-failures.js +103 -0
- package/dist/polling/evaluation-failures.js.map +1 -0
- package/dist/polling/hints.d.ts +2 -2
- package/dist/polling/hints.d.ts.map +1 -1
- package/dist/polling/hints.js +2 -2
- package/dist/polling/hints.js.map +1 -1
- package/dist/polling/loop-evaluation.d.ts +21 -11
- package/dist/polling/loop-evaluation.d.ts.map +1 -1
- package/dist/polling/loop-evaluation.js +70 -27
- package/dist/polling/loop-evaluation.js.map +1 -1
- package/dist/polling/open-issues.d.ts +23 -0
- package/dist/polling/open-issues.d.ts.map +1 -0
- package/dist/polling/open-issues.js +77 -0
- package/dist/polling/open-issues.js.map +1 -0
- package/dist/polling/polling.d.ts +20 -11
- package/dist/polling/polling.d.ts.map +1 -1
- package/dist/polling/polling.js +201 -51
- package/dist/polling/polling.js.map +1 -1
- package/dist/polling/repository-sync.d.ts +20 -14
- package/dist/polling/repository-sync.d.ts.map +1 -1
- package/dist/polling/repository-sync.js +34 -27
- package/dist/polling/repository-sync.js.map +1 -1
- package/dist/polling-triggers.d.ts +1 -1
- package/dist/polling-triggers.d.ts.map +1 -1
- package/dist/polling-triggers.js +1 -1
- package/dist/polling-triggers.js.map +1 -1
- package/dist/reloads.d.ts +14 -0
- package/dist/reloads.d.ts.map +1 -0
- package/dist/reloads.js +7 -0
- package/dist/reloads.js.map +1 -0
- package/dist/runtime.d.ts +24 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +58 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schedule-triggers.d.ts +14 -10
- package/dist/schedule-triggers.d.ts.map +1 -1
- package/dist/schedule-triggers.js +36 -31
- package/dist/schedule-triggers.js.map +1 -1
- package/dist/scheduler.d.ts +35 -4
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +327 -41
- package/dist/scheduler.js.map +1 -1
- package/dist/ssh.d.ts +39 -0
- package/dist/ssh.d.ts.map +1 -0
- package/dist/ssh.js +75 -0
- package/dist/ssh.js.map +1 -0
- package/dist/trigger-condition.d.ts +12 -0
- package/dist/trigger-condition.d.ts.map +1 -0
- package/dist/trigger-condition.js +88 -0
- package/dist/trigger-condition.js.map +1 -0
- package/dist/trigger-submission.d.ts +16 -13
- package/dist/trigger-submission.d.ts.map +1 -1
- package/dist/trigger-submission.js +19 -14
- package/dist/trigger-submission.js.map +1 -1
- package/dist/worker-engine.d.ts +10 -0
- package/dist/worker-engine.d.ts.map +1 -0
- package/dist/worker-engine.js +25 -0
- package/dist/worker-engine.js.map +1 -0
- package/dist/worker-status.d.ts +70 -0
- package/dist/worker-status.d.ts.map +1 -0
- package/dist/worker-status.js +55 -0
- package/dist/worker-status.js.map +1 -0
- package/package.json +31 -10
package/dist/scheduler.js
CHANGED
|
@@ -1,52 +1,257 @@
|
|
|
1
1
|
import { resolveParentEffort } from "@usine/core/agent";
|
|
2
2
|
import { AgentFailure, InfraFailure } from "@usine/core/attempt/failure";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { salvageRefFor } from "@usine/core/attempt/salvage";
|
|
4
|
+
import { BotLogin, WorkerName } from "@usine/core/worker";
|
|
5
|
+
import { CheckoutRequest, Executor, ExecutorError, ExecutorOperationError } from "@usine/executor";
|
|
5
6
|
import { StepExecutor } from "@usine/engine/step-executor";
|
|
6
|
-
import {
|
|
7
|
+
import { GitHubApp } from "@usine/github/github-app";
|
|
8
|
+
import { Array as EffectArray, Context, DateTime, Deferred, Effect, Exit, Layer, Match, Option, Order, Ref, Schema, Semaphore, TxPriorityQueue, TxRef, } from "effect";
|
|
9
|
+
import { agentsWithNewBrains, workersChange, } from "./current-instance/changes.js";
|
|
10
|
+
import { CurrentInstance, reloadPreflightFailed, restartRequired, } from "./current-instance/current-instance.js";
|
|
11
|
+
import { recordPreflight, unchecked, WorkerStatus } from "./worker-status.js";
|
|
7
12
|
export class UnsupportedWorkerError extends Schema.TaggedError("@usine/orchestrator/UnsupportedWorkerError")("UnsupportedWorkerError", {
|
|
8
13
|
worker: WorkerName,
|
|
9
14
|
kind: Schema.String,
|
|
10
15
|
}) {
|
|
11
16
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
// Reservations for a specific Worker (Attempts already running there) go first; otherwise, the Run
|
|
18
|
+
// whose Event arrived first goes first.
|
|
19
|
+
const reservationOrder = Order.combineAll([
|
|
20
|
+
Order.mapInput(Order.Boolean, (reservation) => Option.isNone(reservation.worker)),
|
|
21
|
+
Order.mapInput(Order.Number, (reservation) => reservation.eventTime),
|
|
22
|
+
Order.mapInput(Order.Number, (reservation) => reservation.order),
|
|
23
|
+
]);
|
|
24
|
+
const slotPoolOf = (workers, previous) => {
|
|
25
|
+
const declared = new Set(workers.map(({ name }) => name));
|
|
26
|
+
return new Map([
|
|
27
|
+
...workers.map(({ name, maxConcurrentAttempts }) => [
|
|
28
|
+
name,
|
|
29
|
+
{ capacity: maxConcurrentAttempts, leased: previous.get(name)?.leased ?? 0 },
|
|
30
|
+
]),
|
|
31
|
+
...[...previous]
|
|
32
|
+
.filter(([name, { leased }]) => !declared.has(name) && leased > 0)
|
|
33
|
+
.map(([name, { leased }]) => [name, { capacity: 0, leased }]),
|
|
34
|
+
]);
|
|
35
|
+
};
|
|
36
|
+
const isFree = (pool, worker) => {
|
|
37
|
+
const slots = pool.get(worker);
|
|
38
|
+
return slots !== undefined && slots.leased < slots.capacity;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Returns the Worker with a free slot for `reservation`: its specified Worker, or else the first
|
|
42
|
+
* free one.
|
|
43
|
+
*/
|
|
44
|
+
const workerFor = (pool, reservation) => Option.match(reservation.worker, {
|
|
45
|
+
onNone: () => Option.fromNullishOr([...pool.keys()].find((worker) => isFree(pool, worker))),
|
|
46
|
+
onSome: (worker) => (isFree(pool, worker) ? Option.some(worker) : Option.none()),
|
|
27
47
|
});
|
|
48
|
+
const withLeased = (pool, worker, change) => {
|
|
49
|
+
const slots = pool.get(worker);
|
|
50
|
+
if (slots === undefined)
|
|
51
|
+
return pool;
|
|
52
|
+
return new Map(pool).set(worker, { ...slots, leased: slots.leased + change });
|
|
53
|
+
};
|
|
54
|
+
const releasedFrom = (pool, worker) => {
|
|
55
|
+
const slots = pool.get(worker);
|
|
56
|
+
if (slots === undefined)
|
|
57
|
+
return [{ _tag: "Dropped" }, pool];
|
|
58
|
+
if (slots.capacity === 0 && slots.leased <= 1) {
|
|
59
|
+
const next = new Map(pool);
|
|
60
|
+
next.delete(worker);
|
|
61
|
+
return [{ _tag: "Dropped" }, next];
|
|
62
|
+
}
|
|
63
|
+
const next = withLeased(pool, worker, -1);
|
|
64
|
+
return slots.leased > slots.capacity
|
|
65
|
+
? [{ _tag: "Retired", running: slots.leased - 1, slots: slots.capacity }, next]
|
|
66
|
+
: [{ _tag: "Freed" }, next];
|
|
67
|
+
};
|
|
68
|
+
// Only errors that a retry can avoid become the `InfraFailure` that the engine retries.
|
|
69
|
+
const asAttemptFailure = (error) => Match.valueTags(error, {
|
|
70
|
+
WorkerCapabilityError: ({ message }) => new AgentFailure({ message }),
|
|
71
|
+
CredentialUnavailableError: ({ reason, message }) => reason === "refused"
|
|
72
|
+
? new AgentFailure({ message })
|
|
73
|
+
: new InfraFailure({ message, cause: error }),
|
|
74
|
+
ExecutorOperationError: ({ operation, message }) => new InfraFailure({ message: `Executor ${operation} failed: ${message}`, cause: error }),
|
|
75
|
+
});
|
|
76
|
+
// The operation error has no Worker field, and reports must include the Worker.
|
|
77
|
+
const namingWorker = (worker) => (error) => error._tag === "ExecutorOperationError"
|
|
78
|
+
? new ExecutorOperationError({
|
|
79
|
+
operation: error.operation,
|
|
80
|
+
message: `worker "${worker}": ${error.message}`,
|
|
81
|
+
cause: error.cause,
|
|
82
|
+
})
|
|
83
|
+
: error;
|
|
28
84
|
const validateWorkers = (kind, workers) => {
|
|
29
85
|
const unsupported = workers.find((worker) => worker.kind !== kind);
|
|
30
86
|
return unsupported === undefined
|
|
31
87
|
? Effect.succeed(workers)
|
|
32
88
|
: new UnsupportedWorkerError({ worker: unsupported.name, kind: unsupported.kind });
|
|
33
89
|
};
|
|
34
|
-
|
|
35
|
-
|
|
90
|
+
const brainLabel = ({ harness, model, effort }) => `${harness}/${model}/${effort}`;
|
|
91
|
+
/** The login that exe.dev Workers write to GitHub as, through exe.dev's integration (ADR 0011). */
|
|
92
|
+
const EXE_DEV_BOT_LOGIN = BotLogin.make("exe-dev-github-integration[bot]");
|
|
93
|
+
const decodeBotLogin = Schema.decodeUnknownOption(BotLogin);
|
|
94
|
+
/** The Worker set of an executor that runs any Worker of its kind by name. */
|
|
95
|
+
const anyWorker = { add: () => Effect.void, remove: () => Effect.void };
|
|
96
|
+
/**
|
|
97
|
+
* Schedules Attempts FIFO over the Workers and adapts the Executor to the engine's `StepExecutor`
|
|
98
|
+
* port. Reservations for a specific Worker go first (#177), and a removed Worker stays until its
|
|
99
|
+
* last Attempt ends.
|
|
100
|
+
*/
|
|
101
|
+
export const stepExecutorLayer = (config, brains, options = {}) => Layer.effectContext(Effect.gen(function* () {
|
|
36
102
|
const executor = yield* Executor;
|
|
103
|
+
const instances = yield* CurrentInstance;
|
|
104
|
+
const app = yield* GitHubApp;
|
|
37
105
|
const workers = yield* validateWorkers(executor.kind, config.workers);
|
|
38
|
-
yield*
|
|
106
|
+
const pool = yield* TxRef.make(slotPoolOf(workers, new Map()));
|
|
107
|
+
const pending = yield* TxPriorityQueue.empty(reservationOrder);
|
|
108
|
+
const nextOrder = yield* Ref.make(0);
|
|
109
|
+
const preflights = yield* Ref.make(new Map());
|
|
110
|
+
const executorWorkers = options.workers ?? anyWorker;
|
|
111
|
+
// Every change to the executor's Workers takes this permit, so a removal never undoes an
|
|
112
|
+
// addition.
|
|
113
|
+
const membership = yield* Semaphore.make(1);
|
|
114
|
+
const adding = yield* Ref.make(new Set());
|
|
115
|
+
const recordPreflightExit = Effect.fn("WorkerScheduler.recordPreflight")(function* (worker, roster, exit) {
|
|
116
|
+
const failure = Exit.findErrorOption(exit);
|
|
117
|
+
// An interrupted or defective preflight gives no information about the Worker.
|
|
118
|
+
if (Exit.isFailure(exit) && Option.isNone(failure))
|
|
119
|
+
return;
|
|
120
|
+
const checkedAt = yield* DateTime.now;
|
|
121
|
+
yield* Ref.update(preflights, (current) => new Map(current).set(worker, recordPreflight(current.get(worker) ?? unchecked(worker), roster, checkedAt, failure)));
|
|
122
|
+
});
|
|
123
|
+
/**
|
|
124
|
+
* Runs `before`, then the Worker's preflight, and records both outcomes as the Worker's
|
|
125
|
+
* preflight.
|
|
126
|
+
*/
|
|
127
|
+
const preflightWorker = (worker, roster, before = Effect.void) => before.pipe(Effect.andThen(executor.preflight(worker.name, roster, worker.maxConcurrentAttempts)), Effect.mapError(namingWorker(worker.name)), Effect.onExit((exit) => recordPreflightExit(worker.name, roster, exit)));
|
|
128
|
+
/**
|
|
129
|
+
* Removes `worker` from the executor unless the scheduler has it or a reload is adding it.
|
|
130
|
+
* Callers must hold `membership`.
|
|
131
|
+
*/
|
|
132
|
+
const removeUnused = Effect.fn("WorkerScheduler.removeFromExecutor")(function* (worker) {
|
|
133
|
+
yield* Effect.annotateCurrentSpan({ worker });
|
|
134
|
+
const scheduled = (yield* TxRef.get(pool)).has(worker);
|
|
135
|
+
const added = (yield* Ref.get(adding)).has(worker);
|
|
136
|
+
if (scheduled || added) {
|
|
137
|
+
yield* Effect.logDebug("The Worker stays with the executor, because the scheduler has it or a reload is adding it", { worker, scheduled, added });
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
yield* executorWorkers.remove(worker);
|
|
141
|
+
});
|
|
142
|
+
/**
|
|
143
|
+
* Ends a reload's addition of `added` and removes each Worker that the scheduler doesn't
|
|
144
|
+
* have.
|
|
145
|
+
*/
|
|
146
|
+
const settleAdded = (added, removed) => membership.withPermit(Ref.update(adding, (current) => new Set([...current].filter((name) => !added.has(name)))).pipe(Effect.andThen(Effect.forEach(removed, removeUnused, { discard: true }))));
|
|
147
|
+
const unservedChange = (worker) => worker.kind === executor.kind
|
|
148
|
+
? Option.none()
|
|
149
|
+
: Option.some({
|
|
150
|
+
block: "workers",
|
|
151
|
+
field: `workers.${worker.name}.kind`,
|
|
152
|
+
reason: `worker "${worker.name}" has kind ${worker.kind}, and the running workers have kind ${executor.kind}`,
|
|
153
|
+
});
|
|
154
|
+
const applyWorkers = Effect.fn("WorkerScheduler.applyWorkers")(function* (change, declared) {
|
|
155
|
+
const before = yield* TxRef.modify(pool, (current) => [
|
|
156
|
+
current,
|
|
157
|
+
slotPoolOf(declared, current),
|
|
158
|
+
]);
|
|
159
|
+
const running = (worker) => before.get(worker)?.leased ?? 0;
|
|
160
|
+
yield* Effect.forEach(change.resized, ({ worker, from }) => Effect.logInfo("Worker slots resized by a reload; running Attempts continue", {
|
|
161
|
+
worker: worker.name,
|
|
162
|
+
slotsBefore: from,
|
|
163
|
+
slotsAfter: worker.maxConcurrentAttempts,
|
|
164
|
+
running: running(worker.name),
|
|
165
|
+
}));
|
|
166
|
+
yield* Effect.forEach(change.added, (worker) => Effect.logInfo("Worker added by a reload; it takes Attempts now", {
|
|
167
|
+
worker: worker.name,
|
|
168
|
+
slots: worker.maxConcurrentAttempts,
|
|
169
|
+
}));
|
|
170
|
+
yield* Effect.forEach(change.removed, ({ name }) => running(name) === 0
|
|
171
|
+
? Effect.logInfo("Worker removed by a reload; it runs no Attempt, so it leaves the scheduler now", { worker: name })
|
|
172
|
+
: Effect.logInfo("Worker removed by a reload; it takes no new Attempt, and its running Attempts finish", { worker: name, running: running(name) }));
|
|
173
|
+
yield* settleAdded(new Set(change.added.map(({ name }) => name)), change.removed.map(({ name }) => name));
|
|
174
|
+
});
|
|
175
|
+
const prepareReload = Effect.fn("WorkerScheduler.prepareReload")(function* (running, loaded) {
|
|
176
|
+
const change = workersChange(running.config.workers, loaded.config.workers);
|
|
177
|
+
const restart = [
|
|
178
|
+
...change.restart,
|
|
179
|
+
...EffectArray.getSomes(change.added.map(unservedChange)),
|
|
180
|
+
];
|
|
181
|
+
if (EffectArray.isReadonlyArrayNonEmpty(restart)) {
|
|
182
|
+
return yield* restartRequired(restart);
|
|
183
|
+
}
|
|
184
|
+
const agents = agentsWithNewBrains(running, loaded);
|
|
185
|
+
const agentNames = agents.map(({ name }) => name);
|
|
186
|
+
const newBrains = EffectArray.dedupe(agents.map(({ agent }) => agent.brain));
|
|
187
|
+
const roster = EffectArray.dedupe(loaded.agents.map(({ agent }) => agent.brain));
|
|
188
|
+
const wholeRoster = new Set([
|
|
189
|
+
...change.added.map(({ name }) => name),
|
|
190
|
+
...change.resized
|
|
191
|
+
.filter(({ worker, from }) => worker.maxConcurrentAttempts > from)
|
|
192
|
+
.map(({ worker }) => worker.name),
|
|
193
|
+
]);
|
|
194
|
+
const checks = loaded.config.workers.flatMap((worker) => wholeRoster.has(worker.name)
|
|
195
|
+
? [{ worker, brains: roster }]
|
|
196
|
+
: newBrains.length > 0
|
|
197
|
+
? [{ worker, brains: newBrains }]
|
|
198
|
+
: []);
|
|
199
|
+
yield* Effect.annotateCurrentSpan({ agents: agentNames, workers: [...wholeRoster] });
|
|
200
|
+
if (checks.length === 0) {
|
|
201
|
+
yield* Effect.logDebug("The reload adds no Worker, slot, or brain, so it runs no Worker preflight");
|
|
202
|
+
return applyWorkers(change, loaded.config.workers);
|
|
203
|
+
}
|
|
204
|
+
const added = new Set(change.added.map(({ name }) => name));
|
|
205
|
+
yield* membership.withPermit(Ref.update(adding, (current) => new Set([...current, ...added])));
|
|
206
|
+
yield* Effect.logInfo("Preflighting the Workers, slots, and brains the reload adds", {
|
|
207
|
+
agents: agentNames,
|
|
208
|
+
brains: newBrains.map(brainLabel),
|
|
209
|
+
workers: [...wholeRoster],
|
|
210
|
+
});
|
|
211
|
+
// Add the Worker to the executor first, so its preflight can connect to its machine.
|
|
212
|
+
yield* Effect.forEach(checks, ({ worker, brains }) => added.has(worker.name)
|
|
213
|
+
? preflightWorker(worker, brains, executorWorkers.add(worker))
|
|
214
|
+
: preflightWorker(worker, brains), { concurrency: "unbounded", discard: true }).pipe(Effect.mapError((cause) => reloadPreflightFailed(agentNames, [...wholeRoster], cause)), Effect.onExit((exit) => Exit.isFailure(exit) ? settleAdded(added, [...added]) : Effect.void));
|
|
215
|
+
return applyWorkers(change, loaded.config.workers);
|
|
216
|
+
});
|
|
217
|
+
yield* instances.registerWorkers(prepareReload);
|
|
218
|
+
// A reload can change the roster after the caller read `brains` and before the registration.
|
|
219
|
+
const { agents } = yield* instances.get;
|
|
220
|
+
const startupRoster = EffectArray.dedupe([
|
|
221
|
+
...brains,
|
|
222
|
+
...agents.map(({ agent }) => agent.brain),
|
|
223
|
+
]);
|
|
224
|
+
yield* Effect.forEach(workers, (worker) => preflightWorker(worker, startupRoster), {
|
|
39
225
|
concurrency: "unbounded",
|
|
40
226
|
discard: true,
|
|
227
|
+
}).pipe(Effect.withSpan("WorkerScheduler.preflight"));
|
|
228
|
+
const releaseSlot = (worker) => TxRef.modify(pool, (current) => releasedFrom(current, worker)).pipe(Effect.flatMap((release) => Match.valueTags(release, {
|
|
229
|
+
Freed: () => Effect.logDebug("Worker slot released", { worker }),
|
|
230
|
+
Retired: ({ running, slots }) => Effect.logInfo("An Attempt ended on a Worker that runs more Attempts than it has slots; its slot retires", { worker, running, slots }),
|
|
231
|
+
Dropped: () => Effect.logInfo("The last Attempt on a removed Worker ended; the Worker leaves the scheduler", { worker }).pipe(Effect.andThen(membership.withPermit(removeUnused(worker)))),
|
|
232
|
+
})));
|
|
233
|
+
const makeLease = Effect.fn("WorkerScheduler.makeLease")(function* (worker) {
|
|
234
|
+
const released = yield* Ref.make(false);
|
|
235
|
+
return {
|
|
236
|
+
worker,
|
|
237
|
+
release: Ref.modify(released, (done) => [!done, true]).pipe(Effect.flatMap((first) => (first ? releaseSlot(worker) : Effect.void))),
|
|
238
|
+
};
|
|
41
239
|
});
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const
|
|
45
|
-
|
|
240
|
+
// Retries until a free slot can take a waiting reservation, then takes both. A reservation
|
|
241
|
+
// whose Worker has no free slot doesn't block the ones behind it.
|
|
242
|
+
const nextAssignment = Effect.tx(Effect.gen(function* () {
|
|
243
|
+
const current = yield* TxRef.get(pool);
|
|
244
|
+
const next = EffectArray.findFirst(yield* TxPriorityQueue.toArray(pending), (reservation) => Option.map(workerFor(current, reservation), (worker) => ({ worker, reservation })));
|
|
245
|
+
if (Option.isNone(next))
|
|
246
|
+
return yield* Effect.txRetry;
|
|
247
|
+
const { worker, reservation } = next.value;
|
|
248
|
+
yield* TxPriorityQueue.removeIf(pending, (waiting) => waiting === reservation);
|
|
249
|
+
yield* TxRef.set(pool, withLeased(current, worker, 1));
|
|
250
|
+
return next.value;
|
|
251
|
+
}));
|
|
46
252
|
const dispatch = Effect.forever(Effect.gen(function* () {
|
|
47
|
-
const worker = yield*
|
|
48
|
-
const
|
|
49
|
-
const lease = yield* makeLease(worker, available);
|
|
253
|
+
const { worker, reservation } = yield* nextAssignment;
|
|
254
|
+
const lease = yield* makeLease(worker);
|
|
50
255
|
const assign = yield* Ref.modify(reservation.state, (state) => state._tag === "Pending"
|
|
51
256
|
? [true, { _tag: "Assigned", lease }]
|
|
52
257
|
: [false, state]);
|
|
@@ -59,50 +264,131 @@ export const stepExecutorLayer = (config, brains) => Layer.effect(StepExecutor,
|
|
|
59
264
|
}
|
|
60
265
|
}));
|
|
61
266
|
yield* Effect.forkScoped(dispatch);
|
|
62
|
-
const
|
|
267
|
+
const occupy = Effect.fn("WorkerScheduler.occupy")(function* (worker) {
|
|
268
|
+
yield* Effect.annotateCurrentSpan({ worker });
|
|
269
|
+
// The Attempt runs on the Worker even without a free slot, so count it now. A slot over
|
|
270
|
+
// capacity retires when an Attempt there ends.
|
|
271
|
+
const slots = yield* TxRef.modify(pool, (current) => [current.get(worker), withLeased(current, worker, 1)]);
|
|
272
|
+
if (slots === undefined) {
|
|
273
|
+
yield* Effect.logWarning("An Attempt already runs on a Worker the scheduler does not have; it occupies no slot, and that Worker takes no new Attempt", { worker });
|
|
274
|
+
return { worker, release: Effect.void };
|
|
275
|
+
}
|
|
276
|
+
const fields = { worker, running: slots.leased + 1, slots: slots.capacity };
|
|
277
|
+
if (slots.leased < slots.capacity)
|
|
278
|
+
yield* Effect.logInfo("An Attempt that already runs on the Worker occupies a slot", fields);
|
|
279
|
+
else
|
|
280
|
+
yield* Effect.logWarning("An Attempt that already runs on the Worker occupies a slot beyond its max_concurrent_attempts; the Worker takes no new Attempt until enough of its Attempts end", fields);
|
|
281
|
+
return yield* makeLease(worker);
|
|
282
|
+
});
|
|
283
|
+
const reserve = Effect.fn("WorkerScheduler.reserve")(function* (submission, worker) {
|
|
284
|
+
const run = { loop: submission.loop, itemKey: submission.itemKey };
|
|
285
|
+
yield* Effect.annotateCurrentSpan(run);
|
|
286
|
+
if (Option.isSome(worker))
|
|
287
|
+
yield* Effect.annotateCurrentSpan({ worker: worker.value });
|
|
63
288
|
const deferred = yield* Deferred.make();
|
|
64
289
|
const state = yield* Ref.make({ _tag: "Pending" });
|
|
65
290
|
const reservation = {
|
|
66
291
|
deferred,
|
|
292
|
+
worker,
|
|
67
293
|
eventTime: DateTime.toEpochMillis(submission.event.receivedAt),
|
|
68
294
|
order: yield* Ref.getAndUpdate(nextOrder, (value) => value + 1),
|
|
69
295
|
state,
|
|
70
296
|
};
|
|
71
297
|
yield* TxPriorityQueue.offer(pending, reservation);
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
298
|
+
const fields = { ...run, queued: yield* TxPriorityQueue.size(pending) };
|
|
299
|
+
if (Option.isNone(worker))
|
|
300
|
+
yield* Effect.logInfo("Run waits for a worker slot", fields);
|
|
301
|
+
else if (((yield* TxRef.get(pool)).get(worker.value)?.capacity ?? 0) > 0)
|
|
302
|
+
yield* Effect.logInfo("Run waits for a slot on the Worker its reattached Attempt runs on", { ...fields, worker: worker.value });
|
|
303
|
+
else
|
|
304
|
+
yield* Effect.logWarning("Run waits for a slot on the Worker its reattached Attempt runs on, which usine.yaml does not declare; it waits until a reload declares that Worker again or the Run is canceled", { ...fields, worker: worker.value });
|
|
77
305
|
return yield* Deferred.await(deferred).pipe(Effect.onInterrupt(() => Ref.modify(state, (current) => current._tag === "Assigned"
|
|
78
306
|
? [Option.some(current.lease), { _tag: "Canceled" }]
|
|
79
|
-
: [Option.none(), { _tag: "Canceled" }]).pipe(
|
|
307
|
+
: [Option.none(), { _tag: "Canceled" }]).pipe(
|
|
308
|
+
// Remove a canceled reservation from the queue, so one whose Worker never frees a
|
|
309
|
+
// slot doesn't stay there.
|
|
310
|
+
Effect.tap(() => TxPriorityQueue.removeIf(pending, (waiting) => waiting === reservation)), Effect.flatMap(Option.match({ onNone: () => Effect.void, onSome: (lease) => lease.release })))));
|
|
311
|
+
});
|
|
312
|
+
// If the login can't be read, harvesting asks GitHub; the Attempt never fails for this.
|
|
313
|
+
const botLoginFor = Effect.fn("WorkerScheduler.botLogin")(function* (attemptId) {
|
|
314
|
+
if (executor.kind === "exe.dev")
|
|
315
|
+
return Option.some(EXE_DEV_BOT_LOGIN);
|
|
316
|
+
const installation = yield* app.installation().pipe(Effect.map(Option.some), Effect.catch((error) => Effect.logWarning("Could not read the App's installation; harvesting will ask GitHub for the login of the Attempt's credential", { attemptId, errorTag: error._tag, message: error.message }).pipe(Effect.as(Option.none()))));
|
|
317
|
+
if (Option.isNone(installation))
|
|
318
|
+
return Option.none();
|
|
319
|
+
const { appSlug } = installation.value;
|
|
320
|
+
// GitHub's REST API names an App's bot `<slug>[bot]`; its GraphQL API drops the suffix.
|
|
321
|
+
const login = decodeBotLogin(`${appSlug}[bot]`);
|
|
322
|
+
if (Option.isNone(login))
|
|
323
|
+
yield* Effect.logWarning("The App's slug does not form a bot login; harvesting will ask GitHub for the login of the Attempt's credential", { attemptId, appSlug });
|
|
324
|
+
return login;
|
|
80
325
|
});
|
|
81
326
|
const execute = Effect.fn("WorkerScheduler.execute")(function* (execution, io) {
|
|
82
327
|
yield* Effect.annotateCurrentSpan({
|
|
83
328
|
attemptId: execution.attempt.id,
|
|
84
329
|
runId: execution.run.id,
|
|
85
330
|
worker: execution.attempt.worker,
|
|
331
|
+
loop: execution.run.loop,
|
|
332
|
+
permissions: execution.permissions,
|
|
333
|
+
reattach: execution.reattach,
|
|
86
334
|
});
|
|
335
|
+
const { settings } = (yield* instances.get).config;
|
|
336
|
+
const botLogin = yield* botLoginFor(execution.attempt.id);
|
|
87
337
|
const prepared = yield* executor
|
|
88
338
|
.prepare(new CheckoutRequest({
|
|
89
339
|
attemptId: execution.attempt.id,
|
|
90
340
|
worker: execution.attempt.worker,
|
|
91
341
|
repository: execution.repository,
|
|
342
|
+
loop: execution.run.loop,
|
|
343
|
+
permissions: execution.permissions,
|
|
92
344
|
revision: execution.revision,
|
|
93
345
|
payload: execution.event.payload,
|
|
94
346
|
task: execution.task,
|
|
95
347
|
agent: execution.agent,
|
|
96
348
|
parentModel: execution.parentModel,
|
|
97
|
-
maxChildren:
|
|
98
|
-
maxAttemptMinutes:
|
|
99
|
-
maxAttemptTokens:
|
|
100
|
-
parentEffort: resolveParentEffort(execution.agent,
|
|
349
|
+
maxChildren: settings.maxChildren,
|
|
350
|
+
maxAttemptMinutes: settings.maxAttemptMinutes,
|
|
351
|
+
maxAttemptTokens: settings.maxAttemptTokens,
|
|
352
|
+
parentEffort: resolveParentEffort(execution.agent, settings.parentEffort),
|
|
353
|
+
salvageRef: salvageRefFor(execution.run.id, execution.attempt.number),
|
|
354
|
+
resume: execution.resume,
|
|
355
|
+
reattach: execution.reattach,
|
|
356
|
+
botLogin,
|
|
101
357
|
}))
|
|
102
|
-
.pipe(Effect.
|
|
358
|
+
.pipe(Effect.tapError((error) => error._tag === "CredentialUnavailableError"
|
|
359
|
+
? Effect.logWarning(error.reason === "refused"
|
|
360
|
+
? "The Attempt's repository access was refused; the Attempt fails without an automatic retry"
|
|
361
|
+
: "The Attempt's repository access could not be obtained now; the Attempt fails with an infrastructure failure, which is retried", {
|
|
362
|
+
attemptId: execution.attempt.id,
|
|
363
|
+
worker: execution.attempt.worker,
|
|
364
|
+
repository: error.repository,
|
|
365
|
+
reason: error.reason,
|
|
366
|
+
message: error.message,
|
|
367
|
+
})
|
|
368
|
+
: Effect.void), Effect.mapError(asAttemptFailure));
|
|
369
|
+
// The engine reconciles a checkout kept for a reattachment until preparation acquires it;
|
|
370
|
+
// from here the executor releases it.
|
|
371
|
+
yield* io.checkoutAcquired;
|
|
103
372
|
return yield* prepared.launch(io);
|
|
104
373
|
}, Effect.scoped);
|
|
105
374
|
const interrupt = (attemptId) => executor.cancel(attemptId).pipe(Effect.mapError(asAttemptFailure));
|
|
106
|
-
|
|
375
|
+
const status = WorkerStatus.of({
|
|
376
|
+
slots: TxRef.get(pool).pipe(Effect.map((current) => [...current].map(([worker, { capacity, leased }]) => ({ worker, capacity, leased })))),
|
|
377
|
+
preflights: Ref.get(preflights).pipe(Effect.map((current) => [...current.values()])),
|
|
378
|
+
});
|
|
379
|
+
const stepExecutor = StepExecutor.of({
|
|
380
|
+
workers: TxRef.get(pool).pipe(Effect.map((current) => [...current.keys()])),
|
|
381
|
+
execute,
|
|
382
|
+
interrupt,
|
|
383
|
+
isLive: executor.isLive,
|
|
384
|
+
outcome: executor.outcome,
|
|
385
|
+
reserve,
|
|
386
|
+
occupy,
|
|
387
|
+
intervene: executor.intervene,
|
|
388
|
+
recover: (attempt, record) => executor
|
|
389
|
+
.recover(attempt, record)
|
|
390
|
+
.pipe(Effect.catchIf(Schema.is(ExecutorError), (error) => Effect.fail(asAttemptFailure(error)))),
|
|
391
|
+
});
|
|
392
|
+
return Context.make(StepExecutor, stepExecutor).pipe(Context.add(WorkerStatus, status));
|
|
107
393
|
}));
|
|
108
394
|
//# sourceMappingURL=scheduler.js.map
|
package/dist/scheduler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/ssh.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SshWorker, UsineConfig } from "@usine/config/factory";
|
|
2
|
+
import type { BrainSpec } from "@usine/core/agent/brain";
|
|
3
|
+
import type { InstanceDirectory } from "@usine/core/instance";
|
|
4
|
+
import { WorkerCapabilityError } from "@usine/executor";
|
|
5
|
+
import { type SshExecutorOptions, SshWorkers } from "@usine/executor/ssh";
|
|
6
|
+
import { Effect, Layer, Option } from "effect";
|
|
7
|
+
/** Returns the SSH Workers that `usine.yaml` declares, in declared order. */
|
|
8
|
+
export declare const sshWorkersOf: (config: UsineConfig) => ReadonlyArray<SshWorker>;
|
|
9
|
+
/**
|
|
10
|
+
* Returns how the executor connects to each declared SSH Worker, reading Gateway admin tokens at
|
|
11
|
+
* startup. If an `admin_token_env` variable is unset, fails with a `gateway` capability error.
|
|
12
|
+
*/
|
|
13
|
+
export declare const sshWorkerAddressesOf: (config: UsineConfig) => Effect.Effect<{
|
|
14
|
+
name: string & import("effect/Brand").Brand<"WorkerName">;
|
|
15
|
+
destination: string & import("effect/Brand").Brand<"SshDestination">;
|
|
16
|
+
identityFile: Option.Option<string & import("effect/Brand").Brand<"SshIdentityFile">>;
|
|
17
|
+
port: Option.Option<number & import("effect/Brand").Brand<"SshPort">>;
|
|
18
|
+
root: string & import("effect/Brand").Brand<"WorkerRoot">;
|
|
19
|
+
gateway: Option.Option<{
|
|
20
|
+
domain: string & import("effect/Brand").Brand<"GatewayDomain">;
|
|
21
|
+
destination: string & import("effect/Brand").Brand<"SshDestination">;
|
|
22
|
+
adminPort: number & import("effect/Brand").Brand<"GatewayAdminPort">;
|
|
23
|
+
adminToken: import("effect/Redacted").Redacted<string>;
|
|
24
|
+
llmProviders: readonly "anthropic"[];
|
|
25
|
+
}>;
|
|
26
|
+
}[], WorkerCapabilityError, never>;
|
|
27
|
+
/**
|
|
28
|
+
* Provides the scheduler over the SSH executor, so reloads can resize, add, and remove SSH Workers.
|
|
29
|
+
* A reload that adds a Worker fails with a `gateway` capability error if its `admin_token_env`
|
|
30
|
+
* variable is unset.
|
|
31
|
+
*/
|
|
32
|
+
export declare const sshStepExecutorLayer: (config: UsineConfig, brains: ReadonlyArray<BrainSpec>) => Layer.Layer<import("@usine/engine/step-executor").StepExecutor | import("./worker-status.ts").WorkerStatus, import("@usine/executor").CredentialUnavailableError | import("@usine/executor").ExecutorOperationError | import("./scheduler.ts").UnsupportedWorkerError | WorkerCapabilityError, import("./current-instance/current-instance.ts").CurrentInstance | import("@usine/executor").Executor | import("@usine/github/github-app").GitHubApp | SshWorkers>;
|
|
33
|
+
/**
|
|
34
|
+
* Provides the full engine and `WorkerStatus` for SSH Workers. Requires `CredentialProvider`,
|
|
35
|
+
* `GitHubApp`, `TriggerCondition`, `AttemptRuntime` (built before the engine), `ClaudeLoginLock`,
|
|
36
|
+
* and `CurrentInstance`.
|
|
37
|
+
*/
|
|
38
|
+
export declare const layer: (instanceDirectory: InstanceDirectory, config: UsineConfig, brains: ReadonlyArray<BrainSpec>, options: SshExecutorOptions) => Layer.Layer<import("@usine/engine/board-moves").BoardMoves | import("@usine/engine/cursor").CursorStore | import("@usine/engine/cycle-budget").CycleBudgets | import("@usine/engine/item-projection").ItemProjectionReader | import("@usine/engine/item-projection").ItemProjectionWriter | import("@usine/engine/loop-control").LoopControl | import("@usine/engine/repository-label-projection").RepositoryLabelProjectionReader | import("@usine/engine/repository-label-projection").RepositoryLabelProjectionWriter | import("@usine/engine/engine").RunEngine | import("@usine/engine/run-reader").RunReader | import("@usine/engine/step-executor").StepExecutor | import("./worker-status.ts").WorkerStatus, import("@usine/engine/engine").AttemptCancellationError | import("@usine/executor").CredentialUnavailableError | import("@usine/engine/engine").EnginePersistenceError | import("@usine/executor").ExecutorOperationError | import("@usine/engine/engine").RunInterventionRejectedError | import("@usine/engine/engine").RunNotFoundError | import("@usine/engine/engine").RunOperationRejectedError | import("@usine/engine/engine").RunRetryBlockedError | import("./scheduler.ts").UnsupportedWorkerError | WorkerCapabilityError, import("@usine/durable/attempt-runtime").AttemptRuntime | import("@usine/agents/runtime").ClaudeLoginLock | import("@usine/executor").CredentialProvider | import("./current-instance/current-instance.ts").CurrentInstance | import("@usine/github/github-app").GitHubApp | import("@usine/engine/trigger-condition").TriggerCondition>;
|
|
39
|
+
//# sourceMappingURL=ssh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAA0B,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAEL,KAAK,kBAAkB,EAEvB,UAAU,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAA0B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIvE,6EAA6E;AAC7E,eAAO,MAAM,YAAY,WAAY,WAAW,KAAG,aAAa,CAAC,SAAS,CACK,CAAC;AA0ChF;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;kCAU/B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,WAAY,WAAW,UAAU,aAAa,CAAC,SAAS,CAAC,scAsBvF,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,KAAK,sBACG,iBAAiB,UAC5B,WAAW,UACX,aAAa,CAAC,SAAS,CAAC,WACvB,kBAAkB,wgDAQ5B,CAAC"}
|
package/dist/ssh.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { NodeServices } from "@effect/platform-node";
|
|
2
|
+
import { layer as localEngineLayer } from "@usine/engine/local-sqlite";
|
|
3
|
+
import { WorkerCapabilityError } from "@usine/executor";
|
|
4
|
+
import { layer as sshExecutorLayer, SshWorkers, } from "@usine/executor/ssh";
|
|
5
|
+
import { Config, ConfigProvider, Effect, Layer, Option } from "effect";
|
|
6
|
+
import { FetchHttpClient } from "effect/unstable/http";
|
|
7
|
+
import { stepExecutorLayer } from "./scheduler.js";
|
|
8
|
+
/** Returns the SSH Workers that `usine.yaml` declares, in declared order. */
|
|
9
|
+
export const sshWorkersOf = (config) => config.workers.filter((worker) => worker.kind === "ssh");
|
|
10
|
+
/**
|
|
11
|
+
* Returns how the executor connects to `worker`, reading the Gateway admin token from
|
|
12
|
+
* `admin_token_env`. Fails with a `gateway` capability error if the variable is unset.
|
|
13
|
+
*/
|
|
14
|
+
const sshWorkerAddressOf = (worker, missing) => Effect.gen(function* () {
|
|
15
|
+
const gateway = yield* Effect.transposeOption(Option.map(worker.gateway, (settings) => Effect.gen(function* () {
|
|
16
|
+
const adminToken = yield* Config.redacted(settings.adminTokenEnv);
|
|
17
|
+
return {
|
|
18
|
+
domain: settings.domain,
|
|
19
|
+
destination: settings.destination,
|
|
20
|
+
adminPort: settings.adminPort,
|
|
21
|
+
adminToken,
|
|
22
|
+
llmProviders: settings.llmProviders,
|
|
23
|
+
};
|
|
24
|
+
}).pipe(Effect.mapError((cause) => new WorkerCapabilityError({
|
|
25
|
+
worker: worker.name,
|
|
26
|
+
capability: "gateway",
|
|
27
|
+
message: missing(settings.adminTokenEnv),
|
|
28
|
+
cause,
|
|
29
|
+
})))));
|
|
30
|
+
return {
|
|
31
|
+
name: worker.name,
|
|
32
|
+
destination: worker.destination,
|
|
33
|
+
identityFile: worker.identityFile,
|
|
34
|
+
port: worker.port,
|
|
35
|
+
root: worker.root,
|
|
36
|
+
gateway,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* Returns how the executor connects to each declared SSH Worker, reading Gateway admin tokens at
|
|
41
|
+
* startup. If an `admin_token_env` variable is unset, fails with a `gateway` capability error.
|
|
42
|
+
*/
|
|
43
|
+
export const sshWorkerAddressesOf = Effect.fn("Orchestrator.sshWorkerAddressesOf")(function* (config) {
|
|
44
|
+
return yield* Effect.forEach(sshWorkersOf(config), (worker) => sshWorkerAddressOf(worker, (variable) => `The gateway admin token for SSH worker "${worker.name}" is missing. Set ${variable} in the orchestrator's environment.`));
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* Provides the scheduler over the SSH executor, so reloads can resize, add, and remove SSH Workers.
|
|
48
|
+
* A reload that adds a Worker fails with a `gateway` capability error if its `admin_token_env`
|
|
49
|
+
* variable is unset.
|
|
50
|
+
*/
|
|
51
|
+
export const sshStepExecutorLayer = (config, brains) => Layer.unwrap(Effect.gen(function* () {
|
|
52
|
+
const machines = yield* SshWorkers;
|
|
53
|
+
const environment = yield* ConfigProvider.ConfigProvider;
|
|
54
|
+
const add = Effect.fn("Orchestrator.addSshWorker")(function* (worker) {
|
|
55
|
+
yield* Effect.annotateCurrentSpan({ worker: worker.name });
|
|
56
|
+
if (worker.kind !== "ssh")
|
|
57
|
+
return yield* Effect.die(new Error(`The SSH executor cannot run worker "${worker.name}" of kind ${worker.kind}`));
|
|
58
|
+
const address = yield* sshWorkerAddressOf(worker, (variable) => `The gateway admin token for SSH worker "${worker.name}" is missing: ${variable} is not set in the orchestrator's environment. usine up reads only the variables that were set when it started. Set ${variable} and restart usine up, or set admin_token_env to a variable that usine up already has.`).pipe(Effect.provideService(ConfigProvider.ConfigProvider, environment));
|
|
59
|
+
yield* machines.addWorker(address);
|
|
60
|
+
});
|
|
61
|
+
return stepExecutorLayer(config, brains, {
|
|
62
|
+
workers: { add, remove: machines.removeWorker },
|
|
63
|
+
});
|
|
64
|
+
}));
|
|
65
|
+
/**
|
|
66
|
+
* Provides the full engine and `WorkerStatus` for SSH Workers. Requires `CredentialProvider`,
|
|
67
|
+
* `GitHubApp`, `TriggerCondition`, `AttemptRuntime` (built before the engine), `ClaudeLoginLock`,
|
|
68
|
+
* and `CurrentInstance`.
|
|
69
|
+
*/
|
|
70
|
+
export const layer = (instanceDirectory, config, brains, options) => {
|
|
71
|
+
const executor = sshExecutorLayer(options).pipe(Layer.provide(NodeServices.layer), Layer.provide(FetchHttpClient.layer));
|
|
72
|
+
const stepExecutor = sshStepExecutorLayer(config, brains).pipe(Layer.provide(executor));
|
|
73
|
+
return localEngineLayer(instanceDirectory).pipe(Layer.provideMerge(stepExecutor));
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=ssh.js.map
|