@usine/orchestrator 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -21
- 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 +6 -5
- package/dist/board/projection.d.ts.map +1 -1
- package/dist/board/projection.js +25 -65
- package/dist/board/projection.js.map +1 -1
- 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 +6 -6
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +6 -6
- package/dist/credentials.js.map +1 -1
- package/dist/exe-dev.d.ts +5 -4
- package/dist/exe-dev.d.ts.map +1 -1
- package/dist/exe-dev.js +5 -4
- 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 +3 -1
- package/dist/idle-triggers.js.map +1 -1
- 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 +17 -12
- package/dist/local.d.ts.map +1 -1
- package/dist/local.js +20 -13
- package/dist/local.js.map +1 -1
- package/dist/operator/attempt.d.ts +69 -0
- package/dist/operator/attempt.d.ts.map +1 -0
- package/dist/operator/attempt.js +62 -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 +180 -0
- package/dist/operator/http.d.ts.map +1 -0
- package/dist/operator/http.js +150 -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 +68 -0
- package/dist/operator/operator.d.ts.map +1 -0
- package/dist/operator/operator.js +402 -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 +12 -9
- package/dist/operator/projection.d.ts.map +1 -1
- package/dist/operator/projection.js +44 -17
- package/dist/operator/projection.js.map +1 -1
- package/dist/operator/run.d.ts +62 -0
- package/dist/operator/run.d.ts.map +1 -0
- package/dist/operator/run.js +61 -0
- package/dist/operator/run.js.map +1 -0
- package/dist/operator/transcript.d.ts +59 -0
- package/dist/operator/transcript.d.ts.map +1 -0
- package/dist/operator/transcript.js +66 -0
- package/dist/operator/transcript.js.map +1 -0
- package/dist/orchestrator.d.ts +3 -2
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +1 -1
- package/dist/orchestrator.js.map +1 -1
- 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 +3 -39
- package/dist/polling-triggers.d.ts.map +1 -1
- package/dist/polling-triggers.js +3 -393
- package/dist/polling-triggers.js.map +1 -1
- package/dist/schedule-triggers.d.ts +17 -15
- package/dist/schedule-triggers.d.ts.map +1 -1
- package/dist/schedule-triggers.js +53 -43
- package/dist/schedule-triggers.js.map +1 -1
- package/dist/scheduler.d.ts +5 -5
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +30 -44
- package/dist/scheduler.js.map +1 -1
- package/dist/trigger-submission.d.ts +33 -24
- package/dist/trigger-submission.d.ts.map +1 -1
- package/dist/trigger-submission.js +30 -37
- package/dist/trigger-submission.js.map +1 -1
- package/package.json +50 -14
- package/dist/index.d.ts +0 -11
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -11
- package/dist/index.js.map +0 -1
- package/dist/operator/model.d.ts +0 -280
- package/dist/operator/model.d.ts.map +0 -1
- package/dist/operator/model.js +0 -242
- package/dist/operator/model.js.map +0 -1
- package/dist/operator/service.d.ts +0 -36
- package/dist/operator/service.d.ts.map +0 -1
- package/dist/operator/service.js +0 -248
- package/dist/operator/service.js.map +0 -1
package/dist/polling-triggers.js
CHANGED
|
@@ -1,394 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { ExpressionEngine } from "@usine/expression";
|
|
5
|
-
import { GitHubPolling, EntityTag, PollCursor, RepositoryLabelCatalog, } from "@usine/github";
|
|
6
|
-
import { Clock, Context, DateTime, Duration, Effect, Layer, Option, Ref, Result, Schema, } from "effect";
|
|
7
|
-
import { configFileErrorLogFields, resolveTriggerLoops, submissionLogFields, triggerSubmission, } from "./trigger-submission.js";
|
|
8
|
-
/** GitHub REST + GraphQL tolerate a handful of parallel calls per token. */
|
|
9
|
-
const REPOSITORY_CONCURRENCY = 4;
|
|
10
|
-
const ITEM_CONCURRENCY = 4;
|
|
11
|
-
const WatchKey = Schema.NonEmptyString.pipe(Schema.brand("GitHubPollWatchKey"));
|
|
12
|
-
class StoredPollCursor extends Schema.Class("@usine/orchestrator/StoredPollCursor")({
|
|
13
|
-
boardVersion: Schema.Literal(2),
|
|
14
|
-
cursor: PollCursor,
|
|
15
|
-
labelEntityTag: Schema.OptionFromNullOr(EntityTag),
|
|
16
|
-
watches: Schema.Array(WatchKey).check(Schema.isUnique()),
|
|
17
|
-
}) {
|
|
18
|
-
}
|
|
19
|
-
/** One repository whose cycle ended in a typed error; siblings were unaffected. */
|
|
20
|
-
export class RepositoryPollFailure extends Schema.Class("@usine/orchestrator/RepositoryPollFailure")({
|
|
21
|
-
repository: Repository.Name,
|
|
22
|
-
errorTag: Schema.NonEmptyString,
|
|
23
|
-
message: Schema.String,
|
|
24
|
-
}) {
|
|
25
|
-
}
|
|
26
|
-
export class PollCycle extends Schema.Class("@usine/orchestrator/PollCycle")({
|
|
27
|
-
repositories: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),
|
|
28
|
-
changedItems: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),
|
|
29
|
-
submissions: Schema.Array(SubmissionResult),
|
|
30
|
-
/** Run ids actually revoked because their item stopped matching. */
|
|
31
|
-
revokedRuns: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),
|
|
32
|
-
failures: Schema.Array(RepositoryPollFailure),
|
|
33
|
-
nextPollAt: Schema.Option(Schema.DateTimeUtc),
|
|
34
|
-
}) {
|
|
35
|
-
}
|
|
36
|
-
const repositoryFailureLogFields = (error) => {
|
|
37
|
-
const common = { errorTag: error._tag, message: error.message };
|
|
38
|
-
if (error._tag === "ConfigFileError") {
|
|
39
|
-
return { ...common, ...configFileErrorLogFields(error) };
|
|
40
|
-
}
|
|
41
|
-
if (error._tag === "ExpressionCheckError" || error._tag === "ExpressionEvaluationError") {
|
|
42
|
-
return { ...common, expression: error.source };
|
|
43
|
-
}
|
|
44
|
-
return common;
|
|
45
|
-
};
|
|
46
|
-
const cursorKey = (repository) => CursorKey.make(`github-poll:${Repository.canonical(repository.name)}`);
|
|
47
|
-
const watchKey = ({ loop }) => WatchKey.make(JSON.stringify([loop.name, loop.trigger.on, loop.trigger.if]));
|
|
48
|
-
const watchedRepositories = (instance, resolved) => instance.config.repos.map((repository) => {
|
|
49
|
-
const loops = resolved.filter(({ loop }) => loop.trigger.on !== "schedule" && matchesSelector(loop.selector, repository));
|
|
50
|
-
return { repository, loops, watches: loops.map(watchKey).sort() };
|
|
51
|
-
});
|
|
52
|
-
const sameWatches = (left, right) => left.length === right.length && left.every((value, index) => value === right[index]);
|
|
53
|
-
const itemStream = (item) => item._tag === "ChangedIssue" ? "issue" : "pr";
|
|
54
|
-
const itemKey = (repository, item) => Item.ItemKey.make(JSON.stringify(["github", Repository.canonical(repository.name), item.number]));
|
|
55
|
-
const eventKey = (loop, repository, item, snapshot) => Event.DedupKey.make(JSON.stringify([
|
|
56
|
-
loop.name,
|
|
57
|
-
Repository.canonical(repository.name),
|
|
58
|
-
item.number,
|
|
59
|
-
snapshot.contentHash,
|
|
60
|
-
]));
|
|
61
|
-
const latestPollAt = (values) => {
|
|
62
|
-
const epochs = values.flatMap((value) => Option.match(value, {
|
|
63
|
-
onNone: () => [],
|
|
64
|
-
onSome: (dateTime) => [DateTime.toEpochMillis(dateTime)],
|
|
65
|
-
}));
|
|
66
|
-
return epochs.length === 0 ? Option.none() : DateTime.make(Math.max(...epochs));
|
|
67
|
-
};
|
|
68
|
-
/** Full selector-pruned GitHub change → snapshot → CEL → Event composition. */
|
|
69
|
-
export class PollingTriggers extends Context.Service()("@usine/orchestrator/PollingTriggers") {
|
|
70
|
-
static layer = Layer.effect(PollingTriggers, Effect.gen(function* () {
|
|
71
|
-
const cursors = yield* CursorStore;
|
|
72
|
-
const config = yield* ConfigParser;
|
|
73
|
-
const expressions = yield* ExpressionEngine;
|
|
74
|
-
const github = yield* GitHubPolling;
|
|
75
|
-
const items = yield* ItemProjectionWriter;
|
|
76
|
-
const repositoryLabels = yield* RepositoryLabelProjectionWriter;
|
|
77
|
-
const runs = yield* RunEngine;
|
|
78
|
-
const loops = yield* LoopControl;
|
|
79
|
-
const latest = yield* Ref.make(Option.none());
|
|
80
|
-
const emptyCursor = (watches) => new StoredPollCursor({
|
|
81
|
-
boardVersion: 2,
|
|
82
|
-
cursor: PollCursor.empty,
|
|
83
|
-
labelEntityTag: Option.none(),
|
|
84
|
-
watches,
|
|
85
|
-
});
|
|
86
|
-
const readCursor = Effect.fn("PollingTriggers.readCursor")(function* (watched) {
|
|
87
|
-
const stored = yield* cursors.read(cursorKey(watched.repository), StoredPollCursor);
|
|
88
|
-
if (Option.isNone(stored))
|
|
89
|
-
return emptyCursor(watched.watches);
|
|
90
|
-
if (!sameWatches(stored.value.watches, watched.watches)) {
|
|
91
|
-
yield* Effect.logInfo("Watched loops changed; re-polling the repository from scratch", {
|
|
92
|
-
repository: watched.repository.name,
|
|
93
|
-
previousWatches: stored.value.watches.length,
|
|
94
|
-
currentWatches: watched.watches.length,
|
|
95
|
-
});
|
|
96
|
-
return emptyCursor(watched.watches);
|
|
97
|
-
}
|
|
98
|
-
return stored.value;
|
|
99
|
-
});
|
|
100
|
-
const writeCursor = Effect.fn("PollingTriggers.writeCursor")((watched, cursor) => cursors.write(cursorKey(watched.repository), StoredPollCursor, cursor));
|
|
101
|
-
const evaluateItem = Effect.fn("PollingTriggers.evaluateItem")(function* (watched, item) {
|
|
102
|
-
yield* Effect.annotateCurrentSpan({
|
|
103
|
-
repository: watched.repository.name,
|
|
104
|
-
item: item.number,
|
|
105
|
-
});
|
|
106
|
-
const loops = watched.loops.filter(({ loop }) => loop.trigger.on === itemStream(item));
|
|
107
|
-
const snapshot = yield* github.snapshot(watched.repository.name, item);
|
|
108
|
-
// Both snapshot variants carry their payload; the union needs no recheck.
|
|
109
|
-
const payload = snapshot.payload;
|
|
110
|
-
const context = { repo: repositoryContext(watched.repository), item: payload };
|
|
111
|
-
const stableItemKey = itemKey(watched.repository, item);
|
|
112
|
-
yield* items.upsert(new ItemProjection({
|
|
113
|
-
itemKey: stableItemKey,
|
|
114
|
-
repository: watched.repository.name,
|
|
115
|
-
source: ItemProjectionSource.make(itemStream(item)),
|
|
116
|
-
number: ItemNumber.make(item.number),
|
|
117
|
-
contentHash: ItemContentHash.make(snapshot.contentHash),
|
|
118
|
-
payload,
|
|
119
|
-
}));
|
|
120
|
-
yield* Effect.logDebug("Fetched changed-item snapshot", {
|
|
121
|
-
repository: watched.repository.name,
|
|
122
|
-
item: item.number,
|
|
123
|
-
stream: itemStream(item),
|
|
124
|
-
contentHash: snapshot.contentHash,
|
|
125
|
-
});
|
|
126
|
-
if (loops.length === 0) {
|
|
127
|
-
yield* Effect.logDebug("Item projected without any matching repository Loop", {
|
|
128
|
-
repository: watched.repository.name,
|
|
129
|
-
item: item.number,
|
|
130
|
-
stream: itemStream(item),
|
|
131
|
-
});
|
|
132
|
-
return { submissions: [], revokedRuns: 0, failures: [] };
|
|
133
|
-
}
|
|
134
|
-
const submissions = [];
|
|
135
|
-
const failures = [];
|
|
136
|
-
let revokedRuns = 0;
|
|
137
|
-
for (const { agent, loop, parentModel } of loops) {
|
|
138
|
-
yield* Effect.annotateCurrentSpan({ loop: loop.name, agent: agent.name });
|
|
139
|
-
const matches = yield* expressions.evaluateBoolean(loop.trigger.if, environmentFor(loop.trigger.on), context);
|
|
140
|
-
if (!matches) {
|
|
141
|
-
yield* Effect.logDebug("Item did not match its loop expression", {
|
|
142
|
-
repository: watched.repository.name,
|
|
143
|
-
loop: loop.name,
|
|
144
|
-
agent: agent.name,
|
|
145
|
-
item: item.number,
|
|
146
|
-
});
|
|
147
|
-
const revoked = yield* runs.revoke(loop.name, stableItemKey);
|
|
148
|
-
revokedRuns += revoked.length;
|
|
149
|
-
if (revoked.length > 0) {
|
|
150
|
-
yield* Effect.logInfo("Item stopped matching; revoked its unstarted runs", {
|
|
151
|
-
repository: watched.repository.name,
|
|
152
|
-
loop: loop.name,
|
|
153
|
-
agent: agent.name,
|
|
154
|
-
item: item.number,
|
|
155
|
-
runIds: revoked.join(", "),
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
continue;
|
|
159
|
-
}
|
|
160
|
-
const dedupKey = eventKey(loop, watched.repository, item, snapshot);
|
|
161
|
-
const receivedAt = yield* DateTime.now;
|
|
162
|
-
// A render failure is deterministic loop authoring, not transport:
|
|
163
|
-
// re-polling the same snapshot re-fails identically. Isolate it to
|
|
164
|
-
// this loop so sibling loops and the cursor still advance.
|
|
165
|
-
const rendered = yield* Effect.result(config.renderPrompt(loop, context));
|
|
166
|
-
if (Result.isFailure(rendered)) {
|
|
167
|
-
yield* Effect.logError("Loop prompt rendering failed; sibling loops were unaffected", {
|
|
168
|
-
loop: loop.name,
|
|
169
|
-
repository: watched.repository.name,
|
|
170
|
-
agent: agent.name,
|
|
171
|
-
item: item.number,
|
|
172
|
-
errorTag: rendered.failure._tag,
|
|
173
|
-
message: rendered.failure.message,
|
|
174
|
-
...configFileErrorLogFields(rendered.failure),
|
|
175
|
-
});
|
|
176
|
-
failures.push(new RepositoryPollFailure({
|
|
177
|
-
repository: watched.repository.name,
|
|
178
|
-
errorTag: rendered.failure._tag,
|
|
179
|
-
message: rendered.failure.message,
|
|
180
|
-
}));
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
const submitted = yield* runs.submit(triggerSubmission({
|
|
184
|
-
dedupKey,
|
|
185
|
-
itemKey: stableItemKey,
|
|
186
|
-
loop,
|
|
187
|
-
payload,
|
|
188
|
-
receivedAt,
|
|
189
|
-
repository: watched.repository,
|
|
190
|
-
task: AttemptChannel.Task.make(rendered.success),
|
|
191
|
-
agent,
|
|
192
|
-
parentModel,
|
|
193
|
-
}));
|
|
194
|
-
yield* Effect.logInfo("Submitted matching item state", {
|
|
195
|
-
repository: watched.repository.name,
|
|
196
|
-
loop: loop.name,
|
|
197
|
-
agent: agent.name,
|
|
198
|
-
item: item.number,
|
|
199
|
-
contentHash: snapshot.contentHash,
|
|
200
|
-
result: submitted._tag,
|
|
201
|
-
...submissionLogFields(submitted),
|
|
202
|
-
});
|
|
203
|
-
submissions.push(submitted);
|
|
204
|
-
}
|
|
205
|
-
return { submissions, revokedRuns, failures };
|
|
206
|
-
});
|
|
207
|
-
/**
|
|
208
|
-
* The label catalog feeds the Board projection only. A failed catalog
|
|
209
|
-
* request keeps the stored catalog and ETag and never blocks trigger
|
|
210
|
-
* evaluation: label-triggered Loops fire from the change poll alone.
|
|
211
|
-
*/
|
|
212
|
-
const applyLabelCatalog = Effect.fn("PollingTriggers.applyLabelCatalog")(function* (watched, stored, result) {
|
|
213
|
-
const unchanged = {
|
|
214
|
-
labelEntityTag: stored.labelEntityTag,
|
|
215
|
-
stored: false,
|
|
216
|
-
failures: [],
|
|
217
|
-
nextPollAt: Option.none(),
|
|
218
|
-
};
|
|
219
|
-
if (Result.isFailure(result)) {
|
|
220
|
-
const error = result.failure;
|
|
221
|
-
if (error._tag === "GitHubRateLimitError") {
|
|
222
|
-
yield* Effect.logWarning("Label catalog rate-limited; keeping the stored catalog", {
|
|
223
|
-
repository: watched.repository.name,
|
|
224
|
-
operation: error.operation,
|
|
225
|
-
retryAt: DateTime.formatIso(error.retryAt),
|
|
226
|
-
});
|
|
227
|
-
return { ...unchanged, nextPollAt: Option.some(error.retryAt) };
|
|
228
|
-
}
|
|
229
|
-
yield* Effect.logError("Label catalog request failed; kept the stored catalog and evaluated items anyway", {
|
|
230
|
-
repository: watched.repository.name,
|
|
231
|
-
...repositoryFailureLogFields(error),
|
|
232
|
-
});
|
|
233
|
-
return {
|
|
234
|
-
...unchanged,
|
|
235
|
-
failures: [
|
|
236
|
-
new RepositoryPollFailure({
|
|
237
|
-
repository: watched.repository.name,
|
|
238
|
-
errorTag: error._tag,
|
|
239
|
-
message: error.message,
|
|
240
|
-
}),
|
|
241
|
-
],
|
|
242
|
-
};
|
|
243
|
-
}
|
|
244
|
-
const detection = result.success;
|
|
245
|
-
if (!(detection instanceof RepositoryLabelCatalog)) {
|
|
246
|
-
yield* Effect.logDebug("Repository label catalog unchanged (304)", {
|
|
247
|
-
repository: watched.repository.name,
|
|
248
|
-
});
|
|
249
|
-
return unchanged;
|
|
250
|
-
}
|
|
251
|
-
yield* repositoryLabels.replace(new RepositoryLabelProjection({
|
|
252
|
-
repository: watched.repository.name,
|
|
253
|
-
labels: detection.labels.map(String),
|
|
254
|
-
}));
|
|
255
|
-
return { ...unchanged, labelEntityTag: detection.entityTag, stored: true };
|
|
256
|
-
});
|
|
257
|
-
const pollRepository = Effect.fn("PollingTriggers.pollRepository")(function* (watched) {
|
|
258
|
-
yield* Effect.annotateCurrentSpan({ repository: watched.repository.name });
|
|
259
|
-
const stored = yield* readCursor(watched);
|
|
260
|
-
const [detected, labelResult] = yield* Effect.all([
|
|
261
|
-
github.changes(watched.repository.name, stored.cursor),
|
|
262
|
-
Effect.result(github.labels(watched.repository.name, stored.labelEntityTag)),
|
|
263
|
-
], { concurrency: "unbounded" });
|
|
264
|
-
const catalog = yield* applyLabelCatalog(watched, stored, labelResult);
|
|
265
|
-
const nextCursor = new StoredPollCursor({
|
|
266
|
-
boardVersion: 2,
|
|
267
|
-
cursor: detected.cursor,
|
|
268
|
-
labelEntityTag: catalog.labelEntityTag,
|
|
269
|
-
watches: watched.watches,
|
|
270
|
-
});
|
|
271
|
-
const nextPollAt = latestPollAt([detected.nextPollAt, catalog.nextPollAt]);
|
|
272
|
-
if (detected._tag === "RepositoryNotModified") {
|
|
273
|
-
if (catalog.stored) {
|
|
274
|
-
yield* writeCursor(watched, nextCursor);
|
|
275
|
-
}
|
|
276
|
-
yield* Effect.logDebug("Repository unchanged (304)", {
|
|
277
|
-
repository: watched.repository.name,
|
|
278
|
-
});
|
|
279
|
-
return {
|
|
280
|
-
changedItems: 0,
|
|
281
|
-
submissions: [],
|
|
282
|
-
revokedRuns: 0,
|
|
283
|
-
failures: catalog.failures,
|
|
284
|
-
nextPollAt,
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
yield* Effect.logInfo("Repository changed", {
|
|
288
|
-
repository: watched.repository.name,
|
|
289
|
-
changedItems: detected.items.length,
|
|
290
|
-
backlog: detected.backlog,
|
|
291
|
-
});
|
|
292
|
-
const itemCycles = yield* Effect.forEach(detected.items, (item) => evaluateItem(watched, item), { concurrency: ITEM_CONCURRENCY });
|
|
293
|
-
// Advancing is the commit point: every changed item was fetched,
|
|
294
|
-
// evaluated, and submitted/revoked successfully. A prior failure
|
|
295
|
-
// leaves the old cursor so the next cycle safely re-polls.
|
|
296
|
-
yield* writeCursor(watched, nextCursor);
|
|
297
|
-
return {
|
|
298
|
-
changedItems: detected.items.length,
|
|
299
|
-
submissions: itemCycles.flatMap(({ submissions }) => submissions),
|
|
300
|
-
revokedRuns: itemCycles.reduce((sum, cycle) => sum + cycle.revokedRuns, 0),
|
|
301
|
-
failures: [...catalog.failures, ...itemCycles.flatMap(({ failures }) => failures)],
|
|
302
|
-
nextPollAt,
|
|
303
|
-
};
|
|
304
|
-
});
|
|
305
|
-
const poll = Effect.fn("PollingTriggers.poll")(function* (instance) {
|
|
306
|
-
const paused = new Set((yield* loops.states).filter((state) => state.paused).map((state) => state.loop));
|
|
307
|
-
for (const loop of instance.loops) {
|
|
308
|
-
if (loop.trigger.on !== "schedule" && paused.has(loop.name)) {
|
|
309
|
-
yield* Effect.logDebug("Paused Loop skipped during repository polling", {
|
|
310
|
-
loop: loop.name,
|
|
311
|
-
});
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
const resolved = (yield* resolveTriggerLoops(instance)).filter(({ loop }) => !paused.has(loop.name));
|
|
315
|
-
const watched = watchedRepositories(instance, resolved);
|
|
316
|
-
const settled = yield* Effect.forEach(watched, (repository) => Effect.result(pollRepository(repository)).pipe(Effect.map((result) => ({ repository, result }))), { concurrency: REPOSITORY_CONCURRENCY });
|
|
317
|
-
const cycles = [];
|
|
318
|
-
const failures = [];
|
|
319
|
-
const backoffs = [];
|
|
320
|
-
for (const { repository, result } of settled) {
|
|
321
|
-
if (Result.isSuccess(result)) {
|
|
322
|
-
cycles.push(result.success);
|
|
323
|
-
continue;
|
|
324
|
-
}
|
|
325
|
-
const error = result.failure;
|
|
326
|
-
if (error._tag === "GitHubRateLimitError") {
|
|
327
|
-
// A rate-limit pause is scheduling input, not a repository failure.
|
|
328
|
-
yield* Effect.logWarning("GitHub rate limit reached; delaying the next cycle", {
|
|
329
|
-
repository: repository.repository.name,
|
|
330
|
-
operation: error.operation,
|
|
331
|
-
retryAt: DateTime.formatIso(error.retryAt),
|
|
332
|
-
});
|
|
333
|
-
backoffs.push(Option.some(error.retryAt));
|
|
334
|
-
continue;
|
|
335
|
-
}
|
|
336
|
-
yield* Effect.logError("Repository poll cycle failed; siblings were unaffected", {
|
|
337
|
-
repository: repository.repository.name,
|
|
338
|
-
...repositoryFailureLogFields(error),
|
|
339
|
-
});
|
|
340
|
-
failures.push(new RepositoryPollFailure({
|
|
341
|
-
repository: repository.repository.name,
|
|
342
|
-
errorTag: error._tag,
|
|
343
|
-
message: error.message,
|
|
344
|
-
}));
|
|
345
|
-
}
|
|
346
|
-
const cycle = new PollCycle({
|
|
347
|
-
repositories: watched.length,
|
|
348
|
-
changedItems: cycles.reduce((sum, cycle) => sum + cycle.changedItems, 0),
|
|
349
|
-
submissions: cycles.flatMap(({ submissions }) => submissions),
|
|
350
|
-
revokedRuns: cycles.reduce((sum, cycle) => sum + cycle.revokedRuns, 0),
|
|
351
|
-
failures: [...cycles.flatMap(({ failures: isolated }) => isolated), ...failures],
|
|
352
|
-
nextPollAt: latestPollAt([...cycles.map(({ nextPollAt }) => nextPollAt), ...backoffs]),
|
|
353
|
-
});
|
|
354
|
-
yield* Ref.set(latest, Option.some(cycle));
|
|
355
|
-
return cycle;
|
|
356
|
-
});
|
|
357
|
-
// No Effect.fn here: `run` never returns, so a named wrapper would open
|
|
358
|
-
// a span that never closes. Each cycle's span lives on `poll`.
|
|
359
|
-
const run = (instance) => Effect.gen(function* () {
|
|
360
|
-
const startedAt = yield* Clock.currentTimeMillis;
|
|
361
|
-
const result = yield* Effect.result(poll(instance));
|
|
362
|
-
if (Result.isFailure(result)) {
|
|
363
|
-
const sleepMs = instance.config.settings.pollInterval * 1_000;
|
|
364
|
-
yield* Effect.logError("Poll cycle could not read Loop runtime state; retrying", {
|
|
365
|
-
errorTag: result.failure._tag,
|
|
366
|
-
message: result.failure.message,
|
|
367
|
-
operation: result.failure.operation,
|
|
368
|
-
sleepMs,
|
|
369
|
-
});
|
|
370
|
-
yield* Effect.sleep(Duration.millis(sleepMs));
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
const cycle = result.success;
|
|
374
|
-
const intervalAt = startedAt + instance.config.settings.pollInterval * 1_000;
|
|
375
|
-
const target = Option.match(cycle.nextPollAt, {
|
|
376
|
-
onNone: () => intervalAt,
|
|
377
|
-
onSome: (value) => Math.max(intervalAt, DateTime.toEpochMillis(value)),
|
|
378
|
-
});
|
|
379
|
-
const now = yield* Clock.currentTimeMillis;
|
|
380
|
-
const sleepMs = Math.max(0, target - now);
|
|
381
|
-
yield* Effect.logInfo("Poll cycle complete", {
|
|
382
|
-
repositories: cycle.repositories,
|
|
383
|
-
changedItems: cycle.changedItems,
|
|
384
|
-
submissions: cycle.submissions.length,
|
|
385
|
-
revokedRuns: cycle.revokedRuns,
|
|
386
|
-
failures: cycle.failures.length,
|
|
387
|
-
sleepMs,
|
|
388
|
-
});
|
|
389
|
-
yield* Effect.sleep(Duration.millis(sleepMs));
|
|
390
|
-
}).pipe(Effect.forever);
|
|
391
|
-
return { latest: Ref.get(latest), poll, run };
|
|
392
|
-
}));
|
|
393
|
-
}
|
|
1
|
+
export { PollingTriggers } from "./polling/polling.js";
|
|
2
|
+
export { PollCycle, RepositoryPollFailure } from "./polling/cycle.js";
|
|
3
|
+
export { GitHubItemKey } from "./polling/repository-sync.js";
|
|
394
4
|
//# sourceMappingURL=polling-triggers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polling-triggers.js","sourceRoot":"","sources":["../src/polling-triggers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"polling-triggers.js","sourceRoot":"","sources":["../src/polling-triggers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import type { LoadedInstance } from "@usine/config/instance";
|
|
2
|
+
import { ConfigParser } from "@usine/config/parser";
|
|
3
|
+
import { RunEngine, type EnginePersistenceError } from "@usine/engine/engine";
|
|
4
|
+
import { LoopControl } from "@usine/engine/loop-control";
|
|
5
|
+
import { ExpressionEngine } from "@usine/expression/expression-engine";
|
|
4
6
|
import { Context, Effect, Layer, Option, Schema } from "effect";
|
|
5
7
|
declare const ScheduleAgentFailure_base: Schema.Class<ScheduleAgentFailure, Schema.TaggedStruct<"ScheduleAgentFailure", {
|
|
6
8
|
readonly loop: Schema.brand<Schema.NonEmptyString, "LoopName">;
|
|
7
9
|
readonly agent: Schema.brand<Schema.String, "AgentName">;
|
|
8
10
|
readonly message: Schema.String;
|
|
9
11
|
}>, {}>;
|
|
10
|
-
/**
|
|
12
|
+
/** A schedule loop whose agent is no longer in the loaded roster. */
|
|
11
13
|
export declare class ScheduleAgentFailure extends ScheduleAgentFailure_base {
|
|
12
14
|
}
|
|
13
15
|
declare const ScheduleTickFailure_base: Schema.Class<ScheduleTickFailure, Schema.TaggedStruct<"ScheduleTickFailure", {
|
|
14
16
|
readonly loop: Schema.brand<Schema.NonEmptyString, "LoopName">;
|
|
15
|
-
readonly repository: Schema.brand<Schema.String, "
|
|
17
|
+
readonly repository: Schema.brand<Schema.String, "RepositoryName">;
|
|
16
18
|
readonly scheduledAt: Schema.DateTimeUtc;
|
|
17
19
|
readonly errorTag: Schema.NonEmptyString;
|
|
18
20
|
readonly message: Schema.String;
|
|
19
21
|
}>, {}>;
|
|
20
|
-
/**
|
|
22
|
+
/** A selected repository whose Tick could not be evaluated or submitted. */
|
|
21
23
|
export declare class ScheduleTickFailure extends ScheduleTickFailure_base {
|
|
22
24
|
}
|
|
23
25
|
declare const ScheduleCronFailure_base: Schema.Class<ScheduleCronFailure, Schema.TaggedStruct<"ScheduleCronFailure", {
|
|
@@ -27,9 +29,9 @@ declare const ScheduleCronFailure_base: Schema.Class<ScheduleCronFailure, Schema
|
|
|
27
29
|
readonly message: Schema.String;
|
|
28
30
|
}>, {}>;
|
|
29
31
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
32
|
+
* A schedule whose cron boundaries could not be computed at this instant.
|
|
33
|
+
* Cron.prev and Cron.next fail inside a DST spring-forward gap even for a cron
|
|
34
|
+
* that parsed; the schedule retries next cycle and its siblings run.
|
|
33
35
|
*/
|
|
34
36
|
export declare class ScheduleCronFailure extends ScheduleCronFailure_base {
|
|
35
37
|
}
|
|
@@ -38,26 +40,26 @@ export type ScheduleFailure = typeof ScheduleFailure.Type;
|
|
|
38
40
|
declare const ScheduleCycle_base: Schema.Class<ScheduleCycle, Schema.Struct<{
|
|
39
41
|
readonly loops: Schema.Int;
|
|
40
42
|
readonly fanout: Schema.Int;
|
|
41
|
-
readonly submissions: Schema.$Array<Schema.Union<readonly [typeof import("@usine/engine").Claimed, typeof import("@usine/engine").Queued, typeof import("@usine/engine").Ignored]>>;
|
|
43
|
+
readonly submissions: Schema.$Array<Schema.Union<readonly [typeof import("@usine/engine/engine").Claimed, typeof import("@usine/engine/engine").Queued, typeof import("@usine/engine/engine").Ignored, typeof import("@usine/engine/engine").CycleBlocked]>>;
|
|
42
44
|
readonly skipped: Schema.Int;
|
|
43
45
|
readonly alreadyFired: Schema.Int;
|
|
44
46
|
readonly failures: Schema.$Array<Schema.Union<readonly [typeof ScheduleAgentFailure, typeof ScheduleCronFailure, typeof ScheduleTickFailure]>>;
|
|
45
47
|
readonly nextTickAt: Schema.Option<Schema.DateTimeUtc>;
|
|
46
48
|
}>, {}>;
|
|
47
|
-
/**
|
|
49
|
+
/** The result of evaluating every schedule loop at one instant. */
|
|
48
50
|
export declare class ScheduleCycle extends ScheduleCycle_base {
|
|
49
51
|
}
|
|
50
52
|
declare const ScheduleTriggers_base: Context.ServiceClass<ScheduleTriggers, "@usine/orchestrator/ScheduleTriggers", {
|
|
51
53
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
54
|
+
* Evaluates the latest due Tick of every schedule. A repository's failure is
|
|
55
|
+
* logged and reported without stopping its siblings; a cron failure in a
|
|
56
|
+
* DST gap fails only its own schedule.
|
|
55
57
|
*/
|
|
56
58
|
readonly tick: (instance: LoadedInstance) => Effect.Effect<ScheduleCycle, EnginePersistenceError>;
|
|
57
59
|
readonly run: (instance: LoadedInstance) => Effect.Effect<never>;
|
|
58
60
|
readonly latest: Effect.Effect<Option.Option<ScheduleCycle>>;
|
|
59
61
|
}>;
|
|
60
|
-
/**
|
|
62
|
+
/** Turns due schedule ticks into one Event per selected repository. */
|
|
61
63
|
export declare class ScheduleTriggers extends ScheduleTriggers_base {
|
|
62
64
|
static readonly layer: Layer.Layer<ScheduleTriggers, never, ConfigParser | ExpressionEngine | LoopControl | RunEngine>;
|
|
63
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule-triggers.d.ts","sourceRoot":"","sources":["../src/schedule-triggers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schedule-triggers.d.ts","sourceRoot":"","sources":["../src/schedule-triggers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AASpD,OAAO,EACL,SAAS,EACT,KAAK,sBAAsB,EAG5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAwB,MAAM,qCAAqC,CAAC;AAC7F,OAAO,EAEL,OAAO,EAIP,MAAM,EACN,KAAK,EACL,MAAM,EAGN,MAAM,EACP,MAAM,QAAQ,CAAC;;;;;;AAgDhB,qEAAqE;AACrE,qBAAa,oBAAqB,SAAQ,yBAMxC;CAAG;;;;;;;;AAEL,4EAA4E;AAC5E,qBAAa,mBAAoB,SAAQ,wBAQvC;CAAG;;;;;;;AAEL;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,wBAOvC;CAAG;AAEL,eAAO,MAAM,eAAe,8GAI1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAC;;;;;;;;;;AAE1D,mEAAmE;AACnE,qBAAa,aAAc,SAAQ,kBAUlC;CAAG;;IAsEA;;;;OAIG;mBACY,CACb,QAAQ,EAAE,cAAc,KACrB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;kBAC3C,CAAC,QAAQ,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;;AAbhE,uEAAuE;AACvE,qBAAa,gBAAiB,SAAQ,qBAcK;IACzC,MAAM,CAAC,QAAQ,CAAC,KAAK,kGAqTnB;CACH"}
|