@smoothbricks/lmao 0.2.2 → 0.3.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 (285) hide show
  1. package/README.md +206 -206
  2. package/dist/allocator.wasm +0 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/lib/JsBufferStrategy.d.ts +4 -3
  7. package/dist/lib/JsBufferStrategy.d.ts.map +1 -1
  8. package/dist/lib/JsBufferStrategy.js +18 -11
  9. package/dist/lib/arrow/lease.d.ts +10 -0
  10. package/dist/lib/arrow/lease.d.ts.map +1 -0
  11. package/dist/lib/arrow/lease.js +33 -0
  12. package/dist/lib/arrow/utils.d.ts +3 -4
  13. package/dist/lib/arrow/utils.d.ts.map +1 -1
  14. package/dist/lib/arrow/utils.js +12 -13
  15. package/dist/lib/arrow/vocabularyDictionary.d.ts +21 -0
  16. package/dist/lib/arrow/vocabularyDictionary.d.ts.map +1 -0
  17. package/dist/lib/arrow/vocabularyDictionary.js +95 -0
  18. package/dist/lib/bufferStrategy.d.ts +3 -2
  19. package/dist/lib/bufferStrategy.d.ts.map +1 -1
  20. package/dist/lib/cloudflare/traceRows.d.ts.map +1 -1
  21. package/dist/lib/cloudflare/traceRows.js +3 -2
  22. package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -1
  23. package/dist/lib/codegen/evaluatorGenerator.js +12 -11
  24. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +44 -82
  25. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -1
  26. package/dist/lib/codegen/fixedPositionWriterGenerator.js +223 -162
  27. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts +63 -0
  28. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts.map +1 -0
  29. package/dist/lib/codegen/spanLoggerClosureMaterializer.js +447 -0
  30. package/dist/lib/codegen/spanLoggerGenerator.d.ts +36 -19
  31. package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -1
  32. package/dist/lib/codegen/spanLoggerGenerator.js +164 -158
  33. package/dist/lib/convertToArrow.d.ts +7 -2
  34. package/dist/lib/convertToArrow.d.ts.map +1 -1
  35. package/dist/lib/convertToArrow.js +499 -285
  36. package/dist/lib/defineOpContext.js +1 -1
  37. package/dist/lib/enumMetadata.d.ts +19 -0
  38. package/dist/lib/enumMetadata.d.ts.map +1 -0
  39. package/dist/lib/enumMetadata.js +86 -0
  40. package/dist/lib/flushScheduler.d.ts.map +1 -1
  41. package/dist/lib/flushScheduler.js +13 -4
  42. package/dist/lib/library.d.ts +16 -98
  43. package/dist/lib/library.d.ts.map +1 -1
  44. package/dist/lib/library.js +32 -525
  45. package/dist/lib/logBinding.d.ts +21 -27
  46. package/dist/lib/logBinding.d.ts.map +1 -1
  47. package/dist/lib/op.d.ts +30 -30
  48. package/dist/lib/op.d.ts.map +1 -1
  49. package/dist/lib/op.js +15 -22
  50. package/dist/lib/opContext/createOpGroup.d.ts +1 -1
  51. package/dist/lib/opContext/createOpGroup.d.ts.map +1 -1
  52. package/dist/lib/opContext/createOpGroup.js +22 -29
  53. package/dist/lib/opContext/defineOp.d.ts +4 -4
  54. package/dist/lib/opContext/defineOp.d.ts.map +1 -1
  55. package/dist/lib/opContext/defineOp.js +53 -10
  56. package/dist/lib/opContext/opGroupTypes.d.ts +2 -2
  57. package/dist/lib/opContext/opTypes.d.ts +1 -1
  58. package/dist/lib/opContext/opTypes.d.ts.map +1 -1
  59. package/dist/lib/opContext/spanContextTypes.d.ts +33 -18
  60. package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -1
  61. package/dist/lib/opContext/types.d.ts +4 -4
  62. package/dist/lib/opContext/types.d.ts.map +1 -1
  63. package/dist/lib/physicalLayoutPlan.d.ts +89 -0
  64. package/dist/lib/physicalLayoutPlan.d.ts.map +1 -0
  65. package/dist/lib/physicalLayoutPlan.js +442 -0
  66. package/dist/lib/resolveMessage.d.ts +9 -0
  67. package/dist/lib/resolveMessage.d.ts.map +1 -0
  68. package/dist/lib/resolveMessage.js +63 -0
  69. package/dist/lib/result.d.ts +5 -7
  70. package/dist/lib/result.d.ts.map +1 -1
  71. package/dist/lib/result.js +19 -26
  72. package/dist/lib/runtimeHint.d.ts +35 -0
  73. package/dist/lib/runtimeHint.d.ts.map +1 -0
  74. package/dist/lib/runtimeHint.js +79 -0
  75. package/dist/lib/schema/typeGuards.d.ts +7 -47
  76. package/dist/lib/schema/typeGuards.d.ts.map +1 -1
  77. package/dist/lib/schema/typeGuards.js +7 -123
  78. package/dist/lib/schema/types.d.ts +1 -1
  79. package/dist/lib/schema/types.d.ts.map +1 -1
  80. package/dist/lib/span-buffer/aot/v1.d.ts +2 -0
  81. package/dist/lib/span-buffer/aot/v1.d.ts.map +1 -0
  82. package/dist/lib/span-buffer/aot/v1.js +24 -0
  83. package/dist/lib/spanBuffer.d.ts +33 -4
  84. package/dist/lib/spanBuffer.d.ts.map +1 -1
  85. package/dist/lib/spanBuffer.js +583 -91
  86. package/dist/lib/spanBufferStats.d.ts +1 -1
  87. package/dist/lib/spanBufferStats.d.ts.map +1 -1
  88. package/dist/lib/spanContext.d.ts +27 -51
  89. package/dist/lib/spanContext.d.ts.map +1 -1
  90. package/dist/lib/spanContext.js +822 -344
  91. package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -1
  92. package/dist/lib/sqlite/sqlite-common.js +20 -21
  93. package/dist/lib/testing/bun-harness.d.ts +8 -3
  94. package/dist/lib/testing/bun-harness.d.ts.map +1 -1
  95. package/dist/lib/testing/bun-harness.js +30 -18
  96. package/dist/lib/testing/extractFacts.d.ts +1 -1
  97. package/dist/lib/testing/extractFacts.d.ts.map +1 -1
  98. package/dist/lib/testing/extractFacts.js +55 -63
  99. package/dist/lib/testing/facts.d.ts +1 -1
  100. package/dist/lib/testing/facts.d.ts.map +1 -1
  101. package/dist/lib/testing/queryable-span.d.ts +1 -1
  102. package/dist/lib/testing/queryable-span.d.ts.map +1 -1
  103. package/dist/lib/testing/queryable-span.js +26 -28
  104. package/dist/lib/testing/span-query.d.ts.map +1 -1
  105. package/dist/lib/testing/span-query.js +19 -22
  106. package/dist/lib/testing/stdio-replay.d.ts.map +1 -1
  107. package/dist/lib/testing/stdio-replay.js +19 -8
  108. package/dist/lib/threadId.d.ts.map +1 -1
  109. package/dist/lib/threadId.js +6 -3
  110. package/dist/lib/traceContext.d.ts.map +1 -1
  111. package/dist/lib/traceContext.js +1 -4
  112. package/dist/lib/traceRoot.d.ts +30 -8
  113. package/dist/lib/traceRoot.d.ts.map +1 -1
  114. package/dist/lib/traceRoot.es.d.ts +17 -15
  115. package/dist/lib/traceRoot.es.d.ts.map +1 -1
  116. package/dist/lib/traceRoot.es.js +68 -34
  117. package/dist/lib/traceRoot.js +11 -0
  118. package/dist/lib/traceRoot.node.d.ts +17 -19
  119. package/dist/lib/traceRoot.node.d.ts.map +1 -1
  120. package/dist/lib/traceRoot.node.js +66 -38
  121. package/dist/lib/traceTopology.d.ts +42 -0
  122. package/dist/lib/traceTopology.d.ts.map +1 -0
  123. package/dist/lib/traceTopology.js +260 -0
  124. package/dist/lib/tracer.d.ts +9 -5
  125. package/dist/lib/tracer.d.ts.map +1 -1
  126. package/dist/lib/tracer.js +65 -71
  127. package/dist/lib/tracers/ArrayQueueTracer.d.ts +1 -1
  128. package/dist/lib/tracers/ArrayQueueTracer.js +1 -1
  129. package/dist/lib/tracers/StdioTracer.d.ts.map +1 -1
  130. package/dist/lib/tracers/StdioTracer.js +15 -13
  131. package/dist/lib/tracers/TestTracer.d.ts +4 -6
  132. package/dist/lib/tracers/TestTracer.d.ts.map +1 -1
  133. package/dist/lib/tracers/TestTracer.js +6 -8
  134. package/dist/lib/types.d.ts +49 -32
  135. package/dist/lib/types.d.ts.map +1 -1
  136. package/dist/lib/vocabularyRegistry.d.ts +25 -0
  137. package/dist/lib/vocabularyRegistry.d.ts.map +1 -0
  138. package/dist/lib/vocabularyRegistry.js +372 -0
  139. package/dist/lib/wasm/WasmBufferStrategy.d.ts +6 -10
  140. package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -1
  141. package/dist/lib/wasm/WasmBufferStrategy.js +44 -37
  142. package/dist/lib/wasm/wasmAllocator.d.ts +27 -22
  143. package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -1
  144. package/dist/lib/wasm/wasmAllocator.js +66 -44
  145. package/dist/lib/wasm/wasmPhysicalLayout.d.ts +67 -0
  146. package/dist/lib/wasm/wasmPhysicalLayout.d.ts.map +1 -0
  147. package/dist/lib/wasm/wasmPhysicalLayout.js +179 -0
  148. package/dist/lib/wasm/wasmSpanBuffer.d.ts +79 -31
  149. package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -1
  150. package/dist/lib/wasm/wasmSpanBuffer.js +442 -272
  151. package/dist/lib/wasm/wasmTraceRoot.d.ts +24 -22
  152. package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -1
  153. package/dist/lib/wasm/wasmTraceRoot.js +110 -71
  154. package/dist/vocabulary/register/v1.d.ts +2 -0
  155. package/dist/vocabulary/register/v1.d.ts.map +1 -0
  156. package/dist/vocabulary/register/v1.js +1 -0
  157. package/dist/wasm.d.ts +5 -0
  158. package/dist/wasm.d.ts.map +1 -0
  159. package/dist/wasm.js +4 -0
  160. package/package.json +54 -6
  161. package/src/index.ts +1 -0
  162. package/src/lib/JsBufferStrategy.ts +27 -9
  163. package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +335 -37
  164. package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +97 -26
  165. package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +75 -15
  166. package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +30 -6
  167. package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +18 -21
  168. package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +5 -2
  169. package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +25 -7
  170. package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +3 -2
  171. package/src/lib/__tests__/buffer-overflow.test.ts +24 -18
  172. package/src/lib/__tests__/capability-span-context.test.ts +505 -0
  173. package/src/lib/__tests__/capacity-tuning.test.ts +5 -3
  174. package/src/lib/__tests__/eager-columns.test.ts +345 -0
  175. package/src/lib/__tests__/enum-metadata-aot.test.ts +153 -0
  176. package/src/lib/__tests__/enum-metadata.test.ts +177 -0
  177. package/src/lib/__tests__/fixtures/empty-vocabulary-runtime.fixture.ts +15 -0
  178. package/src/lib/__tests__/flushScheduler.test.ts +5 -1
  179. package/src/lib/__tests__/identity-view.property.test.ts +179 -0
  180. package/src/lib/__tests__/library.test.ts +19 -235
  181. package/src/lib/__tests__/message-buffer-families.test.ts +878 -0
  182. package/src/lib/__tests__/nested-library-tasks.test.ts +14 -15
  183. package/src/lib/__tests__/op-metadata.test.ts +1 -1
  184. package/src/lib/__tests__/op-type-safety.test.ts +5 -16
  185. package/src/lib/__tests__/physical-layout-plan.test.ts +333 -0
  186. package/src/lib/__tests__/remap-descriptor-integration.test.ts +381 -0
  187. package/src/lib/__tests__/root-context-construction.test.ts +414 -0
  188. package/src/lib/__tests__/span-auto-runtime.test.ts +386 -0
  189. package/src/lib/__tests__/span-buffer-segment-stats.test.ts +221 -0
  190. package/src/lib/__tests__/span-lifecycle.test.ts +53 -25
  191. package/src/lib/__tests__/spanbuffer-materializer-parity.test.ts +266 -0
  192. package/src/lib/__tests__/sync-async-trace.test.ts +24 -23
  193. package/src/lib/__tests__/tag-writer-aot.test.ts +214 -0
  194. package/src/lib/__tests__/test-helpers.ts +67 -12
  195. package/src/lib/__tests__/threadId.test.ts +62 -0
  196. package/src/lib/__tests__/timestamp.test.ts +221 -93
  197. package/src/lib/__tests__/traceTopology.property.test.ts +383 -0
  198. package/src/lib/__tests__/type-narrowing.test.ts +63 -0
  199. package/src/lib/__tests__/vocabulary-dense-decoding.test.ts +405 -0
  200. package/src/lib/__tests__/vocabularyRegistry.test.ts +313 -0
  201. package/src/lib/arrow/lease.ts +43 -0
  202. package/src/lib/arrow/utils.ts +10 -14
  203. package/src/lib/arrow/vocabularyDictionary.ts +123 -0
  204. package/src/lib/bufferStrategy.ts +9 -1
  205. package/src/lib/cloudflare/traceRows.ts +3 -2
  206. package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +21 -141
  207. package/src/lib/codegen/__tests__/fixedPositionWriter-parity.test.ts +273 -0
  208. package/src/lib/codegen/__tests__/fixedPositionWriter-uint64.test.ts +61 -34
  209. package/src/lib/codegen/__tests__/nullBitmap.test.ts +33 -37
  210. package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +34 -18
  211. package/src/lib/codegen/__tests__/spanLoggerMaterializerParity.test.ts +503 -0
  212. package/src/lib/codegen/evaluatorGenerator.ts +18 -13
  213. package/src/lib/codegen/fixedPositionWriterGenerator.ts +329 -245
  214. package/src/lib/codegen/spanLoggerClosureMaterializer.ts +598 -0
  215. package/src/lib/codegen/spanLoggerGenerator.ts +241 -177
  216. package/src/lib/convertToArrow.ts +598 -311
  217. package/src/lib/defineOpContext.ts +1 -1
  218. package/src/lib/enumMetadata.ts +121 -0
  219. package/src/lib/flushScheduler.ts +11 -5
  220. package/src/lib/library.ts +37 -595
  221. package/src/lib/logBinding.ts +21 -27
  222. package/src/lib/op.ts +75 -18
  223. package/src/lib/opContext/__tests__/retry.test.ts +27 -21
  224. package/src/lib/opContext/createOpGroup.ts +33 -31
  225. package/src/lib/opContext/defineOp.ts +88 -11
  226. package/src/lib/opContext/opGroupTypes.ts +2 -2
  227. package/src/lib/opContext/opTypes.ts +1 -1
  228. package/src/lib/opContext/spanContextTypes.ts +122 -24
  229. package/src/lib/opContext/types.ts +7 -3
  230. package/src/lib/physicalLayoutPlan.ts +598 -0
  231. package/src/lib/resolveMessage.ts +67 -0
  232. package/src/lib/result.ts +20 -33
  233. package/src/lib/runtimeHint.ts +98 -0
  234. package/src/lib/schema/__tests__/featureFlags.test.ts +2 -1
  235. package/src/lib/schema/builder.ts +1 -1
  236. package/src/lib/schema/typeGuards.ts +7 -151
  237. package/src/lib/schema/types.ts +1 -1
  238. package/src/lib/span-buffer/aot/v1.ts +26 -0
  239. package/src/lib/spanBuffer.ts +658 -92
  240. package/src/lib/spanBufferStats.ts +1 -1
  241. package/src/lib/spanContext.ts +1350 -861
  242. package/src/lib/sqlite/sqlite-common.ts +20 -31
  243. package/src/lib/testing/__tests__/topology-traversal.test.ts +174 -0
  244. package/src/lib/testing/__tests__/vitest-harness.test.ts +2 -1
  245. package/src/lib/testing/bun-harness.ts +94 -43
  246. package/src/lib/testing/extractFacts.ts +64 -78
  247. package/src/lib/testing/facts.ts +1 -1
  248. package/src/lib/testing/queryable-span.ts +23 -30
  249. package/src/lib/testing/span-query.ts +16 -20
  250. package/src/lib/testing/stdio-replay.ts +25 -8
  251. package/src/lib/testing/vitest-harness.ts +1 -1
  252. package/src/lib/threadId.ts +6 -3
  253. package/src/lib/traceContext.ts +1 -6
  254. package/src/lib/traceRoot.es.ts +77 -42
  255. package/src/lib/traceRoot.node.ts +75 -46
  256. package/src/lib/traceRoot.ts +41 -14
  257. package/src/lib/traceTopology.ts +279 -0
  258. package/src/lib/tracer.ts +109 -98
  259. package/src/lib/tracers/ArrayQueueTracer.ts +1 -1
  260. package/src/lib/tracers/StdioTracer.ts +15 -13
  261. package/src/lib/tracers/TestTracer.ts +6 -8
  262. package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +15 -10
  263. package/src/lib/tracers/__tests__/CompositeTracer.test.ts +150 -0
  264. package/src/lib/tracers/__tests__/TestTracer.test.ts +23 -13
  265. package/src/lib/types.ts +64 -33
  266. package/src/lib/vocabularyRegistry.ts +439 -0
  267. package/src/lib/wasm/WasmBufferStrategy.ts +56 -48
  268. package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +215 -11
  269. package/src/lib/wasm/__tests__/allocatorFreeBlockClamp.test.ts +86 -0
  270. package/src/lib/wasm/__tests__/wasm-identity-view.test.ts +311 -0
  271. package/src/lib/wasm/__tests__/wasm-integration.test.ts +417 -44
  272. package/src/lib/wasm/__tests__/wasm-message-buffer-families.test.ts +588 -0
  273. package/src/lib/wasm/__tests__/wasmAllocator.test.ts +100 -668
  274. package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +419 -63
  275. package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +24 -29
  276. package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +2 -2
  277. package/src/lib/wasm/wasmAllocator.ts +131 -96
  278. package/src/lib/wasm/wasmPhysicalLayout.ts +309 -0
  279. package/src/lib/wasm/wasmSpanBuffer.ts +597 -341
  280. package/src/lib/wasm/wasmTraceRoot.ts +140 -78
  281. package/src/vocabulary/register/v1.ts +1 -0
  282. package/src/wasm.ts +19 -0
  283. package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +0 -319
  284. package/src/lib/__tests__/remapped-buffer-view.test.ts +0 -635
  285. package/src/lib/wasm/allocator.zig +0 -948
@@ -9,9 +9,11 @@
9
9
 
10
10
  import { intern, PreEncodedEntry } from '@smoothbricks/arrow-builder';
11
11
  import { Op as OpClass } from '../op.js';
12
+ import { resolveEagerColumns } from '../physicalLayoutPlan.js';
13
+ import { runtimeHintMessageLayoutFamily, runtimeHintMessagePhysicalLayout } from '../runtimeHint.js';
12
14
  import { getSpanBufferClass } from '../spanBuffer.js';
13
15
  import type { OpGroup, OpGroupOps } from './opGroupTypes.js';
14
- import type { Op, OpFn, OpMetadata, OpsFromRecord } from './opTypes.js';
16
+ import type { Op, OpCompileMetadata, OpFn, OpMetadata, OpsFromRecord } from './opTypes.js';
15
17
  import type { OpContext } from './types.js';
16
18
 
17
19
  //#region smoo/lmao!n/metadata-injection
@@ -57,6 +59,31 @@ export function createOpMetadata(
57
59
  */
58
60
  export const DEFAULT_METADATA: OpMetadata = createOpMetadata('unknown', 'unknown', 'unknown', 'unknown', 0);
59
61
 
62
+ const DEFAULT_COMPILE_METADATA: OpCompileMetadata = Object.freeze({
63
+ runtimeHint: 0,
64
+ });
65
+
66
+ const EMPTY_EAGER_COLUMNS: readonly string[] = Object.freeze([]);
67
+ const EMPTY_LOCAL_MESSAGE_DICTIONARY: readonly number[] = Object.freeze([]);
68
+
69
+ function normalizeCompileMetadata(compileMetadata?: OpCompileMetadata): OpCompileMetadata {
70
+ if (compileMetadata === undefined) return DEFAULT_COMPILE_METADATA;
71
+ const eagerColumns = compileMetadata.eagerColumns;
72
+ const localMessageDictionary = compileMetadata.localMessageDictionary;
73
+ return Object.freeze({
74
+ runtimeHint: compileMetadata.runtimeHint,
75
+ eagerColumns:
76
+ eagerColumns === undefined || eagerColumns.length === 0
77
+ ? EMPTY_EAGER_COLUMNS
78
+ : Object.freeze([...new Set(eagerColumns)]),
79
+ localMessageDictionary:
80
+ localMessageDictionary === undefined || localMessageDictionary.length === 0
81
+ ? EMPTY_LOCAL_MESSAGE_DICTIONARY
82
+ : Object.freeze([...localMessageDictionary]),
83
+ materializeSpanBufferClass: compileMetadata.materializeSpanBufferClass,
84
+ });
85
+ }
86
+
60
87
  // =============================================================================
61
88
  // STACK TRACE METADATA EXTRACTION
62
89
  // =============================================================================
@@ -173,7 +200,7 @@ type CreateOpGroupFn<Ctx extends OpContext> = <Ops extends OpGroupOps<Ctx>>(
173
200
  * - metadata: includes name + merged with defaults
174
201
  * - SpanBufferClass: from getSpanBufferClass(logSchema) - has static schema + stats
175
202
  * - fn(ctx, ...args): the user function to execute
176
- * - remappedViewClass: undefined for original ops (set by .prefix() method)
203
+ * - remapDescriptor: undefined for original ops (set by .prefix()/.mapColumns())
177
204
  *
178
205
  * @template Ctx - Bundled OpContext (logSchema, flags, deps, userCtx)
179
206
  * @param factoryConfig - Configuration containing logSchema and flags
@@ -185,21 +212,39 @@ export function createDefineOp<Ctx extends OpContext>(
185
212
  name: string,
186
213
  fn: OpFn<Ctx, Args, S, E>,
187
214
  metadata?: Partial<OpMetadata>,
215
+ compileMetadata?: OpCompileMetadata,
188
216
  ) => Op<Ctx, Args, S, E> {
189
- // Why get class from schema: Class has static schema + stats shared by all instances
190
- const SpanBufferClass = getSpanBufferClass(factoryConfig.logSchema);
191
-
192
217
  return function defineOpImpl<Args extends unknown[], S, E>(
193
218
  name: string,
194
219
  fn: OpFn<Ctx, Args, S, E>,
195
220
  metadata?: Partial<OpMetadata>,
221
+ compileMetadata?: OpCompileMetadata,
196
222
  ): Op<Ctx, Args, S, E> {
223
+ const normalizedCompileMetadata = normalizeCompileMetadata(compileMetadata);
224
+ normalizedCompileMetadata.materializeSpanBufferClass?.(factoryConfig.logSchema);
225
+ const eagerColumns = resolveEagerColumns(
226
+ factoryConfig.logSchema,
227
+ normalizedCompileMetadata.eagerColumns ?? EMPTY_EAGER_COLUMNS,
228
+ );
229
+ const messageLayoutFamily = runtimeHintMessageLayoutFamily(normalizedCompileMetadata.runtimeHint);
230
+ const messagePhysicalLayout = runtimeHintMessagePhysicalLayout(normalizedCompileMetadata.runtimeHint);
231
+ const SelectedSpanBufferClass = getSpanBufferClass(
232
+ factoryConfig.logSchema,
233
+ messageLayoutFamily,
234
+ messagePhysicalLayout,
235
+ eagerColumns,
236
+ );
237
+
197
238
  // When transformer is not installed, extract metadata from stack trace
198
239
  // This provides useful file/line info for debugging even without build-time injection
199
240
  // skipFrames=3: Error -> extractMetadataFromStack -> defineOpImpl -> caller
200
241
  const baseMetadata = metadata?.package_file ? DEFAULT_METADATA : extractMetadataFromStack(3);
201
242
  // Use name from: 1) explicit metadata.name (transformer), 2) defineOp('name', fn), 3) baseMetadata
202
- const finalMetadata = { ...baseMetadata, ...metadata, name: metadata?.name ?? name };
243
+ const finalMetadata: OpMetadata = {
244
+ ...baseMetadata,
245
+ ...metadata,
246
+ name: metadata?.name ?? name,
247
+ };
203
248
 
204
249
  // Use the Op class which handles all span/buffer management:
205
250
  // - Creates SpanBuffer for the op
@@ -207,9 +252,18 @@ export function createDefineOp<Ctx extends OpContext>(
207
252
  // - Sets _opMetadata and _callsiteMetadata
208
253
  // - Writes span-start/span-ok/span-err entries
209
254
  // - Handles exceptions with span-exception
210
- // Why SpanBufferClass: All ops from same defineOpContext share this class for stats coordination
211
- // Why undefined for remappedViewClass: Only prefixed ops need remapping - set by .prefix() method
212
- return new OpClass(finalMetadata, SpanBufferClass, fn, undefined, factoryConfig.opContextBinding);
255
+ // Why SelectedSpanBufferClass: Ops with the same physical layout share one constructor and stats object.
256
+ // Base Ops have no remap descriptor; mapped OpGroups bind one during startup cloning.
257
+ return new OpClass(
258
+ finalMetadata,
259
+ SelectedSpanBufferClass,
260
+ fn,
261
+ undefined,
262
+ factoryConfig.opContextBinding,
263
+ normalizedCompileMetadata.runtimeHint,
264
+ normalizedCompileMetadata.eagerColumns ?? EMPTY_EAGER_COLUMNS,
265
+ normalizedCompileMetadata.localMessageDictionary ?? EMPTY_LOCAL_MESSAGE_DICTIONARY,
266
+ );
213
267
  };
214
268
  }
215
269
 
@@ -258,20 +312,43 @@ export function createDefineOps<Ctx extends OpContext>(
258
312
  createOpGroup: CreateOpGroupFn<Ctx>,
259
313
  ): <Defs extends Record<string, Op<Ctx, unknown[], unknown, unknown> | OpFn<Ctx, unknown[], unknown, unknown>>>(
260
314
  definitions: Defs & ThisType<OpsFromRecord<Ctx, Defs>>,
315
+ compileMetadataByKey?: Partial<Record<keyof Defs, OpCompileMetadata>>,
261
316
  ) => OpGroup<Ctx, OpsFromRecord<Ctx, Defs>> {
262
317
  // Get the defineOp function for wrapping raw functions
263
318
  const defineOp = createDefineOp<Ctx>(factoryConfig);
264
319
 
265
320
  return function defineOpsImpl<
266
321
  Defs extends Record<string, Op<Ctx, unknown[], unknown, unknown> | OpFn<Ctx, unknown[], unknown, unknown>>,
267
- >(definitions: Defs & ThisType<OpsFromRecord<Ctx, Defs>>): OpGroup<Ctx, OpsFromRecord<Ctx, Defs>> {
322
+ >(
323
+ definitions: Defs & ThisType<OpsFromRecord<Ctx, Defs>>,
324
+ compileMetadataByKey?: Partial<Record<keyof Defs, OpCompileMetadata>>,
325
+ ): OpGroup<Ctx, OpsFromRecord<Ctx, Defs>> {
268
326
  // Build the ops record by processing each definition.
269
327
  // Keep the runtime container broad, then narrow once we've populated every key.
270
328
  const ops: Record<string, Op<Ctx, unknown[], unknown, unknown>> = {};
271
329
 
272
330
  for (const name in definitions) {
273
331
  const def = definitions[name];
274
- ops[name] = isOp<Ctx>(def) ? def : defineOp(name, def);
332
+ const compileMetadata = compileMetadataByKey?.[name];
333
+ if (isOp<Ctx>(def)) {
334
+ if (compileMetadata === undefined) {
335
+ ops[name] = def;
336
+ } else {
337
+ const normalizedCompileMetadata = normalizeCompileMetadata(compileMetadata);
338
+ ops[name] = new OpClass(
339
+ def.metadata,
340
+ def.callsitePlan.SpanBufferClass,
341
+ def.fn,
342
+ def.callsitePlan.remapDescriptor ?? undefined,
343
+ def._opContextBinding,
344
+ normalizedCompileMetadata.runtimeHint,
345
+ normalizedCompileMetadata.eagerColumns ?? EMPTY_EAGER_COLUMNS,
346
+ normalizedCompileMetadata.localMessageDictionary ?? EMPTY_LOCAL_MESSAGE_DICTIONARY,
347
+ );
348
+ }
349
+ } else {
350
+ ops[name] = defineOp(name, def, undefined, compileMetadata);
351
+ }
275
352
  }
276
353
 
277
354
  if (!hasAllDefinedOps(definitions, ops)) {
@@ -164,8 +164,8 @@ export type OpGroup<Ctx extends OpContext, Ops extends object = NoOpMembers> = O
164
164
  /**
165
165
  * An OpGroup with column mapping applied.
166
166
  *
167
- * The mapping is used during wiring to create RemappedBufferView
168
- * that translates the library's column writes to the app's column names.
167
+ * Wiring composes the mapping into immutable metadata interpreted only by cold
168
+ * Arrow conversion; library child buffers keep their canonical storage layout.
169
169
  *
170
170
  * Note: Ops are accessed directly as properties (`.opName` not `.ops.opName`)
171
171
  * for V8 hidden class optimization and cleaner API ergonomics.
@@ -24,7 +24,7 @@ import type { OpContext } from './types.js';
24
24
  // Re-export the Op class and OpMetadata from op.ts - single source of truth
25
25
  // The class is defined in op.ts to be the canonical type used by both
26
26
  // defineOp (creates instances) and Tracer (checks instanceof)
27
- export { Op, type OpMetadata } from '../op.js';
27
+ export { Op, type OpCompileMetadata, type OpMetadata } from '../op.js';
28
28
 
29
29
  // =============================================================================
30
30
  // OP FUNCTION TYPE
@@ -28,21 +28,38 @@ import type { Op } from './opTypes.js';
28
28
  import type { OpContext } from './types.js';
29
29
 
30
30
  // =============================================================================
31
- // DEPENDENCY TYPES (structural to avoid circular imports)
31
+ // DEPENDENCY TYPES (deliberate `any` placeholders see rationale below)
32
32
  // =============================================================================
33
33
 
34
+ // WHY these are `any` and not the real `DepsConfig`/`ResolvedDeps` from opGroupTypes:
35
+ //
36
+ // `ResolvedDeps<D>` maps each dep to `OpGroup<Ctx, Ops>`, and an OpGroup's ops carry
37
+ // `SpanContext<DepCtx>` in their signatures. If `SpanContext` referenced the *real*
38
+ // `ResolvedDeps<Ctx['deps']>` for its `deps` member, `SpanContext` would become
39
+ // structurally recursive: deps -> OpGroup -> op -> SpanContext -> deps -> ...
40
+ //
41
+ // That recursion breaks the structural assignability TypeScript performs when a
42
+ // dependency's op is passed to `ctx.span(name, ctx.deps.x.op)` across libraries
43
+ // (verified: it regresses the nested-library-tasks composition tests) and makes
44
+ // type comparison cost explode. The `any` keeps `ctx.deps.x.op` ergonomic for op
45
+ // authors while keeping `SpanContext` comparisons tractable and non-recursive.
46
+ //
47
+ // A real fix (fully-typed `ctx.deps`) requires reworking deps resolution so the
48
+ // resolved-deps view does not pull `SpanContext` back into its own definition.
49
+ // Until then these placeholders are load-bearing, not laziness.
50
+
34
51
  /**
35
- * DepsConfig - structural type to avoid importing from opGroupTypes.
36
- * Represents a record of dependency groups.
52
+ * DepsConfig - structural placeholder for a record of dependency groups.
53
+ * The authoritative type is `DepsConfig` in opGroupTypes; see the WHY above.
37
54
  */
38
- // biome-ignore lint/suspicious/noExplicitAny: Structural placeholder - actual type in opGroupTypes
55
+ // biome-ignore lint/suspicious/noExplicitAny: load-bearing placeholder real type makes SpanContext recursive (see WHY above)
39
56
  export type DepsConfig = Record<string, any>;
40
57
 
41
58
  /**
42
- * ResolvedDeps - structural type to avoid importing from opGroupTypes.
43
- * At runtime, deps are resolved OpGroups with their ops accessible.
59
+ * ResolvedDeps - structural placeholder for resolved dependency OpGroups.
60
+ * The authoritative type is `ResolvedDeps` in opGroupTypes; see the WHY above.
44
61
  */
45
- // biome-ignore lint/suspicious/noExplicitAny: Structural placeholder - actual type in opGroupTypes
62
+ // biome-ignore lint/suspicious/noExplicitAny: load-bearing placeholder real type makes SpanContext recursive (see WHY above)
46
63
  export type ResolvedDeps<_D extends DepsConfig> = Record<string, any>;
47
64
 
48
65
  // =============================================================================
@@ -68,24 +85,29 @@ export type TagWriter<T extends LogSchema> = {
68
85
  /**
69
86
  * SpanLogger - public API surface for structured logging.
70
87
  *
71
- * Includes core methods (info/debug/warn/error) from BaseSpanLogger
72
- * and schema-specific methods from ColumnWriter.
73
- * Internal methods (_setScope, _buffer, etc.) are hidden from this type.
88
+ * Operational info/warn/error calls accept either a static template or the
89
+ * untransformed fallback form `(template, fields)`. Debug/trace retain the raw
90
+ * dynamic message API. The transformer lowers supported calls to direct writes;
91
+ * internal methods and buffers remain hidden from this type.
74
92
  *
75
- * Per specs/lmao/01h_entry_types_and_logging_primitives.md:
76
- * - Each level (info/debug/warn/error) creates a log entry
77
- * - Returns FluentLogEntry for chaining field setters
78
- * - Generated at runtime via createSpanLoggerFromGenerator()
93
+ * Per specs/lmao/01h_entry_types_and_logging_primitives.md, each call creates
94
+ * exactly one log entry. The generated runtime implementation binds structured
95
+ * fallback fields to the schema-specific column writers.
79
96
  */
80
97
  export interface SpanLogger<T extends LogSchema> {
81
- /** Log at info level */
82
- info(message: string): FluentLogEntry<T>;
98
+ /** Log a static info template, optionally with schema-bound fallback fields */
99
+ info(template: string): FluentLogEntry<T>;
100
+ info(template: string, fields: Partial<InferSchema<T>>): FluentLogEntry<T>;
83
101
  /** Log at debug level */
84
102
  debug(message: string): FluentLogEntry<T>;
85
- /** Log at warn level */
86
- warn(message: string): FluentLogEntry<T>;
87
- /** Log at error level */
88
- error(message: string): FluentLogEntry<T>;
103
+ /** Log a static warn template, optionally with schema-bound fallback fields */
104
+ warn(template: string): FluentLogEntry<T>;
105
+ warn(template: string, fields: Partial<InferSchema<T>>): FluentLogEntry<T>;
106
+ /** Log a static error template, optionally with schema-bound fallback fields */
107
+ error(template: string): FluentLogEntry<T>;
108
+ error(template: string, fields: Partial<InferSchema<T>>): FluentLogEntry<T>;
109
+ /** Log at trace level */
110
+ trace(message: string): FluentLogEntry<T>;
89
111
  }
90
112
 
91
113
  /**
@@ -208,10 +230,7 @@ export type SpanFn<Ctx extends OpContext> = {
208
230
  * Use when the callback is guaranteed sync and should return immediately
209
231
  * with a Result envelope.
210
232
  */
211
- export type SpanSyncFn<Ctx extends OpContext> = <S, E>(
212
- name: string,
213
- fn: (ctx: SpanContext<Ctx>) => Result<S, E>,
214
- ) => Result<S, E>;
233
+ export type SpanSyncFn<Ctx extends OpContext> = <S, E>(name: string, op: Op<Ctx, [], S, E>) => Result<S, E>;
215
234
 
216
235
  // =============================================================================
217
236
  // SPAN CONTEXT TYPE
@@ -359,6 +378,85 @@ export type SpanContext<Ctx extends OpContext> = {
359
378
  */
360
379
  spanSync: SpanSyncFn<Ctx>;
361
380
 
381
+ /** @internal Transformer-only fixed-arity sync-fast span ABI. */
382
+ spanAuto0<S, E>(line: number, name: string, op: Op<Ctx, [], S, E>): Result<S, E> | Promise<Result<S, E>>;
383
+ spanAuto1<S, E, A1>(
384
+ line: number,
385
+ name: string,
386
+ op: Op<Ctx, [A1], S, E>,
387
+ a1: A1,
388
+ ): Result<S, E> | Promise<Result<S, E>>;
389
+ spanAuto2<S, E, A1, A2>(
390
+ line: number,
391
+ name: string,
392
+ op: Op<Ctx, [A1, A2], S, E>,
393
+ a1: A1,
394
+ a2: A2,
395
+ ): Result<S, E> | Promise<Result<S, E>>;
396
+ spanAuto3<S, E, A1, A2, A3>(
397
+ line: number,
398
+ name: string,
399
+ op: Op<Ctx, [A1, A2, A3], S, E>,
400
+ a1: A1,
401
+ a2: A2,
402
+ a3: A3,
403
+ ): Result<S, E> | Promise<Result<S, E>>;
404
+ spanAuto4<S, E, A1, A2, A3, A4>(
405
+ line: number,
406
+ name: string,
407
+ op: Op<Ctx, [A1, A2, A3, A4], S, E>,
408
+ a1: A1,
409
+ a2: A2,
410
+ a3: A3,
411
+ a4: A4,
412
+ ): Result<S, E> | Promise<Result<S, E>>;
413
+ spanAuto5<S, E, A1, A2, A3, A4, A5>(
414
+ line: number,
415
+ name: string,
416
+ op: Op<Ctx, [A1, A2, A3, A4, A5], S, E>,
417
+ a1: A1,
418
+ a2: A2,
419
+ a3: A3,
420
+ a4: A4,
421
+ a5: A5,
422
+ ): Result<S, E> | Promise<Result<S, E>>;
423
+ spanAuto6<S, E, A1, A2, A3, A4, A5, A6>(
424
+ line: number,
425
+ name: string,
426
+ op: Op<Ctx, [A1, A2, A3, A4, A5, A6], S, E>,
427
+ a1: A1,
428
+ a2: A2,
429
+ a3: A3,
430
+ a4: A4,
431
+ a5: A5,
432
+ a6: A6,
433
+ ): Result<S, E> | Promise<Result<S, E>>;
434
+ spanAuto7<S, E, A1, A2, A3, A4, A5, A6, A7>(
435
+ line: number,
436
+ name: string,
437
+ op: Op<Ctx, [A1, A2, A3, A4, A5, A6, A7], S, E>,
438
+ a1: A1,
439
+ a2: A2,
440
+ a3: A3,
441
+ a4: A4,
442
+ a5: A5,
443
+ a6: A6,
444
+ a7: A7,
445
+ ): Result<S, E> | Promise<Result<S, E>>;
446
+ spanAuto8<S, E, A1, A2, A3, A4, A5, A6, A7, A8>(
447
+ line: number,
448
+ name: string,
449
+ op: Op<Ctx, [A1, A2, A3, A4, A5, A6, A7, A8], S, E>,
450
+ a1: A1,
451
+ a2: A2,
452
+ a3: A3,
453
+ a4: A4,
454
+ a5: A5,
455
+ a6: A6,
456
+ a7: A7,
457
+ a8: A8,
458
+ ): Result<S, E> | Promise<Result<S, E>>;
459
+
362
460
  /**
363
461
  * Set scoped attributes that auto-propagate to all subsequent log entries.
364
462
  *
@@ -52,7 +52,7 @@ export type {
52
52
  UnionToIntersection,
53
53
  } from './opGroupTypes.js';
54
54
  // Op types (metadata, function signature, instance)
55
- export type { Op, OpFn, OpMetadata, OpsFromRecord } from './opTypes.js';
55
+ export type { Op, OpCompileMetadata, OpFn, OpMetadata, OpsFromRecord } from './opTypes.js';
56
56
  // SpanContext types (tag writer, logger, span function, full context)
57
57
  export type { FluentLogEntry, SpanContext, SpanFn, SpanLogger, SpanSyncFn, TagWriter } from './spanContextTypes.js';
58
58
 
@@ -120,7 +120,7 @@ import type { SchemaFields } from '../schema/types.js';
120
120
  import type { ValidateUserContext } from './contextTypes.js';
121
121
  import type { FeatureFlagSchema } from './featureFlagTypes.js';
122
122
  import type { DepsConfig, OpGroup } from './opGroupTypes.js';
123
- import type { Op, OpFn, OpMetadata, OpsFromRecord } from './opTypes.js';
123
+ import type { Op, OpCompileMetadata, OpFn, OpMetadata, OpsFromRecord } from './opTypes.js';
124
124
 
125
125
  /**
126
126
  * Configuration for defineOpContext
@@ -351,6 +351,7 @@ export interface OpContextFactory<
351
351
  name: string,
352
352
  fn: OpFn<OpContext<T, FF, Deps, UserCtx>, Args, S, E>,
353
353
  metadata?: Partial<OpMetadata>,
354
+ compileMetadata?: OpCompileMetadata,
354
355
  ): Op<OpContext<T, FF, Deps, UserCtx>, Args, S, E>;
355
356
 
356
357
  /**
@@ -399,5 +400,8 @@ export interface OpContextFactory<
399
400
  | OpFn<OpContext<T, FF, Deps, UserCtx>, unknown[], unknown, unknown>
400
401
  | Op<OpContext<T, FF, Deps, UserCtx>, unknown[], unknown, unknown>
401
402
  >,
402
- >(definitions: Defs): OpGroup<OpContext<T, FF, Deps, UserCtx>, OpsFromRecord<OpContext<T, FF, Deps, UserCtx>, Defs>>;
403
+ >(
404
+ definitions: Defs,
405
+ compileMetadataByKey?: Partial<Record<keyof Defs, OpCompileMetadata>>,
406
+ ): OpGroup<OpContext<T, FF, Deps, UserCtx>, OpsFromRecord<OpContext<T, FF, Deps, UserCtx>, Defs>>;
403
407
  }