@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,464 @@
1
+ /**
2
+ * VIB3+ Telemetry Service
3
+ * OpenTelemetry-compatible event tracing for agentic operations
4
+ */
5
+
6
+ /**
7
+ * Event types following OpenTelemetry semantic conventions
8
+ */
9
+ export const EventType = {
10
+ // Tool operations
11
+ TOOL_INVOCATION_START: 'vib3.tool.invocation.start',
12
+ TOOL_INVOCATION_END: 'vib3.tool.invocation.end',
13
+ TOOL_INVOCATION_ERROR: 'vib3.tool.invocation.error',
14
+
15
+ // Rendering
16
+ RENDER_FRAME_START: 'vib3.render.frame.start',
17
+ RENDER_FRAME_END: 'vib3.render.frame.end',
18
+ RENDER_CONTEXT_LOST: 'vib3.render.context.lost',
19
+ RENDER_CONTEXT_RESTORED: 'vib3.render.context.restored',
20
+
21
+ // Parameter changes
22
+ PARAMETER_CHANGE: 'vib3.parameter.change',
23
+ PARAMETER_BATCH_CHANGE: 'vib3.parameter.batch_change',
24
+ PARAMETER_RANDOMIZE: 'vib3.parameter.randomize',
25
+ PARAMETER_RESET: 'vib3.parameter.reset',
26
+
27
+ // System operations
28
+ SYSTEM_SWITCH: 'vib3.system.switch',
29
+ SYSTEM_INITIALIZE: 'vib3.system.initialize',
30
+ SYSTEM_DESTROY: 'vib3.system.destroy',
31
+
32
+ // Geometry
33
+ GEOMETRY_CHANGE: 'vib3.geometry.change',
34
+ GEOMETRY_GENERATE: 'vib3.geometry.generate',
35
+
36
+ // Gallery
37
+ GALLERY_SAVE: 'vib3.gallery.save',
38
+ GALLERY_LOAD: 'vib3.gallery.load',
39
+ GALLERY_EXPORT: 'vib3.gallery.export',
40
+
41
+ // Resources
42
+ RESOURCE_ALLOCATE: 'vib3.resource.allocate',
43
+ RESOURCE_DISPOSE: 'vib3.resource.dispose',
44
+ GPU_MEMORY_WARNING: 'vib3.gpu.memory.warning'
45
+ };
46
+
47
+ /**
48
+ * Span status following OpenTelemetry conventions
49
+ */
50
+ export const SpanStatus = {
51
+ UNSET: 'UNSET',
52
+ OK: 'OK',
53
+ ERROR: 'ERROR'
54
+ };
55
+
56
+ /**
57
+ * Generate unique trace/span IDs
58
+ */
59
+ function generateId(length = 16) {
60
+ const chars = '0123456789abcdef';
61
+ let result = '';
62
+ for (let i = 0; i < length; i++) {
63
+ result += chars[Math.floor(Math.random() * chars.length)];
64
+ }
65
+ return result;
66
+ }
67
+
68
+ /**
69
+ * Telemetry span for tracking operation duration
70
+ */
71
+ export class TelemetrySpan {
72
+ constructor(name, traceId, parentSpanId = null, attributes = {}) {
73
+ this.name = name;
74
+ this.traceId = traceId;
75
+ this.spanId = generateId(16);
76
+ this.parentSpanId = parentSpanId;
77
+ this.startTime = performance.now();
78
+ this.endTime = null;
79
+ this.status = SpanStatus.UNSET;
80
+ this.attributes = { ...attributes };
81
+ this.events = [];
82
+ }
83
+
84
+ /**
85
+ * Add an event to this span
86
+ */
87
+ addEvent(name, attributes = {}) {
88
+ this.events.push({
89
+ name,
90
+ timestamp: performance.now(),
91
+ attributes
92
+ });
93
+ return this;
94
+ }
95
+
96
+ /**
97
+ * Set span attribute
98
+ */
99
+ setAttribute(key, value) {
100
+ this.attributes[key] = value;
101
+ return this;
102
+ }
103
+
104
+ /**
105
+ * Set multiple attributes
106
+ */
107
+ setAttributes(attrs) {
108
+ Object.assign(this.attributes, attrs);
109
+ return this;
110
+ }
111
+
112
+ /**
113
+ * Set span status
114
+ */
115
+ setStatus(status, message = null) {
116
+ this.status = status;
117
+ if (message) {
118
+ this.statusMessage = message;
119
+ }
120
+ return this;
121
+ }
122
+
123
+ /**
124
+ * End the span
125
+ */
126
+ end() {
127
+ this.endTime = performance.now();
128
+ this.durationMs = this.endTime - this.startTime;
129
+ return this;
130
+ }
131
+
132
+ /**
133
+ * Export to JSON for logging/transmission
134
+ */
135
+ toJSON() {
136
+ return {
137
+ name: this.name,
138
+ traceId: this.traceId,
139
+ spanId: this.spanId,
140
+ parentSpanId: this.parentSpanId,
141
+ startTime: this.startTime,
142
+ endTime: this.endTime,
143
+ durationMs: this.durationMs,
144
+ status: this.status,
145
+ statusMessage: this.statusMessage,
146
+ attributes: this.attributes,
147
+ events: this.events
148
+ };
149
+ }
150
+ }
151
+
152
+ /**
153
+ * Main Telemetry Service
154
+ */
155
+ export class TelemetryService {
156
+ constructor(options = {}) {
157
+ this.serviceName = options.serviceName || 'vib3-engine';
158
+ this.serviceVersion = options.serviceVersion || '1.0.0';
159
+ this.enabled = options.enabled !== false;
160
+ this.bufferSize = options.bufferSize || 100;
161
+ this.flushInterval = options.flushInterval || 5000;
162
+
163
+ // Event buffer for batching
164
+ this.eventBuffer = [];
165
+ this.spanBuffer = [];
166
+
167
+ // Listeners for real-time event streaming
168
+ this.listeners = new Map();
169
+
170
+ // Metrics
171
+ this.metrics = {
172
+ toolInvocations: 0,
173
+ toolErrors: 0,
174
+ framesRendered: 0,
175
+ parameterChanges: 0,
176
+ systemSwitches: 0,
177
+ totalDurationMs: 0
178
+ };
179
+
180
+ // Current trace context
181
+ this.currentTraceId = null;
182
+
183
+ // Flush timer
184
+ if (this.enabled && this.flushInterval > 0) {
185
+ this.flushTimer = setInterval(() => this.flush(), this.flushInterval);
186
+ }
187
+ }
188
+
189
+ /**
190
+ * Start a new trace
191
+ */
192
+ startTrace() {
193
+ this.currentTraceId = generateId(32);
194
+ return this.currentTraceId;
195
+ }
196
+
197
+ /**
198
+ * Get current trace ID or create one
199
+ */
200
+ getTraceId() {
201
+ if (!this.currentTraceId) {
202
+ this.startTrace();
203
+ }
204
+ return this.currentTraceId;
205
+ }
206
+
207
+ /**
208
+ * Create a new span
209
+ */
210
+ createSpan(name, attributes = {}, parentSpanId = null) {
211
+ if (!this.enabled) return new TelemetrySpan(name, 'disabled');
212
+
213
+ const span = new TelemetrySpan(
214
+ name,
215
+ this.getTraceId(),
216
+ parentSpanId,
217
+ {
218
+ 'service.name': this.serviceName,
219
+ 'service.version': this.serviceVersion,
220
+ ...attributes
221
+ }
222
+ );
223
+
224
+ return span;
225
+ }
226
+
227
+ /**
228
+ * Record a completed span
229
+ */
230
+ recordSpan(span) {
231
+ if (!this.enabled) return;
232
+
233
+ this.spanBuffer.push(span.toJSON());
234
+ this.emit('span', span.toJSON());
235
+
236
+ // Update metrics based on span
237
+ this.updateMetrics(span);
238
+
239
+ // Flush if buffer full
240
+ if (this.spanBuffer.length >= this.bufferSize) {
241
+ this.flush();
242
+ }
243
+ }
244
+
245
+ /**
246
+ * Record an event
247
+ */
248
+ recordEvent(type, attributes = {}) {
249
+ if (!this.enabled) return;
250
+
251
+ const event = {
252
+ type,
253
+ timestamp: new Date().toISOString(),
254
+ timestampMs: performance.now(),
255
+ traceId: this.getTraceId(),
256
+ attributes: {
257
+ 'service.name': this.serviceName,
258
+ ...attributes
259
+ }
260
+ };
261
+
262
+ this.eventBuffer.push(event);
263
+ this.emit('event', event);
264
+
265
+ // Update metrics
266
+ this.updateMetricsFromEvent(type);
267
+
268
+ // Flush if buffer full
269
+ if (this.eventBuffer.length >= this.bufferSize) {
270
+ this.flush();
271
+ }
272
+
273
+ return event;
274
+ }
275
+
276
+ /**
277
+ * Update metrics based on span
278
+ */
279
+ updateMetrics(span) {
280
+ if (span.name.startsWith('tool.')) {
281
+ this.metrics.toolInvocations++;
282
+ if (span.status === SpanStatus.ERROR) {
283
+ this.metrics.toolErrors++;
284
+ }
285
+ }
286
+ if (span.durationMs) {
287
+ this.metrics.totalDurationMs += span.durationMs;
288
+ }
289
+ }
290
+
291
+ /**
292
+ * Update metrics from event type
293
+ */
294
+ updateMetricsFromEvent(type) {
295
+ switch (type) {
296
+ case EventType.RENDER_FRAME_END:
297
+ this.metrics.framesRendered++;
298
+ break;
299
+ case EventType.PARAMETER_CHANGE:
300
+ case EventType.PARAMETER_BATCH_CHANGE:
301
+ this.metrics.parameterChanges++;
302
+ break;
303
+ case EventType.SYSTEM_SWITCH:
304
+ this.metrics.systemSwitches++;
305
+ break;
306
+ case EventType.TOOL_INVOCATION_ERROR:
307
+ this.metrics.toolErrors++;
308
+ break;
309
+ }
310
+ }
311
+
312
+ /**
313
+ * Subscribe to telemetry events
314
+ */
315
+ subscribe(eventType, callback) {
316
+ if (!this.listeners.has(eventType)) {
317
+ this.listeners.set(eventType, new Set());
318
+ }
319
+ this.listeners.get(eventType).add(callback);
320
+
321
+ // Return unsubscribe function
322
+ return () => {
323
+ this.listeners.get(eventType)?.delete(callback);
324
+ };
325
+ }
326
+
327
+ /**
328
+ * Emit event to listeners
329
+ */
330
+ emit(eventType, data) {
331
+ // Emit to specific type listeners
332
+ this.listeners.get(eventType)?.forEach(cb => {
333
+ try {
334
+ cb(data);
335
+ } catch (e) {
336
+ console.error('Telemetry listener error:', e);
337
+ }
338
+ });
339
+
340
+ // Emit to 'all' listeners
341
+ this.listeners.get('all')?.forEach(cb => {
342
+ try {
343
+ cb({ type: eventType, data });
344
+ } catch (e) {
345
+ console.error('Telemetry listener error:', e);
346
+ }
347
+ });
348
+ }
349
+
350
+ /**
351
+ * Flush buffered events (e.g., to external service)
352
+ * @returns {object} Payload with events, spans, metrics
353
+ */
354
+ flush() {
355
+ const payload = {
356
+ events: [...this.eventBuffer],
357
+ spans: [...this.spanBuffer],
358
+ metrics: { ...this.metrics },
359
+ flushedAt: new Date().toISOString()
360
+ };
361
+
362
+ // Clear buffers
363
+ this.eventBuffer = [];
364
+ this.spanBuffer = [];
365
+
366
+ // Emit flush event for external handlers (only if there was data)
367
+ if (payload.events.length > 0 || payload.spans.length > 0) {
368
+ this.emit('flush', payload);
369
+ }
370
+
371
+ return payload;
372
+ }
373
+
374
+ /**
375
+ * Get current metrics snapshot
376
+ */
377
+ getMetrics() {
378
+ return {
379
+ ...this.metrics,
380
+ bufferSize: this.eventBuffer.length + this.spanBuffer.length,
381
+ timestamp: new Date().toISOString()
382
+ };
383
+ }
384
+
385
+ /**
386
+ * Reset metrics
387
+ */
388
+ resetMetrics() {
389
+ this.metrics = {
390
+ toolInvocations: 0,
391
+ toolErrors: 0,
392
+ framesRendered: 0,
393
+ parameterChanges: 0,
394
+ systemSwitches: 0,
395
+ totalDurationMs: 0
396
+ };
397
+ }
398
+
399
+ /**
400
+ * Enable/disable telemetry
401
+ */
402
+ setEnabled(enabled) {
403
+ this.enabled = enabled;
404
+ }
405
+
406
+ /**
407
+ * Destroy service
408
+ */
409
+ destroy() {
410
+ if (this.flushTimer) {
411
+ clearInterval(this.flushTimer);
412
+ }
413
+ this.flush();
414
+ this.listeners.clear();
415
+ }
416
+ }
417
+
418
+ // Convenience functions for common operations
419
+
420
+ /**
421
+ * Wrap an async operation with telemetry
422
+ */
423
+ export async function withTelemetry(service, operationName, fn, attributes = {}) {
424
+ const span = service.createSpan(operationName, attributes);
425
+
426
+ try {
427
+ const result = await fn();
428
+ span.setStatus(SpanStatus.OK);
429
+ return result;
430
+ } catch (error) {
431
+ span.setStatus(SpanStatus.ERROR, error.message);
432
+ span.setAttribute('error.type', error.name);
433
+ span.setAttribute('error.message', error.message);
434
+ throw error;
435
+ } finally {
436
+ span.end();
437
+ service.recordSpan(span);
438
+ }
439
+ }
440
+
441
+ /**
442
+ * Wrap a sync operation with telemetry
443
+ */
444
+ export function withTelemetrySync(service, operationName, fn, attributes = {}) {
445
+ const span = service.createSpan(operationName, attributes);
446
+
447
+ try {
448
+ const result = fn();
449
+ span.setStatus(SpanStatus.OK);
450
+ return result;
451
+ } catch (error) {
452
+ span.setStatus(SpanStatus.ERROR, error.message);
453
+ span.setAttribute('error.type', error.name);
454
+ span.setAttribute('error.message', error.message);
455
+ throw error;
456
+ } finally {
457
+ span.end();
458
+ service.recordSpan(span);
459
+ }
460
+ }
461
+
462
+ // Singleton instance
463
+ export const telemetry = new TelemetryService();
464
+ export default telemetry;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * VIB3+ Telemetry Module
3
+ * Re-exports telemetry service and utilities
4
+ */
5
+
6
+ // Core telemetry
7
+ export {
8
+ TelemetryService,
9
+ TelemetrySpan,
10
+ EventType,
11
+ SpanStatus,
12
+ withTelemetry,
13
+ withTelemetrySync,
14
+ telemetry
15
+ } from './TelemetryService.js';
16
+
17
+ // Exporters
18
+ export {
19
+ PrometheusExporter,
20
+ JSONExporter,
21
+ NDJSONExporter,
22
+ ConsoleExporter,
23
+ createExporter
24
+ } from './TelemetryExporters.js';
25
+
26
+ // Event streaming
27
+ export {
28
+ StreamEventType,
29
+ EventStreamServer,
30
+ EventStreamClient,
31
+ SSEConnection,
32
+ createSSEHandler,
33
+ connectTelemetryToStream
34
+ } from './EventStream.js';
35
+
36
+ // Instrumentation
37
+ export {
38
+ configureTelemetry,
39
+ getTelemetry,
40
+ trace,
41
+ traceFunction,
42
+ traceAsyncIterable,
43
+ instrumentClass,
44
+ traceObject,
45
+ withTiming,
46
+ meter,
47
+ traceBatch,
48
+ TraceContext
49
+ } from './Instrumentation.js';
50
+
51
+ import { telemetry } from './TelemetryService.js';
52
+ export default telemetry;