@usine/orchestrator 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -21
- package/README.md +174 -52
- package/dist/board/items.d.ts +22 -3
- package/dist/board/items.d.ts.map +1 -1
- package/dist/board/items.js +44 -4
- package/dist/board/items.js.map +1 -1
- package/dist/board/projection.d.ts +8 -1
- package/dist/board/projection.d.ts.map +1 -1
- package/dist/board/projection.js +63 -14
- package/dist/board/projection.js.map +1 -1
- package/dist/board/tasks.d.ts +15 -3
- package/dist/board/tasks.d.ts.map +1 -1
- package/dist/board/tasks.js +28 -9
- package/dist/board/tasks.js.map +1 -1
- package/dist/cloudflare.d.ts +32 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +68 -0
- package/dist/cloudflare.js.map +1 -0
- 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 +141 -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 +10 -9
- package/dist/exe-dev.js.map +1 -1
- package/dist/http-client.d.ts +8 -0
- package/dist/http-client.d.ts.map +1 -0
- package/dist/http-client.js +8 -0
- package/dist/http-client.js.map +1 -0
- 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/lease-order.d.ts +60 -0
- package/dist/lease-order.d.ts.map +1 -0
- package/dist/lease-order.js +76 -0
- package/dist/lease-order.js.map +1 -0
- package/dist/local.d.ts +4 -18
- package/dist/local.d.ts.map +1 -1
- package/dist/local.js +9 -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 +76 -10
- package/dist/operator/attempt.d.ts.map +1 -1
- package/dist/operator/attempt.js +69 -11
- package/dist/operator/attempt.js.map +1 -1
- package/dist/operator/board.d.ts +48 -16
- package/dist/operator/board.d.ts.map +1 -1
- package/dist/operator/board.js +48 -17
- package/dist/operator/board.js.map +1 -1
- package/dist/operator/configuration.d.ts +314 -0
- package/dist/operator/configuration.d.ts.map +1 -0
- package/dist/operator/configuration.js +490 -0
- package/dist/operator/configuration.js.map +1 -0
- package/dist/operator/desk.d.ts +206 -0
- package/dist/operator/desk.d.ts.map +1 -0
- package/dist/operator/desk.js +525 -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 +135 -105
- package/dist/operator/http.d.ts.map +1 -1
- package/dist/operator/http.js +155 -30
- package/dist/operator/http.js.map +1 -1
- package/dist/operator/machines.d.ts +71 -0
- package/dist/operator/machines.d.ts.map +1 -0
- package/dist/operator/machines.js +103 -0
- package/dist/operator/machines.js.map +1 -0
- package/dist/operator/need.d.ts +58 -11
- package/dist/operator/need.d.ts.map +1 -1
- package/dist/operator/need.js +61 -9
- package/dist/operator/need.js.map +1 -1
- package/dist/operator/operator.d.ts +135 -29
- package/dist/operator/operator.d.ts.map +1 -1
- package/dist/operator/operator.js +370 -63
- 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 +56 -5
- package/dist/operator/projection.d.ts.map +1 -1
- package/dist/operator/projection.js +108 -9
- package/dist/operator/projection.js.map +1 -1
- package/dist/operator/run.d.ts +101 -6
- package/dist/operator/run.d.ts.map +1 -1
- package/dist/operator/run.js +100 -7
- package/dist/operator/run.js.map +1 -1
- package/dist/operator/statistics/cache.d.ts +7 -0
- package/dist/operator/statistics/cache.d.ts.map +1 -0
- package/dist/operator/statistics/cache.js +40 -0
- package/dist/operator/statistics/cache.js.map +1 -0
- package/dist/operator/statistics/runs.d.ts +36 -0
- package/dist/operator/statistics/runs.d.ts.map +1 -0
- package/dist/operator/statistics/runs.js +284 -0
- package/dist/operator/statistics/runs.js.map +1 -0
- package/dist/operator/statistics/statistics.d.ts +20 -0
- package/dist/operator/statistics/statistics.d.ts.map +1 -0
- package/dist/operator/statistics/statistics.js +138 -0
- package/dist/operator/statistics/statistics.js.map +1 -0
- package/dist/operator/statistics/tasks.d.ts +30 -0
- package/dist/operator/statistics/tasks.d.ts.map +1 -0
- package/dist/operator/statistics/tasks.js +244 -0
- package/dist/operator/statistics/tasks.js.map +1 -0
- package/dist/operator/statistics/view.d.ts +302 -0
- package/dist/operator/statistics/view.d.ts.map +1 -0
- package/dist/operator/statistics/view.js +243 -0
- package/dist/operator/statistics/view.js.map +1 -0
- package/dist/operator/statistics/window.d.ts +24 -0
- package/dist/operator/statistics/window.d.ts.map +1 -0
- package/dist/operator/statistics/window.js +47 -0
- package/dist/operator/statistics/window.js.map +1 -0
- package/dist/operator/task.d.ts +94 -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 +103 -0
- package/dist/operator/usage.d.ts.map +1 -0
- package/dist/operator/usage.js +234 -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/closed-item-asks.d.ts +8 -0
- package/dist/polling/closed-item-asks.d.ts.map +1 -0
- package/dist/polling/closed-item-asks.js +28 -0
- package/dist/polling/closed-item-asks.js.map +1 -0
- 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/open-pull-requests.d.ts +28 -0
- package/dist/polling/open-pull-requests.d.ts.map +1 -0
- package/dist/polling/open-pull-requests.js +131 -0
- package/dist/polling/open-pull-requests.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 +215 -52
- package/dist/polling/polling.js.map +1 -1
- package/dist/polling/repository-sync.d.ts +21 -14
- package/dist/polling/repository-sync.d.ts.map +1 -1
- package/dist/polling/repository-sync.js +35 -28
- 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 +45 -5
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +587 -44
- package/dist/scheduler.js.map +1 -1
- package/dist/ssh.d.ts +103 -0
- package/dist/ssh.d.ts.map +1 -0
- package/dist/ssh.js +144 -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 +13 -0
- package/dist/worker-engine.d.ts.map +1 -0
- package/dist/worker-engine.js +56 -0
- package/dist/worker-engine.js.map +1 -0
- package/dist/worker-status.d.ts +140 -0
- package/dist/worker-status.d.ts.map +1 -0
- package/dist/worker-status.js +76 -0
- package/dist/worker-status.js.map +1 -0
- package/package.json +47 -22
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
import { AgentName } from "@usine/core/agent";
|
|
2
|
+
import { ProviderRetries } from "@usine/core/agent/session";
|
|
3
|
+
import { CycleBudgetAsk } from "@usine/core/cycle-budget";
|
|
4
|
+
import { LoopName } from "@usine/core/loop";
|
|
5
|
+
import { RepositoryName, canonicalRepositoryName } from "@usine/core/repository";
|
|
6
|
+
import * as RunState from "@usine/core/run/state";
|
|
7
|
+
import { WorkerName } from "@usine/core/worker";
|
|
8
|
+
import { CycleBudgets } from "@usine/engine/cycle-budget";
|
|
9
|
+
import { ItemProjectionReader } from "@usine/engine/item-projection";
|
|
10
|
+
import { LoopControl } from "@usine/engine/loop-control";
|
|
11
|
+
import { UnconfirmedStops } from "@usine/engine/engine";
|
|
12
|
+
import { RunReader } from "@usine/engine/run-reader";
|
|
13
|
+
import { TranscriptPageQuery } from "@usine/engine/transcript";
|
|
14
|
+
import { Context, DateTime, Effect, Layer, Match, Option, Order, Result, Schema } from "effect";
|
|
15
|
+
import { projectedItem } from "../board/items.js";
|
|
16
|
+
import { LoopMatches } from "../loop-matches.js";
|
|
17
|
+
import { PollingTriggers } from "../polling-triggers.js";
|
|
18
|
+
import { WorkerStatus } from "../worker-status.js";
|
|
19
|
+
import { MachineView, machineView, ProvisioningPauseView, provisioningPauseView, } from "./machines.js";
|
|
20
|
+
import { AttemptView } from "./attempt.js";
|
|
21
|
+
import { BoardItemLink } from "./board.js";
|
|
22
|
+
import { checkView, PreflightCheckView, WorkerSlotsView } from "./configuration.js";
|
|
23
|
+
import { runView, workerAccesses } from "./projection.js";
|
|
24
|
+
import { RunView, UnconfirmedStopView } from "./run.js";
|
|
25
|
+
/** The number of newest transcript rows the desk reads per running Attempt. */
|
|
26
|
+
const RECENT_TRANSCRIPT_ROWS = 200;
|
|
27
|
+
/** The number of closed Runs in Last outcomes. */
|
|
28
|
+
const LAST_OUTCOMES = 10;
|
|
29
|
+
/**
|
|
30
|
+
* The number of recently closed Runs the desk reads before excluding those replaced before
|
|
31
|
+
* starting.
|
|
32
|
+
*/
|
|
33
|
+
const CLOSED_RUNS_READ = 100;
|
|
34
|
+
/**
|
|
35
|
+
* The number of newest Items per repository that the desk matches against the Loops, the same as a
|
|
36
|
+
* Board shows.
|
|
37
|
+
*/
|
|
38
|
+
const DESK_ITEMS = 500;
|
|
39
|
+
/** The Attempt's Worker hasn't answered the executor's probe since `lastAnsweredAt`. */
|
|
40
|
+
export class WorkerSilentView extends Schema.TaggedClass("@usine/orchestrator/WorkerSilentView")("WorkerSilent", { worker: WorkerName, lastAnsweredAt: Schema.String }) {
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A session's harness is retrying its model provider: the retries in this turn, the latest report,
|
|
44
|
+
* and when the first unanswered retry was recorded.
|
|
45
|
+
*/
|
|
46
|
+
export class ProviderRetryingView extends Schema.TaggedClass("@usine/orchestrator/ProviderRetryingView")("ProviderRetrying", {
|
|
47
|
+
agent: AgentName,
|
|
48
|
+
message: Schema.NonEmptyString,
|
|
49
|
+
retries: ProviderRetries,
|
|
50
|
+
since: Schema.String,
|
|
51
|
+
}) {
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* An open connectivity problem in an Attempt's transcript. It's a warning and never stops the
|
|
55
|
+
* Attempt (ADR 0013).
|
|
56
|
+
*/
|
|
57
|
+
export const ConnectivityWarningView = Schema.Union([WorkerSilentView, ProviderRetryingView]);
|
|
58
|
+
/** A running Attempt with its Run, Item, and recent transcript activity. */
|
|
59
|
+
export class RunningAttemptView extends Schema.Class("@usine/orchestrator/RunningAttemptView")({
|
|
60
|
+
run: RunView,
|
|
61
|
+
attempt: AttemptView,
|
|
62
|
+
/**
|
|
63
|
+
* The Run's Item as its Board card links it, or null for a schedule Run or an Item the desk
|
|
64
|
+
* didn't read.
|
|
65
|
+
*/
|
|
66
|
+
item: Schema.NullOr(BoardItemLink),
|
|
67
|
+
/**
|
|
68
|
+
* When the Attempt's sessions last showed work, excluding Worker notices, pool meters, and
|
|
69
|
+
* provider retries. Null if the newest rows show none.
|
|
70
|
+
*/
|
|
71
|
+
lastActivityAt: Schema.NullOr(Schema.String),
|
|
72
|
+
/** The connectivity problems still open after the newest rows. */
|
|
73
|
+
warnings: Schema.Array(ConnectivityWarningView),
|
|
74
|
+
}) {
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* An Agent's question or blocker that suppresses the Item for the Loop until the operator answers
|
|
78
|
+
* or resolves `run`, or the Item changes (ADR 0017).
|
|
79
|
+
*/
|
|
80
|
+
export class SuppressedForOperatorView extends Schema.TaggedClass("@usine/orchestrator/SuppressedForOperatorView")("SuppressedForOperator", { run: RunView }) {
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* `run` succeeded or was canceled on the Item's current state, so the Loop opens no other Run until
|
|
84
|
+
* the state changes (ADR 0007).
|
|
85
|
+
*/
|
|
86
|
+
export class ClosedUnchangedView extends Schema.TaggedClass("@usine/orchestrator/ClosedUnchangedView")("ClosedUnchanged", { run: RunView }) {
|
|
87
|
+
}
|
|
88
|
+
/** `run` failed on the Item's current state and waits for the operator to retry it. */
|
|
89
|
+
export class RunFailedView extends Schema.TaggedClass("@usine/orchestrator/RunFailedView")("RunFailed", { run: RunView }) {
|
|
90
|
+
}
|
|
91
|
+
/** The Loop is paused, so its trigger opens no Run. */
|
|
92
|
+
export class LoopPausedView extends Schema.TaggedClass("@usine/orchestrator/LoopPausedView")("LoopPaused", {}) {
|
|
93
|
+
}
|
|
94
|
+
/** The Item used up its cycle budget; `ask` waits for the operator to reset it. */
|
|
95
|
+
export class CycleBudgetUsedUpView extends Schema.TaggedClass("@usine/orchestrator/CycleBudgetUsedUpView")("CycleBudgetUsedUp", { ask: CycleBudgetAsk }) {
|
|
96
|
+
}
|
|
97
|
+
/** `run` waits for the operator's approval. */
|
|
98
|
+
export class AwaitingApprovalView extends Schema.TaggedClass("@usine/orchestrator/AwaitingApprovalView")("AwaitingApproval", { run: RunView }) {
|
|
99
|
+
}
|
|
100
|
+
/** `run` waits for a free Worker slot. */
|
|
101
|
+
export class QueuedForWorkerView extends Schema.TaggedClass("@usine/orchestrator/QueuedForWorkerView")("QueuedForWorker", {
|
|
102
|
+
run: RunView,
|
|
103
|
+
/**
|
|
104
|
+
* The fewest Runs that take a Worker slot before `run`, or null if the scheduler doesn't
|
|
105
|
+
* queue `run`: it hasn't asked for a slot yet, or this process runs no Attempts.
|
|
106
|
+
*/
|
|
107
|
+
ahead: Schema.NullOr(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))),
|
|
108
|
+
/**
|
|
109
|
+
* The machine that a provisioned Worker creates for `run`'s next Attempt, or null if none is
|
|
110
|
+
* being created.
|
|
111
|
+
*/
|
|
112
|
+
creating: Schema.NullOr(MachineView).pipe(Schema.withConstructorDefault(Effect.succeed(null))),
|
|
113
|
+
}) {
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* `run` starts no Attempt until the parent task of the Attempt in `stop`, on the same Loop and
|
|
117
|
+
* Item, is confirmed stopped (#523).
|
|
118
|
+
*/
|
|
119
|
+
export class WaitingForStopView extends Schema.TaggedClass("@usine/orchestrator/WaitingForStopView")("WaitingForStop", { run: RunView, stop: UnconfirmedStopView }) {
|
|
120
|
+
}
|
|
121
|
+
/** No Event of the Loop has a Run for the Item's current state yet. The next poll acts on it. */
|
|
122
|
+
export class AwaitingPollView extends Schema.TaggedClass("@usine/orchestrator/AwaitingPollView")("AwaitingPoll", {}) {
|
|
123
|
+
}
|
|
124
|
+
/** The reason a matched Item has no running Attempt. */
|
|
125
|
+
export const StallReasonView = Schema.Union([
|
|
126
|
+
AwaitingApprovalView,
|
|
127
|
+
SuppressedForOperatorView,
|
|
128
|
+
CycleBudgetUsedUpView,
|
|
129
|
+
RunFailedView,
|
|
130
|
+
ClosedUnchangedView,
|
|
131
|
+
LoopPausedView,
|
|
132
|
+
WaitingForStopView,
|
|
133
|
+
QueuedForWorkerView,
|
|
134
|
+
AwaitingPollView,
|
|
135
|
+
]);
|
|
136
|
+
/** An Item that a Loop's trigger matches with no running Attempt, and the reason. */
|
|
137
|
+
export class StalledItemView extends Schema.Class("@usine/orchestrator/StalledItemView")({
|
|
138
|
+
repository: RepositoryName,
|
|
139
|
+
loop: LoopName,
|
|
140
|
+
item: BoardItemLink,
|
|
141
|
+
reason: StallReasonView,
|
|
142
|
+
}) {
|
|
143
|
+
}
|
|
144
|
+
/** A closed Run with its Item and close time. */
|
|
145
|
+
export class ClosedRunView extends Schema.Class("@usine/orchestrator/ClosedRunView")({
|
|
146
|
+
run: RunView,
|
|
147
|
+
/**
|
|
148
|
+
* The Run's Item as its Board card links it, or null for a schedule Run or an Item the desk
|
|
149
|
+
* didn't read.
|
|
150
|
+
*/
|
|
151
|
+
item: Schema.NullOr(BoardItemLink),
|
|
152
|
+
/** The Run's `closedAt`, set even for a Run canceled before any Attempt. */
|
|
153
|
+
closedAt: Schema.String,
|
|
154
|
+
}) {
|
|
155
|
+
}
|
|
156
|
+
/** One Worker on the desk's Workers line, with its slots and last preflight. */
|
|
157
|
+
export class WorkerView extends Schema.Class("@usine/orchestrator/WorkerView")({
|
|
158
|
+
name: WorkerName,
|
|
159
|
+
/**
|
|
160
|
+
* The slots as the scheduler leases them. If the scheduler runs no Attempts (as in setup mode),
|
|
161
|
+
* the declared `max_concurrent_attempts` with none leased.
|
|
162
|
+
*/
|
|
163
|
+
slots: WorkerSlotsView,
|
|
164
|
+
/**
|
|
165
|
+
* The newest failed check among the Worker's prerequisites and harnesses, or else its degraded
|
|
166
|
+
* prerequisites, or else the newest passed or deferred check. Null before the first preflight.
|
|
167
|
+
*/
|
|
168
|
+
preflight: Schema.NullOr(PreflightCheckView),
|
|
169
|
+
/** A provisioned Worker's machines in flight, oldest first. */
|
|
170
|
+
machines: Schema.Array(MachineView).pipe(Schema.withConstructorDefault(Effect.succeed([]))),
|
|
171
|
+
/** A provisioned Worker's last failed machine creation, or null after a success. */
|
|
172
|
+
provisioning: Schema.NullOr(ProvisioningPauseView).pipe(Schema.withConstructorDefault(Effect.succeed(null))),
|
|
173
|
+
}) {
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* When the factory last finished polling a managed repository, or null before the first poll ends.
|
|
177
|
+
*/
|
|
178
|
+
export class RepositoryPollView extends Schema.Class("@usine/orchestrator/RepositoryPollView")({
|
|
179
|
+
repository: RepositoryName,
|
|
180
|
+
polledAt: Schema.NullOr(Schema.String),
|
|
181
|
+
}) {
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The operator's desk: running Attempts, stalled matched Items, recently closed Runs, Worker slots,
|
|
185
|
+
* and poll times. Needs you comes from the overview.
|
|
186
|
+
*/
|
|
187
|
+
export class DeskView extends Schema.Class("@usine/orchestrator/DeskView")({
|
|
188
|
+
running: Schema.Array(RunningAttemptView),
|
|
189
|
+
notMoving: Schema.Array(StalledItemView),
|
|
190
|
+
lastOutcomes: Schema.Array(ClosedRunView),
|
|
191
|
+
workers: Schema.Array(WorkerView),
|
|
192
|
+
polls: Schema.Array(RepositoryPollView),
|
|
193
|
+
}) {
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Returns why a Loop's matched Item isn't moving, checking the engine's rules in order, or `None`
|
|
197
|
+
* while an Attempt runs on the Item.
|
|
198
|
+
*/
|
|
199
|
+
const stallReason = ({ runs, sighting, paused, ask, ahead, creating, stop, }) => {
|
|
200
|
+
const open = runs.find(({ state }) => RunState.OPEN_STATE_TAGS.some((tag) => tag === state));
|
|
201
|
+
if (open !== undefined) {
|
|
202
|
+
// The engine doesn't stop an Attempt that already runs, but starts no other one.
|
|
203
|
+
const running = open.attempts.at(-1)?.outcome === null;
|
|
204
|
+
if (Option.isSome(stop) && open.state !== "Waiting" && !running)
|
|
205
|
+
return Option.some(new WaitingForStopView({ run: open, stop: stop.value }));
|
|
206
|
+
switch (open.state) {
|
|
207
|
+
case "Running":
|
|
208
|
+
return Option.none();
|
|
209
|
+
case "Waiting":
|
|
210
|
+
return Option.some(new AwaitingApprovalView({ run: open }));
|
|
211
|
+
default:
|
|
212
|
+
return Option.some(new QueuedForWorkerView({
|
|
213
|
+
run: open,
|
|
214
|
+
ahead: ahead.get(open.id) ?? null,
|
|
215
|
+
creating: creating.get(open.id) ?? null,
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (paused)
|
|
220
|
+
return Option.some(new LoopPausedView());
|
|
221
|
+
const runOf = (runId) => Option.fromNullishOr(runs.find(({ id }) => id === runId));
|
|
222
|
+
const suppressing = Option.flatMap(Option.flatMap(sighting, ({ suppressedBy }) => suppressedBy), runOf);
|
|
223
|
+
if (Option.isSome(suppressing)) {
|
|
224
|
+
return Option.some(new SuppressedForOperatorView({ run: suppressing.value }));
|
|
225
|
+
}
|
|
226
|
+
if (Option.isSome(ask))
|
|
227
|
+
return Option.some(new CycleBudgetUsedUpView({ ask: ask.value }));
|
|
228
|
+
const owner = Option.flatMap(Option.flatMap(sighting, ({ run }) => run), runOf);
|
|
229
|
+
if (Option.isSome(owner)) {
|
|
230
|
+
return Option.some(owner.value.state === "Failed"
|
|
231
|
+
? new RunFailedView({ run: owner.value })
|
|
232
|
+
: new ClosedUnchangedView({ run: owner.value }));
|
|
233
|
+
}
|
|
234
|
+
return Option.some(new AwaitingPollView());
|
|
235
|
+
};
|
|
236
|
+
/**
|
|
237
|
+
* The Not moving order: reasons that wait on the operator first, those that wait on the factory
|
|
238
|
+
* last.
|
|
239
|
+
*/
|
|
240
|
+
const REASON_ORDER = [
|
|
241
|
+
"AwaitingApproval",
|
|
242
|
+
"SuppressedForOperator",
|
|
243
|
+
"CycleBudgetUsedUp",
|
|
244
|
+
"RunFailed",
|
|
245
|
+
"ClosedUnchanged",
|
|
246
|
+
"LoopPaused",
|
|
247
|
+
"WaitingForStop",
|
|
248
|
+
"QueuedForWorker",
|
|
249
|
+
"AwaitingPoll",
|
|
250
|
+
];
|
|
251
|
+
const stalledOrder = Order.combineAll([
|
|
252
|
+
Order.mapInput(Order.Number, ({ reason }) => REASON_ORDER.indexOf(reason._tag)),
|
|
253
|
+
Order.mapInput(Order.String, ({ repository }) => repository),
|
|
254
|
+
Order.mapInput(Order.flip(Order.Number), ({ item }) => item.number),
|
|
255
|
+
Order.mapInput(Order.String, ({ loop }) => loop),
|
|
256
|
+
]);
|
|
257
|
+
const isActivity = ({ direction, envelope }) => {
|
|
258
|
+
const payload = envelope.payload;
|
|
259
|
+
return (direction === "outbound" &&
|
|
260
|
+
payload._tag !== "WorkerUnresponsive" &&
|
|
261
|
+
payload._tag !== "WorkerResponsive" &&
|
|
262
|
+
!(payload._tag === "SessionEvent" &&
|
|
263
|
+
(payload.event._tag === "PoolRateLimitsUpdated" || payload.event._tag === "ProviderRetrying")));
|
|
264
|
+
};
|
|
265
|
+
/**
|
|
266
|
+
* Returns when the Attempt's sessions last worked and which connectivity problems are still open,
|
|
267
|
+
* from its newest transcript rows.
|
|
268
|
+
*/
|
|
269
|
+
const attemptActivity = (entries) => {
|
|
270
|
+
let worker = null;
|
|
271
|
+
const providers = new Map();
|
|
272
|
+
let lastActivity = null;
|
|
273
|
+
for (const entry of entries) {
|
|
274
|
+
if (isActivity(entry))
|
|
275
|
+
lastActivity = entry;
|
|
276
|
+
const payload = entry.envelope.payload;
|
|
277
|
+
if (payload._tag === "WorkerUnresponsive") {
|
|
278
|
+
worker = new WorkerSilentView({
|
|
279
|
+
worker: payload.worker,
|
|
280
|
+
lastAnsweredAt: DateTime.formatIso(payload.lastAnsweredAt),
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
else if (payload._tag === "WorkerResponsive") {
|
|
284
|
+
worker = null;
|
|
285
|
+
}
|
|
286
|
+
else if (payload._tag === "SessionEvent") {
|
|
287
|
+
const event = payload.event;
|
|
288
|
+
if (event._tag === "ProviderRetrying") {
|
|
289
|
+
providers.set(event.session.id, new ProviderRetryingView({
|
|
290
|
+
agent: event.session.agent,
|
|
291
|
+
message: event.message,
|
|
292
|
+
retries: event.retries,
|
|
293
|
+
since: providers.get(event.session.id)?.since ?? DateTime.formatIso(entry.receivedAt),
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
else if (event._tag === "ProviderRecovered" ||
|
|
297
|
+
event._tag === "SessionIdle" ||
|
|
298
|
+
event._tag === "SessionFinished") {
|
|
299
|
+
providers.delete(event.session.id);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
lastActivityAt: lastActivity === null ? null : DateTime.formatIso(lastActivity.receivedAt),
|
|
305
|
+
warnings: [...(worker === null ? [] : [worker]), ...providers.values()],
|
|
306
|
+
};
|
|
307
|
+
};
|
|
308
|
+
const checkedAt = (check) => DateTime.toEpochMillis(check.checkedAt);
|
|
309
|
+
/** Returns the Worker's current preflight check, as described in `WorkerView.preflight`. */
|
|
310
|
+
const standingCheck = (preflight) => {
|
|
311
|
+
const checks = [
|
|
312
|
+
...Option.toArray(preflight.prerequisites),
|
|
313
|
+
...preflight.harnesses.map(({ check }) => check),
|
|
314
|
+
];
|
|
315
|
+
const failed = checks.filter(({ _tag }) => _tag === "Failed");
|
|
316
|
+
const degraded = checks.filter(({ _tag }) => _tag === "Degraded");
|
|
317
|
+
return Option.fromNullishOr((failed.length > 0 ? failed : degraded.length > 0 ? degraded : checks).reduce((newest, check) => newest === undefined || checkedAt(check) > checkedAt(newest) ? check : newest, undefined));
|
|
318
|
+
};
|
|
319
|
+
/**
|
|
320
|
+
* Returns when a closed Run closed. The fallback (the last Attempt's end or start, else the opening
|
|
321
|
+
* time) only covers the nullable field.
|
|
322
|
+
*/
|
|
323
|
+
const closedAt = (run) => {
|
|
324
|
+
const last = run.attempts.at(-1);
|
|
325
|
+
return run.closedAt ?? last?.endedAt ?? last?.startedAt ?? run.openedAt;
|
|
326
|
+
};
|
|
327
|
+
/**
|
|
328
|
+
* Whether the engine canceled the Run before any Attempt because a newer Event or an Item change
|
|
329
|
+
* replaced it.
|
|
330
|
+
*/
|
|
331
|
+
const replacedBeforeStart = ({ run, attempts }) => attempts.length === 0 &&
|
|
332
|
+
run.state._tag === "Canceled" &&
|
|
333
|
+
run.state.reason._tag !== "OperatorCanceled";
|
|
334
|
+
const makeDesk = Effect.gen(function* () {
|
|
335
|
+
const reader = yield* RunReader;
|
|
336
|
+
const controls = yield* LoopControl;
|
|
337
|
+
const budgets = yield* CycleBudgets;
|
|
338
|
+
const itemReader = yield* ItemProjectionReader;
|
|
339
|
+
const polling = yield* PollingTriggers;
|
|
340
|
+
const loopMatches = yield* LoopMatches;
|
|
341
|
+
const workerStatus = yield* WorkerStatus;
|
|
342
|
+
const stops = yield* UnconfirmedStops;
|
|
343
|
+
const recentActivity = Effect.fn("Operator.desk.recentActivity")(function* (attempt) {
|
|
344
|
+
yield* Effect.annotateCurrentSpan({ attemptId: attempt.id });
|
|
345
|
+
const entries = yield* reader.transcript(new TranscriptPageQuery({
|
|
346
|
+
attemptId: attempt.id,
|
|
347
|
+
before: Option.none(),
|
|
348
|
+
limit: RECENT_TRANSCRIPT_ROWS,
|
|
349
|
+
}));
|
|
350
|
+
return attemptActivity(entries);
|
|
351
|
+
});
|
|
352
|
+
const desk = Effect.fn("Operator.desk")(function* (instance) {
|
|
353
|
+
const [summaries, closed, states, asks, slots, queue, preflights, latestPoll, unconfirmedStops, inFlight, pauses,] = yield* Effect.all([
|
|
354
|
+
reader.list({ closedLimit: 0 }),
|
|
355
|
+
reader.closed({ limit: CLOSED_RUNS_READ }),
|
|
356
|
+
controls.states,
|
|
357
|
+
budgets.asks(),
|
|
358
|
+
workerStatus.slots,
|
|
359
|
+
workerStatus.queue,
|
|
360
|
+
workerStatus.preflights,
|
|
361
|
+
polling.latest,
|
|
362
|
+
stops.list,
|
|
363
|
+
workerStatus.machines,
|
|
364
|
+
workerStatus.provisioning,
|
|
365
|
+
], { concurrency: "unbounded" });
|
|
366
|
+
const machineViews = inFlight.map(machineView);
|
|
367
|
+
const creating = new Map(machineViews.flatMap((machine) => machine.state === "creating" && machine.runId !== null
|
|
368
|
+
? [[machine.runId, machine]]
|
|
369
|
+
: []));
|
|
370
|
+
const ahead = new Map(queue.map(({ runId, ahead }) => [runId, ahead]));
|
|
371
|
+
const paused = new Set(states.filter((state) => state.paused).map((state) => state.loop));
|
|
372
|
+
const access = workerAccesses(instance.config.workers);
|
|
373
|
+
const repositories = yield* Effect.forEach(instance.config.repos, (repository) => Effect.gen(function* () {
|
|
374
|
+
const items = yield* itemReader.list(repository.name, { limit: DESK_ITEMS });
|
|
375
|
+
const matches = yield* loopMatches.matching(instance, repository, items);
|
|
376
|
+
return { repository, items, matches };
|
|
377
|
+
}), { concurrency: 4 });
|
|
378
|
+
const links = new Map();
|
|
379
|
+
for (const { items } of repositories) {
|
|
380
|
+
for (const stored of items) {
|
|
381
|
+
const projected = yield* Effect.result(projectedItem(stored));
|
|
382
|
+
// The Board reports an Item it can't project in Needs you.
|
|
383
|
+
if (Result.isFailure(projected))
|
|
384
|
+
continue;
|
|
385
|
+
const { itemKey, kind, number, title, url, state } = projected.success;
|
|
386
|
+
links.set(itemKey, new BoardItemLink({ itemKey, kind, number, title, url, state }));
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
const matches = repositories.flatMap(({ matches: repositoryMatches }) => repositoryMatches);
|
|
390
|
+
const matchedKeys = [...new Set(matches.map(({ item }) => item.itemKey))];
|
|
391
|
+
const [history, sightings] = yield* Effect.all([reader.forItems(matchedKeys), reader.sightings(matchedKeys)], { concurrency: "unbounded" });
|
|
392
|
+
const runs = new Map([...summaries, ...history].map((summary) => [
|
|
393
|
+
summary.run.id,
|
|
394
|
+
runView(summary, paused, access),
|
|
395
|
+
]));
|
|
396
|
+
const newestFirst = [...runs.values()].sort((left, right) => right.openedAt.localeCompare(left.openedAt) || right.id.localeCompare(left.id));
|
|
397
|
+
/** Returns the unconfirmed stop on `loop` and `itemKey`, if the desk read its Run. */
|
|
398
|
+
const stopOn = (loop, itemKey) => Option.flatMap(Option.fromNullishOr(unconfirmedStops.find((stop) => stop.loop === loop && stop.itemKey === itemKey)), (stop) => Option.map(Option.fromNullishOr(runs.get(stop.runId)?.attempts.find(({ id }) => id === stop.attemptId)), ({ number }) => new UnconfirmedStopView({
|
|
399
|
+
runId: stop.runId,
|
|
400
|
+
attemptNumber: number,
|
|
401
|
+
worker: stop.worker,
|
|
402
|
+
})));
|
|
403
|
+
const notMoving = [];
|
|
404
|
+
for (const { loop, item } of matches) {
|
|
405
|
+
const link = links.get(item.itemKey);
|
|
406
|
+
if (link === undefined)
|
|
407
|
+
continue;
|
|
408
|
+
const reason = stallReason({
|
|
409
|
+
runs: newestFirst.filter((run) => run.loop === loop.name && run.itemKey === item.itemKey),
|
|
410
|
+
sighting: Option.fromNullishOr(sightings.find((sighting) => sighting.loop === loop.name && sighting.itemKey === item.itemKey)),
|
|
411
|
+
paused: paused.has(loop.name),
|
|
412
|
+
ask: Option.fromNullishOr(asks.find(({ itemKey }) => itemKey === item.itemKey)),
|
|
413
|
+
ahead,
|
|
414
|
+
creating,
|
|
415
|
+
stop: stopOn(loop.name, item.itemKey),
|
|
416
|
+
});
|
|
417
|
+
if (Option.isNone(reason))
|
|
418
|
+
continue;
|
|
419
|
+
yield* Effect.logDebug("Matched Item is not moving", {
|
|
420
|
+
repository: item.repository,
|
|
421
|
+
loop: loop.name,
|
|
422
|
+
item: item.number,
|
|
423
|
+
reason: reason.value._tag,
|
|
424
|
+
...Match.valueTags(reason.value, {
|
|
425
|
+
AwaitingApproval: ({ run }) => ({ runId: run.id }),
|
|
426
|
+
SuppressedForOperator: ({ run }) => ({ runId: run.id }),
|
|
427
|
+
CycleBudgetUsedUp: ({ ask }) => ({ askId: ask.id }),
|
|
428
|
+
RunFailed: ({ run }) => ({ runId: run.id }),
|
|
429
|
+
ClosedUnchanged: ({ run }) => ({ runId: run.id, state: run.state }),
|
|
430
|
+
LoopPaused: () => ({}),
|
|
431
|
+
WaitingForStop: ({ run, stop }) => ({
|
|
432
|
+
runId: run.id,
|
|
433
|
+
unstoppedRunId: stop.runId,
|
|
434
|
+
attemptNumber: stop.attemptNumber,
|
|
435
|
+
worker: stop.worker,
|
|
436
|
+
}),
|
|
437
|
+
QueuedForWorker: ({ run, ahead }) => ({ runId: run.id, ahead }),
|
|
438
|
+
AwaitingPoll: () => ({}),
|
|
439
|
+
}),
|
|
440
|
+
});
|
|
441
|
+
notMoving.push(new StalledItemView({
|
|
442
|
+
repository: item.repository,
|
|
443
|
+
loop: loop.name,
|
|
444
|
+
item: link,
|
|
445
|
+
reason: reason.value,
|
|
446
|
+
}));
|
|
447
|
+
}
|
|
448
|
+
const running = yield* Effect.forEach(newestFirst.flatMap((run) => {
|
|
449
|
+
const attempt = run.attempts.at(-1);
|
|
450
|
+
return run.state === "Running" && attempt !== undefined && attempt.outcome === null
|
|
451
|
+
? [{ run, attempt }]
|
|
452
|
+
: [];
|
|
453
|
+
}), ({ run, attempt }) => Effect.map(recentActivity(attempt), (activity) => new RunningAttemptView({
|
|
454
|
+
run,
|
|
455
|
+
attempt,
|
|
456
|
+
item: links.get(run.itemKey) ?? null,
|
|
457
|
+
...activity,
|
|
458
|
+
})), { concurrency: 4 });
|
|
459
|
+
const lastOutcomes = closed
|
|
460
|
+
.filter((summary) => !replacedBeforeStart(summary))
|
|
461
|
+
.map((summary) => {
|
|
462
|
+
const run = runView(summary, paused, access);
|
|
463
|
+
return new ClosedRunView({
|
|
464
|
+
run,
|
|
465
|
+
item: links.get(run.itemKey) ?? null,
|
|
466
|
+
closedAt: closedAt(run),
|
|
467
|
+
});
|
|
468
|
+
})
|
|
469
|
+
.sort((left, right) => right.closedAt.localeCompare(left.closedAt))
|
|
470
|
+
.slice(0, LAST_OUTCOMES);
|
|
471
|
+
const slotsByWorker = new Map(slots.map((slot) => [slot.worker, slot]));
|
|
472
|
+
const preflightByWorker = new Map(preflights.map((preflight) => [preflight.worker, preflight]));
|
|
473
|
+
const declared = new Set(instance.config.workers.map(({ name }) => name));
|
|
474
|
+
const workers = [
|
|
475
|
+
...instance.config.workers.map(({ name }) => name),
|
|
476
|
+
...slots.map(({ worker }) => worker).filter((worker) => !declared.has(worker)),
|
|
477
|
+
].map((name) => {
|
|
478
|
+
const slot = slotsByWorker.get(name);
|
|
479
|
+
const preflight = preflightByWorker.get(name);
|
|
480
|
+
return new WorkerView({
|
|
481
|
+
name,
|
|
482
|
+
slots: new WorkerSlotsView({
|
|
483
|
+
capacity: slot?.capacity ??
|
|
484
|
+
instance.config.workers.find((worker) => worker.name === name)?.maxConcurrentAttempts ??
|
|
485
|
+
0,
|
|
486
|
+
leased: slot?.leased ?? 0,
|
|
487
|
+
}),
|
|
488
|
+
preflight: Option.getOrNull(Option.map(Option.flatMap(Option.fromNullishOr(preflight), standingCheck), checkView)),
|
|
489
|
+
machines: machineViews.filter((machine) => machine.worker === name),
|
|
490
|
+
provisioning: Option.getOrNull(Option.map(Option.fromNullishOr(pauses.find((pause) => pause.worker === name)), provisioningPauseView)),
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
const completed = Option.match(latestPoll, {
|
|
494
|
+
onNone: () => [],
|
|
495
|
+
onSome: ({ repositoryPolls }) => repositoryPolls,
|
|
496
|
+
});
|
|
497
|
+
const polls = instance.config.repos.map(({ name }) => {
|
|
498
|
+
const poll = completed.find(({ repository }) => canonicalRepositoryName(repository) === canonicalRepositoryName(name));
|
|
499
|
+
return new RepositoryPollView({
|
|
500
|
+
repository: name,
|
|
501
|
+
polledAt: poll === undefined ? null : DateTime.formatIso(poll.completedAt),
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
yield* Effect.logDebug("Built the operator desk", {
|
|
505
|
+
running: running.length,
|
|
506
|
+
matches: matches.length,
|
|
507
|
+
notMoving: notMoving.length,
|
|
508
|
+
lastOutcomes: lastOutcomes.length,
|
|
509
|
+
workers: workers.length,
|
|
510
|
+
});
|
|
511
|
+
return new DeskView({
|
|
512
|
+
running,
|
|
513
|
+
notMoving: [...notMoving].sort(stalledOrder),
|
|
514
|
+
lastOutcomes,
|
|
515
|
+
workers,
|
|
516
|
+
polls,
|
|
517
|
+
});
|
|
518
|
+
});
|
|
519
|
+
return { desk };
|
|
520
|
+
});
|
|
521
|
+
/** Builds the operator's desk from the engine's stores, the Loop matches, and the scheduler's slots. */
|
|
522
|
+
export class OperatorDesk extends Context.Service()("@usine/orchestrator/OperatorDesk") {
|
|
523
|
+
static layer = Layer.effect(OperatorDesk, makeDesk).pipe(Layer.provide(LoopMatches.layer));
|
|
524
|
+
}
|
|
525
|
+
//# sourceMappingURL=desk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desk.js","sourceRoot":"","sources":["../../src/operator/desk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { RunId } from "@usine/core/run";
|
|
2
|
+
import { BoardMoves } from "@usine/engine/board-moves";
|
|
3
|
+
import type { RunStoreError } from "@usine/engine/engine";
|
|
4
|
+
import { RunReader } from "@usine/engine/run-reader";
|
|
5
|
+
import type { GitHubAppError } from "@usine/github/github-app";
|
|
6
|
+
import { GitHubItemHistory, type GitHubItemNotFoundError } from "@usine/github/item-history";
|
|
7
|
+
import { Context, Effect, Layer, Schema } from "effect";
|
|
8
|
+
import { LabelView } from "./board.ts";
|
|
9
|
+
declare const LabelAddedView_base: Schema.Class<LabelAddedView, Schema.TaggedStruct<"LabelAdded", {
|
|
10
|
+
readonly at: Schema.String;
|
|
11
|
+
readonly label: typeof LabelView;
|
|
12
|
+
}>, {}>;
|
|
13
|
+
/**
|
|
14
|
+
* A label that an Attempt's Agent added to the Run's Item, with GitHub's current label definition.
|
|
15
|
+
*/
|
|
16
|
+
export declare class LabelAddedView extends LabelAddedView_base {
|
|
17
|
+
}
|
|
18
|
+
declare const LabelRemovedView_base: Schema.Class<LabelRemovedView, Schema.TaggedStruct<"LabelRemoved", {
|
|
19
|
+
readonly at: Schema.String;
|
|
20
|
+
readonly label: typeof LabelView;
|
|
21
|
+
}>, {}>;
|
|
22
|
+
/**
|
|
23
|
+
* A label that an Attempt's Agent removed from the Run's Item, with GitHub's current label
|
|
24
|
+
* definition.
|
|
25
|
+
*/
|
|
26
|
+
export declare class LabelRemovedView extends LabelRemovedView_base {
|
|
27
|
+
}
|
|
28
|
+
declare const CommentedView_base: Schema.Class<CommentedView, Schema.TaggedStruct<"Commented", {
|
|
29
|
+
readonly at: Schema.String;
|
|
30
|
+
readonly url: Schema.String;
|
|
31
|
+
}>, {}>;
|
|
32
|
+
/** A comment that an Attempt's Agent posted on the Run's Item. */
|
|
33
|
+
export declare class CommentedView extends CommentedView_base {
|
|
34
|
+
}
|
|
35
|
+
declare const ReviewedView_base: Schema.Class<ReviewedView, Schema.TaggedStruct<"Reviewed", {
|
|
36
|
+
readonly at: Schema.String;
|
|
37
|
+
readonly url: Schema.String;
|
|
38
|
+
readonly state: Schema.Literals<readonly ["APPROVED", "CHANGES_REQUESTED", "COMMENTED", "DISMISSED"]>;
|
|
39
|
+
}>, {}>;
|
|
40
|
+
/** A review that an Attempt's Agent submitted on the Run's pull request, with its current state. */
|
|
41
|
+
export declare class ReviewedView extends ReviewedView_base {
|
|
42
|
+
}
|
|
43
|
+
declare const BoardMovedView_base: Schema.Class<BoardMovedView, Schema.TaggedStruct<"BoardMoved", {
|
|
44
|
+
readonly at: Schema.String;
|
|
45
|
+
readonly fromLane: Schema.brand<Schema.String, "LaneName">;
|
|
46
|
+
readonly toLane: Schema.brand<Schema.String, "LaneName">;
|
|
47
|
+
}>, {}>;
|
|
48
|
+
/**
|
|
49
|
+
* An operator move of the Run's Item between Board lanes during an Attempt. `at` is when the
|
|
50
|
+
* operator made the move.
|
|
51
|
+
*/
|
|
52
|
+
export declare class BoardMovedView extends BoardMovedView_base {
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A change on the Run's GitHub Item during an Attempt: one made by the Agent, or an operator Board
|
|
56
|
+
* move.
|
|
57
|
+
*/
|
|
58
|
+
export declare const GitHubChangeView: Schema.Union<readonly [typeof LabelAddedView, typeof LabelRemovedView, typeof CommentedView, typeof ReviewedView, typeof BoardMovedView]>;
|
|
59
|
+
export type GitHubChangeView = typeof GitHubChangeView.Type;
|
|
60
|
+
declare const AttemptGitHubChangesView_base: Schema.Class<AttemptGitHubChangesView, Schema.Struct<{
|
|
61
|
+
readonly attemptId: Schema.brand<Schema.NonEmptyString, "AttemptId">;
|
|
62
|
+
readonly changes: Schema.$Array<Schema.Union<readonly [typeof LabelAddedView, typeof LabelRemovedView, typeof CommentedView, typeof ReviewedView, typeof BoardMovedView]>>;
|
|
63
|
+
}>, {}>;
|
|
64
|
+
/** The changes on the Run's GitHub Item during one Attempt, oldest first. */
|
|
65
|
+
export declare class AttemptGitHubChangesView extends AttemptGitHubChangesView_base {
|
|
66
|
+
}
|
|
67
|
+
declare const RunGitHubChangesView_base: Schema.Class<RunGitHubChangesView, Schema.Struct<{
|
|
68
|
+
readonly attempts: Schema.$Array<typeof AttemptGitHubChangesView>;
|
|
69
|
+
}>, {}>;
|
|
70
|
+
/**
|
|
71
|
+
* The GitHub changes of each of a Run's Attempts, in Attempt order. Empty for a Run without a
|
|
72
|
+
* GitHub Item, such as a schedule Run.
|
|
73
|
+
*/
|
|
74
|
+
export declare class RunGitHubChangesView extends RunGitHubChangesView_base {
|
|
75
|
+
}
|
|
76
|
+
export type RunGitHubChangesError = RunStoreError | GitHubAppError | GitHubItemNotFoundError;
|
|
77
|
+
declare const RunGitHubChanges_base: Context.ServiceClass<RunGitHubChanges, "@usine/orchestrator/RunGitHubChanges", {
|
|
78
|
+
readonly read: (runId: RunId) => Effect.Effect<RunGitHubChangesView, RunGitHubChangesError>;
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* Reads the Agent's label, comment, and review changes and the operator's Board moves on the Run's
|
|
82
|
+
* GitHub Item during each Attempt. Label changes made by a recorded Board move are the operator's.
|
|
83
|
+
*/
|
|
84
|
+
export declare class RunGitHubChanges extends RunGitHubChanges_base {
|
|
85
|
+
static readonly layer: Layer.Layer<RunGitHubChanges, never, BoardMoves | GitHubItemHistory | RunReader>;
|
|
86
|
+
}
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=github-changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-changes.d.ts","sourceRoot":"","sources":["../../src/operator/github-changes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAwB,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,iBAAiB,EACjB,KAAK,uBAAuB,EAK7B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAS,OAAO,EAAY,MAAM,EAAE,KAAK,EAAsB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE7F,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;;;;;AAEvC;;GAEG;AACH,qBAAa,cAAe,SAAQ,mBAEoB;CAAG;;;;;AAE3D;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,qBAEoB;CAAG;;;;;AAE7D,kEAAkE;AAClE,qBAAa,aAAc,SAAQ,kBAEsB;CAAG;;;;;;AAE5D,oGAAoG;AACpG,qBAAa,YAAa,SAAQ,iBAE0C;CAAG;;;;;;AAE/E;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAEwC;CAAG;AAE/E;;;GAGG;AACH,eAAO,MAAM,gBAAgB,2IAM3B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,IAAI,CAAC;;;;;AAE5D,6EAA6E;AAC7E,qBAAa,wBAAyB,SAAQ,6BAEsB;CAAG;;;;AAEvE;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,yBAEa;CAAG;AAE1D,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG,cAAc,GAAG,uBAAuB,CAAC;;mBA4Q1E,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;;AAP/F;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,qBAKK;IACzC,MAAM,CAAC,QAAQ,CAAC,KAAK,mFAAwD;CAC9E"}
|