brass-runtime 1.16.0 → 1.17.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 (219) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +287 -23
  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-7XOPAB5Q.js → chunk-4P2HHGAX.mjs} +83 -5
  16. package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
  17. package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
  18. package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
  19. package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
  20. package/dist/chunk-5QC7LRZ3.js +229 -0
  21. package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
  22. package/dist/chunk-62AZW6UT.cjs +313 -0
  23. package/dist/chunk-6IXXWIUM.js +683 -0
  24. package/dist/chunk-6RY2FFN4.mjs +2024 -0
  25. package/dist/chunk-74ZTY6CP.js +2871 -0
  26. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  27. package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
  28. package/dist/chunk-7X3K5RMS.js +2024 -0
  29. package/dist/chunk-7ZPEZ57L.cjs +2024 -0
  30. package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
  31. package/dist/chunk-AGR5B2BC.cjs +683 -0
  32. package/dist/chunk-B33ICAKP.js +313 -0
  33. package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
  34. package/dist/{chunk-F5EUMJL7.mjs → chunk-BKK77SBA.js} +83 -5
  35. package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
  36. package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
  37. package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
  38. package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
  39. package/dist/chunk-EOC4UHBS.mjs +229 -0
  40. package/dist/chunk-F6XWZQY4.cjs +777 -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-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
  46. package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
  47. package/dist/chunk-KN32XNTH.mjs +313 -0
  48. package/dist/chunk-KQLYONSE.cjs +2871 -0
  49. package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
  50. package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
  51. package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
  52. package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
  53. package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
  54. package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
  55. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  56. package/dist/chunk-PD4EJTQC.cjs +229 -0
  57. package/dist/chunk-PWC3RBQE.mjs +300 -0
  58. package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
  59. package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
  60. package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
  61. package/dist/chunk-SK7UZRNI.mjs +777 -0
  62. package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
  63. package/dist/chunk-UB4B6OFY.js +370 -0
  64. package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
  65. package/dist/chunk-VWIPB6I5.js +777 -0
  66. package/dist/{chunk-JNFRRJYH.cjs → chunk-WBGRHGBP.cjs} +270 -192
  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 +18 -531
  89. package/dist/observability/index.d.ts +81 -8
  90. package/dist/observability/index.js +25 -538
  91. package/dist/observability/index.mjs +25 -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-D6JZ15_e.d.ts} +16 -4
  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 +65 -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 +339 -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/framework-integrations.md +38 -0
  165. package/docs/frameworks/angular.md +153 -0
  166. package/docs/frameworks/express.md +125 -0
  167. package/docs/frameworks/fastify.md +124 -0
  168. package/docs/frameworks/nestjs.md +282 -0
  169. package/docs/frameworks/nextjs.md +147 -0
  170. package/docs/frameworks/react.md +139 -0
  171. package/docs/frameworks/vanilla.md +224 -0
  172. package/docs/getting-started.md +159 -0
  173. package/docs/guides/README.md +40 -0
  174. package/docs/guides/circuit-breaker.md +89 -0
  175. package/docs/guides/error-handling.md +91 -0
  176. package/docs/guides/getting-started.md +107 -0
  177. package/docs/guides/layers.md +189 -0
  178. package/docs/guides/metrics.md +101 -0
  179. package/docs/guides/resource-management.md +141 -0
  180. package/docs/guides/retry.md +215 -0
  181. package/docs/guides/semaphore.md +66 -0
  182. package/docs/guides/streams.md +117 -0
  183. package/docs/guides/supervisors.md +98 -0
  184. package/docs/guides/testing.md +162 -0
  185. package/docs/guides/tracing.md +71 -0
  186. package/docs/http-recipes.md +399 -0
  187. package/docs/http.md +749 -0
  188. package/docs/modules.md +285 -0
  189. package/docs/nestjs.md +6 -0
  190. package/docs/observability-collector-smoke.md +31 -0
  191. package/docs/observability-framework-examples.md +110 -0
  192. package/docs/observability.md +649 -0
  193. package/docs/otel-collector-smoke.yaml +27 -0
  194. package/docs/performance-profiler.md +199 -0
  195. package/docs/production-readiness.md +73 -0
  196. package/docs/recipes/README.md +12 -0
  197. package/docs/recipes/http-server.md +45 -0
  198. package/docs/recipes/layers.md +44 -0
  199. package/docs/recipes/performance.md +47 -0
  200. package/docs/recipes/runtime.md +41 -0
  201. package/docs/recipes/testing.md +41 -0
  202. package/docs/release.md +53 -0
  203. package/docs/wasm-bounded-queues.md +44 -0
  204. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  205. package/docs/wasm-fiber-engine.md +117 -0
  206. package/docs/wasm-scheduler-state-machine.md +122 -0
  207. package/docs/wasm-stream-chunks.md +54 -0
  208. package/package.json +22 -2
  209. package/dist/chunk-45F7OKGT.cjs +0 -104
  210. package/dist/chunk-7V4KY4RL.mjs +0 -104
  211. package/dist/chunk-DJQ7OMMB.cjs +0 -144
  212. package/dist/chunk-GOV47PPB.mjs +0 -552
  213. package/dist/chunk-JF4XXPZ5.cjs +0 -552
  214. package/dist/chunk-KCPT2D6G.js +0 -552
  215. package/dist/chunk-NOYZIMUJ.mjs +0 -144
  216. package/dist/chunk-PNVFW245.js +0 -144
  217. package/dist/chunk-ROJC3NBJ.js +0 -104
  218. package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
  219. package/dist/schedule-Fque9Abz.d.ts +0 -70
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  race
3
- } from "./chunk-G3XGCZDQ.js";
3
+ } from "./chunk-UCUBNWM2.js";
4
4
  import {
5
5
  withScopeAsync
6
- } from "./chunk-FM4W4QPL.js";
6
+ } from "./chunk-L2SYFEBS.js";
7
7
  import {
8
8
  fromPromiseAbortable
9
- } from "./chunk-7LVI2GIN.js";
9
+ } from "./chunk-FH2X7BVP.js";
10
10
  import {
11
11
  Cause,
12
12
  Exit,
@@ -17,7 +17,7 @@ import {
17
17
  asyncMap,
18
18
  asyncSucceed,
19
19
  asyncSync
20
- } from "./chunk-PNVFW245.js";
20
+ } from "./chunk-UB4B6OFY.js";
21
21
 
22
22
  // src/agent/core/state.ts
23
23
  var initialAgentState = (goal) => ({
@@ -1,6 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class; var _class2;
2
2
 
3
- var _chunkWQ5QNU5Rcjs = require('./chunk-WQ5QNU5R.cjs');
3
+ var _chunkGLE2WY7Zcjs = require('./chunk-GLE2WY7Z.cjs');
4
+
5
+
6
+ var _chunkMVGUEJ5Zcjs = require('./chunk-MVGUEJ5Z.cjs');
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];
@@ -161,7 +164,7 @@ var EventBus = (_class = class {
161
164
  subscribe(handler, perSubscriberCapacity = 2048) {
162
165
  this.subs.push({
163
166
  handler,
164
- q: _chunkWQ5QNU5Rcjs.makeBoundedRingBuffer.call(void 0, perSubscriberCapacity, perSubscriberCapacity, this.options),
167
+ q: _chunkGLE2WY7Zcjs.makeBoundedRingBuffer.call(void 0, perSubscriberCapacity, perSubscriberCapacity, this.options),
165
168
  dropped: 0
166
169
  });
167
170
  return () => {
@@ -206,13 +209,17 @@ var EventBus = (_class = class {
206
209
 
207
210
  // src/core/runtime/tracingSink.ts
208
211
  var InMemoryTracer = (_class2 = class {
209
- constructor(options = {}) {;_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);
212
+ constructor(options = {}) {;_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);_class2.prototype.__init10.call(this);
210
213
  this.options = options;
211
214
  }
212
215
 
213
216
  __init5() {this.spans = /* @__PURE__ */ new Map()}
214
217
  // key: spanId
215
- __init6() {this.prunedFinishedSpans = 0}
218
+ __init6() {this.finishedSpanIds = []}
219
+ __init7() {this.finishedSpanSet = /* @__PURE__ */ new Set()}
220
+ __init8() {this.finishedSpanOffset = 0}
221
+ __init9() {this.finishedSpanCount = 0}
222
+ __init10() {this.prunedFinishedSpans = 0}
216
223
  emit(ev, ctx) {
217
224
  if (ctx.sampled === false) return;
218
225
  const wallTs = this.now();
@@ -237,8 +244,10 @@ var InMemoryTracer = (_class2 = 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 = (_class2 = 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), ..._nullishCoalesce(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 = (_class2 = class {
284
295
  }
285
296
  exportFinished() {
286
297
  this.pruneFinished();
287
- return Array.from(this.spans.values()).filter((s) => s.endWallTs != null);
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 (_optionalChain([span, 'optionalAccess', _ => _.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
- const span = this.spans.get(spanId);
294
- if (_optionalChain([span, 'optionalAccess', _ => _.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 = (_class2 = class {
305
321
  stats() {
306
322
  return {
307
323
  storedSpans: this.spans.size,
308
- finishedSpans: Array.from(this.spans.values()).filter((s) => s.endWallTs != null).length,
324
+ finishedSpans: this.finishedSpanCount,
309
325
  prunedFinishedSpans: this.prunedFinishedSpans
310
326
  };
311
327
  }
@@ -313,7 +329,8 @@ var InMemoryTracer = (_class2 = class {
313
329
  return _nullishCoalesce(_optionalChain([this, 'access', _2 => _2.options, 'access', _3 => _3.sanitizeAttributes, 'optionalCall', _4 => _4(attrs)]), () => ( attrs));
314
330
  }
315
331
  error(error) {
316
- return error === void 0 ? void 0 : _nullishCoalesce(_optionalChain([this, 'access', _5 => _5.options, 'access', _6 => _6.sanitizeError, 'optionalCall', _7 => _7(error)]), () => ( error));
332
+ const normalized = _chunkMVGUEJ5Zcjs.Cause.isCause(error) ? _chunkMVGUEJ5Zcjs.Cause.pretty(error, { singleLine: true }) : error;
333
+ return normalized === void 0 ? void 0 : _nullishCoalesce(_optionalChain([this, 'access', _5 => _5.options, 'access', _6 => _6.sanitizeError, 'optionalCall', _7 => _7(normalized)]), () => ( normalized));
317
334
  }
318
335
  now() {
319
336
  return _nullishCoalesce(_optionalChain([this, 'access', _8 => _8.options, 'access', _9 => _9.clock, 'optionalCall', _10 => _10()]), () => ( Date.now()));
@@ -323,25 +340,70 @@ var InMemoryTracer = (_class2 = class {
323
340
  if (maxAgeMs === void 0 || maxAgeMs <= 0) return 0;
324
341
  const now = this.now();
325
342
  let dropped = 0;
326
- for (const [spanId, span] of this.spans) {
327
- if (span.endWallTs == null) continue;
328
- if (now - span.endWallTs > maxAgeMs && this.spans.delete(spanId)) dropped++;
343
+ while (true) {
344
+ const oldest = this.peekOldestFinished();
345
+ if (!oldest) break;
346
+ if (now - (_nullishCoalesce(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) => (_nullishCoalesce(a.endWallTs, () => ( 0))) - (_nullishCoalesce(b.endWallTs, () => ( 0))));
336
- const overflow = finished.length - maxFinishedSpans;
337
- if (overflow <= 0) return 0;
338
354
  let dropped = 0;
339
- for (let i = 0; i < overflow; i++) {
340
- const span = finished[i];
341
- if (this.spans.delete(span.spanId)) dropped++;
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 (_optionalChain([span, 'optionalAccess', _11 => _11.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
  }, _class2);
346
408
 
347
409