@holoscript/core 8.0.0 → 8.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 (126) hide show
  1. package/README.md +2 -2
  2. package/dist/{GLTFPipeline-M7WSSJED.cjs → GLTFPipeline-N6B6PJ6G.cjs} +10 -9
  3. package/dist/{GLTFPipeline-276GE64O.js → GLTFPipeline-P3WMNYCN.js} +6 -5
  4. package/dist/{HoloScriptRuntime-3URVTKPJ.js → HoloScriptRuntime-CBYJX3LZ.js} +3 -3
  5. package/dist/{HoloScriptRuntime-SXEAEU2N.cjs → HoloScriptRuntime-VJ374RER.cjs} +4 -4
  6. package/dist/{chunk-JJBE3TIH.cjs → chunk-2IWC4FP7.cjs} +6 -6
  7. package/dist/{chunk-S4W6Z2MN.js → chunk-2X7NGX3M.js} +3 -3
  8. package/dist/chunk-4GU5GCIY.js +1384 -0
  9. package/dist/{chunk-T2QCTZMO.js → chunk-4SDKXQ4C.js} +3 -3
  10. package/dist/{chunk-253GBQZY.cjs → chunk-5H2G27PK.cjs} +35 -35
  11. package/dist/{chunk-C2A5DUMF.cjs → chunk-5NWINHR5.cjs} +35 -35
  12. package/dist/chunk-6Q7RC2MK.cjs +1418 -0
  13. package/dist/{chunk-D54CNIAJ.cjs → chunk-7H33U5SM.cjs} +2 -2
  14. package/dist/{chunk-CXFDRBQU.cjs → chunk-7M3PNU2M.cjs} +7 -7
  15. package/dist/{chunk-B4TFTDG4.js → chunk-7T25IEZ2.js} +3 -3
  16. package/dist/{chunk-7CUEMLDZ.cjs → chunk-7V4JI5TB.cjs} +540 -38
  17. package/dist/{chunk-WJIHFLMJ.js → chunk-ADADVMXY.js} +2 -2
  18. package/dist/{chunk-GQT4TYKY.cjs → chunk-ALC6K7GL.cjs} +40 -19
  19. package/dist/{chunk-3HYYMEXI.cjs → chunk-AOVGZ25K.cjs} +17 -12
  20. package/dist/{chunk-NHWSN2SD.cjs → chunk-AVJHHUC5.cjs} +17 -17
  21. package/dist/{chunk-UM6C3CGK.js → chunk-BGY3SDG3.js} +24 -3
  22. package/dist/{chunk-JCLBKPMX.js → chunk-BOVPWH4H.js} +48 -4
  23. package/dist/{chunk-ZZEI7MV4.js → chunk-CCATWPXM.js} +3 -3
  24. package/dist/{chunk-NBMHU6SW.js → chunk-CMT5NMMS.js} +3 -3
  25. package/dist/{chunk-HINXWAOD.cjs → chunk-CR4FMIWL.cjs} +11 -11
  26. package/dist/{chunk-W7VDOASB.cjs → chunk-CR7XRXRN.cjs} +5 -5
  27. package/dist/{chunk-AYBXB26F.js → chunk-CSD27UNQ.js} +5 -5
  28. package/dist/{chunk-IZM5VQZD.js → chunk-D3STJ56J.js} +3 -3
  29. package/dist/{chunk-ZBQXLH2L.js → chunk-DHO2YRIM.js} +3 -3
  30. package/dist/{chunk-JX7YL6ZE.js → chunk-E6XXE66V.js} +4 -4
  31. package/dist/{chunk-62FBK3B7.js → chunk-FFAOS5HQ.js} +4 -4
  32. package/dist/{chunk-NV4VMVXU.js → chunk-FL33V6U7.js} +3 -3
  33. package/dist/{chunk-XUUVDHIF.cjs → chunk-HKEXJUWS.cjs} +48 -3
  34. package/dist/{chunk-NXZFOPVD.cjs → chunk-HNDK4IQU.cjs} +16 -16
  35. package/dist/{chunk-RVBHAXFG.js → chunk-HR2OSYVQ.js} +16 -11
  36. package/dist/{chunk-LICPB5HZ.cjs → chunk-IUDGEUDO.cjs} +10 -10
  37. package/dist/{chunk-73FELZVJ.cjs → chunk-IWC5DM2M.cjs} +11 -11
  38. package/dist/{chunk-NGKREZ36.js → chunk-J52VSAQ7.js} +505 -5
  39. package/dist/{chunk-PHVRG4I2.js → chunk-J7XZV333.js} +3 -3
  40. package/dist/{chunk-K4VVR7CN.cjs → chunk-JBNDTXXV.cjs} +15 -15
  41. package/dist/{chunk-3NFFOWGG.js → chunk-JIBL5LRK.js} +2 -2
  42. package/dist/{chunk-HZSPDCXV.cjs → chunk-K574J76X.cjs} +3 -3
  43. package/dist/{chunk-SJBGLS25.cjs → chunk-KHDZJE5D.cjs} +5 -5
  44. package/dist/{chunk-KH4CNH66.cjs → chunk-L5LKKENW.cjs} +4 -4
  45. package/dist/{chunk-IVSZDECV.js → chunk-LHAXPADA.js} +3 -3
  46. package/dist/{chunk-EUDQTK7N.cjs → chunk-MQWAT42R.cjs} +2 -2
  47. package/dist/{chunk-KVRSTFNH.cjs → chunk-NCWCUZNS.cjs} +8 -8
  48. package/dist/{chunk-MGE5Z4GS.js → chunk-OH2FAIVU.js} +3 -3
  49. package/dist/{chunk-UMABK6SI.js → chunk-PY37LNDP.js} +3 -3
  50. package/dist/{chunk-23J755AR.js → chunk-QD32ADK6.js} +3 -3
  51. package/dist/{chunk-HZTDET3N.js → chunk-R24NNAEG.js} +3 -3
  52. package/dist/{chunk-6DPSFNJB.cjs → chunk-ROHLEP2W.cjs} +16 -16
  53. package/dist/{chunk-25IQCHTO.cjs → chunk-TWUXUCEW.cjs} +35 -35
  54. package/dist/{chunk-3AO425MZ.cjs → chunk-UFZZ7TSN.cjs} +17 -17
  55. package/dist/{chunk-BE4UJCQT.js → chunk-UWJHCOH2.js} +3 -3
  56. package/dist/{chunk-KEFNV2WM.cjs → chunk-X3UVCWNL.cjs} +13 -13
  57. package/dist/{chunk-7HIASF7S.cjs → chunk-XB274MW5.cjs} +10 -10
  58. package/dist/{chunk-KJLB4OPV.js → chunk-YN2YWTXW.js} +3 -3
  59. package/dist/{chunk-IPWSXCCN.js → chunk-YVD3CSO3.js} +3 -3
  60. package/dist/{chunk-F43YAA34.js → chunk-YVOAF4ML.js} +3 -3
  61. package/dist/{chunk-OR4Q2BGL.cjs → chunk-YWOBW2PV.cjs} +15 -15
  62. package/dist/compiler/android-xr.cjs +5 -5
  63. package/dist/compiler/android-xr.js +3 -3
  64. package/dist/compiler/babylon.cjs +4 -4
  65. package/dist/compiler/babylon.js +3 -3
  66. package/dist/compiler/business-quest.cjs +9 -9
  67. package/dist/compiler/business-quest.js +1 -1
  68. package/dist/compiler/domain-block-utils.cjs +154 -150
  69. package/dist/compiler/domain-block-utils.js +2 -2
  70. package/dist/compiler/gltf-pipeline.cjs +8 -8
  71. package/dist/compiler/gltf-pipeline.js +1 -1
  72. package/dist/compiler/godot.cjs +4 -4
  73. package/dist/compiler/godot.js +3 -3
  74. package/dist/compiler/index.cjs +129 -581
  75. package/dist/compiler/index.d.ts +12 -0
  76. package/dist/compiler/index.js +42 -498
  77. package/dist/compiler/multi-layer.cjs +5 -5
  78. package/dist/compiler/multi-layer.js +4 -4
  79. package/dist/compiler/nodetoy.d.ts +69 -0
  80. package/dist/compiler/openxr.cjs +4 -4
  81. package/dist/compiler/openxr.js +3 -3
  82. package/dist/compiler/playcanvas.cjs +4 -4
  83. package/dist/compiler/playcanvas.js +3 -3
  84. package/dist/compiler/r3f.cjs +9 -8
  85. package/dist/compiler/r3f.js +4 -3
  86. package/dist/compiler/sdf.cjs +5 -5
  87. package/dist/compiler/sdf.js +3 -3
  88. package/dist/compiler/unity.cjs +4 -4
  89. package/dist/compiler/unity.js +3 -3
  90. package/dist/compiler/unreal.cjs +5 -5
  91. package/dist/compiler/unreal.js +3 -3
  92. package/dist/compiler/urdf.cjs +12 -12
  93. package/dist/compiler/urdf.js +3 -3
  94. package/dist/compiler/usd-physics.cjs +5 -5
  95. package/dist/compiler/usd-physics.js +2 -2
  96. package/dist/compiler/visionos.cjs +4 -4
  97. package/dist/compiler/visionos.js +3 -3
  98. package/dist/compiler/vrchat.cjs +5 -5
  99. package/dist/compiler/vrchat.js +3 -3
  100. package/dist/compiler/vrr.cjs +5 -5
  101. package/dist/compiler/vrr.js +3 -3
  102. package/dist/compiler/wasm.cjs +8 -8
  103. package/dist/compiler/wasm.js +3 -3
  104. package/dist/compiler/webgpu.cjs +4 -4
  105. package/dist/compiler/webgpu.js +3 -3
  106. package/dist/debugger.cjs +4 -4
  107. package/dist/debugger.js +2 -2
  108. package/dist/dist-ACXG6IH5.cjs +3113 -0
  109. package/dist/dist-VD4L6V7Q.js +3076 -0
  110. package/dist/index.cjs +1915 -488
  111. package/dist/index.d.ts +2 -0
  112. package/dist/index.js +1480 -53
  113. package/dist/reconstruction/index.cjs +31 -31
  114. package/dist/reconstruction/index.js +2 -2
  115. package/dist/runtime.cjs +6 -6
  116. package/dist/runtime.js +2 -2
  117. package/dist/src-4ROC227P.cjs +2094 -0
  118. package/dist/src-HCCCSYP7.js +2073 -0
  119. package/dist/traits/botanical-lotus.cjs +146 -10
  120. package/dist/traits/botanical-lotus.d.ts +330 -0
  121. package/dist/traits/botanical-lotus.js +4 -1
  122. package/dist/traits/index.cjs +594 -455
  123. package/dist/traits/index.js +9 -5
  124. package/package.json +20 -20
  125. package/dist/chunk-VECQYRXL.js +0 -474
  126. package/dist/chunk-WDT3JTGM.cjs +0 -483
@@ -1,483 +0,0 @@
1
- 'use strict';
2
-
3
- // src/traits/BotanicalLotusTrait.ts
4
- var DEFAULT_BOTANICAL_LOTUS_CONFIG = {
5
- schema: "holoscript.trait.botanical_lotus.v0",
6
- status: "visual_seed",
7
- source: {
8
- kind: "conversation_reference_images",
9
- count: 3,
10
- content_hash_status: "pending_media_ingest",
11
- wallet_signature_status: "pending_cael_anchor",
12
- note: "Derived from three pink lotus reference images provided in-thread; raw media ingest is pending."
13
- },
14
- reference_anchors: [
15
- {
16
- id: "lotus-reference-2026-05-06-01",
17
- label: "open pink lotus close-up",
18
- uri: "conversation://2026-05-06/lotus-reference-01",
19
- role: "material",
20
- status: "pending_media_ingest"
21
- },
22
- {
23
- id: "lotus-reference-2026-05-06-02",
24
- label: "upright pink lotus silhouette",
25
- uri: "conversation://2026-05-06/lotus-reference-02",
26
- role: "silhouette",
27
- status: "pending_media_ingest"
28
- },
29
- {
30
- id: "lotus-reference-2026-05-06-03",
31
- label: "pink lotus with leaves and water context",
32
- uri: "conversation://2026-05-06/lotus-reference-03",
33
- role: "leaf_context",
34
- status: "pending_media_ingest"
35
- }
36
- ],
37
- material: {
38
- subsurface_scattering: 0.74,
39
- subsurface_radius_rgb: [0.9, 0.32, 0.72],
40
- petal_translucency_base: 0.68,
41
- petal_translucency_edge: 0.36,
42
- roughness: 0.72,
43
- ior: 1.36,
44
- vein_normal_intensity: 0.045,
45
- edge_curl_intensity: 0.58,
46
- gravity_sag_outer: 0.3
47
- },
48
- colors: {
49
- petal_base: "#fff1f6",
50
- petal_mid: "#f47ab7",
51
- petal_inner: "#ff9ecf",
52
- petal_rim: "#c42a86",
53
- petal_shadow: "#84205f",
54
- seed_pod: "#f4d74a",
55
- seed_pod_rim: "#b7c66b",
56
- stamen: "#f59e0b",
57
- stamen_tip: "#fff4bd",
58
- leaf: "#235f4f",
59
- leaf_dark: "#102f28",
60
- water: "#07140f"
61
- },
62
- geometry: {
63
- petal_rings: [
64
- { name: "inner", count: 8, cup: 0.86, gravity_sag: 0.02 },
65
- { name: "mid", count: 13, cup: 0.5, gravity_sag: 0.12 },
66
- { name: "outer", count: 21, cup: 0.24, gravity_sag: 0.3 }
67
- ],
68
- petal_shape: "broad_elliptic_pointed_tip_with_center_ridge",
69
- stamen_filament_count: 58,
70
- seed_pod_dot_pattern: "1_center_7_12_18_radial"
71
- },
72
- renderer: {
73
- requires: ["sss_render", "instanced_filaments", "water_surface"],
74
- lod: {
75
- close: "full_filaments",
76
- mid: "simplified_filaments",
77
- far: "petal_billboard"
78
- },
79
- material_model: "thin_tissue_mesh_physical_material"
80
- }
81
- };
82
- var SHA256_HASH_PATTERN = /^sha256:[a-f0-9]{64}$/;
83
- var HEX_COLOR_PATTERN = /^#[0-9a-fA-F]{6}$/;
84
- var RING_RENDER_DEFAULTS = {
85
- inner: { radius: 0.32, length: 0.82, width: 0.34, pitch_degrees: 74 },
86
- mid: { radius: 0.58, length: 1.15, width: 0.46, pitch_degrees: 42 },
87
- outer: { radius: 0.92, length: 1.52, width: 0.58, pitch_degrees: 18 }
88
- };
89
- function cloneDefaultConfig() {
90
- const d = DEFAULT_BOTANICAL_LOTUS_CONFIG;
91
- return {
92
- ...d,
93
- source: { ...d.source },
94
- reference_anchors: d.reference_anchors.map((a) => ({ ...a })),
95
- material: {
96
- ...d.material,
97
- subsurface_radius_rgb: [...d.material.subsurface_radius_rgb]
98
- },
99
- colors: { ...d.colors },
100
- geometry: {
101
- ...d.geometry,
102
- petal_rings: d.geometry.petal_rings.map((r) => ({ ...r }))
103
- },
104
- renderer: {
105
- ...d.renderer,
106
- requires: [...d.renderer.requires],
107
- lod: { ...d.renderer.lod }
108
- }
109
- };
110
- }
111
- function isFiniteNumber(value) {
112
- return typeof value === "number" && Number.isFinite(value);
113
- }
114
- function addRangeError(errors, label, value, min, max) {
115
- if (!isFiniteNumber(value) || value < min || value > max) {
116
- errors.push(`${label} must be a finite number in [${min}, ${max}]`);
117
- }
118
- }
119
- function validateHexColors(errors, colors) {
120
- for (const [key, value] of Object.entries(colors)) {
121
- if (!HEX_COLOR_PATTERN.test(value)) {
122
- errors.push(`colors.${key} must be a 6-digit hex color`);
123
- }
124
- }
125
- }
126
- function validateReferenceAnchor(errors, anchor, index) {
127
- const prefix = `reference_anchors[${index}]`;
128
- if (!anchor.id || typeof anchor.id !== "string") {
129
- errors.push(`${prefix}.id is required`);
130
- }
131
- if (!anchor.uri || typeof anchor.uri !== "string") {
132
- errors.push(`${prefix}.uri is required`);
133
- }
134
- if (anchor.status !== "pending_media_ingest" && anchor.status !== "hashed" && anchor.status !== "wallet_signed") {
135
- errors.push(`${prefix}.status must be pending_media_ingest, hashed, or wallet_signed`);
136
- }
137
- if (anchor.status !== "pending_media_ingest") {
138
- if (!anchor.content_hash || !SHA256_HASH_PATTERN.test(anchor.content_hash)) {
139
- errors.push(`${prefix}.content_hash must be sha256:<64 lowercase hex chars>`);
140
- }
141
- }
142
- if (anchor.status === "wallet_signed" && !anchor.wallet_signature) {
143
- errors.push(`${prefix}.wallet_signature is required when status is wallet_signed`);
144
- }
145
- if (anchor.width !== void 0 && (!Number.isInteger(anchor.width) || anchor.width <= 0)) {
146
- errors.push(`${prefix}.width must be a positive integer when present`);
147
- }
148
- if (anchor.height !== void 0 && (!Number.isInteger(anchor.height) || anchor.height <= 0)) {
149
- errors.push(`${prefix}.height must be a positive integer when present`);
150
- }
151
- }
152
- function normalizeBotanicalLotusConfig(input = {}) {
153
- const d = cloneDefaultConfig();
154
- const inputGeometry = input.geometry ?? {};
155
- const inputRenderer = input.renderer ?? {};
156
- const petalRings = Array.isArray(inputGeometry.petal_rings) ? inputGeometry.petal_rings.map((r) => ({ ...r })) : d.geometry.petal_rings.map((r) => ({ ...r }));
157
- return {
158
- schema: input.schema ?? d.schema,
159
- status: input.status ?? d.status,
160
- source: {
161
- ...d.source,
162
- ...input.source ?? {}
163
- },
164
- reference_anchors: Array.isArray(input.reference_anchors) ? input.reference_anchors.map((a) => ({ ...a })) : d.reference_anchors,
165
- material: {
166
- ...d.material,
167
- ...input.material ?? {},
168
- subsurface_radius_rgb: [
169
- ...input.material?.subsurface_radius_rgb ?? d.material.subsurface_radius_rgb
170
- ]
171
- },
172
- colors: {
173
- ...d.colors,
174
- ...input.colors ?? {}
175
- },
176
- geometry: {
177
- ...d.geometry,
178
- ...inputGeometry,
179
- petal_rings: petalRings
180
- },
181
- renderer: {
182
- ...d.renderer,
183
- ...inputRenderer,
184
- requires: [...inputRenderer.requires ?? d.renderer.requires],
185
- lod: {
186
- ...d.renderer.lod,
187
- ...inputRenderer.lod ?? {}
188
- }
189
- }
190
- };
191
- }
192
- function validateBotanicalLotusConfig(input = {}) {
193
- const config = normalizeBotanicalLotusConfig(input);
194
- const errors = [];
195
- const { material, geometry } = config;
196
- if (config.schema !== "holoscript.trait.botanical_lotus.v0") {
197
- errors.push("schema must be holoscript.trait.botanical_lotus.v0");
198
- }
199
- if (config.status !== "visual_seed" && config.status !== "content_hashed" && config.status !== "wallet_signed") {
200
- errors.push("status must be visual_seed, content_hashed, or wallet_signed");
201
- }
202
- if (config.reference_anchors.length === 0) {
203
- errors.push("reference_anchors must include at least one anchor");
204
- }
205
- config.reference_anchors.forEach(
206
- (anchor, index) => validateReferenceAnchor(errors, anchor, index)
207
- );
208
- addRangeError(errors, "material.subsurface_scattering", material.subsurface_scattering, 0, 1);
209
- if (material.subsurface_radius_rgb.length !== 3) {
210
- errors.push("material.subsurface_radius_rgb must contain exactly three values");
211
- }
212
- material.subsurface_radius_rgb.forEach(
213
- (value, index) => addRangeError(errors, `material.subsurface_radius_rgb[${index}]`, value, 0, 2)
214
- );
215
- addRangeError(
216
- errors,
217
- "material.petal_translucency_base",
218
- material.petal_translucency_base,
219
- 0,
220
- 1
221
- );
222
- addRangeError(
223
- errors,
224
- "material.petal_translucency_edge",
225
- material.petal_translucency_edge,
226
- 0,
227
- 1
228
- );
229
- addRangeError(errors, "material.roughness", material.roughness, 0, 1);
230
- addRangeError(errors, "material.ior", material.ior, 1, 2.5);
231
- addRangeError(
232
- errors,
233
- "material.vein_normal_intensity",
234
- material.vein_normal_intensity,
235
- 0,
236
- 0.25
237
- );
238
- addRangeError(errors, "material.edge_curl_intensity", material.edge_curl_intensity, 0, 1);
239
- addRangeError(errors, "material.gravity_sag_outer", material.gravity_sag_outer, 0, 1);
240
- validateHexColors(errors, config.colors);
241
- if (geometry.petal_rings.length === 0) {
242
- errors.push("geometry.petal_rings must include at least one ring");
243
- }
244
- geometry.petal_rings.forEach((ring, index) => {
245
- if (!ring.name) {
246
- errors.push(`geometry.petal_rings[${index}].name is required`);
247
- }
248
- if (!Number.isInteger(ring.count) || ring.count <= 0) {
249
- errors.push(`geometry.petal_rings[${index}].count must be a positive integer`);
250
- }
251
- addRangeError(errors, `geometry.petal_rings[${index}].cup`, ring.cup, 0, 1);
252
- addRangeError(
253
- errors,
254
- `geometry.petal_rings[${index}].gravity_sag`,
255
- ring.gravity_sag,
256
- 0,
257
- 1
258
- );
259
- });
260
- if (!Number.isInteger(geometry.stamen_filament_count) || geometry.stamen_filament_count <= 0) {
261
- errors.push("geometry.stamen_filament_count must be a positive integer");
262
- }
263
- if (config.renderer.requires.length === 0) {
264
- errors.push("renderer.requires must include at least one render capability");
265
- }
266
- return {
267
- ok: errors.length === 0,
268
- errors,
269
- config
270
- };
271
- }
272
- function assertBotanicalLotusConfig(input = {}) {
273
- const result = validateBotanicalLotusConfig(input);
274
- if (!result.ok) {
275
- throw new Error(`Invalid botanical_lotus config: ${result.errors.join("; ")}`);
276
- }
277
- return result.config;
278
- }
279
- function deriveBotanicalLotusAnchorStatus(anchors) {
280
- if (anchors.length > 0 && anchors.every((anchor) => anchor.status === "wallet_signed")) {
281
- return "wallet_signed";
282
- }
283
- if (anchors.length > 0 && anchors.every((anchor) => anchor.status === "hashed" || anchor.status === "wallet_signed")) {
284
- return "hashed";
285
- }
286
- return "pending_media_ingest";
287
- }
288
- function getBotanicalLotusPetalCount(input = {}) {
289
- const config = normalizeBotanicalLotusConfig(input);
290
- return config.geometry.petal_rings.reduce((sum, ring) => sum + ring.count, 0);
291
- }
292
- function createBotanicalLotusRenderProfile(input = {}, placement, lighting) {
293
- const config = assertBotanicalLotusConfig(input);
294
- const anchorStatus = deriveBotanicalLotusAnchorStatus(config.reference_anchors);
295
- const petalRings = config.geometry.petal_rings.map((ring, index) => {
296
- const base = RING_RENDER_DEFAULTS[ring.name] ?? {
297
- radius: 0.42 + index * 0.24,
298
- length: 0.82 + index * 0.2,
299
- width: 0.34 + index * 0.08,
300
- pitch_degrees: Math.max(12, 70 - index * 18)
301
- };
302
- return {
303
- name: ring.name,
304
- count: ring.count,
305
- radius: base.radius,
306
- length: base.length,
307
- width: base.width,
308
- cup: ring.cup,
309
- gravity_sag: ring.gravity_sag,
310
- pitch_degrees: base.pitch_degrees
311
- };
312
- });
313
- return {
314
- trait: "botanical_lotus",
315
- anchor_status: anchorStatus,
316
- wallet_signed: anchorStatus === "wallet_signed",
317
- petal_count: petalRings.reduce((sum, ring) => sum + ring.count, 0),
318
- petal_rings: petalRings,
319
- pbr_uniforms: {
320
- subsurface_scattering: config.material.subsurface_scattering,
321
- subsurface_radius_rgb: config.material.subsurface_radius_rgb,
322
- transmission: config.material.petal_translucency_base,
323
- thickness: config.material.petal_translucency_edge,
324
- roughness: config.material.roughness,
325
- ior: config.material.ior,
326
- vein_normal_intensity: config.material.vein_normal_intensity
327
- },
328
- colors: config.colors,
329
- stamen_filament_count: config.geometry.stamen_filament_count,
330
- seed_pod_dot_pattern: config.geometry.seed_pod_dot_pattern,
331
- reference_anchor_ids: config.reference_anchors.map((anchor) => anchor.id),
332
- renderer_requires: config.renderer.requires,
333
- surface_anchor_id: placement?.surface_anchor_id,
334
- lighting_reference: lighting?.reference_id
335
- };
336
- }
337
- var botanicalLotusHandler = {
338
- name: "botanical_lotus",
339
- defaultConfig: DEFAULT_BOTANICAL_LOTUS_CONFIG,
340
- validate: validateBotanicalLotusConfig,
341
- toRenderProfile: createBotanicalLotusRenderProfile,
342
- onAttach(node, config, context) {
343
- const normalized = assertBotanicalLotusConfig(config);
344
- const profile = createBotanicalLotusRenderProfile(normalized);
345
- const state = { config: normalized, profile };
346
- node.__botanicalLotusState = state;
347
- const nodeId = String(node.id ?? "unknown");
348
- context.setState?.({
349
- [`botanical_lotus.${nodeId}.anchor_status`]: profile.anchor_status,
350
- [`botanical_lotus.${nodeId}.petal_count`]: profile.petal_count
351
- });
352
- context.emit?.("botanical_lotus_attached", {
353
- node,
354
- anchorStatus: profile.anchor_status,
355
- walletSigned: profile.wallet_signed,
356
- petalCount: profile.petal_count,
357
- referenceAnchorIds: profile.reference_anchor_ids,
358
- rendererRequires: profile.renderer_requires
359
- });
360
- },
361
- onDetach(node, _config, context) {
362
- context.emit?.("botanical_lotus_detached", { node });
363
- delete node.__botanicalLotusState;
364
- },
365
- onUpdate(_node, _config, _context, _delta) {
366
- },
367
- onEvent(node, _config, context, event) {
368
- const state = node.__botanicalLotusState;
369
- if (!state) return;
370
- if (event.type === "botanical_lotus_query") {
371
- context.emit?.("botanical_lotus_response", {
372
- queryId: event.queryId,
373
- node,
374
- config: state.config,
375
- profile: state.profile
376
- });
377
- return;
378
- }
379
- if (event.type === "botanical_lotus_reference_anchored") {
380
- const anchorId = String(event.anchorId ?? "");
381
- const contentHash = typeof event.contentHash === "string" ? event.contentHash : void 0;
382
- const walletSignature = typeof event.walletSignature === "string" ? event.walletSignature : void 0;
383
- if (!anchorId || !contentHash) return;
384
- const updatedAnchors = state.config.reference_anchors.map((anchor) => {
385
- if (anchor.id !== anchorId) return anchor;
386
- return {
387
- ...anchor,
388
- content_hash: contentHash,
389
- wallet_signature: walletSignature,
390
- status: walletSignature ? "wallet_signed" : "hashed"
391
- };
392
- });
393
- const updatedConfig = assertBotanicalLotusConfig({
394
- ...state.config,
395
- status: updatedAnchors.every((anchor) => anchor.status === "wallet_signed") ? "wallet_signed" : "content_hashed",
396
- source: {
397
- ...state.config.source,
398
- content_hash_status: deriveBotanicalLotusAnchorStatus(updatedAnchors),
399
- wallet_signature_status: updatedAnchors.every(
400
- (anchor) => anchor.status === "wallet_signed"
401
- ) ? "wallet_signed" : "pending_cael_anchor"
402
- },
403
- reference_anchors: updatedAnchors
404
- });
405
- state.config = updatedConfig;
406
- state.profile = createBotanicalLotusRenderProfile(updatedConfig, state.placement, state.lighting);
407
- context.emit?.("botanical_lotus_reference_updated", {
408
- node,
409
- anchorId,
410
- anchorStatus: state.profile.anchor_status,
411
- walletSigned: state.profile.wallet_signed,
412
- referenceAnchorIds: state.profile.reference_anchor_ids
413
- });
414
- return;
415
- }
416
- if (event.type === "holomap:surface_anchor_placed") {
417
- const payload = event.payload ?? {};
418
- const surfaceAnchorId = typeof payload.surfaceAnchorId === "string" ? payload.surfaceAnchorId : void 0;
419
- const surfaceNormal = Array.isArray(payload.surfaceNormal) ? payload.surfaceNormal : void 0;
420
- const worldPosition = Array.isArray(payload.worldPosition) ? payload.worldPosition : void 0;
421
- if (!surfaceAnchorId) return;
422
- state.placement = {
423
- surface_anchor_id: surfaceAnchorId,
424
- surface_normal: surfaceNormal,
425
- world_position: worldPosition
426
- };
427
- state.profile = createBotanicalLotusRenderProfile(state.config, state.placement, state.lighting);
428
- context.emit?.("botanical_lotus_surface_bound", {
429
- node,
430
- surfaceAnchorId,
431
- surfaceNormal,
432
- worldPosition
433
- });
434
- return;
435
- }
436
- if (event.type === "holomap:lighting_update") {
437
- const payload = event.payload ?? {};
438
- const referenceId = typeof payload.referenceId === "string" ? payload.referenceId : void 0;
439
- const estimatedLux = typeof payload.estimatedLux === "number" && Number.isFinite(payload.estimatedLux) ? payload.estimatedLux : void 0;
440
- const colorTemperatureK = typeof payload.colorTemperatureK === "number" && Number.isFinite(payload.colorTemperatureK) ? payload.colorTemperatureK : void 0;
441
- const dominantDirection = Array.isArray(payload.dominantDirection) ? payload.dominantDirection : void 0;
442
- if (!referenceId) return;
443
- state.lighting = {
444
- reference_id: referenceId,
445
- estimated_lux: estimatedLux,
446
- color_temperature_k: colorTemperatureK,
447
- dominant_direction: dominantDirection
448
- };
449
- state.profile = createBotanicalLotusRenderProfile(state.config, state.placement, state.lighting);
450
- context.emit?.("botanical_lotus_lighting_updated", {
451
- node,
452
- referenceId,
453
- estimatedLux,
454
- colorTemperatureK,
455
- dominantDirection
456
- });
457
- return;
458
- }
459
- if (event.type === "holomap:anchor_state_changed") {
460
- const payload = event.payload ?? {};
461
- const anchorFrameIndex = typeof payload.anchorFrameIndex === "number" ? payload.anchorFrameIndex : void 0;
462
- if (state.placement?.surface_anchor_id && anchorFrameIndex !== void 0) {
463
- context.emit?.("botanical_lotus_anchor_drift", {
464
- node,
465
- surfaceAnchorId: state.placement.surface_anchor_id,
466
- anchorFrameIndex
467
- });
468
- }
469
- return;
470
- }
471
- }
472
- };
473
-
474
- exports.DEFAULT_BOTANICAL_LOTUS_CONFIG = DEFAULT_BOTANICAL_LOTUS_CONFIG;
475
- exports.assertBotanicalLotusConfig = assertBotanicalLotusConfig;
476
- exports.botanicalLotusHandler = botanicalLotusHandler;
477
- exports.createBotanicalLotusRenderProfile = createBotanicalLotusRenderProfile;
478
- exports.deriveBotanicalLotusAnchorStatus = deriveBotanicalLotusAnchorStatus;
479
- exports.getBotanicalLotusPetalCount = getBotanicalLotusPetalCount;
480
- exports.normalizeBotanicalLotusConfig = normalizeBotanicalLotusConfig;
481
- exports.validateBotanicalLotusConfig = validateBotanicalLotusConfig;
482
- //# sourceMappingURL=chunk-WDT3JTGM.cjs.map
483
- //# sourceMappingURL=chunk-WDT3JTGM.cjs.map