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.
- package/CHANGELOG.md +17 -0
- package/README.md +283 -18
- package/dist/agent/cli/main.cjs +38 -38
- package/dist/agent/cli/main.js +6 -6
- package/dist/agent/cli/main.mjs +6 -6
- package/dist/agent/index.cjs +7 -7
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.js +6 -6
- package/dist/agent/index.mjs +6 -6
- package/dist/chunk-2HQTDLHF.mjs +683 -0
- package/dist/chunk-36I3M4UC.mjs +370 -0
- package/dist/{chunk-QY5FKYEQ.js → chunk-3AYM6WPJ.js} +570 -51
- package/dist/chunk-3LOYJFRR.cjs +300 -0
- package/dist/chunk-3Y2RIUMM.js +300 -0
- package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
- package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
- package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
- package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
- package/dist/chunk-5QC7LRZ3.js +229 -0
- package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
- package/dist/chunk-62AZW6UT.cjs +313 -0
- package/dist/chunk-6IXXWIUM.js +683 -0
- package/dist/chunk-74ZTY6CP.js +2871 -0
- package/dist/chunk-76YMRMH2.cjs +777 -0
- package/dist/chunk-7CMJS3QE.mjs +2871 -0
- package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
- package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
- package/dist/chunk-AGR5B2BC.cjs +683 -0
- package/dist/chunk-AVNQLJ5V.js +777 -0
- package/dist/chunk-B33ICAKP.js +313 -0
- package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
- package/dist/chunk-BABBZK4Y.js +2024 -0
- package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
- package/dist/{chunk-F5EUMJL7.mjs → chunk-CIZFIMK5.js} +55 -5
- package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
- package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
- package/dist/chunk-DNFO2EIZ.mjs +777 -0
- package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
- package/dist/{chunk-JNFRRJYH.cjs → chunk-ENKODRU3.cjs} +242 -192
- package/dist/chunk-EOC4UHBS.mjs +229 -0
- package/dist/{chunk-7LVI2GIN.js → chunk-FH2X7BVP.js} +507 -72
- package/dist/{chunk-OOGJ73B6.js → chunk-FHQGHPMO.mjs} +20 -10
- package/dist/{chunk-WQ5QNU5R.cjs → chunk-GLE2WY7Z.cjs} +652 -217
- package/dist/{chunk-G6IQOE4P.mjs → chunk-GYM3LLGS.mjs} +507 -72
- package/dist/chunk-HLWLMW2F.mjs +2024 -0
- package/dist/{chunk-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
- package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
- package/dist/chunk-KN32XNTH.mjs +313 -0
- package/dist/chunk-KQLYONSE.cjs +2871 -0
- package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
- package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
- package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
- package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
- package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
- package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
- package/dist/{chunk-7XOPAB5Q.js → chunk-MT3OWDPC.mjs} +55 -5
- package/dist/chunk-MVGUEJ5Z.cjs +370 -0
- package/dist/chunk-PD4EJTQC.cjs +229 -0
- package/dist/chunk-PWC3RBQE.mjs +300 -0
- package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
- package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
- package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
- package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
- package/dist/chunk-UB4B6OFY.js +370 -0
- package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
- package/dist/chunk-VN44DYYT.cjs +2024 -0
- package/dist/{client-CtFmoDvM.d.ts → client-CZHU674n.d.ts} +211 -36
- package/dist/core/index.cjs +135 -9
- package/dist/core/index.d.ts +238 -33
- package/dist/core/index.js +155 -29
- package/dist/core/index.mjs +155 -29
- package/dist/{effect-CGNl5Rqp.d.ts → effect-DIUHZ9IN.d.ts} +89 -1
- package/dist/effectRunner-CFLC32IK.cjs +8 -0
- package/dist/{effectRunner-A4CHJXJI.js → effectRunner-L4S7IPT3.js} +2 -2
- package/dist/{effectRunner-OPUF6QRN.mjs → effectRunner-NNGG75QA.mjs} +2 -2
- package/dist/http/index.cjs +324 -2986
- package/dist/http/index.d.ts +54 -68
- package/dist/http/index.js +238 -2900
- package/dist/http/index.mjs +238 -2900
- package/dist/http/testing.cjs +14 -12
- package/dist/http/testing.d.ts +5 -4
- package/dist/http/testing.js +10 -8
- package/dist/http/testing.mjs +10 -8
- package/dist/index.cjs +423 -255
- package/dist/index.d.ts +87 -69
- package/dist/index.js +301 -133
- package/dist/index.mjs +301 -133
- package/dist/observability/index.cjs +16 -531
- package/dist/observability/index.d.ts +81 -8
- package/dist/observability/index.js +23 -538
- package/dist/observability/index.mjs +23 -538
- package/dist/perf/cli.cjs +401 -0
- package/dist/perf/cli.d.ts +1 -0
- package/dist/perf/cli.js +401 -0
- package/dist/perf/cli.mjs +401 -0
- package/dist/perf/index.cjs +141 -0
- package/dist/perf/index.d.ts +483 -0
- package/dist/perf/index.js +141 -0
- package/dist/perf/index.mjs +141 -0
- package/dist/schedule-CK3Ml_7p.d.ts +259 -0
- package/dist/schema/index.cjs +6 -2
- package/dist/schema/index.d.ts +3 -1
- package/dist/schema/index.js +5 -1
- package/dist/schema/index.mjs +5 -1
- package/dist/{server-C8hDXA74.d.ts → server-GJPg8ZSG.d.ts} +4 -3
- package/dist/{stream-dvSs0QS5.d.ts → stream-B4oK9JFP.d.ts} +1 -1
- package/dist/{tracer-B5tRH9H7.d.ts → tracer-Hwt1cl7h.d.ts} +13 -54
- package/dist/{tracing-Dt9S_6V8.d.ts → tracing-DqbTKGcf.d.ts} +1 -1
- package/docs/ARCHITECTURE.md +292 -0
- package/docs/README.md +63 -0
- package/docs/adr/0001-ai-context-pack.md +32 -0
- package/docs/agent-apply-mode.md +104 -0
- package/docs/agent-approvals.md +110 -0
- package/docs/agent-batch.md +185 -0
- package/docs/agent-boundaries.md +112 -0
- package/docs/agent-chat-sessions.md +160 -0
- package/docs/agent-ci.md +17 -0
- package/docs/agent-cli.md +405 -0
- package/docs/agent-config.md +480 -0
- package/docs/agent-context-discovery.md +159 -0
- package/docs/agent-copilot-like-dx.md +126 -0
- package/docs/agent-declarative-optimized-planning.md +138 -0
- package/docs/agent-dx.md +224 -0
- package/docs/agent-env-files.md +126 -0
- package/docs/agent-follow-up-context.md +43 -0
- package/docs/agent-global-usage.md +180 -0
- package/docs/agent-init.md +109 -0
- package/docs/agent-install-and-configure.md +516 -0
- package/docs/agent-language-workspace-ux.md +99 -0
- package/docs/agent-llm-adapters.md +123 -0
- package/docs/agent-local-install.md +190 -0
- package/docs/agent-local-tests.md +51 -0
- package/docs/agent-observability.md +155 -0
- package/docs/agent-patch-quality-loop.md +162 -0
- package/docs/agent-presets.md +22 -0
- package/docs/agent-project-commands.md +237 -0
- package/docs/agent-project-intelligence.md +156 -0
- package/docs/agent-redaction.md +18 -0
- package/docs/agent-release-readiness.md +76 -0
- package/docs/agent-rollback-safety.md +162 -0
- package/docs/agent-rollback.md +23 -0
- package/docs/agent-run-artifacts.md +16 -0
- package/docs/agent-vscode-auto-discovery.md +137 -0
- package/docs/agent-vscode-batch-runner.md +100 -0
- package/docs/agent-vscode-chat-layout.md +90 -0
- package/docs/agent-vscode-clean-install.md +147 -0
- package/docs/agent-vscode-code-actions.md +70 -0
- package/docs/agent-vscode-diff-preview.md +45 -0
- package/docs/agent-vscode-inline-assist.md +56 -0
- package/docs/agent-vscode-install.md +186 -0
- package/docs/agent-vscode-model-setup.md +97 -0
- package/docs/agent-vscode-patch-preview.md +92 -0
- package/docs/agent-vscode-problems.md +79 -0
- package/docs/agent-vscode-project-dashboard.md +106 -0
- package/docs/agent-vscode-run-history.md +92 -0
- package/docs/agent-vscode-ux.md +73 -0
- package/docs/ai/INVARIANTS.md +84 -0
- package/docs/ai/PROJECT_MAP.md +338 -0
- package/docs/ai/PUBLIC_API.md +336 -0
- package/docs/ai/VALIDATION_MATRIX.md +67 -0
- package/docs/api-polish.md +37 -0
- package/docs/cancellation.md +162 -0
- package/docs/coverage.md +46 -0
- package/docs/getting-started.md +159 -0
- package/docs/guides/README.md +40 -0
- package/docs/guides/circuit-breaker.md +89 -0
- package/docs/guides/error-handling.md +91 -0
- package/docs/guides/getting-started.md +107 -0
- package/docs/guides/layers.md +189 -0
- package/docs/guides/metrics.md +101 -0
- package/docs/guides/resource-management.md +141 -0
- package/docs/guides/retry.md +215 -0
- package/docs/guides/semaphore.md +66 -0
- package/docs/guides/streams.md +117 -0
- package/docs/guides/supervisors.md +98 -0
- package/docs/guides/testing.md +162 -0
- package/docs/guides/tracing.md +71 -0
- package/docs/http-recipes.md +399 -0
- package/docs/http.md +749 -0
- package/docs/modules.md +285 -0
- package/docs/observability-collector-smoke.md +31 -0
- package/docs/observability-framework-examples.md +98 -0
- package/docs/observability.md +542 -0
- package/docs/otel-collector-smoke.yaml +27 -0
- package/docs/performance-profiler.md +199 -0
- package/docs/production-readiness.md +73 -0
- package/docs/recipes/README.md +12 -0
- package/docs/recipes/http-server.md +45 -0
- package/docs/recipes/layers.md +44 -0
- package/docs/recipes/performance.md +47 -0
- package/docs/recipes/runtime.md +41 -0
- package/docs/recipes/testing.md +41 -0
- package/docs/release.md +53 -0
- package/docs/wasm-bounded-queues.md +44 -0
- package/docs/wasm-engine-observability-benchmarks.md +85 -0
- package/docs/wasm-fiber-engine.md +117 -0
- package/docs/wasm-scheduler-state-machine.md +122 -0
- package/docs/wasm-stream-chunks.md +54 -0
- package/package.json +22 -2
- package/dist/chunk-45F7OKGT.cjs +0 -104
- package/dist/chunk-7V4KY4RL.mjs +0 -104
- package/dist/chunk-DJQ7OMMB.cjs +0 -144
- package/dist/chunk-GOV47PPB.mjs +0 -552
- package/dist/chunk-JF4XXPZ5.cjs +0 -552
- package/dist/chunk-KCPT2D6G.js +0 -552
- package/dist/chunk-NOYZIMUJ.mjs +0 -144
- package/dist/chunk-PNVFW245.js +0 -144
- package/dist/chunk-ROJC3NBJ.js +0 -104
- package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
- package/dist/schedule-Fque9Abz.d.ts +0 -70
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
makeBoundedRingBuffer
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-FH2X7BVP.js";
|
|
4
|
+
import {
|
|
5
|
+
Cause
|
|
6
|
+
} from "./chunk-UB4B6OFY.js";
|
|
4
7
|
|
|
5
8
|
// src/core/runtime/metrics.ts
|
|
6
9
|
var DEFAULT_BOUNDARIES = [1, 5, 10, 25, 50, 100, 250, 500, 1e3, 5e3, 1e4];
|
|
@@ -212,6 +215,10 @@ var InMemoryTracer = class {
|
|
|
212
215
|
options;
|
|
213
216
|
spans = /* @__PURE__ */ new Map();
|
|
214
217
|
// key: spanId
|
|
218
|
+
finishedSpanIds = [];
|
|
219
|
+
finishedSpanSet = /* @__PURE__ */ new Set();
|
|
220
|
+
finishedSpanOffset = 0;
|
|
221
|
+
finishedSpanCount = 0;
|
|
215
222
|
prunedFinishedSpans = 0;
|
|
216
223
|
emit(ev, ctx) {
|
|
217
224
|
if (ctx.sampled === false) return;
|
|
@@ -237,8 +244,10 @@ var InMemoryTracer = class {
|
|
|
237
244
|
if (!spanId) return;
|
|
238
245
|
const sp = this.spans.get(spanId);
|
|
239
246
|
if (sp) {
|
|
247
|
+
const wasOpen = sp.endWallTs == null;
|
|
240
248
|
sp.endWallTs = wallTs;
|
|
241
249
|
sp.events.push({ wallTs, name: "fiber.end", attrs: this.attrs({ status: ev.status, error: this.error(ev.error) }) });
|
|
250
|
+
if (wasOpen) this.markFinished(spanId);
|
|
242
251
|
this.pruneFinished();
|
|
243
252
|
}
|
|
244
253
|
return;
|
|
@@ -269,13 +278,15 @@ var InMemoryTracer = class {
|
|
|
269
278
|
if (!spanId) return;
|
|
270
279
|
const sp = this.spans.get(spanId);
|
|
271
280
|
if (sp) {
|
|
281
|
+
const wasOpen = sp.endWallTs == null;
|
|
272
282
|
sp.endWallTs = wallTs;
|
|
273
283
|
sp.events.push({ wallTs, name: "span.end", attrs: this.attrs({ status: ev.status, error: this.error(ev.error), ...ev.attributes ?? {} }) });
|
|
284
|
+
if (wasOpen) this.markFinished(spanId);
|
|
274
285
|
this.pruneFinished();
|
|
275
286
|
}
|
|
276
287
|
return;
|
|
277
288
|
}
|
|
278
|
-
if (ev.type === "fiber.suspend" || ev.type === "fiber.resume" || ev.type === "scope.open" || ev.type === "scope.close") {
|
|
289
|
+
if (ev.type === "fiber.suspend" || ev.type === "fiber.resume" || ev.type === "scope.open" || ev.type === "scope.close" || ev.type === "schedule.decision") {
|
|
279
290
|
if (!spanId) return;
|
|
280
291
|
const sp = this.spans.get(spanId);
|
|
281
292
|
if (!sp) return;
|
|
@@ -284,15 +295,20 @@ var InMemoryTracer = class {
|
|
|
284
295
|
}
|
|
285
296
|
exportFinished() {
|
|
286
297
|
this.pruneFinished();
|
|
287
|
-
|
|
298
|
+
const out = [];
|
|
299
|
+
for (let i = this.finishedSpanOffset; i < this.finishedSpanIds.length; i++) {
|
|
300
|
+
const spanId = this.finishedSpanIds[i];
|
|
301
|
+
if (!this.finishedSpanSet.has(spanId)) continue;
|
|
302
|
+
const span = this.spans.get(spanId);
|
|
303
|
+
if (span?.endWallTs != null) out.push(span);
|
|
304
|
+
}
|
|
305
|
+
return out;
|
|
288
306
|
}
|
|
289
307
|
pruneFinished(spanIds) {
|
|
290
308
|
let dropped = 0;
|
|
291
309
|
if (spanIds) {
|
|
292
310
|
for (const spanId of spanIds) {
|
|
293
|
-
|
|
294
|
-
if (span?.endWallTs == null) continue;
|
|
295
|
-
if (this.spans.delete(spanId)) dropped++;
|
|
311
|
+
if (this.deleteFinished(spanId)) dropped++;
|
|
296
312
|
}
|
|
297
313
|
this.prunedFinishedSpans += dropped;
|
|
298
314
|
return dropped;
|
|
@@ -305,7 +321,7 @@ var InMemoryTracer = class {
|
|
|
305
321
|
stats() {
|
|
306
322
|
return {
|
|
307
323
|
storedSpans: this.spans.size,
|
|
308
|
-
finishedSpans:
|
|
324
|
+
finishedSpans: this.finishedSpanCount,
|
|
309
325
|
prunedFinishedSpans: this.prunedFinishedSpans
|
|
310
326
|
};
|
|
311
327
|
}
|
|
@@ -313,7 +329,8 @@ var InMemoryTracer = class {
|
|
|
313
329
|
return this.options.sanitizeAttributes?.(attrs) ?? attrs;
|
|
314
330
|
}
|
|
315
331
|
error(error) {
|
|
316
|
-
|
|
332
|
+
const normalized = Cause.isCause(error) ? Cause.pretty(error, { singleLine: true }) : error;
|
|
333
|
+
return normalized === void 0 ? void 0 : this.options.sanitizeError?.(normalized) ?? normalized;
|
|
317
334
|
}
|
|
318
335
|
now() {
|
|
319
336
|
return this.options.clock?.() ?? Date.now();
|
|
@@ -323,25 +340,70 @@ var InMemoryTracer = class {
|
|
|
323
340
|
if (maxAgeMs === void 0 || maxAgeMs <= 0) return 0;
|
|
324
341
|
const now = this.now();
|
|
325
342
|
let dropped = 0;
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
if (
|
|
343
|
+
while (true) {
|
|
344
|
+
const oldest = this.peekOldestFinished();
|
|
345
|
+
if (!oldest) break;
|
|
346
|
+
if (now - (oldest.span.endWallTs ?? now) <= maxAgeMs) break;
|
|
347
|
+
if (this.deleteOldestFinished()) dropped++;
|
|
329
348
|
}
|
|
330
349
|
return dropped;
|
|
331
350
|
}
|
|
332
351
|
pruneFinishedOverLimit() {
|
|
333
352
|
const maxFinishedSpans = this.options.maxFinishedSpans;
|
|
334
353
|
if (maxFinishedSpans === void 0 || maxFinishedSpans < 0) return 0;
|
|
335
|
-
const finished = Array.from(this.spans.values()).filter((span) => span.endWallTs != null).sort((a, b) => (a.endWallTs ?? 0) - (b.endWallTs ?? 0));
|
|
336
|
-
const overflow = finished.length - maxFinishedSpans;
|
|
337
|
-
if (overflow <= 0) return 0;
|
|
338
354
|
let dropped = 0;
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
355
|
+
while (this.finishedSpanCount > maxFinishedSpans) {
|
|
356
|
+
if (this.deleteOldestFinished()) dropped++;
|
|
357
|
+
else break;
|
|
342
358
|
}
|
|
343
359
|
return dropped;
|
|
344
360
|
}
|
|
361
|
+
markFinished(spanId) {
|
|
362
|
+
if (this.finishedSpanSet.has(spanId)) return;
|
|
363
|
+
this.finishedSpanSet.add(spanId);
|
|
364
|
+
this.finishedSpanIds.push(spanId);
|
|
365
|
+
this.finishedSpanCount++;
|
|
366
|
+
this.compactFinishedIds();
|
|
367
|
+
}
|
|
368
|
+
deleteFinished(spanId) {
|
|
369
|
+
const span = this.spans.get(spanId);
|
|
370
|
+
if (span?.endWallTs == null) return false;
|
|
371
|
+
const deleted = this.spans.delete(spanId);
|
|
372
|
+
if (this.finishedSpanSet.delete(spanId)) {
|
|
373
|
+
this.finishedSpanCount = Math.max(0, this.finishedSpanCount - 1);
|
|
374
|
+
}
|
|
375
|
+
return deleted;
|
|
376
|
+
}
|
|
377
|
+
peekOldestFinished() {
|
|
378
|
+
while (this.finishedSpanOffset < this.finishedSpanIds.length) {
|
|
379
|
+
const spanId = this.finishedSpanIds[this.finishedSpanOffset];
|
|
380
|
+
if (!this.finishedSpanSet.has(spanId)) {
|
|
381
|
+
this.finishedSpanOffset++;
|
|
382
|
+
continue;
|
|
383
|
+
}
|
|
384
|
+
const span = this.spans.get(spanId);
|
|
385
|
+
if (!span || span.endWallTs == null) {
|
|
386
|
+
this.finishedSpanSet.delete(spanId);
|
|
387
|
+
this.finishedSpanCount = Math.max(0, this.finishedSpanCount - 1);
|
|
388
|
+
this.finishedSpanOffset++;
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
return { spanId, span };
|
|
392
|
+
}
|
|
393
|
+
this.compactFinishedIds();
|
|
394
|
+
return void 0;
|
|
395
|
+
}
|
|
396
|
+
deleteOldestFinished() {
|
|
397
|
+
const oldest = this.peekOldestFinished();
|
|
398
|
+
if (!oldest) return false;
|
|
399
|
+
this.finishedSpanOffset++;
|
|
400
|
+
return this.deleteFinished(oldest.spanId);
|
|
401
|
+
}
|
|
402
|
+
compactFinishedIds() {
|
|
403
|
+
if (this.finishedSpanOffset < 1024 || this.finishedSpanOffset * 2 < this.finishedSpanIds.length) return;
|
|
404
|
+
this.finishedSpanIds.splice(0, this.finishedSpanOffset);
|
|
405
|
+
this.finishedSpanOffset = 0;
|
|
406
|
+
}
|
|
345
407
|
};
|
|
346
408
|
|
|
347
409
|
export {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkMVGUEJ5Zcjs = require('./chunk-MVGUEJ5Z.cjs');
|
|
4
4
|
|
|
5
5
|
// src/core/stream/structuredConcurrency.ts
|
|
6
6
|
function race(left, right, parentScope) {
|
|
7
|
-
return
|
|
7
|
+
return _chunkMVGUEJ5Zcjs.asyncEffect.call(void 0, (env, cb) => {
|
|
8
8
|
const scope = parentScope.subScope();
|
|
9
9
|
let done = false;
|
|
10
10
|
const onResult = (exit) => {
|
|
@@ -20,7 +20,7 @@ function race(left, right, parentScope) {
|
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
function zipPar(left, right, parentScope) {
|
|
23
|
-
return
|
|
23
|
+
return _chunkMVGUEJ5Zcjs.asyncEffect.call(void 0, (env, cb) => {
|
|
24
24
|
const scope = parentScope.subScope();
|
|
25
25
|
let leftExit = null;
|
|
26
26
|
let rightExit = null;
|
|
@@ -64,7 +64,7 @@ function zipPar(left, right, parentScope) {
|
|
|
64
64
|
});
|
|
65
65
|
}
|
|
66
66
|
function collectAllPar(effects, parentScope) {
|
|
67
|
-
return
|
|
67
|
+
return _chunkMVGUEJ5Zcjs.asyncEffect.call(void 0, (env, cb) => {
|
|
68
68
|
const scope = parentScope.subScope();
|
|
69
69
|
const results = new Array(effects.length);
|
|
70
70
|
let completed = 0;
|
|
@@ -99,7 +99,7 @@ function collectAllPar(effects, parentScope) {
|
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
function raceWith(left, right, parentScope, onLeft, onRight) {
|
|
102
|
-
return
|
|
102
|
+
return _chunkMVGUEJ5Zcjs.asyncEffect.call(void 0, (env, cb) => {
|
|
103
103
|
const scope = parentScope.subScope();
|
|
104
104
|
let done = false;
|
|
105
105
|
const fiberLeft = scope.fork(left);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Cause
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UB4B6OFY.js";
|
|
4
4
|
|
|
5
5
|
// src/http/effectRunner.ts
|
|
6
6
|
function registerHttpEffect(effect, env, cb) {
|
|
@@ -59,9 +59,12 @@ function registerHttpEffect(effect, env, cb) {
|
|
|
59
59
|
run(current.onSuccess(exit.value), cont);
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
|
-
if (exit.cause
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
if (Cause.isFailureOnly(exit.cause)) {
|
|
63
|
+
const failure = Cause.firstFailure(exit.cause);
|
|
64
|
+
if (failure._tag === "Some") {
|
|
65
|
+
run(current.onFailure(failure.value), cont);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
65
68
|
}
|
|
66
69
|
cont(exit);
|
|
67
70
|
} catch (e) {
|
|
@@ -72,6 +75,14 @@ function registerHttpEffect(effect, env, cb) {
|
|
|
72
75
|
case "Fork":
|
|
73
76
|
cont({ _tag: "Success", value: void 0 });
|
|
74
77
|
return;
|
|
78
|
+
case "Interruptibility":
|
|
79
|
+
case "InterruptibilityRestore":
|
|
80
|
+
case "FiberRefLocally":
|
|
81
|
+
run(current.effect, cont);
|
|
82
|
+
return;
|
|
83
|
+
case "InterruptibilityMask":
|
|
84
|
+
run(current.body((effect2) => effect2), cont);
|
|
85
|
+
return;
|
|
75
86
|
}
|
|
76
87
|
};
|
|
77
88
|
run(effect, finish);
|
|
@@ -0,0 +1,370 @@
|
|
|
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
|
+
interruptibility: (mode, effect) => ({ _tag: "Interruptibility", mode, effect })
|
|
8
|
+
};
|
|
9
|
+
function asyncFold(fa, onFailure, onSuccess) {
|
|
10
|
+
return {
|
|
11
|
+
_tag: "Fold",
|
|
12
|
+
first: fa,
|
|
13
|
+
onFailure,
|
|
14
|
+
onSuccess
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function asyncCatchAll(fa, handler) {
|
|
18
|
+
return asyncFold(fa, handler, asyncSucceed);
|
|
19
|
+
}
|
|
20
|
+
function asyncMapError(fa, f) {
|
|
21
|
+
return asyncFold(fa, (e) => asyncFail(f(e)), asyncSucceed);
|
|
22
|
+
}
|
|
23
|
+
var SUCCEED_UNDEFINED = { _tag: "Succeed", value: void 0 };
|
|
24
|
+
var SUCCEED_TRUE = { _tag: "Succeed", value: true };
|
|
25
|
+
var SUCCEED_FALSE = { _tag: "Succeed", value: false };
|
|
26
|
+
var SUCCEED_NULL = { _tag: "Succeed", value: null };
|
|
27
|
+
var unit = () => SUCCEED_UNDEFINED;
|
|
28
|
+
var asyncSucceed = (value) => {
|
|
29
|
+
if (value === void 0) return SUCCEED_UNDEFINED;
|
|
30
|
+
if (value === true) return SUCCEED_TRUE;
|
|
31
|
+
if (value === false) return SUCCEED_FALSE;
|
|
32
|
+
if (value === null) return SUCCEED_NULL;
|
|
33
|
+
return { _tag: "Succeed", value };
|
|
34
|
+
};
|
|
35
|
+
var asyncFail = (error) => ({
|
|
36
|
+
_tag: "Fail",
|
|
37
|
+
error
|
|
38
|
+
});
|
|
39
|
+
var asyncSync = (thunk) => ({
|
|
40
|
+
_tag: "Sync",
|
|
41
|
+
thunk
|
|
42
|
+
});
|
|
43
|
+
var asyncTotal = (thunk) => asyncSync(() => thunk());
|
|
44
|
+
var asyncEffect = (register) => ({
|
|
45
|
+
_tag: "Async",
|
|
46
|
+
register
|
|
47
|
+
});
|
|
48
|
+
function asyncMap(fa, f) {
|
|
49
|
+
return asyncFlatMap(fa, (a) => asyncSucceed(f(a)));
|
|
50
|
+
}
|
|
51
|
+
function asyncFlatMap(fa, f) {
|
|
52
|
+
return {
|
|
53
|
+
_tag: "FlatMap",
|
|
54
|
+
first: fa,
|
|
55
|
+
andThen: f
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function acquireRelease(acquire, release, scope) {
|
|
59
|
+
return asyncFlatMap(acquire, (resource) => {
|
|
60
|
+
scope.addFinalizer((exit) => release(resource, exit));
|
|
61
|
+
return asyncSucceed(resource);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function asyncInterruptible(register) {
|
|
65
|
+
return asyncEffect(register);
|
|
66
|
+
}
|
|
67
|
+
var withAsyncPromise = (run) => (eff) => {
|
|
68
|
+
const anyEff = eff;
|
|
69
|
+
if (!anyEff.toPromise) {
|
|
70
|
+
anyEff.toPromise = (env) => run(eff, env);
|
|
71
|
+
anyEff.unsafeRunPromise = () => run(eff, {});
|
|
72
|
+
}
|
|
73
|
+
return anyEff;
|
|
74
|
+
};
|
|
75
|
+
var mapAsync = (fa, f) => asyncFlatMap(fa, (a) => asyncSucceed(f(a)));
|
|
76
|
+
var mapTryAsync = (fa, f) => asyncFlatMap(fa, (a) => asyncSync(() => f(a)));
|
|
77
|
+
|
|
78
|
+
// src/core/types/option.ts
|
|
79
|
+
var none = { _tag: "None" };
|
|
80
|
+
var some = (value) => ({ _tag: "Some", value });
|
|
81
|
+
|
|
82
|
+
// src/core/types/effect.ts
|
|
83
|
+
var Cause = {
|
|
84
|
+
fail: (error) => ({ _tag: "Fail", error }),
|
|
85
|
+
interrupt: () => ({ _tag: "Interrupt" }),
|
|
86
|
+
die: (defect) => ({ _tag: "Die", defect }),
|
|
87
|
+
then: (left, right) => ({ _tag: "Then", left, right }),
|
|
88
|
+
both: (left, right) => ({ _tag: "Both", left, right }),
|
|
89
|
+
isCause: isCauseValue,
|
|
90
|
+
failures: causeFailures,
|
|
91
|
+
defects: causeDefects,
|
|
92
|
+
firstFailure: firstCauseFailure,
|
|
93
|
+
firstDefect: firstCauseDefect,
|
|
94
|
+
containsFailure: causeContainsFailure,
|
|
95
|
+
containsDefect: causeContainsDefect,
|
|
96
|
+
containsInterrupt: causeContainsInterrupt,
|
|
97
|
+
isInterruptedOnly: causeIsInterruptedOnly,
|
|
98
|
+
isFailureOnly: causeIsFailureOnly,
|
|
99
|
+
squash: squashCause,
|
|
100
|
+
toError: causeToError,
|
|
101
|
+
pretty: prettyCause,
|
|
102
|
+
format: prettyCause
|
|
103
|
+
};
|
|
104
|
+
function isCause(value) {
|
|
105
|
+
return isCauseValue(value);
|
|
106
|
+
}
|
|
107
|
+
function prettyCause(cause, options = {}) {
|
|
108
|
+
const indent = options.indent ?? " ";
|
|
109
|
+
const renderError = options.renderError ?? ((error) => formatCauseValue(error));
|
|
110
|
+
const renderDefect = options.renderDefect ?? formatCauseValue;
|
|
111
|
+
const lines = [];
|
|
112
|
+
const visit = (current, depth, label) => {
|
|
113
|
+
const prefix = indent.repeat(depth);
|
|
114
|
+
const head = label ? `${label}: ` : "";
|
|
115
|
+
switch (current._tag) {
|
|
116
|
+
case "Fail":
|
|
117
|
+
lines.push(`${prefix}${head}Fail(${renderError(current.error)})`);
|
|
118
|
+
return;
|
|
119
|
+
case "Die":
|
|
120
|
+
lines.push(`${prefix}${head}Die(${renderDefect(current.defect)})`);
|
|
121
|
+
return;
|
|
122
|
+
case "Interrupt":
|
|
123
|
+
lines.push(`${prefix}${head}Interrupt`);
|
|
124
|
+
return;
|
|
125
|
+
case "Then":
|
|
126
|
+
lines.push(`${prefix}${head}Then`);
|
|
127
|
+
visit(current.left, depth + 1, "left");
|
|
128
|
+
visit(current.right, depth + 1, "right");
|
|
129
|
+
return;
|
|
130
|
+
case "Both":
|
|
131
|
+
lines.push(`${prefix}${head}Both`);
|
|
132
|
+
visit(current.left, depth + 1, "left");
|
|
133
|
+
visit(current.right, depth + 1, "right");
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
visit(cause, 0);
|
|
138
|
+
if (options.singleLine) return lines.map((line) => line.trim()).join("; ");
|
|
139
|
+
return lines.join("\n");
|
|
140
|
+
}
|
|
141
|
+
var formatCause = prettyCause;
|
|
142
|
+
function isCauseValue(value) {
|
|
143
|
+
if (typeof value !== "object" || value === null || !("_tag" in value)) return false;
|
|
144
|
+
const tag = value._tag;
|
|
145
|
+
switch (tag) {
|
|
146
|
+
case "Fail":
|
|
147
|
+
return "error" in value;
|
|
148
|
+
case "Die":
|
|
149
|
+
return "defect" in value;
|
|
150
|
+
case "Interrupt":
|
|
151
|
+
return true;
|
|
152
|
+
case "Then":
|
|
153
|
+
case "Both":
|
|
154
|
+
return isCauseValue(value.left) && isCauseValue(value.right);
|
|
155
|
+
default:
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function causeFailures(cause) {
|
|
160
|
+
const failures = [];
|
|
161
|
+
collectFailures(cause, failures);
|
|
162
|
+
return failures;
|
|
163
|
+
}
|
|
164
|
+
function collectFailures(cause, out) {
|
|
165
|
+
switch (cause._tag) {
|
|
166
|
+
case "Fail":
|
|
167
|
+
out.push(cause.error);
|
|
168
|
+
return;
|
|
169
|
+
case "Then":
|
|
170
|
+
case "Both":
|
|
171
|
+
collectFailures(cause.left, out);
|
|
172
|
+
collectFailures(cause.right, out);
|
|
173
|
+
return;
|
|
174
|
+
case "Die":
|
|
175
|
+
case "Interrupt":
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function causeDefects(cause) {
|
|
180
|
+
const defects = [];
|
|
181
|
+
collectDefects(cause, defects);
|
|
182
|
+
return defects;
|
|
183
|
+
}
|
|
184
|
+
function collectDefects(cause, out) {
|
|
185
|
+
switch (cause._tag) {
|
|
186
|
+
case "Die":
|
|
187
|
+
out.push(cause.defect);
|
|
188
|
+
return;
|
|
189
|
+
case "Then":
|
|
190
|
+
case "Both":
|
|
191
|
+
collectDefects(cause.left, out);
|
|
192
|
+
collectDefects(cause.right, out);
|
|
193
|
+
return;
|
|
194
|
+
case "Fail":
|
|
195
|
+
case "Interrupt":
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function firstCauseFailure(cause) {
|
|
200
|
+
switch (cause._tag) {
|
|
201
|
+
case "Fail":
|
|
202
|
+
return some(cause.error);
|
|
203
|
+
case "Then":
|
|
204
|
+
case "Both": {
|
|
205
|
+
const left = firstCauseFailure(cause.left);
|
|
206
|
+
return left._tag === "Some" ? left : firstCauseFailure(cause.right);
|
|
207
|
+
}
|
|
208
|
+
case "Die":
|
|
209
|
+
case "Interrupt":
|
|
210
|
+
return none;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function firstCauseDefect(cause) {
|
|
214
|
+
switch (cause._tag) {
|
|
215
|
+
case "Die":
|
|
216
|
+
return some(cause.defect);
|
|
217
|
+
case "Then":
|
|
218
|
+
case "Both": {
|
|
219
|
+
const left = firstCauseDefect(cause.left);
|
|
220
|
+
return left._tag === "Some" ? left : firstCauseDefect(cause.right);
|
|
221
|
+
}
|
|
222
|
+
case "Fail":
|
|
223
|
+
case "Interrupt":
|
|
224
|
+
return none;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function causeContainsFailure(cause) {
|
|
228
|
+
switch (cause._tag) {
|
|
229
|
+
case "Fail":
|
|
230
|
+
return true;
|
|
231
|
+
case "Then":
|
|
232
|
+
case "Both":
|
|
233
|
+
return causeContainsFailure(cause.left) || causeContainsFailure(cause.right);
|
|
234
|
+
case "Die":
|
|
235
|
+
case "Interrupt":
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function causeContainsDefect(cause) {
|
|
240
|
+
switch (cause._tag) {
|
|
241
|
+
case "Die":
|
|
242
|
+
return true;
|
|
243
|
+
case "Then":
|
|
244
|
+
case "Both":
|
|
245
|
+
return causeContainsDefect(cause.left) || causeContainsDefect(cause.right);
|
|
246
|
+
case "Fail":
|
|
247
|
+
case "Interrupt":
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function causeContainsInterrupt(cause) {
|
|
252
|
+
switch (cause._tag) {
|
|
253
|
+
case "Interrupt":
|
|
254
|
+
return true;
|
|
255
|
+
case "Then":
|
|
256
|
+
case "Both":
|
|
257
|
+
return causeContainsInterrupt(cause.left) || causeContainsInterrupt(cause.right);
|
|
258
|
+
case "Fail":
|
|
259
|
+
case "Die":
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
function causeIsInterruptedOnly(cause) {
|
|
264
|
+
return causeContainsInterrupt(cause) && !causeContainsFailure(cause) && !causeContainsDefect(cause);
|
|
265
|
+
}
|
|
266
|
+
function causeIsFailureOnly(cause) {
|
|
267
|
+
return causeContainsFailure(cause) && !causeContainsInterrupt(cause) && !causeContainsDefect(cause);
|
|
268
|
+
}
|
|
269
|
+
function squashCause(cause) {
|
|
270
|
+
const failure = firstCauseFailure(cause);
|
|
271
|
+
if (failure._tag === "Some") return failure.value;
|
|
272
|
+
const defect = firstCauseDefect(cause);
|
|
273
|
+
if (defect._tag === "Some") return defect.value instanceof Error ? defect.value : new Error(String(defect.value));
|
|
274
|
+
if (causeContainsInterrupt(cause)) return new Error("Interrupted");
|
|
275
|
+
return new Error(prettyCause(cause, { singleLine: true }));
|
|
276
|
+
}
|
|
277
|
+
function causeToError(cause) {
|
|
278
|
+
const squashed = squashCause(cause);
|
|
279
|
+
if (squashed instanceof Error) return squashed;
|
|
280
|
+
return new Error(formatCauseValue(squashed));
|
|
281
|
+
}
|
|
282
|
+
function formatCauseValue(value) {
|
|
283
|
+
if (value instanceof Error) return `${value.name}: ${value.message}`;
|
|
284
|
+
if (typeof value === "string") return JSON.stringify(value);
|
|
285
|
+
if (typeof value === "number" || typeof value === "boolean" || value === null || value === void 0) {
|
|
286
|
+
return String(value);
|
|
287
|
+
}
|
|
288
|
+
try {
|
|
289
|
+
return JSON.stringify(value);
|
|
290
|
+
} catch {
|
|
291
|
+
return String(value);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
var Exit = {
|
|
295
|
+
succeed: (value) => ({
|
|
296
|
+
_tag: "Success",
|
|
297
|
+
value
|
|
298
|
+
}),
|
|
299
|
+
failCause: (cause) => ({
|
|
300
|
+
_tag: "Failure",
|
|
301
|
+
cause
|
|
302
|
+
})
|
|
303
|
+
};
|
|
304
|
+
var succeed = (value) => asyncSucceed(value);
|
|
305
|
+
var fail = (error) => asyncFail(error);
|
|
306
|
+
var sync = (thunk) => asyncSync((env) => thunk(env));
|
|
307
|
+
var map = (fa, f) => asyncMap(fa, f);
|
|
308
|
+
var flatMap = (fa, f) => asyncFlatMap(fa, f);
|
|
309
|
+
var mapError = (fa, f) => asyncMapError(fa, f);
|
|
310
|
+
var catchAll = (fa, handler) => asyncFold(fa, handler, asyncSucceed);
|
|
311
|
+
var uninterruptible = (effect) => ({
|
|
312
|
+
_tag: "Interruptibility",
|
|
313
|
+
mode: "uninterruptible",
|
|
314
|
+
effect
|
|
315
|
+
});
|
|
316
|
+
var interruptible = (effect) => ({
|
|
317
|
+
_tag: "Interruptibility",
|
|
318
|
+
mode: "interruptible",
|
|
319
|
+
effect
|
|
320
|
+
});
|
|
321
|
+
function uninterruptibleMask(body) {
|
|
322
|
+
return { _tag: "InterruptibilityMask", body };
|
|
323
|
+
}
|
|
324
|
+
function orElseOptional(fa, that) {
|
|
325
|
+
return asyncFold(
|
|
326
|
+
fa,
|
|
327
|
+
(opt) => opt._tag === "Some" ? asyncFail(opt) : that(),
|
|
328
|
+
asyncSucceed
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
var end = () => fail(none);
|
|
332
|
+
|
|
333
|
+
export {
|
|
334
|
+
Async,
|
|
335
|
+
asyncFold,
|
|
336
|
+
asyncCatchAll,
|
|
337
|
+
asyncMapError,
|
|
338
|
+
unit,
|
|
339
|
+
asyncSucceed,
|
|
340
|
+
asyncFail,
|
|
341
|
+
asyncSync,
|
|
342
|
+
asyncTotal,
|
|
343
|
+
asyncEffect,
|
|
344
|
+
asyncMap,
|
|
345
|
+
asyncFlatMap,
|
|
346
|
+
acquireRelease,
|
|
347
|
+
asyncInterruptible,
|
|
348
|
+
withAsyncPromise,
|
|
349
|
+
mapAsync,
|
|
350
|
+
mapTryAsync,
|
|
351
|
+
none,
|
|
352
|
+
some,
|
|
353
|
+
Cause,
|
|
354
|
+
isCause,
|
|
355
|
+
prettyCause,
|
|
356
|
+
formatCause,
|
|
357
|
+
Exit,
|
|
358
|
+
succeed,
|
|
359
|
+
fail,
|
|
360
|
+
sync,
|
|
361
|
+
map,
|
|
362
|
+
flatMap,
|
|
363
|
+
mapError,
|
|
364
|
+
catchAll,
|
|
365
|
+
uninterruptible,
|
|
366
|
+
interruptible,
|
|
367
|
+
uninterruptibleMask,
|
|
368
|
+
orElseOptional,
|
|
369
|
+
end
|
|
370
|
+
};
|