@smoothbricks/lmao 0.1.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 (447) hide show
  1. package/README.md +269 -0
  2. package/dist/allocator.wasm +0 -0
  3. package/dist/bun/preload.d.ts +11 -0
  4. package/dist/bun/preload.d.ts.map +1 -0
  5. package/dist/bun/preload.js +10 -0
  6. package/dist/bun/trace-preload.d.ts +8 -0
  7. package/dist/bun/trace-preload.d.ts.map +1 -0
  8. package/dist/bun/trace-preload.js +12 -0
  9. package/dist/es.d.ts +8 -0
  10. package/dist/es.d.ts.map +1 -0
  11. package/dist/es.js +9 -0
  12. package/dist/index.d.ts +41 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +84 -0
  15. package/dist/lib/JsBufferStrategy.d.ts +49 -0
  16. package/dist/lib/JsBufferStrategy.d.ts.map +1 -0
  17. package/dist/lib/JsBufferStrategy.js +60 -0
  18. package/dist/lib/archive/chunkCompaction.d.ts +15 -0
  19. package/dist/lib/archive/chunkCompaction.d.ts.map +1 -0
  20. package/dist/lib/archive/chunkCompaction.js +24 -0
  21. package/dist/lib/archive/chunkEnvelope.d.ts +21 -0
  22. package/dist/lib/archive/chunkEnvelope.d.ts.map +1 -0
  23. package/dist/lib/archive/chunkEnvelope.js +55 -0
  24. package/dist/lib/archive/chunkRouting.d.ts +10 -0
  25. package/dist/lib/archive/chunkRouting.d.ts.map +1 -0
  26. package/dist/lib/archive/chunkRouting.js +47 -0
  27. package/dist/lib/archive/chunkStats.d.ts +12 -0
  28. package/dist/lib/archive/chunkStats.d.ts.map +1 -0
  29. package/dist/lib/archive/chunkStats.js +10 -0
  30. package/dist/lib/archive/index.d.ts +5 -0
  31. package/dist/lib/archive/index.d.ts.map +1 -0
  32. package/dist/lib/archive/index.js +4 -0
  33. package/dist/lib/arrow/capacityStats.d.ts +9 -0
  34. package/dist/lib/arrow/capacityStats.d.ts.map +1 -0
  35. package/dist/lib/arrow/capacityStats.js +231 -0
  36. package/dist/lib/arrow/dictionaries.d.ts +27 -0
  37. package/dist/lib/arrow/dictionaries.d.ts.map +1 -0
  38. package/dist/lib/arrow/dictionaries.js +135 -0
  39. package/dist/lib/arrow/flechette.d.ts +40 -0
  40. package/dist/lib/arrow/flechette.d.ts.map +1 -0
  41. package/dist/lib/arrow/flechette.js +67 -0
  42. package/dist/lib/arrow/utils.d.ts +38 -0
  43. package/dist/lib/arrow/utils.d.ts.map +1 -0
  44. package/dist/lib/arrow/utils.js +112 -0
  45. package/dist/lib/buffer/Nanoseconds.d.ts +109 -0
  46. package/dist/lib/buffer/Nanoseconds.d.ts.map +1 -0
  47. package/dist/lib/buffer/Nanoseconds.js +86 -0
  48. package/dist/lib/bufferStrategy.d.ts +95 -0
  49. package/dist/lib/bufferStrategy.d.ts.map +1 -0
  50. package/dist/lib/bufferStrategy.js +1 -0
  51. package/dist/lib/capacityTuning.d.ts +50 -0
  52. package/dist/lib/capacityTuning.d.ts.map +1 -0
  53. package/dist/lib/capacityTuning.js +65 -0
  54. package/dist/lib/codegen/evaluatorGenerator.d.ts +35 -0
  55. package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -0
  56. package/dist/lib/codegen/evaluatorGenerator.js +199 -0
  57. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +139 -0
  58. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -0
  59. package/dist/lib/codegen/fixedPositionWriterGenerator.js +289 -0
  60. package/dist/lib/codegen/spanLoggerGenerator.d.ts +115 -0
  61. package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -0
  62. package/dist/lib/codegen/spanLoggerGenerator.js +575 -0
  63. package/dist/lib/convertToArrow.d.ts +40 -0
  64. package/dist/lib/convertToArrow.d.ts.map +1 -0
  65. package/dist/lib/convertToArrow.js +1467 -0
  66. package/dist/lib/defineOpContext.d.ts +96 -0
  67. package/dist/lib/defineOpContext.d.ts.map +1 -0
  68. package/dist/lib/defineOpContext.js +227 -0
  69. package/dist/lib/errors/Blocked.d.ts +113 -0
  70. package/dist/lib/errors/Blocked.d.ts.map +1 -0
  71. package/dist/lib/errors/Blocked.js +68 -0
  72. package/dist/lib/errors/CodeError.d.ts +101 -0
  73. package/dist/lib/errors/CodeError.d.ts.map +1 -0
  74. package/dist/lib/errors/CodeError.js +42 -0
  75. package/dist/lib/errors/RetriesExhausted.d.ts +67 -0
  76. package/dist/lib/errors/RetriesExhausted.d.ts.map +1 -0
  77. package/dist/lib/errors/RetriesExhausted.js +31 -0
  78. package/dist/lib/errors/Transient.d.ts +115 -0
  79. package/dist/lib/errors/Transient.d.ts.map +1 -0
  80. package/dist/lib/errors/Transient.js +54 -0
  81. package/dist/lib/errors/index.d.ts +14 -0
  82. package/dist/lib/errors/index.d.ts.map +1 -0
  83. package/dist/lib/errors/index.js +16 -0
  84. package/dist/lib/errors/retry-policy.d.ts +60 -0
  85. package/dist/lib/errors/retry-policy.d.ts.map +1 -0
  86. package/dist/lib/errors/retry-policy.js +54 -0
  87. package/dist/lib/flushScheduler.d.ts +162 -0
  88. package/dist/lib/flushScheduler.d.ts.map +1 -0
  89. package/dist/lib/flushScheduler.js +388 -0
  90. package/dist/lib/library.d.ts +149 -0
  91. package/dist/lib/library.d.ts.map +1 -0
  92. package/dist/lib/library.js +588 -0
  93. package/dist/lib/logApi.d.ts +61 -0
  94. package/dist/lib/logApi.d.ts.map +1 -0
  95. package/dist/lib/logApi.js +12 -0
  96. package/dist/lib/logBinding.d.ts +63 -0
  97. package/dist/lib/logBinding.d.ts.map +1 -0
  98. package/dist/lib/logBinding.js +1 -0
  99. package/dist/lib/op.d.ts +105 -0
  100. package/dist/lib/op.d.ts.map +1 -0
  101. package/dist/lib/op.js +59 -0
  102. package/dist/lib/opContext/contextTypes.d.ts +88 -0
  103. package/dist/lib/opContext/contextTypes.d.ts.map +1 -0
  104. package/dist/lib/opContext/contextTypes.js +34 -0
  105. package/dist/lib/opContext/createOpGroup.d.ts +57 -0
  106. package/dist/lib/opContext/createOpGroup.d.ts.map +1 -0
  107. package/dist/lib/opContext/createOpGroup.js +341 -0
  108. package/dist/lib/opContext/defineOp.d.ts +83 -0
  109. package/dist/lib/opContext/defineOp.d.ts.map +1 -0
  110. package/dist/lib/opContext/defineOp.js +197 -0
  111. package/dist/lib/opContext/featureFlagTypes.d.ts +58 -0
  112. package/dist/lib/opContext/featureFlagTypes.d.ts.map +1 -0
  113. package/dist/lib/opContext/featureFlagTypes.js +1 -0
  114. package/dist/lib/opContext/index.d.ts +13 -0
  115. package/dist/lib/opContext/index.d.ts.map +1 -0
  116. package/dist/lib/opContext/index.js +15 -0
  117. package/dist/lib/opContext/opGroupTypes.d.ts +250 -0
  118. package/dist/lib/opContext/opGroupTypes.d.ts.map +1 -0
  119. package/dist/lib/opContext/opGroupTypes.js +31 -0
  120. package/dist/lib/opContext/opTypes.d.ts +48 -0
  121. package/dist/lib/opContext/opTypes.d.ts.map +1 -0
  122. package/dist/lib/opContext/opTypes.js +7 -0
  123. package/dist/lib/opContext/spanContextTypes.d.ts +347 -0
  124. package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -0
  125. package/dist/lib/opContext/spanContextTypes.js +1 -0
  126. package/dist/lib/opContext/types.d.ts +297 -0
  127. package/dist/lib/opContext/types.d.ts.map +1 -0
  128. package/dist/lib/opContext/types.js +16 -0
  129. package/dist/lib/result.d.ts +308 -0
  130. package/dist/lib/result.d.ts.map +1 -0
  131. package/dist/lib/result.js +359 -0
  132. package/dist/lib/schema/LogSchema.d.ts +62 -0
  133. package/dist/lib/schema/LogSchema.d.ts.map +1 -0
  134. package/dist/lib/schema/LogSchema.js +134 -0
  135. package/dist/lib/schema/builder.d.ts +12 -0
  136. package/dist/lib/schema/builder.d.ts.map +1 -0
  137. package/dist/lib/schema/builder.js +169 -0
  138. package/dist/lib/schema/defineFeatureFlags.d.ts +60 -0
  139. package/dist/lib/schema/defineFeatureFlags.d.ts.map +1 -0
  140. package/dist/lib/schema/defineFeatureFlags.js +29 -0
  141. package/dist/lib/schema/defineLogSchema.d.ts +87 -0
  142. package/dist/lib/schema/defineLogSchema.d.ts.map +1 -0
  143. package/dist/lib/schema/defineLogSchema.js +171 -0
  144. package/dist/lib/schema/evaluator.d.ts +267 -0
  145. package/dist/lib/schema/evaluator.d.ts.map +1 -0
  146. package/dist/lib/schema/evaluator.js +169 -0
  147. package/dist/lib/schema/extend.d.ts +14 -0
  148. package/dist/lib/schema/extend.d.ts.map +1 -0
  149. package/dist/lib/schema/extend.js +51 -0
  150. package/dist/lib/schema/systemSchema.d.ts +112 -0
  151. package/dist/lib/schema/systemSchema.d.ts.map +1 -0
  152. package/dist/lib/schema/systemSchema.js +260 -0
  153. package/dist/lib/schema/typeGuards.d.ts +52 -0
  154. package/dist/lib/schema/typeGuards.d.ts.map +1 -0
  155. package/dist/lib/schema/typeGuards.js +127 -0
  156. package/dist/lib/schema/types.d.ts +156 -0
  157. package/dist/lib/schema/types.d.ts.map +1 -0
  158. package/dist/lib/schema/types.js +4 -0
  159. package/dist/lib/spanBuffer.d.ts +133 -0
  160. package/dist/lib/spanBuffer.d.ts.map +1 -0
  161. package/dist/lib/spanBuffer.js +442 -0
  162. package/dist/lib/spanBufferHelpers.d.ts +53 -0
  163. package/dist/lib/spanBufferHelpers.d.ts.map +1 -0
  164. package/dist/lib/spanBufferHelpers.js +65 -0
  165. package/dist/lib/spanBufferStats.d.ts +38 -0
  166. package/dist/lib/spanBufferStats.d.ts.map +1 -0
  167. package/dist/lib/spanBufferStats.js +1 -0
  168. package/dist/lib/spanContext.d.ts +141 -0
  169. package/dist/lib/spanContext.d.ts.map +1 -0
  170. package/dist/lib/spanContext.js +763 -0
  171. package/dist/lib/sqlite/index.d.ts +14 -0
  172. package/dist/lib/sqlite/index.d.ts.map +1 -0
  173. package/dist/lib/sqlite/index.js +12 -0
  174. package/dist/lib/sqlite/sqlite-async-writer.d.ts +24 -0
  175. package/dist/lib/sqlite/sqlite-async-writer.d.ts.map +1 -0
  176. package/dist/lib/sqlite/sqlite-async-writer.js +65 -0
  177. package/dist/lib/sqlite/sqlite-common.d.ts +37 -0
  178. package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -0
  179. package/dist/lib/sqlite/sqlite-common.js +207 -0
  180. package/dist/lib/sqlite/sqlite-d1.d.ts +25 -0
  181. package/dist/lib/sqlite/sqlite-d1.d.ts.map +1 -0
  182. package/dist/lib/sqlite/sqlite-d1.js +67 -0
  183. package/dist/lib/sqlite/sqlite-db.d.ts +29 -0
  184. package/dist/lib/sqlite/sqlite-db.d.ts.map +1 -0
  185. package/dist/lib/sqlite/sqlite-db.js +1 -0
  186. package/dist/lib/sqlite/sqlite-node.d.ts +16 -0
  187. package/dist/lib/sqlite/sqlite-node.d.ts.map +1 -0
  188. package/dist/lib/sqlite/sqlite-node.js +68 -0
  189. package/dist/lib/sqlite/sqlite-writer.d.ts +39 -0
  190. package/dist/lib/sqlite/sqlite-writer.d.ts.map +1 -0
  191. package/dist/lib/sqlite/sqlite-writer.js +78 -0
  192. package/dist/lib/testing/bun-harness.d.ts +150 -0
  193. package/dist/lib/testing/bun-harness.d.ts.map +1 -0
  194. package/dist/lib/testing/bun-harness.js +729 -0
  195. package/dist/lib/testing/extractFacts.d.ts +73 -0
  196. package/dist/lib/testing/extractFacts.d.ts.map +1 -0
  197. package/dist/lib/testing/extractFacts.js +237 -0
  198. package/dist/lib/testing/facts.d.ts +235 -0
  199. package/dist/lib/testing/facts.d.ts.map +1 -0
  200. package/dist/lib/testing/facts.js +209 -0
  201. package/dist/lib/testing/index.d.ts +58 -0
  202. package/dist/lib/testing/index.d.ts.map +1 -0
  203. package/dist/lib/testing/index.js +74 -0
  204. package/dist/lib/testing/queryable-span.d.ts +39 -0
  205. package/dist/lib/testing/queryable-span.d.ts.map +1 -0
  206. package/dist/lib/testing/queryable-span.js +58 -0
  207. package/dist/lib/testing/span-query.d.ts +21 -0
  208. package/dist/lib/testing/span-query.d.ts.map +1 -0
  209. package/dist/lib/testing/span-query.js +47 -0
  210. package/dist/lib/testing/stdio-replay.d.ts +4 -0
  211. package/dist/lib/testing/stdio-replay.d.ts.map +1 -0
  212. package/dist/lib/testing/stdio-replay.js +42 -0
  213. package/dist/lib/testing/trace-query.d.ts +59 -0
  214. package/dist/lib/testing/trace-query.d.ts.map +1 -0
  215. package/dist/lib/testing/trace-query.js +462 -0
  216. package/dist/lib/testing/vitest-harness.d.ts +135 -0
  217. package/dist/lib/testing/vitest-harness.d.ts.map +1 -0
  218. package/dist/lib/testing/vitest-harness.js +486 -0
  219. package/dist/lib/threadId.d.ts +58 -0
  220. package/dist/lib/threadId.d.ts.map +1 -0
  221. package/dist/lib/threadId.js +123 -0
  222. package/dist/lib/traceContext.d.ts +116 -0
  223. package/dist/lib/traceContext.d.ts.map +1 -0
  224. package/dist/lib/traceContext.js +37 -0
  225. package/dist/lib/traceId.d.ts +78 -0
  226. package/dist/lib/traceId.d.ts.map +1 -0
  227. package/dist/lib/traceId.js +87 -0
  228. package/dist/lib/traceRoot.d.ts +133 -0
  229. package/dist/lib/traceRoot.d.ts.map +1 -0
  230. package/dist/lib/traceRoot.es.d.ts +75 -0
  231. package/dist/lib/traceRoot.es.d.ts.map +1 -0
  232. package/dist/lib/traceRoot.es.js +129 -0
  233. package/dist/lib/traceRoot.js +19 -0
  234. package/dist/lib/traceRoot.node.d.ts +77 -0
  235. package/dist/lib/traceRoot.node.d.ts.map +1 -0
  236. package/dist/lib/traceRoot.node.js +133 -0
  237. package/dist/lib/traceRoot.universal.d.ts +3 -0
  238. package/dist/lib/traceRoot.universal.d.ts.map +1 -0
  239. package/dist/lib/traceRoot.universal.js +17 -0
  240. package/dist/lib/tracer.d.ts +296 -0
  241. package/dist/lib/tracer.d.ts.map +1 -0
  242. package/dist/lib/tracer.js +346 -0
  243. package/dist/lib/tracers/ArrayQueueTracer.d.ts +56 -0
  244. package/dist/lib/tracers/ArrayQueueTracer.d.ts.map +1 -0
  245. package/dist/lib/tracers/ArrayQueueTracer.js +67 -0
  246. package/dist/lib/tracers/CompositeTracer.d.ts +24 -0
  247. package/dist/lib/tracers/CompositeTracer.d.ts.map +1 -0
  248. package/dist/lib/tracers/CompositeTracer.js +57 -0
  249. package/dist/lib/tracers/NoOpTracer.d.ts +58 -0
  250. package/dist/lib/tracers/NoOpTracer.d.ts.map +1 -0
  251. package/dist/lib/tracers/NoOpTracer.js +41 -0
  252. package/dist/lib/tracers/SQLiteTracer.d.ts +42 -0
  253. package/dist/lib/tracers/SQLiteTracer.d.ts.map +1 -0
  254. package/dist/lib/tracers/SQLiteTracer.js +84 -0
  255. package/dist/lib/tracers/StdioTracer.d.ts +83 -0
  256. package/dist/lib/tracers/StdioTracer.d.ts.map +1 -0
  257. package/dist/lib/tracers/StdioTracer.js +270 -0
  258. package/dist/lib/tracers/TestTracer.d.ts +95 -0
  259. package/dist/lib/tracers/TestTracer.d.ts.map +1 -0
  260. package/dist/lib/tracers/TestTracer.js +87 -0
  261. package/dist/lib/tracers/index.d.ts +12 -0
  262. package/dist/lib/tracers/index.d.ts.map +1 -0
  263. package/dist/lib/tracers/index.js +11 -0
  264. package/dist/lib/types.d.ts +366 -0
  265. package/dist/lib/types.d.ts.map +1 -0
  266. package/dist/lib/types.js +1 -0
  267. package/dist/lib/utf8Cache.d.ts +111 -0
  268. package/dist/lib/utf8Cache.d.ts.map +1 -0
  269. package/dist/lib/utf8Cache.js +177 -0
  270. package/dist/lib/wasm/WasmBufferStrategy.d.ts +88 -0
  271. package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -0
  272. package/dist/lib/wasm/WasmBufferStrategy.js +138 -0
  273. package/dist/lib/wasm/wasmAllocator.d.ts +109 -0
  274. package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -0
  275. package/dist/lib/wasm/wasmAllocator.js +227 -0
  276. package/dist/lib/wasm/wasmSpanBuffer.d.ts +123 -0
  277. package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -0
  278. package/dist/lib/wasm/wasmSpanBuffer.js +772 -0
  279. package/dist/lib/wasm/wasmTraceRoot.d.ts +167 -0
  280. package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -0
  281. package/dist/lib/wasm/wasmTraceRoot.js +264 -0
  282. package/dist/node.d.ts +7 -0
  283. package/dist/node.d.ts.map +1 -0
  284. package/dist/node.js +8 -0
  285. package/dist/testing.d.ts +18 -0
  286. package/dist/testing.d.ts.map +1 -0
  287. package/dist/testing.js +17 -0
  288. package/package.json +193 -0
  289. package/src/bun/preload.ts +11 -0
  290. package/src/bun/trace-preload.ts +14 -0
  291. package/src/es.ts +11 -0
  292. package/src/index.ts +194 -0
  293. package/src/lib/JsBufferStrategy.ts +102 -0
  294. package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +485 -0
  295. package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +390 -0
  296. package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +647 -0
  297. package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +292 -0
  298. package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +354 -0
  299. package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +127 -0
  300. package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +392 -0
  301. package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +389 -0
  302. package/src/lib/__tests__/arrow-conversion-algorithms.test.ts +54 -0
  303. package/src/lib/__tests__/arrow-test-helpers.ts +71 -0
  304. package/src/lib/__tests__/binary-e2e.test.ts +203 -0
  305. package/src/lib/__tests__/buffer-overflow-op-api.test.ts +608 -0
  306. package/src/lib/__tests__/buffer-overflow.test.ts +612 -0
  307. package/src/lib/__tests__/capacity-tuning.test.ts +544 -0
  308. package/src/lib/__tests__/effective-schema.test.ts +439 -0
  309. package/src/lib/__tests__/flechette.test.ts +42 -0
  310. package/src/lib/__tests__/flushScheduler.test.ts +537 -0
  311. package/src/lib/__tests__/integration.test.ts +600 -0
  312. package/src/lib/__tests__/library.test.ts +934 -0
  313. package/src/lib/__tests__/nested-library-tasks.test.ts +849 -0
  314. package/src/lib/__tests__/op-context-binding.test.ts +135 -0
  315. package/src/lib/__tests__/op-metadata.test.ts +198 -0
  316. package/src/lib/__tests__/op-type-safety.test.ts +71 -0
  317. package/src/lib/__tests__/package-exports.test.ts +57 -0
  318. package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +319 -0
  319. package/src/lib/__tests__/remapped-buffer-view.test.ts +635 -0
  320. package/src/lib/__tests__/scope-attributes.test.ts +348 -0
  321. package/src/lib/__tests__/span-lifecycle.test.ts +680 -0
  322. package/src/lib/__tests__/sync-async-trace.test.ts +435 -0
  323. package/src/lib/__tests__/test-helpers.ts +318 -0
  324. package/src/lib/__tests__/timestamp.test.ts +259 -0
  325. package/src/lib/__tests__/trace-archive-primitives.test.ts +98 -0
  326. package/src/lib/__tests__/traceContext-type-enforcement.test.ts +271 -0
  327. package/src/lib/__tests__/tracer.test.ts +211 -0
  328. package/src/lib/__tests__/type-narrowing.test.ts +137 -0
  329. package/src/lib/archive/chunkCompaction.ts +44 -0
  330. package/src/lib/archive/chunkEnvelope.ts +79 -0
  331. package/src/lib/archive/chunkRouting.ts +70 -0
  332. package/src/lib/archive/chunkStats.ts +25 -0
  333. package/src/lib/archive/index.ts +4 -0
  334. package/src/lib/arrow/capacityStats.ts +340 -0
  335. package/src/lib/arrow/dictionaries.ts +159 -0
  336. package/src/lib/arrow/flechette.ts +114 -0
  337. package/src/lib/arrow/utils.ts +126 -0
  338. package/src/lib/buffer/Nanoseconds.ts +131 -0
  339. package/src/lib/bufferStrategy.ts +106 -0
  340. package/src/lib/capacityTuning.ts +102 -0
  341. package/src/lib/codegen/__tests__/__snapshots__/evaluatorGenerator.test.ts.snap +160 -0
  342. package/src/lib/codegen/__tests__/__snapshots__/scopeGenerator.test.ts.snap +196 -0
  343. package/src/lib/codegen/__tests__/__snapshots__/spanLoggerGenerator.test.ts.snap +1965 -0
  344. package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +516 -0
  345. package/src/lib/codegen/__tests__/nullBitmap.test.ts +207 -0
  346. package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +237 -0
  347. package/src/lib/codegen/evaluatorGenerator.ts +309 -0
  348. package/src/lib/codegen/fixedPositionWriterGenerator.ts +444 -0
  349. package/src/lib/codegen/spanLoggerGenerator.ts +715 -0
  350. package/src/lib/convertToArrow.ts +1805 -0
  351. package/src/lib/defineOpContext.ts +398 -0
  352. package/src/lib/errors/Blocked.ts +165 -0
  353. package/src/lib/errors/CodeError.ts +132 -0
  354. package/src/lib/errors/RetriesExhausted.ts +78 -0
  355. package/src/lib/errors/Transient.ts +168 -0
  356. package/src/lib/errors/__tests__/Blocked-config.test.ts +152 -0
  357. package/src/lib/errors/__tests__/Transient.test.ts +129 -0
  358. package/src/lib/errors/__tests__/retry-policy.test.ts +85 -0
  359. package/src/lib/errors/index.ts +24 -0
  360. package/src/lib/errors/retry-policy.ts +87 -0
  361. package/src/lib/flushScheduler.ts +509 -0
  362. package/src/lib/library.ts +682 -0
  363. package/src/lib/logApi.ts +70 -0
  364. package/src/lib/logBinding.ts +67 -0
  365. package/src/lib/op.ts +103 -0
  366. package/src/lib/opContext/__tests__/retry.test.ts +764 -0
  367. package/src/lib/opContext/contextTypes.ts +130 -0
  368. package/src/lib/opContext/createOpGroup.ts +456 -0
  369. package/src/lib/opContext/defineOp.ts +281 -0
  370. package/src/lib/opContext/featureFlagTypes.ts +54 -0
  371. package/src/lib/opContext/index.ts +16 -0
  372. package/src/lib/opContext/opGroupTypes.ts +342 -0
  373. package/src/lib/opContext/opTypes.ts +80 -0
  374. package/src/lib/opContext/spanContextTypes.ts +398 -0
  375. package/src/lib/opContext/types.ts +403 -0
  376. package/src/lib/result.ts +550 -0
  377. package/src/lib/schema/LogSchema.ts +153 -0
  378. package/src/lib/schema/__tests__/defineLogSchema.test.ts +342 -0
  379. package/src/lib/schema/__tests__/featureFlags.test.ts +443 -0
  380. package/src/lib/schema/builder.ts +201 -0
  381. package/src/lib/schema/defineFeatureFlags.ts +91 -0
  382. package/src/lib/schema/defineLogSchema.ts +291 -0
  383. package/src/lib/schema/evaluator.ts +404 -0
  384. package/src/lib/schema/extend.ts +69 -0
  385. package/src/lib/schema/systemSchema.ts +339 -0
  386. package/src/lib/schema/typeGuards.ts +163 -0
  387. package/src/lib/schema/types.ts +265 -0
  388. package/src/lib/spanBuffer.ts +571 -0
  389. package/src/lib/spanBufferHelpers.ts +73 -0
  390. package/src/lib/spanBufferStats.ts +40 -0
  391. package/src/lib/spanContext.ts +1566 -0
  392. package/src/lib/sqlite/__tests__/sqlite-common.test.ts +89 -0
  393. package/src/lib/sqlite/index.ts +26 -0
  394. package/src/lib/sqlite/sqlite-async-writer.ts +101 -0
  395. package/src/lib/sqlite/sqlite-common.ts +309 -0
  396. package/src/lib/sqlite/sqlite-d1.ts +104 -0
  397. package/src/lib/sqlite/sqlite-db.ts +32 -0
  398. package/src/lib/sqlite/sqlite-node.ts +83 -0
  399. package/src/lib/sqlite/sqlite-writer.ts +128 -0
  400. package/src/lib/testing/TRACE-TESTING.md +100 -0
  401. package/src/lib/testing/__tests__/bun-harness.test.ts +108 -0
  402. package/src/lib/testing/__tests__/extractFacts.test.ts +279 -0
  403. package/src/lib/testing/__tests__/facts.test.ts +324 -0
  404. package/src/lib/testing/__tests__/vitest-harness.test.ts +32 -0
  405. package/src/lib/testing/bun-harness.ts +990 -0
  406. package/src/lib/testing/extractFacts.ts +362 -0
  407. package/src/lib/testing/facts.ts +470 -0
  408. package/src/lib/testing/index.ts +141 -0
  409. package/src/lib/testing/queryable-span.ts +108 -0
  410. package/src/lib/testing/span-query.ts +65 -0
  411. package/src/lib/testing/stdio-replay.ts +50 -0
  412. package/src/lib/testing/trace-query.ts +329 -0
  413. package/src/lib/testing/vitest-harness.ts +691 -0
  414. package/src/lib/threadId.ts +135 -0
  415. package/src/lib/traceContext.ts +182 -0
  416. package/src/lib/traceId.ts +142 -0
  417. package/src/lib/traceRoot.es.ts +157 -0
  418. package/src/lib/traceRoot.node.ts +170 -0
  419. package/src/lib/traceRoot.ts +154 -0
  420. package/src/lib/traceRoot.universal.ts +22 -0
  421. package/src/lib/tracer.ts +896 -0
  422. package/src/lib/tracers/ArrayQueueTracer.ts +76 -0
  423. package/src/lib/tracers/CompositeTracer.ts +76 -0
  424. package/src/lib/tracers/NoOpTracer.ts +73 -0
  425. package/src/lib/tracers/SQLiteTracer.ts +115 -0
  426. package/src/lib/tracers/StdioTracer.ts +380 -0
  427. package/src/lib/tracers/TestTracer.ts +146 -0
  428. package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +184 -0
  429. package/src/lib/tracers/__tests__/NoOpTracer.test.ts +204 -0
  430. package/src/lib/tracers/__tests__/StdioTracer.test.ts +313 -0
  431. package/src/lib/tracers/__tests__/TestTracer.test.ts +200 -0
  432. package/src/lib/tracers/index.ts +12 -0
  433. package/src/lib/types.ts +498 -0
  434. package/src/lib/utf8Cache.ts +201 -0
  435. package/src/lib/wasm/WasmBufferStrategy.ts +219 -0
  436. package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +256 -0
  437. package/src/lib/wasm/__tests__/wasm-integration.test.ts +476 -0
  438. package/src/lib/wasm/__tests__/wasmAllocator.test.ts +699 -0
  439. package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +449 -0
  440. package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +390 -0
  441. package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +444 -0
  442. package/src/lib/wasm/allocator.zig +945 -0
  443. package/src/lib/wasm/wasmAllocator.ts +469 -0
  444. package/src/lib/wasm/wasmSpanBuffer.ts +1014 -0
  445. package/src/lib/wasm/wasmTraceRoot.ts +315 -0
  446. package/src/node.ts +10 -0
  447. package/src/testing.ts +18 -0
@@ -0,0 +1,763 @@
1
+ import { createTagWriter } from './codegen/fixedPositionWriterGenerator.js';
2
+ import { createSpanLogger as createSpanLoggerFromGenerator, } from './codegen/spanLoggerGenerator.js';
3
+ import { Blocked } from './errors/Blocked.js';
4
+ import { TransientError } from './errors/Transient.js';
5
+ import { Op } from './op.js';
6
+ import { Err, hasErrorCode, Ok } from './result.js';
7
+ import { ENTRY_TYPE_SPAN_ERR, ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_OK, ENTRY_TYPE_SPAN_RETRY, } from './schema/systemSchema.js';
8
+ // Note: TraceRoot.writeSpanStart() is used instead of direct timestamp writes.
9
+ // The platform-specific TraceRoot (traceRoot.es.ts or traceRoot.node.ts) handles
10
+ // timestamp calculation and writes to buffer._system columns.
11
+ // =============================================================================
12
+ // SpanContext Symbol Marker
13
+ // =============================================================================
14
+ /**
15
+ * Internal symbol to mark span contexts
16
+ * Used for type guards and prototype chain detection
17
+ */
18
+ export const SPAN_CONTEXT_MARKER = Symbol.for('lmao.SpanContext');
19
+ function isOpInstance(value) {
20
+ return value instanceof Op;
21
+ }
22
+ // WHY: resolveSpanTarget() accepts either an Op instance or a raw span
23
+ // function. TypeScript needs an explicit predicate here to preserve the call
24
+ // signature when the non-Op branch passes `value` through as `fn`.
25
+ function isSpanDispatchFn(value) {
26
+ return typeof value === 'function';
27
+ }
28
+ function isSpanBufferConstructorForSchema(value, schema) {
29
+ return (typeof value === 'function' &&
30
+ Reflect.get(value, 'schema') === schema &&
31
+ typeof Reflect.get(value, 'stats') === 'object');
32
+ }
33
+ function getBufferConstructor(buffer) {
34
+ const ctor = buffer.constructor;
35
+ if (!isSpanBufferConstructorForSchema(ctor, buffer._logSchema)) {
36
+ throw new TypeError('Span buffer constructor does not match the buffer schema');
37
+ }
38
+ return ctor;
39
+ }
40
+ function isSpanBufferForSchema(buffer, schema) {
41
+ return (typeof buffer === 'object' &&
42
+ buffer !== null &&
43
+ Reflect.get(buffer, '_logSchema') === schema &&
44
+ isSpanBufferConstructorForSchema(Reflect.get(buffer, 'constructor'), schema));
45
+ }
46
+ function isSpanContextInstance(value) {
47
+ return (isSpanContext(value) &&
48
+ Reflect.has(value, '_buffer') &&
49
+ Reflect.has(value, '_spanLogger') &&
50
+ Reflect.has(value, '_schema'));
51
+ }
52
+ function createInheritedContext(parent) {
53
+ const child = Object.create(parent);
54
+ if (!isSpanContextInstance(child)) {
55
+ throw new TypeError('Failed to create child span context');
56
+ }
57
+ return child;
58
+ }
59
+ function createInheritedContextWithOverrides(parent, overrides) {
60
+ const child = Object.assign(Object.create(parent), overrides);
61
+ if (!isSpanContextInstance(child)) {
62
+ throw new TypeError('Failed to create overridden child span context');
63
+ }
64
+ return child;
65
+ }
66
+ function readStringArgument(args, index, label) {
67
+ const value = args[index];
68
+ if (typeof value !== 'string') {
69
+ throw new TypeError(`${label} must be a string`);
70
+ }
71
+ return value;
72
+ }
73
+ function resolveSpanTarget(value, fallbackBuffer) {
74
+ if (isOpInstance(value)) {
75
+ return {
76
+ SpanBufferClass: value.SpanBufferClass,
77
+ remappedViewClass: value.remappedViewClass,
78
+ opMetadata: value.metadata,
79
+ fn: value.fn,
80
+ };
81
+ }
82
+ if (!isSpanDispatchFn(value)) {
83
+ throw new TypeError('span() expects an Op or function');
84
+ }
85
+ return {
86
+ SpanBufferClass: getBufferConstructor(fallbackBuffer),
87
+ remappedViewClass: undefined,
88
+ opMetadata: fallbackBuffer._opMetadata,
89
+ fn: value,
90
+ };
91
+ }
92
+ // =============================================================================
93
+ // Helper Functions
94
+ // =============================================================================
95
+ /**
96
+ * Write span-start entry to buffer at row 0 (fixed layout)
97
+ * Pre-initialize row 1 as span-exception (will be overwritten by ok/err)
98
+ * Set writeIndex to 2 (events start after reserved rows)
99
+ *
100
+ * Per specs/lmao/01h_entry_types_and_logging_primitives.md:
101
+ * - Row 0: span-start (written here)
102
+ * - Row 1: span-end (pre-initialized as exception, overwritten by ok/err)
103
+ * - Row 2+: events (ctx.log.* appends here)
104
+ *
105
+ * @param buffer - SpanBuffer to write to
106
+ * @param spanName - Name for this span
107
+ */
108
+ export function writeSpanStart(buffer, spanName) {
109
+ // Delegate to TraceRoot - platform-specific implementation handles timestamps
110
+ buffer._traceRoot.writeSpanStart(buffer, spanName);
111
+ }
112
+ /**
113
+ * Create a SpanLogger for the given buffer.
114
+ *
115
+ * Per specs/lmao/01i_span_scope_attributes.md: Scope values are stored directly on buffer._scopeValues.
116
+ * The SpanLogger reads/writes scope via buffer._scopeValues - no separate Scope class needed.
117
+ *
118
+ * @param schema - Tag attribute schema with field definitions
119
+ * @param buffer - SpanBuffer to write entries to (per-span instance)
120
+ * @returns SpanLogger with typed methods matching schema
121
+ */
122
+ export function createSpanLogger(schema, buffer) {
123
+ return createSpanLoggerFromGenerator(schema, buffer);
124
+ }
125
+ /**
126
+ * Calculate delay for retry based on policy and attempt number.
127
+ *
128
+ * @param policy - RetryPolicy from TransientError
129
+ * @param attempt - Current attempt number (1-indexed)
130
+ * @returns Delay in milliseconds before next retry
131
+ */
132
+ function calculateDelay(policy, attempt) {
133
+ let delay;
134
+ switch (policy.backoff) {
135
+ case 'exponential':
136
+ // Delay doubles each attempt: baseDelay * 2^(attempt-1)
137
+ delay = Math.min(policy.baseDelayMs * 2 ** (attempt - 1), policy.maxDelayMs ?? 30000);
138
+ break;
139
+ case 'linear':
140
+ // Delay increases linearly: baseDelay * attempt
141
+ delay = Math.min(policy.baseDelayMs * attempt, policy.maxDelayMs ?? 30000);
142
+ break;
143
+ case 'fixed':
144
+ // Same delay between each attempt
145
+ delay = policy.baseDelayMs;
146
+ break;
147
+ default:
148
+ delay = policy.baseDelayMs;
149
+ }
150
+ // Apply jitter if enabled (default true) - random value between 0 and delay
151
+ if (policy.jitter !== false) {
152
+ delay = Math.floor(Math.random() * delay);
153
+ }
154
+ return delay;
155
+ }
156
+ /**
157
+ * Write span-retry entry to buffer.
158
+ *
159
+ * Per specs/lmao/01h_entry_types_and_logging_primitives.md:
160
+ * - span-retry appends to Row 2+ in parent span buffer (like log entries)
161
+ * - Trace-only entry (NOT written to event log)
162
+ * - Contains: attempt number, error code, and delay until next attempt
163
+ *
164
+ * @param buffer - SpanBuffer to write to (appends at _writeIndex)
165
+ * @param attempt - Attempt number (1-indexed)
166
+ * @param error - TransientError that triggered the retry
167
+ * @param delayMs - Delay before next attempt
168
+ */
169
+ function writeRetryEntry(buffer, attempt, error, delayMs) {
170
+ // Get current write index and advance for next write
171
+ const index = buffer._writeIndex;
172
+ // Write entry via TraceRoot for timestamp handling
173
+ // TraceRoot.writeLogEntry writes timestamp and entry_type at the given index
174
+ buffer._traceRoot.writeLogEntry(buffer, ENTRY_TYPE_SPAN_RETRY);
175
+ // Write retry-specific message: retry:op:{opName} for prefix-based querying
176
+ const opName = buffer._opMetadata?.name ?? 'unknown';
177
+ buffer.message(index, `retry:op:${opName}`);
178
+ // Write error code if available
179
+ if (error.code) {
180
+ buffer.error_code(index, error.code);
181
+ }
182
+ // Retry metadata fields for direct queryability in Arrow output
183
+ buffer.retry_attempt(index, attempt);
184
+ buffer.retry_delay_ms(index, delayMs);
185
+ }
186
+ /**
187
+ * Sleep for the specified duration.
188
+ *
189
+ * @param ms - Duration in milliseconds
190
+ * @returns Promise that resolves after the delay
191
+ */
192
+ function sleep(ms) {
193
+ return new Promise((resolve) => setTimeout(resolve, ms));
194
+ }
195
+ /**
196
+ * Execute function with retry loop for TransientError handling.
197
+ *
198
+ * Per plan 19-03: Op class handles retry loop internally.
199
+ * - TransientError from op body triggers retry based on error.policy
200
+ * - Retry respects maxAttempts from TransientError.policy
201
+ * - span-retry entry written for each transient failure
202
+ * - Only final result written as span-ok or span-err
203
+ * - BlockedError returns immediately without retry
204
+ *
205
+ * @param buffer - SpanBuffer to write retry entries to
206
+ * @param fn - Function to execute (may be retried)
207
+ * @returns Final result (success, non-transient error, or exhausted transient error)
208
+ */
209
+ async function executeWithRetry(buffer, fn) {
210
+ let attempt = 0;
211
+ while (true) {
212
+ attempt++;
213
+ // Execute the function
214
+ const result = await fn();
215
+ // Success - return immediately
216
+ if (result instanceof Ok) {
217
+ return result;
218
+ }
219
+ // Error result - check error type for retry behavior
220
+ const error = result.error;
221
+ // BlockedError - return immediately, no retry
222
+ if (error instanceof Blocked) {
223
+ return result;
224
+ }
225
+ // TransientError - check if we should retry
226
+ if (error instanceof TransientError) {
227
+ const { policy } = error;
228
+ // Check attempt limit (maxAttempts includes initial attempt)
229
+ if (attempt >= policy.maxAttempts) {
230
+ // Exhausted - return final error
231
+ return result;
232
+ }
233
+ // Calculate delay based on policy and attempt number
234
+ const delay = calculateDelay(policy, attempt);
235
+ // Write span-retry entry to buffer for observability
236
+ writeRetryEntry(buffer, attempt, error, delay);
237
+ // Wait before retry
238
+ await sleep(delay);
239
+ continue;
240
+ }
241
+ // Non-transient error - return immediately
242
+ return result;
243
+ }
244
+ }
245
+ /**
246
+ * Write span-end entry to buffer at row 1.
247
+ *
248
+ * Called by span methods after fn() returns to write:
249
+ * - entry_type (SPAN_OK or SPAN_ERR based on result instanceof)
250
+ * - timestamp
251
+ * - error_code (for Err only)
252
+ * - result row attributes already written eagerly by the fixed-position ResultWriter
253
+ *
254
+ * @param buffer - SpanBuffer to write to
255
+ * @param result - The result returned by the span function
256
+ */
257
+ export function writeSpanEnd(buffer, result) {
258
+ // Write entry_type and timestamp via TraceRoot (platform-specific)
259
+ if (result instanceof Ok) {
260
+ buffer._traceRoot.writeSpanEnd(buffer, ENTRY_TYPE_SPAN_OK);
261
+ }
262
+ else if (result instanceof Err) {
263
+ buffer._traceRoot.writeSpanEnd(buffer, ENTRY_TYPE_SPAN_ERR);
264
+ // Write error_code if the error has a code property
265
+ if (hasErrorCode(result.error)) {
266
+ buffer.error_code(1, result.error.code);
267
+ }
268
+ }
269
+ }
270
+ // =============================================================================
271
+ // SpanContext Class Factory
272
+ // =============================================================================
273
+ /**
274
+ * Create a SpanContext class for the given schema and logBinding.
275
+ *
276
+ * The returned class:
277
+ * - Closes over schema/logBinding (available to all methods)
278
+ * - Constructor takes buffer, spanLogger, tag directly (no temp object allocation)
279
+ * - Uses prototype methods for internal methods (_spanPre, _spanException, span0-span8)
280
+ * - Supports context inheritance via Object.create(parent) for child spans
281
+ * - Supports context overrides via own properties shadowing inherited ones
282
+ *
283
+ * @param schemaOnly - Tag attribute schema
284
+ * @param logBinding - LogBinding with schema and stats
285
+ * @returns Class constructor for SpanContext instances
286
+ */
287
+ export function createSpanContextClass(_schemaOnly, logBinding) {
288
+ /**
289
+ * SpanContext implementation class.
290
+ *
291
+ * Constructor takes core values directly so arrow functions can close over them,
292
+ * avoiding both temp object allocation and property lookups in hot paths.
293
+ */
294
+ class SpanContextImpl {
295
+ // Core properties set via constructor
296
+ _buffer;
297
+ _schema;
298
+ _spanLogger;
299
+ _logBinding = logBinding;
300
+ // User-facing properties
301
+ tag;
302
+ log;
303
+ ff;
304
+ deps;
305
+ // Arrow functions that close over constructor args directly
306
+ setScope;
307
+ ok;
308
+ err;
309
+ span;
310
+ spanSync;
311
+ constructor(buffer, schema, spanLogger, tag) {
312
+ this._buffer = buffer;
313
+ this._schema = schema;
314
+ this._spanLogger = spanLogger;
315
+ this.tag = tag;
316
+ this.log = spanLogger;
317
+ // Regular functions close over constructor args directly - no property lookups
318
+ // Using regular function (not arrow) allows destructuring while closing over args
319
+ this.setScope = (attributes) => {
320
+ spanLogger._setScope(attributes ?? {});
321
+ };
322
+ this.ok = (value) => new Ok(value, schema, buffer);
323
+ this.err = (error) => new Err(error, schema, buffer);
324
+ // span uses regular function to access `arguments` (no ...rest spread allocation)
325
+ // Closes over `self` for calling prototype methods
326
+ // Named function for better stack traces
327
+ const self = this;
328
+ const span = function span(nameOrLine, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8, _arg9, _arg10, _arg11) {
329
+ // Use arguments.length instead of ...rest to avoid array allocation
330
+ const len = arguments.length;
331
+ // Detect call pattern:
332
+ // - span(name, fn) - len=2, typeof arg0 === 'string'
333
+ // - span(line, name, fn) - len=3, typeof arg0 === 'number'
334
+ // - span(name, overrides, fn) - len=3, typeof arg0 === 'string', typeof arg1 === 'object'
335
+ // - span(line, name, overrides, fn) - len=4, typeof arg0 === 'number', typeof arg2 === 'object'
336
+ // Plus additional args for span arguments
337
+ const hasLine = typeof nameOrLine === 'number';
338
+ const spanLine = hasLine ? nameOrLine : 0;
339
+ const spanName = hasLine ? readStringArgument(arguments, 1, 'span name') : nameOrLine;
340
+ // Index where fn/op or overrides starts
341
+ const checkIdx = hasLine ? 2 : 1;
342
+ const maybeOverrides = arguments[checkIdx];
343
+ // Check if it's an overrides object (not Op, not function)
344
+ const hasOverrides = maybeOverrides !== null &&
345
+ typeof maybeOverrides === 'object' &&
346
+ !(maybeOverrides instanceof Op) &&
347
+ typeof maybeOverrides !== 'function';
348
+ const fnIdx = checkIdx + (hasOverrides ? 1 : 0);
349
+ const target = resolveSpanTarget(arguments[fnIdx], self._buffer);
350
+ // Create child context - use _newCtx0 or _newCtx1 based on overrides
351
+ const childCtx = hasOverrides ? self._newCtx1(maybeOverrides) : self._newCtx0();
352
+ // Dispatch to monomorphic methods with all Op properties extracted
353
+ const argCount = len - fnIdx - 1;
354
+ switch (argCount) {
355
+ case 0:
356
+ return self.span0(spanLine, spanName, childCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn);
357
+ case 1:
358
+ return self.span1(spanLine, spanName, childCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1]);
359
+ case 2:
360
+ return self.span2(spanLine, spanName, childCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2]);
361
+ case 3:
362
+ return self.span3(spanLine, spanName, childCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3]);
363
+ case 4:
364
+ return self.span4(spanLine, spanName, childCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4]);
365
+ case 5:
366
+ return self.span5(spanLine, spanName, childCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4], arguments[fnIdx + 5]);
367
+ case 6:
368
+ return self.span6(spanLine, spanName, childCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4], arguments[fnIdx + 5], arguments[fnIdx + 6]);
369
+ case 7:
370
+ return self.span7(spanLine, spanName, childCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4], arguments[fnIdx + 5], arguments[fnIdx + 6], arguments[fnIdx + 7]);
371
+ case 8:
372
+ return self.span8(spanLine, spanName, childCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4], arguments[fnIdx + 5], arguments[fnIdx + 6], arguments[fnIdx + 7], arguments[fnIdx + 8]);
373
+ default:
374
+ throw new Error(`span() supports up to 8 arguments, got ${argCount}`);
375
+ }
376
+ };
377
+ this.span = span;
378
+ this.spanSync = function spanSync(name, fn) {
379
+ const childCtx = self._newCtx0();
380
+ return self.spanSync0(0, name, childCtx, getBufferConstructor(self._buffer), undefined, self._buffer._opMetadata, fn);
381
+ };
382
+ }
383
+ // =========================================================================
384
+ // Getters (on prototype, inherited by children)
385
+ // =========================================================================
386
+ get [SPAN_CONTEXT_MARKER]() {
387
+ return true;
388
+ }
389
+ get module() {
390
+ return this._buffer._opMetadata;
391
+ }
392
+ get callee_package() {
393
+ return this._buffer._opMetadata.package_name;
394
+ }
395
+ get callee_file() {
396
+ return this._buffer._opMetadata.package_file;
397
+ }
398
+ get callee_line() {
399
+ // Access the line_values array directly to read line number at row 0
400
+ // line_values is a Float64Array per the system schema (LazyNumberSchema)
401
+ return this._buffer.line_values[0];
402
+ }
403
+ get callee_git_sha() {
404
+ return this._buffer._opMetadata.git_sha;
405
+ }
406
+ get buffer() {
407
+ return this._buffer;
408
+ }
409
+ get scope() {
410
+ return this._buffer._scopeValues;
411
+ }
412
+ // =========================================================================
413
+ // Internal methods (on prototype)
414
+ // =========================================================================
415
+ /**
416
+ * Create a new child context with prototype chain inheritance.
417
+ * Called by transformer for spans without overrides.
418
+ *
419
+ * Transformer emits: ctx.span0(line, name, ctx._newCtx0(), fn)
420
+ */
421
+ _newCtx0() {
422
+ return createInheritedContext(this);
423
+ }
424
+ /**
425
+ * Create a new child context with prototype chain inheritance + user overrides.
426
+ * Called by transformer for spans with overrides.
427
+ *
428
+ * Transformer emits: ctx.span0(line, name, ctx._newCtx1({ requestId }), fn)
429
+ */
430
+ _newCtx1(overrides) {
431
+ return createInheritedContextWithOverrides(this, overrides);
432
+ }
433
+ /**
434
+ * Complete child span context setup - creates buffer, registers with parent.
435
+ * Called by span0-span8 after _newCtx0/_newCtx1 has created the prototype chain.
436
+ *
437
+ * Properties are set in HOT→COLD order per specs/lmao/01b1_buffer_performance_optimizations.md
438
+ * to ensure frequently-accessed properties get V8 in-object slots.
439
+ *
440
+ * @param childCtx - Child context created by _newCtx0 or _newCtx1
441
+ * @param line - Source line number (0 if not provided by transformer)
442
+ * @param name - Child span name
443
+ * @param SpanBufferClass - Buffer class to use (Op's class or parent's class for plain functions)
444
+ * @param remappedViewClass - Optional view class for prefixed ops (wraps buffer for Arrow conversion)
445
+ * @param opMetadata - Metadata for the executing op (Op's metadata or parent's for plain functions)
446
+ */
447
+ _spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata) {
448
+ // Get Op's schema for cross-library calls (child may have different schema than parent)
449
+ const childSchema = SpanBufferClass.schema;
450
+ // Use buffer strategy for child span creation (supports both JS and WASM buffers)
451
+ // Pass schema for cross-library calls where child has different schema than parent
452
+ const createdBuffer = this._buffer._traceRoot.tracer.bufferStrategy.createChildSpanBuffer(this._buffer, // parentBuffer
453
+ this._buffer._opMetadata, // callsiteMetadata - WHO called span() (for row 0)
454
+ opMetadata, // opMetadata - WHICH op is executing (for rows 1+)
455
+ undefined, // capacity - use default
456
+ childSchema);
457
+ if (!isSpanBufferForSchema(createdBuffer, childSchema)) {
458
+ throw new TypeError('Child span buffer does not match the requested schema');
459
+ }
460
+ const childBuffer = createdBuffer;
461
+ // Why wrap buffer: RemappedBufferView translates prefixed column names during Arrow conversion
462
+ // Parent sees remapped names, child sees unprefixed names (transparent to child)
463
+ const bufferOrView = remappedViewClass ? new remappedViewClass(childBuffer) : childBuffer;
464
+ // Why push wrapped buffer: Parent's _children see remapped names for Arrow conversion
465
+ this._buffer._children.push(bufferOrView);
466
+ // Write span-start for child span (row 0) and pre-initialize span-end (row 1)
467
+ writeSpanStart(childBuffer, name);
468
+ // Write line number to row 0 (line() takes pos and value)
469
+ childBuffer.line(0, line);
470
+ const childLogger = createSpanLogger(childSchema, childBuffer);
471
+ const childTagAPI = createTagWriter(childSchema, childBuffer);
472
+ // Cast to impl for property assignment
473
+ const ctx = childCtx;
474
+ // ═══════════════════════════════════════════════════════════════════
475
+ // PROPERTY ASSIGNMENT ORDER: HOT → COLD (V8 in-object slots optimization)
476
+ // First ~10-12 properties get fast in-object slots per spec
477
+ // ═══════════════════════════════════════════════════════════════════
478
+ // SLOT 1-4: HOTTEST - accessed on every span operation
479
+ ctx._buffer = childBuffer;
480
+ ctx._spanLogger = childLogger;
481
+ ctx.tag = childTagAPI;
482
+ ctx.log = childLogger;
483
+ // SLOT 5-7: HOT - reserved keys copied from parent for O(1) access
484
+ ctx.deps = this.deps;
485
+ // Create child-bound FF evaluator so flag access logs to child buffer
486
+ // If no evaluator (ff is EMPTY_SCOPE), just copy the reference
487
+ ctx.ff = this.ff.forContext ? this.ff.forContext(ctx) : this.ff;
488
+ // Note: user-defined extras (env, requestId, etc.) inherited via prototype chain
489
+ // SLOT 8-11: WARM - function properties (created per-context for destructuring)
490
+ // Regular functions close over local variables directly - no property lookups
491
+ const childSpan = function span(nameOrLine, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8, _arg9, _arg10, _arg11) {
492
+ const len = arguments.length;
493
+ const hasLine = typeof nameOrLine === 'number';
494
+ const spanLine = hasLine ? nameOrLine : 0;
495
+ const spanName = hasLine ? readStringArgument(arguments, 1, 'span name') : nameOrLine;
496
+ const checkIdx = hasLine ? 2 : 1;
497
+ const maybeOverrides = arguments[checkIdx];
498
+ const hasOverrides = maybeOverrides !== null &&
499
+ typeof maybeOverrides === 'object' &&
500
+ !(maybeOverrides instanceof Op) &&
501
+ typeof maybeOverrides !== 'function';
502
+ const fnIdx = checkIdx + (hasOverrides ? 1 : 0);
503
+ const target = resolveSpanTarget(arguments[fnIdx], childBuffer);
504
+ // Create child context - use _newCtx0 or _newCtx1 based on overrides
505
+ const newChildCtx = hasOverrides ? ctx._newCtx1(maybeOverrides) : ctx._newCtx0();
506
+ const argCount = len - fnIdx - 1;
507
+ switch (argCount) {
508
+ case 0:
509
+ return ctx.span0(spanLine, spanName, newChildCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn);
510
+ case 1:
511
+ return ctx.span1(spanLine, spanName, newChildCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1]);
512
+ case 2:
513
+ return ctx.span2(spanLine, spanName, newChildCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2]);
514
+ case 3:
515
+ return ctx.span3(spanLine, spanName, newChildCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3]);
516
+ case 4:
517
+ return ctx.span4(spanLine, spanName, newChildCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4]);
518
+ case 5:
519
+ return ctx.span5(spanLine, spanName, newChildCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4], arguments[fnIdx + 5]);
520
+ case 6:
521
+ return ctx.span6(spanLine, spanName, newChildCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4], arguments[fnIdx + 5], arguments[fnIdx + 6]);
522
+ case 7:
523
+ return ctx.span7(spanLine, spanName, newChildCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4], arguments[fnIdx + 5], arguments[fnIdx + 6], arguments[fnIdx + 7]);
524
+ case 8:
525
+ return ctx.span8(spanLine, spanName, newChildCtx, target.SpanBufferClass, target.remappedViewClass, target.opMetadata, target.fn, arguments[fnIdx + 1], arguments[fnIdx + 2], arguments[fnIdx + 3], arguments[fnIdx + 4], arguments[fnIdx + 5], arguments[fnIdx + 6], arguments[fnIdx + 7], arguments[fnIdx + 8]);
526
+ default:
527
+ throw new Error(`span() supports up to 8 arguments, got ${argCount}`);
528
+ }
529
+ };
530
+ ctx.span = childSpan;
531
+ ctx.spanSync = function spanSync(name, fn) {
532
+ const newChildCtx = ctx._newCtx0();
533
+ return ctx.spanSync0(0, name, newChildCtx, getBufferConstructor(childBuffer), undefined, childBuffer._opMetadata, fn);
534
+ };
535
+ ctx.ok = function ok(value) {
536
+ return new Ok(value, childSchema, childBuffer);
537
+ };
538
+ ctx.err = function err(error) {
539
+ return new Err(error, childSchema, childBuffer);
540
+ };
541
+ ctx.setScope = function setScope(attributes) {
542
+ childLogger._setScope(attributes ?? {});
543
+ };
544
+ // SLOT 12+: COLD - internal/rarely accessed
545
+ ctx._schema = childSchema;
546
+ ctx._logBinding = logBinding;
547
+ return ctx;
548
+ }
549
+ /**
550
+ * Handle span exception - writes exception details to row 1.
551
+ * Called in catch blocks of span methods.
552
+ */
553
+ _spanException(childBuffer, error) {
554
+ // Write entry_type and timestamp via TraceRoot (platform-specific)
555
+ childBuffer._traceRoot.writeSpanEnd(childBuffer, ENTRY_TYPE_SPAN_EXCEPTION);
556
+ const errorMessage = error instanceof Error ? error.message : String(error);
557
+ const errorStack = error instanceof Error ? error.stack : undefined;
558
+ childBuffer.message(1, errorMessage);
559
+ if (errorStack) {
560
+ childBuffer.exception_stack(1, errorStack);
561
+ }
562
+ }
563
+ // =========================================================================
564
+ // Monomorphic span methods (for transformer output)
565
+ // Transformer emits: ctx.span0(line, name, ctx, fn) or
566
+ // ctx.span0(line, name, Object.assign(Object.create(ctx), overrides), fn)
567
+ // childCtx inherits from parent via prototype chain, may have user overrides as own properties
568
+ // =========================================================================
569
+ spanSync0(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn) {
570
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
571
+ const buffer = ctx._buffer;
572
+ buffer._traceRoot.tracer.onSpanStart(buffer);
573
+ try {
574
+ const result = fn(ctx);
575
+ writeSpanEnd(buffer, result);
576
+ return result;
577
+ }
578
+ catch (error) {
579
+ this._spanException(buffer, error);
580
+ throw error;
581
+ }
582
+ finally {
583
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
584
+ }
585
+ }
586
+ async span0(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn) {
587
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
588
+ const buffer = ctx._buffer;
589
+ buffer._traceRoot.tracer.onSpanStart(buffer);
590
+ try {
591
+ // Execute with retry loop - TransientError triggers retry, BlockedError returns immediately
592
+ const result = await executeWithRetry(buffer, () => fn(ctx));
593
+ writeSpanEnd(buffer, result);
594
+ return result;
595
+ }
596
+ catch (error) {
597
+ this._spanException(buffer, error);
598
+ throw error;
599
+ }
600
+ finally {
601
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
602
+ }
603
+ }
604
+ async span1(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn, a1) {
605
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
606
+ const buffer = ctx._buffer;
607
+ buffer._traceRoot.tracer.onSpanStart(buffer);
608
+ try {
609
+ // Execute with retry loop - TransientError triggers retry, BlockedError returns immediately
610
+ const result = await executeWithRetry(buffer, () => fn(ctx, a1));
611
+ writeSpanEnd(buffer, result);
612
+ return result;
613
+ }
614
+ catch (error) {
615
+ this._spanException(buffer, error);
616
+ throw error;
617
+ }
618
+ finally {
619
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
620
+ }
621
+ }
622
+ async span2(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn, a1, a2) {
623
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
624
+ const buffer = ctx._buffer;
625
+ buffer._traceRoot.tracer.onSpanStart(buffer);
626
+ try {
627
+ // Execute with retry loop - TransientError triggers retry, BlockedError returns immediately
628
+ const result = await executeWithRetry(buffer, () => fn(ctx, a1, a2));
629
+ writeSpanEnd(buffer, result);
630
+ return result;
631
+ }
632
+ catch (error) {
633
+ this._spanException(buffer, error);
634
+ throw error;
635
+ }
636
+ finally {
637
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
638
+ }
639
+ }
640
+ async span3(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn, a1, a2, a3) {
641
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
642
+ const buffer = ctx._buffer;
643
+ buffer._traceRoot.tracer.onSpanStart(buffer);
644
+ try {
645
+ // Execute with retry loop - TransientError triggers retry, BlockedError returns immediately
646
+ const result = await executeWithRetry(buffer, () => fn(ctx, a1, a2, a3));
647
+ writeSpanEnd(buffer, result);
648
+ return result;
649
+ }
650
+ catch (error) {
651
+ this._spanException(buffer, error);
652
+ throw error;
653
+ }
654
+ finally {
655
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
656
+ }
657
+ }
658
+ async span4(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn, a1, a2, a3, a4) {
659
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
660
+ const buffer = ctx._buffer;
661
+ buffer._traceRoot.tracer.onSpanStart(buffer);
662
+ try {
663
+ // Execute with retry loop - TransientError triggers retry, BlockedError returns immediately
664
+ const result = await executeWithRetry(buffer, () => fn(ctx, a1, a2, a3, a4));
665
+ writeSpanEnd(buffer, result);
666
+ return result;
667
+ }
668
+ catch (error) {
669
+ this._spanException(buffer, error);
670
+ throw error;
671
+ }
672
+ finally {
673
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
674
+ }
675
+ }
676
+ async span5(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn, a1, a2, a3, a4, a5) {
677
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
678
+ const buffer = ctx._buffer;
679
+ buffer._traceRoot.tracer.onSpanStart(buffer);
680
+ try {
681
+ // Execute with retry loop - TransientError triggers retry, BlockedError returns immediately
682
+ const result = await executeWithRetry(buffer, () => fn(ctx, a1, a2, a3, a4, a5));
683
+ writeSpanEnd(buffer, result);
684
+ return result;
685
+ }
686
+ catch (error) {
687
+ this._spanException(buffer, error);
688
+ throw error;
689
+ }
690
+ finally {
691
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
692
+ }
693
+ }
694
+ async span6(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn, a1, a2, a3, a4, a5, a6) {
695
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
696
+ const buffer = ctx._buffer;
697
+ buffer._traceRoot.tracer.onSpanStart(buffer);
698
+ try {
699
+ // Execute with retry loop - TransientError triggers retry, BlockedError returns immediately
700
+ const result = await executeWithRetry(buffer, () => fn(ctx, a1, a2, a3, a4, a5, a6));
701
+ writeSpanEnd(buffer, result);
702
+ return result;
703
+ }
704
+ catch (error) {
705
+ this._spanException(buffer, error);
706
+ throw error;
707
+ }
708
+ finally {
709
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
710
+ }
711
+ }
712
+ async span7(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn, a1, a2, a3, a4, a5, a6, a7) {
713
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
714
+ const buffer = ctx._buffer;
715
+ buffer._traceRoot.tracer.onSpanStart(buffer);
716
+ try {
717
+ // Execute with retry loop - TransientError triggers retry, BlockedError returns immediately
718
+ const result = await executeWithRetry(buffer, () => fn(ctx, a1, a2, a3, a4, a5, a6, a7));
719
+ writeSpanEnd(buffer, result);
720
+ return result;
721
+ }
722
+ catch (error) {
723
+ this._spanException(buffer, error);
724
+ throw error;
725
+ }
726
+ finally {
727
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
728
+ }
729
+ }
730
+ async span8(line, name, childCtx, SpanBufferClass, remappedViewClass, opMetadata, fn, a1, a2, a3, a4, a5, a6, a7, a8) {
731
+ const ctx = this._spanPre(childCtx, line, name, SpanBufferClass, remappedViewClass, opMetadata);
732
+ const buffer = ctx._buffer;
733
+ buffer._traceRoot.tracer.onSpanStart(buffer);
734
+ try {
735
+ // Execute with retry loop - TransientError triggers retry, BlockedError returns immediately
736
+ const result = await executeWithRetry(buffer, () => fn(ctx, a1, a2, a3, a4, a5, a6, a7, a8));
737
+ writeSpanEnd(buffer, result);
738
+ return result;
739
+ }
740
+ catch (error) {
741
+ this._spanException(buffer, error);
742
+ throw error;
743
+ }
744
+ finally {
745
+ buffer._traceRoot.tracer.onSpanEnd(buffer);
746
+ }
747
+ }
748
+ }
749
+ const SpanContextCtor = SpanContextImpl;
750
+ return SpanContextCtor;
751
+ }
752
+ // =============================================================================
753
+ // Type Guard
754
+ // =============================================================================
755
+ /**
756
+ * Type guard to check if a value is a SpanContext
757
+ */
758
+ export function isSpanContext(value) {
759
+ return (typeof value === 'object' &&
760
+ value !== null &&
761
+ SPAN_CONTEXT_MARKER in value &&
762
+ Reflect.get(value, SPAN_CONTEXT_MARKER) === true);
763
+ }