@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
package/dist/board/projection.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { GitHubLabelName } from "@usine/config/label";
|
|
2
|
-
import { LabelLaneSource, Lane, LaneName, } from "@usine/config/board";
|
|
1
|
+
import { canonicalLabelName, GitHubLabelName } from "@usine/config/label";
|
|
2
|
+
import { isSettledItemState, LabelLaneSource, Lane, LaneName, } from "@usine/config/board";
|
|
3
3
|
import { ItemKey } from "@usine/core/item";
|
|
4
4
|
import { ItemLabelMutation } from "@usine/github/item-writer";
|
|
5
|
-
import { Effect, Result } from "effect";
|
|
5
|
+
import { Effect, Option, Result } from "effect";
|
|
6
6
|
import { BoardTaskView, BoardLaneId, BoardProjectionError, BoardView, ReadOnlyBoardLaneView, WritableBoardLaneView, } from "../operator/board.js";
|
|
7
7
|
import {} from "../operator/run.js";
|
|
8
|
-
import { projectedItem } from "./items.js";
|
|
8
|
+
import { payloadLabels, projectedItem } from "./items.js";
|
|
9
9
|
import { taskCards } from "./tasks.js";
|
|
10
10
|
const labelSources = (sources) => sources.flatMap((source) => ("label" in source ? [source.label] : []));
|
|
11
11
|
const stateSources = (sources) => sources.flatMap((source) => ("state" in source ? [source.state] : []));
|
|
@@ -25,14 +25,58 @@ const effectiveLanes = (repository, repositoryLabels) => repository.lanes.length
|
|
|
25
25
|
? repository.lanes.map((lane) => ({ lane, origin: "authored" }))
|
|
26
26
|
: proposedLanes(repositoryLabels);
|
|
27
27
|
const laneId = (definition) => BoardLaneId.make(`${definition.origin}:${definition.lane.name}`);
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
const
|
|
28
|
+
// GitHub matches label names ignoring case, as the label declarations do.
|
|
29
|
+
const labelLaneFor = (item, lanes) => {
|
|
30
|
+
const itemLabels = new Set(item.labels.map(canonicalLabelName));
|
|
31
|
+
return lanes.find(({ lane }) => labelSources(lane.sources).some((label) => itemLabels.has(canonicalLabelName(label))));
|
|
32
|
+
};
|
|
31
33
|
const stateLaneFor = (item, lanes) => lanes.find(({ lane }) => stateSources(lane.sources).includes(item.state));
|
|
32
|
-
const laneFor = (item, lanes) =>
|
|
34
|
+
const laneFor = (item, lanes) => isSettledItemState(item.state)
|
|
33
35
|
? stateLaneFor(item, lanes)
|
|
34
36
|
: (labelLaneFor(item, lanes) ?? stateLaneFor(item, lanes));
|
|
35
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Returns the lane of a card whose newest open Run is `running`: the label lane that the current
|
|
39
|
+
* Item's labels match, else the label lane that the labels of the Run's Event match. Returns
|
|
40
|
+
* `undefined` if the current Item is closed or merged, or if neither set of labels matches a lane.
|
|
41
|
+
*/
|
|
42
|
+
const runningLaneFor = Effect.fn("Board.runningLane")(function* (repository, view, running, lanes, runEvents) {
|
|
43
|
+
const fields = {
|
|
44
|
+
repository: repository.name,
|
|
45
|
+
itemKey: view.itemKey,
|
|
46
|
+
runId: running.id,
|
|
47
|
+
loop: running.loop,
|
|
48
|
+
};
|
|
49
|
+
yield* Effect.annotateCurrentSpan(fields);
|
|
50
|
+
if (isSettledItemState(view.state))
|
|
51
|
+
return undefined;
|
|
52
|
+
const current = labelLaneFor(view, lanes);
|
|
53
|
+
if (current !== undefined) {
|
|
54
|
+
yield* Effect.logDebug("Placing the running card in the lane its Item's labels match", {
|
|
55
|
+
...fields,
|
|
56
|
+
lane: current.lane.name,
|
|
57
|
+
});
|
|
58
|
+
return current;
|
|
59
|
+
}
|
|
60
|
+
const event = runEvents.get(running.id);
|
|
61
|
+
if (event === undefined) {
|
|
62
|
+
yield* Effect.logDebug("No Event read for the card's running Run; placing it by its Item's state", fields);
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const labels = yield* payloadLabels(view.kind, event.payload).pipe(Effect.map(Option.some), Effect.catch((error) => Effect.logWarning("The running Run's Event has no labels to read; placing its card by its Item's state", { ...fields, eventId: event.id, errorTag: error._tag, message: error.message }).pipe(Effect.as(Option.none()))));
|
|
66
|
+
if (Option.isNone(labels))
|
|
67
|
+
return undefined;
|
|
68
|
+
const lane = labelLaneFor({ labels: labels.value }, lanes);
|
|
69
|
+
yield* Effect.logDebug(lane === undefined
|
|
70
|
+
? "No lane label when the card's running Run was triggered; placing it by its Item's state"
|
|
71
|
+
: "Keeping the card in the lane its running Run was triggered from", { ...fields, lane: lane?.lane.name ?? "none" });
|
|
72
|
+
return lane;
|
|
73
|
+
});
|
|
74
|
+
/**
|
|
75
|
+
* Groups the repository's stored Items into Task cards and the cards into lanes. A card with a
|
|
76
|
+
* running Run goes to the label lane that its current Item's labels match. If none matches, the
|
|
77
|
+
* card stays in the lane its Run's trigger matched, read from `runEvents`.
|
|
78
|
+
*/
|
|
79
|
+
export const projectBoard = Effect.fn("Board.project")((repository, repositoryLabels, storedItems, runs, cycleBlockedItems = [], itemLoops = new Map(), runUsage = new Map(), runEvents = new Map()) => Effect.gen(function* () {
|
|
36
80
|
yield* Effect.annotateCurrentSpan({ repository: repository.name });
|
|
37
81
|
const results = yield* Effect.forEach(storedItems, (item) => projectedItem(item).pipe(Effect.result));
|
|
38
82
|
const items = [];
|
|
@@ -51,23 +95,28 @@ export const projectBoard = Effect.fn("Board.project")((repository, repositoryLa
|
|
|
51
95
|
});
|
|
52
96
|
}
|
|
53
97
|
const lanes = effectiveLanes(repository, repositoryLabels);
|
|
54
|
-
const cards = taskCards(repository.name, items, runs, cycleBlockedItems);
|
|
98
|
+
const cards = taskCards(repository.name, items, runs, cycleBlockedItems, itemLoops, runUsage);
|
|
55
99
|
yield* Effect.logDebug("Projected Task cards from linked Items", {
|
|
56
100
|
repository: repository.name,
|
|
57
101
|
items: items.length,
|
|
58
102
|
tasks: cards.length,
|
|
59
103
|
runs: runs.length,
|
|
104
|
+
watchedTasks: cards.filter(({ view }) => view.loops.length > 0).length,
|
|
105
|
+
runningTasks: cards.filter(({ running }) => running !== undefined).length,
|
|
60
106
|
});
|
|
61
107
|
const grouped = new Map();
|
|
62
108
|
for (const definition of lanes)
|
|
63
109
|
grouped.set(laneId(definition), []);
|
|
64
110
|
const unmatched = [];
|
|
65
|
-
for (const
|
|
66
|
-
const
|
|
111
|
+
for (const { view, running } of cards) {
|
|
112
|
+
const runningLane = running === undefined
|
|
113
|
+
? undefined
|
|
114
|
+
: yield* runningLaneFor(repository, view, running, lanes, runEvents);
|
|
115
|
+
const definition = runningLane ?? laneFor(view, lanes);
|
|
67
116
|
if (definition === undefined)
|
|
68
|
-
unmatched.push(
|
|
117
|
+
unmatched.push(view);
|
|
69
118
|
else
|
|
70
|
-
grouped.get(laneId(definition))?.push(
|
|
119
|
+
grouped.get(laneId(definition))?.push(view);
|
|
71
120
|
}
|
|
72
121
|
const sortItems = (values) => values.sort((left, right) => right.number - left.number);
|
|
73
122
|
return new BoardView({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/board/projection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/board/projection.ts"],"names":[],"mappings":"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"}
|
package/dist/board/tasks.d.ts
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
import type { ItemKey } from "@usine/core/item";
|
|
2
|
+
import type { LoopName } from "@usine/core/loop";
|
|
2
3
|
import { type RepositoryName } from "@usine/core/repository";
|
|
4
|
+
import type { RunId } from "@usine/core/run";
|
|
3
5
|
import { BoardTaskView } from "../operator/board.ts";
|
|
4
6
|
import type { RunView } from "../operator/run.ts";
|
|
5
|
-
import type
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
import { type RunUsageView } from "../operator/usage.ts";
|
|
8
|
+
import { type ProjectedItem } from "./items.ts";
|
|
9
|
+
/** A Task card and the running Run that sets its lane. */
|
|
10
|
+
export interface TaskCard {
|
|
11
|
+
readonly view: BoardTaskView;
|
|
12
|
+
/** The Task's newest open Run once an Attempt has started, on the card's current Item. */
|
|
13
|
+
readonly running: RunView | undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Joins explicit issue and pull request relationships into Task cards, without stored Task
|
|
17
|
+
* identities (ADR 0024). Each card includes its running Run, which sets its Board lane.
|
|
18
|
+
*/
|
|
19
|
+
export declare const taskCards: (repository: RepositoryName, items: ReadonlyArray<ProjectedItem>, runs: ReadonlyArray<RunView>, cycleBlockedItems: ReadonlyArray<ItemKey>, itemLoops: ReadonlyMap<ItemKey, ReadonlyArray<LoopName>>, runUsage: ReadonlyMap<RunId, RunUsageView>) => ReadonlyArray<TaskCard>;
|
|
8
20
|
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/board/tasks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/board/tasks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAuC,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,KAAK,YAAY,EAAa,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,KAAK,aAAa,EAAqB,MAAM,YAAY,CAAC;AAYnE,0DAA0D;AAC1D,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,0FAA0F;IAC1F,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;CACvC;AAYD;;;GAGG;AACH,eAAO,MAAM,SAAS,eACR,cAAc,SACnB,aAAa,CAAC,aAAa,CAAC,QAC7B,aAAa,CAAC,OAAO,CAAC,qBACT,aAAa,CAAC,OAAO,CAAC,aAC9B,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,YAC9C,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,KACzC,aAAa,CAAC,QAAQ,CAmGxB,CAAC"}
|
package/dist/board/tasks.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { isSettledItemState } from "@usine/config/board";
|
|
1
2
|
import { canonicalRepositoryName } from "@usine/core/repository";
|
|
2
3
|
import { Array as EffectArray, Option, Order, Schema } from "effect";
|
|
3
|
-
import { BoardItemLink, BoardTaskView } from "../operator/board.js";
|
|
4
|
+
import { BoardItemLink, BoardPullRequestView, BoardTaskView } from "../operator/board.js";
|
|
5
|
+
import { taskUsage } from "../operator/usage.js";
|
|
6
|
+
import { runNeedsAttention } from "./items.js";
|
|
4
7
|
const decodeUrl = Schema.decodeUnknownOption(Schema.URLFromString);
|
|
5
8
|
const itemLink = (item) => new BoardItemLink({
|
|
6
9
|
itemKey: item.itemKey,
|
|
@@ -8,9 +11,13 @@ const itemLink = (item) => new BoardItemLink({
|
|
|
8
11
|
number: item.number,
|
|
9
12
|
title: item.title,
|
|
10
13
|
url: item.url,
|
|
14
|
+
state: item.state,
|
|
11
15
|
});
|
|
12
|
-
/**
|
|
13
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Joins explicit issue and pull request relationships into Task cards, without stored Task
|
|
18
|
+
* identities (ADR 0024). Each card includes its running Run, which sets its Board lane.
|
|
19
|
+
*/
|
|
20
|
+
export const taskCards = (repository, items, runs, cycleBlockedItems, itemLoops, runUsage) => {
|
|
14
21
|
const runsByItem = EffectArray.groupBy(runs, ({ itemKey }) => itemKey);
|
|
15
22
|
const nodes = items.map((item) => ({
|
|
16
23
|
item,
|
|
@@ -68,18 +75,30 @@ export const taskCards = (repository, items, runs, cycleBlockedItems) => {
|
|
|
68
75
|
.sort(({ item: a }, { item: b }) => Number(b.state === "pr-open") - Number(a.state === "pr-open") || b.number - a.number);
|
|
69
76
|
// An open Run controls the lane. Between stages, a PR takes over from its issue.
|
|
70
77
|
const current = active?.item ?? prs[0]?.item ?? origin.item;
|
|
71
|
-
|
|
72
|
-
|
|
78
|
+
// Open pull requests sort first, so the first open or merged one is the open one or, without
|
|
79
|
+
// one, the newest merged one.
|
|
80
|
+
const [pullRequest = null] = prs.flatMap(({ item: { number, url, state } }) => state === "pr-open" || state === "pr-merged"
|
|
81
|
+
? [new BoardPullRequestView({ number, url, state })]
|
|
82
|
+
: []);
|
|
83
|
+
const preferred = history.find(({ item, run }) => runNeedsAttention(run, isSettledItemState(item.state))) ??
|
|
84
|
+
active ??
|
|
85
|
+
history[0];
|
|
86
|
+
const runs = history.map(({ run }) => run).reverse();
|
|
87
|
+
const view = new BoardTaskView({
|
|
73
88
|
...itemLink(current),
|
|
74
89
|
title: origin.item.title,
|
|
75
|
-
state: current.state,
|
|
76
90
|
labels: current.labels,
|
|
77
91
|
items: ordered.map(({ item }) => itemLink(item)),
|
|
78
|
-
|
|
92
|
+
pullRequest,
|
|
93
|
+
runs,
|
|
79
94
|
run: preferred?.run ?? null,
|
|
80
|
-
needsYou: history.some(({ run }) => run
|
|
95
|
+
needsYou: history.some(({ item, run }) => runNeedsAttention(run, isSettledItemState(item.state))) ||
|
|
81
96
|
members.some(({ item }) => blocked.has(item.itemKey)),
|
|
82
|
-
|
|
97
|
+
conflicting: current.conflicting,
|
|
98
|
+
loops: [...new Set(ordered.flatMap(({ item }) => itemLoops.get(item.itemKey) ?? []))],
|
|
99
|
+
usage: taskUsage(runs, runUsage),
|
|
100
|
+
});
|
|
101
|
+
cards.push({ view, running: active?.run.state === "Running" ? active.run : undefined });
|
|
83
102
|
}
|
|
84
103
|
return cards;
|
|
85
104
|
};
|
package/dist/board/tasks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/board/tasks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/board/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,EAAE,uBAAuB,EAAuB,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,EAAqB,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAsB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAiBnE,MAAM,QAAQ,GAAG,CAAC,IAAmB,EAAE,EAAE,CACvC,IAAI,aAAa,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC,OAAO;IACrB,IAAI,EAAE,IAAI,CAAC,IAAI;IACf,MAAM,EAAE,IAAI,CAAC,MAAM;IACnB,KAAK,EAAE,IAAI,CAAC,KAAK;IACjB,GAAG,EAAE,IAAI,CAAC,GAAG;IACb,KAAK,EAAE,IAAI,CAAC,KAAK;CAClB,CAAC,CAAC;AAEL;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,UAA0B,EAC1B,KAAmC,EACnC,IAA4B,EAC5B,iBAAyC,EACzC,SAAwD,EACxD,QAA0C,EACjB,EAAE;IAC3B,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAY,EAAE,CAAC,CAAC;QAC3C,IAAI;QACJ,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACpC,OAAO,EAAE,IAAI,GAAG,EAAE;KACnB,CAAC,CAAC,CAAC;IACJ,MAAM,cAAc,GAAG,IAAI,uBAAuB,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvE,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,KAAK;SACF,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC,CACjE,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,SAAS;QACzC,MAAM,IAAI,GAAG;YACX,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAC/B,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAC1C,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAChD;SACF,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY;gBAC1F,SAAS;YACX,2EAA2E;YAC3E,kEAAkE;YAClE,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9D,IAAI,EAAE,KAAK,SAAS;gBAAE,SAAS;YAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAY,CAAC;IACpC,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,OAAO,GAAwC,CAAC,IAAI,CAAC,CAAC;QAC5D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACrC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;oBAAE,SAAS;gBACnC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAC9B,OAAO,EACP,CAAC,EAAE,IAAI,EAAE,CAAC,EAAY,EAAE,EAAE,IAAI,EAAE,CAAC,EAAY,EAAE,EAAE,CAC/C,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAC5F,CAAC;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,OAAO;aACpB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;aAC/D,IAAI,CACH,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CACzB,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CACnE,CAAC;QACJ,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,OAAO;aAChB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;aACxC,IAAI,CACH,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAC3B,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CACvF,CAAC;QACJ,iFAAiF;QACjF,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5D,6FAA6F;QAC7F,8BAA8B;QAC9B,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAC5E,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW;YAC1C,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC,EAAE,CACP,CAAC;QACF,MAAM,SAAS,GACb,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACvF,MAAM;YACN,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,aAAa,CAAC;YAC7B,GAAG,QAAQ,CAAC,OAAO,CAAC;YACpB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAChD,WAAW;YACX,IAAI;YACJ,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,IAAI;YAC3B,QAAQ,EACN,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACvF,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvD,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACrF,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC;SACjC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { CloudflareWorker, UsineConfig } from "@usine/config/factory";
|
|
2
|
+
import type { BrainSpec } from "@usine/core/agent/brain";
|
|
3
|
+
import type { InstanceDirectory } from "@usine/core/instance";
|
|
4
|
+
import { ExecutorOperationError, WorkerCapabilityError } from "@usine/executor";
|
|
5
|
+
import { type CloudflareExecutorOptions } from "@usine/executor/cloudflare";
|
|
6
|
+
import { Effect, Layer } from "effect";
|
|
7
|
+
/** Returns the Cloudflare Workers that `usine.yaml` declares, in declared order. */
|
|
8
|
+
export declare const cloudflareWorkersOf: (config: UsineConfig) => ReadonlyArray<CloudflareWorker>;
|
|
9
|
+
/**
|
|
10
|
+
* Returns how the executor reaches each declared Cloudflare Worker, reading the Access service
|
|
11
|
+
* tokens and provider keys at startup.
|
|
12
|
+
*/
|
|
13
|
+
export declare const cloudflareWorkerAddressesOf: (config: UsineConfig) => Effect.Effect<{
|
|
14
|
+
name: string & import("effect/Brand").Brand<"WorkerName">;
|
|
15
|
+
workerUrl: URL;
|
|
16
|
+
accessClientId: import("effect/Redacted").Redacted<string>;
|
|
17
|
+
accessClientSecret: import("effect/Redacted").Redacted<string>;
|
|
18
|
+
image: string & import("effect/Brand").Brand<"CloudflareImageName">;
|
|
19
|
+
instanceType: "basic" | "lite" | "standard-1" | "standard-2" | "standard-3" | "standard-4";
|
|
20
|
+
providers: {
|
|
21
|
+
provider: "anthropic" | "openai";
|
|
22
|
+
apiKey: import("effect/Redacted").Redacted<string>;
|
|
23
|
+
}[];
|
|
24
|
+
}[], WorkerCapabilityError, never>;
|
|
25
|
+
/**
|
|
26
|
+
* Provides the full engine and `WorkerStatus` for Cloudflare Workers. The executor reads its
|
|
27
|
+
* Workers' secrets once, so a reload adds back only a Worker that `usine up` started with.
|
|
28
|
+
* Requires `CredentialProvider`, `GitHubApp`, `TriggerCondition`, `AttemptRuntime` (built before
|
|
29
|
+
* the engine), `ClaudeLoginLock`, and `CurrentInstance`.
|
|
30
|
+
*/
|
|
31
|
+
export declare const layer: (instanceDirectory: InstanceDirectory, config: UsineConfig, brains: ReadonlyArray<BrainSpec>, options: CloudflareExecutorOptions) => Layer.Layer<import("@usine/engine/board-moves").BoardMoves | import("@usine/engine/cursor").CursorStore | import("@usine/engine/cycle-budget").CycleBudgets | import("@usine/engine/item-projection").ItemProjectionReader | import("@usine/engine/item-projection").ItemProjectionWriter | import("@usine/engine/loop-control").LoopControl | import("@usine/engine/repository-label-projection").RepositoryLabelProjectionReader | import("@usine/engine/repository-label-projection").RepositoryLabelProjectionWriter | import("@usine/engine/engine").RunEngine | import("@usine/engine/run-reader").RunReader | import("@usine/engine/step-executor").StepExecutor | import("@usine/engine/engine").UnconfirmedStops | import("./worker-status.ts").WorkerStatus, import("@usine/engine/engine").AttemptCancellationError | import("@usine/executor").CredentialUnavailableError | import("@usine/engine/engine").EnginePersistenceError | ExecutorOperationError | import("@usine/engine/engine").RunInterventionRejectedError | import("@usine/engine/engine").RunNotFoundError | import("@usine/engine/engine").RunOperationRejectedError | import("@usine/engine/engine").RunRetryBlockedError | import("./scheduler.ts").UnsupportedWorkerError | WorkerCapabilityError, import("@usine/durable/attempt-runtime").AttemptRuntime | import("@usine/agents/runtime").ClaudeLoginLock | import("@usine/executor").CredentialProvider | import("./current-instance/current-instance.ts").CurrentInstance | import("@usine/github/github-app").GitHubApp | import("@usine/engine/trigger-condition").TriggerCondition>;
|
|
32
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../src/cloudflare.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EACL,KAAK,yBAAyB,EAG/B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAU,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAK/C,oFAAoF;AACpF,eAAO,MAAM,mBAAmB,WAAY,WAAW,KAAG,aAAa,CAAC,gBAAgB,CACK,CAAC;AAmC9F;;;GAGG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;kCAIvC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,KAAK,sBACG,iBAAiB,UAC5B,WAAW,UACX,aAAa,CAAC,SAAS,CAAC,WACvB,yBAAyB,giDA4BnC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { NodeServices } from "@effect/platform-node";
|
|
2
|
+
import { ExecutorOperationError, WorkerCapabilityError } from "@usine/executor";
|
|
3
|
+
import { layer as cloudflareExecutorLayer, } from "@usine/executor/cloudflare";
|
|
4
|
+
import { layer as localEngineLayer } from "@usine/engine/local-sqlite";
|
|
5
|
+
import { Config, Effect, Layer } from "effect";
|
|
6
|
+
import { externalHttpClientLayer } from "./http-client.js";
|
|
7
|
+
import { stepExecutorLayer } from "./scheduler.js";
|
|
8
|
+
import { withSshWorkerDiscard } from "./ssh.js";
|
|
9
|
+
/** Returns the Cloudflare Workers that `usine.yaml` declares, in declared order. */
|
|
10
|
+
export const cloudflareWorkersOf = (config) => config.workers.filter((worker) => worker.kind === "cloudflare");
|
|
11
|
+
/**
|
|
12
|
+
* Returns how the executor reaches `worker`, reading its Access service token and provider keys
|
|
13
|
+
* from the orchestrator's environment. Fails with a `credentials` capability error naming the
|
|
14
|
+
* first unset variable.
|
|
15
|
+
*/
|
|
16
|
+
const cloudflareWorkerAddressOf = (worker) => {
|
|
17
|
+
const variable = (name) => Config.Redacted(name).pipe(Effect.mapError((cause) => new WorkerCapabilityError({
|
|
18
|
+
worker: worker.name,
|
|
19
|
+
capability: "credentials",
|
|
20
|
+
message: `The orchestrator's environment has no ${name}, which cloudflare worker "${worker.name}" names in usine.yaml. Set it and restart usine up.`,
|
|
21
|
+
cause,
|
|
22
|
+
})));
|
|
23
|
+
return Effect.gen(function* () {
|
|
24
|
+
return {
|
|
25
|
+
name: worker.name,
|
|
26
|
+
workerUrl: worker.workerUrl,
|
|
27
|
+
accessClientId: yield* variable(worker.accessClientIdEnv),
|
|
28
|
+
accessClientSecret: yield* variable(worker.accessClientSecretEnv),
|
|
29
|
+
image: worker.image,
|
|
30
|
+
instanceType: worker.instanceType,
|
|
31
|
+
providers: yield* Effect.forEach(worker.llmProviders, ({ provider, apiKeyEnv }) => Effect.map(variable(apiKeyEnv), (apiKey) => ({ provider, apiKey }))),
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Returns how the executor reaches each declared Cloudflare Worker, reading the Access service
|
|
37
|
+
* tokens and provider keys at startup.
|
|
38
|
+
*/
|
|
39
|
+
export const cloudflareWorkerAddressesOf = Effect.fn("Orchestrator.cloudflareWorkerAddressesOf")(function* (config) {
|
|
40
|
+
return yield* Effect.forEach(cloudflareWorkersOf(config), cloudflareWorkerAddressOf);
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* Provides the full engine and `WorkerStatus` for Cloudflare Workers. The executor reads its
|
|
44
|
+
* Workers' secrets once, so a reload adds back only a Worker that `usine up` started with.
|
|
45
|
+
* Requires `CredentialProvider`, `GitHubApp`, `TriggerCondition`, `AttemptRuntime` (built before
|
|
46
|
+
* the engine), `ClaudeLoginLock`, and `CurrentInstance`.
|
|
47
|
+
*/
|
|
48
|
+
export const layer = (instanceDirectory, config, brains, options) => {
|
|
49
|
+
const { workers } = options;
|
|
50
|
+
const executor = cloudflareExecutorLayer(options).pipe(Layer.provide(NodeServices.layer), Layer.provide(externalHttpClientLayer));
|
|
51
|
+
const started = new Set(workers.map(({ name }) => name));
|
|
52
|
+
// Discarding leftovers still removes the Codex homes on an SSH Worker that `usine.yaml` dropped.
|
|
53
|
+
const stepExecutor = withSshWorkerDiscard(instanceDirectory, (discard) => stepExecutorLayer(config, brains, {
|
|
54
|
+
discard,
|
|
55
|
+
workers: {
|
|
56
|
+
add: (worker) => started.has(worker.name)
|
|
57
|
+
? Effect.void
|
|
58
|
+
: Effect.fail(new ExecutorOperationError({
|
|
59
|
+
operation: "preflight",
|
|
60
|
+
message: `A reload can't add cloudflare worker "${worker.name}", whose secrets usine up reads when it starts. Restart usine up to add it.`,
|
|
61
|
+
cause: new Error(worker.name),
|
|
62
|
+
})),
|
|
63
|
+
remove: () => Effect.void,
|
|
64
|
+
},
|
|
65
|
+
})).pipe(Layer.provide(executor));
|
|
66
|
+
return localEngineLayer(instanceDirectory).pipe(Layer.provideMerge(stepExecutor));
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=cloudflare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../src/cloudflare.ts"],"names":[],"mappings":"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"}
|
package/dist/credentials.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import type { UsineConfig } from "@usine/config/factory";
|
|
2
1
|
import { CredentialProvider } from "@usine/executor";
|
|
3
2
|
import { GitHubApp } from "@usine/github/github-app";
|
|
4
3
|
import { Layer } from "effect";
|
|
4
|
+
import { CurrentInstance } from "./current-instance/current-instance.ts";
|
|
5
5
|
/**
|
|
6
|
-
* Mints
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* the refresh that follows a miss.
|
|
6
|
+
* Mints renewable single-repository GitHub App tokens at each Attempt's Loop permission level (ADR
|
|
7
|
+
* 0011). Fails with a `refused` credential error if GitHub refuses, or `unreachable` on an outage
|
|
8
|
+
* or rate limit.
|
|
10
9
|
*/
|
|
11
|
-
export declare const gitHubCredentialLayer:
|
|
10
|
+
export declare const gitHubCredentialLayer: Layer.Layer<CredentialProvider, never, CurrentInstance | GitHubApp>;
|
|
12
11
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAInB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAEL,SAAS,EAGV,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAU,KAAK,EAA2B,MAAM,QAAQ,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAKzE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC,KAAK,CAC7C,kBAAkB,EAClB,KAAK,EACL,eAAe,GAAG,SAAS,CA6F5B,CAAC"}
|
package/dist/credentials.js
CHANGED
|
@@ -1,23 +1,26 @@
|
|
|
1
|
-
import { CredentialProvider, CredentialUnavailableError } from "@usine/executor";
|
|
2
|
-
import { GitHubApp,
|
|
1
|
+
import { CredentialProvider, CredentialUnavailableError, WorkerCredential, } from "@usine/executor";
|
|
2
|
+
import { CoveredProject, GitHubApp, isRefusal, } from "@usine/github/github-app";
|
|
3
3
|
import { Effect, Layer, Option, SynchronizedRef } from "effect";
|
|
4
|
+
import { CurrentInstance } from "./current-instance/current-instance.js";
|
|
5
|
+
const reasonOf = (cause) => isRefusal(cause) ? "refused" : "unreachable";
|
|
4
6
|
/**
|
|
5
|
-
* Mints
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* the refresh that follows a miss.
|
|
7
|
+
* Mints renewable single-repository GitHub App tokens at each Attempt's Loop permission level (ADR
|
|
8
|
+
* 0011). Fails with a `refused` credential error if GitHub refuses, or `unreachable` on an outage
|
|
9
|
+
* or rate limit.
|
|
9
10
|
*/
|
|
10
|
-
export const gitHubCredentialLayer =
|
|
11
|
+
export const gitHubCredentialLayer = Layer.effect(CredentialProvider, Effect.gen(function* () {
|
|
11
12
|
const app = yield* GitHubApp;
|
|
13
|
+
const instances = yield* CurrentInstance;
|
|
12
14
|
const projectsRef = yield* SynchronizedRef.make(Option.none());
|
|
13
|
-
const discover = (repository) => app.projectAccess(config.repos.map(({ name }) => name))
|
|
15
|
+
const discover = (repository) => instances.get.pipe(Effect.flatMap(({ config }) => app.projectAccess(config.repos.map(({ name }) => name))), Effect.map((access) => new Map(access
|
|
14
16
|
.filter((project) => project._tag === "CoveredProject")
|
|
15
17
|
.map((project) => [project.repository, project]))), Effect.mapError((cause) => new CredentialUnavailableError({
|
|
16
18
|
repository,
|
|
17
|
-
|
|
19
|
+
reason: reasonOf(cause),
|
|
20
|
+
message: `Could not discover GitHub App repository access: ${cause.message}`,
|
|
18
21
|
cause,
|
|
19
22
|
})));
|
|
20
|
-
/** Refreshes the cached project map once on a miss before
|
|
23
|
+
/** Refreshes the cached project map once on a miss before returning "not covered". */
|
|
21
24
|
const projectFor = Effect.fn("GitHubCredentialProvider.projectFor")(function* (repository) {
|
|
22
25
|
const project = yield* SynchronizedRef.modifyEffect(projectsRef, (current) => Effect.gen(function* () {
|
|
23
26
|
if (Option.isSome(current)) {
|
|
@@ -37,25 +40,29 @@ export const gitHubCredentialLayer = (config) => Layer.effect(CredentialProvider
|
|
|
37
40
|
if (Option.isNone(project)) {
|
|
38
41
|
return yield* new CredentialUnavailableError({
|
|
39
42
|
repository,
|
|
40
|
-
|
|
43
|
+
reason: "refused",
|
|
44
|
+
message: `The GitHub App installation has no access to "${repository}"`,
|
|
41
45
|
cause: new Error("no project access after refresh"),
|
|
42
46
|
});
|
|
43
47
|
}
|
|
44
48
|
return project.value;
|
|
45
49
|
});
|
|
46
50
|
return CredentialProvider.of({
|
|
47
|
-
issue: Effect.fn("GitHubCredentialProvider.issue")(function* (repository, attemptId) {
|
|
51
|
+
issue: Effect.fn("GitHubCredentialProvider.issue")(function* (repository, attemptId, permissions) {
|
|
52
|
+
yield* Effect.annotateCurrentSpan({ repository, attemptId, permissions });
|
|
48
53
|
const project = yield* projectFor(repository);
|
|
49
|
-
const token = yield* app.workerToken(project).pipe(Effect.mapError((cause) => new CredentialUnavailableError({
|
|
54
|
+
const token = yield* app.workerToken(project, permissions).pipe(Effect.mapError((cause) => new CredentialUnavailableError({
|
|
50
55
|
repository,
|
|
51
|
-
|
|
56
|
+
reason: reasonOf(cause),
|
|
57
|
+
message: `Could not create a worker token for "${repository}": ${cause.message}`,
|
|
52
58
|
cause,
|
|
53
59
|
})));
|
|
54
60
|
yield* Effect.logInfo("Minted a single-repository worker token", {
|
|
55
61
|
repository,
|
|
56
62
|
attemptId,
|
|
63
|
+
permissions,
|
|
57
64
|
});
|
|
58
|
-
return token.value;
|
|
65
|
+
return new WorkerCredential({ value: token.value, expiresAt: token.expiresAt });
|
|
59
66
|
}),
|
|
60
67
|
});
|
|
61
68
|
}));
|
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type AgentFile, InvalidAgent } from "@usine/config/agent";
|
|
2
|
+
import type { Worker as ConfigWorker } from "@usine/config/factory";
|
|
3
|
+
import type { LoadedInstance } from "@usine/config/instance";
|
|
4
|
+
import { QuarantinedLoop } from "@usine/config/loop";
|
|
5
|
+
import { Schema } from "effect";
|
|
6
|
+
/**
|
|
7
|
+
* A `usine.yaml` block with changes that apply only when `usine up` starts, so a reload refuses
|
|
8
|
+
* them.
|
|
9
|
+
*/
|
|
10
|
+
export declare const RestartBlock: Schema.Literals<readonly ["workers", "webhooks", "tracing"]>;
|
|
11
|
+
export type RestartBlock = typeof RestartBlock.Type;
|
|
12
|
+
/** A change to `usine.yaml` that only a restart of `usine up` applies. */
|
|
13
|
+
export interface RestartChange {
|
|
14
|
+
readonly block: RestartBlock;
|
|
15
|
+
/** The changed field as a path into `usine.yaml`, such as `webhooks` or `workers.build-1.destination`. */
|
|
16
|
+
readonly field: string;
|
|
17
|
+
/** An operator-facing clause, such as `the webhooks block changed`. */
|
|
18
|
+
readonly reason: string;
|
|
19
|
+
}
|
|
20
|
+
declare const InstanceReload_base: Schema.Class<InstanceReload, Schema.Struct<{
|
|
21
|
+
readonly loops: Schema.Struct<{
|
|
22
|
+
readonly added: Schema.$Array<Schema.brand<Schema.NonEmptyString, "LoopName">>;
|
|
23
|
+
readonly removed: Schema.$Array<Schema.brand<Schema.NonEmptyString, "LoopName">>;
|
|
24
|
+
readonly changed: Schema.$Array<Schema.brand<Schema.NonEmptyString, "LoopName">>;
|
|
25
|
+
}>;
|
|
26
|
+
readonly agents: Schema.Struct<{
|
|
27
|
+
readonly added: Schema.$Array<Schema.brand<Schema.String, "AgentName">>;
|
|
28
|
+
readonly removed: Schema.$Array<Schema.brand<Schema.String, "AgentName">>;
|
|
29
|
+
readonly changed: Schema.$Array<Schema.brand<Schema.String, "AgentName">>;
|
|
30
|
+
}>;
|
|
31
|
+
readonly labels: Schema.Struct<{
|
|
32
|
+
readonly added: Schema.$Array<Schema.brand<Schema.String, "GitHubLabelName">>;
|
|
33
|
+
readonly removed: Schema.$Array<Schema.brand<Schema.String, "GitHubLabelName">>;
|
|
34
|
+
readonly changed: Schema.$Array<Schema.brand<Schema.String, "GitHubLabelName">>;
|
|
35
|
+
}>;
|
|
36
|
+
readonly repos: Schema.Struct<{
|
|
37
|
+
readonly added: Schema.$Array<Schema.brand<Schema.String, "RepositoryName">>;
|
|
38
|
+
readonly removed: Schema.$Array<Schema.brand<Schema.String, "RepositoryName">>;
|
|
39
|
+
readonly changed: Schema.$Array<Schema.brand<Schema.String, "RepositoryName">>;
|
|
40
|
+
}>;
|
|
41
|
+
readonly workers: Schema.Struct<{
|
|
42
|
+
readonly added: Schema.$Array<Schema.brand<Schema.String, "WorkerName">>;
|
|
43
|
+
readonly removed: Schema.$Array<Schema.brand<Schema.String, "WorkerName">>;
|
|
44
|
+
readonly changed: Schema.$Array<Schema.brand<Schema.String, "WorkerName">>;
|
|
45
|
+
}>;
|
|
46
|
+
readonly settingsChanged: Schema.Boolean;
|
|
47
|
+
readonly operatorChanged: Schema.Boolean;
|
|
48
|
+
readonly quarantinedLoops: Schema.$Array<typeof QuarantinedLoop>;
|
|
49
|
+
readonly invalidAgents: Schema.$Array<typeof InvalidAgent>;
|
|
50
|
+
}>, {}>;
|
|
51
|
+
/**
|
|
52
|
+
* The changes of an accepted reload by name, whether `settings` or the `operator` login changed,
|
|
53
|
+
* and the Loop and Agent files that were left out.
|
|
54
|
+
*/
|
|
55
|
+
export declare class InstanceReload extends InstanceReload_base {
|
|
56
|
+
}
|
|
57
|
+
/** Compares a newly loaded instance folder with the running instance. */
|
|
58
|
+
export declare const instanceReload: (running: LoadedInstance, loaded: LoadedInstance) => InstanceReload;
|
|
59
|
+
/** Returns the Agents of `loaded` whose brain no running Agent has. */
|
|
60
|
+
export declare const agentsWithNewBrains: (running: LoadedInstance, loaded: LoadedInstance) => ReadonlyArray<AgentFile>;
|
|
61
|
+
/**
|
|
62
|
+
* Returns the changes in `loaded` that only a restart applies: a changed `webhooks` or `tracing`
|
|
63
|
+
* block, and a changed `workers` block while no Worker runs Attempts, as in setup mode.
|
|
64
|
+
*/
|
|
65
|
+
export declare const restartChanges: (running: LoadedInstance, loaded: LoadedInstance, workersRun: boolean) => ReadonlyArray<RestartChange>;
|
|
66
|
+
/** A Worker that a reload keeps with a new `max_concurrent_attempts`. */
|
|
67
|
+
interface ResizedWorker {
|
|
68
|
+
readonly worker: ConfigWorker;
|
|
69
|
+
/** The `max_concurrent_attempts` in the running instance. */
|
|
70
|
+
readonly from: number;
|
|
71
|
+
}
|
|
72
|
+
/** The changes a reload makes to the `workers` block, by Worker name. */
|
|
73
|
+
export interface WorkersChange {
|
|
74
|
+
readonly resized: ReadonlyArray<ResizedWorker>;
|
|
75
|
+
readonly added: ReadonlyArray<ConfigWorker>;
|
|
76
|
+
readonly removed: ReadonlyArray<ConfigWorker>;
|
|
77
|
+
/**
|
|
78
|
+
* The changes running Workers can't apply: a changed kind or setting other than
|
|
79
|
+
* `max_concurrent_attempts`, and a rename, which counts as a removal plus an addition with the
|
|
80
|
+
* same settings.
|
|
81
|
+
*/
|
|
82
|
+
readonly restart: ReadonlyArray<RestartChange>;
|
|
83
|
+
}
|
|
84
|
+
/** Compares the reloaded `workers` block with the running one. */
|
|
85
|
+
export declare const workersChange: (running: ReadonlyArray<ConfigWorker>, loaded: ReadonlyArray<ConfigWorker>) => WorkersChange;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../src/current-instance/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,EAAS,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIvC;;;GAGG;AACH,eAAO,MAAM,YAAY,8DAAkC,CAAC;AAE5D,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,IAAI,CAAC;AAEpD,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,0GAA0G;IAC1G,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASD;;;GAGG;AACH,qBAAa,cAAe,SAAQ,mBAYlC;CAAG;AA4BL,yEAAyE;AACzE,eAAO,MAAM,cAAc,YAAa,cAAc,UAAU,cAAc,KAAG,cAoC7E,CAAC;AAEL,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,YACrB,cAAc,UACf,cAAc,KACrB,aAAa,CAAC,SAAS,CAKzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,YAChB,cAAc,UACf,cAAc,cACV,OAAO,KAClB,aAAa,CAAC,aAAa,CAgB7B,CAAC;AAyBF,yEAAyE;AACzE,UAAU,aAAa;IACrB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;CAChD;AAED,kEAAkE;AAClE,eAAO,MAAM,aAAa,YACf,aAAa,CAAC,YAAY,CAAC,UAC5B,aAAa,CAAC,YAAY,CAAC,KAClC,aAmCF,CAAC"}
|