@usine/orchestrator 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +174 -52
  3. package/dist/board/items.d.ts +22 -3
  4. package/dist/board/items.d.ts.map +1 -1
  5. package/dist/board/items.js +44 -4
  6. package/dist/board/items.js.map +1 -1
  7. package/dist/board/projection.d.ts +8 -1
  8. package/dist/board/projection.d.ts.map +1 -1
  9. package/dist/board/projection.js +63 -14
  10. package/dist/board/projection.js.map +1 -1
  11. package/dist/board/tasks.d.ts +15 -3
  12. package/dist/board/tasks.d.ts.map +1 -1
  13. package/dist/board/tasks.js +28 -9
  14. package/dist/board/tasks.js.map +1 -1
  15. package/dist/cloudflare.d.ts +32 -0
  16. package/dist/cloudflare.d.ts.map +1 -0
  17. package/dist/cloudflare.js +68 -0
  18. package/dist/cloudflare.js.map +1 -0
  19. package/dist/credentials.d.ts +5 -6
  20. package/dist/credentials.d.ts.map +1 -1
  21. package/dist/credentials.js +22 -15
  22. package/dist/credentials.js.map +1 -1
  23. package/dist/current-instance/changes.d.ts +87 -0
  24. package/dist/current-instance/changes.d.ts.map +1 -0
  25. package/dist/current-instance/changes.js +141 -0
  26. package/dist/current-instance/changes.js.map +1 -0
  27. package/dist/current-instance/current-instance.d.ts +89 -0
  28. package/dist/current-instance/current-instance.d.ts.map +1 -0
  29. package/dist/current-instance/current-instance.js +163 -0
  30. package/dist/current-instance/current-instance.js.map +1 -0
  31. package/dist/exe-dev.d.ts +6 -2
  32. package/dist/exe-dev.d.ts.map +1 -1
  33. package/dist/exe-dev.js +10 -9
  34. package/dist/exe-dev.js.map +1 -1
  35. package/dist/http-client.d.ts +8 -0
  36. package/dist/http-client.d.ts.map +1 -0
  37. package/dist/http-client.js +8 -0
  38. package/dist/http-client.js.map +1 -0
  39. package/dist/idle-triggers.d.ts +1 -1
  40. package/dist/idle-triggers.d.ts.map +1 -1
  41. package/dist/idle-triggers.js +1 -1
  42. package/dist/idle-triggers.js.map +1 -1
  43. package/dist/label-reconciler.d.ts +5 -2
  44. package/dist/label-reconciler.d.ts.map +1 -1
  45. package/dist/label-reconciler.js.map +1 -1
  46. package/dist/lease-order.d.ts +60 -0
  47. package/dist/lease-order.d.ts.map +1 -0
  48. package/dist/lease-order.js +76 -0
  49. package/dist/lease-order.js.map +1 -0
  50. package/dist/local.d.ts +4 -18
  51. package/dist/local.d.ts.map +1 -1
  52. package/dist/local.js +9 -45
  53. package/dist/local.js.map +1 -1
  54. package/dist/loop-matches.d.ts +28 -0
  55. package/dist/loop-matches.d.ts.map +1 -0
  56. package/dist/loop-matches.js +74 -0
  57. package/dist/loop-matches.js.map +1 -0
  58. package/dist/operator/attempt.d.ts +76 -10
  59. package/dist/operator/attempt.d.ts.map +1 -1
  60. package/dist/operator/attempt.js +69 -11
  61. package/dist/operator/attempt.js.map +1 -1
  62. package/dist/operator/board.d.ts +48 -16
  63. package/dist/operator/board.d.ts.map +1 -1
  64. package/dist/operator/board.js +48 -17
  65. package/dist/operator/board.js.map +1 -1
  66. package/dist/operator/configuration.d.ts +314 -0
  67. package/dist/operator/configuration.d.ts.map +1 -0
  68. package/dist/operator/configuration.js +490 -0
  69. package/dist/operator/configuration.js.map +1 -0
  70. package/dist/operator/desk.d.ts +206 -0
  71. package/dist/operator/desk.d.ts.map +1 -0
  72. package/dist/operator/desk.js +525 -0
  73. package/dist/operator/desk.js.map +1 -0
  74. package/dist/operator/github-changes.d.ts +88 -0
  75. package/dist/operator/github-changes.d.ts.map +1 -0
  76. package/dist/operator/github-changes.js +266 -0
  77. package/dist/operator/github-changes.js.map +1 -0
  78. package/dist/operator/http.d.ts +135 -105
  79. package/dist/operator/http.d.ts.map +1 -1
  80. package/dist/operator/http.js +155 -30
  81. package/dist/operator/http.js.map +1 -1
  82. package/dist/operator/machines.d.ts +71 -0
  83. package/dist/operator/machines.d.ts.map +1 -0
  84. package/dist/operator/machines.js +103 -0
  85. package/dist/operator/machines.js.map +1 -0
  86. package/dist/operator/need.d.ts +58 -11
  87. package/dist/operator/need.d.ts.map +1 -1
  88. package/dist/operator/need.js +61 -9
  89. package/dist/operator/need.js.map +1 -1
  90. package/dist/operator/operator.d.ts +135 -29
  91. package/dist/operator/operator.d.ts.map +1 -1
  92. package/dist/operator/operator.js +370 -63
  93. package/dist/operator/operator.js.map +1 -1
  94. package/dist/operator/overview.d.ts +7 -7
  95. package/dist/operator/overview.d.ts.map +1 -1
  96. package/dist/operator/overview.js +5 -5
  97. package/dist/operator/overview.js.map +1 -1
  98. package/dist/operator/projection.d.ts +56 -5
  99. package/dist/operator/projection.d.ts.map +1 -1
  100. package/dist/operator/projection.js +108 -9
  101. package/dist/operator/projection.js.map +1 -1
  102. package/dist/operator/run.d.ts +101 -6
  103. package/dist/operator/run.d.ts.map +1 -1
  104. package/dist/operator/run.js +100 -7
  105. package/dist/operator/run.js.map +1 -1
  106. package/dist/operator/statistics/cache.d.ts +7 -0
  107. package/dist/operator/statistics/cache.d.ts.map +1 -0
  108. package/dist/operator/statistics/cache.js +40 -0
  109. package/dist/operator/statistics/cache.js.map +1 -0
  110. package/dist/operator/statistics/runs.d.ts +36 -0
  111. package/dist/operator/statistics/runs.d.ts.map +1 -0
  112. package/dist/operator/statistics/runs.js +284 -0
  113. package/dist/operator/statistics/runs.js.map +1 -0
  114. package/dist/operator/statistics/statistics.d.ts +20 -0
  115. package/dist/operator/statistics/statistics.d.ts.map +1 -0
  116. package/dist/operator/statistics/statistics.js +138 -0
  117. package/dist/operator/statistics/statistics.js.map +1 -0
  118. package/dist/operator/statistics/tasks.d.ts +30 -0
  119. package/dist/operator/statistics/tasks.d.ts.map +1 -0
  120. package/dist/operator/statistics/tasks.js +244 -0
  121. package/dist/operator/statistics/tasks.js.map +1 -0
  122. package/dist/operator/statistics/view.d.ts +302 -0
  123. package/dist/operator/statistics/view.d.ts.map +1 -0
  124. package/dist/operator/statistics/view.js +243 -0
  125. package/dist/operator/statistics/view.js.map +1 -0
  126. package/dist/operator/statistics/window.d.ts +24 -0
  127. package/dist/operator/statistics/window.d.ts.map +1 -0
  128. package/dist/operator/statistics/window.js +47 -0
  129. package/dist/operator/statistics/window.js.map +1 -0
  130. package/dist/operator/task.d.ts +94 -0
  131. package/dist/operator/task.d.ts.map +1 -0
  132. package/dist/operator/task.js +204 -0
  133. package/dist/operator/task.js.map +1 -0
  134. package/dist/operator/transcript.d.ts +12 -12
  135. package/dist/operator/transcript.d.ts.map +1 -1
  136. package/dist/operator/transcript.js +11 -9
  137. package/dist/operator/transcript.js.map +1 -1
  138. package/dist/operator/usage.d.ts +103 -0
  139. package/dist/operator/usage.d.ts.map +1 -0
  140. package/dist/operator/usage.js +234 -0
  141. package/dist/operator/usage.js.map +1 -0
  142. package/dist/orchestrator.d.ts +8 -5
  143. package/dist/orchestrator.d.ts.map +1 -1
  144. package/dist/orchestrator.js +4 -2
  145. package/dist/orchestrator.js.map +1 -1
  146. package/dist/polling/closed-item-asks.d.ts +8 -0
  147. package/dist/polling/closed-item-asks.d.ts.map +1 -0
  148. package/dist/polling/closed-item-asks.js +28 -0
  149. package/dist/polling/closed-item-asks.js.map +1 -0
  150. package/dist/polling/cycle.d.ts +28 -10
  151. package/dist/polling/cycle.d.ts.map +1 -1
  152. package/dist/polling/cycle.js +20 -6
  153. package/dist/polling/cycle.js.map +1 -1
  154. package/dist/polling/evaluation-failures.d.ts +42 -0
  155. package/dist/polling/evaluation-failures.d.ts.map +1 -0
  156. package/dist/polling/evaluation-failures.js +103 -0
  157. package/dist/polling/evaluation-failures.js.map +1 -0
  158. package/dist/polling/hints.d.ts +2 -2
  159. package/dist/polling/hints.d.ts.map +1 -1
  160. package/dist/polling/hints.js +2 -2
  161. package/dist/polling/hints.js.map +1 -1
  162. package/dist/polling/loop-evaluation.d.ts +21 -11
  163. package/dist/polling/loop-evaluation.d.ts.map +1 -1
  164. package/dist/polling/loop-evaluation.js +70 -27
  165. package/dist/polling/loop-evaluation.js.map +1 -1
  166. package/dist/polling/open-issues.d.ts +23 -0
  167. package/dist/polling/open-issues.d.ts.map +1 -0
  168. package/dist/polling/open-issues.js +77 -0
  169. package/dist/polling/open-issues.js.map +1 -0
  170. package/dist/polling/open-pull-requests.d.ts +28 -0
  171. package/dist/polling/open-pull-requests.d.ts.map +1 -0
  172. package/dist/polling/open-pull-requests.js +131 -0
  173. package/dist/polling/open-pull-requests.js.map +1 -0
  174. package/dist/polling/polling.d.ts +20 -11
  175. package/dist/polling/polling.d.ts.map +1 -1
  176. package/dist/polling/polling.js +215 -52
  177. package/dist/polling/polling.js.map +1 -1
  178. package/dist/polling/repository-sync.d.ts +21 -14
  179. package/dist/polling/repository-sync.d.ts.map +1 -1
  180. package/dist/polling/repository-sync.js +35 -28
  181. package/dist/polling/repository-sync.js.map +1 -1
  182. package/dist/polling-triggers.d.ts +1 -1
  183. package/dist/polling-triggers.d.ts.map +1 -1
  184. package/dist/polling-triggers.js +1 -1
  185. package/dist/polling-triggers.js.map +1 -1
  186. package/dist/reloads.d.ts +14 -0
  187. package/dist/reloads.d.ts.map +1 -0
  188. package/dist/reloads.js +7 -0
  189. package/dist/reloads.js.map +1 -0
  190. package/dist/runtime.d.ts +24 -0
  191. package/dist/runtime.d.ts.map +1 -0
  192. package/dist/runtime.js +58 -0
  193. package/dist/runtime.js.map +1 -0
  194. package/dist/schedule-triggers.d.ts +14 -10
  195. package/dist/schedule-triggers.d.ts.map +1 -1
  196. package/dist/schedule-triggers.js +36 -31
  197. package/dist/schedule-triggers.js.map +1 -1
  198. package/dist/scheduler.d.ts +45 -5
  199. package/dist/scheduler.d.ts.map +1 -1
  200. package/dist/scheduler.js +587 -44
  201. package/dist/scheduler.js.map +1 -1
  202. package/dist/ssh.d.ts +103 -0
  203. package/dist/ssh.d.ts.map +1 -0
  204. package/dist/ssh.js +144 -0
  205. package/dist/ssh.js.map +1 -0
  206. package/dist/trigger-condition.d.ts +12 -0
  207. package/dist/trigger-condition.d.ts.map +1 -0
  208. package/dist/trigger-condition.js +88 -0
  209. package/dist/trigger-condition.js.map +1 -0
  210. package/dist/trigger-submission.d.ts +16 -13
  211. package/dist/trigger-submission.d.ts.map +1 -1
  212. package/dist/trigger-submission.js +19 -14
  213. package/dist/trigger-submission.js.map +1 -1
  214. package/dist/worker-engine.d.ts +13 -0
  215. package/dist/worker-engine.d.ts.map +1 -0
  216. package/dist/worker-engine.js +56 -0
  217. package/dist/worker-engine.js.map +1 -0
  218. package/dist/worker-status.d.ts +140 -0
  219. package/dist/worker-status.d.ts.map +1 -0
  220. package/dist/worker-status.js +76 -0
  221. package/dist/worker-status.js.map +1 -0
  222. package/package.json +47 -22
@@ -1,14 +1,22 @@
1
+ import { BrainSpec } from "@usine/core/agent/brain";
2
+ import { RunAgain } from "@usine/core/run/again";
3
+ import { ApprovalSource } from "@usine/core/run/approval";
1
4
  import { Schema } from "effect";
2
5
  import { AttemptView } from "./attempt.ts";
6
+ import { MachineView } from "./machines.ts";
3
7
  import { TranscriptEventView, TranscriptPageCursor } from "./transcript.ts";
4
- /** The persisted Run lifecycle state as exposed in operator views. */
8
+ import { RunUsageView } from "./usage.ts";
9
+ /** The stored Run lifecycle state as shown in operator views. */
5
10
  export declare const RunStateTag: Schema.Literals<readonly ["Pending", "Waiting", "Queued", "Running", "Succeeded", "Failed", "Canceled"]>;
6
11
  export type RunStateTag = typeof RunStateTag.Type;
7
12
  declare const EditAndRetry_base: Schema.Class<EditAndRetry, Schema.Struct<{
8
13
  readonly task: Schema.brand<Schema.String, "AttemptTask">;
9
14
  readonly agent: Schema.brand<Schema.String, "AgentName">;
10
15
  }>, {}>;
11
- /** The operator's replacement task and selected roster member; the server derives the Agent's persona and brain. */
16
+ /**
17
+ * The operator's replacement task and roster Agent. The server derives the Agent's persona and
18
+ * brain.
19
+ */
12
20
  export declare class EditAndRetry extends EditAndRetry_base {
13
21
  }
14
22
  declare const SessionIntervention_base: Schema.Class<SessionIntervention, Schema.Struct<{
@@ -23,39 +31,126 @@ declare const RosterAgentNotFoundError_base: Schema.Class<RosterAgentNotFoundErr
23
31
  readonly agent: Schema.brand<Schema.String, "AgentName">;
24
32
  readonly message: Schema.String;
25
33
  }>, import("effect/Cause").YieldableError>;
26
- /** The requested Agent is absent from the loaded instance roster. */
34
+ /** The requested Agent isn't in the loaded roster. */
27
35
  export declare class RosterAgentNotFoundError extends RosterAgentNotFoundError_base {
28
36
  }
37
+ declare const LoopNotFoundError_base: Schema.Class<LoopNotFoundError, Schema.TaggedStruct<"LoopNotFoundError", {
38
+ readonly loop: Schema.brand<Schema.NonEmptyString, "LoopName">;
39
+ readonly message: Schema.String;
40
+ }>, import("effect/Cause").YieldableError>;
41
+ /** The Run's Loop isn't in the loaded instance, so a new Run of it can't be opened. */
42
+ export declare class LoopNotFoundError extends LoopNotFoundError_base {
43
+ }
44
+ declare const ApprovalView_base: Schema.Class<ApprovalView, Schema.Struct<{
45
+ readonly approvedAt: Schema.String;
46
+ /** Null for approvals given before the approver was recorded. */
47
+ readonly source: Schema.NullOr<typeof ApprovalSource>;
48
+ }>, {}>;
49
+ /** A Run's approval: when it was given and, if recorded, who gave it and through which channel. */
50
+ export declare class ApprovalView extends ApprovalView_base {
51
+ }
29
52
  declare const RunView_base: Schema.Class<RunView, Schema.Struct<{
30
53
  readonly id: Schema.brand<Schema.NonEmptyString, "RunId">;
31
54
  readonly itemKey: Schema.brand<Schema.NonEmptyString, "ItemKey">;
32
55
  readonly loop: Schema.brand<Schema.NonEmptyString, "LoopName">;
33
56
  readonly repository: Schema.brand<Schema.String, "RepositoryName">;
34
57
  readonly agent: Schema.brand<Schema.String, "AgentName">;
58
+ /** The saved agent definition's brain, including any edit-and-retry amendment. */
59
+ readonly agentBrain: typeof BrainSpec;
35
60
  readonly state: Schema.Literals<readonly ["Pending", "Waiting", "Queued", "Running", "Succeeded", "Failed", "Canceled"]>;
36
61
  readonly loopPaused: Schema.Boolean;
37
62
  readonly openedAt: Schema.String;
63
+ /**
64
+ * When the Run last succeeded, failed, or was canceled, even before any Attempt. Null while open;
65
+ * a retry reopens a failed Run and clears it.
66
+ */
67
+ readonly closedAt: Schema.NullOr<Schema.String>;
38
68
  readonly task: Schema.String;
39
69
  readonly attempts: Schema.$Array<typeof AttemptView>;
70
+ /**
71
+ * The approval the Run consumed, or null until one arrives. Always null for a Loop with
72
+ * `approval: none`.
73
+ */
74
+ readonly approval: Schema.NullOr<typeof ApprovalView>;
75
+ /**
76
+ * The closed Run that the operator ran again to open this one, and who asked, or null for a
77
+ * trigger-opened Run. Its time is `openedAt`.
78
+ */
79
+ readonly runAgain: Schema.NullOr<typeof RunAgain>;
40
80
  readonly resultMessage: Schema.NullOr<Schema.String>;
41
81
  readonly pullRequestUrl: Schema.NullOr<Schema.String>;
42
82
  readonly canApprove: Schema.Boolean;
43
83
  readonly canRetry: Schema.Boolean;
84
+ /**
85
+ * Whether the latest failed Attempt still requests attention, independent of retry availability.
86
+ */
87
+ readonly canResolveFailure: Schema.Boolean;
44
88
  readonly canCancel: Schema.Boolean;
89
+ /**
90
+ * Whether the Run succeeded or was canceled, so the operator can open a new Run for its Item
91
+ * state.
92
+ */
93
+ readonly canRunAgain: Schema.Boolean;
45
94
  }>, {}>;
46
- /** A Run summary with its Attempts, result links, and currently available operator actions. */
95
+ /** A Run with its Attempts, result links, and available operator actions. */
47
96
  export declare class RunView extends RunView_base {
48
97
  }
98
+ declare const RunDurationView_base: Schema.Class<RunDurationView, Schema.Struct<{
99
+ /** The ended Attempts' time, each from start to recorded end. */
100
+ readonly endedMillis: Schema.Int;
101
+ /** The start of the running Attempt, or null if none runs. */
102
+ readonly runningSince: Schema.NullOr<Schema.String>;
103
+ /**
104
+ * The number of ended Attempts closed before end times were recorded, excluded from the total.
105
+ */
106
+ readonly unmeasured: Schema.Int;
107
+ }>, {}>;
108
+ /** The time a Run's Attempts worked, summed per Attempt. */
109
+ export declare class RunDurationView extends RunDurationView_base {
110
+ }
111
+ declare const UnconfirmedStopView_base: Schema.Class<UnconfirmedStopView, Schema.Struct<{
112
+ /** The Run of the Attempt: this Run, or an earlier Run of the Loop on the Item. */
113
+ readonly runId: Schema.brand<Schema.NonEmptyString, "RunId">;
114
+ readonly attemptNumber: Schema.brand<Schema.Int, "AttemptNumber">;
115
+ readonly worker: Schema.brand<Schema.String, "WorkerName">;
116
+ }>, {}>;
117
+ /**
118
+ * An Attempt on the Run's Loop and Item whose parent task isn't confirmed stopped. The open Run
119
+ * starts no Attempt until a reconcile confirms the stop (#523).
120
+ */
121
+ export declare class UnconfirmedStopView extends UnconfirmedStopView_base {
122
+ }
49
123
  declare const RunDetailView_base: Schema.Class<RunDetailView, Schema.Struct<{
50
124
  readonly run: typeof RunView;
125
+ /** Whether the loaded agent differs from the saved definition; false if no longer loaded. */
126
+ readonly agentDefinitionChanged: Schema.Boolean;
51
127
  readonly eventDedupKey: Schema.String;
52
128
  readonly eventPayload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
53
129
  readonly transcript: Schema.$Array<typeof TranscriptEventView>;
54
- /** Current session controls remain available when their last activity predates the transcript page. */
130
+ /**
131
+ * The current session controls, included even when their last activity is before the transcript
132
+ * page.
133
+ */
55
134
  readonly sessionState: Schema.$Array<typeof TranscriptEventView>;
56
135
  readonly earlierTranscript: Schema.$Array<typeof TranscriptPageCursor>;
136
+ /** The Worker of the newest Attempt, or null before the first Attempt. */
137
+ readonly worker: Schema.withConstructorDefault<Schema.NullOr<Schema.brand<Schema.String, "WorkerName">>>;
138
+ /**
139
+ * The state of the Run's Item from the newest poll if the Item is closed, merged, or gone, else
140
+ * null. Needs attention leaves out a failed Run on such an Item.
141
+ */
142
+ readonly settledItemState: Schema.withConstructorDefault<Schema.NullOr<Schema.Literals<readonly ["issue-closed", "pr-closed", "pr-merged"]>>>;
143
+ readonly duration: Schema.withConstructorDefault<typeof RunDurationView>;
144
+ readonly usage: Schema.withConstructorDefault<typeof RunUsageView>;
145
+ /** The unconfirmed stop that keeps the open Run from starting an Attempt, or null. */
146
+ readonly unconfirmedStop: Schema.withConstructorDefault<Schema.NullOr<typeof UnconfirmedStopView>>;
147
+ /**
148
+ * The machine a provisioned Worker creates or holds for the Run's next or running Attempt, or
149
+ * null.
150
+ */
151
+ readonly machine: Schema.withConstructorDefault<Schema.NullOr<typeof MachineView>>;
57
152
  }>, {}>;
58
- /** A Run summary with its triggering Event payload and a bounded portion of its transcript. */
153
+ /** A Run with its triggering Event payload, a page of its transcript, and its usage. */
59
154
  export declare class RunDetailView extends RunDetailView_base {
60
155
  }
61
156
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/operator/run.ts"],"names":[],"mappings":"AAQA,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,sEAAsE;AACtE,eAAO,MAAM,WAAW,0GAAuC,CAAC;AAChE,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAC;;;;;AAIlD,oHAAoH;AACpH,qBAAa,YAAa,SAAQ,iBAGhC;CAAG;;;;;;AAEL,wGAAwG;AACxG,qBAAa,mBAAoB,SAAQ,wBAMvC;CAAG;;;;;AAEL,qEAAqE;AACrE,qBAAa,wBAAyB,SAAQ,6BAE6B;CAAG;;;;;;;;;;;;;;;;;;AAE9E,+FAA+F;AAC/F,qBAAa,OAAQ,SAAQ,YAgB3B;CAAG;;;;;;IASD,uGAAuG;;;;AAP3G,+FAA+F;AAC/F,qBAAa,aAAc,SAAQ,kBAUlC;CAAG"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/operator/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAQpD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,OAAO,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,iEAAiE;AACjE,eAAO,MAAM,WAAW,0GAAuC,CAAC;AAChE,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAC;;;;;AAIlD;;;GAGG;AACH,qBAAa,YAAa,SAAQ,iBAGhC;CAAG;;;;;;AAEL,wGAAwG;AACxG,qBAAa,mBAAoB,SAAQ,wBAMvC;CAAG;;;;;AAEL,sDAAsD;AACtD,qBAAa,wBAAyB,SAAQ,6BAE6B;CAAG;;;;;AAE9E,uFAAuF;AACvF,qBAAa,iBAAkB,SAAQ,sBAE2B;CAAG;;;IAKnE,iEAAiE;;;AAHnE,mGAAmG;AACnG,qBAAa,YAAa,SAAQ,iBAIhC;CAAG;;;;;;;IASH,kFAAkF;;;;;IAKlF;;;OAGG;;;;IAIH;;;OAGG;;IAEH;;;OAGG;;;;;;IAMH;;OAEG;;;IAGH;;;OAGG;;;AAzCL,6EAA6E;AAC7E,qBAAa,OAAQ,SAAQ,YA0C3B;CAAG;;IASH,iEAAiE;;IAEjE,8DAA8D;;IAE9D;;OAEG;;;AAVL,4DAA4D;AAC5D,qBAAa,eAAgB,SAAQ,oBAWnC;CAAG;;IASH,mFAAmF;;;;;AAPrF;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,wBAOvC;CAAG;;;IAMD,6FAA6F;;;;;IAK7F;;;OAGG;;;IAGH,0EAA0E;;IAE1E;;;OAGG;;;;IAcH,sFAAsF;;IAItF;;;OAGG;;;AAzCP,wFAAwF;AACxF,qBAAa,aAAc,SAAQ,kBA2ClC;CAAG"}
@@ -1,18 +1,29 @@
1
+ import { SettledItemState } from "@usine/config/board";
1
2
  import { AgentName } from "@usine/core/agent";
2
- import { AttemptId, AttemptTask } from "@usine/core/attempt";
3
+ import { BrainSpec } from "@usine/core/agent/brain";
4
+ import { TokenCount } from "@usine/core/agent/session";
5
+ import { AttemptId, AttemptNumber, AttemptTask } from "@usine/core/attempt";
3
6
  import { OperatorAction, SessionTarget } from "@usine/core/attempt/channel";
4
7
  import { ItemKey } from "@usine/core/item";
5
8
  import { LoopName } from "@usine/core/loop";
6
9
  import { RepositoryName } from "@usine/core/repository";
7
10
  import { RunId } from "@usine/core/run";
11
+ import { RunAgain } from "@usine/core/run/again";
12
+ import { ApprovalSource } from "@usine/core/run/approval";
8
13
  import * as RunState from "@usine/core/run/state";
14
+ import { WorkerName } from "@usine/core/worker";
9
15
  import { Effect, Schema } from "effect";
10
16
  import { AttemptView } from "./attempt.js";
17
+ import { MachineView } from "./machines.js";
11
18
  import { TranscriptEventView, TranscriptPageCursor } from "./transcript.js";
12
- /** The persisted Run lifecycle state as exposed in operator views. */
19
+ import { RunUsageView } from "./usage.js";
20
+ /** The stored Run lifecycle state as shown in operator views. */
13
21
  export const RunStateTag = Schema.Literals(RunState.STATE_TAGS);
14
22
  const NullableString = Schema.NullOr(Schema.String);
15
- /** The operator's replacement task and selected roster member; the server derives the Agent's persona and brain. */
23
+ /**
24
+ * The operator's replacement task and roster Agent. The server derives the Agent's persona and
25
+ * brain.
26
+ */
16
27
  export class EditAndRetry extends Schema.Class("@usine/orchestrator/EditAndRetry")({
17
28
  task: AttemptTask,
18
29
  agent: AgentName,
@@ -25,37 +36,119 @@ export class SessionIntervention extends Schema.Class("@usine/orchestrator/Sessi
25
36
  action: OperatorAction,
26
37
  }) {
27
38
  }
28
- /** The requested Agent is absent from the loaded instance roster. */
39
+ /** The requested Agent isn't in the loaded roster. */
29
40
  export class RosterAgentNotFoundError extends Schema.TaggedError("@usine/orchestrator/RosterAgentNotFoundError")("RosterAgentNotFoundError", { agent: AgentName, message: Schema.String }) {
30
41
  }
31
- /** A Run summary with its Attempts, result links, and currently available operator actions. */
42
+ /** The Run's Loop isn't in the loaded instance, so a new Run of it can't be opened. */
43
+ export class LoopNotFoundError extends Schema.TaggedError("@usine/orchestrator/LoopNotFoundError")("LoopNotFoundError", { loop: LoopName, message: Schema.String }) {
44
+ }
45
+ /** A Run's approval: when it was given and, if recorded, who gave it and through which channel. */
46
+ export class ApprovalView extends Schema.Class("@usine/orchestrator/ApprovalView")({
47
+ approvedAt: Schema.String,
48
+ /** Null for approvals given before the approver was recorded. */
49
+ source: Schema.NullOr(ApprovalSource),
50
+ }) {
51
+ }
52
+ /** A Run with its Attempts, result links, and available operator actions. */
32
53
  export class RunView extends Schema.Class("@usine/orchestrator/RunView")({
33
54
  id: RunId,
34
55
  itemKey: ItemKey,
35
56
  loop: LoopName,
36
57
  repository: RepositoryName,
37
58
  agent: AgentName,
59
+ /** The saved agent definition's brain, including any edit-and-retry amendment. */
60
+ agentBrain: BrainSpec,
38
61
  state: RunStateTag,
39
62
  loopPaused: Schema.Boolean,
40
63
  openedAt: Schema.String,
64
+ /**
65
+ * When the Run last succeeded, failed, or was canceled, even before any Attempt. Null while open;
66
+ * a retry reopens a failed Run and clears it.
67
+ */
68
+ closedAt: Schema.NullOr(Schema.String),
41
69
  task: Schema.String,
42
70
  attempts: Schema.Array(AttemptView),
71
+ /**
72
+ * The approval the Run consumed, or null until one arrives. Always null for a Loop with
73
+ * `approval: none`.
74
+ */
75
+ approval: Schema.NullOr(ApprovalView),
76
+ /**
77
+ * The closed Run that the operator ran again to open this one, and who asked, or null for a
78
+ * trigger-opened Run. Its time is `openedAt`.
79
+ */
80
+ runAgain: Schema.NullOr(RunAgain),
43
81
  resultMessage: NullableString,
44
82
  pullRequestUrl: NullableString,
45
83
  canApprove: Schema.Boolean,
46
84
  canRetry: Schema.Boolean,
85
+ /**
86
+ * Whether the latest failed Attempt still requests attention, independent of retry availability.
87
+ */
88
+ canResolveFailure: Schema.Boolean,
47
89
  canCancel: Schema.Boolean,
90
+ /**
91
+ * Whether the Run succeeded or was canceled, so the operator can open a new Run for its Item
92
+ * state.
93
+ */
94
+ canRunAgain: Schema.Boolean,
95
+ }) {
96
+ }
97
+ const Milliseconds = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
98
+ const Count = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
99
+ /** The time a Run's Attempts worked, summed per Attempt. */
100
+ export class RunDurationView extends Schema.Class("@usine/orchestrator/RunDurationView")({
101
+ /** The ended Attempts' time, each from start to recorded end. */
102
+ endedMillis: Milliseconds,
103
+ /** The start of the running Attempt, or null if none runs. */
104
+ runningSince: Schema.NullOr(Schema.String),
105
+ /**
106
+ * The number of ended Attempts closed before end times were recorded, excluded from the total.
107
+ */
108
+ unmeasured: Count,
109
+ }) {
110
+ }
111
+ /**
112
+ * An Attempt on the Run's Loop and Item whose parent task isn't confirmed stopped. The open Run
113
+ * starts no Attempt until a reconcile confirms the stop (#523).
114
+ */
115
+ export class UnconfirmedStopView extends Schema.Class("@usine/orchestrator/UnconfirmedStopView")({
116
+ /** The Run of the Attempt: this Run, or an earlier Run of the Loop on the Item. */
117
+ runId: RunId,
118
+ attemptNumber: AttemptNumber,
119
+ worker: WorkerName,
48
120
  }) {
49
121
  }
50
- /** A Run summary with its triggering Event payload and a bounded portion of its transcript. */
122
+ /** A Run with its triggering Event payload, a page of its transcript, and its usage. */
51
123
  export class RunDetailView extends Schema.Class("@usine/orchestrator/RunDetailView")({
52
124
  run: RunView,
125
+ /** Whether the loaded agent differs from the saved definition; false if no longer loaded. */
126
+ agentDefinitionChanged: Schema.Boolean,
53
127
  eventDedupKey: Schema.String,
54
128
  eventPayload: Schema.Json,
55
129
  transcript: Schema.Array(TranscriptEventView),
56
- /** Current session controls remain available when their last activity predates the transcript page. */
130
+ /**
131
+ * The current session controls, included even when their last activity is before the transcript
132
+ * page.
133
+ */
57
134
  sessionState: Schema.Array(TranscriptEventView),
58
135
  earlierTranscript: Schema.Array(TranscriptPageCursor),
136
+ /** The Worker of the newest Attempt, or null before the first Attempt. */
137
+ worker: Schema.NullOr(WorkerName).pipe(Schema.withConstructorDefault(Effect.succeed(null))),
138
+ /**
139
+ * The state of the Run's Item from the newest poll if the Item is closed, merged, or gone, else
140
+ * null. Needs attention leaves out a failed Run on such an Item.
141
+ */
142
+ settledItemState: Schema.NullOr(SettledItemState).pipe(Schema.withConstructorDefault(Effect.succeed(null))),
143
+ duration: RunDurationView.pipe(Schema.withConstructorDefault(Effect.succeed(new RunDurationView({ endedMillis: 0, runningSince: null, unmeasured: 0 })))),
144
+ usage: RunUsageView.pipe(Schema.withConstructorDefault(Effect.succeed(new RunUsageView({ tokens: TokenCount.make(0), pools: [], sessions: [] })))),
145
+ /** The unconfirmed stop that keeps the open Run from starting an Attempt, or null. */
146
+ unconfirmedStop: Schema.NullOr(UnconfirmedStopView).pipe(Schema.withConstructorDefault(Effect.succeed(null))),
147
+ /**
148
+ * The machine a provisioned Worker creates or holds for the Run's next or running Attempt, or
149
+ * null.
150
+ */
151
+ machine: Schema.NullOr(MachineView).pipe(Schema.withConstructorDefault(Effect.succeed(null))),
59
152
  }) {
60
153
  }
61
154
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/operator/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/operator/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { LoadedInstance } from "@usine/config/instance";
2
+ import type { RunStoreError } from "@usine/engine/engine";
3
+ import type { RunReader } from "@usine/engine/run-reader";
4
+ import { Effect } from "effect";
5
+ import type { StatisticsWindow } from "./view.ts";
6
+ export declare const cacheStatistics: <View>(revision: RunReader["Service"]["revision"], compute: (instance: LoadedInstance, window: StatisticsWindow) => Effect.Effect<View, RunStoreError>) => (instance: LoadedInstance, window: "30d" | "7d" | "all") => Effect.Effect<View, import("@usine/engine/engine").EnginePersistenceError | import("@usine/engine/engine").RunNotFoundError | import("@usine/engine/engine").RunOperationRejectedError | import("@usine/engine/engine").RunRetryBlockedError, never>;
7
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/operator/statistics/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAsB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAS,MAAM,EAA2B,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAWlD,eAAO,MAAM,eAAe,GAAI,IAAI,YACxB,SAAS,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,WACjC,CACP,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,gBAAgB,KACrB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,qTAmDxC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { Clock, Effect, Option, SynchronizedRef } from "effect";
2
+ const MAX_AGE_MILLIS = 5 * 60 * 1_000;
3
+ export const cacheStatistics = (revision, compute) => {
4
+ const windows = new Map();
5
+ return Effect.fn("Operator.statistics.cached")(function* (instance, window) {
6
+ yield* Effect.annotateCurrentSpan({ window });
7
+ let cache = windows.get(window);
8
+ if (cache === undefined) {
9
+ cache = SynchronizedRef.makeUnsafe(Option.none());
10
+ windows.set(window, cache);
11
+ }
12
+ return yield* SynchronizedRef.modifyEffect(cache, (cached) => Effect.gen(function* () {
13
+ const current = yield* revision();
14
+ const now = yield* Clock.currentTimeMillis;
15
+ if (Option.isSome(current) &&
16
+ Option.isSome(cached) &&
17
+ cached.value.revision === current.value &&
18
+ cached.value.instance === instance &&
19
+ now < cached.value.expiresAt) {
20
+ yield* Effect.logDebug("Statistics cache hit", { window, revision: current.value });
21
+ return [cached.value.view, cached];
22
+ }
23
+ yield* Effect.logDebug("Statistics cache miss", { window, revision: current });
24
+ if (Option.isNone(current)) {
25
+ yield* Effect.logWarning("Projection revision singleton is missing; the statistics cache is bypassed", { window });
26
+ }
27
+ const view = yield* compute(instance, window);
28
+ return [
29
+ view,
30
+ Option.map(current, (revision) => ({
31
+ instance,
32
+ revision,
33
+ expiresAt: now + MAX_AGE_MILLIS,
34
+ view,
35
+ })),
36
+ ];
37
+ }));
38
+ });
39
+ };
40
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/operator/statistics/cache.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAGhE,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;AAStC,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAA0C,EAC1C,OAGuC,EACvC,EAAE;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAGpB,CAAC;IAEJ,OAAO,MAAM,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,EACtD,QAAwB,EACxB,MAAwB;QAExB,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9C,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAoB,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAC3D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAC3C,IACE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;gBACtB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;gBACrB,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,KAAK;gBACvC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAClC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,EAC5B,CAAC;gBACD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;gBACpF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAU,CAAC;YAC9C,CAAC;YACD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/E,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CACtB,4EAA4E,EAC5E,EAAE,MAAM,EAAE,CACX,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC9C,OAAO;gBACL,IAAI;gBACJ,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBACjC,QAAQ;oBACR,QAAQ;oBACR,SAAS,EAAE,GAAG,GAAG,cAAc;oBAC/B,IAAI;iBACL,CAAC,CAAC;aACK,CAAC;QACb,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Attempt } from "@usine/core/attempt";
2
+ import type { RunId } from "@usine/core/run";
3
+ import type { WorkerName } from "@usine/core/worker";
4
+ import type { RunSummary } from "@usine/engine/run-reader";
5
+ import { DateTime, Option } from "effect";
6
+ import type { RunUsageView } from "../usage.ts";
7
+ import { DurationSummaryView, RunStatisticsView, type StatisticsWindow } from "./view.ts";
8
+ /** A Worker that `usine.yaml` declares, with its `max_concurrent_attempts`. */
9
+ interface DeclaredWorker {
10
+ readonly name: WorkerName;
11
+ readonly slots: number;
12
+ }
13
+ /** The stored facts that `runStatisticsView` reduces. */
14
+ export interface RunStatisticsFacts {
15
+ readonly window: StatisticsWindow;
16
+ readonly now: DateTime.Utc;
17
+ /** The Runs that closed in the window and the open Runs. */
18
+ readonly runs: ReadonlyArray<RunSummary>;
19
+ /** The usage of each closed Run in `runs`. */
20
+ readonly usage: ReadonlyMap<RunId, RunUsageView>;
21
+ readonly workers: ReadonlyArray<DeclaredWorker>;
22
+ }
23
+ /** Returns the median of `durations`, or null if there are none. */
24
+ export declare const durationSummary: (durations: ReadonlyArray<number>) => DurationSummaryView | null;
25
+ /** Returns the Attempt's wall time, or `None` while it runs or if its end wasn't recorded. */
26
+ export declare const attemptMillis: (attempt: Attempt) => Option.Option<number>;
27
+ /** Whether the operator started the Attempt by retrying the failed Run, with or without an edit. */
28
+ export declare const operatorRetry: (attempt: Attempt | undefined) => attempt is Attempt;
29
+ /**
30
+ * Reduces the stored facts to the Run statistics of `window`. Run measures cover the Runs that
31
+ * closed in the window; queue wait, Worker utilization, and Needs attention also cover the open
32
+ * Runs.
33
+ */
34
+ export declare const runStatisticsView: ({ window, now, runs: stored, usage, workers, }: RunStatisticsFacts) => RunStatisticsView;
35
+ export {};
36
+ //# sourceMappingURL=runs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../../src/operator/statistics/runs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAwB,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,aAAa,CAAC;AAClE,OAAO,EAKL,mBAAmB,EAOnB,iBAAiB,EACjB,KAAK,gBAAgB,EAKtB,MAAM,WAAW,CAAC;AAgBnB,+EAA+E;AAC/E,UAAU,cAAc;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,yDAAyD;AACzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;CACjD;AAiBD,oEAAoE;AACpE,eAAO,MAAM,eAAe,cAAe,aAAa,CAAC,MAAM,CAAC,KAAG,mBAAmB,GAAG,IAKrF,CAAC;AA+BL,8FAA8F;AAC9F,eAAO,MAAM,aAAa,YAAa,OAAO,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAK9D,CAAC;AAsIR,oGAAoG;AACpG,eAAO,MAAM,aAAa,YAAa,OAAO,GAAG,SAAS,KAAG,OAAO,IAAI,OAEyB,CAAC;AAmElG;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,mDAM3B,kBAAkB,KAAG,iBA+HvB,CAAC"}