brass-runtime 1.16.0 → 1.16.1

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 (210) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +283 -18
  3. package/dist/agent/cli/main.cjs +38 -38
  4. package/dist/agent/cli/main.js +6 -6
  5. package/dist/agent/cli/main.mjs +6 -6
  6. package/dist/agent/index.cjs +7 -7
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +6 -6
  9. package/dist/agent/index.mjs +6 -6
  10. package/dist/chunk-2HQTDLHF.mjs +683 -0
  11. package/dist/chunk-36I3M4UC.mjs +370 -0
  12. package/dist/{chunk-QY5FKYEQ.js → chunk-3AYM6WPJ.js} +570 -51
  13. package/dist/chunk-3LOYJFRR.cjs +300 -0
  14. package/dist/chunk-3Y2RIUMM.js +300 -0
  15. package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
  16. package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
  17. package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
  18. package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
  19. package/dist/chunk-5QC7LRZ3.js +229 -0
  20. package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
  21. package/dist/chunk-62AZW6UT.cjs +313 -0
  22. package/dist/chunk-6IXXWIUM.js +683 -0
  23. package/dist/chunk-74ZTY6CP.js +2871 -0
  24. package/dist/chunk-76YMRMH2.cjs +777 -0
  25. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  26. package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
  27. package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
  28. package/dist/chunk-AGR5B2BC.cjs +683 -0
  29. package/dist/chunk-AVNQLJ5V.js +777 -0
  30. package/dist/chunk-B33ICAKP.js +313 -0
  31. package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
  32. package/dist/chunk-BABBZK4Y.js +2024 -0
  33. package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
  34. package/dist/{chunk-F5EUMJL7.mjs → chunk-CIZFIMK5.js} +55 -5
  35. package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
  36. package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
  37. package/dist/chunk-DNFO2EIZ.mjs +777 -0
  38. package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
  39. package/dist/{chunk-JNFRRJYH.cjs → chunk-ENKODRU3.cjs} +242 -192
  40. package/dist/chunk-EOC4UHBS.mjs +229 -0
  41. package/dist/{chunk-7LVI2GIN.js → chunk-FH2X7BVP.js} +507 -72
  42. package/dist/{chunk-OOGJ73B6.js → chunk-FHQGHPMO.mjs} +20 -10
  43. package/dist/{chunk-WQ5QNU5R.cjs → chunk-GLE2WY7Z.cjs} +652 -217
  44. package/dist/{chunk-G6IQOE4P.mjs → chunk-GYM3LLGS.mjs} +507 -72
  45. package/dist/chunk-HLWLMW2F.mjs +2024 -0
  46. package/dist/{chunk-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
  47. package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
  48. package/dist/chunk-KN32XNTH.mjs +313 -0
  49. package/dist/chunk-KQLYONSE.cjs +2871 -0
  50. package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
  51. package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
  52. package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
  53. package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
  54. package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
  55. package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
  56. package/dist/{chunk-7XOPAB5Q.js → chunk-MT3OWDPC.mjs} +55 -5
  57. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  58. package/dist/chunk-PD4EJTQC.cjs +229 -0
  59. package/dist/chunk-PWC3RBQE.mjs +300 -0
  60. package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
  61. package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
  62. package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
  63. package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
  64. package/dist/chunk-UB4B6OFY.js +370 -0
  65. package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
  66. package/dist/chunk-VN44DYYT.cjs +2024 -0
  67. package/dist/{client-CtFmoDvM.d.ts → client-CZHU674n.d.ts} +211 -36
  68. package/dist/core/index.cjs +135 -9
  69. package/dist/core/index.d.ts +238 -33
  70. package/dist/core/index.js +155 -29
  71. package/dist/core/index.mjs +155 -29
  72. package/dist/{effect-CGNl5Rqp.d.ts → effect-DIUHZ9IN.d.ts} +89 -1
  73. package/dist/effectRunner-CFLC32IK.cjs +8 -0
  74. package/dist/{effectRunner-A4CHJXJI.js → effectRunner-L4S7IPT3.js} +2 -2
  75. package/dist/{effectRunner-OPUF6QRN.mjs → effectRunner-NNGG75QA.mjs} +2 -2
  76. package/dist/http/index.cjs +324 -2986
  77. package/dist/http/index.d.ts +54 -68
  78. package/dist/http/index.js +238 -2900
  79. package/dist/http/index.mjs +238 -2900
  80. package/dist/http/testing.cjs +14 -12
  81. package/dist/http/testing.d.ts +5 -4
  82. package/dist/http/testing.js +10 -8
  83. package/dist/http/testing.mjs +10 -8
  84. package/dist/index.cjs +423 -255
  85. package/dist/index.d.ts +87 -69
  86. package/dist/index.js +301 -133
  87. package/dist/index.mjs +301 -133
  88. package/dist/observability/index.cjs +16 -531
  89. package/dist/observability/index.d.ts +81 -8
  90. package/dist/observability/index.js +23 -538
  91. package/dist/observability/index.mjs +23 -538
  92. package/dist/perf/cli.cjs +401 -0
  93. package/dist/perf/cli.d.ts +1 -0
  94. package/dist/perf/cli.js +401 -0
  95. package/dist/perf/cli.mjs +401 -0
  96. package/dist/perf/index.cjs +141 -0
  97. package/dist/perf/index.d.ts +483 -0
  98. package/dist/perf/index.js +141 -0
  99. package/dist/perf/index.mjs +141 -0
  100. package/dist/schedule-CK3Ml_7p.d.ts +259 -0
  101. package/dist/schema/index.cjs +6 -2
  102. package/dist/schema/index.d.ts +3 -1
  103. package/dist/schema/index.js +5 -1
  104. package/dist/schema/index.mjs +5 -1
  105. package/dist/{server-C8hDXA74.d.ts → server-GJPg8ZSG.d.ts} +4 -3
  106. package/dist/{stream-dvSs0QS5.d.ts → stream-B4oK9JFP.d.ts} +1 -1
  107. package/dist/{tracer-B5tRH9H7.d.ts → tracer-Hwt1cl7h.d.ts} +13 -54
  108. package/dist/{tracing-Dt9S_6V8.d.ts → tracing-DqbTKGcf.d.ts} +1 -1
  109. package/docs/ARCHITECTURE.md +292 -0
  110. package/docs/README.md +63 -0
  111. package/docs/adr/0001-ai-context-pack.md +32 -0
  112. package/docs/agent-apply-mode.md +104 -0
  113. package/docs/agent-approvals.md +110 -0
  114. package/docs/agent-batch.md +185 -0
  115. package/docs/agent-boundaries.md +112 -0
  116. package/docs/agent-chat-sessions.md +160 -0
  117. package/docs/agent-ci.md +17 -0
  118. package/docs/agent-cli.md +405 -0
  119. package/docs/agent-config.md +480 -0
  120. package/docs/agent-context-discovery.md +159 -0
  121. package/docs/agent-copilot-like-dx.md +126 -0
  122. package/docs/agent-declarative-optimized-planning.md +138 -0
  123. package/docs/agent-dx.md +224 -0
  124. package/docs/agent-env-files.md +126 -0
  125. package/docs/agent-follow-up-context.md +43 -0
  126. package/docs/agent-global-usage.md +180 -0
  127. package/docs/agent-init.md +109 -0
  128. package/docs/agent-install-and-configure.md +516 -0
  129. package/docs/agent-language-workspace-ux.md +99 -0
  130. package/docs/agent-llm-adapters.md +123 -0
  131. package/docs/agent-local-install.md +190 -0
  132. package/docs/agent-local-tests.md +51 -0
  133. package/docs/agent-observability.md +155 -0
  134. package/docs/agent-patch-quality-loop.md +162 -0
  135. package/docs/agent-presets.md +22 -0
  136. package/docs/agent-project-commands.md +237 -0
  137. package/docs/agent-project-intelligence.md +156 -0
  138. package/docs/agent-redaction.md +18 -0
  139. package/docs/agent-release-readiness.md +76 -0
  140. package/docs/agent-rollback-safety.md +162 -0
  141. package/docs/agent-rollback.md +23 -0
  142. package/docs/agent-run-artifacts.md +16 -0
  143. package/docs/agent-vscode-auto-discovery.md +137 -0
  144. package/docs/agent-vscode-batch-runner.md +100 -0
  145. package/docs/agent-vscode-chat-layout.md +90 -0
  146. package/docs/agent-vscode-clean-install.md +147 -0
  147. package/docs/agent-vscode-code-actions.md +70 -0
  148. package/docs/agent-vscode-diff-preview.md +45 -0
  149. package/docs/agent-vscode-inline-assist.md +56 -0
  150. package/docs/agent-vscode-install.md +186 -0
  151. package/docs/agent-vscode-model-setup.md +97 -0
  152. package/docs/agent-vscode-patch-preview.md +92 -0
  153. package/docs/agent-vscode-problems.md +79 -0
  154. package/docs/agent-vscode-project-dashboard.md +106 -0
  155. package/docs/agent-vscode-run-history.md +92 -0
  156. package/docs/agent-vscode-ux.md +73 -0
  157. package/docs/ai/INVARIANTS.md +84 -0
  158. package/docs/ai/PROJECT_MAP.md +338 -0
  159. package/docs/ai/PUBLIC_API.md +336 -0
  160. package/docs/ai/VALIDATION_MATRIX.md +67 -0
  161. package/docs/api-polish.md +37 -0
  162. package/docs/cancellation.md +162 -0
  163. package/docs/coverage.md +46 -0
  164. package/docs/getting-started.md +159 -0
  165. package/docs/guides/README.md +40 -0
  166. package/docs/guides/circuit-breaker.md +89 -0
  167. package/docs/guides/error-handling.md +91 -0
  168. package/docs/guides/getting-started.md +107 -0
  169. package/docs/guides/layers.md +189 -0
  170. package/docs/guides/metrics.md +101 -0
  171. package/docs/guides/resource-management.md +141 -0
  172. package/docs/guides/retry.md +215 -0
  173. package/docs/guides/semaphore.md +66 -0
  174. package/docs/guides/streams.md +117 -0
  175. package/docs/guides/supervisors.md +98 -0
  176. package/docs/guides/testing.md +162 -0
  177. package/docs/guides/tracing.md +71 -0
  178. package/docs/http-recipes.md +399 -0
  179. package/docs/http.md +749 -0
  180. package/docs/modules.md +285 -0
  181. package/docs/observability-collector-smoke.md +31 -0
  182. package/docs/observability-framework-examples.md +98 -0
  183. package/docs/observability.md +542 -0
  184. package/docs/otel-collector-smoke.yaml +27 -0
  185. package/docs/performance-profiler.md +199 -0
  186. package/docs/production-readiness.md +73 -0
  187. package/docs/recipes/README.md +12 -0
  188. package/docs/recipes/http-server.md +45 -0
  189. package/docs/recipes/layers.md +44 -0
  190. package/docs/recipes/performance.md +47 -0
  191. package/docs/recipes/runtime.md +41 -0
  192. package/docs/recipes/testing.md +41 -0
  193. package/docs/release.md +53 -0
  194. package/docs/wasm-bounded-queues.md +44 -0
  195. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  196. package/docs/wasm-fiber-engine.md +117 -0
  197. package/docs/wasm-scheduler-state-machine.md +122 -0
  198. package/docs/wasm-stream-chunks.md +54 -0
  199. package/package.json +22 -2
  200. package/dist/chunk-45F7OKGT.cjs +0 -104
  201. package/dist/chunk-7V4KY4RL.mjs +0 -104
  202. package/dist/chunk-DJQ7OMMB.cjs +0 -144
  203. package/dist/chunk-GOV47PPB.mjs +0 -552
  204. package/dist/chunk-JF4XXPZ5.cjs +0 -552
  205. package/dist/chunk-KCPT2D6G.js +0 -552
  206. package/dist/chunk-NOYZIMUJ.mjs +0 -144
  207. package/dist/chunk-PNVFW245.js +0 -144
  208. package/dist/chunk-ROJC3NBJ.js +0 -104
  209. package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
  210. package/dist/schedule-Fque9Abz.d.ts +0 -70
@@ -1,552 +0,0 @@
1
- import {
2
- sleep
3
- } from "./chunk-ROJC3NBJ.js";
4
- import {
5
- Scope
6
- } from "./chunk-FM4W4QPL.js";
7
- import {
8
- unsafeGetCurrentRuntime
9
- } from "./chunk-7LVI2GIN.js";
10
- import {
11
- Cause,
12
- Exit,
13
- asyncEffect,
14
- asyncFail,
15
- asyncFlatMap,
16
- asyncFold,
17
- asyncSucceed,
18
- unit
19
- } from "./chunk-PNVFW245.js";
20
-
21
- // src/core/runtime/resource.ts
22
- function bracket(acquire, use, release) {
23
- return asyncEffect((env, cb) => {
24
- const runtime = unsafeGetCurrentRuntime();
25
- const scope = new Scope(runtime);
26
- const acquireFiber = scope.fork(acquire);
27
- acquireFiber.join((acquireExit) => {
28
- if (acquireExit._tag === "Failure") {
29
- scope.close(acquireExit);
30
- cb(acquireExit);
31
- return;
32
- }
33
- const resource2 = acquireExit.value;
34
- const useFiber = scope.fork(use(resource2));
35
- useFiber.join((useExit) => {
36
- const releaseEffect = safeRelease(release, resource2, useExit);
37
- const releaseFiber = runtime.fork(releaseEffect);
38
- releaseFiber.join(() => {
39
- scope.close(useExit);
40
- cb(useExit);
41
- });
42
- });
43
- });
44
- return () => {
45
- scope.close(Exit.failCause(Cause.interrupt()));
46
- };
47
- });
48
- }
49
- function safeRelease(release, resource2, exit) {
50
- return asyncFold(
51
- (() => {
52
- try {
53
- return release(resource2, exit);
54
- } catch {
55
- return unit();
56
- }
57
- })(),
58
- () => unit(),
59
- () => unit()
60
- );
61
- }
62
- function ensuring(effect, finalizer) {
63
- return asyncEffect((env, cb) => {
64
- const runtime = unsafeGetCurrentRuntime();
65
- const fiber = runtime.fork(effect);
66
- fiber.join((exit) => {
67
- const fin = asyncFold(
68
- (() => {
69
- try {
70
- return finalizer(exit);
71
- } catch {
72
- return unit();
73
- }
74
- })(),
75
- () => unit(),
76
- () => unit()
77
- );
78
- runtime.fork(fin).join(() => {
79
- cb(exit);
80
- });
81
- });
82
- return () => {
83
- fiber.interrupt();
84
- };
85
- });
86
- }
87
- function resource(acquire, release) {
88
- return makeResourceFromUse((body) => bracket(acquire, body, release));
89
- }
90
- var makeResource = resource;
91
- function resourceSucceed(value) {
92
- return makeResourceFromUse((body) => body(value));
93
- }
94
- function resourceFromManaged(m) {
95
- return makeResourceFromUse((body) => useManaged(m, body));
96
- }
97
- function useResource(res, body) {
98
- return res.use(body);
99
- }
100
- function resourceAll(resources) {
101
- const build = (index) => {
102
- if (index >= resources.length) return resourceSucceed([]);
103
- return resources[index].flatMap(
104
- (head) => build(index + 1).map((tail) => [head, ...tail])
105
- );
106
- };
107
- return build(0).map((values) => values);
108
- }
109
- var Resource = Object.freeze({
110
- make: resource,
111
- succeed: resourceSucceed,
112
- fromManaged: resourceFromManaged,
113
- all: resourceAll,
114
- use: useResource
115
- });
116
- function makeResourceFromUse(use) {
117
- const self = {
118
- _tag: "Resource",
119
- use,
120
- map: (f) => makeResourceFromUse((body) => self.use((a) => body(f(a)))),
121
- flatMap: (f) => makeResourceFromUse((body) => self.use((a) => f(a).use(body))),
122
- zip: (that) => self.flatMap((a) => that.map((b) => [a, b]))
123
- };
124
- return self;
125
- }
126
- function managed(acquire, release) {
127
- return {
128
- _tag: "Managed",
129
- acquire,
130
- release: (resource2, exit) => release(resource2, exit)
131
- };
132
- }
133
- function useManaged(m, body) {
134
- return bracket(m.acquire, body, m.release);
135
- }
136
- function managedAll(manageds) {
137
- const acquire = asyncEffect((env, cb) => {
138
- const runtime = unsafeGetCurrentRuntime();
139
- const resources = [];
140
- let i = 0;
141
- const acquireNext = () => {
142
- if (i >= manageds.length) {
143
- cb({ _tag: "Success", value: resources });
144
- return;
145
- }
146
- const m = manageds[i];
147
- const fiber = runtime.fork(m.acquire);
148
- fiber.join((exit) => {
149
- if (exit._tag === "Failure") {
150
- releaseAcquired(runtime, manageds, resources, exit).then(() => {
151
- cb(exit);
152
- });
153
- return;
154
- }
155
- resources.push(exit.value);
156
- i++;
157
- acquireNext();
158
- });
159
- };
160
- acquireNext();
161
- });
162
- const release = (resources, exit) => {
163
- return asyncEffect((_env, cb) => {
164
- const runtime = unsafeGetCurrentRuntime();
165
- releaseAcquired(runtime, manageds, resources, exit).then(() => {
166
- cb({ _tag: "Success", value: void 0 });
167
- });
168
- });
169
- };
170
- return { _tag: "Managed", acquire, release };
171
- }
172
- async function releaseAcquired(runtime, manageds, resources, exit) {
173
- for (let i = resources.length - 1; i >= 0; i--) {
174
- try {
175
- const m = manageds[i];
176
- await new Promise((resolve) => {
177
- const releaseEff = asyncFold(
178
- m.release(resources[i], exit),
179
- () => unit(),
180
- () => unit()
181
- );
182
- runtime.fork(releaseEff).join(() => resolve());
183
- });
184
- } catch {
185
- }
186
- }
187
- }
188
-
189
- // src/core/runtime/circuitBreaker.ts
190
- function makeCircuitBreaker(config = {}) {
191
- const failureThreshold = config.failureThreshold ?? 5;
192
- const resetTimeoutMs = config.resetTimeoutMs ?? 3e4;
193
- const successThreshold = config.successThreshold ?? 1;
194
- const isFailure = config.isFailure ?? (() => true);
195
- const onStateChange = config.onStateChange;
196
- let currentState = "closed";
197
- let consecutiveFailures = 0;
198
- let consecutiveSuccesses = 0;
199
- let openedAt = 0;
200
- let totalRequests = 0;
201
- let totalFailures = 0;
202
- let totalSuccesses = 0;
203
- let totalRejected = 0;
204
- let lastFailureTime = null;
205
- let lastSuccessTime = null;
206
- const transition = (to) => {
207
- if (currentState === to) return;
208
- const from = currentState;
209
- currentState = to;
210
- onStateChange?.(from, to);
211
- };
212
- const onSuccess = () => {
213
- totalSuccesses++;
214
- lastSuccessTime = Date.now();
215
- consecutiveFailures = 0;
216
- if (currentState === "half-open") {
217
- consecutiveSuccesses++;
218
- if (consecutiveSuccesses >= successThreshold) {
219
- consecutiveSuccesses = 0;
220
- transition("closed");
221
- }
222
- }
223
- };
224
- const onFailure = (error) => {
225
- if (!isFailure(error)) {
226
- onSuccess();
227
- return;
228
- }
229
- totalFailures++;
230
- lastFailureTime = Date.now();
231
- consecutiveSuccesses = 0;
232
- consecutiveFailures++;
233
- if (currentState === "half-open") {
234
- openedAt = Date.now();
235
- transition("open");
236
- } else if (currentState === "closed" && consecutiveFailures >= failureThreshold) {
237
- openedAt = Date.now();
238
- transition("open");
239
- }
240
- };
241
- const shouldAllow = () => {
242
- switch (currentState) {
243
- case "closed":
244
- return true;
245
- case "open": {
246
- const elapsed2 = Date.now() - openedAt;
247
- if (elapsed2 >= resetTimeoutMs) {
248
- transition("half-open");
249
- return true;
250
- }
251
- return false;
252
- }
253
- case "half-open":
254
- return true;
255
- }
256
- };
257
- const protect = (effect) => {
258
- totalRequests++;
259
- if (!shouldAllow()) {
260
- totalRejected++;
261
- return asyncFail({
262
- _tag: "CircuitBreakerOpen",
263
- openSince: openedAt,
264
- failures: consecutiveFailures
265
- });
266
- }
267
- return asyncFold(
268
- effect,
269
- (error) => {
270
- onFailure(error);
271
- return asyncFail(error);
272
- },
273
- (value) => {
274
- onSuccess();
275
- return asyncSucceed(value);
276
- }
277
- );
278
- };
279
- const stats = () => ({
280
- state: currentState,
281
- failures: consecutiveFailures,
282
- successes: consecutiveSuccesses,
283
- totalRequests,
284
- totalFailures,
285
- totalSuccesses,
286
- totalRejected,
287
- lastFailureTime,
288
- lastSuccessTime
289
- });
290
- const reset = () => {
291
- consecutiveFailures = 0;
292
- consecutiveSuccesses = 0;
293
- transition("closed");
294
- };
295
- return {
296
- state: () => currentState,
297
- protect,
298
- stats,
299
- reset
300
- };
301
- }
302
-
303
- // src/core/runtime/schedule.ts
304
- function recurs(n) {
305
- return {
306
- _tag: "Schedule",
307
- initial: () => 0,
308
- step: (count, _input) => {
309
- const next = count + 1;
310
- return [{ continue: next < n, delayMs: 0 }, next, next];
311
- }
312
- };
313
- }
314
- function fixed(delayMs) {
315
- return {
316
- _tag: "Schedule",
317
- initial: () => 0,
318
- step: (count, _input) => {
319
- return [{ continue: true, delayMs }, count + 1, count + 1];
320
- }
321
- };
322
- }
323
- function exponential(baseMs, maxMs = Infinity) {
324
- return {
325
- _tag: "Schedule",
326
- initial: () => 0,
327
- step: (count, _input) => {
328
- const delay = Math.min(baseMs * Math.pow(2, count), maxMs);
329
- return [{ continue: true, delayMs: delay }, count + 1, count + 1];
330
- }
331
- };
332
- }
333
- function fibonacci(baseMs, maxMs = Infinity) {
334
- const base = Math.max(0, baseMs);
335
- const cap = Math.max(0, maxMs);
336
- return {
337
- _tag: "Schedule",
338
- initial: () => ({ prev: 0, curr: 1, count: 0 }),
339
- step: (state, _input) => {
340
- const delay = Math.min(base * state.curr, cap);
341
- const next = {
342
- prev: state.curr,
343
- curr: state.prev + state.curr,
344
- count: state.count + 1
345
- };
346
- return [{ continue: true, delayMs: delay }, next, state.count + 1];
347
- }
348
- };
349
- }
350
- function jittered(baseMs, maxMs = Infinity) {
351
- return jitteredSchedule(exponential(baseMs, maxMs), { factor: 1 });
352
- }
353
- function elapsed(maxMs) {
354
- return {
355
- _tag: "Schedule",
356
- initial: () => performance.now(),
357
- step: (startedAt, _input) => {
358
- const el = performance.now() - startedAt;
359
- return [{ continue: el < maxMs, delayMs: 0 }, startedAt, el];
360
- }
361
- };
362
- }
363
- function whileInput(pred) {
364
- return {
365
- _tag: "Schedule",
366
- initial: () => void 0,
367
- step: (_state, input) => {
368
- return [{ continue: pred(input), delayMs: 0 }, void 0, input];
369
- }
370
- };
371
- }
372
- function take(schedule, n) {
373
- return {
374
- _tag: "Schedule",
375
- initial: () => ({ inner: schedule.initial(), count: 0 }),
376
- step: (state, input) => {
377
- if (state.count >= n) return [{ continue: false, delayMs: 0 }, state, void 0];
378
- const [decision, nextInner, output] = schedule.step(state.inner, input);
379
- const nextState = { inner: nextInner, count: state.count + 1 };
380
- return [{ continue: decision.continue && state.count + 1 < n, delayMs: decision.delayMs }, nextState, output];
381
- }
382
- };
383
- }
384
- function map(schedule, f) {
385
- return {
386
- _tag: "Schedule",
387
- initial: schedule.initial,
388
- step: (state, input) => {
389
- const [decision, nextState, output] = schedule.step(state, input);
390
- return [decision, nextState, f(output)];
391
- }
392
- };
393
- }
394
- function contramap(schedule, f) {
395
- return {
396
- _tag: "Schedule",
397
- initial: schedule.initial,
398
- step: (state, input) => schedule.step(state, f(input))
399
- };
400
- }
401
- function jitteredSchedule(schedule, options = {}) {
402
- const factor = typeof options === "number" ? options : options.factor ?? 1;
403
- const random = typeof options === "number" ? Math.random : options.random ?? Math.random;
404
- const spread = Math.max(0, factor);
405
- return {
406
- _tag: "Schedule",
407
- initial: schedule.initial,
408
- step: (state, input) => {
409
- const [decision, nextState, output] = schedule.step(state, input);
410
- if (!decision.continue || decision.delayMs <= 0 || spread === 0) {
411
- return [decision, nextState, output];
412
- }
413
- const delay = spread >= 1 ? Math.floor(random() * decision.delayMs) : Math.floor(decision.delayMs * (1 - spread + random() * spread * 2));
414
- return [{ ...decision, delayMs: Math.max(0, delay) }, nextState, output];
415
- }
416
- };
417
- }
418
- var jitter = jitteredSchedule;
419
- function windowed(schedule, windowMs, clock = defaultClock) {
420
- const window = Math.max(0, windowMs);
421
- return {
422
- _tag: "Schedule",
423
- initial: () => ({ inner: schedule.initial(), windowStartedAt: clock() }),
424
- step: (state, input) => {
425
- const now = clock();
426
- const shouldReset = window > 0 && now - state.windowStartedAt > window;
427
- const inner = shouldReset ? schedule.initial() : state.inner;
428
- const windowStartedAt = shouldReset ? now : state.windowStartedAt;
429
- const [decision, nextInner, output] = schedule.step(inner, input);
430
- return [decision, { inner: nextInner, windowStartedAt }, output];
431
- }
432
- };
433
- }
434
- function defaultClock() {
435
- return typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
436
- }
437
- function andThen(first, second) {
438
- return {
439
- _tag: "Schedule",
440
- initial: () => ({ phase: "first", inner: first.initial() }),
441
- step: (state, input) => {
442
- if (state.phase === "first") {
443
- const [decision2, nextInner2, output2] = first.step(state.inner, input);
444
- if (decision2.continue) {
445
- return [decision2, { phase: "first", inner: nextInner2 }, output2];
446
- }
447
- return [{ continue: true, delayMs: decision2.delayMs }, { phase: "second", inner: second.initial() }, output2];
448
- }
449
- const [decision, nextInner, output] = second.step(state.inner, input);
450
- return [decision, { phase: "second", inner: nextInner }, output];
451
- }
452
- };
453
- }
454
- function intersect(left, right) {
455
- return {
456
- _tag: "Schedule",
457
- initial: () => ({ left: left.initial(), right: right.initial() }),
458
- step: (state, input) => {
459
- const [ld, ls, lo] = left.step(state.left, input);
460
- const [rd, rs, ro] = right.step(state.right, input);
461
- const cont = ld.continue && rd.continue;
462
- const delay = Math.max(ld.delayMs, rd.delayMs);
463
- return [{ continue: cont, delayMs: delay }, { left: ls, right: rs }, [lo, ro]];
464
- }
465
- };
466
- }
467
- function union(left, right) {
468
- return {
469
- _tag: "Schedule",
470
- initial: () => ({ left: left.initial(), right: right.initial() }),
471
- step: (state, input) => {
472
- const [ld, ls, lo] = left.step(state.left, input);
473
- const [rd, rs, ro] = right.step(state.right, input);
474
- const cont = ld.continue || rd.continue;
475
- const delay = Math.min(ld.delayMs, rd.delayMs);
476
- return [{ continue: cont, delayMs: delay }, { left: ls, right: rs }, [lo, ro]];
477
- }
478
- };
479
- }
480
- function retryWithSchedule(effect, schedule) {
481
- const loop = (state) => asyncFold(
482
- effect,
483
- (error) => {
484
- const [decision, nextState, _output] = schedule.step(state, error);
485
- if (!decision.continue) return asyncFail(error);
486
- if (decision.delayMs <= 0) return loop(nextState);
487
- return asyncFlatMap(sleep(decision.delayMs), () => loop(nextState));
488
- },
489
- (value) => asyncSucceed(value)
490
- );
491
- return loop(schedule.initial());
492
- }
493
- function repeatWithSchedule(effect, schedule) {
494
- const loop = (state, lastValue) => {
495
- const [decision, nextState, _output] = schedule.step(state, lastValue);
496
- if (!decision.continue) return asyncSucceed(lastValue);
497
- if (decision.delayMs <= 0) {
498
- return asyncFold(
499
- effect,
500
- (error) => asyncFail(error),
501
- (value) => loop(nextState, value)
502
- );
503
- }
504
- return asyncFlatMap(
505
- sleep(decision.delayMs),
506
- () => asyncFold(
507
- effect,
508
- (error) => asyncFail(error),
509
- (value) => loop(nextState, value)
510
- )
511
- );
512
- };
513
- return asyncFold(
514
- effect,
515
- (error) => asyncFail(error),
516
- (value) => loop(schedule.initial(), value)
517
- );
518
- }
519
-
520
- export {
521
- bracket,
522
- ensuring,
523
- resource,
524
- makeResource,
525
- resourceSucceed,
526
- resourceFromManaged,
527
- useResource,
528
- resourceAll,
529
- Resource,
530
- managed,
531
- useManaged,
532
- managedAll,
533
- makeCircuitBreaker,
534
- recurs,
535
- fixed,
536
- exponential,
537
- fibonacci,
538
- jittered,
539
- elapsed,
540
- whileInput,
541
- take,
542
- map,
543
- contramap,
544
- jitteredSchedule,
545
- jitter,
546
- windowed,
547
- andThen,
548
- intersect,
549
- union,
550
- retryWithSchedule,
551
- repeatWithSchedule
552
- };
@@ -1,144 +0,0 @@
1
- // src/core/types/asyncEffect.ts
2
- var Async = {
3
- succeed: (value) => ({ _tag: "Succeed", value }),
4
- fail: (error) => ({ _tag: "Fail", error }),
5
- sync: (thunk) => ({ _tag: "Sync", thunk }),
6
- async: (register) => ({ _tag: "Async", register })
7
- };
8
- function asyncFold(fa, onFailure, onSuccess) {
9
- return {
10
- _tag: "Fold",
11
- first: fa,
12
- onFailure,
13
- onSuccess
14
- };
15
- }
16
- function asyncCatchAll(fa, handler) {
17
- return asyncFold(fa, handler, asyncSucceed);
18
- }
19
- function asyncMapError(fa, f) {
20
- return asyncFold(fa, (e) => asyncFail(f(e)), asyncSucceed);
21
- }
22
- var SUCCEED_UNDEFINED = { _tag: "Succeed", value: void 0 };
23
- var SUCCEED_TRUE = { _tag: "Succeed", value: true };
24
- var SUCCEED_FALSE = { _tag: "Succeed", value: false };
25
- var SUCCEED_NULL = { _tag: "Succeed", value: null };
26
- var unit = () => SUCCEED_UNDEFINED;
27
- var asyncSucceed = (value) => {
28
- if (value === void 0) return SUCCEED_UNDEFINED;
29
- if (value === true) return SUCCEED_TRUE;
30
- if (value === false) return SUCCEED_FALSE;
31
- if (value === null) return SUCCEED_NULL;
32
- return { _tag: "Succeed", value };
33
- };
34
- var asyncFail = (error) => ({
35
- _tag: "Fail",
36
- error
37
- });
38
- var asyncSync = (thunk) => ({
39
- _tag: "Sync",
40
- thunk
41
- });
42
- var asyncTotal = (thunk) => asyncSync(() => thunk());
43
- var asyncEffect = (register) => ({
44
- _tag: "Async",
45
- register
46
- });
47
- function asyncMap(fa, f) {
48
- return asyncFlatMap(fa, (a) => asyncSucceed(f(a)));
49
- }
50
- function asyncFlatMap(fa, f) {
51
- return {
52
- _tag: "FlatMap",
53
- first: fa,
54
- andThen: f
55
- };
56
- }
57
- function acquireRelease(acquire, release, scope) {
58
- return asyncFlatMap(acquire, (resource) => {
59
- scope.addFinalizer((exit) => release(resource, exit));
60
- return asyncSucceed(resource);
61
- });
62
- }
63
- function asyncInterruptible(register) {
64
- return asyncEffect(register);
65
- }
66
- var withAsyncPromise = (run) => (eff) => {
67
- const anyEff = eff;
68
- if (!anyEff.toPromise) {
69
- anyEff.toPromise = (env) => run(eff, env);
70
- anyEff.unsafeRunPromise = () => run(eff, {});
71
- }
72
- return anyEff;
73
- };
74
- var mapAsync = (fa, f) => asyncFlatMap(fa, (a) => asyncSucceed(f(a)));
75
- var mapTryAsync = (fa, f) => asyncFlatMap(fa, (a) => asyncSync(() => f(a)));
76
-
77
- // src/core/types/option.ts
78
- var none = { _tag: "None" };
79
- var some = (value) => ({ _tag: "Some", value });
80
-
81
- // src/core/types/effect.ts
82
- var Cause = {
83
- fail: (error) => ({ _tag: "Fail", error }),
84
- interrupt: () => ({ _tag: "Interrupt" }),
85
- die: (defect) => ({ _tag: "Die", defect })
86
- };
87
- var Exit = {
88
- succeed: (value) => ({
89
- _tag: "Success",
90
- value
91
- }),
92
- failCause: (cause) => ({
93
- _tag: "Failure",
94
- cause
95
- })
96
- };
97
- var succeed = (value) => asyncSucceed(value);
98
- var fail = (error) => asyncFail(error);
99
- var sync = (thunk) => asyncSync((env) => thunk(env));
100
- var map = (fa, f) => asyncMap(fa, f);
101
- var flatMap = (fa, f) => asyncFlatMap(fa, f);
102
- var mapError = (fa, f) => asyncMapError(fa, f);
103
- var catchAll = (fa, handler) => asyncFold(fa, handler, asyncSucceed);
104
- function orElseOptional(fa, that) {
105
- return asyncFold(
106
- fa,
107
- (opt) => opt._tag === "Some" ? asyncFail(opt) : that(),
108
- asyncSucceed
109
- );
110
- }
111
- var end = () => fail(none);
112
-
113
- export {
114
- Async,
115
- asyncFold,
116
- asyncCatchAll,
117
- asyncMapError,
118
- unit,
119
- asyncSucceed,
120
- asyncFail,
121
- asyncSync,
122
- asyncTotal,
123
- asyncEffect,
124
- asyncMap,
125
- asyncFlatMap,
126
- acquireRelease,
127
- asyncInterruptible,
128
- withAsyncPromise,
129
- mapAsync,
130
- mapTryAsync,
131
- none,
132
- some,
133
- Cause,
134
- Exit,
135
- succeed,
136
- fail,
137
- sync,
138
- map,
139
- flatMap,
140
- mapError,
141
- catchAll,
142
- orElseOptional,
143
- end
144
- };