@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,715 @@
1
+ /**
2
+ * Runtime code generation for SpanLogger classes
3
+ *
4
+ * Per specs/lmao/01g_trace_context_api_codegen.md and 01j_module_context_and_spanlogger_generation.md:
5
+ * - SpanLogger extends ColumnWriter from arrow-builder via codegen extension
6
+ * - Handles log entries (rows 2+) - tag writing is in TagWriter (row 0)
7
+ * - Uses _nextRow() to advance position, then fluent setters write at _writeIndex
8
+ * - Compile-time enum mapping for 1-byte storage
9
+ * - Direct buffer writes without intermediate objects
10
+ *
11
+ * Row layout in SpanBuffer:
12
+ * - Row 0: tag attributes (written by TagWriter)
13
+ * - Row 1: result (ok/err) entry
14
+ * - Rows 2+: log entries (info/debug/warn/error)
15
+ *
16
+ * SpanLogger starts with _writeIndex = 1, so first _nextRow() makes it 2.
17
+ */
18
+
19
+ import {
20
+ type ColumnEntry,
21
+ type ColumnWriter,
22
+ type ColumnWriterExtension,
23
+ getColumnWriterClass,
24
+ } from '@smoothbricks/arrow-builder';
25
+ import {
26
+ ENTRY_TYPE_DEBUG,
27
+ ENTRY_TYPE_ERROR,
28
+ ENTRY_TYPE_FF_ACCESS,
29
+ ENTRY_TYPE_FF_USAGE,
30
+ ENTRY_TYPE_INFO,
31
+ ENTRY_TYPE_TRACE,
32
+ ENTRY_TYPE_WARN,
33
+ } from '../schema/systemSchema.js';
34
+ import { getEnumValues, getSchemaType } from '../schema/typeGuards.js';
35
+ import type { InferSchema, LogSchema } from '../schema/types.js';
36
+
37
+ import type { AnySpanBuffer, SpanBuffer } from '../types.js';
38
+
39
+ // =============================================================================
40
+ // SINGLETON HELPERS OBJECT
41
+ // =============================================================================
42
+ // Created once at module load, closed over by all generated SpanLogger classes.
43
+ // This avoids recreating the helpers object for each schema.
44
+
45
+ /**
46
+ * Helper functions injected into generated SpanLogger code.
47
+ * Singleton - same object shared by all generated SpanLogger classes.
48
+ */
49
+ export const SPAN_LOGGER_HELPERS: {
50
+ setNullBit: (bitmap: Uint8Array, idx: number) => void;
51
+ fillNullBitmapRange: (bitmap: Uint8Array, startIdx: number, endIdx: number) => void;
52
+ fillBooleanBitmapRange: (bitmap: Uint8Array, startIdx: number, endIdx: number, value: boolean) => void;
53
+ } = {
54
+ setNullBit: (bitmap: Uint8Array, idx: number) => {
55
+ bitmap[idx >>> 3] |= 1 << (idx & 7);
56
+ },
57
+ fillNullBitmapRange: (bitmap: Uint8Array, startIdx: number, endIdx: number) => {
58
+ // Fill null bitmap for range [startIdx, endIdx)
59
+ const startByte = startIdx >>> 3;
60
+ const endByte = (endIdx - 1) >>> 3;
61
+
62
+ if (startByte === endByte) {
63
+ // All bits in same byte
64
+ for (let i = startIdx; i < endIdx; i++) {
65
+ bitmap[i >>> 3] |= 1 << (i & 7);
66
+ }
67
+ } else {
68
+ // Handle first partial byte
69
+ const startBit = startIdx & 7;
70
+ if (startBit !== 0) {
71
+ bitmap[startByte] |= 0xff << startBit;
72
+ } else {
73
+ bitmap[startByte] = 0xff;
74
+ }
75
+
76
+ // Fill middle bytes
77
+ for (let b = startByte + 1; b < endByte; b++) {
78
+ bitmap[b] = 0xff;
79
+ }
80
+
81
+ // Handle last partial byte
82
+ const endBit = endIdx & 7;
83
+ if (endBit !== 0) {
84
+ bitmap[endByte] |= (1 << endBit) - 1;
85
+ } else {
86
+ bitmap[endByte] = 0xff;
87
+ }
88
+ }
89
+ },
90
+ fillBooleanBitmapRange: (bitmap: Uint8Array, startIdx: number, endIdx: number, value: boolean) => {
91
+ // Fill boolean bitmap for range with value
92
+ if (value) {
93
+ // Same as fillNullBitmapRange - set bits to 1
94
+ const startByte = startIdx >>> 3;
95
+ const endByte = (endIdx - 1) >>> 3;
96
+
97
+ if (startByte === endByte) {
98
+ for (let i = startIdx; i < endIdx; i++) {
99
+ bitmap[i >>> 3] |= 1 << (i & 7);
100
+ }
101
+ } else {
102
+ const startBit = startIdx & 7;
103
+ if (startBit !== 0) {
104
+ bitmap[startByte] |= 0xff << startBit;
105
+ } else {
106
+ bitmap[startByte] = 0xff;
107
+ }
108
+
109
+ for (let b = startByte + 1; b < endByte; b++) {
110
+ bitmap[b] = 0xff;
111
+ }
112
+
113
+ const endBit = endIdx & 7;
114
+ if (endBit !== 0) {
115
+ bitmap[endByte] |= (1 << endBit) - 1;
116
+ } else {
117
+ bitmap[endByte] = 0xff;
118
+ }
119
+ }
120
+ } else {
121
+ // Clear bits to 0
122
+ const startByte = startIdx >>> 3;
123
+ const endByte = (endIdx - 1) >>> 3;
124
+
125
+ if (startByte === endByte) {
126
+ for (let i = startIdx; i < endIdx; i++) {
127
+ bitmap[i >>> 3] &= ~(1 << (i & 7));
128
+ }
129
+ } else {
130
+ const startBit = startIdx & 7;
131
+ if (startBit !== 0) {
132
+ bitmap[startByte] &= ~(0xff << startBit);
133
+ } else {
134
+ bitmap[startByte] = 0;
135
+ }
136
+
137
+ for (let b = startByte + 1; b < endByte; b++) {
138
+ bitmap[b] = 0;
139
+ }
140
+
141
+ const endBit = endIdx & 7;
142
+ if (endBit !== 0) {
143
+ bitmap[endByte] &= ~((1 << endBit) - 1);
144
+ } else {
145
+ bitmap[endByte] = 0;
146
+ }
147
+ }
148
+ }
149
+ },
150
+ };
151
+
152
+ /**
153
+ * Base SpanLogger interface - core logging methods.
154
+ * Extended by generated implementations with schema-specific methods.
155
+ */
156
+ export interface BaseSpanLogger<T extends LogSchema> {
157
+ /** Log info-level message */
158
+ info(message: string): FluentLogEntry<T>;
159
+ /** Log debug-level message */
160
+ debug(message: string): FluentLogEntry<T>;
161
+ /** Log warning message */
162
+ warn(message: string): FluentLogEntry<T>;
163
+ /** Log error message */
164
+ error(message: string): FluentLogEntry<T>;
165
+ }
166
+
167
+ /**
168
+ * Fluent interface returned by log methods (info, debug, warn, error, trace).
169
+ * Includes system columns (line) plus all schema fields from T.
170
+ * Also includes logging methods for continued chaining (e.g., ctx.log.info('x').info('y'))
171
+ */
172
+ export type FluentLogEntry<T extends LogSchema> = {
173
+ /** Set multiple attributes for this entry */
174
+ with(attributes: Partial<InferSchema<T>>): FluentLogEntry<T>;
175
+ /**
176
+ * Set the source code line number for this log entry.
177
+ * Injected by the LMAO transformer.
178
+ */
179
+ line(lineNumber: number): FluentLogEntry<T>;
180
+ /** Set error code for this entry */
181
+ error_code(code: string): FluentLogEntry<T>;
182
+ /** Set exception stack for this entry */
183
+ exception_stack(stack: string): FluentLogEntry<T>;
184
+ /** Set feature flag value for this entry */
185
+ ff_value(value: string): FluentLogEntry<T>;
186
+ /** Set uint64 value for this entry */
187
+ uint64_value(value: bigint): FluentLogEntry<T>;
188
+
189
+ // Logging methods for continued chaining
190
+ info(message: string): FluentLogEntry<T>;
191
+ debug(message: string): FluentLogEntry<T>;
192
+ warn(message: string): FluentLogEntry<T>;
193
+ error(message: string): FluentLogEntry<T>;
194
+ trace(message: string): FluentLogEntry<T>;
195
+ } & {
196
+ [K in keyof InferSchema<T>]: (value: InferSchema<T>[K]) => FluentLogEntry<T>;
197
+ };
198
+
199
+ /**
200
+ * Complete SpanLogger implementation type (runtime-generated class).
201
+ *
202
+ * Includes:
203
+ * - Core methods (info/debug/warn/error) from BaseSpanLogger
204
+ * - Schema-specific methods from ColumnWriter<T>
205
+ * - Internal methods (_setScope, _writeEntry, etc.)
206
+ *
207
+ * This is the FULL type returned by createSpanLogger().
208
+ * Users see SpanLogger<T> which hides internal methods.
209
+ */
210
+ export type SpanLoggerImpl<T extends LogSchema> = ColumnWriter<T> & {
211
+ info(message: string): FluentLogEntry<T>;
212
+ debug(message: string): FluentLogEntry<T>;
213
+ warn(message: string): FluentLogEntry<T>;
214
+ error(message: string): FluentLogEntry<T>;
215
+ trace(message: string): FluentLogEntry<T>;
216
+ readonly scope: Readonly<Record<string, unknown>>;
217
+ _setScope(attributes: ScopeUpdate<T>): void;
218
+ };
219
+
220
+ export type ScopeUpdate<T extends LogSchema> = {
221
+ [K in keyof InferSchema<T>]?: InferSchema<T>[K] | null;
222
+ };
223
+
224
+ /**
225
+ * Generate enum value mapping code
226
+ * Creates a switch-case statement for compile-time enum mapping
227
+ */
228
+ function generateEnumMapping(fieldName: string, enumValues: readonly string[]): string {
229
+ const cases = enumValues.map((value, index) => ` case ${JSON.stringify(value)}: return ${index};`).join('\n');
230
+
231
+ return `
232
+ function getEnumIndex_${fieldName}(value) {
233
+ switch(value) {
234
+ ${cases}
235
+ default: return 0;
236
+ }
237
+ }`;
238
+ }
239
+
240
+ /**
241
+ * Generate override fluent setters for enum fields.
242
+ * These convert string values to numeric indices before writing to the buffer.
243
+ * The buffer expects numeric indices (after the enum map removal change).
244
+ */
245
+ function generateEnumFluentSetters(enumFieldNames: Set<string>): string {
246
+ const setters: string[] = [];
247
+
248
+ for (const fieldName of enumFieldNames) {
249
+ setters.push(`
250
+ /**
251
+ * Override fluent setter for ${fieldName} to convert string → index.
252
+ * Buffer expects numeric index, not string value.
253
+ */
254
+ ${fieldName}(value) {
255
+ const idx = getEnumIndex_${fieldName}(value);
256
+ this._buffer.${fieldName}(this._writeIndex, idx);
257
+ return this;
258
+ }`);
259
+ }
260
+
261
+ return setters.join('\n');
262
+ }
263
+
264
+ /**
265
+ * Generate _setScope() method code - IMMUTABLE scope semantics
266
+ *
267
+ * Per specs/lmao/01i_span_scope_attributes.md:
268
+ * - Creates NEW frozen object (never mutates existing)
269
+ * - Merge semantics: new values merge with existing
270
+ * - null clears a key, undefined is ignored
271
+ * - Child spans inherit parent scope by reference (safe because immutable)
272
+ * - Scope filling happens at Arrow conversion time, NOT during span execution
273
+ */
274
+ function generateSetScopeMethod(): string {
275
+ // Immutable scope: create new frozen object with merge semantics and null clearing
276
+ // No buffer pre-filling - scope values are filled at Arrow conversion time via SIMD
277
+ return `
278
+ _setScope(attributes) {
279
+ const current = this._buffer._scopeValues || {};
280
+ const next = { ...current };
281
+
282
+ for (const key of Object.keys(attributes)) {
283
+ const value = attributes[key];
284
+ if (value === null) {
285
+ delete next[key];
286
+ } else if (value !== undefined) {
287
+ next[key] = value;
288
+ }
289
+ }
290
+
291
+ this._buffer._scopeValues = Object.freeze(next);
292
+ }`;
293
+ }
294
+
295
+ /**
296
+ * Generate _prefillScopedAttributesOn(buffer) method - UNROLLED per-column with BULK null bitmap fill
297
+ *
298
+ * Takes buffer as argument instead of using this._buffer. This avoids the convoluted
299
+ * pattern of temporarily switching this._buffer for prefill then switching back.
300
+ * Called by _checkOverflow after getting overflow buffer.
301
+ */
302
+ function generatePrefillScopedAttributesMethod(
303
+ schemaFields: readonly ColumnEntry[],
304
+ enumFieldNames: Set<string>,
305
+ ): string {
306
+ const columnFills = schemaFields.map(([fieldName, fieldSchema]) => {
307
+ const columnName = fieldName;
308
+ const lmaoType = getSchemaType(fieldSchema);
309
+
310
+ // Binary columns are not scope-fillable (object payloads can't be bulk-filled)
311
+ if (lmaoType === 'binary') {
312
+ return '';
313
+ }
314
+
315
+ // Boolean uses bit-packed storage - bulk fill using helper
316
+ if (lmaoType === 'boolean') {
317
+ return `
318
+ {
319
+ const scopeValue = buffer._scopeValues?.${fieldName};
320
+ if (scopeValue !== null && scopeValue !== undefined && buffer._${columnName}_values !== undefined) {
321
+ helpers.fillBooleanBitmapRange(buffer.${columnName}_values, startIdx, endIdx, scopeValue);
322
+ helpers.fillNullBitmapRange(buffer.${columnName}_nulls, startIdx, endIdx);
323
+ }
324
+ }`;
325
+ }
326
+
327
+ // Value processing based on type
328
+ let valueExpr = 'scopeValue';
329
+ if (lmaoType === 'enum' && enumFieldNames.has(fieldName)) {
330
+ valueExpr = `getEnumIndex_${fieldName}(scopeValue)`;
331
+ }
332
+
333
+ // For string arrays (category/text), use manual loop instead of fill()
334
+ if (lmaoType === 'category' || lmaoType === 'text') {
335
+ return `
336
+ {
337
+ const scopeValue = buffer._scopeValues?.${fieldName};
338
+ if (scopeValue !== null && scopeValue !== undefined && buffer._${columnName}_values !== undefined) {
339
+ const values = buffer.${columnName}_values;
340
+ for (let i = startIdx; i < endIdx; i++) {
341
+ values[i] = scopeValue;
342
+ }
343
+ helpers.fillNullBitmapRange(buffer.${columnName}_nulls, startIdx, endIdx);
344
+ }
345
+ }`;
346
+ }
347
+
348
+ return `
349
+ {
350
+ const scopeValue = buffer._scopeValues?.${fieldName};
351
+ if (scopeValue !== null && scopeValue !== undefined && buffer._${columnName}_values !== undefined) {
352
+ buffer.${columnName}_values.fill(${valueExpr}, startIdx, endIdx);
353
+ helpers.fillNullBitmapRange(buffer.${columnName}_nulls, startIdx, endIdx);
354
+ }
355
+ }`;
356
+ });
357
+
358
+ // Initial buffer: rows 0-1 reserved for span-start/end, data starts at _writeIndex=2
359
+ // Overflow buffer: no reserved rows, data starts at _writeIndex=0
360
+ // Use buffer._writeIndex as startIdx to handle both cases correctly
361
+ return `
362
+ _prefillScopedAttributesOn(buffer) {
363
+ const startIdx = buffer._writeIndex;
364
+ const endIdx = buffer._capacity;
365
+ ${columnFills.join('\n')}
366
+ }`;
367
+ }
368
+
369
+ /**
370
+ * Build the extension for SpanLogger that extends ColumnWriter
371
+ */
372
+ function buildSpanLoggerExtension(schema: LogSchema): ColumnWriterExtension {
373
+ const schemaFields = schema._columns;
374
+
375
+ // Collect enum mappings
376
+ const enumMappings: string[] = [];
377
+ const enumFieldNames = new Set<string>();
378
+
379
+ for (const [fieldName, fieldSchema] of schemaFields) {
380
+ const lmaoType = getSchemaType(fieldSchema);
381
+ const enumValues = getEnumValues(fieldSchema);
382
+
383
+ if (lmaoType === 'enum' && enumValues) {
384
+ enumMappings.push(generateEnumMapping(fieldName, enumValues));
385
+ enumFieldNames.add(fieldName);
386
+ }
387
+ }
388
+
389
+ // Generate methods
390
+ const setScopeMethod = generateSetScopeMethod();
391
+ const prefillMethod = generatePrefillScopedAttributesMethod(schemaFields, enumFieldNames);
392
+ const enumFluentSetters = generateEnumFluentSetters(enumFieldNames);
393
+
394
+ return {
395
+ constructorParams: '',
396
+
397
+ // Entry type constants (inlined from lmao.ts)
398
+ classPreamble: `
399
+ const ENTRY_TYPE_INFO = ${ENTRY_TYPE_INFO};
400
+ const ENTRY_TYPE_DEBUG = ${ENTRY_TYPE_DEBUG};
401
+ const ENTRY_TYPE_WARN = ${ENTRY_TYPE_WARN};
402
+ const ENTRY_TYPE_ERROR = ${ENTRY_TYPE_ERROR};
403
+ const ENTRY_TYPE_TRACE = ${ENTRY_TYPE_TRACE};
404
+ const ENTRY_TYPE_FF_ACCESS = ${ENTRY_TYPE_FF_ACCESS};
405
+ const ENTRY_TYPE_FF_USAGE = ${ENTRY_TYPE_FF_USAGE};
406
+
407
+ ${enumMappings.join('\n')}
408
+ `,
409
+
410
+ // SpanLogger starts at writeIndex 1, so first nextRow() makes it 2
411
+ // (Rows 0 and 1 are reserved for span-start and span-end)
412
+ // Sync buffer's writeIndex - needed for Arrow conversion
413
+ constructorCode: `
414
+ this._writeIndex = 1;
415
+ this._buffer._writeIndex = 2;
416
+ `,
417
+
418
+ // Check for overflow before writing, switch to overflow buffer if needed.
419
+ // Overflow when _writeIndex >= capacity (buffer is full, no room for this write).
420
+ // Buffer.getOrCreateOverflow() handles: stats notification, capacity tuning, buffer creation.
421
+ // We just need to switch this._buffer and prefill scope on the new buffer.
422
+ methods:
423
+ `_checkOverflow() {
424
+ if (this._buffer._writeIndex >= this._buffer._capacity) {
425
+ this._buffer = this._buffer.getOrCreateOverflow();
426
+ this._prefillScopedAttributesOn(this._buffer);
427
+ }
428
+ }
429
+
430
+ ` +
431
+ // Write an info log entry.
432
+ // writeLogEntry bumps buffer._writeIndex, writes timestamp+entry_type, returns idx.
433
+ // We sync this._writeIndex so fluent setters write at correct row.
434
+ `info(message) {
435
+ this._checkOverflow();
436
+ const idx = this._buffer._traceRoot.writeLogEntry(this._buffer, ENTRY_TYPE_INFO);
437
+ this._writeIndex = idx;
438
+ if (this._buffer.message_values) {
439
+ this._buffer.message_values[idx] = message;
440
+ if (this._buffer.message_nulls) {
441
+ helpers.setNullBit(this._buffer.message_nulls, idx);
442
+ }
443
+ }
444
+ this._buffer.constructor.stats.totalWrites++;
445
+ return this;
446
+ }
447
+
448
+ ` +
449
+ // Write a debug log entry.
450
+ `debug(message) {
451
+ this._checkOverflow();
452
+ const idx = this._buffer._traceRoot.writeLogEntry(this._buffer, ENTRY_TYPE_DEBUG);
453
+ this._writeIndex = idx;
454
+ if (this._buffer.message_values) {
455
+ this._buffer.message_values[idx] = message;
456
+ if (this._buffer.message_nulls) {
457
+ helpers.setNullBit(this._buffer.message_nulls, idx);
458
+ }
459
+ }
460
+ this._buffer.constructor.stats.totalWrites++;
461
+ return this;
462
+ }
463
+
464
+ ` +
465
+ // Write a warn log entry.
466
+ `warn(message) {
467
+ this._checkOverflow();
468
+ const idx = this._buffer._traceRoot.writeLogEntry(this._buffer, ENTRY_TYPE_WARN);
469
+ this._writeIndex = idx;
470
+ if (this._buffer.message_values) {
471
+ this._buffer.message_values[idx] = message;
472
+ if (this._buffer.message_nulls) {
473
+ helpers.setNullBit(this._buffer.message_nulls, idx);
474
+ }
475
+ }
476
+ this._buffer.constructor.stats.totalWrites++;
477
+ return this;
478
+ }
479
+
480
+ ` +
481
+ // Write an error log entry.
482
+ `error(message) {
483
+ this._checkOverflow();
484
+ const idx = this._buffer._traceRoot.writeLogEntry(this._buffer, ENTRY_TYPE_ERROR);
485
+ this._writeIndex = idx;
486
+ if (this._buffer.message_values) {
487
+ this._buffer.message_values[idx] = message;
488
+ if (this._buffer.message_nulls) {
489
+ helpers.setNullBit(this._buffer.message_nulls, idx);
490
+ }
491
+ }
492
+ this._buffer.constructor.stats.totalWrites++;
493
+ return this;
494
+ }
495
+
496
+ ` +
497
+ // Write a trace log entry.
498
+ `trace(message) {
499
+ this._checkOverflow();
500
+ const idx = this._buffer._traceRoot.writeLogEntry(this._buffer, ENTRY_TYPE_TRACE);
501
+ this._writeIndex = idx;
502
+ if (this._buffer.message_values) {
503
+ this._buffer.message_values[idx] = message;
504
+ if (this._buffer.message_nulls) {
505
+ helpers.setNullBit(this._buffer.message_nulls, idx);
506
+ }
507
+ }
508
+ this._buffer.constructor.stats.totalWrites++;
509
+ return this;
510
+ }
511
+
512
+ ` +
513
+ // Set multiple attributes on the current log entry.
514
+ `with(attributes) {
515
+ for (const key in attributes) {
516
+ const value = attributes[key];
517
+ if (value === null || value === undefined) {
518
+ continue;
519
+ }
520
+ const setter = this[key];
521
+ if (typeof setter === 'function') {
522
+ setter.call(this, value);
523
+ }
524
+ }
525
+ return this;
526
+ }
527
+
528
+ ` +
529
+ // Write a feature flag access entry (internal method, not on public type).
530
+ // Called by FeatureFlagEvaluator to log flag access.
531
+ `ffAccess(flagName, value) {
532
+ this._checkOverflow();
533
+ const idx = this._buffer._traceRoot.writeLogEntry(this._buffer, ENTRY_TYPE_FF_ACCESS);
534
+ this._writeIndex = idx;
535
+ if (this._buffer.message_values) {
536
+ this._buffer.message_values[idx] = flagName;
537
+ if (this._buffer.message_nulls) {
538
+ helpers.setNullBit(this._buffer.message_nulls, idx);
539
+ }
540
+ }
541
+ if (this._buffer.ff_value_values) {
542
+ const strValue = value === null || value === undefined ? 'null' : String(value);
543
+ this._buffer.ff_value_values[idx] = strValue;
544
+ if (this._buffer.ff_value_nulls) {
545
+ helpers.setNullBit(this._buffer.ff_value_nulls, idx);
546
+ }
547
+ }
548
+ this._buffer.constructor.stats.totalWrites++;
549
+ }
550
+
551
+ ` +
552
+ // Write a feature flag usage entry (internal method, not on public type).
553
+ // Called by FeatureFlagEvaluator to log flag usage.
554
+ `ffUsage(flagName, context) {
555
+ this._checkOverflow();
556
+ const idx = this._buffer._traceRoot.writeLogEntry(this._buffer, ENTRY_TYPE_FF_USAGE);
557
+ this._writeIndex = idx;
558
+ if (this._buffer.message_values) {
559
+ this._buffer.message_values[idx] = flagName;
560
+ if (this._buffer.message_nulls) {
561
+ helpers.setNullBit(this._buffer.message_nulls, idx);
562
+ }
563
+ }
564
+ this._buffer.constructor.stats.totalWrites++;
565
+ if (context) {
566
+ this.with(context);
567
+ }
568
+ return this;
569
+ }
570
+
571
+ ` +
572
+ // Set the source code line number for the current log entry.
573
+ // Injected by the LMAO transformer after info/debug/warn/error/trace calls.
574
+ // Writes to _writeIndex (the current row).
575
+ `line(lineNumber) {
576
+ const idx = this._writeIndex;
577
+ if (this._buffer.line_values) {
578
+ this._buffer.line_values[idx] = lineNumber;
579
+ if (this._buffer.line_nulls) {
580
+ helpers.setNullBit(this._buffer.line_nulls, idx);
581
+ }
582
+ }
583
+ return this;
584
+ }
585
+
586
+ error_code(code) {
587
+ const idx = this._writeIndex;
588
+ if (this._buffer.error_code_values) {
589
+ this._buffer.error_code_values[idx] = code;
590
+ if (this._buffer.error_code_nulls) {
591
+ helpers.setNullBit(this._buffer.error_code_nulls, idx);
592
+ }
593
+ }
594
+ return this;
595
+ }
596
+
597
+ exception_stack(stack) {
598
+ const idx = this._writeIndex;
599
+ if (this._buffer.exception_stack_values) {
600
+ this._buffer.exception_stack_values[idx] = stack;
601
+ if (this._buffer.exception_stack_nulls) {
602
+ helpers.setNullBit(this._buffer.exception_stack_nulls, idx);
603
+ }
604
+ }
605
+ return this;
606
+ }
607
+
608
+ ff_value(value) {
609
+ const idx = this._writeIndex;
610
+ if (this._buffer.ff_value_values) {
611
+ this._buffer.ff_value_values[idx] = value;
612
+ if (this._buffer.ff_value_nulls) {
613
+ helpers.setNullBit(this._buffer.ff_value_nulls, idx);
614
+ }
615
+ }
616
+ return this;
617
+ }
618
+
619
+ uint64_value(value) {
620
+ const idx = this._writeIndex;
621
+ if (this._buffer.uint64_value_values) {
622
+ this._buffer.uint64_value_values[idx] = value;
623
+ if (this._buffer.uint64_value_nulls) {
624
+ helpers.setNullBit(this._buffer.uint64_value_nulls, idx);
625
+ }
626
+ }
627
+ return this;
628
+ }
629
+
630
+ ` +
631
+ // Get the scope values from buffer directly.
632
+ `get scope() {
633
+ return this._buffer._scopeValues;
634
+ }
635
+
636
+ ${setScopeMethod}
637
+
638
+ ${prefillMethod}
639
+
640
+ ` +
641
+ // Override fluent setters for enum fields to convert string → index
642
+ `${enumFluentSetters}
643
+ `,
644
+
645
+ // Use singleton helpers object (created once at module load)
646
+ dependencies: {
647
+ helpers: SPAN_LOGGER_HELPERS,
648
+ },
649
+ };
650
+ }
651
+
652
+ /**
653
+ * Cache for generated SpanLogger classes per schema.
654
+ */
655
+ const spanLoggerClassCache = new WeakMap<LogSchema, unknown>();
656
+
657
+ function isSpanLoggerConstructor<T extends LogSchema>(
658
+ value: unknown,
659
+ ): value is new (
660
+ buffer: AnySpanBuffer,
661
+ ) => SpanLoggerImpl<T> {
662
+ return typeof value === 'function';
663
+ }
664
+
665
+ /**
666
+ * Create SpanLogger class constructor from schema.
667
+ * This is the cold-path function called at module creation time.
668
+ *
669
+ * SpanLogger extends ColumnWriter and adds:
670
+ * - info(), debug(), warn(), error() methods for log entries
671
+ * - _setScope() for setting scoped attributes
672
+ * - _getNextBuffer() override for SpanBuffer creation on overflow
673
+ *
674
+ * Note: Fluent attribute setters are inherited from ColumnWriter and write at _writeIndex.
675
+ */
676
+ export function createSpanLoggerClass<T extends LogSchema>(
677
+ schema: T,
678
+ ): new (
679
+ buffer: AnySpanBuffer,
680
+ ) => SpanLoggerImpl<T> {
681
+ // Check cache first
682
+ let SpanLoggerClass = spanLoggerClassCache.get(schema);
683
+
684
+ if (!SpanLoggerClass) {
685
+ const extension = buildSpanLoggerExtension(schema);
686
+
687
+ // Use arrow-builder's getColumnWriterClass with our extension
688
+ const WriterClass = getColumnWriterClass(schema, extension);
689
+
690
+ SpanLoggerClass = WriterClass;
691
+
692
+ if (!isSpanLoggerConstructor<LogSchema>(SpanLoggerClass)) {
693
+ throw new Error('Failed to generate SpanLogger constructor');
694
+ }
695
+
696
+ spanLoggerClassCache.set(schema, SpanLoggerClass);
697
+ }
698
+
699
+ if (!isSpanLoggerConstructor<T>(SpanLoggerClass)) {
700
+ throw new Error('Invalid cached SpanLogger constructor');
701
+ }
702
+
703
+ return SpanLoggerClass;
704
+ }
705
+
706
+ /**
707
+ * Create a SpanLogger instance for the given buffer.
708
+ *
709
+ * @param schema - Tag attribute schema
710
+ * @param buffer - SpanBuffer to write to
711
+ */
712
+ export function createSpanLogger<T extends LogSchema>(schema: T, buffer: SpanBuffer<T>): SpanLoggerImpl<T> {
713
+ const SpanLoggerClass = createSpanLoggerClass(schema);
714
+ return new SpanLoggerClass(buffer);
715
+ }