@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
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@usine/engine",
3
- "version": "0.3.0",
4
- "description": "The usine run engine: event ledger, dedup/supersede/revoke, run scheduling, durable-execution seam, SQLite store.",
5
- "license": "MIT",
3
+ "version": "0.5.0",
4
+ "description": "The usine run engine: event ledger, dedup/supersede/revoke, run scheduling and restart recovery, SQLite store.",
5
+ "license": "AGPL-3.0-only",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/basaltbytes/usine.git",
@@ -10,6 +10,7 @@
10
10
  },
11
11
  "files": [
12
12
  "dist",
13
+ "!dist/tsconfig.tsbuildinfo",
13
14
  "drizzle"
14
15
  ],
15
16
  "type": "module",
@@ -19,6 +20,10 @@
19
20
  "types": "./dist/cycle-budget/cycle-budget.d.ts",
20
21
  "default": "./dist/cycle-budget/cycle-budget.js"
21
22
  },
23
+ "./board-moves": {
24
+ "types": "./dist/board-moves/board-moves.d.ts",
25
+ "default": "./dist/board-moves/board-moves.js"
26
+ },
22
27
  "./engine": {
23
28
  "types": "./dist/engine/engine.d.ts",
24
29
  "default": "./dist/engine/engine.js"
@@ -39,6 +44,10 @@
39
44
  "types": "./dist/step-executor.d.ts",
40
45
  "default": "./dist/step-executor.js"
41
46
  },
47
+ "./trigger-condition": {
48
+ "types": "./dist/trigger-condition.d.ts",
49
+ "default": "./dist/trigger-condition.js"
50
+ },
42
51
  "./transcript": {
43
52
  "types": "./dist/transcript.d.ts",
44
53
  "default": "./dist/transcript.js"
@@ -64,21 +73,22 @@
64
73
  "access": "public"
65
74
  },
66
75
  "dependencies": {
67
- "@effect/platform-node": "4.0.0-rc.111",
68
- "@effect/sql-sqlite-node": "4.0.0-rc.111",
69
- "drizzle-orm": "1.0.0-rc.4",
70
- "@usine/core": "0.3.0"
76
+ "@effect/platform-node": "4.0.6",
77
+ "@effect/platform-node-shared": "4.0.6",
78
+ "@effect/sql-sqlite-node": "4.0.6",
79
+ "drizzle-orm": "1.0.0-rc.5",
80
+ "@usine/core": "0.5.0"
71
81
  },
72
82
  "devDependencies": {
73
- "@effect/vitest": "4.0.0-rc.111",
74
- "drizzle-kit": "1.0.0-rc.4",
75
- "effect": "4.0.0-rc.111",
83
+ "@effect/vitest": "4.0.6",
84
+ "drizzle-kit": "1.0.0-rc.5",
85
+ "effect": "4.0.6",
76
86
  "typescript": "7.0.2",
77
- "vitest": "4.1.11",
87
+ "vitest": "5.0.5",
78
88
  "@usine/tsconfig": "0.0.0"
79
89
  },
80
90
  "peerDependencies": {
81
- "effect": "4.0.0-rc.111"
91
+ "effect": "4.0.6"
82
92
  },
83
93
  "engines": {
84
94
  "node": ">=22"
@@ -1 +0,0 @@
1
- {"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../src/workflow/admission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAY,MAAM,EAAE,KAAK,EAAe,MAAM,QAAQ,CAAC;;IAOnE,2GAA2G;0BACrF,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC5B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACX,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;;AAT7C,uGAAuG;AACvG,qBAAa,gBAAiB,SAAQ,qBAUD;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,8CAkEnB;CACH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"admission.js","sourceRoot":"","sources":["../../src/workflow/admission.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,uGAAuG;AACvG,MAAM,OAAO,gBAAiB,SAAQ,OAAO,CAAC,OAAO,EAUlD,CAAC,gCAAgC,CAAC;IACnC,MAAM,CAAU,KAAK,GAAG,KAAK,CAAC,MAAM,CAClC,gBAAgB,EAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YAC1C,CAAC,CAAC,YAAY,CAAC,KAAK;YACpB,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAQ,CAAC;QACjC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAqB,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAQ,CAAC;QAE3C,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAY;YACvE,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,oEAAoE;YACpE,qEAAqE;YACrE,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CACrD,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC;gBAC7B,CAAC,CAAE,CAAC,KAAK,EAAE,OAAO,CAAW;gBAC7B,CAAC,CAAE,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAW,CACpD,CAAC;YACF,IAAI,CAAC,QAAQ;gBACX,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,wDAAwD,EAAE;oBAC9E,KAAK;iBACN,CAAC,CAAC;YACL,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAY;YACvE,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,YAAY,CACvC,MAAM,EACN,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAChE,CAAC;YACF,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,8BAA8B,EAAE;oBACpD,KAAK;oBACL,eAAe,EAAE,CAAC,GAAG,SAAS,CAAC;iBAChC,CAAC,CAAC;gBACH,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;oBAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,8BAA8B,CAAC,CAAC,QAAQ,CAAC,EACrE,KAAY,EACZ,OAA+B;YAE/B,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CACpC,KAAK,CAAC,KAAK,CAAC,EACZ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACjD,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CACtD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC;YACzD,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACvC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,4DAA4D,EAAE;gBAClF,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC;aAC3B,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;gBAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAClE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC,CAAC,CACH,CAAC;CACH"}
@@ -1,13 +0,0 @@
1
- import { Schema } from "effect";
2
- /** One-shot requests the store hands to the workflow runtime. */
3
- export declare const WORKFLOW_COMMANDS: readonly ["Approve", "Continue", "Interrupt", "Resume"];
4
- export declare const WorkflowCommand: Schema.Literals<readonly ["Approve", "Continue", "Interrupt", "Resume"]>;
5
- export type WorkflowCommand = typeof WorkflowCommand.Type;
6
- /**
7
- * Replay order after a restart, first delivered first. Interrupt precedes
8
- * Continue so a canceled workflow stops before the next queued Event opens,
9
- * keeping one open Run per Item; the length constraint makes the list name
10
- * every command exactly once.
11
- */
12
- export declare const WORKFLOW_COMMAND_PRIORITY: readonly ["Resume", "Interrupt", "Continue", "Approve"];
13
- //# sourceMappingURL=command.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/workflow/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,iEAAiE;AACjE,eAAO,MAAM,iBAAiB,YAAI,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAEzF,eAAO,MAAM,eAAe,0EAAqC,CAAC;AAElE,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAC,IAAI,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,yDAOrC,CAAC"}
@@ -1,17 +0,0 @@
1
- import { Schema } from "effect";
2
- /** One-shot requests the store hands to the workflow runtime. */
3
- export const WORKFLOW_COMMANDS = ["Approve", "Continue", "Interrupt", "Resume"];
4
- export const WorkflowCommand = Schema.Literals(WORKFLOW_COMMANDS);
5
- /**
6
- * Replay order after a restart, first delivered first. Interrupt precedes
7
- * Continue so a canceled workflow stops before the next queued Event opens,
8
- * keeping one open Run per Item; the length constraint makes the list name
9
- * every command exactly once.
10
- */
11
- export const WORKFLOW_COMMAND_PRIORITY = [
12
- "Resume",
13
- "Interrupt",
14
- "Continue",
15
- "Approve",
16
- ];
17
- //# sourceMappingURL=command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/workflow/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAEzF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AAIlE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,QAAQ;IACR,WAAW;IACX,UAAU;IACV,SAAS;CAGV,CAAC"}
@@ -1,18 +0,0 @@
1
- import { AgentFailure, DefectFailure, InfraFailure } from "@usine/core/attempt/failure";
2
- import { RunId } from "@usine/core/run";
3
- import { StepResult } from "@usine/core/step/result";
4
- import { Effect, Schema } from "effect";
5
- import { DurableDeferred, Workflow, WorkflowEngine } from "effect/unstable/workflow";
6
- import { StepExecutor } from "../step-executor.ts";
7
- import { AttemptAdmission } from "./admission.ts";
8
- import { RunStore } from "../store/store.ts";
9
- import { type RunStoreError } from "../engine/error.ts";
10
- import { Submission } from "../engine/submission.ts";
11
- export declare const DurableRun: Workflow.Workflow<"@usine/engine/DurableRun", Schema.Struct<{
12
- readonly submission: typeof Submission;
13
- }>, typeof StepResult, Schema.Union<readonly [typeof InfraFailure, typeof DefectFailure, typeof AgentFailure, typeof import("@usine/core/attempt/failure").RunawayFailure, typeof import("@usine/core/attempt/failure").ChildSessionBudgetFailure]>>;
14
- export declare const ApprovalGate: DurableDeferred.DurableDeferred<Schema.Void, Schema.Never>;
15
- export declare const continueWithNewest: (store: RunStore["Service"], completedRunId: RunId) => Effect.Effect<void, RunStoreError, WorkflowEngine.WorkflowEngine>;
16
- export declare const durableRunLayer: import("effect/Layer").Layer<never, never, AttemptAdmission | RunStore | StepExecutor | WorkflowEngine.WorkflowEngine>;
17
- export declare const runIdFor: (submission: Submission) => Effect.Effect<string & import("effect/Brand").Brand<"RunId">, never, never>;
18
- //# sourceMappingURL=workflow.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/workflow/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,aAAa,EACb,YAAY,EACb,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,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,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAyB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAOrD,eAAO,MAAM,UAAU;;oPAKqB,CAAC;AAE7C,eAAO,MAAM,YAAY,4DAAqD,CAAC;AAiB/E,eAAO,MAAM,kBAAkB,EAAE,CAC/B,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC1B,cAAc,EAAE,KAAK,KAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,CAAC,cAAc,CAanE,CAAC;AA6FH,eAAO,MAAM,eAAe,wHAAwC,CAAC;AAErE,eAAO,MAAM,QAAQ,yGAEnB,CAAC"}
@@ -1,108 +0,0 @@
1
- import { AgentFailure, AttemptFailure, DefectFailure, InfraFailure, } from "@usine/core/attempt/failure";
2
- import { RunId } from "@usine/core/run";
3
- import { StepResult } from "@usine/core/step/result";
4
- import { Effect, Option, Result, Schema } from "effect";
5
- import { DurableDeferred, Workflow, WorkflowEngine } from "effect/unstable/workflow";
6
- import { StepExecutor } from "../step-executor.js";
7
- import { AttemptAdmission } from "./admission.js";
8
- import { AttemptRecoveryFailed, RunStore } from "../store/store.js";
9
- import { EnginePersistenceError, RunNotFoundError, RunOperationRejectedError, } from "../engine/error.js";
10
- import { Submission } from "../engine/submission.js";
11
- const WorkflowPayload = Schema.Struct({
12
- submission: Submission,
13
- });
14
- export const DurableRun = Workflow.make("@usine/engine/DurableRun", {
15
- payload: WorkflowPayload,
16
- success: StepResult,
17
- error: AttemptFailure,
18
- idempotencyKey: ({ submission }) => submission.event.dedupKey,
19
- }).annotate(Workflow.SuspendOnFailure, true);
20
- export const ApprovalGate = DurableDeferred.make("@usine/engine/ApprovalGate");
21
- const asAttemptFailure = (effect) => Effect.catchTags(effect, {
22
- EnginePersistenceError: (error) => new InfraFailure({
23
- message: `Engine persistence failed during ${error.operation}`,
24
- cause: error,
25
- }),
26
- RunNotFoundError: (error) => Effect.die(error),
27
- RunOperationRejectedError: (error) => Effect.die(error),
28
- });
29
- const executionId = (submission) => DurableRun.executionId({ submission });
30
- export const continueWithNewest = Effect.fn("DurableRun.continueWithNewest")(function* (store, completedRunId) {
31
- const queued = yield* store.nextQueued(completedRunId);
32
- if (Option.isSome(queued)) {
33
- const nextExecutionId = yield* executionId(queued.value);
34
- const runId = RunId.make(nextExecutionId);
35
- const claimed = yield* store.claimQueued(queued.value, runId);
36
- if (Option.isSome(claimed)) {
37
- yield* DurableRun.execute({ submission: claimed.value.submission }, { discard: true });
38
- }
39
- }
40
- yield* store.completeWorkflowCommand(completedRunId, "Continue");
41
- });
42
- const executeAttempt = Effect.fn("DurableRun.attempt")(function* (runId, worker) {
43
- yield* Effect.annotateCurrentSpan({ runId, worker });
44
- const store = yield* RunStore;
45
- const executor = yield* StepExecutor;
46
- const started = yield* store.beginAttempt(runId, worker).pipe(asAttemptFailure);
47
- if (started instanceof AttemptRecoveryFailed || started._tag === "RunClosed") {
48
- return started;
49
- }
50
- // Durable workflows need a serializable terminal outcome. Preserve an
51
- // executor defect without turning a programming bug into an automatic retry.
52
- const result = yield* executor
53
- .execute(started.execution, {
54
- append: (direction, envelope) => store.appendTranscript(direction, envelope).pipe(asAttemptFailure),
55
- })
56
- .pipe(Effect.catchDefect((defect) => Effect.logError("Step executor defect; operator intervention required", { runId }).pipe(Effect.andThen(new DefectFailure({
57
- message: "The step executor crashed outside its typed failure channel",
58
- cause: defect,
59
- })))), Effect.result);
60
- const decision = yield* store
61
- .finishAttempt(started.execution.attempt, result)
62
- .pipe(asAttemptFailure);
63
- return { _tag: "AttemptExecuted", result, decision };
64
- });
65
- const executeDurableRun = Effect.fn("DurableRun.execute")(function* ({ submission }, executionId) {
66
- const runId = RunId.make(executionId);
67
- const store = yield* RunStore;
68
- const executor = yield* StepExecutor;
69
- const admission = yield* AttemptAdmission;
70
- if (submission.approval === "required") {
71
- yield* store.parkForApproval(runId).pipe(asAttemptFailure);
72
- yield* DurableDeferred.await(ApprovalGate);
73
- }
74
- while (true) {
75
- // The wait for a worker slot stays interruptible so a cancel can reach a run
76
- // parked in `reserve`; the scheduler releases or reoffers the slot in its own
77
- // onInterrupt. The release obligation begins only once the lease exists.
78
- const attempted = yield* Effect.uninterruptibleMask((restore) => restore(executor.reserve(submission)).pipe(Effect.flatMap((lease) => restore(admission.withAttempt(runId, executeAttempt(runId, lease.worker))).pipe(Effect.ensuring(lease.release)))));
79
- if (attempted._tag === "RunClosed") {
80
- // Canceled, superseded, or revoked while queued: release was the only
81
- // obligation, and the closing operation already delivered the interrupt.
82
- yield* Effect.logInfo("Run closed while it waited for a worker", {
83
- runId,
84
- state: attempted.state,
85
- });
86
- yield* continueWithNewest(store, runId).pipe(asAttemptFailure);
87
- return yield* new AgentFailure({
88
- message: `The run closed (${attempted.state}) before an attempt started`,
89
- });
90
- }
91
- if (attempted instanceof AttemptRecoveryFailed) {
92
- yield* continueWithNewest(store, runId).pipe(asAttemptFailure);
93
- return yield* attempted.failure;
94
- }
95
- const { result, decision } = attempted;
96
- if (decision._tag !== "RetryAttempt") {
97
- yield* continueWithNewest(store, runId).pipe(asAttemptFailure);
98
- if (Result.isSuccess(result))
99
- return result.success;
100
- return yield* result.failure;
101
- }
102
- }
103
- });
104
- export const durableRunLayer = DurableRun.toLayer(executeDurableRun);
105
- export const runIdFor = Effect.fn("DurableRun.runIdFor")(function* (submission) {
106
- return RunId.make(yield* executionId(submission));
107
- });
108
- //# sourceMappingURL=workflow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/workflow/workflow.ts"],"names":[],"mappings":"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"}