@usine/orchestrator 0.0.1 → 0.2.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 +146 -2
- package/dist/board/items.d.ts +18 -0
- package/dist/board/items.d.ts.map +1 -0
- package/dist/board/items.js +46 -0
- package/dist/board/items.js.map +1 -0
- package/dist/board/projection.d.ts +9 -0
- package/dist/board/projection.d.ts.map +1 -0
- package/dist/board/projection.js +111 -0
- package/dist/board/projection.js.map +1 -0
- package/dist/board/tasks.d.ts +8 -0
- package/dist/board/tasks.d.ts.map +1 -0
- package/dist/board/tasks.js +86 -0
- package/dist/board/tasks.js.map +1 -0
- package/dist/credentials.d.ts +12 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +62 -0
- package/dist/credentials.js.map +1 -0
- package/dist/exe-dev.d.ts +8 -0
- package/dist/exe-dev.d.ts.map +1 -0
- package/dist/exe-dev.js +17 -0
- package/dist/exe-dev.js.map +1 -0
- package/dist/idle-triggers.d.ts +6 -0
- package/dist/idle-triggers.d.ts.map +1 -0
- package/dist/idle-triggers.js +31 -0
- package/dist/idle-triggers.js.map +1 -0
- package/dist/label-reconciler.d.ts +30 -0
- package/dist/label-reconciler.d.ts.map +1 -0
- package/dist/label-reconciler.js +119 -0
- package/dist/label-reconciler.js.map +1 -0
- package/dist/local.d.ts +25 -0
- package/dist/local.d.ts.map +1 -0
- package/dist/local.js +53 -0
- package/dist/local.js.map +1 -0
- package/dist/operator/attempt.d.ts +66 -0
- package/dist/operator/attempt.d.ts.map +1 -0
- package/dist/operator/attempt.js +58 -0
- package/dist/operator/attempt.js.map +1 -0
- package/dist/operator/board.d.ts +119 -0
- package/dist/operator/board.d.ts.map +1 -0
- package/dist/operator/board.js +101 -0
- package/dist/operator/board.js.map +1 -0
- package/dist/operator/http.d.ts +114 -0
- package/dist/operator/http.d.ts.map +1 -0
- package/dist/operator/http.js +139 -0
- package/dist/operator/http.js.map +1 -0
- package/dist/operator/need.d.ts +66 -0
- package/dist/operator/need.d.ts.map +1 -0
- package/dist/operator/need.js +70 -0
- package/dist/operator/need.js.map +1 -0
- package/dist/operator/operator.d.ts +64 -0
- package/dist/operator/operator.d.ts.map +1 -0
- package/dist/operator/operator.js +363 -0
- package/dist/operator/operator.js.map +1 -0
- package/dist/operator/overview.d.ts +51 -0
- package/dist/operator/overview.d.ts.map +1 -0
- package/dist/operator/overview.js +48 -0
- package/dist/operator/overview.js.map +1 -0
- package/dist/operator/projection.d.ts +17 -0
- package/dist/operator/projection.d.ts.map +1 -0
- package/dist/operator/projection.js +138 -0
- package/dist/operator/projection.js.map +1 -0
- package/dist/operator/run.d.ts +38 -0
- package/dist/operator/run.d.ts.map +1 -0
- package/dist/operator/run.js +41 -0
- package/dist/operator/run.js.map +1 -0
- package/dist/operator/transcript.d.ts +57 -0
- package/dist/operator/transcript.d.ts.map +1 -0
- package/dist/operator/transcript.js +59 -0
- package/dist/operator/transcript.js.map +1 -0
- package/dist/orchestrator.d.ts +14 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +14 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/polling/cycle.d.ts +51 -0
- package/dist/polling/cycle.d.ts.map +1 -0
- package/dist/polling/cycle.js +44 -0
- package/dist/polling/cycle.js.map +1 -0
- package/dist/polling/hints.d.ts +20 -0
- package/dist/polling/hints.d.ts.map +1 -0
- package/dist/polling/hints.js +54 -0
- package/dist/polling/hints.js.map +1 -0
- package/dist/polling/loop-evaluation.d.ts +21 -0
- package/dist/polling/loop-evaluation.d.ts.map +1 -0
- package/dist/polling/loop-evaluation.js +131 -0
- package/dist/polling/loop-evaluation.js.map +1 -0
- package/dist/polling/polling.d.ts +36 -0
- package/dist/polling/polling.d.ts.map +1 -0
- package/dist/polling/polling.js +296 -0
- package/dist/polling/polling.js.map +1 -0
- package/dist/polling/repository-sync.d.ts +45 -0
- package/dist/polling/repository-sync.d.ts.map +1 -0
- package/dist/polling/repository-sync.js +169 -0
- package/dist/polling/repository-sync.js.map +1 -0
- package/dist/polling-triggers.d.ts +4 -0
- package/dist/polling-triggers.d.ts.map +1 -0
- package/dist/polling-triggers.js +4 -0
- package/dist/polling-triggers.js.map +1 -0
- package/dist/schedule-triggers.d.ts +67 -0
- package/dist/schedule-triggers.d.ts.map +1 -0
- package/dist/schedule-triggers.js +401 -0
- package/dist/schedule-triggers.js.map +1 -0
- package/dist/scheduler.d.ts +15 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +107 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/trigger-submission.d.ts +69 -0
- package/dist/trigger-submission.d.ts.map +1 -0
- package/dist/trigger-submission.js +108 -0
- package/dist/trigger-submission.js.map +1 -0
- package/package.json +67 -5
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -8
- package/dist/index.js.map +0 -1
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { GitHubLabelName } from "@usine/config/label";
|
|
2
|
+
import { Event, DedupKey, EventId } from "@usine/core/event";
|
|
3
|
+
import { CycleBudgetAskId } from "@usine/core/cycle-budget";
|
|
4
|
+
import { CycleBudgets } from "@usine/engine/cycle-budget";
|
|
5
|
+
import { LoopName } from "@usine/core/loop";
|
|
6
|
+
import { RunId } from "@usine/core/run";
|
|
7
|
+
import { RunEngine, RunOperationRejectedError, } from "@usine/engine/engine";
|
|
8
|
+
import { ItemProjectionReader } from "@usine/engine/item-projection";
|
|
9
|
+
import { LoopControl } from "@usine/engine/loop-control";
|
|
10
|
+
import { RunReader } from "@usine/engine/run-reader";
|
|
11
|
+
import { RepositoryLabelProjectionReader } from "@usine/engine/repository-label-projection";
|
|
12
|
+
import { GitHubItemWriter } from "@usine/github/item-writer";
|
|
13
|
+
import { ChangedIssue, ChangedPullRequest } from "@usine/github/polling";
|
|
14
|
+
import { Context, DateTime, Effect, Exit, Layer, Option, Schema, SynchronizedRef } from "effect";
|
|
15
|
+
import { labelMutationForBoardMove, projectBoard } from "../board/projection.js";
|
|
16
|
+
import { GitHubItemKey, PollingTriggers } from "../polling-triggers.js";
|
|
17
|
+
import { ScheduleTriggers } from "../schedule-triggers.js";
|
|
18
|
+
import { ApprovalNeed, CycleBudgetNeed, BoardProjectionNeed, PollFailureNeed, PreflightFindingNeed, RunFailureNeed, ScheduleFailureNeed, } from "./need.js";
|
|
19
|
+
import { BoardItemNotFoundError as BoardItemNotFound, BoardLaneNotFoundError as BoardLaneNotFound, BoardLaneReadOnlyError as BoardLaneReadOnly, BoardProjectNotFoundError as BoardProjectNotFound, LabelView, } from "./board.js";
|
|
20
|
+
import { ColdTranscriptRequest, } from "./transcript.js";
|
|
21
|
+
import { LoopView, ProjectView, ReadyOverview } from "./overview.js";
|
|
22
|
+
import { RunDetailView } from "./run.js";
|
|
23
|
+
import { readTranscript, runView } from "./projection.js";
|
|
24
|
+
/** How many settled Runs the overview keeps beside the open ones. */
|
|
25
|
+
const OVERVIEW_CLOSED_RUNS = 100;
|
|
26
|
+
/** How many newest Items a Board shows; older ones drop off. */
|
|
27
|
+
const OVERVIEW_BOARD_ITEMS = 500;
|
|
28
|
+
const makeOperatorObservation = Effect.gen(function* () {
|
|
29
|
+
const budgets = yield* CycleBudgets;
|
|
30
|
+
const reader = yield* RunReader;
|
|
31
|
+
const controls = yield* LoopControl;
|
|
32
|
+
const itemReader = yield* ItemProjectionReader;
|
|
33
|
+
const repositoryLabels = yield* RepositoryLabelProjectionReader;
|
|
34
|
+
const polling = yield* PollingTriggers;
|
|
35
|
+
const schedules = yield* ScheduleTriggers;
|
|
36
|
+
const cache = yield* SynchronizedRef.make(Option.none());
|
|
37
|
+
const projectOverview = Effect.fn("Operator.projectOverview")(function* (instance, pollFailures, preflightFindings, scheduleFailures, revision) {
|
|
38
|
+
const [snapshots, states, cycleAsks] = yield* Effect.all([
|
|
39
|
+
reader.list({ closedLimit: OVERVIEW_CLOSED_RUNS }),
|
|
40
|
+
controls.states,
|
|
41
|
+
budgets.asks(),
|
|
42
|
+
], { concurrency: "unbounded" });
|
|
43
|
+
const paused = new Set(states.filter((state) => state.paused).map((state) => state.loop));
|
|
44
|
+
const views = snapshots.map((snapshot) => runView(snapshot, paused));
|
|
45
|
+
const runsByRepository = new Map();
|
|
46
|
+
for (const view of views) {
|
|
47
|
+
const projectRuns = runsByRepository.get(view.repository) ?? [];
|
|
48
|
+
projectRuns.push(view);
|
|
49
|
+
runsByRepository.set(view.repository, projectRuns);
|
|
50
|
+
}
|
|
51
|
+
const projects = yield* Effect.forEach(instance.config.repos, (repository) => Effect.gen(function* () {
|
|
52
|
+
const { name } = repository;
|
|
53
|
+
const projectFindings = preflightFindings.filter(({ repository: findingRepository }) => findingRepository === name);
|
|
54
|
+
const [boardItems, labelProjection] = yield* Effect.all([
|
|
55
|
+
itemReader.list(name, { limit: OVERVIEW_BOARD_ITEMS }),
|
|
56
|
+
repositoryLabels.get(name),
|
|
57
|
+
], { concurrency: "unbounded" });
|
|
58
|
+
const history = yield* reader.forItems(boardItems.map(({ itemKey }) => itemKey));
|
|
59
|
+
const merged = new Map((runsByRepository.get(name) ?? []).map((run) => [run.id, run]));
|
|
60
|
+
for (const saved of history) {
|
|
61
|
+
const view = runView(saved, paused);
|
|
62
|
+
merged.set(view.id, view);
|
|
63
|
+
}
|
|
64
|
+
const projectRuns = [...merged.values()].sort((a, b) => b.openedAt.localeCompare(a.openedAt) || b.id.localeCompare(a.id));
|
|
65
|
+
const catalog = Option.match(labelProjection, {
|
|
66
|
+
onNone: () => [],
|
|
67
|
+
onSome: ({ labels }) => labels,
|
|
68
|
+
});
|
|
69
|
+
const board = yield* projectBoard(repository, catalog.map(({ name }) => name), boardItems, projectRuns, cycleAsks.map(({ itemKey }) => itemKey));
|
|
70
|
+
const status = cycleAsks.some((ask) => ask.repository === name) ||
|
|
71
|
+
board.failures.length > 0 ||
|
|
72
|
+
projectFindings.length > 0 ||
|
|
73
|
+
projectRuns.some((run) => run.state === "Waiting" || run.state === "Failed")
|
|
74
|
+
? "needs-you"
|
|
75
|
+
: projectRuns.some((run) => run.canCancel)
|
|
76
|
+
? "active"
|
|
77
|
+
: "clear";
|
|
78
|
+
return new ProjectView({
|
|
79
|
+
repository: name,
|
|
80
|
+
status,
|
|
81
|
+
runs: projectRuns,
|
|
82
|
+
board,
|
|
83
|
+
labels: catalog.map(({ name: label, color, description }) => new LabelView({
|
|
84
|
+
name: GitHubLabelName.make(label),
|
|
85
|
+
color: Option.getOrNull(color),
|
|
86
|
+
description: Option.getOrNull(description),
|
|
87
|
+
})),
|
|
88
|
+
preflightFindings: projectFindings,
|
|
89
|
+
});
|
|
90
|
+
}), { concurrency: 4 });
|
|
91
|
+
const loops = instance.loops.map((loop) => new LoopView({
|
|
92
|
+
name: loop.name,
|
|
93
|
+
trigger: loop.trigger.on,
|
|
94
|
+
agent: loop.agent,
|
|
95
|
+
paused: paused.has(loop.name),
|
|
96
|
+
}));
|
|
97
|
+
const needsYou = [];
|
|
98
|
+
for (const ask of cycleAsks) {
|
|
99
|
+
const item = Schema.decodeUnknownOption(GitHubItemKey)(ask.itemKey);
|
|
100
|
+
needsYou.push(new CycleBudgetNeed({
|
|
101
|
+
id: `cycle-budget:${ask.id}`,
|
|
102
|
+
ask,
|
|
103
|
+
itemLabel: Option.match(item, {
|
|
104
|
+
onNone: () => ask.itemKey,
|
|
105
|
+
onSome: ([, repository, number]) => `${repository}#${number}`,
|
|
106
|
+
}),
|
|
107
|
+
itemUrl: Option.match(item, {
|
|
108
|
+
onNone: () => null,
|
|
109
|
+
onSome: ([, repository, number]) => `https://github.com/${repository}/issues/${number}`,
|
|
110
|
+
}),
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
const allRuns = new Map(views.map((run) => [run.id, run]));
|
|
114
|
+
for (const project of projects)
|
|
115
|
+
for (const run of project.runs)
|
|
116
|
+
allRuns.set(run.id, run);
|
|
117
|
+
for (const run of allRuns.values()) {
|
|
118
|
+
if (run.state === "Waiting") {
|
|
119
|
+
needsYou.push(new ApprovalNeed({
|
|
120
|
+
id: `approval:${run.id}`,
|
|
121
|
+
repository: run.repository,
|
|
122
|
+
runId: run.id,
|
|
123
|
+
loop: run.loop,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
else if (run.state === "Failed") {
|
|
127
|
+
const attempt = run.attempts.at(-1);
|
|
128
|
+
if (attempt?.outcome?._tag !== "Failed") {
|
|
129
|
+
return yield* Effect.die(new Error(`Failed Run ${run.id} has no failed Attempt`));
|
|
130
|
+
}
|
|
131
|
+
needsYou.push(new RunFailureNeed({
|
|
132
|
+
id: `run-failure:${run.id}`,
|
|
133
|
+
repository: run.repository,
|
|
134
|
+
runId: run.id,
|
|
135
|
+
loop: run.loop,
|
|
136
|
+
failure: attempt.outcome.failure,
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
for (const project of projects) {
|
|
141
|
+
for (const failure of project.board.failures) {
|
|
142
|
+
needsYou.push(new BoardProjectionNeed({
|
|
143
|
+
id: `board-projection:${failure.repository}:${failure.itemKey}`,
|
|
144
|
+
failure,
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
pollFailures.forEach((failure, index) => {
|
|
149
|
+
needsYou.push(new PollFailureNeed({
|
|
150
|
+
id: `poll-failure:${failure.repository}:${failure.errorTag}:${index}`,
|
|
151
|
+
failure,
|
|
152
|
+
}));
|
|
153
|
+
});
|
|
154
|
+
preflightFindings.forEach((finding) => {
|
|
155
|
+
needsYou.push(new PreflightFindingNeed({
|
|
156
|
+
id: `preflight:${finding.repository}:${finding.label}`,
|
|
157
|
+
finding,
|
|
158
|
+
}));
|
|
159
|
+
});
|
|
160
|
+
scheduleFailures.forEach((failure, index) => {
|
|
161
|
+
needsYou.push(new ScheduleFailureNeed({
|
|
162
|
+
id: `schedule-failure:${failure.loop}:${failure._tag}:${index}`,
|
|
163
|
+
failure,
|
|
164
|
+
}));
|
|
165
|
+
});
|
|
166
|
+
const projected = new ReadyOverview({ projects, loops, needsYou });
|
|
167
|
+
yield* Effect.logDebug("Refreshed operator overview", {
|
|
168
|
+
revision,
|
|
169
|
+
runs: views.length,
|
|
170
|
+
needsYou: needsYou.length,
|
|
171
|
+
});
|
|
172
|
+
return projected;
|
|
173
|
+
});
|
|
174
|
+
const overview = Effect.fn("Operator.overview")((instance) => SynchronizedRef.modifyEffect(cache, (cached) => Effect.gen(function* () {
|
|
175
|
+
const [revision, latestPoll, latestSchedule] = yield* Effect.all([reader.revision(), polling.latest, schedules.latest], { concurrency: "unbounded" });
|
|
176
|
+
const pollFailures = Option.match(latestPoll, {
|
|
177
|
+
onNone: () => [],
|
|
178
|
+
onSome: ({ failures }) => failures,
|
|
179
|
+
});
|
|
180
|
+
const preflightFindings = Option.match(latestPoll, {
|
|
181
|
+
onNone: () => [],
|
|
182
|
+
onSome: ({ preflightFindings }) => preflightFindings,
|
|
183
|
+
});
|
|
184
|
+
const scheduleFailures = Option.match(latestSchedule, {
|
|
185
|
+
onNone: () => [],
|
|
186
|
+
onSome: ({ failures }) => failures,
|
|
187
|
+
});
|
|
188
|
+
// Without the invalidation singleton staleness cannot be detected, so the
|
|
189
|
+
// cache is bypassed.
|
|
190
|
+
const token = Option.map(revision, (value) => JSON.stringify([
|
|
191
|
+
value,
|
|
192
|
+
instance.config.repos.map(({ name, lanes }) => [name, lanes]),
|
|
193
|
+
instance.loops.map(({ name, agent, trigger }) => [name, agent, trigger.on]),
|
|
194
|
+
pollFailures,
|
|
195
|
+
preflightFindings,
|
|
196
|
+
scheduleFailures,
|
|
197
|
+
]));
|
|
198
|
+
if (Option.isNone(token)) {
|
|
199
|
+
yield* Effect.logWarning("Projection revision singleton is missing; the overview cache is bypassed");
|
|
200
|
+
const projected = yield* projectOverview(instance, pollFailures, preflightFindings, scheduleFailures, revision);
|
|
201
|
+
return [projected, Option.none()];
|
|
202
|
+
}
|
|
203
|
+
if (Option.isSome(cached) && cached.value.token === token.value) {
|
|
204
|
+
yield* Effect.logDebug("Reusing unchanged operator overview", {
|
|
205
|
+
revision,
|
|
206
|
+
});
|
|
207
|
+
return [cached.value.overview, cached];
|
|
208
|
+
}
|
|
209
|
+
const projected = yield* projectOverview(instance, pollFailures, preflightFindings, scheduleFailures, revision);
|
|
210
|
+
return [projected, Option.some({ token: token.value, overview: projected })];
|
|
211
|
+
})));
|
|
212
|
+
const detail = Effect.fn("Operator.detail")(function* (runId, request = new ColdTranscriptRequest()) {
|
|
213
|
+
yield* Effect.annotateCurrentSpan({ runId });
|
|
214
|
+
const [snapshot, states] = yield* Effect.all([reader.inspect(runId), controls.states], { concurrency: "unbounded" });
|
|
215
|
+
const paused = new Set(states.filter((state) => state.paused).map((state) => state.loop));
|
|
216
|
+
const transcript = yield* readTranscript(reader, snapshot, request);
|
|
217
|
+
return new RunDetailView({
|
|
218
|
+
run: runView(snapshot, paused),
|
|
219
|
+
eventDedupKey: snapshot.event.dedupKey,
|
|
220
|
+
eventPayload: snapshot.event.payload,
|
|
221
|
+
transcript: transcript.events,
|
|
222
|
+
earlierTranscript: transcript.earlier,
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
return { detail, overview };
|
|
226
|
+
});
|
|
227
|
+
/** The read-only operator surface. It needs no trigger execution to build. */
|
|
228
|
+
export class OperatorObservation extends Context.Service()("@usine/orchestrator/OperatorObservation") {
|
|
229
|
+
static layer = Layer.effect(OperatorObservation, makeOperatorObservation);
|
|
230
|
+
}
|
|
231
|
+
const makeOperator = Effect.gen(function* () {
|
|
232
|
+
const budgets = yield* CycleBudgets;
|
|
233
|
+
const observation = yield* OperatorObservation;
|
|
234
|
+
const runs = yield* RunEngine;
|
|
235
|
+
const controls = yield* LoopControl;
|
|
236
|
+
const items = yield* ItemProjectionReader;
|
|
237
|
+
const repositoryLabels = yield* RepositoryLabelProjectionReader;
|
|
238
|
+
const github = yield* GitHubItemWriter;
|
|
239
|
+
const polling = yield* PollingTriggers;
|
|
240
|
+
const approve = Effect.fn("Operator.approve")(function* (runId) {
|
|
241
|
+
yield* Effect.annotateCurrentSpan({ runId });
|
|
242
|
+
const current = yield* runs.inspect(runId);
|
|
243
|
+
if (current.run.state._tag !== "Waiting") {
|
|
244
|
+
yield* Effect.logInfo("Operator approval rejected; the Run is past its gate", {
|
|
245
|
+
runId,
|
|
246
|
+
state: current.run.state._tag,
|
|
247
|
+
});
|
|
248
|
+
return yield* new RunOperationRejectedError({
|
|
249
|
+
runId,
|
|
250
|
+
operation: "approve",
|
|
251
|
+
state: current.run.state._tag,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
const receivedAt = yield* DateTime.now;
|
|
255
|
+
const dedupKey = DedupKey.make(JSON.stringify(["operator-approval", runId]));
|
|
256
|
+
yield* runs.approve(runId, new Event({
|
|
257
|
+
id: EventId.make(dedupKey),
|
|
258
|
+
dedupKey,
|
|
259
|
+
payload: { runId, decision: "approved" },
|
|
260
|
+
receivedAt,
|
|
261
|
+
}));
|
|
262
|
+
yield* Effect.logInfo("Operator approved Run", { runId });
|
|
263
|
+
});
|
|
264
|
+
const retry = Effect.fn("Operator.retry")(function* (runId) {
|
|
265
|
+
yield* Effect.annotateCurrentSpan({ runId });
|
|
266
|
+
yield* runs.retry(runId);
|
|
267
|
+
yield* Effect.logInfo("Operator retried Run", { runId });
|
|
268
|
+
});
|
|
269
|
+
const cancel = Effect.fn("Operator.cancel")(function* (runId) {
|
|
270
|
+
yield* Effect.annotateCurrentSpan({ runId });
|
|
271
|
+
yield* runs.cancel(runId);
|
|
272
|
+
yield* Effect.logInfo("Operator canceled Run", { runId });
|
|
273
|
+
});
|
|
274
|
+
const pause = Effect.fn("Operator.pause")(function* (loop) {
|
|
275
|
+
yield* Effect.annotateCurrentSpan({ loop });
|
|
276
|
+
return yield* controls.pause(loop);
|
|
277
|
+
});
|
|
278
|
+
const unpause = Effect.fn("Operator.unpause")(function* (loop) {
|
|
279
|
+
yield* Effect.annotateCurrentSpan({ loop });
|
|
280
|
+
return yield* controls.unpause(loop);
|
|
281
|
+
});
|
|
282
|
+
const moveBoardItem = Effect.fn("Operator.moveBoardItem")(function* (instance, move) {
|
|
283
|
+
yield* Effect.annotateCurrentSpan({
|
|
284
|
+
repository: move.repository,
|
|
285
|
+
item: move.item,
|
|
286
|
+
lane: move.toLane,
|
|
287
|
+
});
|
|
288
|
+
const repository = instance.config.repos.find(({ name }) => name === move.repository);
|
|
289
|
+
if (repository === undefined) {
|
|
290
|
+
return yield* new BoardProjectNotFound({ repository: move.repository });
|
|
291
|
+
}
|
|
292
|
+
const [storedItems, labelProjection] = yield* Effect.all([
|
|
293
|
+
items.list(move.repository, { limit: OVERVIEW_BOARD_ITEMS }),
|
|
294
|
+
repositoryLabels.get(move.repository),
|
|
295
|
+
], { concurrency: "unbounded" });
|
|
296
|
+
const board = yield* projectBoard(repository, Option.match(labelProjection, {
|
|
297
|
+
onNone: () => [],
|
|
298
|
+
onSome: ({ labels }) => labels.map(({ name }) => name),
|
|
299
|
+
}), storedItems, []);
|
|
300
|
+
const source = board.lanes.find(({ items: laneItems }) => laneItems.some(({ items }) => items.some(({ number }) => number === move.item)));
|
|
301
|
+
const movedItem = storedItems.find(({ number }) => number === move.item);
|
|
302
|
+
if (source === undefined || movedItem === undefined) {
|
|
303
|
+
return yield* new BoardItemNotFound({ repository: move.repository, item: move.item });
|
|
304
|
+
}
|
|
305
|
+
const target = board.lanes.find(({ id }) => id === move.toLane);
|
|
306
|
+
if (target === undefined) {
|
|
307
|
+
return yield* new BoardLaneNotFound({ repository: move.repository, lane: move.toLane });
|
|
308
|
+
}
|
|
309
|
+
if (target._tag === "ReadOnlyBoardLane") {
|
|
310
|
+
return yield* new BoardLaneReadOnly({ repository: move.repository, lane: move.toLane });
|
|
311
|
+
}
|
|
312
|
+
const mutation = labelMutationForBoardMove(board, target);
|
|
313
|
+
const changed = { number: move.item, updatedAt: yield* DateTime.now };
|
|
314
|
+
const item = movedItem.source === "pr" ? new ChangedPullRequest(changed) : new ChangedIssue(changed);
|
|
315
|
+
const applied = yield* github.updateLabels(move.repository, move.item, mutation).pipe(
|
|
316
|
+
// A failed or interrupted request may have applied part of the label
|
|
317
|
+
// swap. Reconcile it without replacing the writer's original outcome.
|
|
318
|
+
Effect.onExit((exit) => polling.hint(move.repository, item, Option.flatMap(Exit.findErrorOption(exit), (error) => error._tag === "GitHubRateLimitError" ? Option.some(error.retryAt) : Option.none()))));
|
|
319
|
+
yield* Effect.logInfo("Operator moved a Board card and queued its authoritative refresh", {
|
|
320
|
+
repository: move.repository,
|
|
321
|
+
item: move.item,
|
|
322
|
+
fromLane: source.id,
|
|
323
|
+
toLane: target.id,
|
|
324
|
+
addedLabels: mutation.add.join(", "),
|
|
325
|
+
removedLabels: mutation.remove.join(", "),
|
|
326
|
+
labels: applied.join(", "),
|
|
327
|
+
});
|
|
328
|
+
}, Effect.tapError((error) => Effect.logWarning("Board move rejected", {
|
|
329
|
+
errorTag: error._tag,
|
|
330
|
+
message: error.message,
|
|
331
|
+
})));
|
|
332
|
+
const resetCycleBudget = Effect.fn("Operator.resetCycleBudget")(function* (askId) {
|
|
333
|
+
yield* Effect.annotateCurrentSpan({ askId });
|
|
334
|
+
const key = `cycle-budget-reset:${askId}`;
|
|
335
|
+
yield* budgets.reset(askId, new Event({
|
|
336
|
+
id: EventId.make(key),
|
|
337
|
+
dedupKey: DedupKey.make(key),
|
|
338
|
+
payload: { action: "reset-cycle-budget", askId },
|
|
339
|
+
receivedAt: yield* DateTime.now,
|
|
340
|
+
}));
|
|
341
|
+
});
|
|
342
|
+
return {
|
|
343
|
+
...observation,
|
|
344
|
+
approve,
|
|
345
|
+
cancel,
|
|
346
|
+
moveBoardItem,
|
|
347
|
+
pause,
|
|
348
|
+
retry,
|
|
349
|
+
unpause,
|
|
350
|
+
resetCycleBudget,
|
|
351
|
+
};
|
|
352
|
+
});
|
|
353
|
+
/** The operator's view of the factory and actions for approving, retrying, canceling, and directing work. */
|
|
354
|
+
export class Operator extends Context.Service()("@usine/orchestrator/Operator") {
|
|
355
|
+
static layer = Layer.effect(Operator, makeOperator).pipe(Layer.provide(OperatorObservation.layer));
|
|
356
|
+
}
|
|
357
|
+
export { ProjectStatus, ProjectView, LoopView, ReadyOverview, NeedsSetupOverview, FactoryOverview, } from "./overview.js";
|
|
358
|
+
export { RunStateTag, RunView, RunDetailView } from "./run.js";
|
|
359
|
+
export { InfraFailureView, DefectFailureView, AgentFailureView, RunawayFailureView, ChildSessionBudgetFailureView, FailureView, SucceededAttemptView, FailedAttemptView, CanceledAttemptView, AttemptOutcomeView, AttemptView, } from "./attempt.js";
|
|
360
|
+
export { BoardLaneId, BoardLaneOrigin, BoardItemLink, BoardTaskView, WritableBoardLaneView, ReadOnlyBoardLaneView, BoardLaneView, BoardProjectionError, BoardView, LabelView, BoardMove, BoardProjectNotFoundError, BoardItemNotFoundError, BoardLaneNotFoundError, BoardLaneReadOnlyError, } from "./board.js";
|
|
361
|
+
export { ApprovalNeed, CycleBudgetNeed, RunFailureNeed, PollFailureNeed, PreflightFindingNeed, BoardProjectionNeed, ScheduleFailureNeed, NeedView, } from "./need.js";
|
|
362
|
+
export { FailedTranscriptView, TranscriptPayload, TranscriptEventView, TranscriptPageCursor, ColdTranscriptRequest, TailTranscriptRequest, EarlierTranscriptRequest, TranscriptRequest, TranscriptAttemptNotFoundError, } from "./transcript.js";
|
|
363
|
+
//# sourceMappingURL=operator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator.js","sourceRoot":"","sources":["../../src/operator/operator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { LabelPreflightFinding } from "../label-reconciler.ts";
|
|
3
|
+
import { RunView } from "./run.ts";
|
|
4
|
+
import { BoardView, LabelView } from "./board.ts";
|
|
5
|
+
/** The Project's summary indicator for activity or required operator attention. */
|
|
6
|
+
export declare const ProjectStatus: Schema.Literals<readonly ["clear", "active", "needs-you"]>;
|
|
7
|
+
export type ProjectStatus = typeof ProjectStatus.Type;
|
|
8
|
+
declare const ProjectView_base: Schema.Class<ProjectView, Schema.Struct<{
|
|
9
|
+
readonly repository: Schema.brand<Schema.String, "RepositoryName">;
|
|
10
|
+
readonly status: Schema.Literals<readonly ["clear", "active", "needs-you"]>;
|
|
11
|
+
readonly runs: Schema.$Array<typeof RunView>;
|
|
12
|
+
readonly board: typeof BoardView;
|
|
13
|
+
/** The repository's label catalog, used to color badges on cards and lanes. */
|
|
14
|
+
readonly labels: Schema.$Array<typeof LabelView>;
|
|
15
|
+
/** Failures from provisioning this Project's declared labels; they do not block the Board. */
|
|
16
|
+
readonly preflightFindings: Schema.$Array<typeof LabelPreflightFinding>;
|
|
17
|
+
}>, {}>;
|
|
18
|
+
/** A managed repository with its Runs, Board, label catalog, and preflight findings. */
|
|
19
|
+
export declare class ProjectView extends ProjectView_base {
|
|
20
|
+
}
|
|
21
|
+
declare const LoopView_base: Schema.Class<LoopView, Schema.Struct<{
|
|
22
|
+
readonly name: Schema.brand<Schema.NonEmptyString, "LoopName">;
|
|
23
|
+
readonly trigger: Schema.String;
|
|
24
|
+
readonly agent: Schema.brand<Schema.String, "AgentName">;
|
|
25
|
+
readonly paused: Schema.Boolean;
|
|
26
|
+
}>, {}>;
|
|
27
|
+
/** A Loop's authored trigger and Agent together with its runtime pause state. */
|
|
28
|
+
export declare class LoopView extends LoopView_base {
|
|
29
|
+
}
|
|
30
|
+
declare const ReadyOverview_base: Schema.Class<ReadyOverview, Schema.TaggedStruct<"Ready", {
|
|
31
|
+
readonly projects: Schema.$Array<typeof ProjectView>;
|
|
32
|
+
readonly loops: Schema.$Array<typeof LoopView>;
|
|
33
|
+
readonly needsYou: Schema.$Array<Schema.Union<readonly [typeof import("./need.ts").CycleBudgetNeed, typeof import("./need.ts").ApprovalNeed, typeof import("./need.ts").BoardProjectionNeed, typeof import("./need.ts").RunFailureNeed, typeof import("./need.ts").PollFailureNeed, typeof import("./need.ts").PreflightFindingNeed, typeof import("./need.ts").ScheduleFailureNeed]>>;
|
|
34
|
+
}>, {}>;
|
|
35
|
+
/** The Projects, Loops, and operator needs of a configured factory. */
|
|
36
|
+
export declare class ReadyOverview extends ReadyOverview_base {
|
|
37
|
+
}
|
|
38
|
+
declare const NeedsSetupOverview_base: Schema.Class<NeedsSetupOverview, Schema.TaggedStruct<"NeedsSetup", {
|
|
39
|
+
readonly errorTag: Schema.NonEmptyString;
|
|
40
|
+
readonly projects: Schema.$Array<typeof ProjectView>;
|
|
41
|
+
readonly loops: Schema.$Array<typeof LoopView>;
|
|
42
|
+
readonly needsYou: Schema.$Array<Schema.Union<readonly [typeof import("./need.ts").CycleBudgetNeed, typeof import("./need.ts").ApprovalNeed, typeof import("./need.ts").BoardProjectionNeed, typeof import("./need.ts").RunFailureNeed, typeof import("./need.ts").PollFailureNeed, typeof import("./need.ts").PreflightFindingNeed, typeof import("./need.ts").ScheduleFailureNeed]>>;
|
|
43
|
+
}>, {}>;
|
|
44
|
+
/** An overview available during setup, including the error that prevents normal operation. */
|
|
45
|
+
export declare class NeedsSetupOverview extends NeedsSetupOverview_base {
|
|
46
|
+
}
|
|
47
|
+
/** The operator overview, distinguished by whether factory setup is complete. */
|
|
48
|
+
export declare const FactoryOverview: Schema.Union<readonly [typeof ReadyOverview, typeof NeedsSetupOverview]>;
|
|
49
|
+
export type FactoryOverview = typeof FactoryOverview.Type;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=overview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../src/operator/overview.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGlD,mFAAmF;AACnF,eAAO,MAAM,aAAa,4DAAoD,CAAC;AAC/E,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAC;;;;;;IAQpD,+EAA+E;;IAE/E,8FAA8F;;;AARhG,wFAAwF;AACxF,qBAAa,WAAY,SAAQ,gBAS/B;CAAG;;;;;;;AAEL,iFAAiF;AACjF,qBAAa,QAAS,SAAQ,aAK5B;CAAG;;;;;;AAEL,uEAAuE;AACvE,qBAAa,aAAc,SAAQ,kBAMjC;CAAG;;;;;;;AAEL,8FAA8F;AAC9F,qBAAa,kBAAmB,SAAQ,uBAOtC;CAAG;AAEL,iFAAiF;AACjF,eAAO,MAAM,eAAe,0EAAoD,CAAC;AACjF,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { AgentName } from "@usine/core/agent";
|
|
2
|
+
import { LoopName } from "@usine/core/loop";
|
|
3
|
+
import { RepositoryName } from "@usine/core/repository";
|
|
4
|
+
import { Schema } from "effect";
|
|
5
|
+
import { LabelPreflightFinding } from "../label-reconciler.js";
|
|
6
|
+
import { RunView } from "./run.js";
|
|
7
|
+
import { BoardView, LabelView } from "./board.js";
|
|
8
|
+
import { NeedView } from "./need.js";
|
|
9
|
+
/** The Project's summary indicator for activity or required operator attention. */
|
|
10
|
+
export const ProjectStatus = Schema.Literals(["clear", "active", "needs-you"]);
|
|
11
|
+
/** A managed repository with its Runs, Board, label catalog, and preflight findings. */
|
|
12
|
+
export class ProjectView extends Schema.Class("@usine/orchestrator/ProjectView")({
|
|
13
|
+
repository: RepositoryName,
|
|
14
|
+
status: ProjectStatus,
|
|
15
|
+
runs: Schema.Array(RunView),
|
|
16
|
+
board: BoardView,
|
|
17
|
+
/** The repository's label catalog, used to color badges on cards and lanes. */
|
|
18
|
+
labels: Schema.Array(LabelView),
|
|
19
|
+
/** Failures from provisioning this Project's declared labels; they do not block the Board. */
|
|
20
|
+
preflightFindings: Schema.Array(LabelPreflightFinding),
|
|
21
|
+
}) {
|
|
22
|
+
}
|
|
23
|
+
/** A Loop's authored trigger and Agent together with its runtime pause state. */
|
|
24
|
+
export class LoopView extends Schema.Class("@usine/orchestrator/LoopView")({
|
|
25
|
+
name: LoopName,
|
|
26
|
+
trigger: Schema.String,
|
|
27
|
+
agent: AgentName,
|
|
28
|
+
paused: Schema.Boolean,
|
|
29
|
+
}) {
|
|
30
|
+
}
|
|
31
|
+
/** The Projects, Loops, and operator needs of a configured factory. */
|
|
32
|
+
export class ReadyOverview extends Schema.TaggedClass("@usine/orchestrator/ReadyOverview")("Ready", {
|
|
33
|
+
projects: Schema.Array(ProjectView),
|
|
34
|
+
loops: Schema.Array(LoopView),
|
|
35
|
+
needsYou: Schema.Array(NeedView),
|
|
36
|
+
}) {
|
|
37
|
+
}
|
|
38
|
+
/** An overview available during setup, including the error that prevents normal operation. */
|
|
39
|
+
export class NeedsSetupOverview extends Schema.TaggedClass("@usine/orchestrator/NeedsSetupOverview")("NeedsSetup", {
|
|
40
|
+
errorTag: Schema.NonEmptyString,
|
|
41
|
+
projects: Schema.Array(ProjectView),
|
|
42
|
+
loops: Schema.Array(LoopView),
|
|
43
|
+
needsYou: Schema.Array(NeedView),
|
|
44
|
+
}) {
|
|
45
|
+
}
|
|
46
|
+
/** The operator overview, distinguished by whether factory setup is complete. */
|
|
47
|
+
export const FactoryOverview = Schema.Union([ReadyOverview, NeedsSetupOverview]);
|
|
48
|
+
//# sourceMappingURL=overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/operator/overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,mFAAmF;AACnF,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAG/E,wFAAwF;AACxF,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,KAAK,CAAc,iCAAiC,CAAC,CAAC;IAC5F,UAAU,EAAE,cAAc;IAC1B,MAAM,EAAE,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC3B,KAAK,EAAE,SAAS;IAChB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;IAC/B,8FAA8F;IAC9F,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC;CACvD,CAAC;CAAG;AAEL,iFAAiF;AACjF,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,KAAK,CAAW,8BAA8B,CAAC,CAAC;IACnF,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,MAAM,CAAC,OAAO;CACvB,CAAC;CAAG;AAEL,uEAAuE;AACvE,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,WAAW,CACnD,mCAAmC,CACpC,CAAC,OAAO,EAAE;IACT,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;CACjC,CAAC;CAAG;AAEL,8FAA8F;AAC9F,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,CACxD,wCAAwC,CACzC,CAAC,YAAY,EAAE;IACd,QAAQ,EAAE,MAAM,CAAC,cAAc;IAC/B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;CACjC,CAAC;CAAG;AAEL,iFAAiF;AACjF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AttemptFailure } from "@usine/core/attempt/failure";
|
|
2
|
+
import { LoopName } from "@usine/core/loop";
|
|
3
|
+
import { type RunSnapshot, type RunSummary, RunReader } from "@usine/engine/run-reader";
|
|
4
|
+
import type { RunStoreError } from "@usine/engine/engine";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import { type FailureView } from "./attempt.ts";
|
|
7
|
+
import { type TranscriptRequest, TranscriptAttemptNotFoundError, TranscriptPageCursor, TranscriptEventView } from "./transcript.ts";
|
|
8
|
+
import { RunView } from "./run.ts";
|
|
9
|
+
export declare const failureView: (failure: AttemptFailure) => FailureView;
|
|
10
|
+
export declare const runView: (snapshot: RunSummary, pausedLoops: ReadonlySet<LoopName>) => RunView;
|
|
11
|
+
interface TranscriptRead {
|
|
12
|
+
readonly events: ReadonlyArray<TranscriptEventView>;
|
|
13
|
+
readonly earlier: ReadonlyArray<TranscriptPageCursor>;
|
|
14
|
+
}
|
|
15
|
+
export declare const readTranscript: (runs: RunReader["Service"], snapshot: RunSnapshot, request: TranscriptRequest) => Effect.Effect<TranscriptRead, RunStoreError | TranscriptAttemptNotFoundError>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/operator/projection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,OAAO,EAAY,MAAM,EAAiB,MAAM,QAAQ,CAAC;AACzD,OAAO,EAOL,KAAK,WAAW,EAIjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,KAAK,iBAAiB,EACtB,8BAA8B,EAC9B,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAOnC,eAAO,MAAM,WAAW,YAAa,cAAc,KAAG,WAQlD,CAAC;AAuBL,eAAO,MAAM,OAAO,aAAc,UAAU,eAAe,WAAW,CAAC,QAAQ,CAAC,KAAG,OAoBlF,CAAC;AAwBF,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;CACvD;AAyCD,eAAO,MAAM,cAAc,EAAE,CAC3B,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,EAC1B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,iBAAiB,KACvB,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,GAAG,8BAA8B,CAgD/E,CAAC"}
|