@smoothbricks/lmao 0.2.1 → 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
package/dist/lib/op.d.ts CHANGED
@@ -13,11 +13,16 @@
13
13
  * - Op name is used for metrics tracking (separate from span names)
14
14
  */
15
15
  import type { PreEncodedEntry } from '@smoothbricks/arrow-builder';
16
- import type { RemappedViewConstructor } from './logBinding.js';
16
+ import type { RemapDescriptor } from './logBinding.js';
17
17
  import type { SpanContext } from './opContext/spanContextTypes.js';
18
18
  import type { OpContext, OpContextBinding } from './opContext/types.js';
19
+ import type { ArrowExposurePlan, CallsitePlan, EagerColumnDescriptor, PhysicalAppenders } from './physicalLayoutPlan.js';
19
20
  import type { Result } from './result.js';
21
+ import type { LogSchema } from './schema/LogSchema.js';
20
22
  import type { SpanBufferConstructor } from './spanBuffer.js';
23
+ import type { TimestampAppendPrimitive } from './traceRoot.js';
24
+ import type { VocabularyGeneration } from './vocabularyRegistry.js';
25
+ import type { WasmLayoutTemplate } from './wasm/wasmPhysicalLayout.js';
21
26
  /**
22
27
  * Metadata injected by the transformer into each Op.
23
28
  * These values are determined at compile time from the source location.
@@ -25,7 +30,14 @@ import type { SpanBufferConstructor } from './spanBuffer.js';
25
30
  * Includes pre-encoded UTF-8 entries for Arrow dictionary building -
26
31
  * encode once at Op definition time, reuse for every span conversion.
27
32
  */
28
- export interface OpMetadata {
33
+ export interface OpCompileMetadata {
34
+ readonly runtimeHint: number;
35
+ readonly eagerColumns?: readonly string[];
36
+ readonly localMessageDictionary?: readonly number[];
37
+ /** ttsc-only startup hook that installs the source-emitted physical buffer constructor. */
38
+ readonly materializeSpanBufferClass?: (schema: LogSchema) => void;
39
+ }
40
+ export interface OpMetadata<T extends LogSchema = LogSchema> {
29
41
  /** Op name for metrics tracking (distinct from span names which are provided at call sites) */
30
42
  readonly name: string;
31
43
  /** Package name from package.json */
@@ -42,6 +54,18 @@ export interface OpMetadata {
42
54
  readonly package_file_entry: PreEncodedEntry;
43
55
  /** Pre-encoded git_sha for Arrow dictionary building */
44
56
  readonly git_sha_entry: PreEncodedEntry;
57
+ /** Startup-resolved physical layout used by span setup; absent only on raw fallback metadata. */
58
+ readonly _physicalLayoutPlan?: {
59
+ readonly SpanBufferClass: SpanBufferConstructor<T>;
60
+ readonly eagerColumns: EagerColumnDescriptor;
61
+ readonly vocabularyGeneration: VocabularyGeneration;
62
+ readonly localMessageDictionary: readonly number[];
63
+ readonly encodeLocalMessage: (globalDenseIndex: number) => number;
64
+ readonly wasmLayout: WasmLayoutTemplate;
65
+ readonly appendLogEntry: TimestampAppendPrimitive;
66
+ readonly arrowExposure: ArrowExposurePlan;
67
+ readonly appenders: PhysicalAppenders;
68
+ };
45
69
  }
46
70
  /**
47
71
  * Op - Traced operation (Phase 2 architecture)
@@ -63,7 +87,7 @@ export interface OpMetadata {
63
87
  *
64
88
  * Phase 2 architecture:
65
89
  * - SpanBufferClass carries static schema + stats (shared by all ops from same defineOpContext)
66
- * - remappedViewClass only set for prefixed ops (wraps child buffers before adding to _children)
90
+ * - remapDescriptor is an immutable cold-path binding for prefixed/mapped ops
67
91
  * - No LogBinding - stats accessed via SpanBufferClass.stats
68
92
  *
69
93
  * @typeParam Ctx - OpContext with deps, ff, env (contravariant position)
@@ -72,34 +96,10 @@ export interface OpMetadata {
72
96
  * @typeParam E - Error type of the Result
73
97
  */
74
98
  export declare class Op<Ctx extends OpContext, Args extends unknown[], S, E> {
75
- /** Op name for metrics, telemetry, and debugging */
76
99
  readonly metadata: OpMetadata;
77
- /** Op owns buffer creation - class has static schema + stats shared by all instances */
78
- readonly SpanBufferClass: SpanBufferConstructor;
79
- /** The user function to execute - called by span_op after context creation (can be sync or async) */
100
+ readonly callsitePlan: CallsitePlan<Ctx['logSchema'], Ctx>;
80
101
  readonly fn: (ctx: SpanContext<Ctx>, ...args: Args) => Result<S, E> | Promise<Result<S, E>>;
81
- /** Only set for prefixed ops - wraps child buffers during registration */
82
- readonly remappedViewClass?: RemappedViewConstructor | undefined;
83
- /**
84
- * WHY: Carries the OpContextBinding from the factory that created this Op.
85
- * Enables downstream consumers (defineAgentOps, OpRegistry) to extract the
86
- * LMAO schema for context merging and conflict detection.
87
- */
88
- readonly _opContextBinding?: OpContextBinding | undefined;
89
- constructor(
90
- /** Op name for metrics, telemetry, and debugging */
91
- metadata: OpMetadata,
92
- /** Op owns buffer creation - class has static schema + stats shared by all instances */
93
- SpanBufferClass: SpanBufferConstructor,
94
- /** The user function to execute - called by span_op after context creation (can be sync or async) */
95
- fn: (ctx: SpanContext<Ctx>, ...args: Args) => Result<S, E> | Promise<Result<S, E>>,
96
- /** Only set for prefixed ops - wraps child buffers during registration */
97
- remappedViewClass?: RemappedViewConstructor | undefined,
98
- /**
99
- * WHY: Carries the OpContextBinding from the factory that created this Op.
100
- * Enables downstream consumers (defineAgentOps, OpRegistry) to extract the
101
- * LMAO schema for context merging and conflict detection.
102
- */
103
- _opContextBinding?: OpContextBinding | undefined);
102
+ readonly _opContextBinding?: OpContextBinding<Ctx['logSchema'], Ctx['flags'], Ctx['deps'], Ctx['userCtx']>;
103
+ constructor(metadata: OpMetadata, SpanBufferClass: SpanBufferConstructor<Ctx['logSchema']>, fn: (ctx: SpanContext<Ctx>, ...args: Args) => Result<S, E> | Promise<Result<S, E>>, remapDescriptor?: RemapDescriptor, opContextBinding?: OpContextBinding<Ctx['logSchema'], Ctx['flags'], Ctx['deps'], Ctx['userCtx']>, runtimeHint?: number, eagerColumns?: readonly string[], localMessageDictionary?: readonly number[]);
104
104
  }
105
105
  //# sourceMappingURL=op.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"op.d.ts","sourceRoot":"","sources":["../../src/lib/op.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAM7D;;;;;;GAMG;AAMH,MAAM,WAAW,UAAU;IACzB,+FAA+F;IAC/F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,4BAA4B;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,6DAA6D;IAC7D,QAAQ,CAAC,kBAAkB,EAAE,eAAe,CAAC;IAC7C,6DAA6D;IAC7D,QAAQ,CAAC,kBAAkB,EAAE,eAAe,CAAC;IAC7C,wDAAwD;IACxD,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC;CACzC;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,EAAE,CAAC,GAAG,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;IAE/D,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,EAAE,UAAU;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,eAAe,EAAE,qBAAqB;IAC/C,qGAAqG;IACrG,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,0EAA0E;IAC1E,QAAQ,CAAC,iBAAiB,CAAC,EAAE,uBAAuB;IACpD;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,gBAAgB;IAd/C;IACE,oDAAoD;IAC3C,QAAQ,EAAE,UAAU;IAC7B,wFAAwF;IAC/E,eAAe,EAAE,qBAAqB;IAC/C,qGAAqG;IAC5F,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3F,0EAA0E;IACjE,iBAAiB,CAAC,EAAE,uBAAuB,YAAA;IACpD;;;;OAIG;IACM,iBAAiB,CAAC,EAAE,gBAAgB,YAAA,EAC3C;CACL"}
1
+ {"version":3,"file":"op.d.ts","sourceRoot":"","sources":["../../src/lib/op.ts"],"names":[],"mappings":"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"}
package/dist/lib/op.js CHANGED
@@ -12,6 +12,9 @@
12
12
  * - fn is called by span_op() after span_op creates the SpanBuffer/SpanContext
13
13
  * - Op name is used for metrics tracking (separate from span names)
14
14
  */
15
+ import { getPhysicalLayoutPlan, sealCallsitePlan } from './physicalLayoutPlan.js';
16
+ import { decodeRuntimeHint } from './runtimeHint.js';
17
+ import { createSpanContextClass } from './spanContext.js';
15
18
  //#endregion smoo/lmao!n/opcontext-hierarchy
16
19
  // =============================================================================
17
20
  // Op Class
@@ -37,7 +40,7 @@
37
40
  *
38
41
  * Phase 2 architecture:
39
42
  * - SpanBufferClass carries static schema + stats (shared by all ops from same defineOpContext)
40
- * - remappedViewClass only set for prefixed ops (wraps child buffers before adding to _children)
43
+ * - remapDescriptor is an immutable cold-path binding for prefixed/mapped ops
41
44
  * - No LogBinding - stats accessed via SpanBufferClass.stats
42
45
  *
43
46
  * @typeParam Ctx - OpContext with deps, ff, env (contravariant position)
@@ -47,30 +50,20 @@
47
50
  */
48
51
  export class Op {
49
52
  metadata;
50
- SpanBufferClass;
53
+ callsitePlan;
51
54
  fn;
52
- remappedViewClass;
53
55
  _opContextBinding;
54
- constructor(
55
- /** Op name for metrics, telemetry, and debugging */
56
- metadata,
57
- /** Op owns buffer creation - class has static schema + stats shared by all instances */
58
- SpanBufferClass,
59
- /** The user function to execute - called by span_op after context creation (can be sync or async) */
60
- fn,
61
- /** Only set for prefixed ops - wraps child buffers during registration */
62
- remappedViewClass,
63
- /**
64
- * WHY: Carries the OpContextBinding from the factory that created this Op.
65
- * Enables downstream consumers (defineAgentOps, OpRegistry) to extract the
66
- * LMAO schema for context merging and conflict detection.
67
- */
68
- _opContextBinding) {
69
- this.metadata = metadata;
70
- this.SpanBufferClass = SpanBufferClass;
56
+ constructor(metadata, SpanBufferClass, fn, remapDescriptor, opContextBinding, runtimeHint = 0, eagerColumns = [], localMessageDictionary = Object.freeze([])) {
57
+ const userContextKeys = Object.keys(opContextBinding?.ctxDefaults ?? {}).sort();
58
+ const layoutKey = userContextKeys.join('\u0000');
59
+ const capabilities = decodeRuntimeHint(runtimeHint).capabilities;
60
+ const SpanContextClass = createSpanContextClass(SpanBufferClass.schema, opContextBinding?.logBinding ?? { logSchema: SpanBufferClass.schema }, capabilities, userContextKeys);
61
+ const physicalLayoutPlan = getPhysicalLayoutPlan(SpanBufferClass, runtimeHint, SpanContextClass, remapDescriptor, 'strategy-selected', layoutKey, eagerColumns, localMessageDictionary);
62
+ const resolvedMetadata = Object.freeze({ ...metadata, _physicalLayoutPlan: physicalLayoutPlan });
63
+ this.callsitePlan = sealCallsitePlan(physicalLayoutPlan, resolvedMetadata);
64
+ this.metadata = resolvedMetadata;
71
65
  this.fn = fn;
72
- this.remappedViewClass = remappedViewClass;
73
- this._opContextBinding = _opContextBinding;
66
+ this._opContextBinding = opContextBinding;
74
67
  }
75
68
  }
76
69
  //#endregion smoo/lmao!n/op-class
@@ -8,7 +8,7 @@
8
8
  * - Private fields (#columnMapping) don't affect hidden class (truly hidden, no enumeration)
9
9
  * - Ops as own properties enable direct access and predictable object shape
10
10
  * - prefix()/mapColumns() create new instances with same SpanBufferClass (shared stats)
11
- * - Only remappedViewClass differs between original and prefixed op instances
11
+ * - Only immutable remap metadata differs between original and mapped op instances
12
12
  *
13
13
  * Internal properties (_logSchema, _flags, etc.) are prefixed with underscore to avoid
14
14
  * collision with user-defined op names. Public interfaces hide these from intellisense.
@@ -1 +1 @@
1
- {"version":3,"file":"createOpGroup.d.ts","sourceRoot":"","sources":["../../../src/lib/opContext/createOpGroup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAKV,OAAO,EAEP,UAAU,EAGX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA8X5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,aAAa,CAAC,GAAG,SAAS,SAAS,EAAE,GAAG,SAAS,UAAU,CAAC,GAAG,CAAC,EAC9E,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,EAC3B,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EACnB,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAInB"}
1
+ {"version":3,"file":"createOpGroup.d.ts","sourceRoot":"","sources":["../../../src/lib/opContext/createOpGroup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAKV,OAAO,EAEP,UAAU,EAGX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA+X5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,aAAa,CAAC,GAAG,SAAS,SAAS,EAAE,GAAG,SAAS,UAAU,CAAC,GAAG,CAAC,EAC9E,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,EAC3B,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EACnB,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAInB"}
@@ -8,22 +8,22 @@
8
8
  * - Private fields (#columnMapping) don't affect hidden class (truly hidden, no enumeration)
9
9
  * - Ops as own properties enable direct access and predictable object shape
10
10
  * - prefix()/mapColumns() create new instances with same SpanBufferClass (shared stats)
11
- * - Only remappedViewClass differs between original and prefixed op instances
11
+ * - Only immutable remap metadata differs between original and mapped op instances
12
12
  *
13
13
  * Internal properties (_logSchema, _flags, etc.) are prefixed with underscore to avoid
14
14
  * collision with user-defined op names. Public interfaces hide these from intellisense.
15
15
  *
16
16
  * @module opContext/createOpGroup
17
17
  */
18
- import { generateRemappedBufferViewClass } from '../library.js';
18
+ import { createRemapDescriptor } from '../library.js';
19
19
  import { Op } from '../op.js';
20
20
  import { SYSTEM_SCHEMA_FIELD_NAMES } from '../schema/systemSchema.js';
21
21
  import { validateOpName } from './opGroupTypes.js';
22
22
  //#region smoo/lmao!n/column-mapping-api
23
23
  // 01l "Dependencies with Column Mapping" + 01e "Column Mapping API": .prefix(name) and
24
- // .mapColumns({ col: 'new' | 'shared' | null }) are realized here. Each call clones the
25
- // OpGroup's ops with a fresh RemappedBufferView (cold-path codegen via library.ts), so the
26
- // hot path still writes the clean unprefixed columns; the view remaps clean->target for Arrow.
24
+ // .mapColumns({ col: 'new' | 'shared' | null }) are composed here. Each call clones the
25
+ // OpGroup's ops with one immutable descriptor; child buffers remain canonical and Arrow
26
+ // interprets the descriptor only on its cold traversal path.
27
27
  // =============================================================================
28
28
  // INTERNAL HELPERS
29
29
  // =============================================================================
@@ -31,12 +31,8 @@ function getSchemaFields(fieldsSchema) {
31
31
  return fieldsSchema.fields;
32
32
  }
33
33
  /**
34
- * Create reverse mapping for RemappedBufferView.
35
- * Input: clean -> prefixed mapping (e.g., { status: 'http_status' })
36
- * Output: prefixed -> clean mapping (e.g., { http_status: 'status' })
37
- *
38
- * Why reverse: RemappedBufferView wraps child buffer at registration time.
39
- * Arrow conversion asks for 'http_status', view needs to find 'status' in raw buffer.
34
+ * Create the fully composed Arrow output-to-canonical-source mapping.
35
+ * Input: clean -> output mapping; output: output -> clean mapping.
40
36
  */
41
37
  function createReverseMapping(mapping) {
42
38
  const reverse = {};
@@ -50,10 +46,10 @@ function createReverseMapping(mapping) {
50
46
  function isOpInstance(value) {
51
47
  return value instanceof Op;
52
48
  }
53
- function copyOpsWithView(source, target, remappedViewClass) {
49
+ function copyOpsWithDescriptor(source, target, remapDescriptor) {
54
50
  for (const [key, value] of Object.entries(source)) {
55
51
  if (isOpInstance(value)) {
56
- target[key] = new Op(value.metadata, value.SpanBufferClass, value.fn, remappedViewClass, value._opContextBinding);
52
+ target[key] = new Op(value.metadata, value.callsitePlan.SpanBufferClass, value.fn, remapDescriptor, value._opContextBinding, value.callsitePlan.runtimeHint, value.callsitePlan.eagerColumns.names, value.callsitePlan.localMessageDictionary);
57
53
  }
58
54
  }
59
55
  }
@@ -64,15 +60,17 @@ function assertGroupCarriesOps(group, ops) {
64
60
  }
65
61
  }
66
62
  }
67
- function cloneOpsWithView(source, remappedViewClass) {
63
+ function cloneOpsWithDescriptor(source, remapDescriptor) {
68
64
  const cloned = {};
69
- copyOpsWithView(source, cloned, remappedViewClass);
65
+ copyOpsWithDescriptor(source, cloned, remapDescriptor);
70
66
  assertGroupCarriesOps(cloned, source);
71
67
  return cloned;
72
68
  }
73
69
  function prefixContributedSchema(fields, prefix) {
74
70
  const result = {};
75
71
  for (const [key, value] of Object.entries(fields)) {
72
+ if (SYSTEM_SCHEMA_FIELD_NAMES.has(key))
73
+ continue;
76
74
  result[`${prefix}_${key}`] = value;
77
75
  }
78
76
  assertMappedSchema(result);
@@ -182,7 +180,7 @@ function validateAllOpNames(ops) {
182
180
  * 2. Ops spread as own properties for direct access (`.request` not `.ops.request`)
183
181
  * 3. Prototype methods (prefix/mapColumns) shared across instances
184
182
  * 4. Same SpanBufferClass preserved across prefix() calls (shared schema + stats)
185
- * 5. Only remappedViewClass differs between original and prefixed ops
183
+ * 5. Only immutable remap metadata differs between original and mapped ops
186
184
  *
187
185
  * Structure enables V8 optimization:
188
186
  * - All OpGroup instances with same ops have same hidden class
@@ -218,25 +216,22 @@ class OpGroupImpl {
218
216
  const newMapping = hasMapping
219
217
  ? prefixMapping(this.#columnMapping, p)
220
218
  : buildPrefixMapping(this._logSchema._columnNames, p);
221
- // Generate RemappedBufferView for this prefix
222
- // Why reverse mapping: Arrow conversion asks for 'http_status', needs to find 'status'
223
219
  const reverseMapping = createReverseMapping(newMapping);
224
- const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
220
+ const remapDescriptor = createRemapDescriptor(this._logSchema, reverseMapping);
225
221
  // Create new OpGroup with prefixed ops
226
- const newGroup = new MappedOpGroupImpl(this._logSchema, this._flags, cloneOpsWithView(this.#ops, remappedViewClass), newMapping, prefixContributedSchema(getSchemaFields(this._logSchema), p));
222
+ const newGroup = new MappedOpGroupImpl(this._logSchema, this._flags, cloneOpsWithDescriptor(this.#ops, remapDescriptor), newMapping, prefixContributedSchema(getSchemaFields(this._logSchema), p));
227
223
  assertGroupCarriesOps(newGroup, this.#ops);
228
224
  return newGroup;
229
225
  }
230
226
  mapColumns(mapping) {
231
227
  // Override/extend the existing mapping with new mapping
232
228
  const newMapping = { ...this.#columnMapping, ...mapping };
233
- // Generate RemappedBufferView for this mapping
234
229
  const reverseMapping = createReverseMapping(newMapping);
235
- const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
230
+ const remapDescriptor = createRemapDescriptor(this._logSchema, reverseMapping);
236
231
  // Build contributed schema from original fields with new mapping
237
232
  const newContributed = buildContributedSchema(getSchemaFields(this._logSchema), newMapping);
238
233
  // Create new OpGroup with mapped ops
239
- const newGroup = new MappedOpGroupImpl(this._logSchema, this._flags, cloneOpsWithView(this.#ops, remappedViewClass), newMapping, newContributed);
234
+ const newGroup = new MappedOpGroupImpl(this._logSchema, this._flags, cloneOpsWithDescriptor(this.#ops, remapDescriptor), newMapping, newContributed);
240
235
  assertGroupCarriesOps(newGroup, this.#ops);
241
236
  return newGroup;
242
237
  }
@@ -276,26 +271,24 @@ class MappedOpGroupImpl {
276
271
  prefix(p) {
277
272
  // Apply prefix to the current mapping's target names
278
273
  const newMapping = prefixMapping(this.#columnMapping, p);
279
- // Generate RemappedBufferView
280
274
  const reverseMapping = createReverseMapping(newMapping);
281
- const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
275
+ const remapDescriptor = createRemapDescriptor(this._logSchema, reverseMapping);
282
276
  // Build new contributed schema by prefixing current contributed schema
283
277
  const newContributed = prefixContributedSchema(this._contributedSchema, p);
284
278
  // Create new MappedOpGroup
285
- const newGroup = new MappedOpGroupImpl(this._logSchema, this._flags, cloneOpsWithView(this.#ops, remappedViewClass), newMapping, newContributed);
279
+ const newGroup = new MappedOpGroupImpl(this._logSchema, this._flags, cloneOpsWithDescriptor(this.#ops, remapDescriptor), newMapping, newContributed);
286
280
  assertGroupCarriesOps(newGroup, this.#ops);
287
281
  return newGroup;
288
282
  }
289
283
  mapColumns(mapping) {
290
284
  // Override/extend the existing mapping
291
285
  const newMapping = { ...this.#columnMapping, ...mapping };
292
- // Generate RemappedBufferView
293
286
  const reverseMapping = createReverseMapping(newMapping);
294
- const remappedViewClass = generateRemappedBufferViewClass(reverseMapping);
287
+ const remapDescriptor = createRemapDescriptor(this._logSchema, reverseMapping);
295
288
  // Build contributed schema from current contributed fields so chained maps stay typed to the public surface.
296
289
  const newContributed = buildContributedSchema(this._contributedSchema, mapping);
297
290
  // Create new MappedOpGroup
298
- const newGroup = new MappedOpGroupImpl(this._logSchema, this._flags, cloneOpsWithView(this.#ops, remappedViewClass), newMapping, newContributed);
291
+ const newGroup = new MappedOpGroupImpl(this._logSchema, this._flags, cloneOpsWithDescriptor(this.#ops, remapDescriptor), newMapping, newContributed);
299
292
  assertGroupCarriesOps(newGroup, this.#ops);
300
293
  return newGroup;
301
294
  }
@@ -7,7 +7,7 @@
7
7
  * @module opContext/defineOp
8
8
  */
9
9
  import type { OpGroup, OpGroupOps } from './opGroupTypes.js';
10
- import type { Op, OpFn, OpMetadata, OpsFromRecord } from './opTypes.js';
10
+ import type { Op, OpCompileMetadata, OpFn, OpMetadata, OpsFromRecord } from './opTypes.js';
11
11
  import type { OpContext } from './types.js';
12
12
  /**
13
13
  * Create OpMetadata with pre-encoded entries for Arrow dictionary building.
@@ -54,13 +54,13 @@ type CreateOpGroupFn<Ctx extends OpContext> = <Ops extends OpGroupOps<Ctx>>(logS
54
54
  * - metadata: includes name + merged with defaults
55
55
  * - SpanBufferClass: from getSpanBufferClass(logSchema) - has static schema + stats
56
56
  * - fn(ctx, ...args): the user function to execute
57
- * - remappedViewClass: undefined for original ops (set by .prefix() method)
57
+ * - remapDescriptor: undefined for original ops (set by .prefix()/.mapColumns())
58
58
  *
59
59
  * @template Ctx - Bundled OpContext (logSchema, flags, deps, userCtx)
60
60
  * @param factoryConfig - Configuration containing logSchema and flags
61
61
  * @returns A defineOp function for creating Op instances
62
62
  */
63
- export declare function createDefineOp<Ctx extends OpContext>(factoryConfig: DefineOpFactoryConfig<Ctx>): <Args extends unknown[], S, E>(name: string, fn: OpFn<Ctx, Args, S, E>, metadata?: Partial<OpMetadata>) => Op<Ctx, Args, S, E>;
63
+ export declare function createDefineOp<Ctx extends OpContext>(factoryConfig: DefineOpFactoryConfig<Ctx>): <Args extends unknown[], S, E>(name: string, fn: OpFn<Ctx, Args, S, E>, metadata?: Partial<OpMetadata>, compileMetadata?: OpCompileMetadata) => Op<Ctx, Args, S, E>;
64
64
  /**
65
65
  * Creates a defineOps function bound to a specific factory config.
66
66
  *
@@ -78,6 +78,6 @@ export declare function createDefineOp<Ctx extends OpContext>(factoryConfig: Def
78
78
  * @param createOpGroup - Factory function for creating OpGroups
79
79
  * @returns A defineOps function for creating OpGroups
80
80
  */
81
- export declare function createDefineOps<Ctx extends OpContext>(factoryConfig: DefineOpFactoryConfig<Ctx>, createOpGroup: CreateOpGroupFn<Ctx>): <Defs extends Record<string, Op<Ctx, unknown[], unknown, unknown> | OpFn<Ctx, unknown[], unknown, unknown>>>(definitions: Defs & ThisType<OpsFromRecord<Ctx, Defs>>) => OpGroup<Ctx, OpsFromRecord<Ctx, Defs>>;
81
+ export declare function createDefineOps<Ctx extends OpContext>(factoryConfig: DefineOpFactoryConfig<Ctx>, createOpGroup: CreateOpGroupFn<Ctx>): <Defs extends Record<string, Op<Ctx, unknown[], unknown, unknown> | OpFn<Ctx, unknown[], unknown, unknown>>>(definitions: Defs & ThisType<OpsFromRecord<Ctx, Defs>>, compileMetadataByKey?: Partial<Record<keyof Defs, OpCompileMetadata>>) => OpGroup<Ctx, OpsFromRecord<Ctx, Defs>>;
82
82
  export {};
83
83
  //# sourceMappingURL=defineOp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defineOp.d.ts","sourceRoot":"","sources":["../../../src/lib/opContext/defineOp.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAW5C;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,UAAU,CAYZ;AAMD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,UAA4E,CAAC;AAM5G;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,SAAI,GAAG,UAAU,CA6DnE;AAOD;;;GAGG;AACH,UAAU,qBAAqB,CAAC,GAAG,SAAS,SAAS;IACnD,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,YAAY,EAAE,gBAAgB,CAAC;CACnE;AAED;;;GAGG;AACH,KAAK,eAAe,CAAC,GAAG,SAAS,SAAS,IAAI,CAAC,GAAG,SAAS,UAAU,CAAC,GAAG,CAAC,EACxE,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,EAC3B,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EACnB,GAAG,EAAE,GAAG,KACL,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAMvB;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,GAAG,SAAS,SAAS,EAClD,aAAa,EAAE,qBAAqB,CAAC,GAAG,CAAC,GACxC,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EACzB,QAAQ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,KAC3B,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CA0BvB;AAyBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,GAAG,SAAS,SAAS,EACnD,aAAa,EAAE,qBAAqB,CAAC,GAAG,CAAC,EACzC,aAAa,EAAE,eAAe,CAAC,GAAG,CAAC,GAClC,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EAC5G,WAAW,EAAE,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KACnD,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CA0B1C"}
1
+ {"version":3,"file":"defineOp.d.ts","sourceRoot":"","sources":["../../../src/lib/opContext/defineOp.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAW5C;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,UAAU,CAYZ;AAMD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,UAA4E,CAAC;AA+B5G;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,SAAI,GAAG,UAAU,CA6DnE;AAOD;;;GAGG;AACH,UAAU,qBAAqB,CAAC,GAAG,SAAS,SAAS;IACnD,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,YAAY,EAAE,gBAAgB,CAAC;CACnE;AAED;;;GAGG;AACH,KAAK,eAAe,CAAC,GAAG,SAAS,SAAS,IAAI,CAAC,GAAG,SAAS,UAAU,CAAC,GAAG,CAAC,EACxE,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,EAC3B,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,EACnB,GAAG,EAAE,GAAG,KACL,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAMvB;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,GAAG,SAAS,SAAS,EAClD,aAAa,EAAE,qBAAqB,CAAC,GAAG,CAAC,GACxC,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EACzB,QAAQ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAC9B,eAAe,CAAC,EAAE,iBAAiB,KAChC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAoDvB;AAyBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,GAAG,SAAS,SAAS,EACnD,aAAa,EAAE,qBAAqB,CAAC,GAAG,CAAC,EACzC,aAAa,EAAE,eAAe,CAAC,GAAG,CAAC,GAClC,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,EAC5G,WAAW,EAAE,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EACtD,oBAAoB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,iBAAiB,CAAC,CAAC,KAClE,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAgD1C"}
@@ -8,6 +8,8 @@
8
8
  */
9
9
  import { intern, PreEncodedEntry } from '@smoothbricks/arrow-builder';
10
10
  import { Op as OpClass } from '../op.js';
11
+ import { resolveEagerColumns } from '../physicalLayoutPlan.js';
12
+ import { runtimeHintMessageLayoutFamily, runtimeHintMessagePhysicalLayout } from '../runtimeHint.js';
11
13
  import { getSpanBufferClass } from '../spanBuffer.js';
12
14
  //#region smoo/lmao!n/metadata-injection
13
15
  // 01l "Metadata Injection (Transformer)": package_name/package_file/git_sha/line are the
@@ -42,6 +44,27 @@ export function createOpMetadata(name, package_name, package_file, git_sha, line
42
44
  * These are placeholder values that will be replaced at compile time.
43
45
  */
44
46
  export const DEFAULT_METADATA = createOpMetadata('unknown', 'unknown', 'unknown', 'unknown', 0);
47
+ const DEFAULT_COMPILE_METADATA = Object.freeze({
48
+ runtimeHint: 0,
49
+ });
50
+ const EMPTY_EAGER_COLUMNS = Object.freeze([]);
51
+ const EMPTY_LOCAL_MESSAGE_DICTIONARY = Object.freeze([]);
52
+ function normalizeCompileMetadata(compileMetadata) {
53
+ if (compileMetadata === undefined)
54
+ return DEFAULT_COMPILE_METADATA;
55
+ const eagerColumns = compileMetadata.eagerColumns;
56
+ const localMessageDictionary = compileMetadata.localMessageDictionary;
57
+ return Object.freeze({
58
+ runtimeHint: compileMetadata.runtimeHint,
59
+ eagerColumns: eagerColumns === undefined || eagerColumns.length === 0
60
+ ? EMPTY_EAGER_COLUMNS
61
+ : Object.freeze([...new Set(eagerColumns)]),
62
+ localMessageDictionary: localMessageDictionary === undefined || localMessageDictionary.length === 0
63
+ ? EMPTY_LOCAL_MESSAGE_DICTIONARY
64
+ : Object.freeze([...localMessageDictionary]),
65
+ materializeSpanBufferClass: compileMetadata.materializeSpanBufferClass,
66
+ });
67
+ }
45
68
  // =============================================================================
46
69
  // STACK TRACE METADATA EXTRACTION
47
70
  // =============================================================================
@@ -119,31 +142,39 @@ export function extractMetadataFromStack(skipFrames = 2) {
119
142
  * - metadata: includes name + merged with defaults
120
143
  * - SpanBufferClass: from getSpanBufferClass(logSchema) - has static schema + stats
121
144
  * - fn(ctx, ...args): the user function to execute
122
- * - remappedViewClass: undefined for original ops (set by .prefix() method)
145
+ * - remapDescriptor: undefined for original ops (set by .prefix()/.mapColumns())
123
146
  *
124
147
  * @template Ctx - Bundled OpContext (logSchema, flags, deps, userCtx)
125
148
  * @param factoryConfig - Configuration containing logSchema and flags
126
149
  * @returns A defineOp function for creating Op instances
127
150
  */
128
151
  export function createDefineOp(factoryConfig) {
129
- // Why get class from schema: Class has static schema + stats shared by all instances
130
- const SpanBufferClass = getSpanBufferClass(factoryConfig.logSchema);
131
- return function defineOpImpl(name, fn, metadata) {
152
+ return function defineOpImpl(name, fn, metadata, compileMetadata) {
153
+ const normalizedCompileMetadata = normalizeCompileMetadata(compileMetadata);
154
+ normalizedCompileMetadata.materializeSpanBufferClass?.(factoryConfig.logSchema);
155
+ const eagerColumns = resolveEagerColumns(factoryConfig.logSchema, normalizedCompileMetadata.eagerColumns ?? EMPTY_EAGER_COLUMNS);
156
+ const messageLayoutFamily = runtimeHintMessageLayoutFamily(normalizedCompileMetadata.runtimeHint);
157
+ const messagePhysicalLayout = runtimeHintMessagePhysicalLayout(normalizedCompileMetadata.runtimeHint);
158
+ const SelectedSpanBufferClass = getSpanBufferClass(factoryConfig.logSchema, messageLayoutFamily, messagePhysicalLayout, eagerColumns);
132
159
  // When transformer is not installed, extract metadata from stack trace
133
160
  // This provides useful file/line info for debugging even without build-time injection
134
161
  // skipFrames=3: Error -> extractMetadataFromStack -> defineOpImpl -> caller
135
162
  const baseMetadata = metadata?.package_file ? DEFAULT_METADATA : extractMetadataFromStack(3);
136
163
  // Use name from: 1) explicit metadata.name (transformer), 2) defineOp('name', fn), 3) baseMetadata
137
- const finalMetadata = { ...baseMetadata, ...metadata, name: metadata?.name ?? name };
164
+ const finalMetadata = {
165
+ ...baseMetadata,
166
+ ...metadata,
167
+ name: metadata?.name ?? name,
168
+ };
138
169
  // Use the Op class which handles all span/buffer management:
139
170
  // - Creates SpanBuffer for the op
140
171
  // - Registers child buffers with parent
141
172
  // - Sets _opMetadata and _callsiteMetadata
142
173
  // - Writes span-start/span-ok/span-err entries
143
174
  // - Handles exceptions with span-exception
144
- // Why SpanBufferClass: All ops from same defineOpContext share this class for stats coordination
145
- // Why undefined for remappedViewClass: Only prefixed ops need remapping - set by .prefix() method
146
- return new OpClass(finalMetadata, SpanBufferClass, fn, undefined, factoryConfig.opContextBinding);
175
+ // Why SelectedSpanBufferClass: Ops with the same physical layout share one constructor and stats object.
176
+ // Base Ops have no remap descriptor; mapped OpGroups bind one during startup cloning.
177
+ return new OpClass(finalMetadata, SelectedSpanBufferClass, fn, undefined, factoryConfig.opContextBinding, normalizedCompileMetadata.runtimeHint, normalizedCompileMetadata.eagerColumns ?? EMPTY_EAGER_COLUMNS, normalizedCompileMetadata.localMessageDictionary ?? EMPTY_LOCAL_MESSAGE_DICTIONARY);
147
178
  };
148
179
  }
149
180
  // =============================================================================
@@ -183,13 +214,25 @@ function hasAllDefinedOps(definitions, ops) {
183
214
  export function createDefineOps(factoryConfig, createOpGroup) {
184
215
  // Get the defineOp function for wrapping raw functions
185
216
  const defineOp = createDefineOp(factoryConfig);
186
- return function defineOpsImpl(definitions) {
217
+ return function defineOpsImpl(definitions, compileMetadataByKey) {
187
218
  // Build the ops record by processing each definition.
188
219
  // Keep the runtime container broad, then narrow once we've populated every key.
189
220
  const ops = {};
190
221
  for (const name in definitions) {
191
222
  const def = definitions[name];
192
- ops[name] = isOp(def) ? def : defineOp(name, def);
223
+ const compileMetadata = compileMetadataByKey?.[name];
224
+ if (isOp(def)) {
225
+ if (compileMetadata === undefined) {
226
+ ops[name] = def;
227
+ }
228
+ else {
229
+ const normalizedCompileMetadata = normalizeCompileMetadata(compileMetadata);
230
+ ops[name] = new OpClass(def.metadata, def.callsitePlan.SpanBufferClass, def.fn, def.callsitePlan.remapDescriptor ?? undefined, def._opContextBinding, normalizedCompileMetadata.runtimeHint, normalizedCompileMetadata.eagerColumns ?? EMPTY_EAGER_COLUMNS, normalizedCompileMetadata.localMessageDictionary ?? EMPTY_LOCAL_MESSAGE_DICTIONARY);
231
+ }
232
+ }
233
+ else {
234
+ ops[name] = defineOp(name, def, undefined, compileMetadata);
235
+ }
193
236
  }
194
237
  if (!hasAllDefinedOps(definitions, ops)) {
195
238
  throw new Error('defineOps failed to normalize all op definitions');
@@ -124,8 +124,8 @@ export type OpGroup<Ctx extends OpContext, Ops extends object = NoOpMembers> = O
124
124
  /**
125
125
  * An OpGroup with column mapping applied.
126
126
  *
127
- * The mapping is used during wiring to create RemappedBufferView
128
- * that translates the library's column writes to the app's column names.
127
+ * Wiring composes the mapping into immutable metadata interpreted only by cold
128
+ * Arrow conversion; library child buffers keep their canonical storage layout.
129
129
  *
130
130
  * Note: Ops are accessed directly as properties (`.opName` not `.ops.opName`)
131
131
  * for V8 hidden class optimization and cleaner API ergonomics.
@@ -15,7 +15,7 @@
15
15
  import type { ExtractError, ExtractSuccess, Result } from '../result.js';
16
16
  import type { SpanContext } from './spanContextTypes.js';
17
17
  import type { OpContext } from './types.js';
18
- export { Op, type OpMetadata } from '../op.js';
18
+ export { Op, type OpCompileMetadata, type OpMetadata } from '../op.js';
19
19
  /**
20
20
  * Op function signature - what the user provides to defineOp.
21
21
  * MUST return Result<S, E> or Promise<Result<S, E>>.
@@ -1 +1 @@
1
- {"version":3,"file":"opTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/opContext/opTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS5C,OAAO,EAAE,EAAE,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAM/C;;;;;;;;GAQG;AACH,MAAM,MAAM,IAAI,CAAC,GAAG,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CACtE,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EACrB,GAAG,IAAI,EAAE,IAAI,KACV,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAO1C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC;;;GAGG;AACH,KAAK,OAAO,CAAC,GAAG,SAAS,SAAS,EAAE,GAAG,IACrC,GAAG,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,GACnB,GAAG,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,MAAM,CAAC,GACjE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,GACjD,KAAK,CAAC;AAEd;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,CACvB,GAAG,SAAS,SAAS,EACrB,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,IACxG;KACD,CAAC,IAAI,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CACzC,CAAC"}
1
+ {"version":3,"file":"opTypes.d.ts","sourceRoot":"","sources":["../../../src/lib/opContext/opTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS5C,OAAO,EAAE,EAAE,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAMvE;;;;;;;;GAQG;AACH,MAAM,MAAM,IAAI,CAAC,GAAG,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CACtE,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EACrB,GAAG,IAAI,EAAE,IAAI,KACV,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAO1C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEnC;;;GAGG;AACH,KAAK,OAAO,CAAC,GAAG,SAAS,SAAS,EAAE,GAAG,IACrC,GAAG,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAC7C,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,GACnB,GAAG,SAAS,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,IAAI,KAAK,MAAM,CAAC,GACjE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,GACjD,KAAK,CAAC;AAEd;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,CACvB,GAAG,SAAS,SAAS,EACrB,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,IACxG;KACD,CAAC,IAAI,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CACzC,CAAC"}
@@ -53,24 +53,29 @@ export type TagWriter<T extends LogSchema> = {
53
53
  /**
54
54
  * SpanLogger - public API surface for structured logging.
55
55
  *
56
- * Includes core methods (info/debug/warn/error) from BaseSpanLogger
57
- * and schema-specific methods from ColumnWriter.
58
- * Internal methods (_setScope, _buffer, etc.) are hidden from this type.
56
+ * Operational info/warn/error calls accept either a static template or the
57
+ * untransformed fallback form `(template, fields)`. Debug/trace retain the raw
58
+ * dynamic message API. The transformer lowers supported calls to direct writes;
59
+ * internal methods and buffers remain hidden from this type.
59
60
  *
60
- * Per specs/lmao/01h_entry_types_and_logging_primitives.md:
61
- * - Each level (info/debug/warn/error) creates a log entry
62
- * - Returns FluentLogEntry for chaining field setters
63
- * - Generated at runtime via createSpanLoggerFromGenerator()
61
+ * Per specs/lmao/01h_entry_types_and_logging_primitives.md, each call creates
62
+ * exactly one log entry. The generated runtime implementation binds structured
63
+ * fallback fields to the schema-specific column writers.
64
64
  */
65
65
  export interface SpanLogger<T extends LogSchema> {
66
- /** Log at info level */
67
- info(message: string): FluentLogEntry<T>;
66
+ /** Log a static info template, optionally with schema-bound fallback fields */
67
+ info(template: string): FluentLogEntry<T>;
68
+ info(template: string, fields: Partial<InferSchema<T>>): FluentLogEntry<T>;
68
69
  /** Log at debug level */
69
70
  debug(message: string): FluentLogEntry<T>;
70
- /** Log at warn level */
71
- warn(message: string): FluentLogEntry<T>;
72
- /** Log at error level */
73
- error(message: string): FluentLogEntry<T>;
71
+ /** Log a static warn template, optionally with schema-bound fallback fields */
72
+ warn(template: string): FluentLogEntry<T>;
73
+ warn(template: string, fields: Partial<InferSchema<T>>): FluentLogEntry<T>;
74
+ /** Log a static error template, optionally with schema-bound fallback fields */
75
+ error(template: string): FluentLogEntry<T>;
76
+ error(template: string, fields: Partial<InferSchema<T>>): FluentLogEntry<T>;
77
+ /** Log at trace level */
78
+ trace(message: string): FluentLogEntry<T>;
74
79
  }
75
80
  /**
76
81
  * Fluent log entry - chainable attribute setters after log level.
@@ -174,7 +179,7 @@ export type SpanFn<Ctx extends OpContext> = {
174
179
  * Use when the callback is guaranteed sync and should return immediately
175
180
  * with a Result envelope.
176
181
  */
177
- export type SpanSyncFn<Ctx extends OpContext> = <S, E>(name: string, fn: (ctx: SpanContext<Ctx>) => Result<S, E>) => Result<S, E>;
182
+ export type SpanSyncFn<Ctx extends OpContext> = <S, E>(name: string, op: Op<Ctx, [], S, E>) => Result<S, E>;
178
183
  /**
179
184
  * SpanContext - what op functions receive.
180
185
  *
@@ -308,6 +313,16 @@ export type SpanContext<Ctx extends OpContext> = {
308
313
  * It does not await or perform async retry/backoff behavior.
309
314
  */
310
315
  spanSync: SpanSyncFn<Ctx>;
316
+ /** @internal Transformer-only fixed-arity sync-fast span ABI. */
317
+ spanAuto0<S, E>(line: number, name: string, op: Op<Ctx, [], S, E>): Result<S, E> | Promise<Result<S, E>>;
318
+ spanAuto1<S, E, A1>(line: number, name: string, op: Op<Ctx, [A1], S, E>, a1: A1): Result<S, E> | Promise<Result<S, E>>;
319
+ spanAuto2<S, E, A1, A2>(line: number, name: string, op: Op<Ctx, [A1, A2], S, E>, a1: A1, a2: A2): Result<S, E> | Promise<Result<S, E>>;
320
+ spanAuto3<S, E, A1, A2, A3>(line: number, name: string, op: Op<Ctx, [A1, A2, A3], S, E>, a1: A1, a2: A2, a3: A3): Result<S, E> | Promise<Result<S, E>>;
321
+ spanAuto4<S, E, A1, A2, A3, A4>(line: number, name: string, op: Op<Ctx, [A1, A2, A3, A4], S, E>, a1: A1, a2: A2, a3: A3, a4: A4): Result<S, E> | Promise<Result<S, E>>;
322
+ spanAuto5<S, E, A1, A2, A3, A4, A5>(line: number, name: string, op: Op<Ctx, [A1, A2, A3, A4, A5], S, E>, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5): Result<S, E> | Promise<Result<S, E>>;
323
+ spanAuto6<S, E, A1, A2, A3, A4, A5, A6>(line: number, name: string, op: Op<Ctx, [A1, A2, A3, A4, A5, A6], S, E>, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6): Result<S, E> | Promise<Result<S, E>>;
324
+ spanAuto7<S, E, A1, A2, A3, A4, A5, A6, A7>(line: number, name: string, op: Op<Ctx, [A1, A2, A3, A4, A5, A6, A7], S, E>, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7): Result<S, E> | Promise<Result<S, E>>;
325
+ spanAuto8<S, E, A1, A2, A3, A4, A5, A6, A7, A8>(line: number, name: string, op: Op<Ctx, [A1, A2, A3, A4, A5, A6, A7, A8], S, E>, a1: A1, a2: A2, a3: A3, a4: A4, a5: A5, a6: A6, a7: A7, a8: A8): Result<S, E> | Promise<Result<S, E>>;
311
326
  /**
312
327
  * Set scoped attributes that auto-propagate to all subsequent log entries.
313
328
  *