@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,130 @@
1
+ /**
2
+ * Context Type Utilities for Op-Centric API
3
+ *
4
+ * Type-level utilities for handling user context property patterns:
5
+ * - Required at createTrace (null sentinel)
6
+ * - Optional (undefined sentinel)
7
+ * - Has default (non-null, non-undefined value)
8
+ *
9
+ * Also includes reserved property validation to prevent conflicts with SpanContext.
10
+ */
11
+
12
+ // =============================================================================
13
+ // RESERVED PROPERTY NAMES
14
+ // =============================================================================
15
+
16
+ /**
17
+ * Reserved property names that cannot be used in user context.
18
+ * These are properties that exist on SpanContext and would cause conflicts.
19
+ */
20
+ export const RESERVED_CONTEXT_PROPS = [
21
+ // Core SpanContext properties
22
+ 'buffer',
23
+ 'tag',
24
+ 'log',
25
+ 'scope',
26
+ 'setScope',
27
+ 'ok',
28
+ 'err',
29
+ 'span',
30
+ 'ff',
31
+ 'deps',
32
+ // Internal properties
33
+ '_buffer',
34
+ '_schema',
35
+ '_spanLogger',
36
+ ] as const;
37
+
38
+ /**
39
+ * Union type of all reserved context property names.
40
+ */
41
+ export type ReservedContextProp = (typeof RESERVED_CONTEXT_PROPS)[number];
42
+
43
+ // =============================================================================
44
+ // CONTEXT TYPE UTILITIES
45
+ // =============================================================================
46
+
47
+ /**
48
+ * Context property patterns:
49
+ *
50
+ * 1. Required at createTrace (null sentinel):
51
+ * `env: null as Env` -> must provide at createTrace, type is Env in SpanContext
52
+ *
53
+ * 2. Optional (undefined sentinel):
54
+ * `userId: undefined as string | undefined` -> optional at createTrace, may be undefined in SpanContext
55
+ *
56
+ * 3. Has default (non-null, non-undefined value):
57
+ * `config: { retryCount: 3 }` -> can override at createTrace, uses default if not provided
58
+ */
59
+
60
+ /**
61
+ * Extract keys where value is exactly `null` (required at trace creation).
62
+ * These MUST be provided at createTrace().
63
+ */
64
+ export type NullKeys<T> = {
65
+ [K in keyof T]: [T[K]] extends [null] ? K : null extends T[K] ? (undefined extends T[K] ? never : K) : never;
66
+ }[keyof T];
67
+
68
+ /**
69
+ * Extract keys where value is `undefined` or includes `undefined` (optional).
70
+ * These are optional at createTrace() and may be undefined in SpanContext.
71
+ */
72
+ export type UndefinedKeys<T> = {
73
+ [K in keyof T]: undefined extends T[K] ? K : never;
74
+ }[keyof T];
75
+
76
+ /**
77
+ * Extract keys with concrete values (neither null nor undefined).
78
+ * These have defaults and are optional to override at createTrace().
79
+ */
80
+ export type DefaultKeys<T> = {
81
+ [K in keyof T]: null extends T[K] ? never : undefined extends T[K] ? never : K;
82
+ }[keyof T];
83
+
84
+ /**
85
+ * Transform user context for SpanContext.
86
+ * - Null properties become their non-null type (filled at createTrace)
87
+ * - Undefined properties stay as potentially undefined
88
+ * - Default properties stay as-is
89
+ */
90
+ export type ResolvedContext<UserCtx> = {
91
+ readonly [K in keyof UserCtx]: null extends UserCtx[K]
92
+ ? undefined extends UserCtx[K]
93
+ ? UserCtx[K] // null | undefined | T -> keep as is (weird case)
94
+ : Exclude<UserCtx[K], null> // null | T -> T (null is sentinel, gets filled)
95
+ : UserCtx[K]; // no null -> keep as is (including undefined if present)
96
+ };
97
+
98
+ /**
99
+ * What MUST be provided at createTrace() - only null sentinel properties.
100
+ */
101
+ export type RequiredContextParams<UserCtx> = {
102
+ [K in NullKeys<UserCtx>]: Exclude<UserCtx[K], null>;
103
+ };
104
+
105
+ /**
106
+ * What CAN be provided at createTrace() - optional and default properties.
107
+ */
108
+ export type OptionalContextParams<UserCtx> = {
109
+ [K in UndefinedKeys<UserCtx> | DefaultKeys<UserCtx>]?: undefined extends UserCtx[K]
110
+ ? UserCtx[K] // Keep undefined in type for optional props
111
+ : UserCtx[K]; // Default props
112
+ };
113
+
114
+ /**
115
+ * Combined context params for createTrace().
116
+ * - Null props are REQUIRED (must provide)
117
+ * - Undefined props are OPTIONAL (can provide or omit)
118
+ * - Default props are OPTIONAL (can override or use default)
119
+ */
120
+ export type TraceContextParams<UserCtx> = RequiredContextParams<UserCtx> & OptionalContextParams<UserCtx>;
121
+
122
+ /**
123
+ * Validate that user context doesn't use reserved property names.
124
+ * Returns `never` with descriptive error if validation fails.
125
+ */
126
+ export type ValidateUserContext<UserCtx> = keyof UserCtx extends infer K
127
+ ? K extends ReservedContextProp
128
+ ? { __error: `'${K & string}' is a reserved SpanContext property and cannot be used in ctx` }
129
+ : UserCtx
130
+ : UserCtx;
@@ -0,0 +1,456 @@
1
+ /**
2
+ * OpGroup Creation - Class-based architecture for Phase 2
3
+ *
4
+ * Creates OpGroups as class instances with ops as own properties.
5
+ * Enables V8 hidden class optimization and cleaner API (`.opName` not `.ops.opName`).
6
+ *
7
+ * Why class-based:
8
+ * - Private fields (#columnMapping) don't affect hidden class (truly hidden, no enumeration)
9
+ * - Ops as own properties enable direct access and predictable object shape
10
+ * - prefix()/mapColumns() create new instances with same SpanBufferClass (shared stats)
11
+ * - Only remappedViewClass differs between original and prefixed op instances
12
+ *
13
+ * Internal properties (_logSchema, _flags, etc.) are prefixed with underscore to avoid
14
+ * collision with user-defined op names. Public interfaces hide these from intellisense.
15
+ *
16
+ * @module opContext/createOpGroup
17
+ */
18
+
19
+ import { generateRemappedBufferViewClass } from '../library.js';
20
+ import { Op } from '../op.js';
21
+ import { SYSTEM_SCHEMA_FIELD_NAMES } from '../schema/systemSchema.js';
22
+ import type { SchemaFields } from '../schema/types.js';
23
+ import type {
24
+ ColumnMapping,
25
+ MappedOpGroup,
26
+ MappedOpGroupInternal,
27
+ MappedSchema,
28
+ OpGroup,
29
+ OpGroupInternal,
30
+ OpGroupOps,
31
+ PrefixedSchema,
32
+ SchemaFieldsOf,
33
+ } from './opGroupTypes.js';
34
+ import { validateOpName } from './opGroupTypes.js';
35
+ import type { OpContext } from './types.js';
36
+
37
+ // =============================================================================
38
+ // INTERNAL HELPERS
39
+ // =============================================================================
40
+
41
+ function getSchemaFields<Schema extends { readonly fields: SchemaFields }>(fieldsSchema: Schema): Schema['fields'] {
42
+ return fieldsSchema.fields;
43
+ }
44
+
45
+ /**
46
+ * Create reverse mapping for RemappedBufferView.
47
+ * Input: clean -> prefixed mapping (e.g., { status: 'http_status' })
48
+ * Output: prefixed -> clean mapping (e.g., { http_status: 'status' })
49
+ *
50
+ * Why reverse: RemappedBufferView wraps child buffer at registration time.
51
+ * Arrow conversion asks for 'http_status', view needs to find 'status' in raw buffer.
52
+ */
53
+ function createReverseMapping(mapping: Record<string, string | null | undefined>): Record<string, string> {
54
+ const reverse: Record<string, string> = {};
55
+ for (const [cleanName, prefixedName] of Object.entries(mapping)) {
56
+ if (typeof prefixedName === 'string') {
57
+ reverse[prefixedName] = cleanName;
58
+ }
59
+ }
60
+ return reverse;
61
+ }
62
+
63
+ function isOpInstance<Ctx extends OpContext>(value: unknown): value is Op<Ctx, unknown[], unknown, unknown> {
64
+ return value instanceof Op;
65
+ }
66
+
67
+ function copyOpsWithView<Ctx extends OpContext>(
68
+ source: OpGroupOps<Ctx>,
69
+ target: Record<string, unknown>,
70
+ remappedViewClass: ReturnType<typeof generateRemappedBufferViewClass>,
71
+ ) {
72
+ for (const [key, value] of Object.entries(source)) {
73
+ if (isOpInstance<Ctx>(value)) {
74
+ target[key] = new Op(value.metadata, value.SpanBufferClass, value.fn, remappedViewClass, value._opContextBinding);
75
+ }
76
+ }
77
+ }
78
+
79
+ function assertGroupCarriesOps<Ctx extends OpContext, Ops extends OpGroupOps<Ctx>>(
80
+ group: Record<string, unknown>,
81
+ ops: Ops,
82
+ ): asserts group is Record<string, unknown> & Ops {
83
+ for (const name of Object.keys(ops)) {
84
+ if (!isOpInstance<Ctx>(group[name])) {
85
+ throw new TypeError(`Expected OpGroup to expose op '${name}' as an Op instance`);
86
+ }
87
+ }
88
+ }
89
+
90
+ function cloneOpsWithView<Ctx extends OpContext, Ops extends OpGroupOps<Ctx>>(
91
+ source: Ops,
92
+ remappedViewClass: ReturnType<typeof generateRemappedBufferViewClass>,
93
+ ): Ops {
94
+ const cloned: Record<string, unknown> = {};
95
+ copyOpsWithView<Ctx>(source, cloned, remappedViewClass);
96
+ assertGroupCarriesOps<Ctx, Ops>(cloned, source);
97
+ return cloned;
98
+ }
99
+
100
+ function prefixContributedSchema<T extends SchemaFields, P extends string>(fields: T, prefix: P): PrefixedSchema<T, P> {
101
+ const result: Record<string, unknown> = {};
102
+ for (const [key, value] of Object.entries(fields)) {
103
+ result[`${prefix}_${key}`] = value;
104
+ }
105
+ assertMappedSchema<PrefixedSchema<T, P>>(result);
106
+ return result;
107
+ }
108
+
109
+ function assertMappedSchema<T extends SchemaFields>(value: Record<string, unknown>): asserts value is T {
110
+ for (const schema of Object.values(value)) {
111
+ if (typeof schema !== 'object' || schema === null) {
112
+ throw new TypeError('Mapped schema must contain schema metadata objects');
113
+ }
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Build a prefix mapping for all schema fields
119
+ *
120
+ * Why prefix all fields: Ensures no column name collisions when wiring multiple libraries.
121
+ * Each library's columns become `${prefix}_${field}` in app schema.
122
+ *
123
+ * @param fieldNames - The field names from the schema
124
+ * @param prefix - The prefix to apply
125
+ * @returns Column mapping where each field becomes `${prefix}_${field}`
126
+ */
127
+ function buildPrefixMapping<T extends SchemaFields, P extends string>(
128
+ fieldNames: readonly string[],
129
+ prefix: P,
130
+ ): ColumnMapping<T> {
131
+ const mapping: Record<string, string> = {};
132
+ for (const name of fieldNames) {
133
+ // Skip system columns - they should NOT be prefixed
134
+ if (SYSTEM_SCHEMA_FIELD_NAMES.has(name)) continue;
135
+ mapping[name] = `${prefix}_${name}`;
136
+ }
137
+ return mapping as ColumnMapping<T>;
138
+ }
139
+
140
+ /**
141
+ * Apply a prefix to an existing mapping
142
+ *
143
+ * For each entry in the mapping:
144
+ * - If mapped to a string, prefix that string: 'status' -> 'http_status'
145
+ * - If mapped to null (dropped), keep as null
146
+ *
147
+ * Why: Enables chaining `.prefix('http').prefix('api')` to build composite prefixes.
148
+ *
149
+ * @param mapping - Existing column mapping
150
+ * @param prefix - Prefix to apply
151
+ * @returns New mapping with prefixed target names
152
+ */
153
+ function prefixMapping<T extends SchemaFields, P extends string>(
154
+ mapping: ColumnMapping<T>,
155
+ prefix: P,
156
+ ): ColumnMapping<T> {
157
+ const result: Record<string, string | null> = {};
158
+ for (const [key, value] of Object.entries(mapping)) {
159
+ if (value === null) {
160
+ result[key] = null;
161
+ } else if (typeof value === 'string') {
162
+ result[key] = `${prefix}_${value}`;
163
+ }
164
+ }
165
+ return result as ColumnMapping<T>;
166
+ }
167
+
168
+ /**
169
+ * Build the contributed schema object from the original schema and mapping
170
+ *
171
+ * The contributed schema reflects what columns this group adds to the app's schema
172
+ * after mapping is applied.
173
+ *
174
+ * Why track contributed schema: Type system needs to know what columns are available
175
+ * after prefix/mapping transformations for compile-time safety.
176
+ *
177
+ * @param fields - Original schema fields
178
+ * @param mapping - Column mapping
179
+ * @returns The contributed schema with renamed keys
180
+ */
181
+ function buildContributedSchema<T extends SchemaFields, M extends ColumnMapping<T>>(
182
+ fields: T,
183
+ mapping: M,
184
+ ): MappedSchema<T, M> {
185
+ const result: Record<string, unknown> = {};
186
+ for (const [key, value] of Object.entries(fields)) {
187
+ const mappedName = mapping[key as keyof M];
188
+ if (mappedName === null) {
189
+ // Dropped column - not included in contributed schema
190
+ } else if (typeof mappedName === 'string') {
191
+ // Explicitly mapped - use the mapped name
192
+ result[mappedName] = value;
193
+ } else {
194
+ // Not in mapping - keep original name
195
+ result[key] = value;
196
+ }
197
+ }
198
+ assertMappedSchema<MappedSchema<T, M>>(result);
199
+ return result;
200
+ }
201
+
202
+ /**
203
+ * Validate all op names in a record.
204
+ * Throws if any name starts with underscore or is a reserved name.
205
+ */
206
+ function validateAllOpNames(ops: Record<string, unknown>): void {
207
+ for (const name of Object.keys(ops)) {
208
+ validateOpName(name);
209
+ }
210
+ }
211
+
212
+ // =============================================================================
213
+ // OP GROUP CLASS - Phase 2 Architecture
214
+ // =============================================================================
215
+
216
+ /**
217
+ * OpGroup class - Holds ops as own properties with private field for mapping state.
218
+ *
219
+ * Why class-based:
220
+ * 1. Private fields don't pollute object shape (no hidden class impact)
221
+ * 2. Ops spread as own properties for direct access (`.request` not `.ops.request`)
222
+ * 3. Prototype methods (prefix/mapColumns) shared across instances
223
+ * 4. Same SpanBufferClass preserved across prefix() calls (shared schema + stats)
224
+ * 5. Only remappedViewClass differs between original and prefixed ops
225
+ *
226
+ * Structure enables V8 optimization:
227
+ * - All OpGroup instances with same ops have same hidden class
228
+ * - Private fields invisible to property enumeration
229
+ * - Method dispatch via prototype (no per-instance copies)
230
+ *
231
+ * Internal properties use underscore prefix (_logSchema, _flags) to avoid
232
+ * collision with user-defined op names.
233
+ */
234
+ class OpGroupImpl<Ctx extends OpContext, Ops extends OpGroupOps<Ctx>> implements OpGroupInternal<Ctx, Ops> {
235
+ // Allow dynamic op properties (ops spread as own properties in constructor)
236
+ [key: string]: unknown;
237
+
238
+ // Private field - truly hidden, doesn't affect hidden class or enumeration
239
+ readonly #columnMapping: ColumnMapping<SchemaFieldsOf<Ctx['logSchema']>>;
240
+ readonly #ops: Ops;
241
+
242
+ constructor(
243
+ readonly _logSchema: Ctx['logSchema'],
244
+ readonly _flags: Ctx['flags'],
245
+ ops: Ops,
246
+ columnMapping?: ColumnMapping<SchemaFieldsOf<Ctx['logSchema']>>,
247
+ ) {
248
+ this.#columnMapping = columnMapping ?? {};
249
+ this.#ops = ops;
250
+
251
+ // Validate op names before spreading
252
+ validateAllOpNames(ops);
253
+
254
+ // Spread ops onto this instance as own properties
255
+ // Why spread: Enables direct access (ctx.deps.http.request)
256
+ for (const [name, op] of Object.entries(ops)) {
257
+ this[name] = op;
258
+ }
259
+ }
260
+
261
+ prefix<P extends string>(p: P): MappedOpGroup<Ctx, PrefixedSchema<Ctx['logSchema']['fields'], P>, Ops> {
262
+ // Apply prefix to the current mapping
263
+ // Check if mapping is non-empty (empty object {} is truthy but has no entries)
264
+ const hasMapping = this.#columnMapping && Object.keys(this.#columnMapping).length > 0;
265
+ const newMapping = hasMapping
266
+ ? prefixMapping(this.#columnMapping, p)
267
+ : buildPrefixMapping(this._logSchema._columnNames, p);
268
+
269
+ // Generate RemappedBufferView for this prefix
270
+ // Why reverse mapping: Arrow conversion asks for 'http_status', needs to find 'status'
271
+ const reverseMapping = createReverseMapping(newMapping);
272
+ const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
273
+
274
+ // Create new OpGroup with prefixed ops
275
+ const newGroup = new MappedOpGroupImpl<Ctx, PrefixedSchema<Ctx['logSchema']['fields'], P>, Ops>(
276
+ this._logSchema,
277
+ this._flags,
278
+ cloneOpsWithView<Ctx, Ops>(this.#ops, remappedViewClass),
279
+ newMapping,
280
+ prefixContributedSchema<Ctx['logSchema']['fields'], P>(getSchemaFields(this._logSchema), p),
281
+ );
282
+
283
+ assertGroupCarriesOps<Ctx, Ops>(newGroup, this.#ops);
284
+ return newGroup;
285
+ }
286
+
287
+ mapColumns<M extends ColumnMapping<Ctx['logSchema']['fields']>>(
288
+ mapping: M,
289
+ ): MappedOpGroup<Ctx, MappedSchema<Ctx['logSchema']['fields'], M>, Ops> {
290
+ // Override/extend the existing mapping with new mapping
291
+ const newMapping = { ...this.#columnMapping, ...mapping };
292
+
293
+ // Generate RemappedBufferView for this mapping
294
+ const reverseMapping = createReverseMapping(newMapping);
295
+ const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
296
+
297
+ // Build contributed schema from original fields with new mapping
298
+ const newContributed = buildContributedSchema<Ctx['logSchema']['fields'], M>(
299
+ getSchemaFields(this._logSchema),
300
+ newMapping,
301
+ );
302
+
303
+ // Create new OpGroup with mapped ops
304
+ const newGroup = new MappedOpGroupImpl<Ctx, MappedSchema<Ctx['logSchema']['fields'], M>, Ops>(
305
+ this._logSchema,
306
+ this._flags,
307
+ cloneOpsWithView<Ctx, Ops>(this.#ops, remappedViewClass),
308
+ newMapping,
309
+ newContributed,
310
+ );
311
+
312
+ assertGroupCarriesOps<Ctx, Ops>(newGroup, this.#ops);
313
+ return newGroup;
314
+ }
315
+ }
316
+
317
+ // =============================================================================
318
+ // MAPPED OP GROUP CLASS
319
+ // =============================================================================
320
+
321
+ /**
322
+ * MappedOpGroup class - OpGroup with column mapping applied.
323
+ *
324
+ * Why separate class: TypeScript needs distinct type for mapped groups
325
+ * to track contributedSchema type parameter.
326
+ *
327
+ * Internal properties use underscore prefix to avoid collision with op names.
328
+ */
329
+ class MappedOpGroupImpl<Ctx extends OpContext, ContributedSchema extends SchemaFields, Ops extends OpGroupOps<Ctx>>
330
+ implements MappedOpGroupInternal<Ctx, ContributedSchema, Ops>
331
+ {
332
+ // Allow dynamic op properties (ops spread as own properties in constructor)
333
+ [key: string]: unknown;
334
+
335
+ readonly #columnMapping: Record<string, string | null | undefined>;
336
+ readonly #ops: Ops;
337
+
338
+ constructor(
339
+ readonly _logSchema: Ctx['logSchema'],
340
+ readonly _flags: Ctx['flags'],
341
+ ops: Ops,
342
+ readonly _columnMapping: ColumnMapping<SchemaFieldsOf<Ctx['logSchema']>>,
343
+ readonly _contributedSchema: ContributedSchema,
344
+ ) {
345
+ this.#columnMapping = _columnMapping;
346
+ this.#ops = ops;
347
+
348
+ // Validate op names before spreading
349
+ validateAllOpNames(ops);
350
+
351
+ // Spread ops onto this instance
352
+ for (const [name, op] of Object.entries(ops)) {
353
+ this[name] = op;
354
+ }
355
+ }
356
+
357
+ prefix<P extends string>(p: P): MappedOpGroup<Ctx, PrefixedSchema<ContributedSchema, P>, Ops> {
358
+ // Apply prefix to the current mapping's target names
359
+ const newMapping = prefixMapping(this.#columnMapping, p);
360
+
361
+ // Generate RemappedBufferView
362
+ const reverseMapping = createReverseMapping(newMapping);
363
+ const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
364
+
365
+ // Build new contributed schema by prefixing current contributed schema
366
+ const newContributed = prefixContributedSchema(this._contributedSchema, p);
367
+
368
+ // Create new MappedOpGroup
369
+ const newGroup = new MappedOpGroupImpl<Ctx, PrefixedSchema<ContributedSchema, P>, Ops>(
370
+ this._logSchema,
371
+ this._flags,
372
+ cloneOpsWithView<Ctx, Ops>(this.#ops, remappedViewClass),
373
+ newMapping,
374
+ newContributed,
375
+ );
376
+
377
+ assertGroupCarriesOps<Ctx, Ops>(newGroup, this.#ops);
378
+ return newGroup;
379
+ }
380
+
381
+ mapColumns<M extends ColumnMapping<ContributedSchema>>(
382
+ mapping: M,
383
+ ): MappedOpGroup<Ctx, MappedSchema<ContributedSchema, M>, Ops> {
384
+ // Override/extend the existing mapping
385
+ const newMapping = { ...this.#columnMapping, ...mapping };
386
+
387
+ // Generate RemappedBufferView
388
+ const reverseMapping = createReverseMapping(newMapping);
389
+ const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
390
+
391
+ // Build contributed schema from current contributed fields so chained maps stay typed to the public surface.
392
+ const newContributed = buildContributedSchema(this._contributedSchema, mapping);
393
+
394
+ // Create new MappedOpGroup
395
+ const newGroup = new MappedOpGroupImpl<Ctx, MappedSchema<ContributedSchema, M>, Ops>(
396
+ this._logSchema,
397
+ this._flags,
398
+ cloneOpsWithView<Ctx, Ops>(this.#ops, remappedViewClass),
399
+ newMapping,
400
+ newContributed,
401
+ );
402
+
403
+ assertGroupCarriesOps<Ctx, Ops>(newGroup, this.#ops);
404
+ return newGroup;
405
+ }
406
+ }
407
+
408
+ // =============================================================================
409
+ // OP GROUP CREATION
410
+ // =============================================================================
411
+
412
+ /**
413
+ * Create an OpGroup from a schema, flags, and ops
414
+ *
415
+ * Why class-based: V8 hidden class optimization - all OpGroups with same ops
416
+ * have same object shape (private fields don't affect hidden class).
417
+ *
418
+ * The ops passed to this function already have a SpanBufferClass attached.
419
+ * All ops in the same context share the SAME SpanBufferClass instance, which carries:
420
+ * - Static schema property (shared by all instances)
421
+ * - Static stats property (shared mutable stats for self-tuning)
422
+ *
423
+ * The returned OpGroup can be:
424
+ * - Used directly as a dependency (ops accessible via ctx.deps.name.opName)
425
+ * - Prefixed with `.prefix('http')` to namespace all columns
426
+ * - Mapped with `.mapColumns({ query: 'query', _internal: null })` for fine control
427
+ *
428
+ * @param logSchema - The LogSchema defining columns for this group's ops
429
+ * @param flags - Feature flag schema
430
+ * @param ops - Record of Op instances belonging to this group
431
+ * @returns OpGroup with prefix() and mapColumns() methods, ops as own properties
432
+ *
433
+ * @example
434
+ * ```typescript
435
+ * const httpOps = createOpGroup(httpLogSchema, httpFlags, {
436
+ * fetch: fetchOp,
437
+ * post: postOp,
438
+ * });
439
+ *
440
+ * // Direct access (Phase 2):
441
+ * await ctx.deps.http.fetch(url);
442
+ *
443
+ * // Wire with prefix:
444
+ * deps: { http: httpOps.prefix('http') }
445
+ * // Columns become: http_status, http_url, http_duration, etc.
446
+ * ```
447
+ */
448
+ export function createOpGroup<Ctx extends OpContext, Ops extends OpGroupOps<Ctx>>(
449
+ logSchema: Ctx['logSchema'],
450
+ flags: Ctx['flags'],
451
+ ops: Ops,
452
+ ): OpGroup<Ctx, Ops> {
453
+ const group = new OpGroupImpl<Ctx, Ops>(logSchema, flags, ops);
454
+ assertGroupCarriesOps<Ctx, Ops>(group, ops);
455
+ return group;
456
+ }