@smthrs/triggers 0.0.0-stage → 1.0.0-rc.3

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 (226) hide show
  1. package/CHANGELOG.md +219 -0
  2. package/LICENSE +21 -0
  3. package/README.md +109 -2
  4. package/dist/cjs/CatchUp.d.ts +25 -0
  5. package/dist/cjs/CatchUp.d.ts.map +1 -0
  6. package/dist/cjs/CatchUp.js +72 -0
  7. package/dist/cjs/CatchUp.js.map +7 -0
  8. package/dist/cjs/Channel.d.ts +108 -0
  9. package/dist/cjs/Channel.d.ts.map +1 -0
  10. package/dist/cjs/Channel.js +25 -0
  11. package/dist/cjs/Channel.js.map +7 -0
  12. package/dist/cjs/ClaimDecision.d.ts +183 -0
  13. package/dist/cjs/ClaimDecision.d.ts.map +1 -0
  14. package/dist/cjs/ClaimDecision.js +144 -0
  15. package/dist/cjs/ClaimDecision.js.map +7 -0
  16. package/dist/cjs/Cron.d.ts +91 -0
  17. package/dist/cjs/Cron.d.ts.map +1 -0
  18. package/dist/cjs/Cron.js +108 -0
  19. package/dist/cjs/Cron.js.map +7 -0
  20. package/dist/cjs/DispatchReader.d.ts +77 -0
  21. package/dist/cjs/DispatchReader.d.ts.map +1 -0
  22. package/dist/cjs/DispatchReader.js +121 -0
  23. package/dist/cjs/DispatchReader.js.map +7 -0
  24. package/dist/cjs/Overlap.d.ts +40 -0
  25. package/dist/cjs/Overlap.d.ts.map +1 -0
  26. package/dist/cjs/Overlap.js +37 -0
  27. package/dist/cjs/Overlap.js.map +7 -0
  28. package/dist/cjs/Schedule.d.ts +96 -0
  29. package/dist/cjs/Schedule.d.ts.map +1 -0
  30. package/dist/cjs/Schedule.js +61 -0
  31. package/dist/cjs/Schedule.js.map +7 -0
  32. package/dist/cjs/Scheduler.d.ts +248 -0
  33. package/dist/cjs/Scheduler.d.ts.map +1 -0
  34. package/dist/cjs/Scheduler.js +647 -0
  35. package/dist/cjs/Scheduler.js.map +7 -0
  36. package/dist/cjs/SqlTriggerStore.d.ts +29 -0
  37. package/dist/cjs/SqlTriggerStore.d.ts.map +1 -0
  38. package/dist/cjs/SqlTriggerStore.js +483 -0
  39. package/dist/cjs/SqlTriggerStore.js.map +7 -0
  40. package/dist/cjs/Trigger.d.ts +81 -0
  41. package/dist/cjs/Trigger.d.ts.map +1 -0
  42. package/dist/cjs/Trigger.js +54 -0
  43. package/dist/cjs/Trigger.js.map +7 -0
  44. package/dist/cjs/TriggerError.d.ts +58 -0
  45. package/dist/cjs/TriggerError.d.ts.map +1 -0
  46. package/dist/cjs/TriggerError.js +83 -0
  47. package/dist/cjs/TriggerError.js.map +7 -0
  48. package/dist/cjs/TriggerStore.d.ts +411 -0
  49. package/dist/cjs/TriggerStore.d.ts.map +1 -0
  50. package/dist/cjs/TriggerStore.js +127 -0
  51. package/dist/cjs/TriggerStore.js.map +7 -0
  52. package/dist/cjs/Webhook.d.ts +118 -0
  53. package/dist/cjs/Webhook.d.ts.map +1 -0
  54. package/dist/cjs/Webhook.js +153 -0
  55. package/dist/cjs/Webhook.js.map +7 -0
  56. package/dist/cjs/index.d.ts +30 -0
  57. package/dist/cjs/index.d.ts.map +1 -0
  58. package/dist/cjs/index.js +57 -0
  59. package/dist/cjs/index.js.map +7 -0
  60. package/dist/cjs/internal/ActiveRuns.d.ts +51 -0
  61. package/dist/cjs/internal/ActiveRuns.d.ts.map +1 -0
  62. package/dist/cjs/internal/ActiveRuns.js +56 -0
  63. package/dist/cjs/internal/ActiveRuns.js.map +7 -0
  64. package/dist/cjs/internal/DueOccurrences.d.ts +32 -0
  65. package/dist/cjs/internal/DueOccurrences.d.ts.map +1 -0
  66. package/dist/cjs/internal/DueOccurrences.js +80 -0
  67. package/dist/cjs/internal/DueOccurrences.js.map +7 -0
  68. package/dist/cjs/internal/WallClock.d.ts +59 -0
  69. package/dist/cjs/internal/WallClock.d.ts.map +1 -0
  70. package/dist/cjs/internal/WallClock.js +132 -0
  71. package/dist/cjs/internal/WallClock.js.map +7 -0
  72. package/dist/cjs/migrations/0001_triggers.d.ts +15 -0
  73. package/dist/cjs/migrations/0001_triggers.d.ts.map +1 -0
  74. package/dist/cjs/migrations/0001_triggers.js +64 -0
  75. package/dist/cjs/migrations/0001_triggers.js.map +7 -0
  76. package/dist/cjs/migrations/0002_reservation_lease.d.ts +15 -0
  77. package/dist/cjs/migrations/0002_reservation_lease.d.ts.map +1 -0
  78. package/dist/cjs/migrations/0002_reservation_lease.js +41 -0
  79. package/dist/cjs/migrations/0002_reservation_lease.js.map +7 -0
  80. package/dist/cjs/migrations/0003_heartbeat.d.ts +16 -0
  81. package/dist/cjs/migrations/0003_heartbeat.d.ts.map +1 -0
  82. package/dist/cjs/migrations/0003_heartbeat.js +44 -0
  83. package/dist/cjs/migrations/0003_heartbeat.js.map +7 -0
  84. package/dist/cjs/migrations/0004_fire_run_index.d.ts +17 -0
  85. package/dist/cjs/migrations/0004_fire_run_index.d.ts.map +1 -0
  86. package/dist/cjs/migrations/0004_fire_run_index.js +40 -0
  87. package/dist/cjs/migrations/0004_fire_run_index.js.map +7 -0
  88. package/dist/cjs/migrations/index.d.ts +33 -0
  89. package/dist/cjs/migrations/index.d.ts.map +1 -0
  90. package/dist/cjs/migrations/index.js +50 -0
  91. package/dist/cjs/migrations/index.js.map +7 -0
  92. package/dist/cjs/package.json +1 -0
  93. package/dist/cjs/test/TestTriggers.d.ts +12 -0
  94. package/dist/cjs/test/TestTriggers.d.ts.map +1 -0
  95. package/dist/cjs/test/TestTriggers.js +421 -0
  96. package/dist/cjs/test/TestTriggers.js.map +7 -0
  97. package/dist/esm/CatchUp.d.ts +25 -0
  98. package/dist/esm/CatchUp.d.ts.map +1 -0
  99. package/dist/esm/CatchUp.js +52 -0
  100. package/dist/esm/CatchUp.js.map +1 -0
  101. package/dist/esm/Channel.d.ts +108 -0
  102. package/dist/esm/Channel.d.ts.map +1 -0
  103. package/dist/esm/Channel.js +19 -0
  104. package/dist/esm/Channel.js.map +1 -0
  105. package/dist/esm/ClaimDecision.d.ts +183 -0
  106. package/dist/esm/ClaimDecision.d.ts.map +1 -0
  107. package/dist/esm/ClaimDecision.js +172 -0
  108. package/dist/esm/ClaimDecision.js.map +1 -0
  109. package/dist/esm/Cron.d.ts +91 -0
  110. package/dist/esm/Cron.d.ts.map +1 -0
  111. package/dist/esm/Cron.js +132 -0
  112. package/dist/esm/Cron.js.map +1 -0
  113. package/dist/esm/DispatchReader.d.ts +77 -0
  114. package/dist/esm/DispatchReader.d.ts.map +1 -0
  115. package/dist/esm/DispatchReader.js +152 -0
  116. package/dist/esm/DispatchReader.js.map +1 -0
  117. package/dist/esm/Overlap.d.ts +40 -0
  118. package/dist/esm/Overlap.d.ts.map +1 -0
  119. package/dist/esm/Overlap.js +31 -0
  120. package/dist/esm/Overlap.js.map +1 -0
  121. package/dist/esm/Schedule.d.ts +96 -0
  122. package/dist/esm/Schedule.d.ts.map +1 -0
  123. package/dist/esm/Schedule.js +73 -0
  124. package/dist/esm/Schedule.js.map +1 -0
  125. package/dist/esm/Scheduler.d.ts +248 -0
  126. package/dist/esm/Scheduler.d.ts.map +1 -0
  127. package/dist/esm/Scheduler.js +734 -0
  128. package/dist/esm/Scheduler.js.map +1 -0
  129. package/dist/esm/SqlTriggerStore.d.ts +29 -0
  130. package/dist/esm/SqlTriggerStore.d.ts.map +1 -0
  131. package/dist/esm/SqlTriggerStore.js +483 -0
  132. package/dist/esm/SqlTriggerStore.js.map +1 -0
  133. package/dist/esm/Trigger.d.ts +81 -0
  134. package/dist/esm/Trigger.d.ts.map +1 -0
  135. package/dist/esm/Trigger.js +56 -0
  136. package/dist/esm/Trigger.js.map +1 -0
  137. package/dist/esm/TriggerError.d.ts +58 -0
  138. package/dist/esm/TriggerError.d.ts.map +1 -0
  139. package/dist/esm/TriggerError.js +110 -0
  140. package/dist/esm/TriggerError.js.map +1 -0
  141. package/dist/esm/TriggerStore.d.ts +411 -0
  142. package/dist/esm/TriggerStore.d.ts.map +1 -0
  143. package/dist/esm/TriggerStore.js +209 -0
  144. package/dist/esm/TriggerStore.js.map +1 -0
  145. package/dist/esm/Webhook.d.ts +118 -0
  146. package/dist/esm/Webhook.d.ts.map +1 -0
  147. package/dist/esm/Webhook.js +186 -0
  148. package/dist/esm/Webhook.js.map +1 -0
  149. package/dist/esm/index.d.ts +30 -0
  150. package/dist/esm/index.d.ts.map +1 -0
  151. package/dist/esm/index.js +30 -0
  152. package/dist/esm/index.js.map +1 -0
  153. package/dist/esm/internal/ActiveRuns.d.ts +51 -0
  154. package/dist/esm/internal/ActiveRuns.d.ts.map +1 -0
  155. package/dist/esm/internal/ActiveRuns.js +34 -0
  156. package/dist/esm/internal/ActiveRuns.js.map +1 -0
  157. package/dist/esm/internal/DueOccurrences.d.ts +32 -0
  158. package/dist/esm/internal/DueOccurrences.d.ts.map +1 -0
  159. package/dist/esm/internal/DueOccurrences.js +55 -0
  160. package/dist/esm/internal/DueOccurrences.js.map +1 -0
  161. package/dist/esm/internal/WallClock.d.ts +59 -0
  162. package/dist/esm/internal/WallClock.d.ts.map +1 -0
  163. package/dist/esm/internal/WallClock.js +155 -0
  164. package/dist/esm/internal/WallClock.js.map +1 -0
  165. package/dist/esm/migrations/0001_triggers.d.ts +15 -0
  166. package/dist/esm/migrations/0001_triggers.d.ts.map +1 -0
  167. package/dist/esm/migrations/0001_triggers.js +42 -0
  168. package/dist/esm/migrations/0001_triggers.js.map +1 -0
  169. package/dist/esm/migrations/0002_reservation_lease.d.ts +15 -0
  170. package/dist/esm/migrations/0002_reservation_lease.d.ts.map +1 -0
  171. package/dist/esm/migrations/0002_reservation_lease.js +19 -0
  172. package/dist/esm/migrations/0002_reservation_lease.js.map +1 -0
  173. package/dist/esm/migrations/0003_heartbeat.d.ts +16 -0
  174. package/dist/esm/migrations/0003_heartbeat.d.ts.map +1 -0
  175. package/dist/esm/migrations/0003_heartbeat.js +23 -0
  176. package/dist/esm/migrations/0003_heartbeat.js.map +1 -0
  177. package/dist/esm/migrations/0004_fire_run_index.d.ts +17 -0
  178. package/dist/esm/migrations/0004_fire_run_index.d.ts.map +1 -0
  179. package/dist/esm/migrations/0004_fire_run_index.js +20 -0
  180. package/dist/esm/migrations/0004_fire_run_index.js.map +1 -0
  181. package/dist/esm/migrations/index.d.ts +33 -0
  182. package/dist/esm/migrations/index.d.ts.map +1 -0
  183. package/dist/esm/migrations/index.js +37 -0
  184. package/dist/esm/migrations/index.js.map +1 -0
  185. package/dist/esm/test/TestTriggers.d.ts +12 -0
  186. package/dist/esm/test/TestTriggers.d.ts.map +1 -0
  187. package/dist/esm/test/TestTriggers.js +439 -0
  188. package/dist/esm/test/TestTriggers.js.map +1 -0
  189. package/docs/README.md +140 -0
  190. package/docs/api.md +1186 -0
  191. package/docs/concepts/channels.md +103 -0
  192. package/docs/concepts/claim-protocol.md +229 -0
  193. package/docs/concepts/policies.md +124 -0
  194. package/docs/concepts/schedules.md +134 -0
  195. package/docs/guides/choose-a-policy.md +113 -0
  196. package/docs/guides/declare-a-trigger.md +136 -0
  197. package/docs/guides/ingest-a-webhook.md +164 -0
  198. package/docs/guides/run-the-scheduler.md +173 -0
  199. package/docs/guides/testing.md +157 -0
  200. package/docs/installation.md +81 -0
  201. package/docs/quickstart.md +163 -0
  202. package/docs/troubleshooting.md +281 -0
  203. package/package.json +241 -3
  204. package/src/CatchUp.ts +73 -0
  205. package/src/Channel.ts +121 -0
  206. package/src/ClaimDecision.ts +303 -0
  207. package/src/Cron.ts +173 -0
  208. package/src/DispatchReader.ts +179 -0
  209. package/src/Overlap.ts +53 -0
  210. package/src/Schedule.ts +112 -0
  211. package/src/Scheduler.ts +1154 -0
  212. package/src/SqlTriggerStore.ts +638 -0
  213. package/src/Trigger.ts +84 -0
  214. package/src/TriggerError.ts +129 -0
  215. package/src/TriggerStore.ts +514 -0
  216. package/src/Webhook.ts +270 -0
  217. package/src/index.ts +30 -0
  218. package/src/internal/ActiveRuns.ts +83 -0
  219. package/src/internal/DueOccurrences.ts +101 -0
  220. package/src/internal/WallClock.ts +172 -0
  221. package/src/migrations/0001_triggers.ts +43 -0
  222. package/src/migrations/0002_reservation_lease.ts +20 -0
  223. package/src/migrations/0003_heartbeat.ts +24 -0
  224. package/src/migrations/0004_fire_run_index.ts +21 -0
  225. package/src/migrations/index.ts +40 -0
  226. package/src/test/TestTriggers.ts +563 -0
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Durable trigger declarations.
3
+ *
4
+ * @see packages/smithers/agent/triggers/docs/api.md
5
+ *
6
+ * @since 0.1.0
7
+ */
8
+ import * as Effect from "effect/Effect";
9
+ import * as Schema from "effect/Schema";
10
+ import * as Schedule from "./Schedule.ts";
11
+ import { type TriggerError } from "./TriggerError.ts";
12
+ /**
13
+ * How a trigger behaves when an occurrence arrives while its previous run
14
+ * is still going.
15
+ *
16
+ * @category schemas
17
+ * @since 0.1.0
18
+ */
19
+ export declare const Overlap: Schema.Literals<readonly ["skip", "buffer-one", "supersede"]>;
20
+ /**
21
+ * The decoded form of {@link Overlap}.
22
+ *
23
+ * @category models
24
+ * @since 0.1.0
25
+ */
26
+ export type Overlap = Schedule.Overlap;
27
+ /**
28
+ * How many missed occurrences a trigger owes after downtime.
29
+ *
30
+ * @category schemas
31
+ * @since 0.1.0
32
+ */
33
+ export declare const CatchUp: Schema.Literals<readonly ["none", "one", "all"]>;
34
+ /**
35
+ * The decoded form of {@link CatchUp}.
36
+ *
37
+ * @category models
38
+ * @since 0.1.0
39
+ */
40
+ export type CatchUp = Schedule.CatchUp;
41
+ /**
42
+ * A trigger declaration: which flow to run, with what input, on what
43
+ * schedule.
44
+ *
45
+ * `input` is JSON rather than `unknown` because the store persists it with
46
+ * `JSON.stringify` into a `NOT NULL` column. The schema refuses `undefined`,
47
+ * `NaN`, a `Date`, and functions at the declaration boundary.
48
+ * Enumerable getters are accepted when their values are JSON. They are
49
+ * evaluated during decoding and again during SQL serialization. Every store
50
+ * takes an eager serialized snapshot before returning its Effect; use plain
51
+ * JSON values for stable input across reads.
52
+ *
53
+ * @category schemas
54
+ * @since 0.1.0
55
+ */
56
+ export declare const Trigger: Schema.Struct<{
57
+ readonly enabled: Schema.Boolean;
58
+ readonly cron: Schema.NonEmptyString;
59
+ readonly timezone: Schema.optional<Schema.NonEmptyString>;
60
+ readonly overlap: Schema.withDecodingDefault<Schema.Literals<readonly ["skip", "buffer-one", "supersede"]>, never>;
61
+ readonly catchUp: Schema.withDecodingDefault<Schema.Literals<readonly ["none", "one", "all"]>, never>;
62
+ readonly maxCatchUp: Schema.withDecodingDefault<Schema.Int, never>;
63
+ readonly id: Schema.NonEmptyString;
64
+ readonly flowId: Schema.NonEmptyString;
65
+ readonly input: Schema.Codec<Schema.Json, Schema.Json, never, never>;
66
+ }>;
67
+ /**
68
+ * The decoded form of {@link Trigger}.
69
+ *
70
+ * @category models
71
+ * @since 0.1.0
72
+ */
73
+ export type Trigger = typeof Trigger.Type;
74
+ /**
75
+ * Decodes and validates a trigger declaration.
76
+ *
77
+ * @category constructors
78
+ * @since 0.1.0
79
+ */
80
+ export declare const make: (input: unknown) => Effect.Effect<Trigger, TriggerError>;
81
+ //# sourceMappingURL=Trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Trigger.d.ts","sourceRoot":"","sources":["../../src/Trigger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEtE;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,+DAAmB,CAAA;AACvC;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;AACtC;;;;;GAKG;AACH,eAAO,MAAM,OAAO,kDAAmB,CAAA;AACvC;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;AAEtC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;EAMlB,CAAA;AACF;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,OAAO,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAItE,CAAA"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Durable trigger declarations.
3
+ *
4
+ * @see packages/smithers/agent/triggers/docs/api.md
5
+ *
6
+ * @since 0.1.0
7
+ */
8
+ import * as Effect from "effect/Effect";
9
+ import * as Schema from "effect/Schema";
10
+ import * as Schedule from "./Schedule.js";
11
+ import { fromSchemaError } from "./TriggerError.js";
12
+ /**
13
+ * How a trigger behaves when an occurrence arrives while its previous run
14
+ * is still going.
15
+ *
16
+ * @category schemas
17
+ * @since 0.1.0
18
+ */
19
+ export const Overlap = Schedule.Overlap;
20
+ /**
21
+ * How many missed occurrences a trigger owes after downtime.
22
+ *
23
+ * @category schemas
24
+ * @since 0.1.0
25
+ */
26
+ export const CatchUp = Schedule.CatchUp;
27
+ /**
28
+ * A trigger declaration: which flow to run, with what input, on what
29
+ * schedule.
30
+ *
31
+ * `input` is JSON rather than `unknown` because the store persists it with
32
+ * `JSON.stringify` into a `NOT NULL` column. The schema refuses `undefined`,
33
+ * `NaN`, a `Date`, and functions at the declaration boundary.
34
+ * Enumerable getters are accepted when their values are JSON. They are
35
+ * evaluated during decoding and again during SQL serialization. Every store
36
+ * takes an eager serialized snapshot before returning its Effect; use plain
37
+ * JSON values for stable input across reads.
38
+ *
39
+ * @category schemas
40
+ * @since 0.1.0
41
+ */
42
+ export const Trigger = Schema.Struct({
43
+ id: Schema.NonEmptyString,
44
+ flowId: Schema.NonEmptyString,
45
+ input: Schema.Json,
46
+ ...Schedule.Schedule.fields,
47
+ enabled: Schema.Boolean
48
+ });
49
+ /**
50
+ * Decodes and validates a trigger declaration.
51
+ *
52
+ * @category constructors
53
+ * @since 0.1.0
54
+ */
55
+ export const make = (input) => Schema.decodeUnknownEffect(Trigger)(input).pipe(Effect.mapError((cause) => fromSchemaError("invalid_trigger", "Trigger declaration is invalid", cause)), Effect.flatMap(Schedule.validate));
56
+ //# sourceMappingURL=Trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Trigger.js","sourceRoot":"","sources":["../../src/Trigger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,eAAe,EAAqB,MAAM,mBAAmB,CAAA;AAEtE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;AAQvC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA;AASvC;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,EAAE,EAAE,MAAM,CAAC,cAAc;IACzB,MAAM,EAAE,MAAM,CAAC,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC,IAAI;IAClB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM;IAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;CACxB,CAAC,CAAA;AASF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAc,EAAwC,EAAE,CAC3E,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,iBAAiB,EAAE,gCAAgC,EAAE,KAAK,CAAC,CAAC,EACvG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAClC,CAAA","sourcesContent":["/**\n * Durable trigger declarations.\n *\n * @see packages/smithers/agent/triggers/docs/api.md\n *\n * @since 0.1.0\n */\n\nimport * as Effect from \"effect/Effect\"\nimport * as Schema from \"effect/Schema\"\nimport * as Schedule from \"./Schedule.ts\"\nimport { fromSchemaError, type TriggerError } from \"./TriggerError.ts\"\n\n/**\n * How a trigger behaves when an occurrence arrives while its previous run\n * is still going.\n *\n * @category schemas\n * @since 0.1.0\n */\nexport const Overlap = Schedule.Overlap\n/**\n * The decoded form of {@link Overlap}.\n *\n * @category models\n * @since 0.1.0\n */\nexport type Overlap = Schedule.Overlap\n/**\n * How many missed occurrences a trigger owes after downtime.\n *\n * @category schemas\n * @since 0.1.0\n */\nexport const CatchUp = Schedule.CatchUp\n/**\n * The decoded form of {@link CatchUp}.\n *\n * @category models\n * @since 0.1.0\n */\nexport type CatchUp = Schedule.CatchUp\n\n/**\n * A trigger declaration: which flow to run, with what input, on what\n * schedule.\n *\n * `input` is JSON rather than `unknown` because the store persists it with\n * `JSON.stringify` into a `NOT NULL` column. The schema refuses `undefined`,\n * `NaN`, a `Date`, and functions at the declaration boundary.\n * Enumerable getters are accepted when their values are JSON. They are\n * evaluated during decoding and again during SQL serialization. Every store\n * takes an eager serialized snapshot before returning its Effect; use plain\n * JSON values for stable input across reads.\n *\n * @category schemas\n * @since 0.1.0\n */\nexport const Trigger = Schema.Struct({\n id: Schema.NonEmptyString,\n flowId: Schema.NonEmptyString,\n input: Schema.Json,\n ...Schedule.Schedule.fields,\n enabled: Schema.Boolean\n})\n/**\n * The decoded form of {@link Trigger}.\n *\n * @category models\n * @since 0.1.0\n */\nexport type Trigger = typeof Trigger.Type\n\n/**\n * Decodes and validates a trigger declaration.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const make = (input: unknown): Effect.Effect<Trigger, TriggerError> =>\n Schema.decodeUnknownEffect(Trigger)(input).pipe(\n Effect.mapError((cause) => fromSchemaError(\"invalid_trigger\", \"Trigger declaration is invalid\", cause)),\n Effect.flatMap(Schedule.validate)\n )\n"]}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Stable trigger failures.
3
+ *
4
+ * @see packages/smithers/agent/triggers/docs/api.md
5
+ *
6
+ * @since 0.1.0
7
+ */
8
+ import * as Schema from "effect/Schema";
9
+ /**
10
+ * Stable trigger failure codes.
11
+ *
12
+ * Each code names one refusal a caller can branch on. `store` covers only a
13
+ * persistence failure the store itself raised; a Control or runner failure is
14
+ * `runner`, a malformed scheduler option is `invalid_options`, and a claim
15
+ * refused by the durable declaration is `unknown_trigger`, `trigger_disabled`,
16
+ * or `revision_mismatch`.
17
+ *
18
+ * @category models
19
+ * @since 0.1.0
20
+ */
21
+ export declare const TriggerErrorCode: Schema.Literals<readonly ["unknown_trigger", "trigger_disabled", "revision_mismatch", "stale_owner", "invalid_schedule", "invalid_trigger", "invalid_options", "invalid_cron", "unsatisfiable_cron", "verification_failed", "catch_up_bound_exceeded", "runner", "runner_timeout", "store"]>;
22
+ /**
23
+ * Stable trigger failure code.
24
+ *
25
+ * @category models
26
+ * @since 0.1.0
27
+ */
28
+ export type TriggerErrorCode = typeof TriggerErrorCode.Type;
29
+ declare const TriggerError_base: Schema.Class<TriggerError, Schema.TaggedStruct<"flows/triggers/TriggerError", {
30
+ readonly code: Schema.Literals<readonly ["unknown_trigger", "trigger_disabled", "revision_mismatch", "stale_owner", "invalid_schedule", "invalid_trigger", "invalid_options", "invalid_cron", "unsatisfiable_cron", "verification_failed", "catch_up_bound_exceeded", "runner", "runner_timeout", "store"]>;
31
+ readonly message: Schema.String;
32
+ readonly path: Schema.optional<Schema.String>;
33
+ readonly cause: Schema.optional<Schema.Defect>;
34
+ }>, import("effect/Cause").YieldableError>;
35
+ /**
36
+ * A typed schedule, verification, or persistence failure.
37
+ *
38
+ * `path` is the dotted field path a declaration failure belongs to, so a
39
+ * caller reads the offending field structurally instead of parsing `message`.
40
+ *
41
+ * @category errors
42
+ * @since 0.1.0
43
+ */
44
+ export declare class TriggerError extends TriggerError_base {
45
+ }
46
+ /**
47
+ * Builds a declaration failure that names the offending field.
48
+ *
49
+ * The whole `SchemaError` is deliberately not kept as the cause: serializing
50
+ * one costs about five kilobytes of schema AST per failure, and every byte of
51
+ * it past the rendered issue tree repeats what the tree already says.
52
+ *
53
+ * @category constructors
54
+ * @since 0.1.0
55
+ */
56
+ export declare const fromSchemaError: (code: TriggerErrorCode, summary: string, error: unknown) => TriggerError;
57
+ export {};
58
+ //# sourceMappingURL=TriggerError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerError.d.ts","sourceRoot":"","sources":["../../src/TriggerError.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,8RAe3B,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,IAAI,CAAA;;;;;;;AAE3D;;;;;;;;GAQG;AACH,qBAAa,YAAa,SAAQ,iBAKhC;CAAG;AA2CL;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,GAC1B,MAAM,gBAAgB,EACtB,SAAS,MAAM,EACf,OAAO,OAAO,KACb,YAUF,CAAA"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Stable trigger failures.
3
+ *
4
+ * @see packages/smithers/agent/triggers/docs/api.md
5
+ *
6
+ * @since 0.1.0
7
+ */
8
+ import * as Schema from "effect/Schema";
9
+ /**
10
+ * Stable trigger failure codes.
11
+ *
12
+ * Each code names one refusal a caller can branch on. `store` covers only a
13
+ * persistence failure the store itself raised; a Control or runner failure is
14
+ * `runner`, a malformed scheduler option is `invalid_options`, and a claim
15
+ * refused by the durable declaration is `unknown_trigger`, `trigger_disabled`,
16
+ * or `revision_mismatch`.
17
+ *
18
+ * @category models
19
+ * @since 0.1.0
20
+ */
21
+ export const TriggerErrorCode = Schema.Literals([
22
+ "unknown_trigger",
23
+ "trigger_disabled",
24
+ "revision_mismatch",
25
+ "stale_owner",
26
+ "invalid_schedule",
27
+ "invalid_trigger",
28
+ "invalid_options",
29
+ "invalid_cron",
30
+ "unsatisfiable_cron",
31
+ "verification_failed",
32
+ "catch_up_bound_exceeded",
33
+ "runner",
34
+ "runner_timeout",
35
+ "store"
36
+ ]);
37
+ /**
38
+ * A typed schedule, verification, or persistence failure.
39
+ *
40
+ * `path` is the dotted field path a declaration failure belongs to, so a
41
+ * caller reads the offending field structurally instead of parsing `message`.
42
+ *
43
+ * @category errors
44
+ * @since 0.1.0
45
+ */
46
+ export class TriggerError extends Schema.TaggedError()("flows/triggers/TriggerError", {
47
+ code: TriggerErrorCode,
48
+ message: Schema.String,
49
+ path: Schema.optional(Schema.String),
50
+ cause: Schema.optional(Schema.Defect())
51
+ }) {
52
+ }
53
+ /**
54
+ * Walks a schema issue tree for the path of the first offending value.
55
+ *
56
+ * The tree is read defensively: only `path`, `issue`, and `issues` are
57
+ * consulted, so an issue shape this function does not recognize degrades to
58
+ * "no path" rather than throwing inside an error constructor.
59
+ */
60
+ const issuePath = (issue) => {
61
+ if (typeof issue !== "object" || issue === null)
62
+ return undefined;
63
+ const node = issue;
64
+ const segments = Array.isArray(node.path) ? node.path.map((segment) => String(segment)) : [];
65
+ const children = Array.isArray(node.issues)
66
+ ? node.issues
67
+ : node.issue === undefined
68
+ ? []
69
+ : [node.issue];
70
+ for (const child of children) {
71
+ const nested = issuePath(child);
72
+ if (nested !== undefined)
73
+ return [...segments, ...nested];
74
+ }
75
+ return segments.length === 0 ? undefined : segments;
76
+ };
77
+ /**
78
+ * Renders a schema decode failure as one line, without the offending value.
79
+ *
80
+ * The rendered issue tree names the expectation and the path only, which is
81
+ * what makes it safe to keep in `message` and in `cause`: a secret submitted
82
+ * in the declaration never reaches either.
83
+ */
84
+ const summarize = (error) => String(error)
85
+ .replace(/^SchemaError\(/, "")
86
+ .replace(/\)$/, "")
87
+ .replace(/\s*\n\s*/g, " ")
88
+ .trim();
89
+ /**
90
+ * Builds a declaration failure that names the offending field.
91
+ *
92
+ * The whole `SchemaError` is deliberately not kept as the cause: serializing
93
+ * one costs about five kilobytes of schema AST per failure, and every byte of
94
+ * it past the rendered issue tree repeats what the tree already says.
95
+ *
96
+ * @category constructors
97
+ * @since 0.1.0
98
+ */
99
+ export const fromSchemaError = (code, summary, error) => {
100
+ const path = issuePath(error?.issue);
101
+ const detail = summarize(error);
102
+ const field = path === undefined ? undefined : path.join(".");
103
+ return new TriggerError({
104
+ code,
105
+ message: field === undefined ? `${summary}: ${detail}` : `${summary} at ${field}: ${detail}`,
106
+ ...(field === undefined ? {} : { path: field }),
107
+ cause: detail
108
+ });
109
+ };
110
+ //# sourceMappingURL=TriggerError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TriggerError.js","sourceRoot":"","sources":["../../src/TriggerError.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Stable trigger failures.\n *\n * @see packages/smithers/agent/triggers/docs/api.md\n *\n * @since 0.1.0\n */\n\nimport * as Schema from \"effect/Schema\"\n\n/**\n * Stable trigger failure codes.\n *\n * Each code names one refusal a caller can branch on. `store` covers only a\n * persistence failure the store itself raised; a Control or runner failure is\n * `runner`, a malformed scheduler option is `invalid_options`, and a claim\n * refused by the durable declaration is `unknown_trigger`, `trigger_disabled`,\n * or `revision_mismatch`.\n *\n * @category models\n * @since 0.1.0\n */\nexport const TriggerErrorCode = Schema.Literals([\n \"unknown_trigger\",\n \"trigger_disabled\",\n \"revision_mismatch\",\n \"stale_owner\",\n \"invalid_schedule\",\n \"invalid_trigger\",\n \"invalid_options\",\n \"invalid_cron\",\n \"unsatisfiable_cron\",\n \"verification_failed\",\n \"catch_up_bound_exceeded\",\n \"runner\",\n \"runner_timeout\",\n \"store\"\n])\n\n/**\n * Stable trigger failure code.\n *\n * @category models\n * @since 0.1.0\n */\nexport type TriggerErrorCode = typeof TriggerErrorCode.Type\n\n/**\n * A typed schedule, verification, or persistence failure.\n *\n * `path` is the dotted field path a declaration failure belongs to, so a\n * caller reads the offending field structurally instead of parsing `message`.\n *\n * @category errors\n * @since 0.1.0\n */\nexport class TriggerError extends Schema.TaggedError<TriggerError>()(\"flows/triggers/TriggerError\", {\n code: TriggerErrorCode,\n message: Schema.String,\n path: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect())\n}) {}\n\n/**\n * Walks a schema issue tree for the path of the first offending value.\n *\n * The tree is read defensively: only `path`, `issue`, and `issues` are\n * consulted, so an issue shape this function does not recognize degrades to\n * \"no path\" rather than throwing inside an error constructor.\n */\nconst issuePath = (issue: unknown): ReadonlyArray<string> | undefined => {\n if (typeof issue !== \"object\" || issue === null) return undefined\n const node = issue as {\n readonly path?: unknown\n readonly issue?: unknown\n readonly issues?: unknown\n }\n const segments = Array.isArray(node.path) ? node.path.map((segment) => String(segment)) : []\n const children = Array.isArray(node.issues)\n ? node.issues\n : node.issue === undefined\n ? []\n : [node.issue]\n for (const child of children) {\n const nested = issuePath(child)\n if (nested !== undefined) return [...segments, ...nested]\n }\n return segments.length === 0 ? undefined : segments\n}\n\n/**\n * Renders a schema decode failure as one line, without the offending value.\n *\n * The rendered issue tree names the expectation and the path only, which is\n * what makes it safe to keep in `message` and in `cause`: a secret submitted\n * in the declaration never reaches either.\n */\nconst summarize = (error: unknown): string =>\n String(error)\n .replace(/^SchemaError\\(/, \"\")\n .replace(/\\)$/, \"\")\n .replace(/\\s*\\n\\s*/g, \" \")\n .trim()\n\n/**\n * Builds a declaration failure that names the offending field.\n *\n * The whole `SchemaError` is deliberately not kept as the cause: serializing\n * one costs about five kilobytes of schema AST per failure, and every byte of\n * it past the rendered issue tree repeats what the tree already says.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const fromSchemaError = (\n code: TriggerErrorCode,\n summary: string,\n error: unknown\n): TriggerError => {\n const path = issuePath((error as { readonly issue?: unknown } | null)?.issue)\n const detail = summarize(error)\n const field = path === undefined ? undefined : path.join(\".\")\n return new TriggerError({\n code,\n message: field === undefined ? `${summary}: ${detail}` : `${summary} at ${field}: ${detail}`,\n ...(field === undefined ? {} : { path: field }),\n cause: detail\n })\n}\n"]}