@usine/engine 0.0.1 → 0.1.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 (96) hide show
  1. package/README.md +66 -2
  2. package/dist/cursor/model.d.ts +5 -0
  3. package/dist/cursor/model.d.ts.map +1 -0
  4. package/dist/cursor/model.js +4 -0
  5. package/dist/cursor/model.js.map +1 -0
  6. package/dist/cursor/store.d.ts +18 -0
  7. package/dist/cursor/store.d.ts.map +1 -0
  8. package/dist/cursor/store.js +54 -0
  9. package/dist/cursor/store.js.map +1 -0
  10. package/dist/database/database.d.ts +15 -0
  11. package/dist/database/database.d.ts.map +1 -0
  12. package/dist/database/database.js +5 -0
  13. package/dist/database/database.js.map +1 -0
  14. package/dist/database/local-sqlite.d.ts +17 -0
  15. package/dist/database/local-sqlite.d.ts.map +1 -0
  16. package/dist/database/local-sqlite.js +45 -0
  17. package/dist/database/local-sqlite.js.map +1 -0
  18. package/dist/database/schema.d.ts +1096 -0
  19. package/dist/database/schema.d.ts.map +1 -0
  20. package/dist/database/schema.js +171 -0
  21. package/dist/database/schema.js.map +1 -0
  22. package/dist/engine.d.ts +39 -0
  23. package/dist/engine.d.ts.map +1 -0
  24. package/dist/engine.js +179 -0
  25. package/dist/engine.js.map +1 -0
  26. package/dist/index.d.ts +16 -4
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +16 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/item-projection/model.d.ts +21 -0
  31. package/dist/item-projection/model.d.ts.map +1 -0
  32. package/dist/item-projection/model.js +16 -0
  33. package/dist/item-projection/model.js.map +1 -0
  34. package/dist/item-projection/service.d.ts +25 -0
  35. package/dist/item-projection/service.d.ts.map +1 -0
  36. package/dist/item-projection/service.js +98 -0
  37. package/dist/item-projection/service.js.map +1 -0
  38. package/dist/loop-control.d.ts +16 -0
  39. package/dist/loop-control.d.ts.map +1 -0
  40. package/dist/loop-control.js +69 -0
  41. package/dist/loop-control.js.map +1 -0
  42. package/dist/model.d.ts +185 -0
  43. package/dist/model.d.ts.map +1 -0
  44. package/dist/model.js +174 -0
  45. package/dist/model.js.map +1 -0
  46. package/dist/repository-label-projection/model.d.ts +10 -0
  47. package/dist/repository-label-projection/model.d.ts.map +1 -0
  48. package/dist/repository-label-projection/model.js +11 -0
  49. package/dist/repository-label-projection/model.js.map +1 -0
  50. package/dist/repository-label-projection/service.d.ts +20 -0
  51. package/dist/repository-label-projection/service.d.ts.map +1 -0
  52. package/dist/repository-label-projection/service.js +73 -0
  53. package/dist/repository-label-projection/service.js.map +1 -0
  54. package/dist/run-reader.d.ts +20 -0
  55. package/dist/run-reader.d.ts.map +1 -0
  56. package/dist/run-reader.js +19 -0
  57. package/dist/run-reader.js.map +1 -0
  58. package/dist/step-executor.d.ts +21 -0
  59. package/dist/step-executor.d.ts.map +1 -0
  60. package/dist/step-executor.js +8 -0
  61. package/dist/step-executor.js.map +1 -0
  62. package/dist/store/codec.d.ts +431 -0
  63. package/dist/store/codec.d.ts.map +1 -0
  64. package/dist/store/codec.js +140 -0
  65. package/dist/store/codec.js.map +1 -0
  66. package/dist/store/queries.d.ts +75 -0
  67. package/dist/store/queries.d.ts.map +1 -0
  68. package/dist/store/queries.js +508 -0
  69. package/dist/store/queries.js.map +1 -0
  70. package/dist/store/store.d.ts +83 -0
  71. package/dist/store/store.d.ts.map +1 -0
  72. package/dist/store/store.js +374 -0
  73. package/dist/store/store.js.map +1 -0
  74. package/dist/workflow.d.ts +14 -0
  75. package/dist/workflow.d.ts.map +1 -0
  76. package/dist/workflow.js +105 -0
  77. package/dist/workflow.js.map +1 -0
  78. package/drizzle/20260825055549_initial_runtime/migration.sql +73 -0
  79. package/drizzle/20260825055549_initial_runtime/snapshot.json +592 -0
  80. package/drizzle/20260830191125_polling_cursors/migration.sql +5 -0
  81. package/drizzle/20260830191125_polling_cursors/snapshot.json +629 -0
  82. package/drizzle/20260831073158_attempt_channel/migration.sql +36 -0
  83. package/drizzle/20260831073158_attempt_channel/snapshot.json +845 -0
  84. package/drizzle/20260831133534_agent_context/migration.sql +49 -0
  85. package/drizzle/20260831133534_agent_context/snapshot.json +897 -0
  86. package/drizzle/20260831134612_attempt_brain/migration.sql +26 -0
  87. package/drizzle/20260831134612_attempt_brain/snapshot.json +923 -0
  88. package/drizzle/20260831194605_loop_runtime/migration.sql +4 -0
  89. package/drizzle/20260831194605_loop_runtime/snapshot.json +954 -0
  90. package/drizzle/20260901073233_projection_revision/migration.sql +55 -0
  91. package/drizzle/20260901073233_projection_revision/snapshot.json +991 -0
  92. package/drizzle/20260901180433_item_projections/migration.sql +22 -0
  93. package/drizzle/20260901180433_item_projections/snapshot.json +1110 -0
  94. package/drizzle/20260901185146_repository_label_projections/migration.sql +17 -0
  95. package/drizzle/20260901185146_repository_label_projections/snapshot.json +1147 -0
  96. package/package.json +21 -3
@@ -0,0 +1,374 @@
1
+ import { Attempt, AttemptChannel, AttemptFailure, Event, Item, Loop, Run, RunState, StepResult, Worker, } from "@usine/core";
2
+ import { Cause, Context, DateTime, Effect, Exit, Layer, Option, Schema } from "effect";
3
+ import { RunDatabase } from "../database/database.js";
4
+ import { Claimed, Ignored, Queued, RunOperationRejectedError, RunSnapshot, StepExecution, Submission, TranscriptEntry, TranscriptQuery, } from "../model.js";
5
+ import { persistence, submissionFromRow } from "./codec.js";
6
+ import { queriesFor } from "./queries.js";
7
+ const MAX_AUTO_ATTEMPTS = Attempt.AttemptNumber.make(3);
8
+ export class StoredSubmission extends Schema.Class("@usine/engine/internal/StoredSubmission")({
9
+ submission: Submission,
10
+ runId: Run.RunId,
11
+ }) {
12
+ }
13
+ export class RecoverableRun extends Schema.Class("@usine/engine/internal/RecoverableRun")({
14
+ submission: Submission,
15
+ runId: Run.RunId,
16
+ state: RunState.RunState,
17
+ }) {
18
+ }
19
+ export class Claim extends Schema.Class("@usine/engine/internal/Claim")({
20
+ submission: Submission,
21
+ result: Schema.Union([Claimed, Queued, Ignored]),
22
+ supersededRun: Schema.Option(Run.RunId),
23
+ }) {
24
+ }
25
+ export class AttemptStarted extends Schema.TaggedClass("@usine/engine/internal/AttemptStarted")("AttemptStarted", {
26
+ execution: StepExecution,
27
+ }) {
28
+ }
29
+ export class AttemptRecoveryFailed extends Schema.TaggedClass("@usine/engine/internal/AttemptRecoveryFailed")("AttemptRecoveryFailed", {
30
+ failure: AttemptFailure.InfraFailure,
31
+ }) {
32
+ }
33
+ /**
34
+ * The Run closed (canceled, superseded, or revoked) while it waited for a
35
+ * worker slot — a routine outcome once capacity queues exist, never an error.
36
+ */
37
+ export class RunClosed extends Schema.TaggedClass("@usine/engine/internal/RunClosed")("RunClosed", {
38
+ state: Schema.String,
39
+ }) {
40
+ }
41
+ const makeRunStore = Effect.gen(function* () {
42
+ const database = yield* RunDatabase;
43
+ const queries = queriesFor(database);
44
+ const claimedRun = (submission, runId, supersededRun = Option.none()) => new Claim({
45
+ submission,
46
+ result: new Claimed({ eventId: submission.event.id, runId }),
47
+ supersededRun,
48
+ });
49
+ const openRun = Effect.fn("RunStore.openRun")(function* (tx, submission, runId, supersededRun = Option.none()) {
50
+ yield* tx.createRun(submission, submission.event.id, runId);
51
+ return claimedRun(submission, runId, supersededRun);
52
+ });
53
+ const recordAndClaim = Effect.fn("RunStore.recordAndClaim")(function* (submission, requestedRunId) {
54
+ return yield* database.transaction((transaction) => Effect.gen(function* () {
55
+ const tx = queriesFor(transaction);
56
+ const recorded = yield* tx.recordTriggerEvent(submission);
57
+ const existing = yield* tx.runForEvent(recorded.event.id);
58
+ if (existing[0] !== undefined) {
59
+ return claimedRun(recorded, existing[0].runId);
60
+ }
61
+ const ignored = yield* tx.ignoredEvent(recorded.event.id);
62
+ if (ignored[0] !== undefined) {
63
+ return new Claim({
64
+ submission: recorded,
65
+ result: new Ignored({
66
+ eventId: recorded.event.id,
67
+ reason: ignored[0].reason,
68
+ }),
69
+ supersededRun: Option.none(),
70
+ });
71
+ }
72
+ const blocking = yield* tx.blockingRun(recorded.loop, recorded.itemKey);
73
+ const blockedBy = blocking[0];
74
+ if (blockedBy === undefined) {
75
+ return yield* openRun(tx, recorded, requestedRunId);
76
+ }
77
+ const blockedSnapshot = yield* tx.snapshot(blockedBy.runId);
78
+ if (blockedSnapshot.run.state._tag === "Running") {
79
+ return new Claim({
80
+ submission: recorded,
81
+ result: new Queued({ eventId: recorded.event.id }),
82
+ supersededRun: Option.none(),
83
+ });
84
+ }
85
+ if (blockedSnapshot.run.state._tag === "Pending" ||
86
+ blockedSnapshot.run.state._tag === "Waiting") {
87
+ yield* tx.updateState(blockedSnapshot.run.id, RunState.supersede(blockedSnapshot.run.state, recorded.event.id));
88
+ yield* tx.requestInterrupt(blockedSnapshot.run.id);
89
+ return yield* openRun(tx, recorded, requestedRunId, Option.some(blockedSnapshot.run.id));
90
+ }
91
+ return yield* openRun(tx, recorded, requestedRunId);
92
+ }));
93
+ }, persistence("submit Event"));
94
+ const parkForApproval = Effect.fn("RunStore.parkForApproval")(function* (runId) {
95
+ yield* database.transaction((transaction) => Effect.gen(function* () {
96
+ const tx = queriesFor(transaction);
97
+ const current = yield* tx.snapshot(runId);
98
+ if (current.run.state._tag === "Pending") {
99
+ yield* tx.updateState(runId, RunState.awaitApproval(current.run.state));
100
+ }
101
+ }));
102
+ }, persistence("park run for approval"));
103
+ const beginAttempt = Effect.fn("RunStore.beginAttempt")(function* (runId, worker) {
104
+ return yield* database.transaction((transaction) => Effect.gen(function* () {
105
+ const tx = queriesFor(transaction);
106
+ const current = yield* tx.snapshot(runId);
107
+ let runState = current.run.state;
108
+ const lastAttempt = current.attempts[current.attempts.length - 1];
109
+ if (runState._tag === "Running" &&
110
+ lastAttempt !== undefined &&
111
+ Option.isNone(lastAttempt.outcome)) {
112
+ const failure = new AttemptFailure.InfraFailure({
113
+ message: "The orchestrator stopped during the attempt",
114
+ cause: new Error("attempt interrupted by orchestrator restart"),
115
+ });
116
+ yield* tx.closeAttempt(lastAttempt.id, new Attempt.Failed({ failure }));
117
+ if (!Attempt.shouldAutoRetry({
118
+ failure,
119
+ number: lastAttempt.number,
120
+ maxAutoAttempts: MAX_AUTO_ATTEMPTS,
121
+ })) {
122
+ yield* tx.updateState(runId, RunState.fail(runState));
123
+ yield* tx.requestWorkflowCommand(runId, "Continue");
124
+ return new AttemptRecoveryFailed({ failure });
125
+ }
126
+ }
127
+ if (runState._tag === "Pending" || runState._tag === "Waiting") {
128
+ runState = RunState.start(runState);
129
+ yield* tx.updateState(runId, runState);
130
+ }
131
+ if (runState._tag !== "Running") {
132
+ // Cancel, supersede, and revoke can all land while the run waits
133
+ // for a worker slot; the caller releases the slot and moves on.
134
+ return new RunClosed({ state: runState._tag });
135
+ }
136
+ const number = Attempt.AttemptNumber.make((lastAttempt?.number ?? 0) + 1);
137
+ const attemptId = Attempt.AttemptId.make(`${runId}/${current.step.name}/${number}`);
138
+ const startedAt = yield* DateTime.now;
139
+ const attempt = new Attempt.Attempt({
140
+ id: attemptId,
141
+ runId,
142
+ stepName: current.step.name,
143
+ worker,
144
+ number,
145
+ brain: current.agent.brain,
146
+ parentModel: current.parentModel,
147
+ startedAt,
148
+ outcome: Option.none(),
149
+ });
150
+ yield* tx.addAttempt(attempt);
151
+ return new AttemptStarted({
152
+ execution: new StepExecution({
153
+ attempt,
154
+ event: current.event,
155
+ run: new Run.Run({
156
+ id: current.run.id,
157
+ eventId: current.run.eventId,
158
+ loop: current.run.loop,
159
+ state: runState,
160
+ openedAt: current.run.openedAt,
161
+ }),
162
+ step: current.step,
163
+ repository: current.repository,
164
+ revision: current.revision,
165
+ task: current.task,
166
+ agent: current.agent,
167
+ parentModel: current.parentModel,
168
+ }),
169
+ });
170
+ }));
171
+ }, persistence("begin attempt"));
172
+ const succeedAttempt = Effect.fn("RunStore.succeedAttempt")(function* (attempt, result) {
173
+ yield* database.transaction((transaction) => Effect.gen(function* () {
174
+ const tx = queriesFor(transaction);
175
+ const current = yield* tx.snapshot(attempt.runId);
176
+ if (current.run.state._tag !== "Running")
177
+ return;
178
+ yield* tx.closeAttempt(attempt.id, new Attempt.Succeeded());
179
+ yield* tx.updateStepResult(attempt.runId, attempt.stepName, result);
180
+ yield* tx.updateState(attempt.runId, RunState.succeed(current.run.state));
181
+ yield* tx.requestWorkflowCommand(attempt.runId, "Continue");
182
+ }));
183
+ }, persistence("succeed attempt"));
184
+ const failAttempt = Effect.fn("RunStore.failAttempt")(function* (attempt, failure) {
185
+ return yield* database.transaction((transaction) => Effect.gen(function* () {
186
+ const tx = queriesFor(transaction);
187
+ const current = yield* tx.snapshot(attempt.runId);
188
+ if (current.run.state._tag !== "Running")
189
+ return false;
190
+ yield* tx.closeAttempt(attempt.id, new Attempt.Failed({ failure }));
191
+ const retry = Attempt.shouldAutoRetry({
192
+ failure,
193
+ number: attempt.number,
194
+ maxAutoAttempts: MAX_AUTO_ATTEMPTS,
195
+ });
196
+ if (!retry) {
197
+ yield* tx.updateState(attempt.runId, RunState.fail(current.run.state));
198
+ yield* tx.requestWorkflowCommand(attempt.runId, "Continue");
199
+ }
200
+ return retry;
201
+ }));
202
+ }, persistence("fail attempt"));
203
+ const approve = Effect.fn("RunStore.approve")(function* (runId, approval) {
204
+ yield* database.transaction((transaction) => Effect.gen(function* () {
205
+ const tx = queriesFor(transaction);
206
+ if (yield* tx.approvalExists(runId))
207
+ return;
208
+ const current = yield* tx.snapshot(runId);
209
+ if (current.run.state._tag !== "Waiting") {
210
+ return yield* new RunOperationRejectedError({
211
+ runId,
212
+ operation: "approve",
213
+ state: current.run.state._tag,
214
+ });
215
+ }
216
+ yield* tx.recordApproval(runId, approval);
217
+ yield* tx.requestWorkflowCommand(runId, "Approve");
218
+ }));
219
+ }, persistence("approve run"));
220
+ const retry = Effect.fn("RunStore.retry")(function* (runId) {
221
+ yield* database.transaction((transaction) => Effect.gen(function* () {
222
+ const tx = queriesFor(transaction);
223
+ const current = yield* tx.snapshot(runId);
224
+ if (current.run.state._tag === "Failed") {
225
+ yield* tx.updateState(runId, RunState.retry(current.run.state));
226
+ yield* tx.requestWorkflowCommand(runId, "Resume");
227
+ return;
228
+ }
229
+ if (current.run.state._tag === "Running" &&
230
+ (yield* tx.hasWorkflowCommand(runId, "Resume"))) {
231
+ return;
232
+ }
233
+ return yield* new RunOperationRejectedError({
234
+ runId,
235
+ operation: "retry",
236
+ state: current.run.state._tag,
237
+ });
238
+ }));
239
+ }, persistence("retry run"));
240
+ const cancel = Effect.fn("RunStore.cancel")(function* (runId) {
241
+ return yield* database.transaction((transaction) => Effect.gen(function* () {
242
+ const tx = queriesFor(transaction);
243
+ const current = yield* tx.snapshot(runId);
244
+ if (!RunState.isOpen(current.run.state)) {
245
+ const alreadyClosed = { _tag: "AlreadyClosed" };
246
+ return alreadyClosed;
247
+ }
248
+ let openAttempt = Option.none();
249
+ if (current.run.state._tag === "Running") {
250
+ const attempt = current.attempts[current.attempts.length - 1];
251
+ if (attempt !== undefined && Option.isNone(attempt.outcome)) {
252
+ yield* tx.closeAttempt(attempt.id, new Attempt.Canceled());
253
+ openAttempt = Option.some(attempt.id);
254
+ }
255
+ }
256
+ yield* tx.updateState(runId, RunState.cancelByOperator(current.run.state));
257
+ yield* tx.requestInterrupt(runId);
258
+ yield* tx.requestWorkflowCommand(runId, "Continue");
259
+ const canceled = { _tag: "Canceled", openAttempt };
260
+ return canceled;
261
+ }));
262
+ }, persistence("cancel run"));
263
+ const revoke = Effect.fn("RunStore.revoke")(function* (loop, itemKey) {
264
+ return yield* database.transaction((transaction) => Effect.gen(function* () {
265
+ const tx = queriesFor(transaction);
266
+ const storedRuns = yield* tx.revokeUnstarted(loop, itemKey);
267
+ for (const row of storedRuns) {
268
+ const current = yield* tx.snapshot(row.runId);
269
+ if (current.run.state._tag === "Pending" || current.run.state._tag === "Waiting") {
270
+ yield* tx.updateState(row.runId, RunState.revoke(current.run.state));
271
+ yield* tx.requestInterrupt(row.runId);
272
+ }
273
+ }
274
+ return storedRuns.map((row) => row.runId);
275
+ }));
276
+ }, persistence("revoke run"));
277
+ const claimQueued = Effect.fn("RunStore.claimQueued")(function* (submission, runId) {
278
+ return yield* database.transaction((transaction) => Effect.gen(function* () {
279
+ const tx = queriesFor(transaction);
280
+ const existing = yield* tx.runForEvent(submission.event.id);
281
+ if (existing[0] !== undefined) {
282
+ return Option.some(new StoredSubmission({ submission, runId: existing[0].runId }));
283
+ }
284
+ if ((yield* tx.ignoredEvent(submission.event.id)).length > 0) {
285
+ return Option.none();
286
+ }
287
+ if ((yield* tx.blockingRun(submission.loop, submission.itemKey)).length > 0) {
288
+ return Option.none();
289
+ }
290
+ yield* tx.createRun(submission, submission.event.id, runId);
291
+ return Option.some(new StoredSubmission({ submission, runId }));
292
+ }));
293
+ }, persistence("claim queued Event"));
294
+ const recoverable = Effect.fn("RunStore.recoverable")(function* () {
295
+ return (yield* queries.recoverable()).map((row) => new RecoverableRun({
296
+ submission: submissionFromRow(row),
297
+ runId: row.runId,
298
+ state: row.state,
299
+ }));
300
+ }, persistence("list recoverable runs"));
301
+ const appendTranscript = Effect.fn("RunStore.appendTranscript")(function* (direction, envelope) {
302
+ const receivedAt = yield* DateTime.now;
303
+ yield* database.transaction((transaction) => Effect.gen(function* () {
304
+ const tx = queriesFor(transaction);
305
+ if (direction === "outbound" && envelope.payload._tag === "Started") {
306
+ yield* tx.updateAttemptParentModel(envelope.attemptId, envelope.payload.parentModel);
307
+ }
308
+ yield* tx.appendTranscript(direction, envelope, receivedAt);
309
+ }));
310
+ }, persistence("append Attempt transcript"));
311
+ const transcript = Effect.fn("RunStore.transcript")(function* (query) {
312
+ return yield* queries.transcript(query);
313
+ }, persistence("read Attempt transcript"));
314
+ const reconcileCompletion = Effect.fn("RunStore.reconcileCompletion")(function* (runId, result) {
315
+ if (result._tag !== "Complete")
316
+ return;
317
+ yield* database.transaction((transaction) => Effect.gen(function* () {
318
+ const tx = queriesFor(transaction);
319
+ const current = yield* tx.snapshot(runId);
320
+ if (current.run.state._tag !== "Running")
321
+ return;
322
+ const attempt = current.attempts[current.attempts.length - 1];
323
+ if (attempt === undefined || Option.isSome(attempt.outcome))
324
+ return;
325
+ if (Exit.isSuccess(result.exit)) {
326
+ yield* tx.closeAttempt(attempt.id, new Attempt.Succeeded());
327
+ yield* tx.updateStepResult(attempt.runId, attempt.stepName, result.exit.value);
328
+ yield* tx.updateState(runId, RunState.succeed(current.run.state));
329
+ yield* tx.requestWorkflowCommand(runId, "Continue");
330
+ return;
331
+ }
332
+ const failure = Cause.findErrorOption(result.exit.cause);
333
+ if (Option.isNone(failure))
334
+ return;
335
+ yield* tx.closeAttempt(attempt.id, new Attempt.Failed({ failure: failure.value }));
336
+ yield* tx.updateState(runId, RunState.fail(current.run.state));
337
+ yield* tx.requestWorkflowCommand(runId, "Continue");
338
+ }));
339
+ }, persistence("reconcile workflow completion"));
340
+ return {
341
+ approve,
342
+ appendTranscript,
343
+ beginAttempt,
344
+ cancel,
345
+ claimQueued,
346
+ completeWorkflowCommand: (runId, command) => queries
347
+ .completeWorkflowCommand(runId, command)
348
+ .pipe(persistence("complete workflow command")),
349
+ failAttempt,
350
+ nextQueued: (runId) => queries.nextQueued(runId).pipe(persistence("find queued Event")),
351
+ parkForApproval,
352
+ pendingWorkflowCommands: queries
353
+ .pendingWorkflowCommands()
354
+ .pipe(persistence("list pending workflow commands")),
355
+ recordAndClaim,
356
+ reconcileCompletion,
357
+ recoverable: recoverable(),
358
+ retry,
359
+ revoke,
360
+ snapshot: (runId) => queries.snapshot(runId).pipe(persistence("read run")),
361
+ succeedAttempt,
362
+ transcript,
363
+ };
364
+ });
365
+ /**
366
+ * The durable Run projection store. The interface below is the store's
367
+ * declared contract — the seam any other backend (for example a Postgres
368
+ * store) implements with its own `Layer.effect(RunStore, ...)`. Methods speak
369
+ * domain vocabulary only and fail only with `RunStoreError`.
370
+ */
371
+ export class RunStore extends Context.Service()("@usine/engine/internal/RunStore") {
372
+ static layer = Layer.effect(RunStore, makeRunStore);
373
+ }
374
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { AttemptFailure, Run, StepResult } from "@usine/core";
2
+ import { Effect, Schema } from "effect";
3
+ import { DurableDeferred, Workflow, WorkflowEngine } from "effect/unstable/workflow";
4
+ import { StepExecutor } from "./step-executor.ts";
5
+ import { RunStore } from "./store/store.ts";
6
+ import { Submission, type RunStoreError } from "./model.ts";
7
+ export declare const DurableRun: Workflow.Workflow<"@usine/engine/DurableRun", Schema.Struct<{
8
+ readonly submission: typeof Submission;
9
+ }>, typeof StepResult.StepResult, Schema.Union<readonly [typeof AttemptFailure.InfraFailure, typeof AttemptFailure.AgentFailure, typeof AttemptFailure.RunawayFailure]>>;
10
+ export declare const ApprovalGate: DurableDeferred.DurableDeferred<Schema.Void, Schema.Never>;
11
+ export declare const continueWithNewest: (store: RunStore["Service"], completedRunId: Run.RunId) => Effect.Effect<void, RunStoreError, WorkflowEngine.WorkflowEngine>;
12
+ export declare const durableRunLayer: import("effect/Layer").Layer<never, never, RunStore | StepExecutor | WorkflowEngine.WorkflowEngine>;
13
+ export declare const runIdFor: (submission: Submission) => Effect.Effect<string & import("effect/Brand").Brand<"RunId">, never, never>;
14
+ //# sourceMappingURL=workflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAyB,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAIL,UAAU,EACV,KAAK,aAAa,EACnB,MAAM,YAAY,CAAC;AAOpB,eAAO,MAAM,UAAU;;wKAKqB,CAAC;AAE7C,eAAO,MAAM,YAAY,4DAAqD,CAAC;AAiB/E,eAAO,MAAM,kBAAkB,EAAE,CAC/B,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC1B,cAAc,EAAE,GAAG,CAAC,KAAK,KACtB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,CAAC,cAAc,CAanE,CAAC;AAiFH,eAAO,MAAM,eAAe,qGAAwC,CAAC;AAErE,eAAO,MAAM,QAAQ,yGAEnB,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { AttemptFailure, Run, StepResult } from "@usine/core";
2
+ import { Effect, Option, Result, Schema } from "effect";
3
+ import { DurableDeferred, Workflow, WorkflowEngine } from "effect/unstable/workflow";
4
+ import { StepExecutor } from "./step-executor.js";
5
+ import { AttemptRecoveryFailed, RunStore } from "./store/store.js";
6
+ import { EnginePersistenceError, RunNotFoundError, RunOperationRejectedError, Submission, } from "./model.js";
7
+ const WorkflowPayload = Schema.Struct({
8
+ submission: Submission,
9
+ });
10
+ export const DurableRun = Workflow.make("@usine/engine/DurableRun", {
11
+ payload: WorkflowPayload,
12
+ success: StepResult.StepResult,
13
+ error: AttemptFailure.AttemptFailure,
14
+ idempotencyKey: ({ submission }) => submission.event.dedupKey,
15
+ }).annotate(Workflow.SuspendOnFailure, true);
16
+ export const ApprovalGate = DurableDeferred.make("@usine/engine/ApprovalGate");
17
+ const asAttemptFailure = (effect) => Effect.catchTags(effect, {
18
+ EnginePersistenceError: (error) => new AttemptFailure.InfraFailure({
19
+ message: `Engine persistence failed during ${error.operation}`,
20
+ cause: error,
21
+ }),
22
+ RunNotFoundError: (error) => Effect.die(error),
23
+ RunOperationRejectedError: (error) => Effect.die(error),
24
+ });
25
+ const executionId = (submission) => DurableRun.executionId({ submission });
26
+ export const continueWithNewest = Effect.fn("DurableRun.continueWithNewest")(function* (store, completedRunId) {
27
+ const queued = yield* store.nextQueued(completedRunId);
28
+ if (Option.isSome(queued)) {
29
+ const nextExecutionId = yield* executionId(queued.value);
30
+ const runId = Run.RunId.make(nextExecutionId);
31
+ const claimed = yield* store.claimQueued(queued.value, runId);
32
+ if (Option.isSome(claimed)) {
33
+ yield* DurableRun.execute({ submission: claimed.value.submission }, { discard: true });
34
+ }
35
+ }
36
+ yield* store.completeWorkflowCommand(completedRunId, "Continue");
37
+ });
38
+ const executeDurableRun = Effect.fn("DurableRun.execute")(function* ({ submission }, executionId) {
39
+ const runId = Run.RunId.make(executionId);
40
+ const store = yield* RunStore;
41
+ const executor = yield* StepExecutor;
42
+ if (submission.approval === "required") {
43
+ yield* store.parkForApproval(runId).pipe(asAttemptFailure);
44
+ yield* DurableDeferred.await(ApprovalGate);
45
+ }
46
+ while (true) {
47
+ // The wait for a worker slot stays interruptible: a cancel must be able
48
+ // to reach a run parked in `reserve` (its scheduler releases or reoffers
49
+ // the slot in its own onInterrupt). Only after the lease exists does the
50
+ // release obligation begin.
51
+ const lease = yield* executor.reserve(submission);
52
+ const attempted = yield* Effect.gen(function* () {
53
+ const started = yield* store.beginAttempt(runId, lease.worker).pipe(asAttemptFailure);
54
+ if (started instanceof AttemptRecoveryFailed || started._tag === "RunClosed") {
55
+ return started;
56
+ }
57
+ // Port ACL: the executor's contract is the typed AttemptFailure channel.
58
+ // A defect escaping the adapter is infrastructure breakage around the
59
+ // agent, so it is translated before reaching the durable workflow.
60
+ const result = yield* executor
61
+ .execute(started.execution, {
62
+ append: (direction, envelope) => store.appendTranscript(direction, envelope).pipe(asAttemptFailure),
63
+ })
64
+ .pipe(Effect.catchDefect((defect) => new AttemptFailure.InfraFailure({
65
+ message: "The step executor crashed outside its typed failure channel",
66
+ cause: defect,
67
+ })), Effect.result);
68
+ return { _tag: "AttemptExecuted", result, started };
69
+ }).pipe(Effect.ensuring(lease.release));
70
+ if (attempted._tag === "RunClosed") {
71
+ // Canceled, superseded, or revoked while queued: release was the only
72
+ // obligation; the closing operation already delivered the interrupt.
73
+ yield* Effect.logInfo("Run closed while it waited for a worker", {
74
+ runId,
75
+ state: attempted.state,
76
+ });
77
+ yield* continueWithNewest(store, runId).pipe(asAttemptFailure);
78
+ return yield* new AttemptFailure.AgentFailure({
79
+ message: `The run closed (${attempted.state}) before an attempt started`,
80
+ });
81
+ }
82
+ if (attempted instanceof AttemptRecoveryFailed) {
83
+ yield* continueWithNewest(store, runId).pipe(asAttemptFailure);
84
+ return yield* attempted.failure;
85
+ }
86
+ const { result, started } = attempted;
87
+ if (Result.isSuccess(result)) {
88
+ yield* store.succeedAttempt(started.execution.attempt, result.success).pipe(asAttemptFailure);
89
+ yield* continueWithNewest(store, runId).pipe(asAttemptFailure);
90
+ return result.success;
91
+ }
92
+ const retry = yield* store
93
+ .failAttempt(started.execution.attempt, result.failure)
94
+ .pipe(asAttemptFailure);
95
+ if (!retry) {
96
+ yield* continueWithNewest(store, runId).pipe(asAttemptFailure);
97
+ return yield* result.failure;
98
+ }
99
+ }
100
+ });
101
+ export const durableRunLayer = DurableRun.toLayer(executeDurableRun);
102
+ export const runIdFor = Effect.fn("DurableRun.runIdFor")(function* (submission) {
103
+ return Run.RunId.make(yield* executionId(submission));
104
+ });
105
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ CREATE TABLE `usine_approvals` (
2
+ `run_id` text PRIMARY KEY,
3
+ `event_id` text NOT NULL UNIQUE,
4
+ CONSTRAINT `fk_usine_approvals_run_id_usine_runs_run_id_fk` FOREIGN KEY (`run_id`) REFERENCES `usine_runs`(`run_id`),
5
+ CONSTRAINT `fk_usine_approvals_event_id_usine_events_event_id_fk` FOREIGN KEY (`event_id`) REFERENCES `usine_events`(`event_id`)
6
+ );
7
+ --> statement-breakpoint
8
+ CREATE TABLE `usine_attempts` (
9
+ `attempt_id` text PRIMARY KEY,
10
+ `run_id` text NOT NULL,
11
+ `step_name` text NOT NULL,
12
+ `attempt_number` integer NOT NULL,
13
+ `started_at` text NOT NULL,
14
+ `outcome_json` text,
15
+ CONSTRAINT `fk_usine_attempts_run_id_step_name_usine_steps_run_id_step_name_fk` FOREIGN KEY (`run_id`,`step_name`) REFERENCES `usine_steps`(`run_id`,`step_name`),
16
+ CONSTRAINT "usine_attempts_number" CHECK("attempt_number" >= 1),
17
+ CONSTRAINT "usine_attempts_outcome_json_valid" CHECK("outcome_json" is null or json_valid("outcome_json"))
18
+ );
19
+ --> statement-breakpoint
20
+ CREATE TABLE `usine_events` (
21
+ `event_id` text PRIMARY KEY,
22
+ `dedup_key` text NOT NULL UNIQUE,
23
+ `payload_json` text NOT NULL,
24
+ `received_at` text NOT NULL,
25
+ CONSTRAINT "usine_events_payload_json_valid" CHECK(json_valid("payload_json"))
26
+ );
27
+ --> statement-breakpoint
28
+ CREATE TABLE `usine_ignored_events` (
29
+ `event_id` text PRIMARY KEY,
30
+ `reason` text NOT NULL,
31
+ CONSTRAINT `fk_usine_ignored_events_event_id_usine_trigger_events_event_id_fk` FOREIGN KEY (`event_id`) REFERENCES `usine_trigger_events`(`event_id`),
32
+ CONSTRAINT "usine_ignored_events_reason" CHECK("reason" in ('superseded', 'revoked'))
33
+ );
34
+ --> statement-breakpoint
35
+ CREATE TABLE `usine_runs` (
36
+ `run_id` text PRIMARY KEY,
37
+ `event_id` text NOT NULL UNIQUE,
38
+ `loop_name` text NOT NULL,
39
+ `state_json` text NOT NULL,
40
+ `opened_at` text NOT NULL,
41
+ CONSTRAINT `fk_usine_runs_event_id_usine_trigger_events_event_id_fk` FOREIGN KEY (`event_id`) REFERENCES `usine_trigger_events`(`event_id`),
42
+ CONSTRAINT "usine_runs_state_json_valid" CHECK(json_valid("state_json"))
43
+ );
44
+ --> statement-breakpoint
45
+ CREATE TABLE `usine_steps` (
46
+ `run_id` text NOT NULL,
47
+ `step_name` text NOT NULL,
48
+ `result` text,
49
+ CONSTRAINT `usine_steps_pk` PRIMARY KEY(`run_id`, `step_name`),
50
+ CONSTRAINT `fk_usine_steps_run_id_usine_runs_run_id_fk` FOREIGN KEY (`run_id`) REFERENCES `usine_runs`(`run_id`)
51
+ );
52
+ --> statement-breakpoint
53
+ CREATE TABLE `usine_trigger_events` (
54
+ `event_id` text PRIMARY KEY,
55
+ `item_key` text NOT NULL,
56
+ `loop_name` text NOT NULL,
57
+ `step_name` text NOT NULL,
58
+ `approval` text NOT NULL,
59
+ CONSTRAINT `fk_usine_trigger_events_event_id_usine_events_event_id_fk` FOREIGN KEY (`event_id`) REFERENCES `usine_events`(`event_id`),
60
+ CONSTRAINT "usine_trigger_events_approval" CHECK("approval" in ('none', 'required'))
61
+ );
62
+ --> statement-breakpoint
63
+ CREATE TABLE `usine_workflow_commands` (
64
+ `run_id` text NOT NULL,
65
+ `command` text NOT NULL,
66
+ CONSTRAINT `usine_workflow_commands_pk` PRIMARY KEY(`run_id`, `command`),
67
+ CONSTRAINT `fk_usine_workflow_commands_run_id_usine_runs_run_id_fk` FOREIGN KEY (`run_id`) REFERENCES `usine_runs`(`run_id`),
68
+ CONSTRAINT "usine_workflow_commands_command" CHECK("command" in ('Approve', 'Continue', 'Interrupt', 'Resume'))
69
+ );
70
+ --> statement-breakpoint
71
+ CREATE UNIQUE INDEX `usine_attempt_number` ON `usine_attempts` (`run_id`,`step_name`,`attempt_number`);--> statement-breakpoint
72
+ CREATE UNIQUE INDEX `usine_one_in_flight_attempt` ON `usine_attempts` (`run_id`) WHERE "usine_attempts"."outcome_json" is null;--> statement-breakpoint
73
+ CREATE INDEX `usine_trigger_events_item` ON `usine_trigger_events` (`loop_name`,`item_key`);