@vib3code/sdk 2.0.1

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 (258) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
  3. package/DOCS/CI_TESTING.md +38 -0
  4. package/DOCS/CLI_ONBOARDING.md +75 -0
  5. package/DOCS/CONTROL_REFERENCE.md +64 -0
  6. package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
  7. package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
  8. package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
  9. package/DOCS/ENV_SETUP.md +189 -0
  10. package/DOCS/EXPORT_FORMATS.md +417 -0
  11. package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
  12. package/DOCS/LICENSING_TIERS.md +275 -0
  13. package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
  14. package/DOCS/OBS_SETUP_GUIDE.md +98 -0
  15. package/DOCS/PROJECT_SETUP.md +66 -0
  16. package/DOCS/RENDERER_LIFECYCLE.md +40 -0
  17. package/DOCS/REPO_MANIFEST.md +121 -0
  18. package/DOCS/SESSION_014_PLAN.md +195 -0
  19. package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
  20. package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
  21. package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
  22. package/DOCS/SYSTEM_INVENTORY.md +520 -0
  23. package/DOCS/TELEMETRY_EXPORTS.md +34 -0
  24. package/DOCS/WEBGPU_STATUS.md +38 -0
  25. package/DOCS/XR_BENCHMARKS.md +608 -0
  26. package/LICENSE +21 -0
  27. package/README.md +426 -0
  28. package/docs/.nojekyll +0 -0
  29. package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
  30. package/docs/02-hyperspatial_ego_death.html +346 -0
  31. package/docs/03-post_cartesian_sublime.html +346 -0
  32. package/docs/04-crystalline_void_meditation.html +346 -0
  33. package/docs/05-quantum_decoherence_ballet.html +346 -0
  34. package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
  35. package/docs/07-hyperspatial_ego_death.html +346 -0
  36. package/docs/08-post_cartesian_sublime.html +346 -0
  37. package/docs/09-crystalline_void_meditation.html +346 -0
  38. package/docs/10-quantum_decoherence_ballet.html +346 -0
  39. package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
  40. package/docs/12-hyperspatial_ego_death.html +346 -0
  41. package/docs/13-post_cartesian_sublime.html +346 -0
  42. package/docs/index.html +794 -0
  43. package/docs/test-hub.html +441 -0
  44. package/docs/url-state.js +102 -0
  45. package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
  46. package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
  47. package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
  48. package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
  49. package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
  50. package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
  51. package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
  52. package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
  53. package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
  54. package/docs/vib3-exports/index.html +238 -0
  55. package/docs/webgpu-live.html +702 -0
  56. package/package.json +367 -0
  57. package/src/advanced/AIPresetGenerator.js +777 -0
  58. package/src/advanced/MIDIController.js +703 -0
  59. package/src/advanced/OffscreenWorker.js +1051 -0
  60. package/src/advanced/WebGPUCompute.js +1051 -0
  61. package/src/advanced/WebXRRenderer.js +680 -0
  62. package/src/agent/cli/AgentCLI.js +615 -0
  63. package/src/agent/cli/index.js +14 -0
  64. package/src/agent/index.js +73 -0
  65. package/src/agent/mcp/MCPServer.js +950 -0
  66. package/src/agent/mcp/index.js +9 -0
  67. package/src/agent/mcp/tools.js +548 -0
  68. package/src/agent/telemetry/EventStream.js +669 -0
  69. package/src/agent/telemetry/Instrumentation.js +618 -0
  70. package/src/agent/telemetry/TelemetryExporters.js +427 -0
  71. package/src/agent/telemetry/TelemetryService.js +464 -0
  72. package/src/agent/telemetry/index.js +52 -0
  73. package/src/benchmarks/BenchmarkRunner.js +381 -0
  74. package/src/benchmarks/MetricsCollector.js +299 -0
  75. package/src/benchmarks/index.js +9 -0
  76. package/src/benchmarks/scenes.js +259 -0
  77. package/src/cli/index.js +675 -0
  78. package/src/config/ApiConfig.js +88 -0
  79. package/src/core/CanvasManager.js +217 -0
  80. package/src/core/ErrorReporter.js +117 -0
  81. package/src/core/ParameterMapper.js +333 -0
  82. package/src/core/Parameters.js +396 -0
  83. package/src/core/RendererContracts.js +200 -0
  84. package/src/core/UnifiedResourceManager.js +370 -0
  85. package/src/core/VIB3Engine.js +636 -0
  86. package/src/core/renderers/FacetedRendererAdapter.js +32 -0
  87. package/src/core/renderers/HolographicRendererAdapter.js +29 -0
  88. package/src/core/renderers/QuantumRendererAdapter.js +29 -0
  89. package/src/core/renderers/RendererLifecycleManager.js +63 -0
  90. package/src/creative/ColorPresetsSystem.js +980 -0
  91. package/src/creative/ParameterTimeline.js +1061 -0
  92. package/src/creative/PostProcessingPipeline.js +1113 -0
  93. package/src/creative/TransitionAnimator.js +683 -0
  94. package/src/export/CSSExporter.js +226 -0
  95. package/src/export/CardGeneratorBase.js +279 -0
  96. package/src/export/ExportManager.js +580 -0
  97. package/src/export/FacetedCardGenerator.js +279 -0
  98. package/src/export/HolographicCardGenerator.js +543 -0
  99. package/src/export/LottieExporter.js +552 -0
  100. package/src/export/QuantumCardGenerator.js +315 -0
  101. package/src/export/SVGExporter.js +519 -0
  102. package/src/export/ShaderExporter.js +903 -0
  103. package/src/export/TradingCardGenerator.js +3055 -0
  104. package/src/export/TradingCardManager.js +181 -0
  105. package/src/export/VIB3PackageExporter.js +559 -0
  106. package/src/export/index.js +14 -0
  107. package/src/export/systems/TradingCardSystemFaceted.js +494 -0
  108. package/src/export/systems/TradingCardSystemHolographic.js +452 -0
  109. package/src/export/systems/TradingCardSystemQuantum.js +411 -0
  110. package/src/faceted/FacetedSystem.js +963 -0
  111. package/src/features/CollectionManager.js +433 -0
  112. package/src/gallery/CollectionManager.js +240 -0
  113. package/src/gallery/GallerySystem.js +485 -0
  114. package/src/geometry/GeometryFactory.js +314 -0
  115. package/src/geometry/GeometryLibrary.js +72 -0
  116. package/src/geometry/buffers/BufferBuilder.js +338 -0
  117. package/src/geometry/buffers/index.js +18 -0
  118. package/src/geometry/generators/Crystal.js +420 -0
  119. package/src/geometry/generators/Fractal.js +298 -0
  120. package/src/geometry/generators/KleinBottle.js +197 -0
  121. package/src/geometry/generators/Sphere.js +192 -0
  122. package/src/geometry/generators/Tesseract.js +160 -0
  123. package/src/geometry/generators/Tetrahedron.js +225 -0
  124. package/src/geometry/generators/Torus.js +304 -0
  125. package/src/geometry/generators/Wave.js +341 -0
  126. package/src/geometry/index.js +142 -0
  127. package/src/geometry/warp/HypersphereCore.js +211 -0
  128. package/src/geometry/warp/HypertetraCore.js +386 -0
  129. package/src/geometry/warp/index.js +57 -0
  130. package/src/holograms/HolographicVisualizer.js +1073 -0
  131. package/src/holograms/RealHolographicSystem.js +966 -0
  132. package/src/holograms/variantRegistry.js +69 -0
  133. package/src/integrations/FigmaPlugin.js +854 -0
  134. package/src/integrations/OBSMode.js +754 -0
  135. package/src/integrations/ThreeJsPackage.js +660 -0
  136. package/src/integrations/TouchDesignerExport.js +552 -0
  137. package/src/integrations/frameworks/Vib3React.js +591 -0
  138. package/src/integrations/frameworks/Vib3Svelte.js +654 -0
  139. package/src/integrations/frameworks/Vib3Vue.js +628 -0
  140. package/src/llm/LLMParameterInterface.js +240 -0
  141. package/src/llm/LLMParameterUI.js +577 -0
  142. package/src/math/Mat4x4.js +708 -0
  143. package/src/math/Projection.js +341 -0
  144. package/src/math/Rotor4D.js +637 -0
  145. package/src/math/Vec4.js +476 -0
  146. package/src/math/constants.js +164 -0
  147. package/src/math/index.js +68 -0
  148. package/src/math/projections.js +54 -0
  149. package/src/math/rotations.js +196 -0
  150. package/src/quantum/QuantumEngine.js +906 -0
  151. package/src/quantum/QuantumVisualizer.js +1103 -0
  152. package/src/reactivity/ReactivityConfig.js +499 -0
  153. package/src/reactivity/ReactivityManager.js +586 -0
  154. package/src/reactivity/SpatialInputSystem.js +1783 -0
  155. package/src/reactivity/index.js +93 -0
  156. package/src/render/CommandBuffer.js +465 -0
  157. package/src/render/MultiCanvasBridge.js +340 -0
  158. package/src/render/RenderCommand.js +514 -0
  159. package/src/render/RenderResourceRegistry.js +523 -0
  160. package/src/render/RenderState.js +552 -0
  161. package/src/render/RenderTarget.js +512 -0
  162. package/src/render/ShaderLoader.js +253 -0
  163. package/src/render/ShaderProgram.js +599 -0
  164. package/src/render/UnifiedRenderBridge.js +496 -0
  165. package/src/render/backends/WebGLBackend.js +1108 -0
  166. package/src/render/backends/WebGPUBackend.js +1409 -0
  167. package/src/render/commands/CommandBufferExecutor.js +607 -0
  168. package/src/render/commands/RenderCommandBuffer.js +661 -0
  169. package/src/render/commands/index.js +17 -0
  170. package/src/render/index.js +367 -0
  171. package/src/scene/Disposable.js +498 -0
  172. package/src/scene/MemoryPool.js +618 -0
  173. package/src/scene/Node4D.js +697 -0
  174. package/src/scene/ResourceManager.js +599 -0
  175. package/src/scene/Scene4D.js +540 -0
  176. package/src/scene/index.js +98 -0
  177. package/src/schemas/error.schema.json +84 -0
  178. package/src/schemas/extension.schema.json +88 -0
  179. package/src/schemas/index.js +214 -0
  180. package/src/schemas/parameters.schema.json +142 -0
  181. package/src/schemas/tool-pack.schema.json +44 -0
  182. package/src/schemas/tool-response.schema.json +127 -0
  183. package/src/shaders/common/fullscreen.vert.glsl +5 -0
  184. package/src/shaders/common/fullscreen.vert.wgsl +17 -0
  185. package/src/shaders/common/geometry24.glsl +65 -0
  186. package/src/shaders/common/geometry24.wgsl +54 -0
  187. package/src/shaders/common/rotation4d.glsl +85 -0
  188. package/src/shaders/common/rotation4d.wgsl +86 -0
  189. package/src/shaders/common/uniforms.glsl +44 -0
  190. package/src/shaders/common/uniforms.wgsl +48 -0
  191. package/src/shaders/faceted/faceted.frag.glsl +129 -0
  192. package/src/shaders/faceted/faceted.frag.wgsl +164 -0
  193. package/src/shaders/holographic/holographic.frag.glsl +406 -0
  194. package/src/shaders/holographic/holographic.frag.wgsl +185 -0
  195. package/src/shaders/quantum/quantum.frag.glsl +513 -0
  196. package/src/shaders/quantum/quantum.frag.wgsl +361 -0
  197. package/src/testing/ParallelTestFramework.js +519 -0
  198. package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
  199. package/src/testing/exportFormats.test.js +8 -0
  200. package/src/testing/projections.test.js +14 -0
  201. package/src/testing/rotations.test.js +37 -0
  202. package/src/ui/InteractivityMenu.js +516 -0
  203. package/src/ui/StatusManager.js +96 -0
  204. package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
  205. package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
  206. package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
  207. package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
  208. package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
  209. package/src/variations/VariationManager.js +431 -0
  210. package/src/viewer/AudioReactivity.js +505 -0
  211. package/src/viewer/CardBending.js +481 -0
  212. package/src/viewer/GalleryUI.js +832 -0
  213. package/src/viewer/ReactivityManager.js +590 -0
  214. package/src/viewer/TradingCardExporter.js +600 -0
  215. package/src/viewer/ViewerPortal.js +374 -0
  216. package/src/viewer/index.js +12 -0
  217. package/src/wasm/WasmLoader.js +296 -0
  218. package/src/wasm/index.js +132 -0
  219. package/tools/agentic/mcpTools.js +88 -0
  220. package/tools/cli/agent-cli.js +92 -0
  221. package/tools/export/formats.js +24 -0
  222. package/tools/math/rotation-baseline.mjs +64 -0
  223. package/tools/shader-sync-verify.js +937 -0
  224. package/tools/telemetry/manifestPipeline.js +141 -0
  225. package/tools/telemetry/telemetryEvents.js +35 -0
  226. package/types/adaptive-sdk.d.ts +185 -0
  227. package/types/advanced/AIPresetGenerator.d.ts +81 -0
  228. package/types/advanced/MIDIController.d.ts +100 -0
  229. package/types/advanced/OffscreenWorker.d.ts +82 -0
  230. package/types/advanced/WebGPUCompute.d.ts +52 -0
  231. package/types/advanced/WebXRRenderer.d.ts +77 -0
  232. package/types/advanced/index.d.ts +46 -0
  233. package/types/core/ErrorReporter.d.ts +50 -0
  234. package/types/core/VIB3Engine.d.ts +204 -0
  235. package/types/creative/ColorPresetsSystem.d.ts +91 -0
  236. package/types/creative/ParameterTimeline.d.ts +74 -0
  237. package/types/creative/PostProcessingPipeline.d.ts +109 -0
  238. package/types/creative/TransitionAnimator.d.ts +71 -0
  239. package/types/creative/index.d.ts +35 -0
  240. package/types/integrations/FigmaPlugin.d.ts +46 -0
  241. package/types/integrations/OBSMode.d.ts +74 -0
  242. package/types/integrations/ThreeJsPackage.d.ts +62 -0
  243. package/types/integrations/TouchDesignerExport.d.ts +36 -0
  244. package/types/integrations/Vib3React.d.ts +74 -0
  245. package/types/integrations/Vib3Svelte.d.ts +63 -0
  246. package/types/integrations/Vib3Vue.d.ts +55 -0
  247. package/types/integrations/index.d.ts +52 -0
  248. package/types/reactivity/SpatialInputSystem.d.ts +173 -0
  249. package/types/reactivity/index.d.ts +394 -0
  250. package/types/render/CommandBuffer.d.ts +169 -0
  251. package/types/render/RenderCommand.d.ts +312 -0
  252. package/types/render/RenderState.d.ts +279 -0
  253. package/types/render/RenderTarget.d.ts +254 -0
  254. package/types/render/ShaderProgram.d.ts +277 -0
  255. package/types/render/UnifiedRenderBridge.d.ts +143 -0
  256. package/types/render/WebGLBackend.d.ts +168 -0
  257. package/types/render/WebGPUBackend.d.ts +186 -0
  258. package/types/render/index.d.ts +141 -0
@@ -0,0 +1,427 @@
1
+ /**
2
+ * TelemetryExporters.js - Export telemetry data in various formats
3
+ *
4
+ * Supports:
5
+ * - Prometheus text format for metrics
6
+ * - JSON format for structured logging
7
+ * - OpenTelemetry Protocol (OTLP) JSON
8
+ */
9
+
10
+ import { EventType, SpanStatus } from './TelemetryService.js';
11
+
12
+ /**
13
+ * Prometheus metrics exporter
14
+ */
15
+ export class PrometheusExporter {
16
+ constructor(options = {}) {
17
+ this.prefix = options.prefix || 'vib3';
18
+ this.labels = options.labels || {};
19
+ }
20
+
21
+ /**
22
+ * Export metrics in Prometheus text format
23
+ * @param {object} metrics - Metrics from TelemetryService.getMetrics()
24
+ * @returns {string} Prometheus-formatted metrics
25
+ */
26
+ export(metrics) {
27
+ const lines = [];
28
+ const timestamp = Date.now();
29
+
30
+ // Add HELP and TYPE declarations
31
+ lines.push(`# HELP ${this.prefix}_tool_invocations_total Total number of tool invocations`);
32
+ lines.push(`# TYPE ${this.prefix}_tool_invocations_total counter`);
33
+ lines.push(this._metric('tool_invocations_total', metrics.toolInvocations, timestamp));
34
+
35
+ lines.push(`# HELP ${this.prefix}_tool_errors_total Total number of tool errors`);
36
+ lines.push(`# TYPE ${this.prefix}_tool_errors_total counter`);
37
+ lines.push(this._metric('tool_errors_total', metrics.toolErrors, timestamp));
38
+
39
+ lines.push(`# HELP ${this.prefix}_frames_rendered_total Total frames rendered`);
40
+ lines.push(`# TYPE ${this.prefix}_frames_rendered_total counter`);
41
+ lines.push(this._metric('frames_rendered_total', metrics.framesRendered, timestamp));
42
+
43
+ lines.push(`# HELP ${this.prefix}_parameter_changes_total Total parameter changes`);
44
+ lines.push(`# TYPE ${this.prefix}_parameter_changes_total counter`);
45
+ lines.push(this._metric('parameter_changes_total', metrics.parameterChanges, timestamp));
46
+
47
+ lines.push(`# HELP ${this.prefix}_system_switches_total Total system switches`);
48
+ lines.push(`# TYPE ${this.prefix}_system_switches_total counter`);
49
+ lines.push(this._metric('system_switches_total', metrics.systemSwitches, timestamp));
50
+
51
+ lines.push(`# HELP ${this.prefix}_operation_duration_ms_total Total operation duration in milliseconds`);
52
+ lines.push(`# TYPE ${this.prefix}_operation_duration_ms_total counter`);
53
+ lines.push(this._metric('operation_duration_ms_total', metrics.totalDurationMs, timestamp));
54
+
55
+ lines.push(`# HELP ${this.prefix}_buffer_size Current event buffer size`);
56
+ lines.push(`# TYPE ${this.prefix}_buffer_size gauge`);
57
+ lines.push(this._metric('buffer_size', metrics.bufferSize, timestamp));
58
+
59
+ // Error rate (calculated)
60
+ if (metrics.toolInvocations > 0) {
61
+ const errorRate = metrics.toolErrors / metrics.toolInvocations;
62
+ lines.push(`# HELP ${this.prefix}_error_rate Current error rate`);
63
+ lines.push(`# TYPE ${this.prefix}_error_rate gauge`);
64
+ lines.push(this._metric('error_rate', errorRate, timestamp));
65
+ }
66
+
67
+ return lines.join('\n');
68
+ }
69
+
70
+ /**
71
+ * Format single metric line
72
+ * @private
73
+ */
74
+ _metric(name, value, timestamp) {
75
+ const labels = Object.entries(this.labels)
76
+ .map(([k, v]) => `${k}="${v}"`)
77
+ .join(',');
78
+
79
+ const labelStr = labels ? `{${labels}}` : '';
80
+ return `${this.prefix}_${name}${labelStr} ${value} ${timestamp}`;
81
+ }
82
+
83
+ /**
84
+ * Export histogram data
85
+ * @param {string} name - Metric name
86
+ * @param {number[]} values - Observed values
87
+ * @param {number[]} buckets - Bucket boundaries
88
+ */
89
+ exportHistogram(name, values, buckets = [1, 5, 10, 25, 50, 100, 250, 500, 1000]) {
90
+ const lines = [];
91
+ const timestamp = Date.now();
92
+
93
+ lines.push(`# HELP ${this.prefix}_${name} ${name} histogram`);
94
+ lines.push(`# TYPE ${this.prefix}_${name} histogram`);
95
+
96
+ const counts = new Array(buckets.length + 1).fill(0);
97
+ let sum = 0;
98
+
99
+ for (const v of values) {
100
+ sum += v;
101
+ for (let i = 0; i < buckets.length; i++) {
102
+ if (v <= buckets[i]) {
103
+ counts[i]++;
104
+ }
105
+ }
106
+ counts[buckets.length]++; // +Inf bucket
107
+ }
108
+
109
+ // Cumulative counts
110
+ for (let i = 0; i < buckets.length; i++) {
111
+ lines.push(`${this.prefix}_${name}_bucket{le="${buckets[i]}"} ${counts.slice(0, i + 1).reduce((a, b) => a + b, 0)} ${timestamp}`);
112
+ }
113
+ lines.push(`${this.prefix}_${name}_bucket{le="+Inf"} ${values.length} ${timestamp}`);
114
+ lines.push(`${this.prefix}_${name}_sum ${sum} ${timestamp}`);
115
+ lines.push(`${this.prefix}_${name}_count ${values.length} ${timestamp}`);
116
+
117
+ return lines.join('\n');
118
+ }
119
+ }
120
+
121
+ /**
122
+ * JSON exporter for structured logging
123
+ */
124
+ export class JSONExporter {
125
+ constructor(options = {}) {
126
+ this.serviceName = options.serviceName || 'vib3-engine';
127
+ this.serviceVersion = options.serviceVersion || '1.0.0';
128
+ this.pretty = options.pretty || false;
129
+ }
130
+
131
+ /**
132
+ * Export metrics as JSON
133
+ * @param {object} metrics
134
+ * @returns {string}
135
+ */
136
+ exportMetrics(metrics) {
137
+ const data = {
138
+ '@timestamp': new Date().toISOString(),
139
+ service: {
140
+ name: this.serviceName,
141
+ version: this.serviceVersion
142
+ },
143
+ metrics: {
144
+ tool_invocations: metrics.toolInvocations,
145
+ tool_errors: metrics.toolErrors,
146
+ error_rate: metrics.toolInvocations > 0
147
+ ? metrics.toolErrors / metrics.toolInvocations
148
+ : 0,
149
+ frames_rendered: metrics.framesRendered,
150
+ parameter_changes: metrics.parameterChanges,
151
+ system_switches: metrics.systemSwitches,
152
+ total_duration_ms: metrics.totalDurationMs,
153
+ buffer_size: metrics.bufferSize
154
+ }
155
+ };
156
+
157
+ return this.pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
158
+ }
159
+
160
+ /**
161
+ * Export spans as JSON (OTLP-like format)
162
+ * @param {object[]} spans
163
+ * @returns {string}
164
+ */
165
+ exportSpans(spans) {
166
+ const data = {
167
+ resourceSpans: [{
168
+ resource: {
169
+ attributes: [
170
+ { key: 'service.name', value: { stringValue: this.serviceName } },
171
+ { key: 'service.version', value: { stringValue: this.serviceVersion } }
172
+ ]
173
+ },
174
+ scopeSpans: [{
175
+ scope: { name: 'vib3-telemetry' },
176
+ spans: spans.map(span => this._formatSpan(span))
177
+ }]
178
+ }]
179
+ };
180
+
181
+ return this.pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
182
+ }
183
+
184
+ /**
185
+ * Export events as JSON
186
+ * @param {object[]} events
187
+ * @returns {string}
188
+ */
189
+ exportEvents(events) {
190
+ const data = {
191
+ '@timestamp': new Date().toISOString(),
192
+ service: this.serviceName,
193
+ events: events.map(e => ({
194
+ '@timestamp': e.timestamp,
195
+ type: e.type,
196
+ trace_id: e.traceId,
197
+ attributes: e.attributes
198
+ }))
199
+ };
200
+
201
+ return this.pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
202
+ }
203
+
204
+ /**
205
+ * Export full telemetry payload
206
+ * @param {object} payload - From TelemetryService.flush()
207
+ * @returns {string}
208
+ */
209
+ exportPayload(payload) {
210
+ const data = {
211
+ '@timestamp': payload.flushedAt,
212
+ service: {
213
+ name: this.serviceName,
214
+ version: this.serviceVersion
215
+ },
216
+ metrics: payload.metrics,
217
+ spans: payload.spans,
218
+ events: payload.events
219
+ };
220
+
221
+ return this.pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
222
+ }
223
+
224
+ /**
225
+ * Format span for OTLP
226
+ * @private
227
+ */
228
+ _formatSpan(span) {
229
+ return {
230
+ traceId: span.traceId,
231
+ spanId: span.spanId,
232
+ parentSpanId: span.parentSpanId,
233
+ name: span.name,
234
+ kind: 1, // SPAN_KIND_INTERNAL
235
+ startTimeUnixNano: Math.floor(span.startTime * 1000000).toString(),
236
+ endTimeUnixNano: span.endTime ? Math.floor(span.endTime * 1000000).toString() : null,
237
+ attributes: Object.entries(span.attributes || {}).map(([k, v]) => ({
238
+ key: k,
239
+ value: this._formatValue(v)
240
+ })),
241
+ events: (span.events || []).map(e => ({
242
+ name: e.name,
243
+ timeUnixNano: Math.floor(e.timestamp * 1000000).toString(),
244
+ attributes: Object.entries(e.attributes || {}).map(([k, v]) => ({
245
+ key: k,
246
+ value: this._formatValue(v)
247
+ }))
248
+ })),
249
+ status: {
250
+ code: span.status === SpanStatus.ERROR ? 2 : span.status === SpanStatus.OK ? 1 : 0,
251
+ message: span.statusMessage
252
+ }
253
+ };
254
+ }
255
+
256
+ /**
257
+ * Format attribute value for OTLP
258
+ * @private
259
+ */
260
+ _formatValue(v) {
261
+ if (typeof v === 'string') return { stringValue: v };
262
+ if (typeof v === 'number') {
263
+ return Number.isInteger(v) ? { intValue: v.toString() } : { doubleValue: v };
264
+ }
265
+ if (typeof v === 'boolean') return { boolValue: v };
266
+ if (Array.isArray(v)) return { arrayValue: { values: v.map(x => this._formatValue(x)) } };
267
+ return { stringValue: String(v) };
268
+ }
269
+ }
270
+
271
+ /**
272
+ * NDJSON (Newline Delimited JSON) exporter for streaming
273
+ */
274
+ export class NDJSONExporter {
275
+ constructor(options = {}) {
276
+ this.serviceName = options.serviceName || 'vib3-engine';
277
+ }
278
+
279
+ /**
280
+ * Export single event as NDJSON line
281
+ * @param {object} event
282
+ * @returns {string}
283
+ */
284
+ exportEvent(event) {
285
+ return JSON.stringify({
286
+ '@timestamp': event.timestamp || new Date().toISOString(),
287
+ service: this.serviceName,
288
+ type: event.type,
289
+ trace_id: event.traceId,
290
+ ...event.attributes
291
+ });
292
+ }
293
+
294
+ /**
295
+ * Export single span as NDJSON line
296
+ * @param {object} span
297
+ * @returns {string}
298
+ */
299
+ exportSpan(span) {
300
+ return JSON.stringify({
301
+ '@timestamp': new Date(span.startTime).toISOString(),
302
+ service: this.serviceName,
303
+ span_name: span.name,
304
+ trace_id: span.traceId,
305
+ span_id: span.spanId,
306
+ parent_span_id: span.parentSpanId,
307
+ duration_ms: span.durationMs,
308
+ status: span.status,
309
+ ...span.attributes
310
+ });
311
+ }
312
+
313
+ /**
314
+ * Export multiple items as NDJSON
315
+ * @param {object[]} items
316
+ * @param {string} type - 'event' or 'span'
317
+ * @returns {string}
318
+ */
319
+ exportBatch(items, type = 'event') {
320
+ const exportFn = type === 'span' ? this.exportSpan.bind(this) : this.exportEvent.bind(this);
321
+ return items.map(exportFn).join('\n');
322
+ }
323
+ }
324
+
325
+ /**
326
+ * Console exporter for development
327
+ */
328
+ export class ConsoleExporter {
329
+ constructor(options = {}) {
330
+ this.colorize = options.colorize !== false;
331
+ this.verbose = options.verbose || false;
332
+ }
333
+
334
+ /**
335
+ * Log event to console
336
+ */
337
+ logEvent(event) {
338
+ const color = this._getColorForType(event.type);
339
+ const prefix = this.colorize ? `${color}[${event.type}]${this._reset()}` : `[${event.type}]`;
340
+
341
+ console.log(`${prefix} ${event.timestamp || new Date().toISOString()}`);
342
+
343
+ if (this.verbose && event.attributes) {
344
+ console.log(' Attributes:', JSON.stringify(event.attributes, null, 2));
345
+ }
346
+ }
347
+
348
+ /**
349
+ * Log span to console
350
+ */
351
+ logSpan(span) {
352
+ const statusColor = span.status === SpanStatus.ERROR ? '\x1b[31m' :
353
+ span.status === SpanStatus.OK ? '\x1b[32m' : '\x1b[33m';
354
+ const status = this.colorize ? `${statusColor}${span.status}${this._reset()}` : span.status;
355
+
356
+ console.log(`[SPAN] ${span.name} - ${status} (${span.durationMs?.toFixed(2)}ms)`);
357
+
358
+ if (this.verbose) {
359
+ console.log(` Trace: ${span.traceId}`);
360
+ console.log(` Span: ${span.spanId}`);
361
+ if (span.events?.length) {
362
+ console.log(` Events: ${span.events.length}`);
363
+ }
364
+ }
365
+ }
366
+
367
+ /**
368
+ * Log metrics summary to console
369
+ */
370
+ logMetrics(metrics) {
371
+ console.log('=== VIB3+ Metrics ===');
372
+ console.log(`Tool Invocations: ${metrics.toolInvocations}`);
373
+ console.log(`Tool Errors: ${metrics.toolErrors}`);
374
+ console.log(`Frames Rendered: ${metrics.framesRendered}`);
375
+ console.log(`Param Changes: ${metrics.parameterChanges}`);
376
+ console.log(`System Switches: ${metrics.systemSwitches}`);
377
+ console.log(`Total Duration: ${metrics.totalDurationMs?.toFixed(2)}ms`);
378
+ console.log(`Buffer Size: ${metrics.bufferSize}`);
379
+ console.log('=====================');
380
+ }
381
+
382
+ /**
383
+ * Get ANSI color for event type
384
+ * @private
385
+ */
386
+ _getColorForType(type) {
387
+ if (type.includes('error')) return '\x1b[31m'; // Red
388
+ if (type.includes('start')) return '\x1b[36m'; // Cyan
389
+ if (type.includes('end')) return '\x1b[32m'; // Green
390
+ if (type.includes('change')) return '\x1b[33m'; // Yellow
391
+ return '\x1b[37m'; // White
392
+ }
393
+
394
+ /**
395
+ * Reset ANSI color
396
+ * @private
397
+ */
398
+ _reset() {
399
+ return '\x1b[0m';
400
+ }
401
+ }
402
+
403
+ /**
404
+ * Create exporter factory
405
+ */
406
+ export function createExporter(type, options = {}) {
407
+ switch (type) {
408
+ case 'prometheus':
409
+ return new PrometheusExporter(options);
410
+ case 'json':
411
+ return new JSONExporter(options);
412
+ case 'ndjson':
413
+ return new NDJSONExporter(options);
414
+ case 'console':
415
+ return new ConsoleExporter(options);
416
+ default:
417
+ throw new Error(`Unknown exporter type: ${type}`);
418
+ }
419
+ }
420
+
421
+ export default {
422
+ PrometheusExporter,
423
+ JSONExporter,
424
+ NDJSONExporter,
425
+ ConsoleExporter,
426
+ createExporter
427
+ };