@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.
Files changed (222) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +174 -52
  3. package/dist/board/items.d.ts +22 -3
  4. package/dist/board/items.d.ts.map +1 -1
  5. package/dist/board/items.js +44 -4
  6. package/dist/board/items.js.map +1 -1
  7. package/dist/board/projection.d.ts +8 -1
  8. package/dist/board/projection.d.ts.map +1 -1
  9. package/dist/board/projection.js +63 -14
  10. package/dist/board/projection.js.map +1 -1
  11. package/dist/board/tasks.d.ts +15 -3
  12. package/dist/board/tasks.d.ts.map +1 -1
  13. package/dist/board/tasks.js +28 -9
  14. package/dist/board/tasks.js.map +1 -1
  15. package/dist/cloudflare.d.ts +32 -0
  16. package/dist/cloudflare.d.ts.map +1 -0
  17. package/dist/cloudflare.js +68 -0
  18. package/dist/cloudflare.js.map +1 -0
  19. package/dist/credentials.d.ts +5 -6
  20. package/dist/credentials.d.ts.map +1 -1
  21. package/dist/credentials.js +22 -15
  22. package/dist/credentials.js.map +1 -1
  23. package/dist/current-instance/changes.d.ts +87 -0
  24. package/dist/current-instance/changes.d.ts.map +1 -0
  25. package/dist/current-instance/changes.js +141 -0
  26. package/dist/current-instance/changes.js.map +1 -0
  27. package/dist/current-instance/current-instance.d.ts +89 -0
  28. package/dist/current-instance/current-instance.d.ts.map +1 -0
  29. package/dist/current-instance/current-instance.js +163 -0
  30. package/dist/current-instance/current-instance.js.map +1 -0
  31. package/dist/exe-dev.d.ts +6 -2
  32. package/dist/exe-dev.d.ts.map +1 -1
  33. package/dist/exe-dev.js +10 -9
  34. package/dist/exe-dev.js.map +1 -1
  35. package/dist/http-client.d.ts +8 -0
  36. package/dist/http-client.d.ts.map +1 -0
  37. package/dist/http-client.js +8 -0
  38. package/dist/http-client.js.map +1 -0
  39. package/dist/idle-triggers.d.ts +1 -1
  40. package/dist/idle-triggers.d.ts.map +1 -1
  41. package/dist/idle-triggers.js +1 -1
  42. package/dist/idle-triggers.js.map +1 -1
  43. package/dist/label-reconciler.d.ts +5 -2
  44. package/dist/label-reconciler.d.ts.map +1 -1
  45. package/dist/label-reconciler.js.map +1 -1
  46. package/dist/lease-order.d.ts +60 -0
  47. package/dist/lease-order.d.ts.map +1 -0
  48. package/dist/lease-order.js +76 -0
  49. package/dist/lease-order.js.map +1 -0
  50. package/dist/local.d.ts +4 -18
  51. package/dist/local.d.ts.map +1 -1
  52. package/dist/local.js +9 -45
  53. package/dist/local.js.map +1 -1
  54. package/dist/loop-matches.d.ts +28 -0
  55. package/dist/loop-matches.d.ts.map +1 -0
  56. package/dist/loop-matches.js +74 -0
  57. package/dist/loop-matches.js.map +1 -0
  58. package/dist/operator/attempt.d.ts +76 -10
  59. package/dist/operator/attempt.d.ts.map +1 -1
  60. package/dist/operator/attempt.js +69 -11
  61. package/dist/operator/attempt.js.map +1 -1
  62. package/dist/operator/board.d.ts +48 -16
  63. package/dist/operator/board.d.ts.map +1 -1
  64. package/dist/operator/board.js +48 -17
  65. package/dist/operator/board.js.map +1 -1
  66. package/dist/operator/configuration.d.ts +314 -0
  67. package/dist/operator/configuration.d.ts.map +1 -0
  68. package/dist/operator/configuration.js +490 -0
  69. package/dist/operator/configuration.js.map +1 -0
  70. package/dist/operator/desk.d.ts +206 -0
  71. package/dist/operator/desk.d.ts.map +1 -0
  72. package/dist/operator/desk.js +525 -0
  73. package/dist/operator/desk.js.map +1 -0
  74. package/dist/operator/github-changes.d.ts +88 -0
  75. package/dist/operator/github-changes.d.ts.map +1 -0
  76. package/dist/operator/github-changes.js +266 -0
  77. package/dist/operator/github-changes.js.map +1 -0
  78. package/dist/operator/http.d.ts +135 -105
  79. package/dist/operator/http.d.ts.map +1 -1
  80. package/dist/operator/http.js +155 -30
  81. package/dist/operator/http.js.map +1 -1
  82. package/dist/operator/machines.d.ts +71 -0
  83. package/dist/operator/machines.d.ts.map +1 -0
  84. package/dist/operator/machines.js +103 -0
  85. package/dist/operator/machines.js.map +1 -0
  86. package/dist/operator/need.d.ts +58 -11
  87. package/dist/operator/need.d.ts.map +1 -1
  88. package/dist/operator/need.js +61 -9
  89. package/dist/operator/need.js.map +1 -1
  90. package/dist/operator/operator.d.ts +135 -29
  91. package/dist/operator/operator.d.ts.map +1 -1
  92. package/dist/operator/operator.js +370 -63
  93. package/dist/operator/operator.js.map +1 -1
  94. package/dist/operator/overview.d.ts +7 -7
  95. package/dist/operator/overview.d.ts.map +1 -1
  96. package/dist/operator/overview.js +5 -5
  97. package/dist/operator/overview.js.map +1 -1
  98. package/dist/operator/projection.d.ts +56 -5
  99. package/dist/operator/projection.d.ts.map +1 -1
  100. package/dist/operator/projection.js +108 -9
  101. package/dist/operator/projection.js.map +1 -1
  102. package/dist/operator/run.d.ts +101 -6
  103. package/dist/operator/run.d.ts.map +1 -1
  104. package/dist/operator/run.js +100 -7
  105. package/dist/operator/run.js.map +1 -1
  106. package/dist/operator/statistics/cache.d.ts +7 -0
  107. package/dist/operator/statistics/cache.d.ts.map +1 -0
  108. package/dist/operator/statistics/cache.js +40 -0
  109. package/dist/operator/statistics/cache.js.map +1 -0
  110. package/dist/operator/statistics/runs.d.ts +36 -0
  111. package/dist/operator/statistics/runs.d.ts.map +1 -0
  112. package/dist/operator/statistics/runs.js +284 -0
  113. package/dist/operator/statistics/runs.js.map +1 -0
  114. package/dist/operator/statistics/statistics.d.ts +20 -0
  115. package/dist/operator/statistics/statistics.d.ts.map +1 -0
  116. package/dist/operator/statistics/statistics.js +138 -0
  117. package/dist/operator/statistics/statistics.js.map +1 -0
  118. package/dist/operator/statistics/tasks.d.ts +30 -0
  119. package/dist/operator/statistics/tasks.d.ts.map +1 -0
  120. package/dist/operator/statistics/tasks.js +244 -0
  121. package/dist/operator/statistics/tasks.js.map +1 -0
  122. package/dist/operator/statistics/view.d.ts +302 -0
  123. package/dist/operator/statistics/view.d.ts.map +1 -0
  124. package/dist/operator/statistics/view.js +243 -0
  125. package/dist/operator/statistics/view.js.map +1 -0
  126. package/dist/operator/statistics/window.d.ts +24 -0
  127. package/dist/operator/statistics/window.d.ts.map +1 -0
  128. package/dist/operator/statistics/window.js +47 -0
  129. package/dist/operator/statistics/window.js.map +1 -0
  130. package/dist/operator/task.d.ts +94 -0
  131. package/dist/operator/task.d.ts.map +1 -0
  132. package/dist/operator/task.js +204 -0
  133. package/dist/operator/task.js.map +1 -0
  134. package/dist/operator/transcript.d.ts +12 -12
  135. package/dist/operator/transcript.d.ts.map +1 -1
  136. package/dist/operator/transcript.js +11 -9
  137. package/dist/operator/transcript.js.map +1 -1
  138. package/dist/operator/usage.d.ts +103 -0
  139. package/dist/operator/usage.d.ts.map +1 -0
  140. package/dist/operator/usage.js +234 -0
  141. package/dist/operator/usage.js.map +1 -0
  142. package/dist/orchestrator.d.ts +8 -5
  143. package/dist/orchestrator.d.ts.map +1 -1
  144. package/dist/orchestrator.js +4 -2
  145. package/dist/orchestrator.js.map +1 -1
  146. package/dist/polling/closed-item-asks.d.ts +8 -0
  147. package/dist/polling/closed-item-asks.d.ts.map +1 -0
  148. package/dist/polling/closed-item-asks.js +28 -0
  149. package/dist/polling/closed-item-asks.js.map +1 -0
  150. package/dist/polling/cycle.d.ts +28 -10
  151. package/dist/polling/cycle.d.ts.map +1 -1
  152. package/dist/polling/cycle.js +20 -6
  153. package/dist/polling/cycle.js.map +1 -1
  154. package/dist/polling/evaluation-failures.d.ts +42 -0
  155. package/dist/polling/evaluation-failures.d.ts.map +1 -0
  156. package/dist/polling/evaluation-failures.js +103 -0
  157. package/dist/polling/evaluation-failures.js.map +1 -0
  158. package/dist/polling/hints.d.ts +2 -2
  159. package/dist/polling/hints.d.ts.map +1 -1
  160. package/dist/polling/hints.js +2 -2
  161. package/dist/polling/hints.js.map +1 -1
  162. package/dist/polling/loop-evaluation.d.ts +21 -11
  163. package/dist/polling/loop-evaluation.d.ts.map +1 -1
  164. package/dist/polling/loop-evaluation.js +70 -27
  165. package/dist/polling/loop-evaluation.js.map +1 -1
  166. package/dist/polling/open-issues.d.ts +23 -0
  167. package/dist/polling/open-issues.d.ts.map +1 -0
  168. package/dist/polling/open-issues.js +77 -0
  169. package/dist/polling/open-issues.js.map +1 -0
  170. package/dist/polling/open-pull-requests.d.ts +28 -0
  171. package/dist/polling/open-pull-requests.d.ts.map +1 -0
  172. package/dist/polling/open-pull-requests.js +131 -0
  173. package/dist/polling/open-pull-requests.js.map +1 -0
  174. package/dist/polling/polling.d.ts +20 -11
  175. package/dist/polling/polling.d.ts.map +1 -1
  176. package/dist/polling/polling.js +215 -52
  177. package/dist/polling/polling.js.map +1 -1
  178. package/dist/polling/repository-sync.d.ts +21 -14
  179. package/dist/polling/repository-sync.d.ts.map +1 -1
  180. package/dist/polling/repository-sync.js +35 -28
  181. package/dist/polling/repository-sync.js.map +1 -1
  182. package/dist/polling-triggers.d.ts +1 -1
  183. package/dist/polling-triggers.d.ts.map +1 -1
  184. package/dist/polling-triggers.js +1 -1
  185. package/dist/polling-triggers.js.map +1 -1
  186. package/dist/reloads.d.ts +14 -0
  187. package/dist/reloads.d.ts.map +1 -0
  188. package/dist/reloads.js +7 -0
  189. package/dist/reloads.js.map +1 -0
  190. package/dist/runtime.d.ts +24 -0
  191. package/dist/runtime.d.ts.map +1 -0
  192. package/dist/runtime.js +58 -0
  193. package/dist/runtime.js.map +1 -0
  194. package/dist/schedule-triggers.d.ts +14 -10
  195. package/dist/schedule-triggers.d.ts.map +1 -1
  196. package/dist/schedule-triggers.js +36 -31
  197. package/dist/schedule-triggers.js.map +1 -1
  198. package/dist/scheduler.d.ts +45 -5
  199. package/dist/scheduler.d.ts.map +1 -1
  200. package/dist/scheduler.js +587 -44
  201. package/dist/scheduler.js.map +1 -1
  202. package/dist/ssh.d.ts +103 -0
  203. package/dist/ssh.d.ts.map +1 -0
  204. package/dist/ssh.js +144 -0
  205. package/dist/ssh.js.map +1 -0
  206. package/dist/trigger-condition.d.ts +12 -0
  207. package/dist/trigger-condition.d.ts.map +1 -0
  208. package/dist/trigger-condition.js +88 -0
  209. package/dist/trigger-condition.js.map +1 -0
  210. package/dist/trigger-submission.d.ts +16 -13
  211. package/dist/trigger-submission.d.ts.map +1 -1
  212. package/dist/trigger-submission.js +19 -14
  213. package/dist/trigger-submission.js.map +1 -1
  214. package/dist/worker-engine.d.ts +13 -0
  215. package/dist/worker-engine.d.ts.map +1 -0
  216. package/dist/worker-engine.js +56 -0
  217. package/dist/worker-engine.js.map +1 -0
  218. package/dist/worker-status.d.ts +140 -0
  219. package/dist/worker-status.d.ts.map +1 -0
  220. package/dist/worker-status.js +76 -0
  221. package/dist/worker-status.js.map +1 -0
  222. package/package.json +47 -22
@@ -0,0 +1,266 @@
1
+ import { LaneName } from "@usine/config/board";
2
+ import { canonicalLabelName, GitHubLabelName } from "@usine/config/label";
3
+ import { AttemptId, AttemptWindow, windowHolds, windowOf } from "@usine/core/attempt";
4
+ import { BoardMoves } from "@usine/engine/board-moves";
5
+ import { RunReader } from "@usine/engine/run-reader";
6
+ import { TranscriptPageQuery } from "@usine/engine/transcript";
7
+ import { GitHubItemHistory, ReviewState, } from "@usine/github/item-history";
8
+ import { Clock, Context, DateTime, Effect, Layer, Match, Option, Ref, Schema } from "effect";
9
+ import { GitHubItemKey } from "../polling/repository-sync.js";
10
+ import { LabelView } from "./board.js";
11
+ /**
12
+ * A label that an Attempt's Agent added to the Run's Item, with GitHub's current label definition.
13
+ */
14
+ export class LabelAddedView extends Schema.TaggedClass("@usine/orchestrator/LabelAddedView")("LabelAdded", { at: Schema.String, label: LabelView }) {
15
+ }
16
+ /**
17
+ * A label that an Attempt's Agent removed from the Run's Item, with GitHub's current label
18
+ * definition.
19
+ */
20
+ export class LabelRemovedView extends Schema.TaggedClass("@usine/orchestrator/LabelRemovedView")("LabelRemoved", { at: Schema.String, label: LabelView }) {
21
+ }
22
+ /** A comment that an Attempt's Agent posted on the Run's Item. */
23
+ export class CommentedView extends Schema.TaggedClass("@usine/orchestrator/CommentedView")("Commented", { at: Schema.String, url: Schema.String }) {
24
+ }
25
+ /** A review that an Attempt's Agent submitted on the Run's pull request, with its current state. */
26
+ export class ReviewedView extends Schema.TaggedClass("@usine/orchestrator/ReviewedView")("Reviewed", { at: Schema.String, url: Schema.String, state: ReviewState }) {
27
+ }
28
+ /**
29
+ * An operator move of the Run's Item between Board lanes during an Attempt. `at` is when the
30
+ * operator made the move.
31
+ */
32
+ export class BoardMovedView extends Schema.TaggedClass("@usine/orchestrator/BoardMovedView")("BoardMoved", { at: Schema.String, fromLane: LaneName, toLane: LaneName }) {
33
+ }
34
+ /**
35
+ * A change on the Run's GitHub Item during an Attempt: one made by the Agent, or an operator Board
36
+ * move.
37
+ */
38
+ export const GitHubChangeView = Schema.Union([
39
+ LabelAddedView,
40
+ LabelRemovedView,
41
+ CommentedView,
42
+ ReviewedView,
43
+ BoardMovedView,
44
+ ]);
45
+ /** The changes on the Run's GitHub Item during one Attempt, oldest first. */
46
+ export class AttemptGitHubChangesView extends Schema.Class("@usine/orchestrator/AttemptGitHubChangesView")({ attemptId: AttemptId, changes: Schema.Array(GitHubChangeView) }) {
47
+ }
48
+ /**
49
+ * The GitHub changes of each of a Run's Attempts, in Attempt order. Empty for a Run without a
50
+ * GitHub Item, such as a schedule Run.
51
+ */
52
+ export class RunGitHubChangesView extends Schema.Class("@usine/orchestrator/RunGitHubChangesView")({ attempts: Schema.Array(AttemptGitHubChangesView) }) {
53
+ }
54
+ /** The maximum number of ended Attempts whose changes are cached; the oldest are evicted first. */
55
+ const CACHE_CAPACITY = 1_000;
56
+ /**
57
+ * The time after an Attempt ends before its changes are cached, since GitHub's timeline can trail a
58
+ * write by seconds.
59
+ */
60
+ const SETTLE_MILLIS = 60_000;
61
+ /**
62
+ * The maximum lag of GitHub's clock behind the orchestrator's when recording a Board move's label
63
+ * change.
64
+ */
65
+ const CLOCK_SKEW_MILLIS = 1_000;
66
+ /** The maximum time after a Board move is recorded for all its label writes to appear on GitHub. */
67
+ const MOVE_SPAN_MILLIS = 10_000;
68
+ /**
69
+ * Assigns each change to the one Attempt whose window contains it. A change inside two Attempts'
70
+ * windows is assigned to neither, since every Agent writes as the same App.
71
+ */
72
+ const attribute = (windows, changes) => {
73
+ const attributed = new Map();
74
+ const ambiguous = [];
75
+ for (const change of changes) {
76
+ const holders = windows.filter((window) => windowHolds(window, change.at));
77
+ const [holder, ...others] = holders;
78
+ if (holder === undefined)
79
+ continue;
80
+ if (others.length > 0) {
81
+ ambiguous.push(change);
82
+ continue;
83
+ }
84
+ attributed.set(holder.attemptId, [...(attributed.get(holder.attemptId) ?? []), change]);
85
+ }
86
+ return { attributed, ambiguous };
87
+ };
88
+ /**
89
+ * Whether `move` made this label change: same label and direction, recorded between the move time
90
+ * minus clock skew and the end of the move's span.
91
+ */
92
+ const madeBy = (change) => (move) => {
93
+ const recorded = DateTime.toEpochMillis(move.at);
94
+ const earliest = recorded - CLOCK_SKEW_MILLIS;
95
+ const at = DateTime.toEpochMillis(change.at);
96
+ const name = canonicalLabelName(change.label.name);
97
+ return (earliest - (earliest % 1_000) <= at &&
98
+ at <= recorded + MOVE_SPAN_MILLIS &&
99
+ (change._tag === "LabelAdded" ? move.added : move.removed).some((label) => canonicalLabelName(label) === name));
100
+ };
101
+ /**
102
+ * Splits the App's changes into the Board moves that made some of them and the remaining changes.
103
+ * Drops moves with no change on the timeline, such as writes GitHub refused.
104
+ */
105
+ const separateBoardMoves = (moves, changes) => {
106
+ const made = new Set();
107
+ const rest = [];
108
+ for (const change of changes) {
109
+ const move = change._tag === "LabelAdded" || change._tag === "LabelRemoved"
110
+ ? moves.find(madeBy(change))
111
+ : undefined;
112
+ if (move === undefined)
113
+ rest.push(change);
114
+ else
115
+ made.add(move);
116
+ }
117
+ return { moves: moves.filter((move) => made.has(move)), rest };
118
+ };
119
+ const labelView = (label) => new LabelView({
120
+ name: GitHubLabelName.make(label.name),
121
+ color: label.color,
122
+ description: Option.getOrNull(label.description),
123
+ });
124
+ const changeView = (change) => Match.valueTags(change, {
125
+ LabelAdded: ({ at, label }) => new LabelAddedView({ at: DateTime.formatIso(at), label: labelView(label) }),
126
+ LabelRemoved: ({ at, label }) => new LabelRemovedView({ at: DateTime.formatIso(at), label: labelView(label) }),
127
+ Commented: ({ at, url }) => new CommentedView({ at: DateTime.formatIso(at), url }),
128
+ Reviewed: ({ at, url, state }) => new ReviewedView({ at: DateTime.formatIso(at), url, state }),
129
+ });
130
+ const moveView = (move) => new BoardMovedView({
131
+ at: DateTime.formatIso(move.at),
132
+ fromLane: LaneName.make(move.fromLane),
133
+ toLane: LaneName.make(move.toLane),
134
+ });
135
+ const makeRunGitHubChanges = Effect.gen(function* () {
136
+ const reader = yield* RunReader;
137
+ const history = yield* GitHubItemHistory;
138
+ const boardMoves = yield* BoardMoves;
139
+ const cache = yield* Ref.make(new Map());
140
+ // Attempts that ended before end times were recorded end at their last transcript row.
141
+ const windowFor = Effect.fn("RunGitHubChanges.windowFor")(function* (attempt) {
142
+ const recorded = windowOf(attempt);
143
+ if (Option.isSome(recorded))
144
+ return recorded;
145
+ const [last] = yield* reader.transcript(new TranscriptPageQuery({ attemptId: attempt.id, before: Option.none(), limit: 1 }));
146
+ if (last === undefined) {
147
+ yield* Effect.logInfo("An ended Attempt has neither an end time nor a transcript; no GitHub change is placed in it", { attemptId: attempt.id });
148
+ return Option.none();
149
+ }
150
+ return Option.some(new AttemptWindow({
151
+ attemptId: attempt.id,
152
+ startedAt: attempt.startedAt,
153
+ endedAt: Option.some(last.receivedAt),
154
+ }));
155
+ });
156
+ const read = Effect.fn("RunGitHubChanges.read")(function* (runId) {
157
+ yield* Effect.annotateCurrentSpan({ runId });
158
+ const snapshot = yield* reader.inspect(runId);
159
+ const item = Schema.decodeOption(GitHubItemKey)(snapshot.itemKey);
160
+ if (Option.isNone(item)) {
161
+ yield* Effect.logDebug("The Run has no GitHub Item, so it has no GitHub changes", { runId });
162
+ return new RunGitHubChangesView({ attempts: [] });
163
+ }
164
+ const [, , number] = item.value;
165
+ const repository = snapshot.repository;
166
+ yield* Effect.annotateCurrentSpan({ repository, item: number });
167
+ const view = (changes) => new RunGitHubChangesView({
168
+ attempts: snapshot.attempts.map(({ id }) => new AttemptGitHubChangesView({ attemptId: id, changes: changes.get(id) ?? [] })),
169
+ });
170
+ const cached = yield* Ref.get(cache);
171
+ const missing = snapshot.attempts.filter(({ id }) => !cached.has(id));
172
+ if (missing.length === 0) {
173
+ yield* Effect.logDebug("Served the Run's GitHub changes from the Attempt cache", {
174
+ runId,
175
+ attempts: snapshot.attempts.length,
176
+ });
177
+ return view(cached);
178
+ }
179
+ const itemRuns = yield* reader.forItems([snapshot.itemKey]);
180
+ const onItem = new Map([...itemRuns.flatMap(({ attempts }) => attempts), ...snapshot.attempts].map((attempt) => [
181
+ attempt.id,
182
+ attempt,
183
+ ]));
184
+ const windows = (yield* Effect.forEach([...onItem.values()], windowFor)).flatMap(Option.toArray);
185
+ const now = yield* Clock.currentTimeMillis;
186
+ const fresh = new Map();
187
+ const settled = [];
188
+ const placeable = missing.flatMap((attempt) => {
189
+ const window = windows.find(({ attemptId }) => attemptId === attempt.id);
190
+ if (window !== undefined)
191
+ return [window];
192
+ fresh.set(attempt.id, []);
193
+ settled.push(attempt.id);
194
+ return [];
195
+ });
196
+ if (placeable.length > 0) {
197
+ const earliest = Math.min(...placeable.map(({ startedAt }) => DateTime.toEpochMillis(startedAt)));
198
+ const since = DateTime.makeUnsafe(earliest - (earliest % 1_000));
199
+ // A move recorded shortly before the earliest window can still appear in it.
200
+ const [changes, recorded] = yield* Effect.all([
201
+ history.appChanges(repository, number, since),
202
+ boardMoves.onItem(snapshot.itemKey, DateTime.subtract(since, { milliseconds: MOVE_SPAN_MILLIS })),
203
+ ], { concurrency: "unbounded" });
204
+ const { moves, rest } = separateBoardMoves(recorded, changes);
205
+ const { attributed, ambiguous } = attribute(windows, rest);
206
+ if (ambiguous.length > 0)
207
+ yield* Effect.logInfo("Left out GitHub changes that overlapping Attempts on the Item could each have made", {
208
+ runId,
209
+ repository,
210
+ item: number,
211
+ changes: ambiguous.length,
212
+ at: ambiguous.map(({ at }) => DateTime.formatIso(at)).join(", "),
213
+ });
214
+ for (const window of placeable) {
215
+ const own = [
216
+ ...(attributed.get(window.attemptId) ?? []).map((change) => ({
217
+ at: DateTime.toEpochMillis(change.at),
218
+ view: changeView(change),
219
+ })),
220
+ ...moves.flatMap((move) => {
221
+ const at = DateTime.toEpochMillis(move.at);
222
+ const during = DateTime.toEpochMillis(window.startedAt) <= at &&
223
+ Option.match(window.endedAt, {
224
+ onNone: () => true,
225
+ onSome: (last) => at <= DateTime.toEpochMillis(last),
226
+ });
227
+ return during ? [{ at, view: moveView(move) }] : [];
228
+ }),
229
+ ];
230
+ fresh.set(window.attemptId, own.sort((left, right) => left.at - right.at).map(({ view }) => view));
231
+ if (Option.isSome(window.endedAt) &&
232
+ now - DateTime.toEpochMillis(window.endedAt.value) >= SETTLE_MILLIS)
233
+ settled.push(window.attemptId);
234
+ }
235
+ yield* Effect.logInfo("Read the App's GitHub changes on a Run's Item", {
236
+ runId,
237
+ repository,
238
+ item: number,
239
+ since: DateTime.formatIso(since),
240
+ appChanges: changes.length,
241
+ boardMoves: recorded.length,
242
+ boardMoveChanges: changes.length - rest.length,
243
+ placed: placeable.reduce((count, { attemptId }) => count + (attributed.get(attemptId)?.length ?? 0), 0),
244
+ cachedAttempts: settled.length,
245
+ });
246
+ }
247
+ const merged = yield* Ref.updateAndGet(cache, (current) => {
248
+ const next = new Map(current);
249
+ for (const attemptId of settled)
250
+ next.set(attemptId, fresh.get(attemptId) ?? []);
251
+ for (const oldest of [...next.keys()].slice(0, Math.max(0, next.size - CACHE_CAPACITY)))
252
+ next.delete(oldest);
253
+ return next;
254
+ });
255
+ return view(new Map([...merged, ...fresh]));
256
+ });
257
+ return { read };
258
+ });
259
+ /**
260
+ * Reads the Agent's label, comment, and review changes and the operator's Board moves on the Run's
261
+ * GitHub Item during each Attempt. Label changes made by a recorded Board move are the operator's.
262
+ */
263
+ export class RunGitHubChanges extends Context.Service()("@usine/orchestrator/RunGitHubChanges") {
264
+ static layer = Layer.effect(RunGitHubChanges, makeRunGitHubChanges);
265
+ }
266
+ //# sourceMappingURL=github-changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-changes.js","sourceRoot":"","sources":["../../src/operator/github-changes.ts"],"names":[],"mappings":"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"}