@smoothbricks/lmao 0.2.2 → 0.2.3

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 (276) hide show
  1. package/dist/allocator.wasm +0 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/lib/JsBufferStrategy.d.ts +4 -3
  6. package/dist/lib/JsBufferStrategy.d.ts.map +1 -1
  7. package/dist/lib/JsBufferStrategy.js +18 -11
  8. package/dist/lib/arrow/lease.d.ts +10 -0
  9. package/dist/lib/arrow/lease.d.ts.map +1 -0
  10. package/dist/lib/arrow/lease.js +33 -0
  11. package/dist/lib/arrow/utils.d.ts +3 -4
  12. package/dist/lib/arrow/utils.d.ts.map +1 -1
  13. package/dist/lib/arrow/utils.js +12 -13
  14. package/dist/lib/arrow/vocabularyDictionary.d.ts +21 -0
  15. package/dist/lib/arrow/vocabularyDictionary.d.ts.map +1 -0
  16. package/dist/lib/arrow/vocabularyDictionary.js +95 -0
  17. package/dist/lib/bufferStrategy.d.ts +3 -2
  18. package/dist/lib/bufferStrategy.d.ts.map +1 -1
  19. package/dist/lib/cloudflare/traceRows.d.ts.map +1 -1
  20. package/dist/lib/cloudflare/traceRows.js +3 -2
  21. package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -1
  22. package/dist/lib/codegen/evaluatorGenerator.js +12 -11
  23. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +44 -82
  24. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -1
  25. package/dist/lib/codegen/fixedPositionWriterGenerator.js +223 -162
  26. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts +63 -0
  27. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts.map +1 -0
  28. package/dist/lib/codegen/spanLoggerClosureMaterializer.js +447 -0
  29. package/dist/lib/codegen/spanLoggerGenerator.d.ts +36 -19
  30. package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -1
  31. package/dist/lib/codegen/spanLoggerGenerator.js +164 -158
  32. package/dist/lib/convertToArrow.d.ts +7 -2
  33. package/dist/lib/convertToArrow.d.ts.map +1 -1
  34. package/dist/lib/convertToArrow.js +499 -285
  35. package/dist/lib/defineOpContext.js +1 -1
  36. package/dist/lib/enumMetadata.d.ts +19 -0
  37. package/dist/lib/enumMetadata.d.ts.map +1 -0
  38. package/dist/lib/enumMetadata.js +86 -0
  39. package/dist/lib/flushScheduler.d.ts.map +1 -1
  40. package/dist/lib/flushScheduler.js +13 -4
  41. package/dist/lib/library.d.ts +16 -98
  42. package/dist/lib/library.d.ts.map +1 -1
  43. package/dist/lib/library.js +32 -525
  44. package/dist/lib/logBinding.d.ts +21 -27
  45. package/dist/lib/logBinding.d.ts.map +1 -1
  46. package/dist/lib/op.d.ts +30 -30
  47. package/dist/lib/op.d.ts.map +1 -1
  48. package/dist/lib/op.js +15 -22
  49. package/dist/lib/opContext/createOpGroup.d.ts +1 -1
  50. package/dist/lib/opContext/createOpGroup.d.ts.map +1 -1
  51. package/dist/lib/opContext/createOpGroup.js +22 -29
  52. package/dist/lib/opContext/defineOp.d.ts +4 -4
  53. package/dist/lib/opContext/defineOp.d.ts.map +1 -1
  54. package/dist/lib/opContext/defineOp.js +53 -10
  55. package/dist/lib/opContext/opGroupTypes.d.ts +2 -2
  56. package/dist/lib/opContext/opTypes.d.ts +1 -1
  57. package/dist/lib/opContext/opTypes.d.ts.map +1 -1
  58. package/dist/lib/opContext/spanContextTypes.d.ts +29 -14
  59. package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -1
  60. package/dist/lib/opContext/types.d.ts +4 -4
  61. package/dist/lib/opContext/types.d.ts.map +1 -1
  62. package/dist/lib/physicalLayoutPlan.d.ts +89 -0
  63. package/dist/lib/physicalLayoutPlan.d.ts.map +1 -0
  64. package/dist/lib/physicalLayoutPlan.js +442 -0
  65. package/dist/lib/resolveMessage.d.ts +9 -0
  66. package/dist/lib/resolveMessage.d.ts.map +1 -0
  67. package/dist/lib/resolveMessage.js +63 -0
  68. package/dist/lib/result.d.ts +5 -7
  69. package/dist/lib/result.d.ts.map +1 -1
  70. package/dist/lib/result.js +19 -26
  71. package/dist/lib/runtimeHint.d.ts +35 -0
  72. package/dist/lib/runtimeHint.d.ts.map +1 -0
  73. package/dist/lib/runtimeHint.js +79 -0
  74. package/dist/lib/schema/types.d.ts +1 -1
  75. package/dist/lib/schema/types.d.ts.map +1 -1
  76. package/dist/lib/span-buffer/aot/v1.d.ts +2 -0
  77. package/dist/lib/span-buffer/aot/v1.d.ts.map +1 -0
  78. package/dist/lib/span-buffer/aot/v1.js +24 -0
  79. package/dist/lib/spanBuffer.d.ts +33 -4
  80. package/dist/lib/spanBuffer.d.ts.map +1 -1
  81. package/dist/lib/spanBuffer.js +583 -91
  82. package/dist/lib/spanBufferStats.d.ts +1 -1
  83. package/dist/lib/spanBufferStats.d.ts.map +1 -1
  84. package/dist/lib/spanContext.d.ts +27 -51
  85. package/dist/lib/spanContext.d.ts.map +1 -1
  86. package/dist/lib/spanContext.js +822 -344
  87. package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -1
  88. package/dist/lib/sqlite/sqlite-common.js +20 -21
  89. package/dist/lib/testing/bun-harness.d.ts +8 -3
  90. package/dist/lib/testing/bun-harness.d.ts.map +1 -1
  91. package/dist/lib/testing/bun-harness.js +30 -18
  92. package/dist/lib/testing/extractFacts.d.ts +1 -1
  93. package/dist/lib/testing/extractFacts.d.ts.map +1 -1
  94. package/dist/lib/testing/extractFacts.js +55 -63
  95. package/dist/lib/testing/facts.d.ts +1 -1
  96. package/dist/lib/testing/facts.d.ts.map +1 -1
  97. package/dist/lib/testing/queryable-span.d.ts +1 -1
  98. package/dist/lib/testing/queryable-span.d.ts.map +1 -1
  99. package/dist/lib/testing/queryable-span.js +26 -28
  100. package/dist/lib/testing/span-query.d.ts.map +1 -1
  101. package/dist/lib/testing/span-query.js +19 -22
  102. package/dist/lib/testing/stdio-replay.d.ts.map +1 -1
  103. package/dist/lib/testing/stdio-replay.js +19 -8
  104. package/dist/lib/threadId.d.ts.map +1 -1
  105. package/dist/lib/threadId.js +6 -3
  106. package/dist/lib/traceRoot.d.ts +30 -8
  107. package/dist/lib/traceRoot.d.ts.map +1 -1
  108. package/dist/lib/traceRoot.es.d.ts +17 -15
  109. package/dist/lib/traceRoot.es.d.ts.map +1 -1
  110. package/dist/lib/traceRoot.es.js +68 -34
  111. package/dist/lib/traceRoot.js +11 -0
  112. package/dist/lib/traceRoot.node.d.ts +17 -19
  113. package/dist/lib/traceRoot.node.d.ts.map +1 -1
  114. package/dist/lib/traceRoot.node.js +66 -38
  115. package/dist/lib/traceTopology.d.ts +42 -0
  116. package/dist/lib/traceTopology.d.ts.map +1 -0
  117. package/dist/lib/traceTopology.js +260 -0
  118. package/dist/lib/tracer.d.ts +9 -5
  119. package/dist/lib/tracer.d.ts.map +1 -1
  120. package/dist/lib/tracer.js +65 -71
  121. package/dist/lib/tracers/ArrayQueueTracer.d.ts +1 -1
  122. package/dist/lib/tracers/ArrayQueueTracer.js +1 -1
  123. package/dist/lib/tracers/StdioTracer.d.ts.map +1 -1
  124. package/dist/lib/tracers/StdioTracer.js +15 -13
  125. package/dist/lib/tracers/TestTracer.d.ts +4 -6
  126. package/dist/lib/tracers/TestTracer.d.ts.map +1 -1
  127. package/dist/lib/tracers/TestTracer.js +6 -8
  128. package/dist/lib/types.d.ts +49 -32
  129. package/dist/lib/types.d.ts.map +1 -1
  130. package/dist/lib/vocabularyRegistry.d.ts +25 -0
  131. package/dist/lib/vocabularyRegistry.d.ts.map +1 -0
  132. package/dist/lib/vocabularyRegistry.js +372 -0
  133. package/dist/lib/wasm/WasmBufferStrategy.d.ts +6 -10
  134. package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -1
  135. package/dist/lib/wasm/WasmBufferStrategy.js +44 -37
  136. package/dist/lib/wasm/wasmAllocator.d.ts +27 -22
  137. package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -1
  138. package/dist/lib/wasm/wasmAllocator.js +66 -44
  139. package/dist/lib/wasm/wasmPhysicalLayout.d.ts +67 -0
  140. package/dist/lib/wasm/wasmPhysicalLayout.d.ts.map +1 -0
  141. package/dist/lib/wasm/wasmPhysicalLayout.js +179 -0
  142. package/dist/lib/wasm/wasmSpanBuffer.d.ts +79 -31
  143. package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -1
  144. package/dist/lib/wasm/wasmSpanBuffer.js +442 -272
  145. package/dist/lib/wasm/wasmTraceRoot.d.ts +24 -22
  146. package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -1
  147. package/dist/lib/wasm/wasmTraceRoot.js +110 -71
  148. package/dist/vocabulary/register/v1.d.ts +2 -0
  149. package/dist/vocabulary/register/v1.d.ts.map +1 -0
  150. package/dist/vocabulary/register/v1.js +1 -0
  151. package/dist/wasm.d.ts +5 -0
  152. package/dist/wasm.d.ts.map +1 -0
  153. package/dist/wasm.js +4 -0
  154. package/package.json +54 -6
  155. package/src/index.ts +1 -0
  156. package/src/lib/JsBufferStrategy.ts +27 -9
  157. package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +335 -37
  158. package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +97 -26
  159. package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +75 -15
  160. package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +30 -6
  161. package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +18 -21
  162. package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +5 -2
  163. package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +25 -7
  164. package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +3 -2
  165. package/src/lib/__tests__/buffer-overflow.test.ts +24 -18
  166. package/src/lib/__tests__/capability-span-context.test.ts +505 -0
  167. package/src/lib/__tests__/capacity-tuning.test.ts +5 -3
  168. package/src/lib/__tests__/eager-columns.test.ts +345 -0
  169. package/src/lib/__tests__/enum-metadata-aot.test.ts +153 -0
  170. package/src/lib/__tests__/enum-metadata.test.ts +177 -0
  171. package/src/lib/__tests__/fixtures/empty-vocabulary-runtime.fixture.ts +15 -0
  172. package/src/lib/__tests__/flushScheduler.test.ts +5 -1
  173. package/src/lib/__tests__/identity-view.property.test.ts +179 -0
  174. package/src/lib/__tests__/library.test.ts +19 -235
  175. package/src/lib/__tests__/message-buffer-families.test.ts +878 -0
  176. package/src/lib/__tests__/nested-library-tasks.test.ts +14 -15
  177. package/src/lib/__tests__/op-metadata.test.ts +1 -1
  178. package/src/lib/__tests__/op-type-safety.test.ts +5 -16
  179. package/src/lib/__tests__/physical-layout-plan.test.ts +333 -0
  180. package/src/lib/__tests__/remap-descriptor-integration.test.ts +381 -0
  181. package/src/lib/__tests__/root-context-construction.test.ts +414 -0
  182. package/src/lib/__tests__/span-auto-runtime.test.ts +386 -0
  183. package/src/lib/__tests__/span-buffer-segment-stats.test.ts +221 -0
  184. package/src/lib/__tests__/span-lifecycle.test.ts +53 -25
  185. package/src/lib/__tests__/spanbuffer-materializer-parity.test.ts +266 -0
  186. package/src/lib/__tests__/sync-async-trace.test.ts +24 -23
  187. package/src/lib/__tests__/tag-writer-aot.test.ts +214 -0
  188. package/src/lib/__tests__/test-helpers.ts +67 -12
  189. package/src/lib/__tests__/threadId.test.ts +62 -0
  190. package/src/lib/__tests__/timestamp.test.ts +221 -93
  191. package/src/lib/__tests__/traceTopology.property.test.ts +383 -0
  192. package/src/lib/__tests__/type-narrowing.test.ts +63 -0
  193. package/src/lib/__tests__/vocabulary-dense-decoding.test.ts +405 -0
  194. package/src/lib/__tests__/vocabularyRegistry.test.ts +313 -0
  195. package/src/lib/arrow/lease.ts +43 -0
  196. package/src/lib/arrow/utils.ts +10 -14
  197. package/src/lib/arrow/vocabularyDictionary.ts +123 -0
  198. package/src/lib/bufferStrategy.ts +9 -1
  199. package/src/lib/cloudflare/traceRows.ts +3 -2
  200. package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +21 -141
  201. package/src/lib/codegen/__tests__/fixedPositionWriter-parity.test.ts +273 -0
  202. package/src/lib/codegen/__tests__/fixedPositionWriter-uint64.test.ts +61 -34
  203. package/src/lib/codegen/__tests__/nullBitmap.test.ts +33 -37
  204. package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +34 -18
  205. package/src/lib/codegen/__tests__/spanLoggerMaterializerParity.test.ts +503 -0
  206. package/src/lib/codegen/evaluatorGenerator.ts +18 -13
  207. package/src/lib/codegen/fixedPositionWriterGenerator.ts +329 -245
  208. package/src/lib/codegen/spanLoggerClosureMaterializer.ts +598 -0
  209. package/src/lib/codegen/spanLoggerGenerator.ts +241 -177
  210. package/src/lib/convertToArrow.ts +598 -311
  211. package/src/lib/defineOpContext.ts +1 -1
  212. package/src/lib/enumMetadata.ts +121 -0
  213. package/src/lib/flushScheduler.ts +11 -5
  214. package/src/lib/library.ts +37 -595
  215. package/src/lib/logBinding.ts +21 -27
  216. package/src/lib/op.ts +75 -18
  217. package/src/lib/opContext/__tests__/retry.test.ts +27 -21
  218. package/src/lib/opContext/createOpGroup.ts +33 -31
  219. package/src/lib/opContext/defineOp.ts +88 -11
  220. package/src/lib/opContext/opGroupTypes.ts +2 -2
  221. package/src/lib/opContext/opTypes.ts +1 -1
  222. package/src/lib/opContext/spanContextTypes.ts +98 -17
  223. package/src/lib/opContext/types.ts +7 -3
  224. package/src/lib/physicalLayoutPlan.ts +598 -0
  225. package/src/lib/resolveMessage.ts +67 -0
  226. package/src/lib/result.ts +20 -33
  227. package/src/lib/runtimeHint.ts +98 -0
  228. package/src/lib/schema/__tests__/featureFlags.test.ts +2 -1
  229. package/src/lib/schema/builder.ts +1 -1
  230. package/src/lib/schema/types.ts +1 -1
  231. package/src/lib/span-buffer/aot/v1.ts +26 -0
  232. package/src/lib/spanBuffer.ts +658 -92
  233. package/src/lib/spanBufferStats.ts +1 -1
  234. package/src/lib/spanContext.ts +1350 -861
  235. package/src/lib/sqlite/sqlite-common.ts +20 -31
  236. package/src/lib/testing/__tests__/topology-traversal.test.ts +174 -0
  237. package/src/lib/testing/__tests__/vitest-harness.test.ts +2 -1
  238. package/src/lib/testing/bun-harness.ts +94 -43
  239. package/src/lib/testing/extractFacts.ts +64 -78
  240. package/src/lib/testing/facts.ts +1 -1
  241. package/src/lib/testing/queryable-span.ts +23 -30
  242. package/src/lib/testing/span-query.ts +16 -20
  243. package/src/lib/testing/stdio-replay.ts +25 -8
  244. package/src/lib/testing/vitest-harness.ts +1 -1
  245. package/src/lib/threadId.ts +6 -3
  246. package/src/lib/traceRoot.es.ts +77 -42
  247. package/src/lib/traceRoot.node.ts +75 -46
  248. package/src/lib/traceRoot.ts +41 -14
  249. package/src/lib/traceTopology.ts +279 -0
  250. package/src/lib/tracer.ts +109 -98
  251. package/src/lib/tracers/ArrayQueueTracer.ts +1 -1
  252. package/src/lib/tracers/StdioTracer.ts +15 -13
  253. package/src/lib/tracers/TestTracer.ts +6 -8
  254. package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +15 -10
  255. package/src/lib/tracers/__tests__/TestTracer.test.ts +23 -13
  256. package/src/lib/types.ts +64 -33
  257. package/src/lib/vocabularyRegistry.ts +439 -0
  258. package/src/lib/wasm/WasmBufferStrategy.ts +56 -48
  259. package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +215 -11
  260. package/src/lib/wasm/__tests__/allocatorFreeBlockClamp.test.ts +86 -0
  261. package/src/lib/wasm/__tests__/wasm-identity-view.test.ts +311 -0
  262. package/src/lib/wasm/__tests__/wasm-integration.test.ts +417 -44
  263. package/src/lib/wasm/__tests__/wasm-message-buffer-families.test.ts +588 -0
  264. package/src/lib/wasm/__tests__/wasmAllocator.test.ts +100 -668
  265. package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +419 -63
  266. package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +24 -29
  267. package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +2 -2
  268. package/src/lib/wasm/wasmAllocator.ts +131 -96
  269. package/src/lib/wasm/wasmPhysicalLayout.ts +309 -0
  270. package/src/lib/wasm/wasmSpanBuffer.ts +597 -341
  271. package/src/lib/wasm/wasmTraceRoot.ts +140 -78
  272. package/src/vocabulary/register/v1.ts +1 -0
  273. package/src/wasm.ts +19 -0
  274. package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +0 -319
  275. package/src/lib/__tests__/remapped-buffer-view.test.ts +0 -635
  276. 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
@@ -68,24 +68,29 @@ export type TagWriter<T extends LogSchema> = {
68
68
  /**
69
69
  * SpanLogger - public API surface for structured logging.
70
70
  *
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.
71
+ * Operational info/warn/error calls accept either a static template or the
72
+ * untransformed fallback form `(template, fields)`. Debug/trace retain the raw
73
+ * dynamic message API. The transformer lowers supported calls to direct writes;
74
+ * internal methods and buffers remain hidden from this type.
74
75
  *
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()
76
+ * Per specs/lmao/01h_entry_types_and_logging_primitives.md, each call creates
77
+ * exactly one log entry. The generated runtime implementation binds structured
78
+ * fallback fields to the schema-specific column writers.
79
79
  */
80
80
  export interface SpanLogger<T extends LogSchema> {
81
- /** Log at info level */
82
- info(message: string): FluentLogEntry<T>;
81
+ /** Log a static info template, optionally with schema-bound fallback fields */
82
+ info(template: string): FluentLogEntry<T>;
83
+ info(template: string, fields: Partial<InferSchema<T>>): FluentLogEntry<T>;
83
84
  /** Log at debug level */
84
85
  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>;
86
+ /** Log a static warn template, optionally with schema-bound fallback fields */
87
+ warn(template: string): FluentLogEntry<T>;
88
+ warn(template: string, fields: Partial<InferSchema<T>>): FluentLogEntry<T>;
89
+ /** Log a static error template, optionally with schema-bound fallback fields */
90
+ error(template: string): FluentLogEntry<T>;
91
+ error(template: string, fields: Partial<InferSchema<T>>): FluentLogEntry<T>;
92
+ /** Log at trace level */
93
+ trace(message: string): FluentLogEntry<T>;
89
94
  }
90
95
 
91
96
  /**
@@ -208,10 +213,7 @@ export type SpanFn<Ctx extends OpContext> = {
208
213
  * Use when the callback is guaranteed sync and should return immediately
209
214
  * with a Result envelope.
210
215
  */
211
- export type SpanSyncFn<Ctx extends OpContext> = <S, E>(
212
- name: string,
213
- fn: (ctx: SpanContext<Ctx>) => Result<S, E>,
214
- ) => Result<S, E>;
216
+ export type SpanSyncFn<Ctx extends OpContext> = <S, E>(name: string, op: Op<Ctx, [], S, E>) => Result<S, E>;
215
217
 
216
218
  // =============================================================================
217
219
  // SPAN CONTEXT TYPE
@@ -359,6 +361,85 @@ export type SpanContext<Ctx extends OpContext> = {
359
361
  */
360
362
  spanSync: SpanSyncFn<Ctx>;
361
363
 
364
+ /** @internal Transformer-only fixed-arity sync-fast span ABI. */
365
+ spanAuto0<S, E>(line: number, name: string, op: Op<Ctx, [], S, E>): Result<S, E> | Promise<Result<S, E>>;
366
+ spanAuto1<S, E, A1>(
367
+ line: number,
368
+ name: string,
369
+ op: Op<Ctx, [A1], S, E>,
370
+ a1: A1,
371
+ ): Result<S, E> | Promise<Result<S, E>>;
372
+ spanAuto2<S, E, A1, A2>(
373
+ line: number,
374
+ name: string,
375
+ op: Op<Ctx, [A1, A2], S, E>,
376
+ a1: A1,
377
+ a2: A2,
378
+ ): Result<S, E> | Promise<Result<S, E>>;
379
+ spanAuto3<S, E, A1, A2, A3>(
380
+ line: number,
381
+ name: string,
382
+ op: Op<Ctx, [A1, A2, A3], S, E>,
383
+ a1: A1,
384
+ a2: A2,
385
+ a3: A3,
386
+ ): Result<S, E> | Promise<Result<S, E>>;
387
+ spanAuto4<S, E, A1, A2, A3, A4>(
388
+ line: number,
389
+ name: string,
390
+ op: Op<Ctx, [A1, A2, A3, A4], S, E>,
391
+ a1: A1,
392
+ a2: A2,
393
+ a3: A3,
394
+ a4: A4,
395
+ ): Result<S, E> | Promise<Result<S, E>>;
396
+ spanAuto5<S, E, A1, A2, A3, A4, A5>(
397
+ line: number,
398
+ name: string,
399
+ op: Op<Ctx, [A1, A2, A3, A4, A5], S, E>,
400
+ a1: A1,
401
+ a2: A2,
402
+ a3: A3,
403
+ a4: A4,
404
+ a5: A5,
405
+ ): Result<S, E> | Promise<Result<S, E>>;
406
+ spanAuto6<S, E, A1, A2, A3, A4, A5, A6>(
407
+ line: number,
408
+ name: string,
409
+ op: Op<Ctx, [A1, A2, A3, A4, A5, A6], S, E>,
410
+ a1: A1,
411
+ a2: A2,
412
+ a3: A3,
413
+ a4: A4,
414
+ a5: A5,
415
+ a6: A6,
416
+ ): Result<S, E> | Promise<Result<S, E>>;
417
+ spanAuto7<S, E, A1, A2, A3, A4, A5, A6, A7>(
418
+ line: number,
419
+ name: string,
420
+ op: Op<Ctx, [A1, A2, A3, A4, A5, A6, A7], S, E>,
421
+ a1: A1,
422
+ a2: A2,
423
+ a3: A3,
424
+ a4: A4,
425
+ a5: A5,
426
+ a6: A6,
427
+ a7: A7,
428
+ ): Result<S, E> | Promise<Result<S, E>>;
429
+ spanAuto8<S, E, A1, A2, A3, A4, A5, A6, A7, A8>(
430
+ line: number,
431
+ name: string,
432
+ op: Op<Ctx, [A1, A2, A3, A4, A5, A6, A7, A8], S, E>,
433
+ a1: A1,
434
+ a2: A2,
435
+ a3: A3,
436
+ a4: A4,
437
+ a5: A5,
438
+ a6: A6,
439
+ a7: A7,
440
+ a8: A8,
441
+ ): Result<S, E> | Promise<Result<S, E>>;
442
+
362
443
  /**
363
444
  * Set scoped attributes that auto-propagate to all subsequent log entries.
364
445
  *
@@ -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
  }