@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
@@ -58,15 +58,14 @@
58
58
  *
59
59
  * @module tracer
60
60
  */
61
- import { createTagWriter } from './codegen/fixedPositionWriterGenerator.js';
62
- import { createSpanLogger as createSpanLoggerFromGenerator } from './codegen/spanLoggerGenerator.js';
63
61
  import { Op } from './op.js';
64
62
  import { createOpMetadata } from './opContext/defineOp.js';
63
+ import { getPhysicalLayoutPlan, sealCallsitePlan, } from './physicalLayoutPlan.js';
65
64
  import { Err, Ok } from './result.js';
66
65
  import { createFeatureFlagEvaluator, InMemoryFlagEvaluator } from './schema/evaluator.js';
67
66
  import { ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_OK } from './schema/systemSchema.js';
68
- import { EMPTY_SCOPE } from './spanBuffer.js';
69
- import { createSpanContextClass, writeSpanEnd, writeSpanStart, } from './spanContext.js';
67
+ import { EMPTY_SCOPE, getSpanBufferClass } from './spanBuffer.js';
68
+ import { createSpanContextClass, isPhysicalLayoutPlanForContext, writeSpanEnd, } from './spanContext.js';
70
69
  import { generateTraceId, isValidTraceId } from './traceId.js';
71
70
  function isTraceOverridesArg(value) {
72
71
  return value !== null && typeof value === 'object' && !(value instanceof Op);
@@ -97,8 +96,10 @@ function isPromiseResult(value) {
97
96
  export class Tracer {
98
97
  logBinding;
99
98
  SpanContextClass;
99
+ physicalLayoutPlan;
100
100
  flagEvaluator;
101
101
  ctxDefaults;
102
+ requiredCtxKeys;
102
103
  deps;
103
104
  createTraceRoot;
104
105
  /**
@@ -111,18 +112,29 @@ export class Tracer {
111
112
  this.logBinding = binding.logBinding;
112
113
  this.bufferStrategy = options.bufferStrategy;
113
114
  this.ctxDefaults = binding.ctxDefaults ?? EMPTY_SCOPE;
115
+ const userContextKeys = Object.keys(this.ctxDefaults).sort();
116
+ const requiredCtxKeys = [];
117
+ for (const key of userContextKeys) {
118
+ if (this.ctxDefaults[key] === null)
119
+ requiredCtxKeys.push(key);
120
+ }
121
+ this.requiredCtxKeys = requiredCtxKeys;
114
122
  this.deps = binding.deps ?? EMPTY_SCOPE;
115
123
  this.flagEvaluator = this._createFlagEvaluator(binding.flags, options.flagEvaluator);
116
124
  this.createTraceRoot = options.createTraceRoot;
117
125
  // Create SpanContext class for all contexts created by this tracer
118
126
  // The class closes over schema/logBinding and provides typed methods
119
- this.SpanContextClass = createSpanContextClass(binding.logBinding.logSchema, binding.logBinding);
127
+ this.SpanContextClass = createSpanContextClass(binding.logBinding.logSchema, binding.logBinding, undefined, userContextKeys);
128
+ this.physicalLayoutPlan = getPhysicalLayoutPlan(getSpanBufferClass(binding.logBinding.logSchema), 0, this.SpanContextClass, undefined, 'strategy-selected', userContextKeys.join('\u0000'));
120
129
  // Bind methods for destructuring (per AGENTS.md - "Always destructure")
121
130
  this.trace = this.trace.bind(this);
122
131
  this.trace_op = this.trace_op.bind(this);
123
132
  this.trace_fn = this.trace_fn.bind(this);
124
133
  this.flush = this.flush.bind(this);
125
134
  }
135
+ getFlagEvaluatorForContext() {
136
+ return this.flagEvaluator;
137
+ }
126
138
  _createFlagEvaluator(flags, evaluator) {
127
139
  const delegate = evaluator ?? new InMemoryFlagEvaluator(flags);
128
140
  const boundEvaluator = {
@@ -165,23 +177,23 @@ export class Tracer {
165
177
  if (fnOrOp instanceof Op) {
166
178
  switch (argCount) {
167
179
  case 0:
168
- return this._trace_unknown_op(line, name, overrides, fnOrOp.metadata, fnOrOp.fn);
180
+ return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn);
169
181
  case 1:
170
- return this._trace_unknown_op(line, name, overrides, fnOrOp.metadata, fnOrOp.fn, args[fnIdx + 1]);
182
+ return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1]);
171
183
  case 2:
172
- return this._trace_unknown_op(line, name, overrides, fnOrOp.metadata, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2]);
184
+ return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2]);
173
185
  case 3:
174
- return this._trace_unknown_op(line, name, overrides, fnOrOp.metadata, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3]);
186
+ return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3]);
175
187
  case 4:
176
- return this._trace_unknown_op(line, name, overrides, fnOrOp.metadata, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4]);
188
+ return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4]);
177
189
  case 5:
178
- return this._trace_unknown_op(line, name, overrides, fnOrOp.metadata, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5]);
190
+ return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5]);
179
191
  case 6:
180
- return this._trace_unknown_op(line, name, overrides, fnOrOp.metadata, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5], args[fnIdx + 6]);
192
+ return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5], args[fnIdx + 6]);
181
193
  case 7:
182
- return this._trace_unknown_op(line, name, overrides, fnOrOp.metadata, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5], args[fnIdx + 6], args[fnIdx + 7]);
194
+ return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5], args[fnIdx + 6], args[fnIdx + 7]);
183
195
  case 8:
184
- return this._trace_unknown_op(line, name, overrides, fnOrOp.metadata, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5], args[fnIdx + 6], args[fnIdx + 7], args[fnIdx + 8]);
196
+ return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5], args[fnIdx + 6], args[fnIdx + 7], args[fnIdx + 8]);
185
197
  default:
186
198
  throw new Error(`trace() supports up to 8 op arguments, got ${argCount}`);
187
199
  }
@@ -204,15 +216,22 @@ export class Tracer {
204
216
  * Supports 0-8 arguments. The transformer rewrites trace() calls to this.
205
217
  */
206
218
  _trace_op(line, name, overrides, op, ...opArgs) {
207
- const ctx = this._createRootContext(line, name, overrides, op.metadata);
219
+ if (!isPhysicalLayoutPlanForContext(op.callsitePlan, this.logBinding.logSchema)) {
220
+ throw new TypeError('Op physical layout plan does not match this tracer context');
221
+ }
222
+ const ctx = this._createRootContext(line, name, overrides, op.callsitePlan);
208
223
  return this._executeResultWithContext(ctx, (c) => op.fn(c, ...opArgs));
209
224
  }
210
- _trace_unknown_op(line, name, overrides, metadata, fn, ...opArgs) {
211
- const ctx = this._createRootContext(line, name, overrides, metadata);
225
+ _trace_unknown_op(line, name, overrides, callsitePlan, fn, ...opArgs) {
226
+ const ctx = this._createRootContext(line, name, overrides, callsitePlan);
212
227
  return this._executeResultWithContext(ctx, (childCtx) => fn(childCtx, ...opArgs));
213
228
  }
214
229
  _trace_fn(line, name, overrides, fn) {
215
- const ctx = this._createRootContext(line, name, overrides, createOpMetadata('root', 'tracer', 'runtime', 'unknown', 0));
230
+ const metadata = Object.freeze({
231
+ ...createOpMetadata('root', 'tracer', 'runtime', 'unknown', 0),
232
+ _physicalLayoutPlan: this.physicalLayoutPlan,
233
+ });
234
+ const ctx = this._createRootContext(line, name, overrides, sealCallsitePlan(this.physicalLayoutPlan, metadata));
216
235
  return this._executeUnknownWithContext(ctx, fn);
217
236
  }
218
237
  _trace_unknown_fn(line, name, overrides, fn) {
@@ -234,68 +253,41 @@ export class Tracer {
234
253
  // ===========================================================================
235
254
  // Internal helpers
236
255
  // ===========================================================================
237
- _createRootContext(_line, name, overrides, metadata) {
256
+ _createRootContext(_line, name, overrides, callsitePlan) {
238
257
  // Extract trace_id from overrides if present
239
258
  const traceId = isValidTraceId(overrides.trace_id) ? overrides.trace_id : generateTraceId();
240
- const schema = this.logBinding.logSchema;
241
- // Validate null-sentinel required fields and merge user context.
242
- // _resolveUserContext ignores trace_id (transport-only field).
243
- const overrideRecord = { ...overrides };
244
- const resolvedUserCtx = this._resolveUserContext(overrideRecord);
259
+ const schema = callsitePlan.schema;
260
+ // Validate required null-sentinel fields before allocating the trace root or buffer.
261
+ this._validateRequiredUserContext(overrides);
245
262
  // Create TraceRoot via platform-specific factory
246
263
  const traceRoot = this.createTraceRoot(traceId, this);
247
264
  // Create root SpanBuffer with pre-built TraceRoot via strategy
248
- const buffer = this.bufferStrategy.createSpanBuffer(schema, traceRoot, // pre-built TraceRoot with trace_id, anchors, tracer
249
- metadata);
265
+ const buffer = this.bufferStrategy.createSpanBuffer(schema, traceRoot, callsitePlan.metadata, callsitePlan.capacityTier, callsitePlan.SpanBufferClass);
250
266
  // Write span-start entry (row 0)
251
- writeSpanStart(buffer, name);
252
- // Create tag writer and span logger (needed for constructor)
253
- const tagWriter = createTagWriter(schema, buffer);
254
- const spanLogger = createSpanLoggerFromGenerator(schema, buffer);
255
- // Instantiate SpanContext class with direct arguments (no temp object allocation)
256
- const ctx = new this.SpanContextClass(buffer, schema, spanLogger, tagWriter);
257
- // Set up deps from config (may be EMPTY_SCOPE if none provided)
258
- ctx.deps = this.deps;
259
- ctx.ff = this.flagEvaluator.forContext(ctx);
260
- // Copy resolved user context onto SpanContext.
261
- for (const key in resolvedUserCtx) {
262
- ctx[key] = resolvedUserCtx[key];
263
- }
264
- return ctx;
267
+ callsitePlan.appenders.writeSpanStart(buffer, name);
268
+ return new callsitePlan.SpanContextClass(buffer, schema, callsitePlan, this.ctxDefaults, overrides, this.deps, this.flagEvaluator);
265
269
  }
266
270
  /**
267
- * Validate null-sentinel required fields and merge with provided overrides.
271
+ * Validate null-sentinel required fields without materializing a merged
272
+ * user-context carrier.
268
273
  *
269
274
  * Per the ctx config pattern:
270
275
  * - Properties with null values in ctxDefaults must be provided in overrides
271
276
  * - Properties with default values can optionally be overridden
272
277
  * - undefined is allowed for optional fields
273
278
  */
274
- _resolveUserContext(overrides) {
275
- const ctxDefaults = this.ctxDefaults;
276
- // Check that all null-sentinel keys are provided in overrides
277
- for (const key of Object.keys(ctxDefaults)) {
278
- const defaultValue = ctxDefaults[key];
279
- if (defaultValue === null) {
280
- const providedValue = overrides[key];
281
- if (providedValue === null || providedValue === undefined) {
282
- throw new Error(`Required context parameter '${key}' must be provided. ` +
283
- 'Properties with null values in ctx config are required.');
284
- }
285
- }
286
- }
287
- // Merge defaults with provided overrides (provided values win)
288
- const resolvedUserCtx = { ...ctxDefaults };
289
- for (const key of Object.keys(overrides)) {
290
- if (key === 'trace_id') {
291
- continue;
279
+ _validateRequiredUserContext(overrides) {
280
+ for (const key of this.requiredCtxKeys) {
281
+ if (!Object.prototype.propertyIsEnumerable.call(overrides, key)) {
282
+ throw new Error(`Required context parameter '${key}' must be provided. ` +
283
+ 'Properties with null values in ctx config are required.');
292
284
  }
293
- const value = overrides[key];
294
- if (value !== undefined) {
295
- resolvedUserCtx[key] = value;
285
+ const providedValue = overrides[key];
286
+ if (providedValue === null || providedValue === undefined) {
287
+ throw new Error(`Required context parameter '${key}' must be provided. ` +
288
+ 'Properties with null values in ctx config are required.');
296
289
  }
297
290
  }
298
- return resolvedUserCtx;
299
291
  }
300
292
  /**
301
293
  * Execute function with context and handle span-ok/span-err/span-exception writes
@@ -305,7 +297,8 @@ export class Tracer {
305
297
  * when the function returns an Ok/Err result.
306
298
  */
307
299
  _executeResultWithContext(ctx, fn) {
308
- const buffer = ctx._buffer;
300
+ const buffer = ctx._spanBuffer;
301
+ const writeSpanEndEntry = ctx._physicalLayoutPlan.appenders.writeSpanEnd;
309
302
  this.onTraceStart(buffer);
310
303
  let isAsync = false;
311
304
  try {
@@ -317,7 +310,7 @@ export class Tracer {
317
310
  writeSpanEnd(buffer, resolved);
318
311
  return resolved;
319
312
  }, (error) => {
320
- buffer._traceRoot.writeSpanEnd(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
313
+ writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
321
314
  const errorMessage = error instanceof Error ? error.message : String(error);
322
315
  const errorStack = error instanceof Error ? error.stack : undefined;
323
316
  buffer.message(1, errorMessage);
@@ -332,7 +325,7 @@ export class Tracer {
332
325
  return result;
333
326
  }
334
327
  catch (error) {
335
- buffer._traceRoot.writeSpanEnd(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
328
+ writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
336
329
  const errorMessage = error instanceof Error ? error.message : String(error);
337
330
  const errorStack = error instanceof Error ? error.stack : undefined;
338
331
  buffer.message(1, errorMessage);
@@ -348,7 +341,8 @@ export class Tracer {
348
341
  }
349
342
  }
350
343
  _executeUnknownWithContext(ctx, fn) {
351
- const buffer = ctx._buffer;
344
+ const buffer = ctx._spanBuffer;
345
+ const writeSpanEndEntry = ctx._physicalLayoutPlan.appenders.writeSpanEnd;
352
346
  // Call trace start hook
353
347
  this.onTraceStart(buffer);
354
348
  let isAsync = false;
@@ -362,11 +356,11 @@ export class Tracer {
362
356
  writeSpanEnd(buffer, resolved);
363
357
  }
364
358
  else {
365
- buffer._traceRoot.writeSpanEnd(buffer, ENTRY_TYPE_SPAN_OK);
359
+ writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_OK);
366
360
  }
367
361
  return resolved;
368
362
  }, (error) => {
369
- buffer._traceRoot.writeSpanEnd(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
363
+ writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
370
364
  const errorMessage = error instanceof Error ? error.message : String(error);
371
365
  const errorStack = error instanceof Error ? error.stack : undefined;
372
366
  buffer.message(1, errorMessage);
@@ -382,13 +376,13 @@ export class Tracer {
382
376
  writeSpanEnd(buffer, result);
383
377
  }
384
378
  else {
385
- buffer._traceRoot.writeSpanEnd(buffer, ENTRY_TYPE_SPAN_OK);
379
+ writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_OK);
386
380
  }
387
381
  return result;
388
382
  }
389
383
  catch (error) {
390
384
  // Sync exception path
391
- buffer._traceRoot.writeSpanEnd(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
385
+ writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
392
386
  // Write exception details
393
387
  const errorMessage = error instanceof Error ? error.message : String(error);
394
388
  const errorStack = error instanceof Error ? error.stack : undefined;
@@ -49,7 +49,7 @@ export declare class ArrayQueueTracer<B extends OpContextBinding = OpContextBind
49
49
  * Consume all queued buffers and clear the queue.
50
50
  * Returns an independent copy of the queue contents.
51
51
  *
52
- * @returns Array of root buffers (with child spans in _children tree)
52
+ * @returns Array of root buffers whose children live in the trace topology arena
53
53
  */
54
54
  drain(): SpanBuffer<B['logBinding']['logSchema']>[];
55
55
  }
@@ -57,7 +57,7 @@ export class ArrayQueueTracer extends Tracer {
57
57
  * Consume all queued buffers and clear the queue.
58
58
  * Returns an independent copy of the queue contents.
59
59
  *
60
- * @returns Array of root buffers (with child spans in _children tree)
60
+ * @returns Array of root buffers whose children live in the trace topology arena
61
61
  */
62
62
  drain() {
63
63
  const buffers = [...this.queue];
@@ -1 +1 @@
1
- {"version":3,"file":"StdioTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/StdioTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAY9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AA+HD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,iDAAiD;IACjD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,gDAAgD;IAChD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;GASG;AAEH,qBAAa,WAAW,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACvF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IAEvC,YAAY,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAKhF;IAMD,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IAoCpB,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAOvF;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAqBrF;IAED,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAQvF;IAED,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAsBrF;IAED,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAgB3E;CACF"}
1
+ {"version":3,"file":"StdioTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/StdioTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAa9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAgID;;GAEG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,iDAAiD;IACjD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,gDAAgD;IAChD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;GASG;AAEH,qBAAa,WAAW,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACvF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IAEvC,YAAY,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAKhF;IAMD,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IAoCpB,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAOvF;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAqBrF;IAED,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAQvF;IAED,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAsBrF;IAED,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAgB3E;CACF"}
@@ -30,6 +30,7 @@
30
30
  * // [2025-12-25T10:30:45.226Z] [123456] fetch-user (103.00ms) ========
31
31
  * ```
32
32
  */
33
+ import { resolveEntryType, resolveMessage } from '../resolveMessage.js';
33
34
  import { ENTRY_TYPE_DEBUG, ENTRY_TYPE_ERROR, ENTRY_TYPE_INFO, ENTRY_TYPE_SPAN_ERR, ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_OK, ENTRY_TYPE_TRACE, ENTRY_TYPE_WARN, } from '../schema/systemSchema.js';
34
35
  import { Tracer } from '../tracer.js';
35
36
  // ============================================================================
@@ -127,19 +128,20 @@ function getLogLevel(entryType) {
127
128
  }
128
129
  }
129
130
  function formatTemplateMessage(buffer, row, template) {
130
- return template.replace(/\{\{([A-Za-z0-9_]+)\}\}/g, (_full, key) => {
131
+ return template.replace(/\{([A-Za-z0-9_]+)\}/g, (_full, key) => {
132
+ const placeholder = `{${key}}`;
131
133
  const values = Reflect.get(buffer, `${key}_values`);
132
134
  if (values == null)
133
- return `{{${key}}}`;
135
+ return placeholder;
134
136
  if (Array.isArray(values)) {
135
137
  const value = values[row];
136
- return value === null || value === undefined ? `{{${key}}}` : String(value);
138
+ return value === null || value === undefined ? placeholder : String(value);
137
139
  }
138
140
  if (ArrayBuffer.isView(values)) {
139
141
  const value = Reflect.get(values, row);
140
- return value === null || value === undefined ? `{{${key}}}` : String(value);
142
+ return value === null || value === undefined ? placeholder : String(value);
141
143
  }
142
- return `{{${key}}}`;
144
+ return placeholder;
143
145
  });
144
146
  }
145
147
  // ============================================================================
@@ -208,10 +210,10 @@ export class StdioTracer extends Tracer {
208
210
  const start = isRootSegment ? 2 : 0;
209
211
  const end = current._writeIndex;
210
212
  for (let i = start; i < end; i++) {
211
- const level = getLogLevel(current.entry_type[i]);
213
+ const level = getLogLevel(resolveEntryType(current, i));
212
214
  if (!level)
213
215
  continue;
214
- const template = current.message_values[i] ?? '';
216
+ const template = resolveMessage(current, i) ?? '';
215
217
  const message = formatTemplateMessage(current, i, template);
216
218
  const ts = formatTimestamp(current.timestamp[i]);
217
219
  const traceId = current.trace_id;
@@ -233,7 +235,7 @@ export class StdioTracer extends Tracer {
233
235
  // --------------------------------------------------------------------------
234
236
  onTraceStart(rootBuffer) {
235
237
  const traceId = rootBuffer.trace_id;
236
- const name = rootBuffer.message_values[0];
238
+ const name = resolveMessage(rootBuffer, 0);
237
239
  const ts = formatTimestamp(rootBuffer.timestamp[0]);
238
240
  this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${name}\n`);
239
241
  this.incrementIndent(traceId);
@@ -242,11 +244,11 @@ export class StdioTracer extends Tracer {
242
244
  const traceId = rootBuffer.trace_id;
243
245
  this.printLogRows(rootBuffer, 1);
244
246
  this.decrementIndent(traceId);
245
- const name = rootBuffer.message_values[0];
247
+ const name = resolveMessage(rootBuffer, 0);
246
248
  const startTs = rootBuffer.timestamp[0];
247
249
  const endTs = rootBuffer.timestamp[1];
248
250
  const duration = formatDuration(endTs - startTs);
249
- const entryType = rootBuffer.entry_type[1];
251
+ const entryType = resolveEntryType(rootBuffer, 1);
250
252
  const status = getStatus(entryType);
251
253
  const ts = formatTimestamp(endTs);
252
254
  const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${name} [${status}] (${duration}) ${'='.repeat(40)}\n`;
@@ -261,7 +263,7 @@ export class StdioTracer extends Tracer {
261
263
  onSpanStart(childBuffer) {
262
264
  const traceId = childBuffer.trace_id;
263
265
  const indent = this.getIndent(traceId);
264
- const name = childBuffer.message_values[0];
266
+ const name = resolveMessage(childBuffer, 0);
265
267
  const ts = formatTimestamp(childBuffer.timestamp[0]);
266
268
  this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${' '.repeat(indent)}├─ ${name}\n`);
267
269
  this.incrementIndent(traceId);
@@ -271,11 +273,11 @@ export class StdioTracer extends Tracer {
271
273
  this.decrementIndent(traceId);
272
274
  const indent = this.getIndent(traceId);
273
275
  this.printLogRows(childBuffer, indent + 1);
274
- const name = childBuffer.message_values[0];
276
+ const name = resolveMessage(childBuffer, 0);
275
277
  const startTs = childBuffer.timestamp[0];
276
278
  const endTs = childBuffer.timestamp[1];
277
279
  const duration = formatDuration(endTs - startTs);
278
- const entryType = childBuffer.entry_type[1];
280
+ const entryType = resolveEntryType(childBuffer, 1);
279
281
  const status = getStatus(entryType);
280
282
  const ts = formatTimestamp(endTs);
281
283
  const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${' '.repeat(indent)}└─ ${name} [${status}] (${duration})\n`;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * TestTracer - A tracer that accumulates completed root trace buffers for test inspection.
3
3
  *
4
- * Child spans are accessible via the buffer's `_children` tree - no need to track them separately.
4
+ * Child spans are accessible through the trace topology arena; no duplicate tracking is needed.
5
5
  * This is the primary tracer for tests that need to inspect trace output, convert to Arrow tables,
6
6
  * or verify buffer contents.
7
7
  *
@@ -43,9 +43,8 @@ export interface StatsSnapshot<T extends LogSchema = LogSchema> {
43
43
  /**
44
44
  * Test tracer that accumulates root buffers for inspection.
45
45
  *
46
- * Collects all completed root trace buffers in `rootBuffers` array.
47
- * Child spans are accessible via the buffer's `_children` tree -
48
- * no need to track them separately.
46
+ * Collects all completed root trace buffers in `rootBuffers`; child spans remain reachable
47
+ * through each root's trace topology arena.
49
48
  *
50
49
  * Also tracks capacity tuning events via `statsSnapshots` to verify
51
50
  * that `onStatsWillResetFor` is called before stats are reset.
@@ -72,8 +71,7 @@ export interface StatsSnapshot<T extends LogSchema = LogSchema> {
72
71
  */
73
72
  export declare class TestTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
74
73
  /**
75
- * All completed root trace buffers.
76
- * Child spans are accessible via each buffer's `_children` tree.
74
+ * All completed root trace buffers. Child spans remain in each root's topology arena.
77
75
  */
78
76
  readonly rootBuffers: SpanBuffer<B['logBinding']['logSchema']>[];
79
77
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"TestTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/TestTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAU9C;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC5D,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,qBAAa,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACtF;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAEtE;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAM5E,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAGrE;IAED,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAEtE;IAED,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAS1E;IAMD;;;OAGG;IACH,KAAK,IAAI,IAAI,CAQZ;CACF"}
1
+ {"version":3,"file":"TestTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/TestTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAU9C;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC5D,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,qBAAa,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACtF;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAEtE;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAM5E,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAGrE;IAED,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAEtE;IAED,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAS1E;IAMD;;;OAGG;IACH,KAAK,IAAI,IAAI,CAQZ;CACF"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * TestTracer - A tracer that accumulates completed root trace buffers for test inspection.
3
3
  *
4
- * Child spans are accessible via the buffer's `_children` tree - no need to track them separately.
4
+ * Child spans are accessible through the trace topology arena; no duplicate tracking is needed.
5
5
  * This is the primary tracer for tests that need to inspect trace output, convert to Arrow tables,
6
6
  * or verify buffer contents.
7
7
  *
@@ -34,9 +34,8 @@ function isResettableBufferStrategy(value) {
34
34
  /**
35
35
  * Test tracer that accumulates root buffers for inspection.
36
36
  *
37
- * Collects all completed root trace buffers in `rootBuffers` array.
38
- * Child spans are accessible via the buffer's `_children` tree -
39
- * no need to track them separately.
37
+ * Collects all completed root trace buffers in `rootBuffers`; child spans remain reachable
38
+ * through each root's trace topology arena.
40
39
  *
41
40
  * Also tracks capacity tuning events via `statsSnapshots` to verify
42
41
  * that `onStatsWillResetFor` is called before stats are reset.
@@ -64,8 +63,7 @@ function isResettableBufferStrategy(value) {
64
63
  //#region smoo/lmao!n/tracer-implementations.test
65
64
  export class TestTracer extends Tracer {
66
65
  /**
67
- * All completed root trace buffers.
68
- * Child spans are accessible via each buffer's `_children` tree.
66
+ * All completed root trace buffers. Child spans remain in each root's topology arena.
69
67
  */
70
68
  rootBuffers = [];
71
69
  /**
@@ -84,10 +82,10 @@ export class TestTracer extends Tracer {
84
82
  this.rootBuffers.push(rootBuffer);
85
83
  }
86
84
  onSpanStart(_childBuffer) {
87
- // No-op - children are in tree, accessed via rootBuffer._children
85
+ // No-op - children are registered in the trace topology arena
88
86
  }
89
87
  onSpanEnd(_childBuffer) {
90
- // No-op - children are in tree, accessed via rootBuffer._children
88
+ // No-op - children are registered in the trace topology arena
91
89
  }
92
90
  onStatsWillResetFor(buffer) {
93
91
  // Capture stats snapshot before they're reset
@@ -10,12 +10,14 @@
10
10
  */
11
11
  import type { AnyColumnBuffer, ColumnBuffer, ColumnValueType, EagerBinarySchema, LazyBinarySchema, Nanoseconds, TypedArray } from '@smoothbricks/arrow-builder';
12
12
  import type { OpMetadata } from './opContext/opTypes.js';
13
+ import type { MessageLayoutFamily, MessagePhysicalLayout } from './runtimeHint.js';
13
14
  import type { LogSchema } from './schema/LogSchema.js';
14
15
  import type { InferSchema } from './schema/types.js';
15
16
  import type { SpanBufferStats } from './spanBufferStats.js';
16
17
  import type { TraceId } from './traceId.js';
17
18
  import type { ITraceRoot } from './traceRoot.js';
18
- export type { LogBinding, RemappedViewConstructor } from './logBinding.js';
19
+ import type { VocabularyGeneration } from './vocabularyRegistry.js';
20
+ export type { LogBinding, RemapDescriptor, RemappedColumn } from './logBinding.js';
19
21
  export type { OpMetadata } from './opContext/opTypes.js';
20
22
  export type { extractSpanIdentity, SpanIdentity } from './traceId.js';
21
23
  export type { TracerLifecycleHooks } from './traceRoot.js';
@@ -77,13 +79,29 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
77
79
  * - Rows 2+: log entry timestamps
78
80
  */
79
81
  readonly timestamp: BigInt64Array;
80
- /**
81
- * Entry type enum for each row (Uint8Array, 1 byte per entry).
82
- *
83
- * Per specs/lmao/01h_entry_types_and_logging_primitives.md:
84
- * Values are ENTRY_TYPE_* constants (span-start=1, span-ok=2, etc.)
85
- */
86
- readonly entry_type: Uint8Array;
82
+ /** Current and specialized layouts expose this direct lane; packed uses `resolveEntryType`. */
83
+ readonly entry_type?: Uint8Array;
84
+ /** Current-mode buffer-local template IDs. Zero selects the raw reference lane. */
85
+ readonly _messageIds?: Uint16Array;
86
+ /** Specialized 1-based global dense message identities. Zero selects the raw/null sidecar sentinel. */
87
+ readonly _logHeaders?: Uint32Array;
88
+ /** Packed row headers: low 8 bits entry type, high 24 bits dense message index plus one. */
89
+ readonly _rowHeaders?: Uint32Array;
90
+ /** Immutable vocabulary generation against which packed message indices resolve. */
91
+ readonly _vocabularyGeneration: VocabularyGeneration;
92
+ /** Concrete semantic message family selected once for this buffer constructor. */
93
+ readonly _messageLayoutFamily: MessageLayoutFamily;
94
+ /**
95
+ * One-shot token set by WASM constructors whose allocation export already
96
+ * initialized row 0, row 1, and the shared write index.
97
+ */
98
+ _spanStartedAtAllocation?: boolean;
99
+ /** Concrete physical row layout selected once for this buffer constructor. */
100
+ readonly _messagePhysicalLayout: MessagePhysicalLayout;
101
+ /** Dedicated row-0 span name used when the selected capacity lane cannot represent it. */
102
+ _spanName?: string | number;
103
+ /** Dedicated row-1 raw result/exception text for static-only buffers. */
104
+ _terminalMessage?: string;
87
105
  /**
88
106
  * Timestamp of span start (row 0).
89
107
  *
@@ -112,6 +130,10 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
112
130
  * Per specs/lmao/01b2: Buffers chain rather than resize for predictable allocation.
113
131
  */
114
132
  _overflow?: AnySpanBuffer;
133
+ /** Whether this physical segment has contributed its rows to shared stats. */
134
+ _statsSealed: boolean;
135
+ /** Lifecycle rows excluded when this physical segment is sealed (2 for first segment, 0 for overflow). */
136
+ _statsReservedRows: number;
115
137
  /**
116
138
  * Span ID - 32-bit counter unique within this trace.
117
139
  * Per specs/lmao/01b4_span_identity.md: Monotonic counter, not globally unique.
@@ -146,29 +168,24 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
146
168
  */
147
169
  readonly _logSchema: LogSchema;
148
170
  /**
149
- * Column entries for Arrow conversion iteration.
150
- * For SpanBuffer: delegates to _logSchema._columns (unprefixed names)
151
- * For RemappedBufferView: built in constructor with prefixed names from mapping
152
- *
153
- * This enables Arrow conversion to iterate column names correctly regardless of
154
- * whether the buffer is wrapped in a RemappedBufferView.
171
+ * Canonical schema column entries for this buffer.
172
+ * Output remapping lives separately in `_remapDescriptor` and is interpreted
173
+ * only by cold Arrow traversal.
155
174
  */
156
175
  readonly _columns: ReadonlyArray<[string, unknown]>;
176
+ /** Immutable cold-path output remapping attached to canonical child buffers. */
177
+ _remapDescriptor?: import('./logBinding.js').RemapDescriptor;
157
178
  /**
158
179
  * Shared stats for all buffers from same defineOpContext (accessed via constructor.stats).
159
180
  * Enables self-tuning capacity learning across all ops in the same context.
160
181
  * Underscore prefix since this is an internal property.
161
182
  */
162
183
  readonly _stats: SpanBufferStats;
163
- /**
164
- * Child spans created via ctx.span().
165
- * Per specs/lmao/01c: Parent-child relationship for trace tree.
166
- */
167
- _children: AnySpanBuffer[];
168
- /**
169
- * Parent span buffer (undefined for root).
170
- * Set during createChildSpanBuffer().
171
- */
184
+ /** Stable trace-owned logical node index. Overflow segments share the same index. */
185
+ _nodeIndex: number;
186
+ /** Trace-topology generation used to reject released or reset handles. */
187
+ _topologyGeneration: number;
188
+ /** Parent span buffer (undefined for root). Preserved for identity access and parent ascent. */
172
189
  _parent?: AnySpanBuffer;
173
190
  /**
174
191
  * Root trace context - shared by all buffers in a trace.
@@ -199,12 +216,8 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
199
216
  * - Applied to all rows at Arrow conversion via TypedArray.fill()
200
217
  */
201
218
  _scopeValues: Readonly<Record<string, unknown>>;
202
- /**
203
- * Message column values - category strings (eager, always allocated).
204
- * Contains span names, log messages, exception messages, etc.
205
- */
206
- readonly message_values: string[];
207
- readonly message_nulls: Uint8Array;
219
+ /** Raw per-row message lane. Omitted by static-only; `undefined` is the null sentinel. */
220
+ readonly message_values?: (string | undefined)[];
208
221
  /**
209
222
  * Line number column values - Float64Array (lazy but always present).
210
223
  * Contains source code line numbers injected by transformer.
@@ -290,6 +303,10 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
290
303
  * @returns The overflow buffer (existing or newly created)
291
304
  */
292
305
  getOrCreateOverflow(): AnySpanBuffer;
306
+ /** Account this physical segment's completed rows exactly once. */
307
+ _sealStats(): void;
308
+ /** Account every physical segment in this logical span's overflow chain exactly once. */
309
+ _sealStatsChain(): void;
293
310
  /**
294
311
  * Check if this span is a parent of another span.
295
312
  * Used for tree traversal and validation.
@@ -347,19 +364,19 @@ type FilterSchemaFields<T> = {
347
364
  * T is REQUIRED - there is no default. Use AnySpanBuffer for generic processing.
348
365
  */
349
366
  export type SpanBuffer<T extends LogSchema> = AnySpanBuffer & {
350
- _children: SpanBuffer<T>[];
351
367
  _parent?: SpanBuffer<T>;
352
368
  _overflow?: SpanBuffer<T>;
353
369
  readonly _logSchema: T;
370
+ _traceRoot: ITraceRoot<T>;
354
371
  _scopeValues: Readonly<Partial<InferSchema<T>>>;
355
372
  isParentOf(other: SpanBuffer<T>): boolean;
356
373
  isChildOf(other: SpanBuffer<T>): boolean;
357
374
  [key: `${string}_values`]: TypedArray | string[] | unknown[] | undefined;
358
375
  [key: `${string}_nulls`]: Uint8Array | undefined;
359
376
  } & {
360
- readonly [K in keyof FilterSchemaFields<T['fields']> as `${K & string}_values`]: ValuesArrayType<FilterSchemaFields<T['fields']>[K]>;
377
+ readonly [K in keyof FilterSchemaFields<T['fields']> as K extends 'message' ? never : `${K & string}_values`]: ValuesArrayType<FilterSchemaFields<T['fields']>[K]>;
361
378
  } & {
362
- readonly [K in keyof FilterSchemaFields<T['fields']> as `${K & string}_nulls`]: Uint8Array;
379
+ readonly [K in keyof FilterSchemaFields<T['fields']> as K extends 'message' ? never : `${K & string}_nulls`]: Uint8Array;
363
380
  } & {
364
381
  [K in keyof FilterSchemaFields<T['fields']>]: (pos: number, val: SetterValueType<FilterSchemaFields<T['fields']>[K]>) => SpanBuffer<T>;
365
382
  };