brass-runtime 1.14.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +410 -135
  2. package/dist/agent/cli/main.cjs +49 -43
  3. package/dist/agent/cli/main.js +11 -5
  4. package/dist/agent/cli/main.mjs +11 -5
  5. package/dist/agent/index.cjs +8 -3
  6. package/dist/agent/index.d.ts +1 -1
  7. package/dist/agent/index.js +7 -2
  8. package/dist/agent/index.mjs +7 -2
  9. package/dist/{chunk-BMRF4FN6.js → chunk-2WC63LJK.mjs} +68 -242
  10. package/dist/chunk-3RG5ZIWI.js +10 -0
  11. package/dist/chunk-45F7OKGT.cjs +104 -0
  12. package/dist/chunk-5YOQOXEQ.cjs +2491 -0
  13. package/dist/chunk-7HUOJA4W.cjs +493 -0
  14. package/dist/{chunk-4N2JEK4H.mjs → chunk-7LVI2GIN.js} +252 -495
  15. package/dist/chunk-7TL2LHQJ.js +2491 -0
  16. package/dist/chunk-7V4KY4RL.mjs +104 -0
  17. package/dist/chunk-7XOPAB5Q.js +2143 -0
  18. package/dist/chunk-CCKHV5BT.mjs +193 -0
  19. package/dist/chunk-CY33PGEX.mjs +1110 -0
  20. package/dist/chunk-DJQ7OMMB.cjs +144 -0
  21. package/dist/chunk-F5EUMJL7.mjs +2143 -0
  22. package/dist/chunk-FM4W4QPL.js +193 -0
  23. package/dist/chunk-G3XGCZDQ.js +131 -0
  24. package/dist/{chunk-JT7D6M5H.js → chunk-G6IQOE4P.mjs} +252 -495
  25. package/dist/chunk-GOV47PPB.mjs +552 -0
  26. package/dist/chunk-H55LI6WY.js +93 -0
  27. package/dist/chunk-IJT6RRQ5.cjs +93 -0
  28. package/dist/chunk-J3H54ZRV.mjs +131 -0
  29. package/dist/chunk-JF4XXPZ5.cjs +552 -0
  30. package/dist/chunk-JNFRRJYH.cjs +2143 -0
  31. package/dist/chunk-JX3LZQJH.cjs +354 -0
  32. package/dist/chunk-K2T3DV26.mjs +93 -0
  33. package/dist/chunk-KCPT2D6G.js +552 -0
  34. package/dist/chunk-MWXMNYJS.cjs +1110 -0
  35. package/dist/{chunk-XTMZTVIT.cjs → chunk-N6VHMOWB.cjs} +140 -134
  36. package/dist/{chunk-WJESVBWN.js → chunk-NC5SDRYE.js} +16 -10
  37. package/dist/chunk-NOYZIMUJ.mjs +144 -0
  38. package/dist/chunk-NYL4D7SK.cjs +131 -0
  39. package/dist/chunk-OBGZSXTJ.cjs +10 -0
  40. package/dist/{chunk-UWMMYKVK.mjs → chunk-OOGJ73B6.js} +68 -242
  41. package/dist/chunk-PNVFW245.js +144 -0
  42. package/dist/chunk-PRWCB3QL.mjs +2491 -0
  43. package/dist/chunk-QY5FKYEQ.js +1110 -0
  44. package/dist/chunk-ROJC3NBJ.js +104 -0
  45. package/dist/chunk-SPUEME2B.cjs +343 -0
  46. package/dist/chunk-TDVMADDN.js +343 -0
  47. package/dist/chunk-TVN5I4U6.cjs +193 -0
  48. package/dist/chunk-U5KWK3PX.mjs +343 -0
  49. package/dist/chunk-VFIUZG7J.mjs +354 -0
  50. package/dist/{chunk-BKBFSOGT.cjs → chunk-WQ5QNU5R.cjs} +460 -703
  51. package/dist/chunk-XDZOO4L5.js +354 -0
  52. package/dist/chunk-Y6FXYEAI.mjs +10 -0
  53. package/dist/{chunk-MQF7HZ7Y.mjs → chunk-ZGLD4TVZ.mjs} +16 -10
  54. package/dist/client-CtFmoDvM.d.ts +645 -0
  55. package/dist/core/index.cjs +284 -0
  56. package/dist/core/index.d.ts +567 -0
  57. package/dist/core/index.js +284 -0
  58. package/dist/core/index.mjs +284 -0
  59. package/dist/{effect-DM56H743.d.ts → effect-CGNl5Rqp.d.ts} +118 -11
  60. package/dist/effectRunner-3ZHAD3LE.cjs +8 -0
  61. package/dist/effectRunner-A4CHJXJI.js +8 -0
  62. package/dist/effectRunner-OPUF6QRN.mjs +8 -0
  63. package/dist/http/index.cjs +4130 -890
  64. package/dist/http/index.d.ts +2289 -219
  65. package/dist/http/index.js +4116 -876
  66. package/dist/http/index.mjs +4116 -876
  67. package/dist/http/testing.cjs +159 -0
  68. package/dist/http/testing.d.ts +42 -0
  69. package/dist/http/testing.js +159 -0
  70. package/dist/http/testing.mjs +159 -0
  71. package/dist/index.cjs +305 -1168
  72. package/dist/index.d.ts +9 -701
  73. package/dist/index.js +176 -1039
  74. package/dist/index.mjs +176 -1039
  75. package/dist/observability/index.cjs +677 -0
  76. package/dist/observability/index.d.ts +79 -0
  77. package/dist/observability/index.js +677 -0
  78. package/dist/observability/index.mjs +677 -0
  79. package/dist/schedule-Fque9Abz.d.ts +70 -0
  80. package/dist/schema/index.cjs +25 -0
  81. package/dist/schema/index.d.ts +177 -0
  82. package/dist/schema/index.js +25 -0
  83. package/dist/schema/index.mjs +25 -0
  84. package/dist/server-C8hDXA74.d.ts +674 -0
  85. package/dist/stream-dvSs0QS5.d.ts +74 -0
  86. package/dist/tracer-B5tRH9H7.d.ts +230 -0
  87. package/dist/tracing-Dt9S_6V8.d.ts +148 -0
  88. package/package.json +37 -3
  89. package/dist/chunk-SKVY72E5.cjs +0 -667
  90. package/dist/stream-Oqe6WeLE.d.ts +0 -173
@@ -0,0 +1,193 @@
1
+ import {
2
+ getCurrentFiber
3
+ } from "./chunk-7LVI2GIN.js";
4
+ import {
5
+ Cause,
6
+ Exit,
7
+ asyncEffect,
8
+ asyncFlatMap,
9
+ asyncFold,
10
+ unit
11
+ } from "./chunk-PNVFW245.js";
12
+
13
+ // src/core/runtime/scope.ts
14
+ var nextScopeId = 1;
15
+ function awaitAll(fibers) {
16
+ return asyncEffect((_env, cb) => {
17
+ let remaining = fibers.length;
18
+ if (remaining === 0) {
19
+ cb({ _tag: "Success", value: void 0 });
20
+ return;
21
+ }
22
+ for (const f of fibers) {
23
+ f.join(() => {
24
+ remaining -= 1;
25
+ if (remaining === 0) cb({ _tag: "Success", value: void 0 });
26
+ });
27
+ }
28
+ });
29
+ }
30
+ var Scope = class _Scope {
31
+ constructor(runtime, parentScopeId) {
32
+ this.runtime = runtime;
33
+ this.parentScopeId = parentScopeId;
34
+ this.id = nextScopeId++;
35
+ const inferredParent = this.parentScopeId ?? getCurrentFiber()?.scopeId;
36
+ if (this.runtime.hasActiveHooks()) {
37
+ this.runtime.emit({
38
+ type: "scope.open",
39
+ scopeId: this.id,
40
+ parentScopeId: inferredParent
41
+ });
42
+ }
43
+ }
44
+ runtime;
45
+ parentScopeId;
46
+ id;
47
+ closed = false;
48
+ children = /* @__PURE__ */ new Set();
49
+ subScopes = /* @__PURE__ */ new Set();
50
+ finalizers = [];
51
+ /** registra un finalizer (LIFO) */
52
+ addFinalizer(f) {
53
+ if (this.closed) {
54
+ throw new Error("Trying to add finalizer to closed scope");
55
+ }
56
+ this.finalizers.push(f);
57
+ }
58
+ /** crea un sub scope (mismo runtime) */
59
+ subScope() {
60
+ if (this.closed) throw new Error("Scope closed");
61
+ const s = new _Scope(this.runtime, this.id);
62
+ this.subScopes.add(s);
63
+ return s;
64
+ }
65
+ /** ✅ fork en este scope */
66
+ fork(eff) {
67
+ if (this.closed) throw new Error("Scope closed");
68
+ const f = this.runtime.fork(eff, this.id);
69
+ this.children.add(f);
70
+ f.join(() => this.children.delete(f));
71
+ return f;
72
+ }
73
+ /** close fire-and-forget (no bloquea) */
74
+ close(exit = { _tag: "Success", value: void 0 }) {
75
+ this.runtime.fork(this.closeAsync(exit));
76
+ }
77
+ /** Emit the scope.close event if hooks are active. */
78
+ emitCloseEvent(exit) {
79
+ if (this.runtime.hasActiveHooks()) {
80
+ const status = exit._tag === "Success" ? "success" : exit.cause._tag === "Interrupt" ? "interrupted" : "failure";
81
+ this.runtime.emit({
82
+ type: "scope.close",
83
+ scopeId: this.id,
84
+ status,
85
+ error: exit._tag === "Failure" && exit.cause._tag === "Fail" ? exit.cause.error : void 0
86
+ });
87
+ }
88
+ }
89
+ /**
90
+ * Build an effect that executes finalizers in LIFO order.
91
+ *
92
+ * Optimization over the original: instead of wrapping every finalizer in
93
+ * `asyncFold(fin(exit), () => unit(), () => unit())` which creates 3 effect
94
+ * nodes per finalizer (Fold + 2 Succeed), we use a single Sync thunk per
95
+ * finalizer that catches errors inline. When the finalizer returns a
96
+ * Succeed effect (like `unit()`), the Sync thunk completes without creating
97
+ * additional effect nodes.
98
+ */
99
+ buildFinalizerEffect(exit) {
100
+ const fins = this.finalizers;
101
+ if (fins.length === 0) return unit();
102
+ let chain = unit();
103
+ for (let i = fins.length - 1; i >= 0; i--) {
104
+ const fin = fins[i];
105
+ chain = asyncFlatMap(chain, () => {
106
+ let result;
107
+ try {
108
+ result = fin(exit);
109
+ } catch {
110
+ return unit();
111
+ }
112
+ if (result._tag === "Succeed") {
113
+ return unit();
114
+ }
115
+ return asyncFold(
116
+ result,
117
+ () => unit(),
118
+ () => unit()
119
+ );
120
+ });
121
+ }
122
+ return chain;
123
+ }
124
+ closeAsync(exit = { _tag: "Success", value: void 0 }, opts = { awaitChildren: true }) {
125
+ return asyncFlatMap(
126
+ unit(),
127
+ () => asyncEffect((env, cb) => {
128
+ if (this.closed) {
129
+ cb({ _tag: "Success", value: void 0 });
130
+ return;
131
+ }
132
+ this.closed = true;
133
+ const children = Array.from(this.children);
134
+ const subScopes = Array.from(this.subScopes);
135
+ for (const child of children) {
136
+ child.interrupt();
137
+ }
138
+ const closeSubs = subScopes.reduceRight(
139
+ (acc, s) => asyncFlatMap(acc, () => s.closeAsync(exit, opts)),
140
+ unit()
141
+ );
142
+ const runFinalizers = this.buildFinalizerEffect(exit);
143
+ const needsAwait = opts.awaitChildren && children.length > 0;
144
+ const awaitChildrenEff = needsAwait ? awaitAll(children) : unit();
145
+ const hasSubScopes = subScopes.length > 0;
146
+ const hasNoFinalizers = this.finalizers.length === 0;
147
+ if (!hasSubScopes && !needsAwait && hasNoFinalizers) {
148
+ this.emitCloseEvent(exit);
149
+ cb({ _tag: "Success", value: void 0 });
150
+ return;
151
+ }
152
+ const all = asyncFlatMap(closeSubs, () => asyncFlatMap(awaitChildrenEff, () => runFinalizers));
153
+ this.runtime.fork(all).join(() => {
154
+ this.emitCloseEvent(exit);
155
+ cb({ _tag: "Success", value: void 0 });
156
+ });
157
+ })
158
+ );
159
+ }
160
+ };
161
+ function withScopeAsync(runtime, f) {
162
+ return asyncEffect((_env, cb) => {
163
+ const scope = new Scope(runtime);
164
+ let done = false;
165
+ const completeAfterClose = (exit) => {
166
+ runtime.fork(scope.closeAsync(exit)).join(() => {
167
+ if (done) return;
168
+ done = true;
169
+ cb(exit);
170
+ });
171
+ };
172
+ const fiber = runtime.fork(f(scope));
173
+ fiber.join(completeAfterClose);
174
+ return () => {
175
+ if (done) return;
176
+ fiber.interrupt();
177
+ runtime.fork(scope.closeAsync(Exit.failCause(Cause.interrupt())));
178
+ };
179
+ });
180
+ }
181
+ function withScope(runtime, f) {
182
+ return withScopeAsync(runtime, (scope) => {
183
+ const out = f(scope);
184
+ if (out && typeof out === "object" && "_tag" in out) return out;
185
+ return unit();
186
+ });
187
+ }
188
+
189
+ export {
190
+ Scope,
191
+ withScopeAsync,
192
+ withScope
193
+ };
@@ -0,0 +1,131 @@
1
+ import {
2
+ asyncEffect
3
+ } from "./chunk-PNVFW245.js";
4
+
5
+ // src/core/stream/structuredConcurrency.ts
6
+ function race(left, right, parentScope) {
7
+ return asyncEffect((env, cb) => {
8
+ const scope = parentScope.subScope();
9
+ let done = false;
10
+ const onResult = (exit) => {
11
+ if (done) return;
12
+ done = true;
13
+ scope.close(exit);
14
+ cb(exit);
15
+ };
16
+ const fiberLeft = scope.fork(left);
17
+ const fiberRight = scope.fork(right);
18
+ fiberLeft.join(onResult);
19
+ fiberRight.join(onResult);
20
+ });
21
+ }
22
+ function zipPar(left, right, parentScope) {
23
+ return asyncEffect((env, cb) => {
24
+ const scope = parentScope.subScope();
25
+ let leftExit = null;
26
+ let rightExit = null;
27
+ let done = false;
28
+ const checkDone = () => {
29
+ if (!leftExit || !rightExit || done) return;
30
+ done = true;
31
+ if (leftExit._tag === "Success" && rightExit._tag === "Success") {
32
+ scope.close({ _tag: "Success", value: void 0 });
33
+ cb({
34
+ _tag: "Success",
35
+ value: [leftExit.value, rightExit.value]
36
+ });
37
+ return;
38
+ }
39
+ let cause;
40
+ if (leftExit._tag === "Failure") {
41
+ cause = leftExit.cause;
42
+ } else if (rightExit._tag === "Failure") {
43
+ cause = rightExit.cause;
44
+ } else {
45
+ throw new Error("zipPar: unreachable state (no Failure exit)");
46
+ }
47
+ const errExit = {
48
+ _tag: "Failure",
49
+ cause
50
+ };
51
+ scope.close(errExit);
52
+ cb(errExit);
53
+ };
54
+ const f1 = scope.fork(left);
55
+ const f2 = scope.fork(right);
56
+ f1.join((exit) => {
57
+ leftExit = exit;
58
+ checkDone();
59
+ });
60
+ f2.join((exit) => {
61
+ rightExit = exit;
62
+ checkDone();
63
+ });
64
+ });
65
+ }
66
+ function collectAllPar(effects, parentScope) {
67
+ return asyncEffect((env, cb) => {
68
+ const scope = parentScope.subScope();
69
+ const results = new Array(effects.length);
70
+ let completed = 0;
71
+ let done = false;
72
+ effects.forEach((eff, i) => {
73
+ const f = scope.fork(eff);
74
+ f.join((exit) => {
75
+ if (done) return;
76
+ if (exit._tag === "Failure") {
77
+ done = true;
78
+ const errExit = {
79
+ _tag: "Failure",
80
+ cause: exit.cause
81
+ };
82
+ scope.close(errExit);
83
+ cb(errExit);
84
+ return;
85
+ }
86
+ results[i] = exit.value;
87
+ completed++;
88
+ if (completed === effects.length) {
89
+ done = true;
90
+ const successExit = {
91
+ _tag: "Success",
92
+ value: results
93
+ };
94
+ scope.close({ _tag: "Success", value: void 0 });
95
+ cb(successExit);
96
+ }
97
+ });
98
+ });
99
+ });
100
+ }
101
+ function raceWith(left, right, parentScope, onLeft, onRight) {
102
+ return asyncEffect((env, cb) => {
103
+ const scope = parentScope.subScope();
104
+ let done = false;
105
+ const fiberLeft = scope.fork(left);
106
+ const fiberRight = scope.fork(right);
107
+ const finish = (next) => {
108
+ scope.fork(next).join((exitNext) => {
109
+ scope.close(exitNext);
110
+ cb(exitNext);
111
+ });
112
+ };
113
+ fiberLeft.join((exitL) => {
114
+ if (done) return;
115
+ done = true;
116
+ finish(onLeft(exitL, fiberRight, scope));
117
+ });
118
+ fiberRight.join((exitR) => {
119
+ if (done) return;
120
+ done = true;
121
+ finish(onRight(exitR, fiberLeft, scope));
122
+ });
123
+ });
124
+ }
125
+
126
+ export {
127
+ race,
128
+ zipPar,
129
+ collectAllPar,
130
+ raceWith
131
+ };