@usine/orchestrator 0.3.0 → 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 +32 -9
- package/dist/board/items.d.ts +14 -3
- package/dist/board/items.d.ts.map +1 -1
- package/dist/board/items.js +29 -1
- package/dist/board/items.js.map +1 -1
- package/dist/board/projection.d.ts +2 -1
- package/dist/board/projection.d.ts.map +1 -1
- package/dist/board/projection.js +20 -10
- package/dist/board/projection.js.map +1 -1
- package/dist/board/tasks.d.ts +1 -1
- package/dist/board/tasks.d.ts.map +1 -1
- package/dist/board/tasks.js +7 -3
- 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/current-instance/changes.d.ts +3 -3
- package/dist/current-instance/changes.d.ts.map +1 -1
- package/dist/current-instance/changes.js +6 -3
- package/dist/current-instance/changes.js.map +1 -1
- package/dist/current-instance/current-instance.d.ts +3 -3
- package/dist/exe-dev.d.ts +1 -1
- package/dist/exe-dev.d.ts.map +1 -1
- package/dist/exe-dev.js +3 -1
- 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/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 +1 -1
- package/dist/local.d.ts.map +1 -1
- package/dist/local.js +3 -1
- package/dist/local.js.map +1 -1
- package/dist/operator/attempt.d.ts +22 -3
- package/dist/operator/attempt.d.ts.map +1 -1
- package/dist/operator/attempt.js +22 -3
- package/dist/operator/attempt.js.map +1 -1
- package/dist/operator/board.d.ts +8 -3
- package/dist/operator/board.d.ts.map +1 -1
- package/dist/operator/board.js +8 -4
- package/dist/operator/board.js.map +1 -1
- package/dist/operator/configuration.d.ts +65 -9
- package/dist/operator/configuration.d.ts.map +1 -1
- package/dist/operator/configuration.js +90 -10
- package/dist/operator/configuration.js.map +1 -1
- package/dist/operator/desk.d.ts +33 -8
- package/dist/operator/desk.d.ts.map +1 -1
- package/dist/operator/desk.js +73 -11
- package/dist/operator/desk.js.map +1 -1
- package/dist/operator/http.d.ts +14 -79
- package/dist/operator/http.d.ts.map +1 -1
- package/dist/operator/http.js +20 -14
- 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 +15 -1
- package/dist/operator/need.d.ts.map +1 -1
- package/dist/operator/need.js +15 -0
- package/dist/operator/need.js.map +1 -1
- package/dist/operator/operator.d.ts +36 -10
- package/dist/operator/operator.d.ts.map +1 -1
- package/dist/operator/operator.js +136 -31
- package/dist/operator/operator.js.map +1 -1
- package/dist/operator/overview.d.ts +2 -2
- package/dist/operator/projection.d.ts +2 -0
- package/dist/operator/projection.d.ts.map +1 -1
- package/dist/operator/projection.js +12 -4
- package/dist/operator/projection.js.map +1 -1
- package/dist/operator/run.d.ts +30 -0
- package/dist/operator/run.d.ts.map +1 -1
- package/dist/operator/run.js +31 -1
- 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 +2 -1
- package/dist/operator/task.d.ts.map +1 -1
- package/dist/operator/task.js +3 -3
- package/dist/operator/task.js.map +1 -1
- package/dist/operator/usage.d.ts +10 -18
- package/dist/operator/usage.d.ts.map +1 -1
- package/dist/operator/usage.js +57 -42
- package/dist/operator/usage.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/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.map +1 -1
- package/dist/polling/polling.js +31 -18
- package/dist/polling/polling.js.map +1 -1
- package/dist/polling/repository-sync.d.ts +1 -0
- package/dist/polling/repository-sync.d.ts.map +1 -1
- package/dist/polling/repository-sync.js +1 -1
- package/dist/polling/repository-sync.js.map +1 -1
- package/dist/runtime.d.ts +2 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +10 -10
- package/dist/runtime.js.map +1 -1
- package/dist/scheduler.d.ts +13 -4
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +312 -55
- package/dist/scheduler.js.map +1 -1
- package/dist/ssh.d.ts +71 -7
- package/dist/ssh.d.ts.map +1 -1
- package/dist/ssh.js +84 -15
- package/dist/ssh.js.map +1 -1
- package/dist/worker-engine.d.ts +7 -4
- package/dist/worker-engine.d.ts.map +1 -1
- package/dist/worker-engine.js +36 -5
- package/dist/worker-engine.js.map +1 -1
- package/dist/worker-status.d.ts +80 -10
- package/dist/worker-status.d.ts.map +1 -1
- package/dist/worker-status.js +31 -10
- package/dist/worker-status.js.map +1 -1
- package/package.json +29 -25
package/dist/operator/task.d.ts
CHANGED
|
@@ -29,7 +29,8 @@ declare const TaskLaneView_base: Schema.Class<TaskLaneView, Schema.Struct<{
|
|
|
29
29
|
readonly name: Schema.brand<Schema.String, "LaneName">;
|
|
30
30
|
}>, {}>;
|
|
31
31
|
/**
|
|
32
|
-
* The Task's Board lane: its current Item's lane
|
|
32
|
+
* The Task's Board lane: its current Item's lane or, while a Run runs and the Item has no lane
|
|
33
|
+
* label, the lane that Run was triggered from.
|
|
33
34
|
*/
|
|
34
35
|
export declare class TaskLaneView extends TaskLaneView_base {
|
|
35
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/operator/task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAW,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAA2B,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGjF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAmB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAEL,OAAO,EAEP,MAAM,EACN,KAAK,EAGL,MAAM,EACP,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAEL,sBAAsB,EAEtB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/operator/task.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAW,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAA2B,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGjF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAC5F,OAAO,EAAmB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAEL,OAAO,EAEP,MAAM,EACN,KAAK,EAGL,MAAM,EACP,MAAM,QAAQ,CAAC;AAGhB,OAAO,EAEL,sBAAsB,EAEtB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;;;;;;;;;IASjC,qFAAqF;;;AAJvF,6FAA6F;AAC7F,qBAAa,YAAa,SAAQ,iBAKhC;CAAG;;;;;AAEL;;;GAGG;AACH,qBAAa,YAAa,SAAQ,iBAGhC;CAAG;;;;;;;;AAEL;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,oBAQnC;CAAG;;;;;IAUH;;;OAGG;;;IAGH;;;OAGG;;IAEH,2FAA2F;;IAE3F,yDAAyD;;IAEzD,yGAAyG;;;AAvB3G;;;GAGG;AACH,qBAAa,QAAS,SAAQ,aAqB5B;CAAG;AAEL,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,yBAAyB,GAAG,sBAAsB,CAAC;;IAuL3F;;;OAGG;mBACY,CACb,QAAQ,EAAE,cAAc,EACxB,UAAU,EAAE,cAAc,EAC1B,IAAI,EAAE,UAAU,KACb,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;;AAf/C;;;GAGG;AACH,qBAAa,UAAW,SAAQ,eAaK;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,kIAA4C;CAClE"}
|
package/dist/operator/task.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LaneName } from "@usine/config/board";
|
|
2
2
|
import { GitHubLabelName } from "@usine/config/label";
|
|
3
3
|
import { ItemKey, ItemNumber } from "@usine/core/item";
|
|
4
4
|
import { canonicalRepositoryName, RepositoryName } from "@usine/core/repository";
|
|
@@ -20,14 +20,14 @@ const TASK_BOARD_ITEMS = 500;
|
|
|
20
20
|
/** One issue or pull request of a Task, with its GitHub state as the Board card shows it. */
|
|
21
21
|
export class TaskItemView extends Schema.Class("@usine/orchestrator/TaskItemView")({
|
|
22
22
|
...BoardItemLink.fields,
|
|
23
|
-
state: LaneItemState,
|
|
24
23
|
labels: Schema.Array(GitHubLabelName),
|
|
25
24
|
/** Whether the Item is an open pull request whose branch conflicts with its base. */
|
|
26
25
|
conflicting: Schema.Boolean,
|
|
27
26
|
}) {
|
|
28
27
|
}
|
|
29
28
|
/**
|
|
30
|
-
* The Task's Board lane: its current Item's lane
|
|
29
|
+
* The Task's Board lane: its current Item's lane or, while a Run runs and the Item has no lane
|
|
30
|
+
* label, the lane that Run was triggered from.
|
|
31
31
|
*/
|
|
32
32
|
export class TaskLaneView extends Schema.Class("@usine/orchestrator/TaskLaneView")({
|
|
33
33
|
id: BoardLaneId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/operator/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/operator/task.ts"],"names":[],"mappings":"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"}
|
package/dist/operator/usage.d.ts
CHANGED
|
@@ -8,8 +8,8 @@ declare const UsageCostView_base: Schema.Class<UsageCostView, Schema.Struct<{
|
|
|
8
8
|
readonly estimate: Schema.Boolean;
|
|
9
9
|
}>, {}>;
|
|
10
10
|
/**
|
|
11
|
-
* A dollar cost
|
|
12
|
-
*
|
|
11
|
+
* A dollar cost from a harness or from usine's OpenAI price table. `estimate` is true in the Claude
|
|
12
|
+
* and ChatGPT plans, which don't bill per token (ADR 0013).
|
|
13
13
|
*/
|
|
14
14
|
export declare class UsageCostView extends UsageCostView_base {
|
|
15
15
|
}
|
|
@@ -18,7 +18,7 @@ declare const SessionUsageView_base: Schema.Class<SessionUsageView, Schema.Struc
|
|
|
18
18
|
readonly session: Schema.Union<readonly [typeof import("@usine/core/agent/session").ParentSession, typeof import("@usine/core/agent/session").ChildSession]>;
|
|
19
19
|
readonly pool: Schema.Literals<readonly ["apiKeys", "claudePlan", "chatgptPlan"]>;
|
|
20
20
|
readonly tokens: Schema.brand<Schema.Int, "TokenCount">;
|
|
21
|
-
/** Null
|
|
21
|
+
/** Null if neither the harness nor the OpenAI price table priced the session. */
|
|
22
22
|
readonly cost: Schema.NullOr<typeof UsageCostView>;
|
|
23
23
|
}>, {}>;
|
|
24
24
|
/** One Attempt session's usage from its highest token report, and its billing pool. */
|
|
@@ -27,7 +27,7 @@ export declare class SessionUsageView extends SessionUsageView_base {
|
|
|
27
27
|
declare const PoolUsageView_base: Schema.Class<PoolUsageView, Schema.Struct<{
|
|
28
28
|
readonly pool: Schema.Literals<readonly ["apiKeys", "claudePlan", "chatgptPlan"]>;
|
|
29
29
|
readonly tokens: Schema.brand<Schema.Int, "TokenCount">;
|
|
30
|
-
/** Null
|
|
30
|
+
/** Null if any session in the pool has no price. */
|
|
31
31
|
readonly cost: Schema.NullOr<typeof UsageCostView>;
|
|
32
32
|
}>, {}>;
|
|
33
33
|
/** A Run's usage in one billing pool. */
|
|
@@ -40,24 +40,15 @@ declare const RunUsageView_base: Schema.Class<RunUsageView, Schema.Struct<{
|
|
|
40
40
|
/** In order of Attempt start, then first report. */
|
|
41
41
|
readonly sessions: Schema.$Array<typeof SessionUsageView>;
|
|
42
42
|
}>, {}>;
|
|
43
|
-
/**
|
|
44
|
-
* The tokens a Run's Attempts used, per pool and session, with prices where a pool has a dollar
|
|
45
|
-
* rate.
|
|
46
|
-
*/
|
|
43
|
+
/** The tokens a Run's Attempts used, per pool and session, with their prices. */
|
|
47
44
|
export declare class RunUsageView extends RunUsageView_base {
|
|
48
45
|
}
|
|
49
46
|
declare const TaskPoolUsageView_base: Schema.Class<TaskPoolUsageView, Schema.Struct<{
|
|
50
47
|
readonly pool: Schema.Literals<readonly ["apiKeys", "claudePlan", "chatgptPlan"]>;
|
|
51
48
|
readonly tokens: Schema.brand<Schema.Int, "TokenCount">;
|
|
52
|
-
/**
|
|
53
|
-
* The cost of the priced sessions, or null in the ChatGPT plan or if no session in the pool has a
|
|
54
|
-
* price yet.
|
|
55
|
-
*/
|
|
49
|
+
/** The cost of the priced sessions, or null if no session in the pool has a price yet. */
|
|
56
50
|
readonly cost: Schema.NullOr<typeof UsageCostView>;
|
|
57
|
-
/**
|
|
58
|
-
* Whether a session in a priced pool has no price yet, so `cost` is a lower bound. Always false
|
|
59
|
-
* in the ChatGPT plan.
|
|
60
|
-
*/
|
|
51
|
+
/** Whether a session in the pool has no price yet, so `cost` is a lower bound. */
|
|
61
52
|
readonly unpriced: Schema.Boolean;
|
|
62
53
|
}>, {}>;
|
|
63
54
|
/** A Task's usage in one billing pool, summed over every session of every Run. */
|
|
@@ -78,7 +69,7 @@ declare const TaskUsageView_base: Schema.Class<TaskUsageView, Schema.Struct<{
|
|
|
78
69
|
readonly pools: Schema.$Array<typeof TaskPoolUsageView>;
|
|
79
70
|
/**
|
|
80
71
|
* The summed cost of the priced pools, or null if no pool has a price. It's an estimate if it
|
|
81
|
-
* includes the Claude plan, and a lower bound if a pool is `unpriced`.
|
|
72
|
+
* includes the Claude or ChatGPT plan, and a lower bound if a pool is `unpriced`.
|
|
82
73
|
*/
|
|
83
74
|
readonly cost: Schema.NullOr<typeof UsageCostView>;
|
|
84
75
|
}>, {}>;
|
|
@@ -102,7 +93,8 @@ declare const RunUsageReader_base: Context.ServiceClass<RunUsageReader, "@usine/
|
|
|
102
93
|
}>;
|
|
103
94
|
/**
|
|
104
95
|
* Reads a Run's usage from each session's highest token report. Caches the reports of Attempts with
|
|
105
|
-
* an outcome and rereads running Attempts on every call.
|
|
96
|
+
* an outcome and rereads running Attempts on every call. Logs one warning per Codex model that the
|
|
97
|
+
* OpenAI price table lacks.
|
|
106
98
|
*/
|
|
107
99
|
export declare class RunUsageReader extends RunUsageReader_base {
|
|
108
100
|
static readonly layer: Layer.Layer<RunUsageReader, never, RunReader>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/operator/usage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/operator/usage.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;;;;;AAEhD;;;GAGG;AACH,qBAAa,aAAc,SAAQ,kBAElC;CAAG;;;;;;IAUF,iFAAiF;;;AARnF,uFAAuF;AACvF,qBAAa,gBAAiB,SAAQ,qBASpC;CAAG;;;;IAOD,oDAAoD;;;AALxD,yCAAyC;AACzC,qBAAa,aAAc,SAAQ,kBAOlC;CAAG;;;IAKF,iFAAiF;;IAEjF,oDAAoD;;;AALtD,iFAAiF;AACjF,qBAAa,YAAa,SAAQ,iBAMhC;CAAG;;;;IAQH,0FAA0F;;IAE1F,kFAAkF;;;AARpF,kFAAkF;AAClF,qBAAa,iBAAkB,SAAQ,sBASrC;CAAG;;IAQD,+EAA+E;;IAE/E,wFAAwF;;IAExF,yFAAyF;;;IAGzF;;;OAGG;;IAEH;;;OAGG;;;AArBP;;;GAGG;AACH,qBAAa,aAAc,SAAQ,kBAoBlC;CAAG;AA2FJ;;;GAGG;AACH,eAAO,MAAM,SAAS,SACd,aAAa,CAAC;IAClB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC;CAC1F,CAAC,SACK,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,KACtC,aA6CF,CAAC;AAwCF,KAAK,cAAc,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC;;mBASzC,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC;;AAPtF;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,mBAGK;IACvC,MAAM,CAAC,QAAQ,CAAC,KAAK,gDAAoD;CAC1E"}
|
package/dist/operator/usage.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
+
import { openAiPrice } from "@usine/agents/openai-prices";
|
|
1
2
|
import { AgentSession, BillingPool, sessionPool, TokenCount, UsdAmount, } from "@usine/core/agent/session";
|
|
2
3
|
import { AttemptId } from "@usine/core/attempt";
|
|
3
4
|
import { RunReader } from "@usine/engine/run-reader";
|
|
4
5
|
import { TranscriptUsageQuery } from "@usine/engine/transcript";
|
|
5
6
|
import { Context, Effect, Layer, Option, Schema } from "effect";
|
|
6
7
|
/**
|
|
7
|
-
* A dollar cost
|
|
8
|
-
*
|
|
8
|
+
* A dollar cost from a harness or from usine's OpenAI price table. `estimate` is true in the Claude
|
|
9
|
+
* and ChatGPT plans, which don't bill per token (ADR 0013).
|
|
9
10
|
*/
|
|
10
11
|
export class UsageCostView extends Schema.Class("@usine/orchestrator/UsageCostView")({ usd: UsdAmount, estimate: Schema.Boolean }) {
|
|
11
12
|
}
|
|
@@ -15,7 +16,7 @@ export class SessionUsageView extends Schema.Class("@usine/orchestrator/SessionU
|
|
|
15
16
|
session: AgentSession,
|
|
16
17
|
pool: BillingPool,
|
|
17
18
|
tokens: TokenCount,
|
|
18
|
-
/** Null
|
|
19
|
+
/** Null if neither the harness nor the OpenAI price table priced the session. */
|
|
19
20
|
cost: Schema.NullOr(UsageCostView),
|
|
20
21
|
}) {
|
|
21
22
|
}
|
|
@@ -23,14 +24,11 @@ export class SessionUsageView extends Schema.Class("@usine/orchestrator/SessionU
|
|
|
23
24
|
export class PoolUsageView extends Schema.Class("@usine/orchestrator/PoolUsageView")({
|
|
24
25
|
pool: BillingPool,
|
|
25
26
|
tokens: TokenCount,
|
|
26
|
-
/** Null
|
|
27
|
+
/** Null if any session in the pool has no price. */
|
|
27
28
|
cost: Schema.NullOr(UsageCostView),
|
|
28
29
|
}) {
|
|
29
30
|
}
|
|
30
|
-
/**
|
|
31
|
-
* The tokens a Run's Attempts used, per pool and session, with prices where a pool has a dollar
|
|
32
|
-
* rate.
|
|
33
|
-
*/
|
|
31
|
+
/** The tokens a Run's Attempts used, per pool and session, with their prices. */
|
|
34
32
|
export class RunUsageView extends Schema.Class("@usine/orchestrator/RunUsageView")({
|
|
35
33
|
tokens: TokenCount,
|
|
36
34
|
/** In the order API keys, Claude plan, ChatGPT plan; unused pools are absent. */
|
|
@@ -43,15 +41,9 @@ export class RunUsageView extends Schema.Class("@usine/orchestrator/RunUsageView
|
|
|
43
41
|
export class TaskPoolUsageView extends Schema.Class("@usine/orchestrator/TaskPoolUsageView")({
|
|
44
42
|
pool: BillingPool,
|
|
45
43
|
tokens: TokenCount,
|
|
46
|
-
/**
|
|
47
|
-
* The cost of the priced sessions, or null in the ChatGPT plan or if no session in the pool has a
|
|
48
|
-
* price yet.
|
|
49
|
-
*/
|
|
44
|
+
/** The cost of the priced sessions, or null if no session in the pool has a price yet. */
|
|
50
45
|
cost: Schema.NullOr(UsageCostView),
|
|
51
|
-
/**
|
|
52
|
-
* Whether a session in a priced pool has no price yet, so `cost` is a lower bound. Always false
|
|
53
|
-
* in the ChatGPT plan.
|
|
54
|
-
*/
|
|
46
|
+
/** Whether a session in the pool has no price yet, so `cost` is a lower bound. */
|
|
55
47
|
unpriced: Schema.Boolean,
|
|
56
48
|
}) {
|
|
57
49
|
}
|
|
@@ -74,18 +66,20 @@ export class TaskUsageView extends Schema.Class("@usine/orchestrator/TaskUsageVi
|
|
|
74
66
|
pools: Schema.Array(TaskPoolUsageView),
|
|
75
67
|
/**
|
|
76
68
|
* The summed cost of the priced pools, or null if no pool has a price. It's an estimate if it
|
|
77
|
-
* includes the Claude plan, and a lower bound if a pool is `unpriced`.
|
|
69
|
+
* includes the Claude or ChatGPT plan, and a lower bound if a pool is `unpriced`.
|
|
78
70
|
*/
|
|
79
71
|
cost: Schema.NullOr(UsageCostView),
|
|
80
72
|
}) {
|
|
81
73
|
}
|
|
82
74
|
const POOLS = ["apiKeys", "claudePlan", "chatgptPlan"];
|
|
83
|
-
const priced = (pool, usd) =>
|
|
84
|
-
|
|
85
|
-
:
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
75
|
+
const priced = (pool, usd) => Option.match(usd, {
|
|
76
|
+
onNone: () => null,
|
|
77
|
+
onSome: (value) => new UsageCostView({ usd: value, estimate: pool !== "apiKeys" }),
|
|
78
|
+
});
|
|
79
|
+
/** Returns the harness's price, or for a Codex session, the OpenAI table's price of its breakdown. */
|
|
80
|
+
const sessionPrice = ({ session, costUsd, breakdown, }) => Option.isSome(costUsd) || session.brain.harness !== "codex"
|
|
81
|
+
? costUsd
|
|
82
|
+
: Option.flatMap(breakdown, (tokens) => openAiPrice(session.brain.model, tokens));
|
|
89
83
|
/**
|
|
90
84
|
* Sums a Run's token reports per pool and for the Run, using each session's highest report because
|
|
91
85
|
* reports are cumulative.
|
|
@@ -96,21 +90,31 @@ const runUsage = (reports) => {
|
|
|
96
90
|
const payload = envelope.payload;
|
|
97
91
|
if (payload._tag !== "SessionEvent" || payload.event._tag !== "SessionTokensUpdated")
|
|
98
92
|
continue;
|
|
99
|
-
const
|
|
100
|
-
const key = `${attemptId} ${session.id}`;
|
|
93
|
+
const key = `${attemptId} ${payload.event.session.id}`;
|
|
101
94
|
const previous = highest.get(key);
|
|
102
|
-
if (previous !== undefined && previous.
|
|
95
|
+
if (previous !== undefined && previous.report.totalTokens >= payload.event.totalTokens)
|
|
103
96
|
continue;
|
|
104
|
-
|
|
105
|
-
|
|
97
|
+
highest.set(key, { attemptId, report: payload.event });
|
|
98
|
+
}
|
|
99
|
+
const latest = [...highest.values()].map((entry) => ({
|
|
100
|
+
...entry,
|
|
101
|
+
price: sessionPrice(entry.report),
|
|
102
|
+
}));
|
|
103
|
+
const sessions = latest.map(({ attemptId, report, price }) => {
|
|
104
|
+
const pool = sessionPool(report.session);
|
|
105
|
+
return new SessionUsageView({
|
|
106
106
|
attemptId,
|
|
107
|
-
session,
|
|
107
|
+
session: report.session,
|
|
108
108
|
pool,
|
|
109
|
-
tokens: totalTokens,
|
|
110
|
-
cost: priced(pool,
|
|
111
|
-
})
|
|
112
|
-
}
|
|
113
|
-
const
|
|
109
|
+
tokens: report.totalTokens,
|
|
110
|
+
cost: priced(pool, price),
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
const unknownModels = new Set(latest.flatMap(({ report, price }) => Option.isNone(price) &&
|
|
114
|
+
report.session.brain.harness === "codex" &&
|
|
115
|
+
Option.isSome(report.breakdown)
|
|
116
|
+
? [report.session.brain.model]
|
|
117
|
+
: []));
|
|
114
118
|
const pools = POOLS.flatMap((pool) => {
|
|
115
119
|
const members = sessions.filter((session) => session.pool === pool);
|
|
116
120
|
if (members.length === 0)
|
|
@@ -126,11 +130,14 @@ const runUsage = (reports) => {
|
|
|
126
130
|
}),
|
|
127
131
|
];
|
|
128
132
|
});
|
|
129
|
-
return
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
133
|
+
return {
|
|
134
|
+
view: new RunUsageView({
|
|
135
|
+
tokens: TokenCount.make(sessions.reduce((sum, { tokens }) => sum + tokens, 0)),
|
|
136
|
+
pools,
|
|
137
|
+
sessions,
|
|
138
|
+
}),
|
|
139
|
+
unknownModels,
|
|
140
|
+
};
|
|
134
141
|
};
|
|
135
142
|
/**
|
|
136
143
|
* Sums the Attempt time, tokens, and cost of a Task's `runs`. Pools sum sessions rather than Run
|
|
@@ -163,7 +170,7 @@ export const taskUsage = (runs, usage) => {
|
|
|
163
170
|
cost: priced(pool, costs.length === 0
|
|
164
171
|
? Option.none()
|
|
165
172
|
: Option.some(UsdAmount.make(costs.reduce((sum, usd) => sum + usd, 0)))),
|
|
166
|
-
unpriced:
|
|
173
|
+
unpriced: costs.length < members.length,
|
|
167
174
|
}),
|
|
168
175
|
];
|
|
169
176
|
});
|
|
@@ -185,6 +192,7 @@ export const taskUsage = (runs, usage) => {
|
|
|
185
192
|
const makeRunUsageReader = Effect.gen(function* () {
|
|
186
193
|
const runs = yield* RunReader;
|
|
187
194
|
const ended = yield* Effect.sync(() => new Map());
|
|
195
|
+
const loggedModels = yield* Effect.sync(() => new Set());
|
|
188
196
|
const attemptReports = Effect.fn("RunUsageReader.attemptReports")(function* (attempt) {
|
|
189
197
|
const cached = ended.get(attempt.id);
|
|
190
198
|
if (cached !== undefined)
|
|
@@ -197,7 +205,13 @@ const makeRunUsageReader = Effect.gen(function* () {
|
|
|
197
205
|
const read = Effect.fn("RunUsageReader.read")(function* (snapshot) {
|
|
198
206
|
yield* Effect.annotateCurrentSpan({ runId: snapshot.run.id });
|
|
199
207
|
const attempts = yield* Effect.forEach(snapshot.attempts, attemptReports, { concurrency: 4 });
|
|
200
|
-
const usage = runUsage(attempts.flatMap(({ reports }) => reports));
|
|
208
|
+
const { view: usage, unknownModels } = runUsage(attempts.flatMap(({ reports }) => reports));
|
|
209
|
+
for (const model of unknownModels) {
|
|
210
|
+
if (loggedModels.has(model))
|
|
211
|
+
continue;
|
|
212
|
+
loggedModels.add(model);
|
|
213
|
+
yield* Effect.logWarning("The OpenAI price table has no rates for a Codex model, so its sessions have no cost", { model, runId: snapshot.run.id });
|
|
214
|
+
}
|
|
201
215
|
yield* Effect.logDebug("Read Run usage", {
|
|
202
216
|
runId: snapshot.run.id,
|
|
203
217
|
sessions: usage.sessions.length,
|
|
@@ -211,7 +225,8 @@ const makeRunUsageReader = Effect.gen(function* () {
|
|
|
211
225
|
});
|
|
212
226
|
/**
|
|
213
227
|
* Reads a Run's usage from each session's highest token report. Caches the reports of Attempts with
|
|
214
|
-
* an outcome and rereads running Attempts on every call.
|
|
228
|
+
* an outcome and rereads running Attempts on every call. Logs one warning per Codex model that the
|
|
229
|
+
* OpenAI price table lacks.
|
|
215
230
|
*/
|
|
216
231
|
export class RunUsageReader extends Context.Service()("@usine/orchestrator/RunUsageReader") {
|
|
217
232
|
static layer = Layer.effect(RunUsageReader, makeRunUsageReader);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/operator/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/operator/usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EAEX,UAAU,EACV,SAAS,GACV,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAgB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG9D,OAAO,EAAE,SAAS,EAAoB,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAwB,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhE;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAgB,mCAAmC,CAAC,CACjG,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAC7C;CAAG;AAEJ,uFAAuF;AACvF,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,KAAK,CAChD,sCAAsC,CACvC,CAAC;IACA,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,UAAU;IAClB,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;CACnC,CAAC;CAAG;AAEL,yCAAyC;AACzC,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAgB,mCAAmC,CAAC,CACjG;IACE,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,UAAU;IAClB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;CACnC,CACF;CAAG;AAEJ,iFAAiF;AACjF,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,KAAK,CAAe,kCAAkC,CAAC,CAAC;IAC/F,MAAM,EAAE,UAAU;IAClB,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;IAClC,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACzC,CAAC;CAAG;AAEL,kFAAkF;AAClF,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,KAAK,CACjD,uCAAuC,CACxC,CAAC;IACA,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,UAAU;IAClB,0FAA0F;IAC1F,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;IAClC,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC,OAAO;CACzB,CAAC;CAAG;AAEL;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAgB,mCAAmC,CAAC,CACjG;IACE,+EAA+E;IAC/E,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAClE,wFAAwF;IACxF,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;IACzC,yFAAyF;IACzF,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,EAAE,UAAU;IAClB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACtC;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;CACnC,CACF;CAAG;AAEJ,MAAM,KAAK,GAA+B,CAAC,SAAS,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAEnF,MAAM,MAAM,GAAG,CAAC,IAAiB,EAAE,GAA6B,EAAwB,EAAE,CACxF,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;IAChB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;IAClB,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;CACnF,CAAC,CAAC;AAEL,sGAAsG;AACtG,MAAM,YAAY,GAAG,CAAC,EACpB,OAAO,EACP,OAAO,EACP,SAAS,GACY,EAA4B,EAAE,CACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO;IACzD,CAAC,CAAC,OAAO;IACT,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAQtF;;;GAGG;AACH,MAAM,QAAQ,GAAG,CAAC,OAAuC,EAAY,EAAE;IACrE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkE,CAAC;IAC1F,KAAK,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,OAAO,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,sBAAsB;YAAE,SAAS;QAC/F,MAAM,GAAG,GAAG,GAAG,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW;YACpF,SAAS;QACX,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnD,GAAG,KAAK;QACR,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;KAClC,CAAC,CAAC,CAAC;IACJ,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,IAAI,gBAAgB,CAAC;YAC1B,SAAS;YACT,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,WAAW;YAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,IAAI,GAAG,CAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QACpB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO;QACxC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;QAC7B,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,EAAE,CACP,CACF,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO;YACL,IAAI,aAAa,CAAC;gBAChB,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC7E,IAAI,EAAE,MAAM,CACV,IAAI,EACJ,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;oBAC7B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;oBACvE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAClB;aACF,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO;QACL,IAAI,EAAE,IAAI,YAAY,CAAC;YACrB,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;YAC9E,KAAK;YACL,QAAQ;SACT,CAAC;QACF,aAAa;KACd,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAGE,EACF,KAAuC,EACxB,EAAE;IACjB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,YAAY,GAAkB,EAAE,CAAC;IACvC,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QAChC,KAAK,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;YACvD,IAAI,OAAO,KAAK,IAAI;gBAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBAC9C,IAAI,OAAO,KAAK,IAAI;gBAAE,UAAU,IAAI,CAAC,CAAC;;gBACtC,cAAc,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/E,OAAO;YACL,IAAI,iBAAiB,CAAC;gBACpB,IAAI;gBACJ,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC7E,IAAI,EAAE,MAAM,CACV,IAAI,EACJ,KAAK,CAAC,MAAM,KAAK,CAAC;oBAChB,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;oBACf,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAC1E;gBACD,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;aACxC,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,IAAI,aAAa,CAAC;QACvB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;QAC1C,YAAY;QACZ,UAAU;QACV,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9E,KAAK;QACL,IAAI,EACF,KAAK,CAAC,MAAM,KAAK,CAAC;YAChB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,aAAa,CAAC;gBAChB,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;gBACjE,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC;aACjD,CAAC;KACT,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAA6C,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAU,CAAC,CAAC;IAEjE,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAgB;QAC3F,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,oBAAoB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5F,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAwB;QAC/E,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9F,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5F,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YACtC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxB,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CACtB,qFAAqF,EACrF,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAClC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE;YACvC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;YACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM;YAC/B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM;YACpE,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;SACxE,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAIH;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,OAAO,EAGhD,CAAC,oCAAoC,CAAC;IACvC,MAAM,CAAU,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;CAC1E"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { CycleBudgets } from "@usine/engine/cycle-budget";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
/**
|
|
4
|
+
* Closes each open cycle-budget Ask of `repository` whose stored Item is closed, merged, or gone
|
|
5
|
+
* from GitHub, with the reason `ItemClosed`. The Items keep their cycle budgets.
|
|
6
|
+
*/
|
|
7
|
+
export declare const closeAsksOfClosedItems: (repository: string & import("effect/Brand").Brand<"RepositoryName">) => Effect.Effect<void, import("@usine/engine/engine").EnginePersistenceError, CycleBudgets | import("@usine/engine/item-projection").ItemProjectionReader>;
|
|
8
|
+
//# sourceMappingURL=closed-item-asks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closed-item-asks.d.ts","sourceRoot":"","sources":["../../src/polling/closed-item-asks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAGxC;;;GAGG;AACH,eAAO,MAAM,sBAAsB,kOAyBlC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { canonicalRepositoryName } from "@usine/core/repository";
|
|
2
|
+
import { CycleBudgets } from "@usine/engine/cycle-budget";
|
|
3
|
+
import { Effect, Option } from "effect";
|
|
4
|
+
import { settledItemState } from "../board/items.js";
|
|
5
|
+
/**
|
|
6
|
+
* Closes each open cycle-budget Ask of `repository` whose stored Item is closed, merged, or gone
|
|
7
|
+
* from GitHub, with the reason `ItemClosed`. The Items keep their cycle budgets.
|
|
8
|
+
*/
|
|
9
|
+
export const closeAsksOfClosedItems = Effect.fn("PollingTriggers.closeAsksOfClosedItems")(function* (repository) {
|
|
10
|
+
yield* Effect.annotateCurrentSpan({ repository });
|
|
11
|
+
const budgets = yield* CycleBudgets;
|
|
12
|
+
const asks = (yield* budgets.asks()).filter((ask) => canonicalRepositoryName(ask.repository) === canonicalRepositoryName(repository));
|
|
13
|
+
for (const ask of asks) {
|
|
14
|
+
const fields = { askId: ask.id, itemKey: ask.itemKey, repository: ask.repository };
|
|
15
|
+
const state = yield* settledItemState(ask.itemKey);
|
|
16
|
+
if (Option.isNone(state)) {
|
|
17
|
+
yield* Effect.logDebug("Cycle-budget Ask stays open; its Item is open or not stored", fields);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const closed = yield* budgets.close(ask.id, "ItemClosed");
|
|
21
|
+
if (closed)
|
|
22
|
+
yield* Effect.logInfo("Item is closed; its cycle-budget Ask leaves Needs attention", {
|
|
23
|
+
...fields,
|
|
24
|
+
itemState: state.value,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=closed-item-asks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"closed-item-asks.js","sourceRoot":"","sources":["../../src/polling/closed-item-asks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAuB,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,EAAE,CAAC,wCAAwC,CAAC,CACvF,QAAQ,CAAC,EAAE,UAA0B;IACnC,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,uBAAuB,CAAC,UAAU,CAAC,CACzF,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;QACnF,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CACpB,6DAA6D,EAC7D,MAAM,CACP,CAAC;YACF,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,MAAM;YACR,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,6DAA6D,EAAE;gBACnF,GAAG,MAAM;gBACT,SAAS,EAAE,KAAK,CAAC,KAAK;aACvB,CAAC,CAAC;IACP,CAAC;AACH,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type BaseRefHead, type ChangedItem, GitHubPolling, type PayloadSnapshot } from "@usine/github/polling";
|
|
2
|
+
import { Effect, Option, Schema } from "effect";
|
|
3
|
+
declare const OpenPullRequest_base: Schema.Class<OpenPullRequest, Schema.Struct<{
|
|
4
|
+
readonly number: Schema.Int;
|
|
5
|
+
readonly updatedAt: Schema.DateTimeUtcFromString;
|
|
6
|
+
/** `None` in a cursor written before polling recorded base branches. */
|
|
7
|
+
readonly baseRefName: Schema.OptionFromOptionalKey<Schema.brand<Schema.NonEmptyString, "GitHubBaseRefName">>;
|
|
8
|
+
readonly mergeable: Schema.withDecodingDefaultKey<Schema.String, never>;
|
|
9
|
+
/** Older cursors refresh once to learn whether checks have settled. */
|
|
10
|
+
readonly checksUnsettled: Schema.withDecodingDefaultKey<Schema.Boolean, never>;
|
|
11
|
+
}>, {}>;
|
|
12
|
+
/** An open pull request's last observed base branch, mergeability, and check refresh state. */
|
|
13
|
+
export declare class OpenPullRequest extends OpenPullRequest_base {
|
|
14
|
+
}
|
|
15
|
+
/** Returns the cursor entry for a fetched Item, or `None` unless the Item is an open pull request. */
|
|
16
|
+
export declare const openPullRequest: (item: ChangedItem, snapshot: PayloadSnapshot) => Option.Option<OpenPullRequest>;
|
|
17
|
+
/**
|
|
18
|
+
* Reads the head of each base branch that `openPullRequests` target, with one conditional request
|
|
19
|
+
* per branch, and returns the pull requests to fetch again: those whose base branch isn't recorded,
|
|
20
|
+
* moved, or couldn't be read, and those whose mergeability or checks are unsettled. Leaves out the
|
|
21
|
+
* numbers in `fetched`, which the poll fetches anyway. Fails only if GitHub rate-limits a read.
|
|
22
|
+
*/
|
|
23
|
+
export declare const openPullRequestRefresh: (repository: string & import("effect/Brand").Brand<"RepositoryName">, openPullRequests: readonly OpenPullRequest[], recordedHeads: readonly BaseRefHead[], fetched: ReadonlySet<number>) => Effect.Effect<{
|
|
24
|
+
refreshed: OpenPullRequest[];
|
|
25
|
+
baseRefHeads: BaseRefHead[];
|
|
26
|
+
}, import("@usine/github/github-app").GitHubRateLimitError, GitHubPolling>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=open-pull-requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-pull-requests.d.ts","sourceRoot":"","sources":["../../src/polling/open-pull-requests.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,WAAW,EAEhB,aAAa,EACb,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAgB,MAAM,EAAE,MAAM,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;IAWpE,wEAAwE;;;IAGxE,uEAAuE;;;AATzE,+FAA+F;AAC/F,qBAAa,eAAgB,SAAQ,oBAUnC;CAAG;AAEL,sGAAsG;AACtG,eAAO,MAAM,eAAe,SACpB,WAAW,YACP,eAAe,KACxB,MAAM,CAAC,MAAM,CAAC,eAAe,CAeb,CAAC;AAmFpB;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;0EAmElC,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { BaseRefName, ChangedPullRequest, GitHubPolling, } from "@usine/github/polling";
|
|
2
|
+
import { Array as Arr, Effect, Option, Result, Schema } from "effect";
|
|
3
|
+
import { repositoryFailureLogFields } from "./cycle.js";
|
|
4
|
+
const BASE_REF_CONCURRENCY = 4;
|
|
5
|
+
/** An open pull request's last observed base branch, mergeability, and check refresh state. */
|
|
6
|
+
export class OpenPullRequest extends Schema.Class("@usine/orchestrator/OpenPullRequest")({
|
|
7
|
+
number: ChangedPullRequest.fields.number,
|
|
8
|
+
updatedAt: Schema.DateTimeUtcFromString,
|
|
9
|
+
/** `None` in a cursor written before polling recorded base branches. */
|
|
10
|
+
baseRefName: Schema.OptionFromOptionalKey(BaseRefName),
|
|
11
|
+
mergeable: Schema.String.pipe(Schema.withDecodingDefaultKey(Effect.succeed("UNKNOWN"))),
|
|
12
|
+
/** Older cursors refresh once to learn whether checks have settled. */
|
|
13
|
+
checksUnsettled: Schema.Boolean.pipe(Schema.withDecodingDefaultKey(Effect.succeed(true))),
|
|
14
|
+
}) {
|
|
15
|
+
}
|
|
16
|
+
/** Returns the cursor entry for a fetched Item, or `None` unless the Item is an open pull request. */
|
|
17
|
+
export const openPullRequest = (item, snapshot) => snapshot._tag === "PullRequestSnapshot" && snapshot.payload.state === "OPEN"
|
|
18
|
+
? Option.some(new OpenPullRequest({
|
|
19
|
+
number: item.number,
|
|
20
|
+
updatedAt: item.updatedAt,
|
|
21
|
+
baseRefName: Option.some(snapshot.payload.baseRefName),
|
|
22
|
+
mergeable: snapshot.payload.mergeable,
|
|
23
|
+
checksUnsettled: snapshot.payload.statusCheckRollup?.state === "PENDING" ||
|
|
24
|
+
snapshot.payload.statusCheckRollup?.state === "EXPECTED" ||
|
|
25
|
+
(snapshot.payload.statusCheckRollup === null &&
|
|
26
|
+
snapshot.payload.mergeStateStatus === "BLOCKED"),
|
|
27
|
+
}))
|
|
28
|
+
: Option.none();
|
|
29
|
+
const readBaseRef = Effect.fn("PollingTriggers.readBaseRef")(function* (repository, baseRefName, recorded, pullRequests) {
|
|
30
|
+
yield* Effect.annotateCurrentSpan({ repository, baseRefName });
|
|
31
|
+
const github = yield* GitHubPolling;
|
|
32
|
+
const result = yield* Effect.result(github.baseRefHead(repository, baseRefName, recorded));
|
|
33
|
+
if (Result.isFailure(result)) {
|
|
34
|
+
const error = result.failure;
|
|
35
|
+
// A rate limit interrupts the repository cycle, as for every other request, so the poll backs off.
|
|
36
|
+
if (error._tag === "GitHubRateLimitError")
|
|
37
|
+
return yield* error;
|
|
38
|
+
yield* Effect.logWarning("Could not read the base branch head; refreshing its open pull requests in this poll", {
|
|
39
|
+
repository,
|
|
40
|
+
baseRefName,
|
|
41
|
+
pullRequests: pullRequests.join(", "),
|
|
42
|
+
...repositoryFailureLogFields(error),
|
|
43
|
+
});
|
|
44
|
+
return { _tag: "Unreadable", recorded };
|
|
45
|
+
}
|
|
46
|
+
const head = result.success;
|
|
47
|
+
if (Option.isNone(recorded)) {
|
|
48
|
+
yield* Effect.logInfo("Base branch head recorded; refreshing its open pull requests once", {
|
|
49
|
+
repository,
|
|
50
|
+
baseRefName,
|
|
51
|
+
head: head.sha,
|
|
52
|
+
pullRequests: pullRequests.join(", "),
|
|
53
|
+
});
|
|
54
|
+
return { _tag: "Moved", head };
|
|
55
|
+
}
|
|
56
|
+
if (recorded.value.sha !== head.sha) {
|
|
57
|
+
yield* Effect.logInfo("Base branch head moved; refreshing its open pull requests", {
|
|
58
|
+
repository,
|
|
59
|
+
baseRefName,
|
|
60
|
+
previousHead: recorded.value.sha,
|
|
61
|
+
head: head.sha,
|
|
62
|
+
pullRequests: pullRequests.join(", "),
|
|
63
|
+
});
|
|
64
|
+
return { _tag: "Moved", head };
|
|
65
|
+
}
|
|
66
|
+
return { _tag: "Unchanged", head };
|
|
67
|
+
});
|
|
68
|
+
const refreshReason = (pullRequest, reads) => {
|
|
69
|
+
if (Option.isNone(pullRequest.baseRefName))
|
|
70
|
+
return Option.some("baseUnrecorded");
|
|
71
|
+
const read = reads.get(pullRequest.baseRefName.value);
|
|
72
|
+
if (read?._tag === "Moved")
|
|
73
|
+
return Option.some("baseMoved");
|
|
74
|
+
if (read?._tag === "Unreadable")
|
|
75
|
+
return Option.some("baseUnreadable");
|
|
76
|
+
if (pullRequest.mergeable === "UNKNOWN")
|
|
77
|
+
return Option.some("mergeableUnknown");
|
|
78
|
+
if (pullRequest.checksUnsettled)
|
|
79
|
+
return Option.some("checksUnsettled");
|
|
80
|
+
return Option.none();
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Reads the head of each base branch that `openPullRequests` target, with one conditional request
|
|
84
|
+
* per branch, and returns the pull requests to fetch again: those whose base branch isn't recorded,
|
|
85
|
+
* moved, or couldn't be read, and those whose mergeability or checks are unsettled. Leaves out the
|
|
86
|
+
* numbers in `fetched`, which the poll fetches anyway. Fails only if GitHub rate-limits a read.
|
|
87
|
+
*/
|
|
88
|
+
export const openPullRequestRefresh = Effect.fn("PollingTriggers.openPullRequestRefresh")(function* (repository, openPullRequests, recordedHeads, fetched) {
|
|
89
|
+
yield* Effect.annotateCurrentSpan({ repository });
|
|
90
|
+
if (openPullRequests.length === 0) {
|
|
91
|
+
return { refreshed: [], baseRefHeads: [] };
|
|
92
|
+
}
|
|
93
|
+
const byBaseRef = new Map();
|
|
94
|
+
for (const { number, baseRefName } of openPullRequests) {
|
|
95
|
+
if (Option.isNone(baseRefName))
|
|
96
|
+
continue;
|
|
97
|
+
const numbers = byBaseRef.get(baseRefName.value) ?? [];
|
|
98
|
+
numbers.push(number);
|
|
99
|
+
byBaseRef.set(baseRefName.value, numbers);
|
|
100
|
+
}
|
|
101
|
+
const reads = new Map(yield* Effect.forEach(byBaseRef, ([baseRefName, pullRequests]) => readBaseRef(repository, baseRefName, Option.fromNullishOr(recordedHeads.find((head) => head.baseRefName === baseRefName)), pullRequests).pipe(Effect.map((read) => [baseRefName, read])), { concurrency: BASE_REF_CONCURRENCY }));
|
|
102
|
+
const notFetched = openPullRequests.filter(({ number }) => !fetched.has(number));
|
|
103
|
+
const refreshed = notFetched.flatMap((pullRequest) => Option.toArray(Option.map(refreshReason(pullRequest, reads), (reason) => ({ pullRequest, reason }))));
|
|
104
|
+
if (refreshed.length === 0) {
|
|
105
|
+
yield* Effect.logDebug("No open pull request needs a refresh", {
|
|
106
|
+
repository,
|
|
107
|
+
openPullRequests: openPullRequests.length,
|
|
108
|
+
baseRefReads: reads.size,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const reasons = Arr.groupBy(refreshed, ({ reason }) => reason);
|
|
113
|
+
yield* Effect.logInfo("Refreshing open pull requests", {
|
|
114
|
+
repository,
|
|
115
|
+
baseRefReads: reads.size,
|
|
116
|
+
refreshed: refreshed.length,
|
|
117
|
+
skipped: notFetched.length - refreshed.length,
|
|
118
|
+
...Object.fromEntries(Object.entries(reasons).map(([reason, entries]) => [
|
|
119
|
+
reason,
|
|
120
|
+
entries.map(({ pullRequest }) => pullRequest.number).join(", "),
|
|
121
|
+
])),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
refreshed: refreshed.map(({ pullRequest }) => pullRequest),
|
|
126
|
+
baseRefHeads: [...reads.values()]
|
|
127
|
+
.flatMap((read) => read._tag === "Unreadable" ? Option.toArray(read.recorded) : [read.head])
|
|
128
|
+
.sort((left, right) => left.baseRefName.localeCompare(right.baseRefName)),
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=open-pull-requests.js.map
|