@usine/engine 0.3.0 → 0.5.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 (201) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +112 -38
  3. package/dist/board-moves/board-moves.d.ts +20 -0
  4. package/dist/board-moves/board-moves.d.ts.map +1 -0
  5. package/dist/board-moves/board-moves.js +74 -0
  6. package/dist/board-moves/board-moves.js.map +1 -0
  7. package/dist/board-moves/model.d.ts +21 -0
  8. package/dist/board-moves/model.d.ts.map +1 -0
  9. package/dist/board-moves/model.js +22 -0
  10. package/dist/board-moves/model.js.map +1 -0
  11. package/dist/cursor/cursor.d.ts +2 -6
  12. package/dist/cursor/cursor.d.ts.map +1 -1
  13. package/dist/cursor/cursor.js +2 -6
  14. package/dist/cursor/cursor.js.map +1 -1
  15. package/dist/cycle-budget/cycle-budget.d.ts +14 -8
  16. package/dist/cycle-budget/cycle-budget.d.ts.map +1 -1
  17. package/dist/cycle-budget/cycle-budget.js +51 -10
  18. package/dist/cycle-budget/cycle-budget.js.map +1 -1
  19. package/dist/cycle-budget/model.d.ts +6 -2
  20. package/dist/cycle-budget/model.d.ts.map +1 -1
  21. package/dist/cycle-budget/model.js +5 -2
  22. package/dist/cycle-budget/model.js.map +1 -1
  23. package/dist/cycle-budget/queries.d.ts +1 -1
  24. package/dist/cycle-budget/queries.d.ts.map +1 -1
  25. package/dist/cycle-budget/queries.js +3 -3
  26. package/dist/cycle-budget/queries.js.map +1 -1
  27. package/dist/database/database.d.ts +1 -1
  28. package/dist/database/database.d.ts.map +1 -1
  29. package/dist/database/local-sqlite.d.ts +13 -10
  30. package/dist/database/local-sqlite.d.ts.map +1 -1
  31. package/dist/database/local-sqlite.js +22 -17
  32. package/dist/database/local-sqlite.js.map +1 -1
  33. package/dist/database/schema.d.ts +668 -36
  34. package/dist/database/schema.d.ts.map +1 -1
  35. package/dist/database/schema.js +123 -23
  36. package/dist/database/schema.js.map +1 -1
  37. package/dist/{workflow → engine}/admission.d.ts +2 -2
  38. package/dist/engine/admission.d.ts.map +1 -0
  39. package/dist/{workflow → engine}/admission.js +4 -4
  40. package/dist/engine/admission.js.map +1 -0
  41. package/dist/engine/checkout-recovery.d.ts +79 -0
  42. package/dist/engine/checkout-recovery.d.ts.map +1 -0
  43. package/dist/engine/checkout-recovery.js +238 -0
  44. package/dist/engine/checkout-recovery.js.map +1 -0
  45. package/dist/engine/engine.d.ts +67 -26
  46. package/dist/engine/engine.d.ts.map +1 -1
  47. package/dist/engine/engine.js +136 -129
  48. package/dist/engine/engine.js.map +1 -1
  49. package/dist/engine/error.d.ts +29 -10
  50. package/dist/engine/error.d.ts.map +1 -1
  51. package/dist/engine/error.js +28 -8
  52. package/dist/engine/error.js.map +1 -1
  53. package/dist/engine/lifecycle.d.ts +83 -28
  54. package/dist/engine/lifecycle.d.ts.map +1 -1
  55. package/dist/engine/lifecycle.js +94 -45
  56. package/dist/engine/lifecycle.js.map +1 -1
  57. package/dist/engine/retry.d.ts +16 -0
  58. package/dist/engine/retry.d.ts.map +1 -0
  59. package/dist/engine/retry.js +18 -0
  60. package/dist/engine/retry.js.map +1 -0
  61. package/dist/engine/run-again.d.ts +45 -0
  62. package/dist/engine/run-again.d.ts.map +1 -0
  63. package/dist/engine/run-again.js +56 -0
  64. package/dist/engine/run-again.js.map +1 -0
  65. package/dist/engine/run-driver.d.ts +68 -0
  66. package/dist/engine/run-driver.d.ts.map +1 -0
  67. package/dist/engine/run-driver.js +448 -0
  68. package/dist/engine/run-driver.js.map +1 -0
  69. package/dist/engine/shutdown.d.ts +3 -4
  70. package/dist/engine/shutdown.d.ts.map +1 -1
  71. package/dist/engine/shutdown.js +3 -4
  72. package/dist/engine/shutdown.js.map +1 -1
  73. package/dist/engine/submission.d.ts +31 -11
  74. package/dist/engine/submission.d.ts.map +1 -1
  75. package/dist/engine/submission.js +43 -12
  76. package/dist/engine/submission.js.map +1 -1
  77. package/dist/engine/unconfirmed-stops.d.ts +27 -0
  78. package/dist/engine/unconfirmed-stops.d.ts.map +1 -0
  79. package/dist/engine/unconfirmed-stops.js +26 -0
  80. package/dist/engine/unconfirmed-stops.js.map +1 -0
  81. package/dist/item-projection/item-projection.d.ts +14 -4
  82. package/dist/item-projection/item-projection.d.ts.map +1 -1
  83. package/dist/item-projection/item-projection.js +60 -14
  84. package/dist/item-projection/item-projection.js.map +1 -1
  85. package/dist/item-projection/model.d.ts +5 -1
  86. package/dist/item-projection/model.d.ts.map +1 -1
  87. package/dist/item-projection/model.js +6 -2
  88. package/dist/item-projection/model.js.map +1 -1
  89. package/dist/loop-control/loop-control.d.ts +5 -5
  90. package/dist/loop-control/loop-control.d.ts.map +1 -1
  91. package/dist/loop-control/loop-control.js +4 -4
  92. package/dist/loop-control/loop-control.js.map +1 -1
  93. package/dist/loop-control/model.d.ts +1 -1
  94. package/dist/loop-control/model.d.ts.map +1 -1
  95. package/dist/loop-control/model.js +1 -1
  96. package/dist/loop-control/model.js.map +1 -1
  97. package/dist/repository-label-projection/model.d.ts +2 -2
  98. package/dist/repository-label-projection/model.d.ts.map +1 -1
  99. package/dist/repository-label-projection/model.js +2 -2
  100. package/dist/repository-label-projection/model.js.map +1 -1
  101. package/dist/repository-label-projection/repository-label-projection.d.ts +1 -1
  102. package/dist/repository-label-projection/repository-label-projection.d.ts.map +1 -1
  103. package/dist/repository-label-projection/repository-label-projection.js +1 -1
  104. package/dist/repository-label-projection/repository-label-projection.js.map +1 -1
  105. package/dist/run-reader/model.d.ts +62 -4
  106. package/dist/run-reader/model.d.ts.map +1 -1
  107. package/dist/run-reader/model.js +66 -7
  108. package/dist/run-reader/model.js.map +1 -1
  109. package/dist/run-reader/run-reader.d.ts +25 -10
  110. package/dist/run-reader/run-reader.d.ts.map +1 -1
  111. package/dist/run-reader/run-reader.js +25 -7
  112. package/dist/run-reader/run-reader.js.map +1 -1
  113. package/dist/step-executor.d.ts +86 -13
  114. package/dist/step-executor.d.ts.map +1 -1
  115. package/dist/step-executor.js +10 -2
  116. package/dist/step-executor.js.map +1 -1
  117. package/dist/store/attempt-windows.d.ts +8 -0
  118. package/dist/store/attempt-windows.d.ts.map +1 -0
  119. package/dist/store/attempt-windows.js +53 -0
  120. package/dist/store/attempt-windows.js.map +1 -0
  121. package/dist/store/codec.d.ts +242 -43
  122. package/dist/store/codec.d.ts.map +1 -1
  123. package/dist/store/codec.js +61 -16
  124. package/dist/store/codec.js.map +1 -1
  125. package/dist/store/leftovers.d.ts +10 -0
  126. package/dist/store/leftovers.d.ts.map +1 -0
  127. package/dist/store/leftovers.js +43 -0
  128. package/dist/store/leftovers.js.map +1 -0
  129. package/dist/store/loop-items.d.ts +16 -0
  130. package/dist/store/loop-items.d.ts.map +1 -0
  131. package/dist/store/loop-items.js +185 -0
  132. package/dist/store/loop-items.js.map +1 -0
  133. package/dist/store/queries.d.ts +385 -36
  134. package/dist/store/queries.d.ts.map +1 -1
  135. package/dist/store/queries.js +355 -107
  136. package/dist/store/queries.js.map +1 -1
  137. package/dist/store/store.d.ts +106 -54
  138. package/dist/store/store.d.ts.map +1 -1
  139. package/dist/store/store.js +497 -190
  140. package/dist/store/store.js.map +1 -1
  141. package/dist/store/transcript.d.ts +3 -3
  142. package/dist/store/transcript.d.ts.map +1 -1
  143. package/dist/store/transcript.js +25 -6
  144. package/dist/store/transcript.js.map +1 -1
  145. package/dist/transcript.d.ts +19 -20
  146. package/dist/transcript.d.ts.map +1 -1
  147. package/dist/transcript.js +23 -21
  148. package/dist/transcript.js.map +1 -1
  149. package/dist/trigger-condition.d.ts +23 -0
  150. package/dist/trigger-condition.d.ts.map +1 -0
  151. package/dist/trigger-condition.js +8 -0
  152. package/dist/trigger-condition.js.map +1 -0
  153. package/drizzle/20260917071139_resolve_run_failure/migration.sql +1 -0
  154. package/drizzle/20260917071139_resolve_run_failure/snapshot.json +1471 -0
  155. package/drizzle/20260918032643_attempt_salvage/migration.sql +1 -0
  156. package/drizzle/20260918032643_attempt_salvage/snapshot.json +1481 -0
  157. package/drizzle/20261011153856_drop_workflow_tables/migration.sql +4 -0
  158. package/drizzle/20261011153856_drop_workflow_tables/snapshot.json +1433 -0
  159. package/drizzle/20261017155043_attempt_salvage_check/migration.sql +41 -0
  160. package/drizzle/20261017155043_attempt_salvage_check/snapshot.json +1421 -0
  161. package/drizzle/20261018162700_discard_attempt_leftovers/migration.sql +1 -0
  162. package/drizzle/20261018162700_discard_attempt_leftovers/snapshot.json +1431 -0
  163. package/drizzle/20261018172605_loop_items_and_reopenings/migration.sql +15 -0
  164. package/drizzle/20261018172605_loop_items_and_reopenings/snapshot.json +1574 -0
  165. package/drizzle/20261018180339_attempt_ended_at/migration.sql +1 -0
  166. package/drizzle/20261018180339_attempt_ended_at/snapshot.json +1584 -0
  167. package/drizzle/20261019104043_run_approval_source/migration.sql +15 -0
  168. package/drizzle/20261019104043_run_approval_source/snapshot.json +1610 -0
  169. package/drizzle/20261019133538_board_moves/migration.sql +14 -0
  170. package/drizzle/20261019133538_board_moves/snapshot.json +1731 -0
  171. package/drizzle/20261019170538_item_projection_gone/migration.sql +1 -0
  172. package/drizzle/20261019170538_item_projection_gone/snapshot.json +1741 -0
  173. package/drizzle/20261019180649_run_again_events/migration.sql +7 -0
  174. package/drizzle/20261019180649_run_again_events/snapshot.json +1804 -0
  175. package/drizzle/20261019185008_trigger_event_permissions/migration.sql +1 -0
  176. package/drizzle/20261019185008_trigger_event_permissions/snapshot.json +1814 -0
  177. package/drizzle/20261020103746_attempt_start/migration.sql +5 -0
  178. package/drizzle/20261020103746_attempt_start/snapshot.json +1844 -0
  179. package/drizzle/20261020125211_attempt_comments/migration.sql +1 -0
  180. package/drizzle/20261020125211_attempt_comments/snapshot.json +1854 -0
  181. package/drizzle/20261020191320_run_closed_at/migration.sql +6 -0
  182. package/drizzle/20261020191320_run_closed_at/snapshot.json +1864 -0
  183. package/drizzle/20261023091428_rename_loop_item_hold_to_suppression/migration.sql +2 -0
  184. package/drizzle/20261023091428_rename_loop_item_hold_to_suppression/snapshot.json +1867 -0
  185. package/drizzle/20261024162954_cycle_ask_closures/migration.sql +10 -0
  186. package/drizzle/20261024162954_cycle_ask_closures/snapshot.json +1948 -0
  187. package/drizzle/20261027104206_attempt_out_of_memory/migration.sql +1 -0
  188. package/drizzle/20261027104206_attempt_out_of_memory/snapshot.json +1958 -0
  189. package/drizzle/20261027191944_failure_resolution/migration.sql +1 -0
  190. package/drizzle/20261027191944_failure_resolution/snapshot.json +1968 -0
  191. package/package.json +22 -12
  192. package/dist/workflow/admission.d.ts.map +0 -1
  193. package/dist/workflow/admission.js.map +0 -1
  194. package/dist/workflow/command.d.ts +0 -13
  195. package/dist/workflow/command.d.ts.map +0 -1
  196. package/dist/workflow/command.js +0 -17
  197. package/dist/workflow/command.js.map +0 -1
  198. package/dist/workflow/workflow.d.ts +0 -18
  199. package/dist/workflow/workflow.d.ts.map +0 -1
  200. package/dist/workflow/workflow.js +0 -108
  201. package/dist/workflow/workflow.js.map +0 -1
@@ -1,24 +1,28 @@
1
1
  import { Agent, AgentName } from "@usine/core/agent";
2
2
  import { CycleGeneration, CycleLimit } from "@usine/core/cycle-budget";
3
3
  import { BrainSpec, ModelId } from "@usine/core/agent/brain";
4
- import { Attempt, AttemptNumber, AttemptTask, AttemptId } from "@usine/core/attempt";
4
+ import { Attempt, FailureResolution, AttemptNumber, AttemptTask, AttemptId, ContainerOutOfMemoryKills, totalOutOfMemoryKills, } from "@usine/core/attempt";
5
5
  import * as AttemptChannel from "@usine/core/attempt/channel";
6
6
  import { AttemptOutcome } from "@usine/core/attempt/outcome";
7
+ import { AttemptSalvage } from "@usine/core/attempt/salvage";
8
+ import { AttemptStart, OperatorRetryStart } from "@usine/core/attempt/start";
7
9
  import { Event, DedupKey, EventId } from "@usine/core/event";
8
- import { ApprovalRequirement, LoopName } from "@usine/core/loop";
10
+ import { ApprovalRequirement, LoopName, LoopPermissions } from "@usine/core/loop";
9
11
  import { ItemKey } from "@usine/core/item";
10
12
  import { RepositoryName, RepositoryRevision } from "@usine/core/repository";
13
+ import { OperatorLogin } from "@usine/core/operator";
11
14
  import { RunId, Run } from "@usine/core/run";
15
+ import { RunAgain } from "@usine/core/run/again";
16
+ import { ApprovalChannel, ApprovalSource, RunApproval } from "@usine/core/run/approval";
12
17
  import { StepName, Step } from "@usine/core/step";
13
18
  import { WorkerName } from "@usine/core/worker";
14
19
  import * as RunState from "@usine/core/run/state";
15
- import { StepResult } from "@usine/core/step/result";
16
- import { Effect, Option, Schema } from "effect";
20
+ import { Comment, StepResult } from "@usine/core/step/result";
21
+ import { Array as EffectArray, Effect, Option, Schema } from "effect";
17
22
  import { EnginePersistenceError, RunStoreError } from "../engine/error.js";
18
23
  import { IgnoreReason, Submission } from "../engine/submission.js";
19
- import { ProjectionRevision, RunSummary } from "../run-reader/model.js";
24
+ import { ProjectionRevision, RunEvent, RunSummary } from "../run-reader/model.js";
20
25
  import { TranscriptEntry, TranscriptSequence } from "../transcript.js";
21
- import { WorkflowCommand } from "../workflow/command.js";
22
26
  export const EventRouteRow = Schema.Struct({
23
27
  eventId: EventId,
24
28
  dedupKey: DedupKey,
@@ -28,6 +32,7 @@ export const EventRouteRow = Schema.Struct({
28
32
  loop: LoopName,
29
33
  step: StepName,
30
34
  approval: ApprovalRequirement,
35
+ permissions: LoopPermissions,
31
36
  cycleLimit: Schema.NullOr(CycleLimit),
32
37
  cycleGeneration: CycleGeneration,
33
38
  repository: RepositoryName,
@@ -47,9 +52,16 @@ export const RunRow = Schema.Struct({
47
52
  eventId: EventId,
48
53
  loop: LoopName,
49
54
  state: RunState.RunState,
55
+ resolvedFailureAttemptId: Schema.NullOr(AttemptId),
50
56
  openedAt: Schema.DateTimeUtcFromString,
57
+ closedAt: Schema.NullOr(Schema.DateTimeUtcFromString),
51
58
  stepName: StepName,
52
59
  result: Schema.NullOr(StepResult),
60
+ approvedAt: Schema.NullOr(Schema.DateTimeUtcFromString),
61
+ approvalChannel: Schema.NullOr(ApprovalChannel),
62
+ approver: Schema.NullOr(OperatorLogin),
63
+ againFrom: Schema.NullOr(RunId),
64
+ againRequestedBy: Schema.NullOr(OperatorLogin),
53
65
  });
54
66
  export const AttemptRow = Schema.Struct({
55
67
  attemptId: AttemptId,
@@ -64,6 +76,13 @@ export const AttemptRow = Schema.Struct({
64
76
  parentModel: Schema.NullOr(ModelId),
65
77
  startedAt: Schema.DateTimeUtcFromString,
66
78
  outcome: Schema.NullOr(AttemptOutcome),
79
+ endedAt: Schema.NullOr(Schema.DateTimeUtcFromString),
80
+ salvage: Schema.NullOr(AttemptSalvage),
81
+ start: Schema.NullOr(AttemptStart),
82
+ failureResolution: Schema.NullOr(FailureResolution),
83
+ reattachedAt: Schema.NullOr(Schema.DateTimeUtcFromString),
84
+ comments: Schema.NullOr(Schema.Array(Comment)),
85
+ outOfMemory: Schema.NullOr(Schema.Array(ContainerOutOfMemoryKills)),
67
86
  });
68
87
  export const TranscriptRow = Schema.Struct({
69
88
  sequence: TranscriptSequence,
@@ -72,31 +91,39 @@ export const TranscriptRow = Schema.Struct({
72
91
  envelope: TranscriptEntry.fields.envelope,
73
92
  receivedAt: Schema.DateTimeUtcFromString,
74
93
  });
75
- const RecoverableRunRow = Schema.Struct({
76
- ...EventRouteRow.fields,
77
- runId: RunId,
78
- state: RunState.RunState,
79
- });
80
94
  const RunIdRow = Schema.Struct({ runId: RunId });
81
95
  const DiscardRow = Schema.Struct({ reason: IgnoreReason });
82
- export const WorkflowCommandRow = Schema.Struct({
96
+ const ProjectionRevisionRow = Schema.Struct({ revision: ProjectionRevision });
97
+ const RunEventRow = Schema.Struct({
83
98
  runId: RunId,
84
- command: WorkflowCommand,
99
+ eventId: EventId,
100
+ dedupKey: DedupKey,
101
+ payload: Schema.Json,
102
+ receivedAt: Schema.DateTimeUtcFromString,
85
103
  });
86
- const ProjectionRevisionRow = Schema.Struct({ revision: ProjectionRevision });
104
+ const ReopeningRow = Schema.Struct({ ...EventRouteRow.fields, reopening: Schema.Int });
105
+ const ReopenedEventRow = Schema.Struct({ eventId: EventId, dedupKey: DedupKey });
87
106
  export const decodeEventRoutes = Schema.decodeUnknownEffect(Schema.Array(EventRouteRow));
107
+ export const decodeReopenings = Schema.decodeUnknownEffect(Schema.Array(ReopeningRow));
108
+ export const decodeReopenedEvents = Schema.decodeUnknownEffect(Schema.Array(ReopenedEventRow));
88
109
  export const decodeRunRows = Schema.decodeUnknownEffect(Schema.Array(RunRow));
110
+ export const decodeRunEventRows = Schema.decodeUnknownEffect(Schema.Array(RunEventRow));
89
111
  export const decodeAttemptRows = Schema.decodeUnknownEffect(Schema.Array(AttemptRow));
90
- export const decodeRecoverableRuns = Schema.decodeUnknownEffect(Schema.Array(RecoverableRunRow));
91
112
  export const decodeRunIds = Schema.decodeUnknownEffect(Schema.Array(RunIdRow));
92
113
  export const decodeDiscards = Schema.decodeUnknownEffect(Schema.Array(DiscardRow));
93
- export const decodeWorkflowCommands = Schema.decodeUnknownEffect(Schema.Array(WorkflowCommandRow));
94
114
  export const decodeProjectionRevision = Schema.decodeUnknownEffect(Schema.Array(ProjectionRevisionRow));
95
115
  export const decodeTranscriptRows = Schema.decodeUnknownEffect(Schema.Array(TranscriptRow));
96
116
  export const encodePayload = Schema.encodeSync(Schema.Json);
97
117
  export const encodeDateTime = Schema.encodeSync(Schema.DateTimeUtcFromString);
98
118
  export const encodeRunState = Schema.encodeSync(RunState.RunState);
99
119
  export const encodeOutcome = Schema.encodeSync(AttemptOutcome);
120
+ export const encodeSalvage = Schema.encodeSync(AttemptSalvage);
121
+ export const encodeComments = Schema.encodeSync(Schema.Array(Comment));
122
+ export const encodeOutOfMemory = Schema.encodeSync(Schema.Array(ContainerOutOfMemoryKills));
123
+ export const decodeOutOfMemory = Schema.decodeUnknownEffect(Schema.Array(Schema.Struct({ outOfMemory: Schema.NullOr(Schema.Array(ContainerOutOfMemoryKills)) })));
124
+ export const encodeFailureResolution = Schema.encodeSync(FailureResolution);
125
+ export const encodeAttemptStart = Schema.encodeSync(AttemptStart);
126
+ export const decodeNextStarts = Schema.decodeUnknownEffect(Schema.Array(Schema.Struct({ nextStart: Schema.NullOr(OperatorRetryStart) })));
100
127
  export const encodeStepResult = Schema.encodeSync(StepResult);
101
128
  export const encodeEnvelope = Schema.encodeSync(AttemptChannel.Envelope);
102
129
  export const encodeAgent = Schema.encodeSync(Agent);
@@ -109,12 +136,14 @@ export const eventFromRow = (row) => new Event({
109
136
  payload: row.payload,
110
137
  receivedAt: row.receivedAt,
111
138
  });
139
+ export const runEventFromRow = (row) => new RunEvent({ runId: row.runId, event: eventFromRow(row) });
112
140
  export const submissionFromRow = (row) => new Submission({
113
141
  event: eventFromRow(row),
114
142
  itemKey: row.itemKey,
115
143
  loop: row.loop,
116
144
  step: row.step,
117
145
  approval: row.approval,
146
+ permissions: row.permissions,
118
147
  cycleLimit: Option.fromNullishOr(row.cycleLimit),
119
148
  cycleGeneration: row.cycleGeneration,
120
149
  repository: row.repository,
@@ -130,6 +159,11 @@ export const runFromRow = (row) => new Run({
130
159
  state: row.state,
131
160
  openedAt: row.openedAt,
132
161
  });
162
+ export const approvalFromRow = (row) => Option.map(Option.fromNullishOr(row.approvedAt), (approvedAt) => new RunApproval({
163
+ approvedAt,
164
+ source: Option.map(Option.fromNullishOr(row.approvalChannel), (channel) => new ApprovalSource({ channel, approver: Option.fromNullishOr(row.approver) })),
165
+ }));
166
+ export const runAgainFromRow = (row) => Option.map(Option.fromNullishOr(row.againFrom), (from) => new RunAgain({ from, requestedBy: Option.fromNullishOr(row.againRequestedBy) }));
133
167
  export const stepFromRow = (row) => new Step({
134
168
  runId: row.runId,
135
169
  name: row.stepName,
@@ -148,12 +182,23 @@ export const attemptFromRow = (row) => new Attempt({
148
182
  parentModel: Option.fromNullishOr(row.parentModel),
149
183
  startedAt: row.startedAt,
150
184
  outcome: Option.fromNullishOr(row.outcome),
185
+ endedAt: Option.fromNullishOr(row.endedAt),
186
+ salvage: Option.fromNullishOr(row.salvage),
187
+ start: Option.fromNullishOr(row.start),
188
+ failureResolution: Option.fromNullishOr(row.failureResolution),
189
+ reattachedAt: Option.fromNullishOr(row.reattachedAt),
190
+ comments: row.comments ?? [],
191
+ outOfMemory: Option.liftPredicate(row.outOfMemory ?? [], EffectArray.isReadonlyArrayNonEmpty).pipe(Option.map(totalOutOfMemoryKills)),
151
192
  });
152
193
  export const runSummaryFromRow = (row, storedAttempts) => new RunSummary({
153
194
  itemKey: row.itemKey,
154
195
  run: runFromRow(row),
155
196
  step: stepFromRow(row),
156
197
  attempts: storedAttempts.map(attemptFromRow),
198
+ resolvedFailureAttemptId: Option.fromNullishOr(row.resolvedFailureAttemptId),
199
+ closedAt: Option.fromNullishOr(row.closedAt),
200
+ approval: approvalFromRow(row),
201
+ runAgain: runAgainFromRow(row),
157
202
  repository: row.repository,
158
203
  task: row.task,
159
204
  agent: row.agent,
@@ -1 +1 @@
1
- {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/store/codec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/store/codec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type DateTime, Effect, Schema } from "effect";
2
+ import type { RunDatabaseClient } from "../database/database.ts";
3
+ import { WorkerAttempts } from "../run-reader/model.ts";
4
+ /** Returns the per-Worker leftover queries that run on the caller's transaction. */
5
+ export declare const leftoverQueries: (database: RunDatabaseClient) => {
6
+ readonly attemptCountsByWorker: () => Effect.Effect<readonly WorkerAttempts[], import("drizzle-orm/effect-core").EffectDrizzleQueryError | Schema.SchemaError, never>;
7
+ readonly openAttempts: (worker: string & import("effect/Brand").Brand<"WorkerName">) => Effect.Effect<number, import("drizzle-orm/effect-core").EffectDrizzleQueryError | Schema.SchemaError, never>;
8
+ readonly discardLeftovers: (worker: string & import("effect/Brand").Brand<"WorkerName">, discardedAt: DateTime.Utc) => Effect.Effect<(string & import("effect/Brand").Brand<"AttemptId">)[], import("drizzle-orm/effect-core").EffectDrizzleQueryError, never>;
9
+ };
10
+ //# sourceMappingURL=leftovers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leftovers.d.ts","sourceRoot":"","sources":["../../src/store/leftovers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQxD,oFAAoF;AACpF,eAAO,MAAM,eAAe,aAAc,iBAAiB;;;;CAqC1D,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { and, asc, eq, isNull, sql } from "drizzle-orm";
2
+ import { Effect, Schema } from "effect";
3
+ import { attempts } from "../database/schema.js";
4
+ import { WorkerAttempts } from "../run-reader/model.js";
5
+ import { encodeDateTime } from "./codec.js";
6
+ // Startup reconciliation visits an Attempt until its leftovers are discarded.
7
+ const tracked = isNull(attempts.leftoversDiscardedAt);
8
+ // An Attempt without an outcome is open.
9
+ const open = isNull(attempts.outcomeJson);
10
+ /** Returns the per-Worker leftover queries that run on the caller's transaction. */
11
+ export const leftoverQueries = (database) => {
12
+ const attemptCountsByWorker = Effect.fn("RunStoreQueries.attemptCountsByWorker")(function* () {
13
+ const rows = yield* database
14
+ .select({
15
+ worker: attempts.workerName,
16
+ attempts: sql `count(*)`,
17
+ running: sql `sum(case when ${open} then 1 else 0 end)`,
18
+ })
19
+ .from(attempts)
20
+ .where(tracked)
21
+ .groupBy(attempts.workerName)
22
+ .orderBy(asc(attempts.workerName))
23
+ .execute();
24
+ return yield* Schema.decodeUnknownEffect(Schema.Array(WorkerAttempts))(rows);
25
+ });
26
+ /** Returns the number of open tracked Attempts on `worker`. */
27
+ const openAttempts = Effect.fn("RunStoreQueries.openAttempts")(function* (worker) {
28
+ const counted = yield* attemptCountsByWorker();
29
+ return counted.find((count) => count.worker === worker)?.running ?? 0;
30
+ });
31
+ /** Stops tracking every Attempt on `worker` and returns the Attempts marked. */
32
+ const discardLeftovers = Effect.fn("RunStoreQueries.discardLeftovers")(function* (worker, discardedAt) {
33
+ const discarded = yield* database
34
+ .update(attempts)
35
+ .set({ leftoversDiscardedAt: encodeDateTime(discardedAt) })
36
+ .where(and(eq(attempts.workerName, worker), tracked))
37
+ .returning({ attemptId: attempts.attemptId })
38
+ .execute();
39
+ return discarded.map(({ attemptId }) => attemptId);
40
+ });
41
+ return { attemptCountsByWorker, openAttempts, discardLeftovers };
42
+ };
43
+ //# sourceMappingURL=leftovers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leftovers.js","sourceRoot":"","sources":["../../src/store/leftovers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAiB,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,8EAA8E;AAC9E,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AACtD,yCAAyC;AACzC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAE1C,oFAAoF;AACpF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAA2B,EAAE,EAAE;IAC7D,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,uCAAuC,CAAC,CAAC,QAAQ,CAAC;QACxF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ;aACzB,MAAM,CAAC;YACN,MAAM,EAAE,QAAQ,CAAC,UAAU;YAC3B,QAAQ,EAAE,GAAG,CAAQ,UAAU;YAC/B,OAAO,EAAE,GAAG,CAAQ,iBAAiB,IAAI,qBAAqB;SAC/D,CAAC;aACD,IAAI,CAAC,QAAQ,CAAC;aACd,KAAK,CAAC,OAAO,CAAC;aACd,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;aAC5B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;aACjC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,+DAA+D;IAC/D,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,8BAA8B,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAkB;QAC1F,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,qBAAqB,EAAE,CAAC;QAC/C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,gFAAgF;IAChF,MAAM,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAC9E,MAAkB,EAClB,WAAyB;QAEzB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,QAAQ;aAC9B,MAAM,CAAC,QAAQ,CAAC;aAChB,GAAG,CAAC,EAAE,oBAAoB,EAAE,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;aAC1D,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;aACpD,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;aAC5C,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,gBAAgB,EAAW,CAAC;AAC5E,CAAC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Effect, Option, Schema } from "effect";
2
+ import type { RunDatabaseClient } from "../database/database.ts";
3
+ import type { PreviousSighting, Suppression } from "../engine/lifecycle.ts";
4
+ import { LoopSighting } from "../run-reader/model.ts";
5
+ /** Returns the Loop sighting and suppression queries that run on the caller's transaction. */
6
+ export declare const loopItemQueries: (database: RunDatabaseClient) => {
7
+ readonly sighted: (loop: string & import("effect/Brand").Brand<"LoopName">, itemKey: string & import("effect/Brand").Brand<"ItemKey">, eventId: string & import("effect/Brand").Brand<"EventId">) => Effect.Effect<PreviousSighting, import("drizzle-orm/effect-core").EffectDrizzleQueryError | Schema.SchemaError, never>;
8
+ readonly unmatched: (loop: string & import("effect/Brand").Brand<"LoopName">, itemKey: string & import("effect/Brand").Brand<"ItemKey">) => Effect.Effect<void, import("drizzle-orm/effect-core").EffectDrizzleQueryError, never>;
9
+ readonly suppression: (loop: string & import("effect/Brand").Brand<"LoopName">, itemKey: string & import("effect/Brand").Brand<"ItemKey">) => Effect.Effect<Option.Option<Suppression>, import("drizzle-orm/effect-core").EffectDrizzleQueryError | Schema.SchemaError, never>;
10
+ readonly startSuppression: (loop: string & import("effect/Brand").Brand<"LoopName">, itemKey: string & import("effect/Brand").Brand<"ItemKey">, runId: string & import("effect/Brand").Brand<"RunId">, opened: string & import("effect/Brand").Brand<"EventId">, queued: Option.Option<string & import("effect/Brand").Brand<"EventId">>) => Effect.Effect<boolean, import("drizzle-orm/effect-core").EffectDrizzleQueryError | Schema.SchemaError, never>;
11
+ readonly suppressFrom: (loop: string & import("effect/Brand").Brand<"LoopName">, itemKey: string & import("effect/Brand").Brand<"ItemKey">, eventId: string & import("effect/Brand").Brand<"EventId">) => Effect.Effect<void, import("drizzle-orm/effect-core").EffectDrizzleQueryError, never>;
12
+ readonly lift: (loop: string & import("effect/Brand").Brand<"LoopName">, itemKey: string & import("effect/Brand").Brand<"ItemKey">) => Effect.Effect<void, import("drizzle-orm/effect-core").EffectDrizzleQueryError, never>;
13
+ readonly liftRun: (runId: string & import("effect/Brand").Brand<"RunId">) => Effect.Effect<boolean, import("drizzle-orm/effect-core").EffectDrizzleQueryError, never>;
14
+ readonly sightings: (itemKeys: readonly (string & import("effect/Brand").Brand<"ItemKey">)[]) => Effect.Effect<LoopSighting[], import("drizzle-orm/effect-core").EffectDrizzleQueryError | Schema.SchemaError, never>;
15
+ };
16
+ //# sourceMappingURL=loop-items.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-items.d.ts","sourceRoot":"","sources":["../../src/store/loop-items.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAyBtD,8FAA8F;AAC9F,eAAO,MAAM,eAAe,aAAc,iBAAiB;;;;;;;;;CAyM1D,CAAC"}
@@ -0,0 +1,185 @@
1
+ import { EventId } from "@usine/core/event";
2
+ import { ItemKey } from "@usine/core/item";
3
+ import { LoopName } from "@usine/core/loop";
4
+ import { RunId } from "@usine/core/run";
5
+ import { and, desc, eq, inArray, isNotNull } from "drizzle-orm";
6
+ import { Array as EffectArray, Effect, Option, Schema } from "effect";
7
+ import { loopItems, runs, triggerEvents } from "../database/schema.js";
8
+ import { LoopSighting } from "../run-reader/model.js";
9
+ const LoopItemRow = Schema.Struct({
10
+ observedEventId: Schema.NullOr(EventId),
11
+ suppressedByRunId: Schema.NullOr(RunId),
12
+ suppressedEventId: Schema.NullOr(EventId),
13
+ });
14
+ const decodeLoopItems = Schema.decodeUnknownEffect(Schema.Array(LoopItemRow));
15
+ const decodeSightingRows = Schema.decodeUnknownEffect(Schema.Array(Schema.Struct({
16
+ loop: LoopName,
17
+ itemKey: ItemKey,
18
+ observedEventId: Schema.NullOr(EventId),
19
+ suppressedByRunId: Schema.NullOr(RunId),
20
+ })));
21
+ const decodeReopeningRows = Schema.decodeUnknownEffect(Schema.Array(Schema.Struct({ eventId: EventId, reopensEventId: EventId })));
22
+ const decodeOwnerRows = Schema.decodeUnknownEffect(Schema.Array(Schema.Struct({ eventId: EventId, runId: RunId })));
23
+ /** Returns the Loop sighting and suppression queries that run on the caller's transaction. */
24
+ export const loopItemQueries = (database) => {
25
+ const where = (loop, itemKey) => and(eq(loopItems.loopName, loop), eq(loopItems.itemKey, itemKey));
26
+ const row = Effect.fn("LoopItems.row")(function* (loop, itemKey) {
27
+ const rows = yield* decodeLoopItems(yield* database
28
+ .select({
29
+ observedEventId: loopItems.observedEventId,
30
+ suppressedByRunId: loopItems.suppressedByRunId,
31
+ suppressedEventId: loopItems.suppressedEventId,
32
+ })
33
+ .from(loopItems)
34
+ .where(where(loop, itemKey))
35
+ .execute());
36
+ return Option.fromNullishOr(rows[0]);
37
+ });
38
+ /** Records a sighting of `eventId` and returns the Loop's previous sighting. */
39
+ const sighted = Effect.fn("LoopItems.sighted")(function* (loop, itemKey, eventId) {
40
+ const before = Option.map(yield* row(loop, itemKey), ({ observedEventId }) => Option.fromNullishOr(observedEventId));
41
+ yield* database
42
+ .insert(loopItems)
43
+ .values({ loopName: loop, itemKey, observedEventId: eventId })
44
+ .onConflictDoUpdate({
45
+ target: [loopItems.loopName, loopItems.itemKey],
46
+ set: { observedEventId: eventId },
47
+ })
48
+ .execute();
49
+ return before;
50
+ });
51
+ /** Records a non-matching sighting and lifts any suppression; does nothing if the Loop has no row. */
52
+ const unmatched = Effect.fn("LoopItems.unmatched")(function* (loop, itemKey) {
53
+ yield* database
54
+ .update(loopItems)
55
+ .set({ observedEventId: null, suppressedByRunId: null, suppressedEventId: null })
56
+ .where(where(loop, itemKey))
57
+ .execute();
58
+ });
59
+ /** Returns the Loop's suppression of the Item, or `None`. */
60
+ const suppression = Effect.fn("LoopItems.suppression")(function* (loop, itemKey) {
61
+ return Option.flatMap(yield* row(loop, itemKey), ({ suppressedByRunId, suppressedEventId }) => suppressedByRunId === null
62
+ ? Option.none()
63
+ : Option.some({
64
+ runId: suppressedByRunId,
65
+ suppressedEventId: Option.fromNullishOr(suppressedEventId),
66
+ }));
67
+ });
68
+ /**
69
+ * Starts the suppression of `runId` unless the Loop's last sighting was a non-match, and
70
+ * returns whether it started. `opened` is recorded as the sighting if the Loop has no row;
71
+ * `queued` is the newest queued Event, already the state after the stop.
72
+ */
73
+ const startSuppression = Effect.fn("LoopItems.startSuppression")(function* (loop, itemKey, runId, opened, queued) {
74
+ const current = yield* row(loop, itemKey);
75
+ if (Option.exists(current, ({ observedEventId }) => observedEventId === null))
76
+ return false;
77
+ const suppressedEventId = Option.getOrNull(queued);
78
+ yield* database
79
+ .insert(loopItems)
80
+ .values({
81
+ loopName: loop,
82
+ itemKey,
83
+ observedEventId: opened,
84
+ suppressedByRunId: runId,
85
+ suppressedEventId,
86
+ })
87
+ .onConflictDoUpdate({
88
+ target: [loopItems.loopName, loopItems.itemKey],
89
+ set: { suppressedByRunId: runId, suppressedEventId },
90
+ })
91
+ .execute();
92
+ return true;
93
+ });
94
+ /** Records `eventId` as the Item's state after the stop. */
95
+ const suppressFrom = Effect.fn("LoopItems.suppressFrom")(function* (loop, itemKey, eventId) {
96
+ yield* database
97
+ .update(loopItems)
98
+ .set({ suppressedEventId: eventId })
99
+ .where(and(where(loop, itemKey), isNotNull(loopItems.suppressedByRunId)))
100
+ .execute();
101
+ });
102
+ const lift = Effect.fn("LoopItems.lift")(function* (loop, itemKey) {
103
+ yield* database
104
+ .update(loopItems)
105
+ .set({ suppressedByRunId: null, suppressedEventId: null })
106
+ .where(where(loop, itemKey))
107
+ .execute();
108
+ });
109
+ /** Lifts the suppression of `runId` on any Loop and returns whether there was one. */
110
+ const liftRun = Effect.fn("LoopItems.liftRun")(function* (runId) {
111
+ const lifted = yield* database
112
+ .update(loopItems)
113
+ .set({ suppressedByRunId: null, suppressedEventId: null })
114
+ .where(eq(loopItems.suppressedByRunId, runId))
115
+ .returning({ loopName: loopItems.loopName })
116
+ .execute();
117
+ return lifted.length > 0;
118
+ });
119
+ /**
120
+ * Returns each Loop's last sighting of the Items in `itemKeys`, with the newest reopening or
121
+ * run-again Event for the submitted Event.
122
+ */
123
+ const sightings = Effect.fn("LoopItems.sightings")(function* (itemKeys) {
124
+ const keys = [...new Set(itemKeys)];
125
+ if (keys.length === 0)
126
+ return [];
127
+ // Chunks keep each read below the driver's bind-parameter limit.
128
+ const rows = (yield* Effect.forEach(EffectArray.chunksOf(keys, 100), (chunk) => database
129
+ .select({
130
+ loop: loopItems.loopName,
131
+ itemKey: loopItems.itemKey,
132
+ observedEventId: loopItems.observedEventId,
133
+ suppressedByRunId: loopItems.suppressedByRunId,
134
+ })
135
+ .from(loopItems)
136
+ .where(inArray(loopItems.itemKey, chunk))
137
+ .execute()
138
+ .pipe(Effect.flatMap(decodeSightingRows)))).flat();
139
+ const observed = [
140
+ ...new Set(rows.flatMap(({ observedEventId }) => (observedEventId === null ? [] : [observedEventId]))),
141
+ ];
142
+ const reopenings = (yield* Effect.forEach(EffectArray.chunksOf(observed, 100), (chunk) => database
143
+ .select({ eventId: triggerEvents.eventId, reopensEventId: triggerEvents.reopensEventId })
144
+ .from(triggerEvents)
145
+ .where(inArray(triggerEvents.reopensEventId, chunk))
146
+ .orderBy(desc(triggerEvents.reopening))
147
+ .execute()
148
+ .pipe(Effect.flatMap(decodeReopeningRows)))).flat();
149
+ const newest = new Map();
150
+ for (const { eventId, reopensEventId } of reopenings) {
151
+ if (!newest.has(reopensEventId))
152
+ newest.set(reopensEventId, eventId);
153
+ }
154
+ const current = (eventId) => newest.get(eventId) ?? eventId;
155
+ const owners = new Map((yield* Effect.forEach(EffectArray.chunksOf(observed.map(current), 100), (chunk) => database
156
+ .select({ eventId: runs.eventId, runId: runs.runId })
157
+ .from(runs)
158
+ .where(inArray(runs.eventId, chunk))
159
+ .execute()
160
+ .pipe(Effect.flatMap(decodeOwnerRows))))
161
+ .flat()
162
+ .map(({ eventId, runId }) => [eventId, runId]));
163
+ return rows.map(({ loop, itemKey, observedEventId, suppressedByRunId }) => {
164
+ const event = Option.map(Option.fromNullishOr(observedEventId), current);
165
+ return new LoopSighting({
166
+ loop,
167
+ itemKey,
168
+ event,
169
+ run: Option.flatMap(event, (eventId) => Option.fromNullishOr(owners.get(eventId))),
170
+ suppressedBy: Option.fromNullishOr(suppressedByRunId),
171
+ });
172
+ });
173
+ });
174
+ return {
175
+ sighted,
176
+ unmatched,
177
+ suppression,
178
+ startSuppression,
179
+ suppressFrom,
180
+ lift,
181
+ liftRun,
182
+ sightings,
183
+ };
184
+ };
185
+ //# sourceMappingURL=loop-items.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-items.js","sourceRoot":"","sources":["../../src/store/loop-items.ts"],"names":[],"mappings":"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"}