@vib3code/sdk 2.0.1 → 2.0.3-canary.75a3290

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 (136) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +243 -0
  3. package/DOCS/CLI_ONBOARDING.md +1 -1
  4. package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +117 -0
  5. package/DOCS/EPIC_SCROLL_EVENTS.md +773 -0
  6. package/DOCS/HANDOFF_LANDING_PAGE.md +154 -0
  7. package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +493 -0
  8. package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +937 -0
  9. package/DOCS/PRODUCT_STRATEGY.md +63 -0
  10. package/DOCS/README.md +103 -0
  11. package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +97 -0
  12. package/DOCS/ROADMAP.md +111 -0
  13. package/DOCS/SCROLL_TIMELINE_v3.md +269 -0
  14. package/DOCS/SITE_REFACTOR_PLAN.md +100 -0
  15. package/DOCS/STATUS.md +24 -0
  16. package/DOCS/SYSTEM_INVENTORY.md +33 -30
  17. package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +85 -0
  18. package/DOCS/VISUAL_ANALYSIS_FACETAD.md +133 -0
  19. package/DOCS/VISUAL_ANALYSIS_SIMONE.md +95 -0
  20. package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +86 -0
  21. package/DOCS/{BLUEPRINT_EXECUTION_PLAN_2026-01-07.md → archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md} +1 -1
  22. package/DOCS/{DEV_TRACK_ANALYSIS.md → archive/DEV_TRACK_ANALYSIS.md} +3 -0
  23. package/DOCS/{SYSTEM_AUDIT_2026-01-30.md → archive/SYSTEM_AUDIT_2026-01-30.md} +3 -0
  24. package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +1 -1
  25. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +231 -0
  26. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +127 -0
  27. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +142 -0
  28. package/DOCS/dev-tracks/README.md +10 -0
  29. package/README.md +26 -13
  30. package/cpp/CMakeLists.txt +236 -0
  31. package/cpp/bindings/embind.cpp +269 -0
  32. package/cpp/build.sh +129 -0
  33. package/cpp/geometry/Crystal.cpp +103 -0
  34. package/cpp/geometry/Fractal.cpp +136 -0
  35. package/cpp/geometry/GeometryGenerator.cpp +262 -0
  36. package/cpp/geometry/KleinBottle.cpp +71 -0
  37. package/cpp/geometry/Sphere.cpp +134 -0
  38. package/cpp/geometry/Tesseract.cpp +94 -0
  39. package/cpp/geometry/Tetrahedron.cpp +83 -0
  40. package/cpp/geometry/Torus.cpp +65 -0
  41. package/cpp/geometry/WarpFunctions.cpp +238 -0
  42. package/cpp/geometry/Wave.cpp +85 -0
  43. package/cpp/include/vib3_ffi.h +238 -0
  44. package/cpp/math/Mat4x4.cpp +409 -0
  45. package/cpp/math/Mat4x4.hpp +209 -0
  46. package/cpp/math/Projection.cpp +142 -0
  47. package/cpp/math/Projection.hpp +148 -0
  48. package/cpp/math/Rotor4D.cpp +322 -0
  49. package/cpp/math/Rotor4D.hpp +204 -0
  50. package/cpp/math/Vec4.cpp +303 -0
  51. package/cpp/math/Vec4.hpp +225 -0
  52. package/cpp/src/vib3_ffi.cpp +607 -0
  53. package/cpp/tests/Geometry_test.cpp +213 -0
  54. package/cpp/tests/Mat4x4_test.cpp +494 -0
  55. package/cpp/tests/Projection_test.cpp +298 -0
  56. package/cpp/tests/Rotor4D_test.cpp +423 -0
  57. package/cpp/tests/Vec4_test.cpp +489 -0
  58. package/package.json +40 -27
  59. package/src/agent/index.js +1 -3
  60. package/src/agent/mcp/MCPServer.js +918 -0
  61. package/src/agent/mcp/index.js +1 -1
  62. package/src/agent/mcp/stdio-server.js +264 -0
  63. package/src/agent/mcp/tools.js +454 -0
  64. package/src/cli/index.js +374 -44
  65. package/src/core/CanvasManager.js +97 -204
  66. package/src/core/ErrorReporter.js +1 -1
  67. package/src/core/Parameters.js +1 -1
  68. package/src/core/VIB3Engine.js +93 -4
  69. package/src/core/VitalitySystem.js +53 -0
  70. package/src/core/index.js +18 -0
  71. package/src/core/renderers/FacetedRendererAdapter.js +10 -9
  72. package/src/core/renderers/HolographicRendererAdapter.js +13 -9
  73. package/src/core/renderers/QuantumRendererAdapter.js +11 -7
  74. package/src/creative/AestheticMapper.js +628 -0
  75. package/src/creative/ChoreographyPlayer.js +481 -0
  76. package/src/creative/index.js +11 -0
  77. package/src/export/TradingCardManager.js +3 -4
  78. package/src/export/index.js +11 -1
  79. package/src/faceted/FacetedSystem.js +241 -388
  80. package/src/holograms/HolographicVisualizer.js +29 -12
  81. package/src/holograms/RealHolographicSystem.js +194 -43
  82. package/src/math/index.js +7 -7
  83. package/src/polychora/PolychoraSystem.js +77 -0
  84. package/src/quantum/QuantumEngine.js +103 -66
  85. package/src/quantum/QuantumVisualizer.js +7 -2
  86. package/src/reactivity/index.js +3 -5
  87. package/src/render/LayerPresetManager.js +372 -0
  88. package/src/render/LayerReactivityBridge.js +344 -0
  89. package/src/render/LayerRelationshipGraph.js +610 -0
  90. package/src/render/MultiCanvasBridge.js +148 -25
  91. package/src/render/UnifiedRenderBridge.js +3 -0
  92. package/src/render/index.js +27 -2
  93. package/src/scene/index.js +4 -4
  94. package/src/shaders/faceted/faceted.frag.glsl +220 -80
  95. package/src/shaders/faceted/faceted.frag.wgsl +138 -97
  96. package/src/shaders/holographic/holographic.frag.glsl +28 -9
  97. package/src/shaders/holographic/holographic.frag.wgsl +107 -38
  98. package/src/shaders/quantum/quantum.frag.glsl +1 -0
  99. package/src/shaders/quantum/quantum.frag.wgsl +1 -1
  100. package/src/testing/ParallelTestFramework.js +2 -2
  101. package/src/viewer/GalleryUI.js +17 -0
  102. package/src/viewer/ViewerPortal.js +2 -2
  103. package/src/viewer/index.js +1 -1
  104. package/tools/headless-renderer.js +258 -0
  105. package/tools/shader-sync-verify.js +8 -4
  106. package/tools/site-analysis/all-reports.json +32 -0
  107. package/tools/site-analysis/combined-analysis.md +50 -0
  108. package/tools/site-analyzer.mjs +779 -0
  109. package/tools/visual-catalog/capture.js +276 -0
  110. package/tools/visual-catalog/composite.js +138 -0
  111. package/types/adaptive-sdk.d.ts +204 -5
  112. package/types/agent/cli.d.ts +78 -0
  113. package/types/agent/index.d.ts +18 -0
  114. package/types/agent/mcp.d.ts +87 -0
  115. package/types/agent/telemetry.d.ts +190 -0
  116. package/types/core/VIB3Engine.d.ts +26 -0
  117. package/types/core/index.d.ts +261 -0
  118. package/types/creative/AestheticMapper.d.ts +72 -0
  119. package/types/creative/ChoreographyPlayer.d.ts +96 -0
  120. package/types/creative/index.d.ts +17 -0
  121. package/types/export/index.d.ts +243 -0
  122. package/types/geometry/index.d.ts +164 -0
  123. package/types/math/index.d.ts +214 -0
  124. package/types/render/LayerPresetManager.d.ts +78 -0
  125. package/types/render/LayerReactivityBridge.d.ts +85 -0
  126. package/types/render/LayerRelationshipGraph.d.ts +174 -0
  127. package/types/render/index.d.ts +3 -0
  128. package/types/scene/index.d.ts +204 -0
  129. package/types/systems/index.d.ts +244 -0
  130. package/types/variations/index.d.ts +62 -0
  131. package/types/viewer/index.d.ts +225 -0
  132. /package/DOCS/{DEV_TRACK_PLAN_2026-01-07.md → archive/DEV_TRACK_PLAN_2026-01-07.md} +0 -0
  133. /package/DOCS/{SESSION_014_PLAN.md → archive/SESSION_014_PLAN.md} +0 -0
  134. /package/DOCS/{SESSION_LOG_2026-01-07.md → archive/SESSION_LOG_2026-01-07.md} +0 -0
  135. /package/DOCS/{STRATEGIC_BLUEPRINT_2026-01-07.md → archive/STRATEGIC_BLUEPRINT_2026-01-07.md} +0 -0
  136. /package/src/viewer/{ReactivityManager.js → ViewerInputHandler.js} +0 -0
@@ -0,0 +1,489 @@
1
+ /**
2
+ * Vec4_test.cpp - Unit tests for Vec4 4D vector class
3
+ *
4
+ * Tests construction, arithmetic, geometric operations, and static factories.
5
+ */
6
+
7
+ #include <gtest/gtest.h>
8
+ #include "math/Vec4.hpp"
9
+ #include <cmath>
10
+
11
+ using namespace vib3;
12
+
13
+ // Tolerance for floating-point comparisons
14
+ static constexpr float kEpsilon = 1e-5f;
15
+
16
+ // ============================================================================
17
+ // Construction
18
+ // ============================================================================
19
+
20
+ TEST(Vec4, DefaultConstructorIsZero) {
21
+ Vec4 v;
22
+ EXPECT_FLOAT_EQ(v.x, 0.0f);
23
+ EXPECT_FLOAT_EQ(v.y, 0.0f);
24
+ EXPECT_FLOAT_EQ(v.z, 0.0f);
25
+ EXPECT_FLOAT_EQ(v.w, 0.0f);
26
+ }
27
+
28
+ TEST(Vec4, ParameterizedConstructor) {
29
+ Vec4 v(1.0f, 2.0f, 3.0f, 4.0f);
30
+ EXPECT_FLOAT_EQ(v.x, 1.0f);
31
+ EXPECT_FLOAT_EQ(v.y, 2.0f);
32
+ EXPECT_FLOAT_EQ(v.z, 3.0f);
33
+ EXPECT_FLOAT_EQ(v.w, 4.0f);
34
+ }
35
+
36
+ TEST(Vec4, ScalarConstructor) {
37
+ Vec4 v(5.0f);
38
+ EXPECT_FLOAT_EQ(v.x, 5.0f);
39
+ EXPECT_FLOAT_EQ(v.y, 5.0f);
40
+ EXPECT_FLOAT_EQ(v.z, 5.0f);
41
+ EXPECT_FLOAT_EQ(v.w, 5.0f);
42
+ }
43
+
44
+ TEST(Vec4, ArrayConstructor) {
45
+ std::array<float, 4> arr = {1.0f, 2.0f, 3.0f, 4.0f};
46
+ Vec4 v(arr);
47
+ EXPECT_FLOAT_EQ(v.x, 1.0f);
48
+ EXPECT_FLOAT_EQ(v.y, 2.0f);
49
+ EXPECT_FLOAT_EQ(v.z, 3.0f);
50
+ EXPECT_FLOAT_EQ(v.w, 4.0f);
51
+ }
52
+
53
+ // ============================================================================
54
+ // Static Factories
55
+ // ============================================================================
56
+
57
+ TEST(Vec4, ZeroFactory) {
58
+ Vec4 v = Vec4::zero();
59
+ EXPECT_FLOAT_EQ(v.x, 0.0f);
60
+ EXPECT_FLOAT_EQ(v.y, 0.0f);
61
+ EXPECT_FLOAT_EQ(v.z, 0.0f);
62
+ EXPECT_FLOAT_EQ(v.w, 0.0f);
63
+ }
64
+
65
+ TEST(Vec4, OneFactory) {
66
+ Vec4 v = Vec4::one();
67
+ EXPECT_FLOAT_EQ(v.x, 1.0f);
68
+ EXPECT_FLOAT_EQ(v.y, 1.0f);
69
+ EXPECT_FLOAT_EQ(v.z, 1.0f);
70
+ EXPECT_FLOAT_EQ(v.w, 1.0f);
71
+ }
72
+
73
+ TEST(Vec4, UnitXFactory) {
74
+ Vec4 v = Vec4::unitX();
75
+ EXPECT_FLOAT_EQ(v.x, 1.0f);
76
+ EXPECT_FLOAT_EQ(v.y, 0.0f);
77
+ EXPECT_FLOAT_EQ(v.z, 0.0f);
78
+ EXPECT_FLOAT_EQ(v.w, 0.0f);
79
+ }
80
+
81
+ TEST(Vec4, UnitYFactory) {
82
+ Vec4 v = Vec4::unitY();
83
+ EXPECT_FLOAT_EQ(v.x, 0.0f);
84
+ EXPECT_FLOAT_EQ(v.y, 1.0f);
85
+ EXPECT_FLOAT_EQ(v.z, 0.0f);
86
+ EXPECT_FLOAT_EQ(v.w, 0.0f);
87
+ }
88
+
89
+ TEST(Vec4, UnitZFactory) {
90
+ Vec4 v = Vec4::unitZ();
91
+ EXPECT_FLOAT_EQ(v.x, 0.0f);
92
+ EXPECT_FLOAT_EQ(v.y, 0.0f);
93
+ EXPECT_FLOAT_EQ(v.z, 1.0f);
94
+ EXPECT_FLOAT_EQ(v.w, 0.0f);
95
+ }
96
+
97
+ TEST(Vec4, UnitWFactory) {
98
+ Vec4 v = Vec4::unitW();
99
+ EXPECT_FLOAT_EQ(v.x, 0.0f);
100
+ EXPECT_FLOAT_EQ(v.y, 0.0f);
101
+ EXPECT_FLOAT_EQ(v.z, 0.0f);
102
+ EXPECT_FLOAT_EQ(v.w, 1.0f);
103
+ }
104
+
105
+ // ============================================================================
106
+ // Element Access
107
+ // ============================================================================
108
+
109
+ TEST(Vec4, SubscriptOperator) {
110
+ Vec4 v(10.0f, 20.0f, 30.0f, 40.0f);
111
+ EXPECT_FLOAT_EQ(v[0], 10.0f);
112
+ EXPECT_FLOAT_EQ(v[1], 20.0f);
113
+ EXPECT_FLOAT_EQ(v[2], 30.0f);
114
+ EXPECT_FLOAT_EQ(v[3], 40.0f);
115
+ }
116
+
117
+ TEST(Vec4, SubscriptOperatorMutation) {
118
+ Vec4 v;
119
+ v[0] = 1.0f;
120
+ v[1] = 2.0f;
121
+ v[2] = 3.0f;
122
+ v[3] = 4.0f;
123
+ EXPECT_FLOAT_EQ(v.x, 1.0f);
124
+ EXPECT_FLOAT_EQ(v.y, 2.0f);
125
+ EXPECT_FLOAT_EQ(v.z, 3.0f);
126
+ EXPECT_FLOAT_EQ(v.w, 4.0f);
127
+ }
128
+
129
+ // ============================================================================
130
+ // Arithmetic
131
+ // ============================================================================
132
+
133
+ TEST(Vec4, Addition) {
134
+ Vec4 a(1.0f, 2.0f, 3.0f, 4.0f);
135
+ Vec4 b(5.0f, 6.0f, 7.0f, 8.0f);
136
+ Vec4 c = a + b;
137
+ EXPECT_FLOAT_EQ(c.x, 6.0f);
138
+ EXPECT_FLOAT_EQ(c.y, 8.0f);
139
+ EXPECT_FLOAT_EQ(c.z, 10.0f);
140
+ EXPECT_FLOAT_EQ(c.w, 12.0f);
141
+ }
142
+
143
+ TEST(Vec4, Subtraction) {
144
+ Vec4 a(5.0f, 7.0f, 9.0f, 11.0f);
145
+ Vec4 b(1.0f, 2.0f, 3.0f, 4.0f);
146
+ Vec4 c = a - b;
147
+ EXPECT_FLOAT_EQ(c.x, 4.0f);
148
+ EXPECT_FLOAT_EQ(c.y, 5.0f);
149
+ EXPECT_FLOAT_EQ(c.z, 6.0f);
150
+ EXPECT_FLOAT_EQ(c.w, 7.0f);
151
+ }
152
+
153
+ TEST(Vec4, ScalarMultiplication) {
154
+ Vec4 v(1.0f, 2.0f, 3.0f, 4.0f);
155
+ Vec4 result = v * 2.0f;
156
+ EXPECT_FLOAT_EQ(result.x, 2.0f);
157
+ EXPECT_FLOAT_EQ(result.y, 4.0f);
158
+ EXPECT_FLOAT_EQ(result.z, 6.0f);
159
+ EXPECT_FLOAT_EQ(result.w, 8.0f);
160
+ }
161
+
162
+ TEST(Vec4, ScalarMultiplicationCommutative) {
163
+ Vec4 v(1.0f, 2.0f, 3.0f, 4.0f);
164
+ Vec4 result = 3.0f * v;
165
+ EXPECT_FLOAT_EQ(result.x, 3.0f);
166
+ EXPECT_FLOAT_EQ(result.y, 6.0f);
167
+ EXPECT_FLOAT_EQ(result.z, 9.0f);
168
+ EXPECT_FLOAT_EQ(result.w, 12.0f);
169
+ }
170
+
171
+ TEST(Vec4, ScalarDivision) {
172
+ Vec4 v(2.0f, 4.0f, 6.0f, 8.0f);
173
+ Vec4 result = v / 2.0f;
174
+ EXPECT_FLOAT_EQ(result.x, 1.0f);
175
+ EXPECT_FLOAT_EQ(result.y, 2.0f);
176
+ EXPECT_FLOAT_EQ(result.z, 3.0f);
177
+ EXPECT_FLOAT_EQ(result.w, 4.0f);
178
+ }
179
+
180
+ TEST(Vec4, Negation) {
181
+ Vec4 v(1.0f, -2.0f, 3.0f, -4.0f);
182
+ Vec4 neg = -v;
183
+ EXPECT_FLOAT_EQ(neg.x, -1.0f);
184
+ EXPECT_FLOAT_EQ(neg.y, 2.0f);
185
+ EXPECT_FLOAT_EQ(neg.z, -3.0f);
186
+ EXPECT_FLOAT_EQ(neg.w, 4.0f);
187
+ }
188
+
189
+ TEST(Vec4, CompoundAddition) {
190
+ Vec4 a(1.0f, 2.0f, 3.0f, 4.0f);
191
+ a += Vec4(10.0f, 20.0f, 30.0f, 40.0f);
192
+ EXPECT_FLOAT_EQ(a.x, 11.0f);
193
+ EXPECT_FLOAT_EQ(a.y, 22.0f);
194
+ EXPECT_FLOAT_EQ(a.z, 33.0f);
195
+ EXPECT_FLOAT_EQ(a.w, 44.0f);
196
+ }
197
+
198
+ TEST(Vec4, CompoundSubtraction) {
199
+ Vec4 a(10.0f, 20.0f, 30.0f, 40.0f);
200
+ a -= Vec4(1.0f, 2.0f, 3.0f, 4.0f);
201
+ EXPECT_FLOAT_EQ(a.x, 9.0f);
202
+ EXPECT_FLOAT_EQ(a.y, 18.0f);
203
+ EXPECT_FLOAT_EQ(a.z, 27.0f);
204
+ EXPECT_FLOAT_EQ(a.w, 36.0f);
205
+ }
206
+
207
+ TEST(Vec4, CompoundScalarMultiply) {
208
+ Vec4 a(1.0f, 2.0f, 3.0f, 4.0f);
209
+ a *= 5.0f;
210
+ EXPECT_FLOAT_EQ(a.x, 5.0f);
211
+ EXPECT_FLOAT_EQ(a.y, 10.0f);
212
+ EXPECT_FLOAT_EQ(a.z, 15.0f);
213
+ EXPECT_FLOAT_EQ(a.w, 20.0f);
214
+ }
215
+
216
+ TEST(Vec4, CompoundScalarDivide) {
217
+ Vec4 a(10.0f, 20.0f, 30.0f, 40.0f);
218
+ a /= 10.0f;
219
+ EXPECT_FLOAT_EQ(a.x, 1.0f);
220
+ EXPECT_FLOAT_EQ(a.y, 2.0f);
221
+ EXPECT_FLOAT_EQ(a.z, 3.0f);
222
+ EXPECT_FLOAT_EQ(a.w, 4.0f);
223
+ }
224
+
225
+ // ============================================================================
226
+ // Geometric Operations
227
+ // ============================================================================
228
+
229
+ TEST(Vec4, DotProduct) {
230
+ Vec4 a(1.0f, 2.0f, 3.0f, 4.0f);
231
+ Vec4 b(5.0f, 6.0f, 7.0f, 8.0f);
232
+ // 1*5 + 2*6 + 3*7 + 4*8 = 5 + 12 + 21 + 32 = 70
233
+ EXPECT_FLOAT_EQ(a.dot(b), 70.0f);
234
+ }
235
+
236
+ TEST(Vec4, DotProductOrthogonal) {
237
+ // Unit vectors are orthogonal
238
+ EXPECT_FLOAT_EQ(Vec4::unitX().dot(Vec4::unitY()), 0.0f);
239
+ EXPECT_FLOAT_EQ(Vec4::unitX().dot(Vec4::unitZ()), 0.0f);
240
+ EXPECT_FLOAT_EQ(Vec4::unitX().dot(Vec4::unitW()), 0.0f);
241
+ EXPECT_FLOAT_EQ(Vec4::unitY().dot(Vec4::unitZ()), 0.0f);
242
+ EXPECT_FLOAT_EQ(Vec4::unitY().dot(Vec4::unitW()), 0.0f);
243
+ EXPECT_FLOAT_EQ(Vec4::unitZ().dot(Vec4::unitW()), 0.0f);
244
+ }
245
+
246
+ TEST(Vec4, DotProductFreeFunction) {
247
+ Vec4 a(1.0f, 0.0f, 0.0f, 0.0f);
248
+ Vec4 b(0.0f, 1.0f, 0.0f, 0.0f);
249
+ EXPECT_FLOAT_EQ(dot(a, b), 0.0f);
250
+ EXPECT_FLOAT_EQ(dot(a, a), 1.0f);
251
+ }
252
+
253
+ TEST(Vec4, LengthOfUnitVectors) {
254
+ EXPECT_FLOAT_EQ(Vec4::unitX().length(), 1.0f);
255
+ EXPECT_FLOAT_EQ(Vec4::unitY().length(), 1.0f);
256
+ EXPECT_FLOAT_EQ(Vec4::unitZ().length(), 1.0f);
257
+ EXPECT_FLOAT_EQ(Vec4::unitW().length(), 1.0f);
258
+ }
259
+
260
+ TEST(Vec4, LengthSquared) {
261
+ Vec4 v(1.0f, 2.0f, 3.0f, 4.0f);
262
+ // 1 + 4 + 9 + 16 = 30
263
+ EXPECT_FLOAT_EQ(v.lengthSquared(), 30.0f);
264
+ }
265
+
266
+ TEST(Vec4, LengthGeneral) {
267
+ Vec4 v(3.0f, 4.0f, 0.0f, 0.0f);
268
+ EXPECT_FLOAT_EQ(v.length(), 5.0f);
269
+ }
270
+
271
+ TEST(Vec4, LengthZeroVector) {
272
+ EXPECT_FLOAT_EQ(Vec4::zero().length(), 0.0f);
273
+ }
274
+
275
+ TEST(Vec4, NormalizeUnitVector) {
276
+ Vec4 v = Vec4::unitX().normalized();
277
+ EXPECT_NEAR(v.x, 1.0f, kEpsilon);
278
+ EXPECT_NEAR(v.y, 0.0f, kEpsilon);
279
+ EXPECT_NEAR(v.z, 0.0f, kEpsilon);
280
+ EXPECT_NEAR(v.w, 0.0f, kEpsilon);
281
+ }
282
+
283
+ TEST(Vec4, NormalizeGeneralVector) {
284
+ Vec4 v(3.0f, 4.0f, 0.0f, 0.0f);
285
+ Vec4 n = v.normalized();
286
+ EXPECT_NEAR(n.length(), 1.0f, kEpsilon);
287
+ EXPECT_NEAR(n.x, 0.6f, kEpsilon);
288
+ EXPECT_NEAR(n.y, 0.8f, kEpsilon);
289
+ }
290
+
291
+ TEST(Vec4, NormalizeInPlace) {
292
+ Vec4 v(0.0f, 0.0f, 3.0f, 4.0f);
293
+ v.normalize();
294
+ EXPECT_NEAR(v.length(), 1.0f, kEpsilon);
295
+ }
296
+
297
+ TEST(Vec4, IsNormalized) {
298
+ EXPECT_TRUE(Vec4::unitX().isNormalized());
299
+ EXPECT_TRUE(Vec4::unitY().isNormalized());
300
+ EXPECT_FALSE(Vec4(2.0f, 0.0f, 0.0f, 0.0f).isNormalized());
301
+ EXPECT_FALSE(Vec4::zero().isNormalized());
302
+ }
303
+
304
+ TEST(Vec4, IsZero) {
305
+ EXPECT_TRUE(Vec4::zero().isZero());
306
+ EXPECT_TRUE(Vec4(0.0f, 0.0f, 0.0f, 0.0f).isZero());
307
+ EXPECT_FALSE(Vec4::unitX().isZero());
308
+ EXPECT_FALSE(Vec4(1e-7f, 0.0f, 0.0f, 0.0f).isZero());
309
+ }
310
+
311
+ // ============================================================================
312
+ // Distance
313
+ // ============================================================================
314
+
315
+ TEST(Vec4, DistanceToSelf) {
316
+ Vec4 v(1.0f, 2.0f, 3.0f, 4.0f);
317
+ EXPECT_FLOAT_EQ(v.distanceTo(v), 0.0f);
318
+ }
319
+
320
+ TEST(Vec4, DistanceBetweenPoints) {
321
+ Vec4 a(0.0f, 0.0f, 0.0f, 0.0f);
322
+ Vec4 b(3.0f, 4.0f, 0.0f, 0.0f);
323
+ EXPECT_FLOAT_EQ(a.distanceTo(b), 5.0f);
324
+ }
325
+
326
+ TEST(Vec4, DistanceSymmetric) {
327
+ Vec4 a(1.0f, 2.0f, 3.0f, 4.0f);
328
+ Vec4 b(5.0f, 6.0f, 7.0f, 8.0f);
329
+ EXPECT_FLOAT_EQ(a.distanceTo(b), b.distanceTo(a));
330
+ }
331
+
332
+ TEST(Vec4, DistanceFreeFunction) {
333
+ Vec4 a(0.0f, 0.0f, 0.0f, 0.0f);
334
+ Vec4 b(1.0f, 0.0f, 0.0f, 0.0f);
335
+ EXPECT_FLOAT_EQ(distance(a, b), 1.0f);
336
+ }
337
+
338
+ // ============================================================================
339
+ // Interpolation
340
+ // ============================================================================
341
+
342
+ TEST(Vec4, LerpEndpoints) {
343
+ Vec4 a(0.0f, 0.0f, 0.0f, 0.0f);
344
+ Vec4 b(10.0f, 20.0f, 30.0f, 40.0f);
345
+
346
+ Vec4 start = a.lerp(b, 0.0f);
347
+ EXPECT_FLOAT_EQ(start.x, 0.0f);
348
+ EXPECT_FLOAT_EQ(start.y, 0.0f);
349
+
350
+ Vec4 end = a.lerp(b, 1.0f);
351
+ EXPECT_FLOAT_EQ(end.x, 10.0f);
352
+ EXPECT_FLOAT_EQ(end.y, 20.0f);
353
+ }
354
+
355
+ TEST(Vec4, LerpMidpoint) {
356
+ Vec4 a(0.0f, 0.0f, 0.0f, 0.0f);
357
+ Vec4 b(10.0f, 20.0f, 30.0f, 40.0f);
358
+ Vec4 mid = a.lerp(b, 0.5f);
359
+ EXPECT_FLOAT_EQ(mid.x, 5.0f);
360
+ EXPECT_FLOAT_EQ(mid.y, 10.0f);
361
+ EXPECT_FLOAT_EQ(mid.z, 15.0f);
362
+ EXPECT_FLOAT_EQ(mid.w, 20.0f);
363
+ }
364
+
365
+ // ============================================================================
366
+ // Component-wise Operations
367
+ // ============================================================================
368
+
369
+ TEST(Vec4, ComponentMin) {
370
+ Vec4 a(1.0f, 5.0f, 3.0f, 8.0f);
371
+ Vec4 b(4.0f, 2.0f, 6.0f, 1.0f);
372
+ Vec4 m = a.min(b);
373
+ EXPECT_FLOAT_EQ(m.x, 1.0f);
374
+ EXPECT_FLOAT_EQ(m.y, 2.0f);
375
+ EXPECT_FLOAT_EQ(m.z, 3.0f);
376
+ EXPECT_FLOAT_EQ(m.w, 1.0f);
377
+ }
378
+
379
+ TEST(Vec4, ComponentMax) {
380
+ Vec4 a(1.0f, 5.0f, 3.0f, 8.0f);
381
+ Vec4 b(4.0f, 2.0f, 6.0f, 1.0f);
382
+ Vec4 m = a.max(b);
383
+ EXPECT_FLOAT_EQ(m.x, 4.0f);
384
+ EXPECT_FLOAT_EQ(m.y, 5.0f);
385
+ EXPECT_FLOAT_EQ(m.z, 6.0f);
386
+ EXPECT_FLOAT_EQ(m.w, 8.0f);
387
+ }
388
+
389
+ TEST(Vec4, Abs) {
390
+ Vec4 v(-1.0f, 2.0f, -3.0f, 4.0f);
391
+ Vec4 a = v.abs();
392
+ EXPECT_FLOAT_EQ(a.x, 1.0f);
393
+ EXPECT_FLOAT_EQ(a.y, 2.0f);
394
+ EXPECT_FLOAT_EQ(a.z, 3.0f);
395
+ EXPECT_FLOAT_EQ(a.w, 4.0f);
396
+ }
397
+
398
+ TEST(Vec4, Clamp) {
399
+ Vec4 v(-1.0f, 0.5f, 2.0f, 0.0f);
400
+ Vec4 lo(0.0f, 0.0f, 0.0f, 0.0f);
401
+ Vec4 hi(1.0f, 1.0f, 1.0f, 1.0f);
402
+ Vec4 c = v.clamp(lo, hi);
403
+ EXPECT_FLOAT_EQ(c.x, 0.0f);
404
+ EXPECT_FLOAT_EQ(c.y, 0.5f);
405
+ EXPECT_FLOAT_EQ(c.z, 1.0f);
406
+ EXPECT_FLOAT_EQ(c.w, 0.0f);
407
+ }
408
+
409
+ // ============================================================================
410
+ // Projection and Reflection
411
+ // ============================================================================
412
+
413
+ TEST(Vec4, ProjectOnto) {
414
+ Vec4 v(3.0f, 4.0f, 0.0f, 0.0f);
415
+ Vec4 onto(1.0f, 0.0f, 0.0f, 0.0f);
416
+ Vec4 proj = v.projectOnto(onto);
417
+ EXPECT_NEAR(proj.x, 3.0f, kEpsilon);
418
+ EXPECT_NEAR(proj.y, 0.0f, kEpsilon);
419
+ EXPECT_NEAR(proj.z, 0.0f, kEpsilon);
420
+ EXPECT_NEAR(proj.w, 0.0f, kEpsilon);
421
+ }
422
+
423
+ TEST(Vec4, ReflectAcrossNormal) {
424
+ // Reflect (1, -1, 0, 0) across the Y-axis normal (0, 1, 0, 0)
425
+ Vec4 v(1.0f, -1.0f, 0.0f, 0.0f);
426
+ Vec4 normal(0.0f, 1.0f, 0.0f, 0.0f);
427
+ Vec4 r = v.reflect(normal);
428
+ EXPECT_NEAR(r.x, 1.0f, kEpsilon);
429
+ EXPECT_NEAR(r.y, 1.0f, kEpsilon);
430
+ }
431
+
432
+ // ============================================================================
433
+ // Comparison
434
+ // ============================================================================
435
+
436
+ TEST(Vec4, Equality) {
437
+ Vec4 a(1.0f, 2.0f, 3.0f, 4.0f);
438
+ Vec4 b(1.0f, 2.0f, 3.0f, 4.0f);
439
+ EXPECT_TRUE(a == b);
440
+ EXPECT_FALSE(a != b);
441
+ }
442
+
443
+ TEST(Vec4, Inequality) {
444
+ Vec4 a(1.0f, 2.0f, 3.0f, 4.0f);
445
+ Vec4 b(1.0f, 2.0f, 3.0f, 5.0f);
446
+ EXPECT_FALSE(a == b);
447
+ EXPECT_TRUE(a != b);
448
+ }
449
+
450
+ // ============================================================================
451
+ // Data Pointer
452
+ // ============================================================================
453
+
454
+ TEST(Vec4, DataPointerAccess) {
455
+ Vec4 v(1.0f, 2.0f, 3.0f, 4.0f);
456
+ const float* p = v.ptr();
457
+ EXPECT_FLOAT_EQ(p[0], 1.0f);
458
+ EXPECT_FLOAT_EQ(p[1], 2.0f);
459
+ EXPECT_FLOAT_EQ(p[2], 3.0f);
460
+ EXPECT_FLOAT_EQ(p[3], 4.0f);
461
+ }
462
+
463
+ // ============================================================================
464
+ // 4D -> 3D Projections (member functions)
465
+ // ============================================================================
466
+
467
+ TEST(Vec4, PerspectiveProjectionAtOrigin) {
468
+ Vec4 v(0.0f, 0.0f, 0.0f, 0.0f);
469
+ auto proj = v.projectPerspective(2.0f);
470
+ EXPECT_NEAR(proj[0], 0.0f, kEpsilon);
471
+ EXPECT_NEAR(proj[1], 0.0f, kEpsilon);
472
+ EXPECT_NEAR(proj[2], 0.0f, kEpsilon);
473
+ }
474
+
475
+ TEST(Vec4, StereographicProjectionAtOrigin) {
476
+ Vec4 v(0.0f, 0.0f, 0.0f, 0.0f);
477
+ auto proj = v.projectStereographic();
478
+ EXPECT_NEAR(proj[0], 0.0f, kEpsilon);
479
+ EXPECT_NEAR(proj[1], 0.0f, kEpsilon);
480
+ EXPECT_NEAR(proj[2], 0.0f, kEpsilon);
481
+ }
482
+
483
+ TEST(Vec4, OrthographicProjectionDropsW) {
484
+ Vec4 v(1.0f, 2.0f, 3.0f, 99.0f);
485
+ auto proj = v.projectOrthographic();
486
+ EXPECT_FLOAT_EQ(proj[0], 1.0f);
487
+ EXPECT_FLOAT_EQ(proj[1], 2.0f);
488
+ EXPECT_FLOAT_EQ(proj[2], 3.0f);
489
+ }
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@vib3code/sdk",
3
- "version": "2.0.1",
3
+ "version": "2.0.3-canary.75a3290",
4
4
  "description": "VIB3+ 4D Visualization SDK - Unified engine with 6D rotation, MCP agentic integration, and cross-platform support",
5
5
  "type": "module",
6
6
  "main": "src/core/VIB3Engine.js",
7
7
  "types": "./types/adaptive-sdk.d.ts",
8
8
  "bin": {
9
- "vib3": "./src/cli/index.js"
9
+ "vib3": "./src/cli/index.js",
10
+ "vib3-mcp": "./src/agent/mcp/stdio-server.js"
10
11
  },
11
12
  "sideEffects": [
12
13
  "./src/geometry/builders/*.js"
@@ -176,7 +177,7 @@
176
177
  "import": "./src/viewer/ViewerPortal.js"
177
178
  },
178
179
  "./viewer/reactivity": {
179
- "import": "./src/viewer/ReactivityManager.js"
180
+ "import": "./src/viewer/ViewerInputHandler.js"
180
181
  },
181
182
  "./viewer/card-bending": {
182
183
  "import": "./src/viewer/CardBending.js"
@@ -199,6 +200,9 @@
199
200
  "./reactivity/config": {
200
201
  "import": "./src/reactivity/ReactivityConfig.js"
201
202
  },
203
+ "./creative": {
204
+ "import": "./src/creative/index.js"
205
+ },
202
206
  "./creative/color-presets": {
203
207
  "import": "./src/creative/ColorPresetsSystem.js"
204
208
  },
@@ -211,6 +215,9 @@
211
215
  "./creative/timeline": {
212
216
  "import": "./src/creative/ParameterTimeline.js"
213
217
  },
218
+ "./export": {
219
+ "import": "./src/export/index.js"
220
+ },
214
221
  "./integrations/react": {
215
222
  "import": "./src/integrations/frameworks/Vib3React.js"
216
223
  },
@@ -247,6 +254,9 @@
247
254
  "./advanced/offscreen": {
248
255
  "import": "./src/advanced/OffscreenWorker.js"
249
256
  },
257
+ "./variations": {
258
+ "import": "./src/variations/VariationManager.js"
259
+ },
250
260
  "./tools/shader-sync": {
251
261
  "import": "./tools/shader-sync-verify.js"
252
262
  },
@@ -312,6 +322,30 @@
312
322
  "engines": {
313
323
  "node": ">=18.19.0"
314
324
  },
325
+ "scripts": {
326
+ "dev": "vite --open",
327
+ "dev:web": "vite --open",
328
+ "prepublishOnly": "npm test && npm run build:web",
329
+ "build:web": "vite build",
330
+ "build:lib": "vite build --mode lib",
331
+ "lint": "eslint \"src/**/*.{js,ts}\"",
332
+ "test": "vitest run",
333
+ "test:e2e": "playwright test",
334
+ "test:e2e:ui": "playwright test --ui",
335
+ "test:e2e:headed": "playwright test --headed",
336
+ "test:e2e:debug": "playwright test --debug",
337
+ "test:all": "vitest run && playwright test",
338
+ "bench": "vitest bench",
339
+ "analyze:bundle": "vite build --mode analyze",
340
+ "check:bundle": "pnpm exec vite build --outDir dist-ci --emptyOutDir && node tools/ci/bundleSizeCheck.mjs dist-ci --cleanup",
341
+ "codegen:localization": "tsx tools/codegen/localization-quaternions.ts",
342
+ "cli:telemetry": "node tools/cli/agent-cli.js telemetry:export",
343
+ "storybook": "storybook dev -p 6006",
344
+ "build:storybook": "storybook build",
345
+ "demo:generate": "node scripts/generate-demo-assets.js",
346
+ "verify:shaders": "node tools/shader-sync-verify.js"
347
+ },
348
+ "packageManager": "pnpm@9.4.0",
315
349
  "files": [
316
350
  "src/",
317
351
  "tools/",
@@ -319,7 +353,8 @@
319
353
  "DOCS/",
320
354
  "README.md",
321
355
  "LICENSE",
322
- "CHANGELOG.md"
356
+ "CHANGELOG.md",
357
+ "cpp/"
323
358
  ],
324
359
  "dependencies": {
325
360
  "ajv": "^8.17.1",
@@ -341,27 +376,5 @@
341
376
  "typescript": "^5.5.3",
342
377
  "vite": "^5.3.3",
343
378
  "vitest": "^1.6.0"
344
- },
345
- "scripts": {
346
- "dev": "vite --open",
347
- "dev:web": "vite --open",
348
- "build:web": "vite build",
349
- "build:lib": "vite build --mode lib",
350
- "lint": "eslint \"src/**/*.{js,ts}\"",
351
- "test": "vitest run",
352
- "test:e2e": "playwright test",
353
- "test:e2e:ui": "playwright test --ui",
354
- "test:e2e:headed": "playwright test --headed",
355
- "test:e2e:debug": "playwright test --debug",
356
- "test:all": "vitest run && playwright test",
357
- "bench": "vitest bench",
358
- "analyze:bundle": "vite build --mode analyze",
359
- "check:bundle": "pnpm exec vite build --outDir dist-ci --emptyOutDir && node tools/ci/bundleSizeCheck.mjs dist-ci --cleanup",
360
- "codegen:localization": "tsx tools/codegen/localization-quaternions.ts",
361
- "cli:telemetry": "node tools/cli/agent-cli.js telemetry:export",
362
- "storybook": "storybook dev -p 6006",
363
- "build:storybook": "storybook build",
364
- "demo:generate": "node scripts/generate-demo-assets.js",
365
- "verify:shaders": "node tools/shader-sync-verify.js"
366
379
  }
367
- }
380
+ }
@@ -68,6 +68,4 @@ export {
68
68
  createStreamingCLI
69
69
  } from './cli/index.js';
70
70
 
71
- // Default exports
72
- export { telemetry } from './telemetry/index.js';
73
- export { mcpServer } from './mcp/index.js';
71
+ // telemetry and mcpServer already exported above