@dreamerbird/camera-studio 0.0.0-stage → 0.1.0

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 (830) hide show
  1. package/assets/models/Y Bot.glb +0 -0
  2. package/assets/poseThumbs/qbx-hands-01-base-base-l.png +0 -0
  3. package/assets/poseThumbs/qbx-hands-01-base-base-r.png +0 -0
  4. package/assets/poseThumbs/qbx-hands-01-base-point-relaxed-l.png +0 -0
  5. package/assets/poseThumbs/qbx-hands-01-base-point-relaxed-r.png +0 -0
  6. package/assets/poseThumbs/qbx-hands-01-base-point-straight-l.png +0 -0
  7. package/assets/poseThumbs/qbx-hands-01-base-point-straight-r.png +0 -0
  8. package/assets/poseThumbs/qbx-hands-01-base-relaxed-01-l.png +0 -0
  9. package/assets/poseThumbs/qbx-hands-01-base-relaxed-01-r.png +0 -0
  10. package/assets/poseThumbs/qbx-hands-01-base-relaxed-02-l.png +0 -0
  11. package/assets/poseThumbs/qbx-hands-01-base-relaxed-02-r.png +0 -0
  12. package/assets/poseThumbs/qbx-hands-01-base-relaxed-03-l.png +0 -0
  13. package/assets/poseThumbs/qbx-hands-01-base-relaxed-03-r.png +0 -0
  14. package/assets/poseThumbs/qbx-hands-01-base-relaxed-04-l.png +0 -0
  15. package/assets/poseThumbs/qbx-hands-01-base-relaxed-04-r.png +0 -0
  16. package/assets/poseThumbs/qbx-hands-01-base-relaxed-05-l.png +0 -0
  17. package/assets/poseThumbs/qbx-hands-01-base-relaxed-05-r.png +0 -0
  18. package/assets/poseThumbs/qbx-hands-01-base-relaxed-06-l.png +0 -0
  19. package/assets/poseThumbs/qbx-hands-01-base-relaxed-06-r.png +0 -0
  20. package/assets/poseThumbs/qbx-hands-02-other-bowl-l.png +0 -0
  21. package/assets/poseThumbs/qbx-hands-02-other-bowl-r.png +0 -0
  22. package/assets/poseThumbs/qbx-hands-02-other-card-l.png +0 -0
  23. package/assets/poseThumbs/qbx-hands-02-other-card-r.png +0 -0
  24. package/assets/poseThumbs/qbx-hands-02-other-claw-l.png +0 -0
  25. package/assets/poseThumbs/qbx-hands-02-other-claw-r.png +0 -0
  26. package/assets/poseThumbs/qbx-hands-02-other-fist-l.png +0 -0
  27. package/assets/poseThumbs/qbx-hands-02-other-fist-r.png +0 -0
  28. package/assets/poseThumbs/qbx-hands-02-other-grip-l.png +0 -0
  29. package/assets/poseThumbs/qbx-hands-02-other-grip-r.png +0 -0
  30. package/assets/poseThumbs/qbx-hands-02-other-ko-l.png +0 -0
  31. package/assets/poseThumbs/qbx-hands-02-other-ko-r.png +0 -0
  32. package/assets/poseThumbs/qbx-hands-02-other-nail-check-01-l.png +0 -0
  33. package/assets/poseThumbs/qbx-hands-02-other-nail-check-01-r.png +0 -0
  34. package/assets/poseThumbs/qbx-hands-02-other-nail-check-02-l.png +0 -0
  35. package/assets/poseThumbs/qbx-hands-02-other-nail-check-02-r.png +0 -0
  36. package/assets/poseThumbs/qbx-hands-02-other-offer-l.png +0 -0
  37. package/assets/poseThumbs/qbx-hands-02-other-offer-r.png +0 -0
  38. package/assets/poseThumbs/qbx-hands-02-other-push-l.png +0 -0
  39. package/assets/poseThumbs/qbx-hands-02-other-push-r.png +0 -0
  40. package/assets/poseThumbs/qbx-hands-02-other-push-the-button-l.png +0 -0
  41. package/assets/poseThumbs/qbx-hands-02-other-push-the-button-r.png +0 -0
  42. package/assets/poseThumbs/qbx-hands-02-other-scratch-l.png +0 -0
  43. package/assets/poseThumbs/qbx-hands-02-other-scratch-r.png +0 -0
  44. package/assets/poseThumbs/qbx-hands-02-other-spread-l.png +0 -0
  45. package/assets/poseThumbs/qbx-hands-02-other-spread-r.png +0 -0
  46. package/assets/poseThumbs/qbx-hands-02-other-write-l.png +0 -0
  47. package/assets/poseThumbs/qbx-hands-02-other-write-r.png +0 -0
  48. package/assets/poseThumbs/qbx-hands-03-signs-cobblepot-l.png +0 -0
  49. package/assets/poseThumbs/qbx-hands-03-signs-cobblepot-r.png +0 -0
  50. package/assets/poseThumbs/qbx-hands-03-signs-fingers-crossed-l.png +0 -0
  51. package/assets/poseThumbs/qbx-hands-03-signs-fingers-crossed-r.png +0 -0
  52. package/assets/poseThumbs/qbx-hands-03-signs-five-l.png +0 -0
  53. package/assets/poseThumbs/qbx-hands-03-signs-five-r.png +0 -0
  54. package/assets/poseThumbs/qbx-hands-03-signs-four-l.png +0 -0
  55. package/assets/poseThumbs/qbx-hands-03-signs-four-r.png +0 -0
  56. package/assets/poseThumbs/qbx-hands-03-signs-four-ring-l.png +0 -0
  57. package/assets/poseThumbs/qbx-hands-03-signs-four-ring-r.png +0 -0
  58. package/assets/poseThumbs/qbx-hands-03-signs-fu-l.png +0 -0
  59. package/assets/poseThumbs/qbx-hands-03-signs-fu-r.png +0 -0
  60. package/assets/poseThumbs/qbx-hands-03-signs-index-l.png +0 -0
  61. package/assets/poseThumbs/qbx-hands-03-signs-index-r.png +0 -0
  62. package/assets/poseThumbs/qbx-hands-03-signs-martian-reactor-switch-l.png +0 -0
  63. package/assets/poseThumbs/qbx-hands-03-signs-martian-reactor-switch-r.png +0 -0
  64. package/assets/poseThumbs/qbx-hands-03-signs-one-does-not-simply-l.png +0 -0
  65. package/assets/poseThumbs/qbx-hands-03-signs-one-does-not-simply-r.png +0 -0
  66. package/assets/poseThumbs/qbx-hands-03-signs-peace-flipped-r.png +0 -0
  67. package/assets/poseThumbs/qbx-hands-03-signs-peace-flipped.png +0 -0
  68. package/assets/poseThumbs/qbx-hands-03-signs-peace-l.png +0 -0
  69. package/assets/poseThumbs/qbx-hands-03-signs-peace-r.png +0 -0
  70. package/assets/poseThumbs/qbx-hands-03-signs-perfect-l.png +0 -0
  71. package/assets/poseThumbs/qbx-hands-03-signs-perfect-r.png +0 -0
  72. package/assets/poseThumbs/qbx-hands-03-signs-pinky-swear-l.png +0 -0
  73. package/assets/poseThumbs/qbx-hands-03-signs-pinky-swear-r.png +0 -0
  74. package/assets/poseThumbs/qbx-hands-03-signs-rock-out-l.png +0 -0
  75. package/assets/poseThumbs/qbx-hands-03-signs-rock-out-r.png +0 -0
  76. package/assets/poseThumbs/qbx-hands-03-signs-scout-salute-l.png +0 -0
  77. package/assets/poseThumbs/qbx-hands-03-signs-scout-salute-r.png +0 -0
  78. package/assets/poseThumbs/qbx-hands-03-signs-spock-l.png +0 -0
  79. package/assets/poseThumbs/qbx-hands-03-signs-spock-r.png +0 -0
  80. package/assets/poseThumbs/qbx-hands-03-signs-stop-l.png +0 -0
  81. package/assets/poseThumbs/qbx-hands-03-signs-stop-r.png +0 -0
  82. package/assets/poseThumbs/qbx-hands-03-signs-surf-s-up-flipped-l.png +0 -0
  83. package/assets/poseThumbs/qbx-hands-03-signs-surf-s-up-flipped-r.png +0 -0
  84. package/assets/poseThumbs/qbx-hands-03-signs-surf-s-up-l.png +0 -0
  85. package/assets/poseThumbs/qbx-hands-03-signs-surf-s-up-r.png +0 -0
  86. package/assets/poseThumbs/qbx-hands-03-signs-three-hicox-l.png +0 -0
  87. package/assets/poseThumbs/qbx-hands-03-signs-three-hicox-r.png +0 -0
  88. package/assets/poseThumbs/qbx-hands-03-signs-three-l.png +0 -0
  89. package/assets/poseThumbs/qbx-hands-03-signs-three-r.png +0 -0
  90. package/assets/poseThumbs/qbx-hands-03-signs-three-ring-l.png +0 -0
  91. package/assets/poseThumbs/qbx-hands-03-signs-three-ring-r.png +0 -0
  92. package/assets/poseThumbs/qbx-hands-03-signs-thumbs-up-l.png +0 -0
  93. package/assets/poseThumbs/qbx-hands-03-signs-thumbs-up-r.png +0 -0
  94. package/assets/poseThumbs/qbx-hands-04-weapons-detonator-l.png +0 -0
  95. package/assets/poseThumbs/qbx-hands-04-weapons-detonator-r.png +0 -0
  96. package/assets/poseThumbs/qbx-hands-04-weapons-grip-sword-l.png +0 -0
  97. package/assets/poseThumbs/qbx-hands-04-weapons-grip-sword-r.png +0 -0
  98. package/assets/poseThumbs/qbx-hands-04-weapons-gun-01-l.png +0 -0
  99. package/assets/poseThumbs/qbx-hands-04-weapons-gun-01-r.png +0 -0
  100. package/assets/poseThumbs/qbx-hands-04-weapons-gun-02-l.png +0 -0
  101. package/assets/poseThumbs/qbx-hands-04-weapons-gun-02-r.png +0 -0
  102. package/assets/poseThumbs/qbx-hands-04-weapons-gun-03-l-cock-the-hammer.png +0 -0
  103. package/assets/poseThumbs/qbx-hands-04-weapons-gun-03-r-cock-the-hammer.png +0 -0
  104. package/assets/poseThumbs/qbx-hands-04-weapons-hadoken-l.png +0 -0
  105. package/assets/poseThumbs/qbx-hands-04-weapons-hadoken-r.png +0 -0
  106. package/assets/poseThumbs/qbx-hands-04-weapons-pistol-double-l.png +0 -0
  107. package/assets/poseThumbs/qbx-hands-04-weapons-pistol-double-r.png +0 -0
  108. package/assets/poseThumbs/qbx-hands-04-weapons-pistol-l.png +0 -0
  109. package/assets/poseThumbs/qbx-hands-04-weapons-pistol-r.png +0 -0
  110. package/assets/poseThumbs/qbx-hands-04-weapons-throw-l.png +0 -0
  111. package/assets/poseThumbs/qbx-hands-04-weapons-throw-r.png +0 -0
  112. package/dist/Anchors.d.ts +11 -0
  113. package/dist/Anchors.d.ts.map +1 -0
  114. package/dist/Anchors.js +315 -0
  115. package/dist/App.hostFlows.test.d.ts +2 -0
  116. package/dist/App.hostFlows.test.d.ts.map +1 -0
  117. package/dist/App.hostFlows.test.js +48 -0
  118. package/dist/CameraPath.d.ts +130 -0
  119. package/dist/CameraPath.d.ts.map +1 -0
  120. package/dist/CameraPath.js +920 -0
  121. package/dist/CameraScene.d.ts +45 -0
  122. package/dist/CameraScene.d.ts.map +1 -0
  123. package/dist/CameraScene.js +1716 -0
  124. package/dist/CameraScene.test.d.ts +2 -0
  125. package/dist/CameraScene.test.d.ts.map +1 -0
  126. package/dist/CameraScene.test.js +259 -0
  127. package/dist/PathPresetDropRig.d.ts +27 -0
  128. package/dist/PathPresetDropRig.d.ts.map +1 -0
  129. package/dist/PathPresetDropRig.js +192 -0
  130. package/dist/PathPresetThumb.d.ts +11 -0
  131. package/dist/PathPresetThumb.d.ts.map +1 -0
  132. package/dist/PathPresetThumb.js +85 -0
  133. package/dist/PipCameraSelector.d.ts +15 -0
  134. package/dist/PipCameraSelector.d.ts.map +1 -0
  135. package/dist/PipCameraSelector.js +92 -0
  136. package/dist/PlacementManager.d.ts +252 -0
  137. package/dist/PlacementManager.d.ts.map +1 -0
  138. package/dist/PlacementManager.js +1525 -0
  139. package/dist/ShotCamera.d.ts +21 -0
  140. package/dist/ShotCamera.d.ts.map +1 -0
  141. package/dist/ShotCamera.js +568 -0
  142. package/dist/TopToolbar.d.ts +43 -0
  143. package/dist/TopToolbar.d.ts.map +1 -0
  144. package/dist/TopToolbar.js +167 -0
  145. package/dist/TopToolbar.test.d.ts +2 -0
  146. package/dist/TopToolbar.test.d.ts.map +1 -0
  147. package/dist/TopToolbar.test.js +107 -0
  148. package/dist/agent/api.d.ts +95 -0
  149. package/dist/agent/api.d.ts.map +1 -0
  150. package/dist/agent/api.js +337 -0
  151. package/dist/agent/api.test.d.ts +2 -0
  152. package/dist/agent/api.test.d.ts.map +1 -0
  153. package/dist/agent/api.test.js +907 -0
  154. package/dist/agent/bridgeClient.d.ts +62 -0
  155. package/dist/agent/bridgeClient.d.ts.map +1 -0
  156. package/dist/agent/bridgeClient.js +277 -0
  157. package/dist/agent/bridgeClient.test.d.ts +2 -0
  158. package/dist/agent/bridgeClient.test.d.ts.map +1 -0
  159. package/dist/agent/bridgeClient.test.js +413 -0
  160. package/dist/agent/bridgeFiles.d.ts +33 -0
  161. package/dist/agent/bridgeFiles.d.ts.map +1 -0
  162. package/dist/agent/bridgeFiles.js +193 -0
  163. package/dist/agent/bridgeFiles.test.d.ts +2 -0
  164. package/dist/agent/bridgeFiles.test.d.ts.map +1 -0
  165. package/dist/agent/bridgeFiles.test.js +220 -0
  166. package/dist/agent/commands/anchors.d.ts +43 -0
  167. package/dist/agent/commands/anchors.d.ts.map +1 -0
  168. package/dist/agent/commands/anchors.js +331 -0
  169. package/dist/agent/commands/anchors.test.d.ts +2 -0
  170. package/dist/agent/commands/anchors.test.d.ts.map +1 -0
  171. package/dist/agent/commands/anchors.test.js +447 -0
  172. package/dist/agent/commands/animations.d.ts +47 -0
  173. package/dist/agent/commands/animations.d.ts.map +1 -0
  174. package/dist/agent/commands/animations.js +245 -0
  175. package/dist/agent/commands/animations.test.d.ts +2 -0
  176. package/dist/agent/commands/animations.test.d.ts.map +1 -0
  177. package/dist/agent/commands/animations.test.js +426 -0
  178. package/dist/agent/commands/assets.d.ts +34 -0
  179. package/dist/agent/commands/assets.d.ts.map +1 -0
  180. package/dist/agent/commands/assets.js +367 -0
  181. package/dist/agent/commands/assets.test.d.ts +2 -0
  182. package/dist/agent/commands/assets.test.d.ts.map +1 -0
  183. package/dist/agent/commands/assets.test.js +405 -0
  184. package/dist/agent/commands/bindings.realStudio.test.d.ts +21 -0
  185. package/dist/agent/commands/bindings.realStudio.test.d.ts.map +1 -0
  186. package/dist/agent/commands/bindings.realStudio.test.js +281 -0
  187. package/dist/agent/commands/cameras.d.ts +65 -0
  188. package/dist/agent/commands/cameras.d.ts.map +1 -0
  189. package/dist/agent/commands/cameras.js +498 -0
  190. package/dist/agent/commands/cameras.test.d.ts +2 -0
  191. package/dist/agent/commands/cameras.test.d.ts.map +1 -0
  192. package/dist/agent/commands/cameras.test.js +560 -0
  193. package/dist/agent/commands/delete.test.d.ts +2 -0
  194. package/dist/agent/commands/delete.test.d.ts.map +1 -0
  195. package/dist/agent/commands/delete.test.js +518 -0
  196. package/dist/agent/commands/exports.d.ts +12 -0
  197. package/dist/agent/commands/exports.d.ts.map +1 -0
  198. package/dist/agent/commands/exports.js +132 -0
  199. package/dist/agent/commands/exports.test.d.ts +2 -0
  200. package/dist/agent/commands/exports.test.d.ts.map +1 -0
  201. package/dist/agent/commands/exports.test.js +402 -0
  202. package/dist/agent/commands/history.d.ts +17 -0
  203. package/dist/agent/commands/history.d.ts.map +1 -0
  204. package/dist/agent/commands/history.js +96 -0
  205. package/dist/agent/commands/history.test.d.ts +2 -0
  206. package/dist/agent/commands/history.test.d.ts.map +1 -0
  207. package/dist/agent/commands/history.test.js +140 -0
  208. package/dist/agent/commands/jobs.d.ts +23 -0
  209. package/dist/agent/commands/jobs.d.ts.map +1 -0
  210. package/dist/agent/commands/jobs.js +66 -0
  211. package/dist/agent/commands/keyframes.d.ts +42 -0
  212. package/dist/agent/commands/keyframes.d.ts.map +1 -0
  213. package/dist/agent/commands/keyframes.js +310 -0
  214. package/dist/agent/commands/keyframes.realStudio.test.d.ts +11 -0
  215. package/dist/agent/commands/keyframes.realStudio.test.d.ts.map +1 -0
  216. package/dist/agent/commands/keyframes.realStudio.test.js +95 -0
  217. package/dist/agent/commands/keyframes.test.d.ts +2 -0
  218. package/dist/agent/commands/keyframes.test.d.ts.map +1 -0
  219. package/dist/agent/commands/keyframes.test.js +474 -0
  220. package/dist/agent/commands/models.d.ts +34 -0
  221. package/dist/agent/commands/models.d.ts.map +1 -0
  222. package/dist/agent/commands/models.js +137 -0
  223. package/dist/agent/commands/models.test.d.ts +2 -0
  224. package/dist/agent/commands/models.test.d.ts.map +1 -0
  225. package/dist/agent/commands/models.test.js +268 -0
  226. package/dist/agent/commands/objects.d.ts +4 -0
  227. package/dist/agent/commands/objects.d.ts.map +1 -0
  228. package/dist/agent/commands/objects.js +182 -0
  229. package/dist/agent/commands/objects.test.d.ts +2 -0
  230. package/dist/agent/commands/objects.test.d.ts.map +1 -0
  231. package/dist/agent/commands/objects.test.js +316 -0
  232. package/dist/agent/commands/paths.d.ts +111 -0
  233. package/dist/agent/commands/paths.d.ts.map +1 -0
  234. package/dist/agent/commands/paths.js +576 -0
  235. package/dist/agent/commands/paths.test.d.ts +2 -0
  236. package/dist/agent/commands/paths.test.d.ts.map +1 -0
  237. package/dist/agent/commands/paths.test.js +773 -0
  238. package/dist/agent/commands/poses.d.ts +101 -0
  239. package/dist/agent/commands/poses.d.ts.map +1 -0
  240. package/dist/agent/commands/poses.js +500 -0
  241. package/dist/agent/commands/poses.realStudio.test.d.ts +15 -0
  242. package/dist/agent/commands/poses.realStudio.test.d.ts.map +1 -0
  243. package/dist/agent/commands/poses.realStudio.test.js +161 -0
  244. package/dist/agent/commands/poses.test.d.ts +2 -0
  245. package/dist/agent/commands/poses.test.d.ts.map +1 -0
  246. package/dist/agent/commands/poses.test.js +735 -0
  247. package/dist/agent/commands/project.d.ts +12 -0
  248. package/dist/agent/commands/project.d.ts.map +1 -0
  249. package/dist/agent/commands/project.js +42 -0
  250. package/dist/agent/commands/project.test.d.ts +2 -0
  251. package/dist/agent/commands/project.test.d.ts.map +1 -0
  252. package/dist/agent/commands/project.test.js +125 -0
  253. package/dist/agent/commands/revision.realStudio.test.d.ts +14 -0
  254. package/dist/agent/commands/revision.realStudio.test.d.ts.map +1 -0
  255. package/dist/agent/commands/revision.realStudio.test.js +129 -0
  256. package/dist/agent/commands/scene.d.ts +32 -0
  257. package/dist/agent/commands/scene.d.ts.map +1 -0
  258. package/dist/agent/commands/scene.js +100 -0
  259. package/dist/agent/commands/scene.test.d.ts +2 -0
  260. package/dist/agent/commands/scene.test.d.ts.map +1 -0
  261. package/dist/agent/commands/scene.test.js +147 -0
  262. package/dist/agent/commands/selection.d.ts +21 -0
  263. package/dist/agent/commands/selection.d.ts.map +1 -0
  264. package/dist/agent/commands/selection.js +101 -0
  265. package/dist/agent/commands/selection.test.d.ts +2 -0
  266. package/dist/agent/commands/selection.test.d.ts.map +1 -0
  267. package/dist/agent/commands/selection.test.js +173 -0
  268. package/dist/agent/commands/sequence.d.ts +25 -0
  269. package/dist/agent/commands/sequence.d.ts.map +1 -0
  270. package/dist/agent/commands/sequence.js +174 -0
  271. package/dist/agent/commands/sequence.test.d.ts +2 -0
  272. package/dist/agent/commands/sequence.test.d.ts.map +1 -0
  273. package/dist/agent/commands/sequence.test.js +264 -0
  274. package/dist/agent/commands/ui.d.ts +40 -0
  275. package/dist/agent/commands/ui.d.ts.map +1 -0
  276. package/dist/agent/commands/ui.js +166 -0
  277. package/dist/agent/commands/view.d.ts +61 -0
  278. package/dist/agent/commands/view.d.ts.map +1 -0
  279. package/dist/agent/commands/view.js +229 -0
  280. package/dist/agent/commands/view.test.d.ts +2 -0
  281. package/dist/agent/commands/view.test.d.ts.map +1 -0
  282. package/dist/agent/commands/view.test.js +347 -0
  283. package/dist/agent/contractCoverage.test.d.ts +2 -0
  284. package/dist/agent/contractCoverage.test.d.ts.map +1 -0
  285. package/dist/agent/contractCoverage.test.js +87 -0
  286. package/dist/agent/deleteHandlers.d.ts +61 -0
  287. package/dist/agent/deleteHandlers.d.ts.map +1 -0
  288. package/dist/agent/deleteHandlers.js +41 -0
  289. package/dist/agent/errors.d.ts +24 -0
  290. package/dist/agent/errors.d.ts.map +1 -0
  291. package/dist/agent/errors.js +59 -0
  292. package/dist/agent/errors.test.d.ts +2 -0
  293. package/dist/agent/errors.test.d.ts.map +1 -0
  294. package/dist/agent/errors.test.js +25 -0
  295. package/dist/agent/expectedCommands.d.ts +9 -0
  296. package/dist/agent/expectedCommands.d.ts.map +1 -0
  297. package/dist/agent/expectedCommands.js +79 -0
  298. package/dist/agent/jobs.d.ts +52 -0
  299. package/dist/agent/jobs.d.ts.map +1 -0
  300. package/dist/agent/jobs.js +175 -0
  301. package/dist/agent/jobs.test.d.ts +2 -0
  302. package/dist/agent/jobs.test.d.ts.map +1 -0
  303. package/dist/agent/jobs.test.js +281 -0
  304. package/dist/agent/keyframeTracks.d.ts +57 -0
  305. package/dist/agent/keyframeTracks.d.ts.map +1 -0
  306. package/dist/agent/keyframeTracks.js +127 -0
  307. package/dist/agent/objectIds.d.ts +7 -0
  308. package/dist/agent/objectIds.d.ts.map +1 -0
  309. package/dist/agent/objectIds.js +20 -0
  310. package/dist/agent/objectIds.test.d.ts +2 -0
  311. package/dist/agent/objectIds.test.d.ts.map +1 -0
  312. package/dist/agent/objectIds.test.js +10 -0
  313. package/dist/agent/objectResolver.d.ts +34 -0
  314. package/dist/agent/objectResolver.d.ts.map +1 -0
  315. package/dist/agent/objectResolver.js +112 -0
  316. package/dist/agent/pathCommands.d.ts +78 -0
  317. package/dist/agent/pathCommands.d.ts.map +1 -0
  318. package/dist/agent/pathCommands.js +240 -0
  319. package/dist/agent/propAccess.d.ts +42 -0
  320. package/dist/agent/propAccess.d.ts.map +1 -0
  321. package/dist/agent/propAccess.js +181 -0
  322. package/dist/agent/registerCommands.d.ts +9 -0
  323. package/dist/agent/registerCommands.d.ts.map +1 -0
  324. package/dist/agent/registerCommands.js +77 -0
  325. package/dist/agent/registry.d.ts +33 -0
  326. package/dist/agent/registry.d.ts.map +1 -0
  327. package/dist/agent/registry.js +55 -0
  328. package/dist/agent/registry.test.d.ts +2 -0
  329. package/dist/agent/registry.test.d.ts.map +1 -0
  330. package/dist/agent/registry.test.js +106 -0
  331. package/dist/agent/runtime/animationStatus.d.ts +25 -0
  332. package/dist/agent/runtime/animationStatus.d.ts.map +1 -0
  333. package/dist/agent/runtime/animationStatus.js +13 -0
  334. package/dist/agent/runtime/cameraLifecycle.d.ts +37 -0
  335. package/dist/agent/runtime/cameraLifecycle.d.ts.map +1 -0
  336. package/dist/agent/runtime/cameraLifecycle.js +112 -0
  337. package/dist/agent/runtime/directorView.d.ts +42 -0
  338. package/dist/agent/runtime/directorView.d.ts.map +1 -0
  339. package/dist/agent/runtime/directorView.js +27 -0
  340. package/dist/agent/runtime/exportRuntime.d.ts +95 -0
  341. package/dist/agent/runtime/exportRuntime.d.ts.map +1 -0
  342. package/dist/agent/runtime/exportRuntime.js +227 -0
  343. package/dist/agent/runtime/objectRuntime.d.ts +26 -0
  344. package/dist/agent/runtime/objectRuntime.d.ts.map +1 -0
  345. package/dist/agent/runtime/objectRuntime.js +29 -0
  346. package/dist/agent/runtime/pathRuntime.d.ts +21 -0
  347. package/dist/agent/runtime/pathRuntime.d.ts.map +1 -0
  348. package/dist/agent/runtime/pathRuntime.js +13 -0
  349. package/dist/agent/runtime/placementLifecycle.d.ts +34 -0
  350. package/dist/agent/runtime/placementLifecycle.d.ts.map +1 -0
  351. package/dist/agent/runtime/placementLifecycle.js +63 -0
  352. package/dist/agent/runtime/placementLifecycle.test.d.ts +2 -0
  353. package/dist/agent/runtime/placementLifecycle.test.d.ts.map +1 -0
  354. package/dist/agent/runtime/placementLifecycle.test.js +68 -0
  355. package/dist/agent/runtime/poseSessionRuntime.d.ts +17 -0
  356. package/dist/agent/runtime/poseSessionRuntime.d.ts.map +1 -0
  357. package/dist/agent/runtime/poseSessionRuntime.js +64 -0
  358. package/dist/agent/runtime.d.ts +67 -0
  359. package/dist/agent/runtime.d.ts.map +1 -0
  360. package/dist/agent/runtime.js +214 -0
  361. package/dist/agent/runtime.test.d.ts +2 -0
  362. package/dist/agent/runtime.test.d.ts.map +1 -0
  363. package/dist/agent/runtime.test.js +142 -0
  364. package/dist/agent/sequenceLength.d.ts +20 -0
  365. package/dist/agent/sequenceLength.d.ts.map +1 -0
  366. package/dist/agent/sequenceLength.js +18 -0
  367. package/dist/agent/types.d.ts +70 -0
  368. package/dist/agent/types.d.ts.map +1 -0
  369. package/dist/agent/types.js +6 -0
  370. package/dist/agent/validation.d.ts +7 -0
  371. package/dist/agent/validation.d.ts.map +1 -0
  372. package/dist/agent/validation.js +39 -0
  373. package/dist/aimTargets.d.ts +128 -0
  374. package/dist/aimTargets.d.ts.map +1 -0
  375. package/dist/aimTargets.js +367 -0
  376. package/dist/aimTargets.test.d.ts +2 -0
  377. package/dist/aimTargets.test.d.ts.map +1 -0
  378. package/dist/aimTargets.test.js +84 -0
  379. package/dist/anchorParenting.test.d.ts +2 -0
  380. package/dist/anchorParenting.test.d.ts.map +1 -0
  381. package/dist/anchorParenting.test.js +87 -0
  382. package/dist/anchorsRegistry.d.ts +45 -0
  383. package/dist/anchorsRegistry.d.ts.map +1 -0
  384. package/dist/anchorsRegistry.js +101 -0
  385. package/dist/anchorsRegistry.test.d.ts +2 -0
  386. package/dist/anchorsRegistry.test.d.ts.map +1 -0
  387. package/dist/anchorsRegistry.test.js +29 -0
  388. package/dist/assetLibrary/AssetLibraryPanel.d.ts +35 -0
  389. package/dist/assetLibrary/AssetLibraryPanel.d.ts.map +1 -0
  390. package/dist/assetLibrary/AssetLibraryPanel.js +544 -0
  391. package/dist/assetLibrary/AssetLibraryPanel.viewer.test.d.ts +2 -0
  392. package/dist/assetLibrary/AssetLibraryPanel.viewer.test.d.ts.map +1 -0
  393. package/dist/assetLibrary/AssetLibraryPanel.viewer.test.js +133 -0
  394. package/dist/assetLibrary/ModelPickerSlot.d.ts +24 -0
  395. package/dist/assetLibrary/ModelPickerSlot.d.ts.map +1 -0
  396. package/dist/assetLibrary/ModelPickerSlot.js +32 -0
  397. package/dist/assetLibrary/catalogThumbs.d.ts +7 -0
  398. package/dist/assetLibrary/catalogThumbs.d.ts.map +1 -0
  399. package/dist/assetLibrary/catalogThumbs.js +75 -0
  400. package/dist/assetLibrary/classify.d.ts +14 -0
  401. package/dist/assetLibrary/classify.d.ts.map +1 -0
  402. package/dist/assetLibrary/classify.js +43 -0
  403. package/dist/assetLibrary/classify.test.d.ts +2 -0
  404. package/dist/assetLibrary/classify.test.d.ts.map +1 -0
  405. package/dist/assetLibrary/classify.test.js +44 -0
  406. package/dist/assetLibrary/contract.indexeddb.test.d.ts +2 -0
  407. package/dist/assetLibrary/contract.indexeddb.test.d.ts.map +1 -0
  408. package/dist/assetLibrary/contract.indexeddb.test.js +10 -0
  409. package/dist/assetLibrary/contractTests.d.ts +12 -0
  410. package/dist/assetLibrary/contractTests.d.ts.map +1 -0
  411. package/dist/assetLibrary/contractTests.js +51 -0
  412. package/dist/assetLibrary/dispose.d.ts +4 -0
  413. package/dist/assetLibrary/dispose.d.ts.map +1 -0
  414. package/dist/assetLibrary/dispose.js +21 -0
  415. package/dist/assetLibrary/draco.d.ts +6 -0
  416. package/dist/assetLibrary/draco.d.ts.map +1 -0
  417. package/dist/assetLibrary/draco.js +45 -0
  418. package/dist/assetLibrary/draco.test.d.ts +2 -0
  419. package/dist/assetLibrary/draco.test.d.ts.map +1 -0
  420. package/dist/assetLibrary/draco.test.js +93 -0
  421. package/dist/assetLibrary/exportGLB.d.ts +20 -0
  422. package/dist/assetLibrary/exportGLB.d.ts.map +1 -0
  423. package/dist/assetLibrary/exportGLB.js +83 -0
  424. package/dist/assetLibrary/exportGLB.test.d.ts +2 -0
  425. package/dist/assetLibrary/exportGLB.test.d.ts.map +1 -0
  426. package/dist/assetLibrary/exportGLB.test.js +73 -0
  427. package/dist/assetLibrary/gltfLoader.d.ts +8 -0
  428. package/dist/assetLibrary/gltfLoader.d.ts.map +1 -0
  429. package/dist/assetLibrary/gltfLoader.js +11 -0
  430. package/dist/assetLibrary/hash.d.ts +7 -0
  431. package/dist/assetLibrary/hash.d.ts.map +1 -0
  432. package/dist/assetLibrary/hash.js +17 -0
  433. package/dist/assetLibrary/importModelFile.d.ts +5 -0
  434. package/dist/assetLibrary/importModelFile.d.ts.map +1 -0
  435. package/dist/assetLibrary/importModelFile.js +19 -0
  436. package/dist/assetLibrary/importModelFile.test.d.ts +2 -0
  437. package/dist/assetLibrary/importModelFile.test.d.ts.map +1 -0
  438. package/dist/assetLibrary/importModelFile.test.js +77 -0
  439. package/dist/assetLibrary/importPipeline.d.ts +61 -0
  440. package/dist/assetLibrary/importPipeline.d.ts.map +1 -0
  441. package/dist/assetLibrary/importPipeline.js +253 -0
  442. package/dist/assetLibrary/importPipeline.test.d.ts +2 -0
  443. package/dist/assetLibrary/importPipeline.test.d.ts.map +1 -0
  444. package/dist/assetLibrary/importPipeline.test.js +188 -0
  445. package/dist/assetLibrary/indexedDBBackend.d.ts +31 -0
  446. package/dist/assetLibrary/indexedDBBackend.d.ts.map +1 -0
  447. package/dist/assetLibrary/indexedDBBackend.js +134 -0
  448. package/dist/assetLibrary/indexedDBBackend.test.d.ts +2 -0
  449. package/dist/assetLibrary/indexedDBBackend.test.d.ts.map +1 -0
  450. package/dist/assetLibrary/indexedDBBackend.test.js +148 -0
  451. package/dist/assetLibrary/legacySeedCleanup.d.ts +19 -0
  452. package/dist/assetLibrary/legacySeedCleanup.d.ts.map +1 -0
  453. package/dist/assetLibrary/legacySeedCleanup.js +50 -0
  454. package/dist/assetLibrary/legacySeedCleanup.test.d.ts +2 -0
  455. package/dist/assetLibrary/legacySeedCleanup.test.d.ts.map +1 -0
  456. package/dist/assetLibrary/legacySeedCleanup.test.js +74 -0
  457. package/dist/assetLibrary/library.d.ts +122 -0
  458. package/dist/assetLibrary/library.d.ts.map +1 -0
  459. package/dist/assetLibrary/library.js +424 -0
  460. package/dist/assetLibrary/library.test.d.ts +2 -0
  461. package/dist/assetLibrary/library.test.d.ts.map +1 -0
  462. package/dist/assetLibrary/library.test.js +520 -0
  463. package/dist/assetLibrary/options.d.ts +9 -0
  464. package/dist/assetLibrary/options.d.ts.map +1 -0
  465. package/dist/assetLibrary/options.js +20 -0
  466. package/dist/assetLibrary/options.test.d.ts +2 -0
  467. package/dist/assetLibrary/options.test.d.ts.map +1 -0
  468. package/dist/assetLibrary/options.test.js +70 -0
  469. package/dist/assetLibrary/pose.d.ts +15 -0
  470. package/dist/assetLibrary/pose.d.ts.map +1 -0
  471. package/dist/assetLibrary/pose.js +41 -0
  472. package/dist/assetLibrary/pose.test.d.ts +2 -0
  473. package/dist/assetLibrary/pose.test.d.ts.map +1 -0
  474. package/dist/assetLibrary/pose.test.js +45 -0
  475. package/dist/assetLibrary/poseThumbnail.d.ts +30 -0
  476. package/dist/assetLibrary/poseThumbnail.d.ts.map +1 -0
  477. package/dist/assetLibrary/poseThumbnail.js +144 -0
  478. package/dist/assetLibrary/poseThumbnail.test.d.ts +2 -0
  479. package/dist/assetLibrary/poseThumbnail.test.d.ts.map +1 -0
  480. package/dist/assetLibrary/poseThumbnail.test.js +111 -0
  481. package/dist/assetLibrary/rig.d.ts +14 -0
  482. package/dist/assetLibrary/rig.d.ts.map +1 -0
  483. package/dist/assetLibrary/rig.js +33 -0
  484. package/dist/assetLibrary/rig.test.d.ts +2 -0
  485. package/dist/assetLibrary/rig.test.d.ts.map +1 -0
  486. package/dist/assetLibrary/rig.test.js +55 -0
  487. package/dist/assetLibrary/seedAssetsManifest.d.ts +24 -0
  488. package/dist/assetLibrary/seedAssetsManifest.d.ts.map +1 -0
  489. package/dist/assetLibrary/seedAssetsManifest.js +347 -0
  490. package/dist/assetLibrary/seedBuiltinPoses.d.ts +29 -0
  491. package/dist/assetLibrary/seedBuiltinPoses.d.ts.map +1 -0
  492. package/dist/assetLibrary/seedBuiltinPoses.js +114 -0
  493. package/dist/assetLibrary/seedBuiltinPoses.test.d.ts +2 -0
  494. package/dist/assetLibrary/seedBuiltinPoses.test.d.ts.map +1 -0
  495. package/dist/assetLibrary/seedBuiltinPoses.test.js +176 -0
  496. package/dist/assetLibrary/seedPoses.d.ts +8 -0
  497. package/dist/assetLibrary/seedPoses.d.ts.map +1 -0
  498. package/dist/assetLibrary/seedPoses.js +2414 -0
  499. package/dist/assetLibrary/seedPosesDpl.d.ts +8 -0
  500. package/dist/assetLibrary/seedPosesDpl.d.ts.map +1 -0
  501. package/dist/assetLibrary/seedPosesDpl.js +11660 -0
  502. package/dist/assetLibrary/seedPosesQbx.d.ts +8 -0
  503. package/dist/assetLibrary/seedPosesQbx.d.ts.map +1 -0
  504. package/dist/assetLibrary/seedPosesQbx.js +5612 -0
  505. package/dist/assetLibrary/seedPosesQbx.test.d.ts +2 -0
  506. package/dist/assetLibrary/seedPosesQbx.test.d.ts.map +1 -0
  507. package/dist/assetLibrary/seedPosesQbx.test.js +181 -0
  508. package/dist/assetLibrary/source.d.ts +45 -0
  509. package/dist/assetLibrary/source.d.ts.map +1 -0
  510. package/dist/assetLibrary/source.js +11 -0
  511. package/dist/assetLibrary/source.test.d.ts +2 -0
  512. package/dist/assetLibrary/source.test.d.ts.map +1 -0
  513. package/dist/assetLibrary/source.test.js +28 -0
  514. package/dist/assetLibrary/staticCatalogSource.d.ts +48 -0
  515. package/dist/assetLibrary/staticCatalogSource.d.ts.map +1 -0
  516. package/dist/assetLibrary/staticCatalogSource.js +140 -0
  517. package/dist/assetLibrary/staticCatalogSource.test.d.ts +2 -0
  518. package/dist/assetLibrary/staticCatalogSource.test.d.ts.map +1 -0
  519. package/dist/assetLibrary/staticCatalogSource.test.js +154 -0
  520. package/dist/assetLibrary/thumbnail.d.ts +14 -0
  521. package/dist/assetLibrary/thumbnail.d.ts.map +1 -0
  522. package/dist/assetLibrary/thumbnail.js +70 -0
  523. package/dist/assetLibrary/types.d.ts +54 -0
  524. package/dist/assetLibrary/types.d.ts.map +1 -0
  525. package/dist/assetLibrary/types.js +1 -0
  526. package/dist/assetLibrary/useModelThumbUrl.d.ts +10 -0
  527. package/dist/assetLibrary/useModelThumbUrl.d.ts.map +1 -0
  528. package/dist/assetLibrary/useModelThumbUrl.js +56 -0
  529. package/dist/boneAnchorWiring.test.d.ts +2 -0
  530. package/dist/boneAnchorWiring.test.d.ts.map +1 -0
  531. package/dist/boneAnchorWiring.test.js +173 -0
  532. package/dist/boneAnchors.d.ts +30 -0
  533. package/dist/boneAnchors.d.ts.map +1 -0
  534. package/dist/boneAnchors.js +111 -0
  535. package/dist/boneAnchors.test.d.ts +2 -0
  536. package/dist/boneAnchors.test.d.ts.map +1 -0
  537. package/dist/boneAnchors.test.js +98 -0
  538. package/dist/bootstrap.d.ts +37 -0
  539. package/dist/bootstrap.d.ts.map +1 -0
  540. package/dist/bootstrap.js +394 -0
  541. package/dist/bootstrap.test.d.ts +2 -0
  542. package/dist/bootstrap.test.d.ts.map +1 -0
  543. package/dist/bootstrap.test.js +647 -0
  544. package/dist/cameraRegistry.d.ts +65 -0
  545. package/dist/cameraRegistry.d.ts.map +1 -0
  546. package/dist/cameraRegistry.js +151 -0
  547. package/dist/cameraRegistry.test.d.ts +2 -0
  548. package/dist/cameraRegistry.test.d.ts.map +1 -0
  549. package/dist/cameraRegistry.test.js +68 -0
  550. package/dist/config.d.ts +92 -0
  551. package/dist/config.d.ts.map +1 -0
  552. package/dist/config.js +1 -0
  553. package/dist/contextMenu.d.ts +16 -0
  554. package/dist/contextMenu.d.ts.map +1 -0
  555. package/dist/contextMenu.js +10 -0
  556. package/dist/dropPoint.d.ts +61 -0
  557. package/dist/dropPoint.d.ts.map +1 -0
  558. package/dist/dropPoint.js +97 -0
  559. package/dist/dropPoint.test.d.ts +2 -0
  560. package/dist/dropPoint.test.d.ts.map +1 -0
  561. package/dist/dropPoint.test.js +174 -0
  562. package/dist/editorOnly.d.ts +6 -0
  563. package/dist/editorOnly.d.ts.map +1 -0
  564. package/dist/editorOnly.js +32 -0
  565. package/dist/errors.d.ts +24 -0
  566. package/dist/errors.d.ts.map +1 -0
  567. package/dist/errors.js +13 -0
  568. package/dist/gestureProps.d.ts +99 -0
  569. package/dist/gestureProps.d.ts.map +1 -0
  570. package/dist/gestureProps.js +118 -0
  571. package/dist/gestureProps.test.d.ts +2 -0
  572. package/dist/gestureProps.test.d.ts.map +1 -0
  573. package/dist/gestureProps.test.js +182 -0
  574. package/dist/gesturePropsEditor.d.ts +27 -0
  575. package/dist/gesturePropsEditor.d.ts.map +1 -0
  576. package/dist/gesturePropsEditor.js +121 -0
  577. package/dist/getDeep.d.ts +8 -0
  578. package/dist/getDeep.d.ts.map +1 -0
  579. package/dist/getDeep.js +15 -0
  580. package/dist/gizmoRegistry.test.d.ts +2 -0
  581. package/dist/gizmoRegistry.test.d.ts.map +1 -0
  582. package/dist/gizmoRegistry.test.js +40 -0
  583. package/dist/hostFlows.d.ts +55 -0
  584. package/dist/hostFlows.d.ts.map +1 -0
  585. package/dist/hostFlows.js +77 -0
  586. package/dist/hostFlows.test.d.ts +2 -0
  587. package/dist/hostFlows.test.d.ts.map +1 -0
  588. package/dist/hostFlows.test.js +191 -0
  589. package/dist/i18n.d.ts +26 -0
  590. package/dist/i18n.d.ts.map +1 -0
  591. package/dist/i18n.js +271 -0
  592. package/dist/i18n.test.d.ts +2 -0
  593. package/dist/i18n.test.d.ts.map +1 -0
  594. package/dist/i18n.test.js +41 -0
  595. package/dist/index.d.ts +42 -0
  596. package/dist/index.d.ts.map +1 -0
  597. package/dist/index.js +11 -0
  598. package/dist/menuModel.d.ts +51 -0
  599. package/dist/menuModel.d.ts.map +1 -0
  600. package/dist/menuModel.js +111 -0
  601. package/dist/menuModel.test.d.ts +2 -0
  602. package/dist/menuModel.test.d.ts.map +1 -0
  603. package/dist/menuModel.test.js +197 -0
  604. package/dist/modalGrab.d.ts +29 -0
  605. package/dist/modalGrab.d.ts.map +1 -0
  606. package/dist/modalGrab.js +127 -0
  607. package/dist/outlineObjectMenu.d.ts +41 -0
  608. package/dist/outlineObjectMenu.d.ts.map +1 -0
  609. package/dist/outlineObjectMenu.js +58 -0
  610. package/dist/outlineObjectMenu.test.d.ts +2 -0
  611. package/dist/outlineObjectMenu.test.d.ts.map +1 -0
  612. package/dist/outlineObjectMenu.test.js +83 -0
  613. package/dist/pathBinding.d.ts +16 -0
  614. package/dist/pathBinding.d.ts.map +1 -0
  615. package/dist/pathBinding.js +19 -0
  616. package/dist/pathBinding.test.d.ts +2 -0
  617. package/dist/pathBinding.test.d.ts.map +1 -0
  618. package/dist/pathBinding.test.js +14 -0
  619. package/dist/pathModel.d.ts +123 -0
  620. package/dist/pathModel.d.ts.map +1 -0
  621. package/dist/pathModel.js +343 -0
  622. package/dist/pathModel.test.d.ts +2 -0
  623. package/dist/pathModel.test.d.ts.map +1 -0
  624. package/dist/pathModel.test.js +394 -0
  625. package/dist/pathPresets.d.ts +38 -0
  626. package/dist/pathPresets.d.ts.map +1 -0
  627. package/dist/pathPresets.js +180 -0
  628. package/dist/pathPresets.test.d.ts +2 -0
  629. package/dist/pathPresets.test.d.ts.map +1 -0
  630. package/dist/pathPresets.test.js +154 -0
  631. package/dist/pathRegistry.d.ts +46 -0
  632. package/dist/pathRegistry.d.ts.map +1 -0
  633. package/dist/pathRegistry.js +105 -0
  634. package/dist/pathRegistry.test.d.ts +2 -0
  635. package/dist/pathRegistry.test.d.ts.map +1 -0
  636. package/dist/pathRegistry.test.js +23 -0
  637. package/dist/pickerRegistry.d.ts +49 -0
  638. package/dist/pickerRegistry.d.ts.map +1 -0
  639. package/dist/pickerRegistry.js +17 -0
  640. package/dist/pickerRegistry.test.d.ts +2 -0
  641. package/dist/pickerRegistry.test.d.ts.map +1 -0
  642. package/dist/pickerRegistry.test.js +31 -0
  643. package/dist/pipLayout.d.ts +7 -0
  644. package/dist/pipLayout.d.ts.map +1 -0
  645. package/dist/pipLayout.js +58 -0
  646. package/dist/placementKey.test.d.ts +2 -0
  647. package/dist/placementKey.test.d.ts.map +1 -0
  648. package/dist/placementKey.test.js +32 -0
  649. package/dist/placementPoseProps.d.ts +29 -0
  650. package/dist/placementPoseProps.d.ts.map +1 -0
  651. package/dist/placementPoseProps.js +43 -0
  652. package/dist/placementPoseProps.test.d.ts +2 -0
  653. package/dist/placementPoseProps.test.d.ts.map +1 -0
  654. package/dist/placementPoseProps.test.js +35 -0
  655. package/dist/poseMode/PoseModeBar.d.ts +18 -0
  656. package/dist/poseMode/PoseModeBar.d.ts.map +1 -0
  657. package/dist/poseMode/PoseModeBar.js +127 -0
  658. package/dist/poseMode/PoseModeRig.d.ts +9 -0
  659. package/dist/poseMode/PoseModeRig.d.ts.map +1 -0
  660. package/dist/poseMode/PoseModeRig.js +300 -0
  661. package/dist/poseMode/PosePickerFrame.d.ts +42 -0
  662. package/dist/poseMode/PosePickerFrame.d.ts.map +1 -0
  663. package/dist/poseMode/PosePickerFrame.js +164 -0
  664. package/dist/poseMode/PosePropEditor.d.ts +30 -0
  665. package/dist/poseMode/PosePropEditor.d.ts.map +1 -0
  666. package/dist/poseMode/PosePropEditor.js +139 -0
  667. package/dist/poseMode/controlSpec.d.ts +26 -0
  668. package/dist/poseMode/controlSpec.d.ts.map +1 -0
  669. package/dist/poseMode/controlSpec.js +157 -0
  670. package/dist/poseMode/controlSpec.test.d.ts +2 -0
  671. package/dist/poseMode/controlSpec.test.d.ts.map +1 -0
  672. package/dist/poseMode/controlSpec.test.js +196 -0
  673. package/dist/poseMode/dragState.d.ts +16 -0
  674. package/dist/poseMode/dragState.d.ts.map +1 -0
  675. package/dist/poseMode/dragState.js +15 -0
  676. package/dist/poseMode/dragState.test.d.ts +2 -0
  677. package/dist/poseMode/dragState.test.d.ts.map +1 -0
  678. package/dist/poseMode/dragState.test.js +23 -0
  679. package/dist/poseMode/poseDisplayText.d.ts +18 -0
  680. package/dist/poseMode/poseDisplayText.d.ts.map +1 -0
  681. package/dist/poseMode/poseDisplayText.js +13 -0
  682. package/dist/poseMode/poseDisplayText.test.d.ts +2 -0
  683. package/dist/poseMode/poseDisplayText.test.d.ts.map +1 -0
  684. package/dist/poseMode/poseDisplayText.test.js +35 -0
  685. package/dist/poseMode/poseExitGuard.d.ts +8 -0
  686. package/dist/poseMode/poseExitGuard.d.ts.map +1 -0
  687. package/dist/poseMode/poseExitGuard.js +13 -0
  688. package/dist/poseMode/poseExitGuard.test.d.ts +2 -0
  689. package/dist/poseMode/poseExitGuard.test.d.ts.map +1 -0
  690. package/dist/poseMode/poseExitGuard.test.js +41 -0
  691. package/dist/poseMode/poseFrame.d.ts +11 -0
  692. package/dist/poseMode/poseFrame.d.ts.map +1 -0
  693. package/dist/poseMode/poseFrame.js +7 -0
  694. package/dist/poseMode/poseFrame.test.d.ts +2 -0
  695. package/dist/poseMode/poseFrame.test.d.ts.map +1 -0
  696. package/dist/poseMode/poseFrame.test.js +25 -0
  697. package/dist/poseMode/poseInterpolate.d.ts +4 -0
  698. package/dist/poseMode/poseInterpolate.d.ts.map +1 -0
  699. package/dist/poseMode/poseInterpolate.js +75 -0
  700. package/dist/poseMode/poseInterpolate.test.d.ts +2 -0
  701. package/dist/poseMode/poseInterpolate.test.d.ts.map +1 -0
  702. package/dist/poseMode/poseInterpolate.test.js +61 -0
  703. package/dist/poseMode/poseLibResolve.d.ts +9 -0
  704. package/dist/poseMode/poseLibResolve.d.ts.map +1 -0
  705. package/dist/poseMode/poseLibResolve.js +49 -0
  706. package/dist/poseMode/poseLibResolve.test.d.ts +2 -0
  707. package/dist/poseMode/poseLibResolve.test.d.ts.map +1 -0
  708. package/dist/poseMode/poseLibResolve.test.js +59 -0
  709. package/dist/poseMode/poseMigration.d.ts +5 -0
  710. package/dist/poseMode/poseMigration.d.ts.map +1 -0
  711. package/dist/poseMode/poseMigration.js +16 -0
  712. package/dist/poseMode/poseMigration.test.d.ts +2 -0
  713. package/dist/poseMode/poseMigration.test.d.ts.map +1 -0
  714. package/dist/poseMode/poseMigration.test.js +25 -0
  715. package/dist/poseMode/poseOptions.d.ts +45 -0
  716. package/dist/poseMode/poseOptions.d.ts.map +1 -0
  717. package/dist/poseMode/poseOptions.js +39 -0
  718. package/dist/poseMode/poseOptions.test.d.ts +2 -0
  719. package/dist/poseMode/poseOptions.test.d.ts.map +1 -0
  720. package/dist/poseMode/poseOptions.test.js +83 -0
  721. package/dist/poseMode/poseOverride.d.ts +13 -0
  722. package/dist/poseMode/poseOverride.d.ts.map +1 -0
  723. package/dist/poseMode/poseOverride.js +26 -0
  724. package/dist/poseMode/poseOverride.test.d.ts +2 -0
  725. package/dist/poseMode/poseOverride.test.d.ts.map +1 -0
  726. package/dist/poseMode/poseOverride.test.js +23 -0
  727. package/dist/poseMode/poseRetarget.d.ts +17 -0
  728. package/dist/poseMode/poseRetarget.d.ts.map +1 -0
  729. package/dist/poseMode/poseRetarget.js +53 -0
  730. package/dist/poseMode/poseRetarget.test.d.ts +2 -0
  731. package/dist/poseMode/poseRetarget.test.d.ts.map +1 -0
  732. package/dist/poseMode/poseRetarget.test.js +88 -0
  733. package/dist/poseMode/poseSession.d.ts +58 -0
  734. package/dist/poseMode/poseSession.d.ts.map +1 -0
  735. package/dist/poseMode/poseSession.js +183 -0
  736. package/dist/poseMode/poseSession.test.d.ts +2 -0
  737. package/dist/poseMode/poseSession.test.d.ts.map +1 -0
  738. package/dist/poseMode/poseSession.test.js +159 -0
  739. package/dist/poseMode/poseSessionHooks.test.d.ts +2 -0
  740. package/dist/poseMode/poseSessionHooks.test.d.ts.map +1 -0
  741. package/dist/poseMode/poseSessionHooks.test.js +49 -0
  742. package/dist/poseMode/poseTrack.d.ts +30 -0
  743. package/dist/poseMode/poseTrack.d.ts.map +1 -0
  744. package/dist/poseMode/poseTrack.js +155 -0
  745. package/dist/poseMode/poseTrack.test.d.ts +2 -0
  746. package/dist/poseMode/poseTrack.test.d.ts.map +1 -0
  747. package/dist/poseMode/poseTrack.test.js +84 -0
  748. package/dist/poseMode/poseValue.d.ts +22 -0
  749. package/dist/poseMode/poseValue.d.ts.map +1 -0
  750. package/dist/poseMode/poseValue.js +73 -0
  751. package/dist/poseMode/poseValue.test.d.ts +2 -0
  752. package/dist/poseMode/poseValue.test.d.ts.map +1 -0
  753. package/dist/poseMode/poseValue.test.js +62 -0
  754. package/dist/poseMode/savePose.d.ts +23 -0
  755. package/dist/poseMode/savePose.d.ts.map +1 -0
  756. package/dist/poseMode/savePose.js +29 -0
  757. package/dist/poseMode/selectionModes.d.ts +14 -0
  758. package/dist/poseMode/selectionModes.d.ts.map +1 -0
  759. package/dist/poseMode/selectionModes.js +39 -0
  760. package/dist/poseMode/selectionModes.test.d.ts +2 -0
  761. package/dist/poseMode/selectionModes.test.d.ts.map +1 -0
  762. package/dist/poseMode/selectionModes.test.js +91 -0
  763. package/dist/poseNameMessages.d.ts +13 -0
  764. package/dist/poseNameMessages.d.ts.map +1 -0
  765. package/dist/poseNameMessages.js +370 -0
  766. package/dist/poseNames.d.ts +14 -0
  767. package/dist/poseNames.d.ts.map +1 -0
  768. package/dist/poseNames.js +21 -0
  769. package/dist/poseNames.test.d.ts +2 -0
  770. package/dist/poseNames.test.d.ts.map +1 -0
  771. package/dist/poseNames.test.js +41 -0
  772. package/dist/poseStatusText.d.ts +2 -0
  773. package/dist/poseStatusText.d.ts.map +1 -0
  774. package/dist/poseStatusText.js +11 -0
  775. package/dist/poseStatusText.test.d.ts +2 -0
  776. package/dist/poseStatusText.test.d.ts.map +1 -0
  777. package/dist/poseStatusText.test.js +21 -0
  778. package/dist/presetThumbGeometry.d.ts +26 -0
  779. package/dist/presetThumbGeometry.d.ts.map +1 -0
  780. package/dist/presetThumbGeometry.js +103 -0
  781. package/dist/presetThumbGeometry.test.d.ts +2 -0
  782. package/dist/presetThumbGeometry.test.d.ts.map +1 -0
  783. package/dist/presetThumbGeometry.test.js +83 -0
  784. package/dist/selectionOutline.d.ts +42 -0
  785. package/dist/selectionOutline.d.ts.map +1 -0
  786. package/dist/selectionOutline.js +174 -0
  787. package/dist/selectionOutline.test.d.ts +2 -0
  788. package/dist/selectionOutline.test.d.ts.map +1 -0
  789. package/dist/selectionOutline.test.js +58 -0
  790. package/dist/smoke.test.d.ts +1 -0
  791. package/dist/smoke.test.d.ts.map +1 -0
  792. package/dist/smoke.test.js +17 -0
  793. package/dist/uiConfig.d.ts +16 -0
  794. package/dist/uiConfig.d.ts.map +1 -0
  795. package/dist/uiConfig.js +13 -0
  796. package/dist/uiConfig.test.d.ts +2 -0
  797. package/dist/uiConfig.test.d.ts.map +1 -0
  798. package/dist/uiConfig.test.js +98 -0
  799. package/dist/undoShortcuts.d.ts +28 -0
  800. package/dist/undoShortcuts.d.ts.map +1 -0
  801. package/dist/undoShortcuts.js +59 -0
  802. package/dist/undoShortcuts.test.d.ts +2 -0
  803. package/dist/undoShortcuts.test.d.ts.map +1 -0
  804. package/dist/undoShortcuts.test.js +37 -0
  805. package/dist/useCameraStudio.d.ts +3 -0
  806. package/dist/useCameraStudio.d.ts.map +1 -0
  807. package/dist/useCameraStudio.js +86 -0
  808. package/dist/version.d.ts +2 -0
  809. package/dist/version.d.ts.map +1 -0
  810. package/dist/version.js +11 -0
  811. package/dist/videoExport/BlobCollectSink.d.ts +25 -0
  812. package/dist/videoExport/BlobCollectSink.d.ts.map +1 -0
  813. package/dist/videoExport/BlobCollectSink.js +56 -0
  814. package/dist/videoExport/BlobCollectSink.test.d.ts +2 -0
  815. package/dist/videoExport/BlobCollectSink.test.d.ts.map +1 -0
  816. package/dist/videoExport/BlobCollectSink.test.js +78 -0
  817. package/dist/videoExport/encoder.d.ts +34 -0
  818. package/dist/videoExport/encoder.d.ts.map +1 -0
  819. package/dist/videoExport/encoder.js +61 -0
  820. package/dist/videoExport/encoder.test.d.ts +2 -0
  821. package/dist/videoExport/encoder.test.d.ts.map +1 -0
  822. package/dist/videoExport/encoder.test.js +21 -0
  823. package/dist/videoExport/exporter.d.ts +24 -0
  824. package/dist/videoExport/exporter.d.ts.map +1 -0
  825. package/dist/videoExport/exporter.js +74 -0
  826. package/dist/videoExport/sinks.d.ts +55 -0
  827. package/dist/videoExport/sinks.d.ts.map +1 -0
  828. package/dist/videoExport/sinks.js +69 -0
  829. package/package.json +59 -3
  830. package/README.md +0 -3
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=seedPosesQbx.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seedPosesQbx.test.d.ts","sourceRoot":"","sources":["../../src/assetLibrary/seedPosesQbx.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,181 @@
1
+ // packages/camera-studio/src/assetLibrary/seedPosesQbx.test.ts
2
+ /**
3
+ * QBX 手势种子数据的不变量(2026-10-05 拇指偏差根治):
4
+ * 手势方向必须是「手腕相对」的——源包(QBX)的模型手臂下垂,若按世界方向
5
+ * 提取,会把手臂姿态烤进手势,应用到 T 姿势骨架上时手指相对手腕错位
6
+ * (拇指最显眼)。本测试把 seedPosesQbx 应用到 Y Bot rest,量每根手指骨
7
+ * 方向(用手腕世界四元数换算回手腕系),与管线 JSON 逐骨比对。
8
+ * JSON 必须是 v2(space='wrist');v1(世界方向)数据会在这里红。
9
+ */
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ import { FBXLoader } from 'three-stdlib';
13
+ import { Quaternion, Vector3 } from 'three';
14
+ import { seedPosesQbx } from './seedPosesQbx';
15
+ const pkgRoot = path.resolve(__dirname, '../..');
16
+ const DOC_PATH = path.join(pkgRoot, 'scripts/pose-pipeline/poses_directions_qbx.json');
17
+ const FBX_PATH = path.join(pkgRoot, 'scripts/pose-pipeline/models/Y Bot.fbx');
18
+ function loadRest() {
19
+ const buf = fs.readFileSync(FBX_PATH);
20
+ const root = new FBXLoader().parse(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength), '');
21
+ const rest = new Map();
22
+ root.traverse((o) => {
23
+ const bone = o;
24
+ if (!bone.isBone || rest.has(bone.name))
25
+ return;
26
+ const p = bone.parent;
27
+ rest.set(bone.name, {
28
+ parent: p && p.isBone && p.name && rest.has(p.name) ? p.name : null,
29
+ localQuat: [
30
+ o.quaternion.x,
31
+ o.quaternion.y,
32
+ o.quaternion.z,
33
+ o.quaternion.w,
34
+ ],
35
+ });
36
+ });
37
+ return rest;
38
+ }
39
+ const doc = JSON.parse(fs.readFileSync(DOC_PATH, 'utf-8'));
40
+ test('管线 JSON 是 v2 手腕相对格式(v1 世界方向会把手臂姿态烤进手势)', () => {
41
+ expect(doc.format).toBe('pose-directions-v2');
42
+ expect(doc.space).toBe('wrist');
43
+ });
44
+ test('条目按侧裁骨:名字带侧的只含本侧骨(挂错侧「没效果」的回归)', () => {
45
+ // 2026-10-05 用户报告:右手选择框里有两个「反手 V」,一个没效果。
46
+ // 根因:源包 Peace Flipped 的 action 名没带侧(实际是左手姿势),提取
47
+ // 时双手骨都收,运行时「无侧后缀=双手手势」两侧都列,挂到右手只写
48
+ // 了 rest 骨。修复=提取按侧裁骨+补侧名。这里兜底:名单侧 ⇔ 骨单侧
49
+ for (const e of seedPosesQbx) {
50
+ const sides = new Set(Object.keys(e.bones).map((b) => b.startsWith('mixamorigLeft') ? 'left' : 'right'));
51
+ if (e.name.endsWith('· 左手')) {
52
+ expect([...sides]).toEqual(['left']);
53
+ }
54
+ else if (e.name.endsWith('· 右手')) {
55
+ expect([...sides]).toEqual(['right']);
56
+ }
57
+ }
58
+ // 当事条目:裸 key 的反手 V 实为左手,名字与骨都必须标左
59
+ const bare = seedPosesQbx.find((e) => e.key === 'qbx-hands-03-signs-peace-flipped');
60
+ expect(bare.name).toContain('左手');
61
+ expect(Object.keys(bare.bones).every((b) => b.startsWith('mixamorigLeft'))).toBe(true);
62
+ // 侧标在名字中间的 Gun 03 也要各归各侧
63
+ for (const [key, side] of [
64
+ ['qbx-hands-04-weapons-gun-03-l-cock-the-hammer', '左手'],
65
+ ['qbx-hands-04-weapons-gun-03-r-cock-the-hammer', '右手'],
66
+ ]) {
67
+ expect(seedPosesQbx.find((e) => e.key === key).name).toContain(side);
68
+ }
69
+ });
70
+ test('左右成对手势的手指弯曲度互为镜像(源包漏帧/左右搞混的回归)', () => {
71
+ // 2026-10-05 三轮:FU R / Peace Flipped R 源 action 的右小指三节没 key
72
+ // (恒等于 rest),提取时已按左手镜像补齐。判镜像用「骨节链夹角」
73
+ // (相邻两节方向的夹角):标量、镜像不变,不受手腕朝向/滚转影响。
74
+ // 成对姿势若同源,各指链夹角必须相等;index 对有 8.4° 自然手绘误差,
75
+ // 阈值放 15°
76
+ const chain = (dirs, side, f, seg) => {
77
+ const a = dirs[`mixamorig${side}Hand${f}${seg}`];
78
+ const b = dirs[`mixamorig${side}Hand${f}${seg + 1}`];
79
+ const dot = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
80
+ return (Math.acos(Math.min(1, Math.max(-1, dot))) * 180) / Math.PI;
81
+ };
82
+ const pairBase = (key) => key === 'qbx-hands-03-signs-peace-flipped'
83
+ ? key
84
+ : key.replace(/-[lr]$/, '').replace(/-[lr]-/, '-?-');
85
+ const lefts = new Map();
86
+ const rights = new Map();
87
+ for (const p of doc.poses) {
88
+ const isLeft = Object.keys(p.dirs)[0]?.startsWith('mixamorigLeft');
89
+ (isLeft ? lefts : rights).set(pairBase(p.key), p);
90
+ }
91
+ let pairs = 0;
92
+ for (const [base, l] of lefts) {
93
+ const r = rights.get(base);
94
+ if (!r)
95
+ throw new Error(`${l.key} 没有右手对子`);
96
+ pairs++;
97
+ for (const f of ['Thumb', 'Index', 'Middle', 'Ring', 'Pinky']) {
98
+ for (const seg of [1, 2]) {
99
+ const d = Math.abs(chain(l.dirs, 'Left', f, seg) - chain(r.dirs, 'Right', f, seg));
100
+ if (d > 15)
101
+ throw new Error(`${base} ${f}${seg}↔${seg + 1} 左右弯曲度差 ${d.toFixed(1)}°`);
102
+ }
103
+ }
104
+ }
105
+ expect(pairs).toBe(55);
106
+ });
107
+ test('手势应用后与源姿势解剖关系一致(平掌≈T 手,握拳蜷曲)', () => {
108
+ const rest = loadRest();
109
+ // rest 世界四元数(插入序即先序,父先于子)
110
+ const restWorldQ = new Map();
111
+ for (const [name, info] of rest) {
112
+ const local = new Quaternion(...info.localQuat);
113
+ const parentQ = info.parent
114
+ ? restWorldQ.get(info.parent)
115
+ : new Quaternion();
116
+ restWorldQ.set(name, parentQ.clone().multiply(local));
117
+ }
118
+ const restDir = (bone) => new Vector3(0, 1, 0).applyQuaternion(restWorldQ.get(bone)).normalize();
119
+ const angleOf = (key, bone) => {
120
+ const entry = seedPosesQbx.find((e) => e.key === key);
121
+ if (!entry)
122
+ throw new Error(`种子缺 ${key}`);
123
+ const worldQ = new Map();
124
+ for (const [name, info] of rest) {
125
+ const local = new Quaternion(...(entry.bones[name]?.rotation ?? info.localQuat));
126
+ const parentQ = info.parent ? worldQ.get(info.parent) : new Quaternion();
127
+ worldQ.set(name, parentQ.clone().multiply(local));
128
+ }
129
+ const applied = new Vector3(0, 1, 0)
130
+ .applyQuaternion(worldQ.get(bone))
131
+ .normalize();
132
+ return ((Math.acos(Math.min(1, Math.max(-1, applied.dot(restDir(bone))))) * 180) /
133
+ Math.PI);
134
+ };
135
+ const FINGERS = ['Thumb', 'Index', 'Middle', 'Ring', 'Pinky'].flatMap((f) => [1, 2, 3].map((i) => `${f}${i}`));
136
+ // 平掌(stop):四指全伸 ≈ T 姿势,应与 rest 方向齐平(v1 世界方向数据
137
+ // 这里偏 50°+,naive 手腕系差 90°);拇指在 stop 里是侧向伸出的,与
138
+ // T 姿势放松拇指本就不同(源预览图可见),不应对齐——断言外展 >40°
139
+ for (const [side, s] of [
140
+ ['Left', 'l'],
141
+ ['Right', 'r'],
142
+ ]) {
143
+ for (const f of FINGERS) {
144
+ if (f.startsWith('Thumb'))
145
+ continue;
146
+ const a = angleOf(`qbx-hands-03-signs-stop-${s}`, `mixamorig${side}Hand${f}`);
147
+ if (a > 12)
148
+ throw new Error(`stop ${side} ${f} 与 rest 差 ${a.toFixed(1)}°`);
149
+ }
150
+ const thumb = angleOf(`qbx-hands-03-signs-stop-${s}`, `mixamorig${side}HandThumb1`);
151
+ if (thumb < 40)
152
+ throw new Error(`stop ${side} Thumb1 应外展,实测仅 ${thumb.toFixed(1)}°`);
153
+ }
154
+ // 放松(base):四指自然微蜷,相对 rest 小角度;绝不是 50° 级错位
155
+ for (const [side, s] of [
156
+ ['Left', 'l'],
157
+ ['Right', 'r'],
158
+ ]) {
159
+ for (const f of FINGERS) {
160
+ if (f.startsWith('Thumb'))
161
+ continue;
162
+ const a = angleOf(`qbx-hands-01-base-base-${s}`, `mixamorig${side}Hand${f}`);
163
+ if (a > 25)
164
+ throw new Error(`base ${side} ${f} 与 rest 差 ${a.toFixed(1)}°`);
165
+ }
166
+ }
167
+ // 握拳(fist):四指近节蜷 ≥40°、中末节 ≥100°
168
+ for (const [side, s] of [
169
+ ['Left', 'l'],
170
+ ['Right', 'r'],
171
+ ]) {
172
+ for (const f of ['Index', 'Middle', 'Ring', 'Pinky']) {
173
+ const a1 = angleOf(`qbx-hands-02-other-fist-${s}`, `mixamorig${side}Hand${f}1`);
174
+ if (a1 < 40)
175
+ throw new Error(`fist ${side} ${f}1 只蜷了 ${a1.toFixed(1)}°`);
176
+ const a2 = angleOf(`qbx-hands-02-other-fist-${s}`, `mixamorig${side}Hand${f}2`);
177
+ if (a2 < 100)
178
+ throw new Error(`fist ${side} ${f}2 只蜷了 ${a2.toFixed(1)}°`);
179
+ }
180
+ }
181
+ });
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 统一数据源(2026-10-10 spec §5):模型/姿势/动画数据完全由应用提供的
3
+ * 存储承担;模块附带的基础资产也走同一接口——一个接口、三种实现
4
+ * (内置目录 / 宿主生产存储 / 本地 IndexedDB 演示),零特判。
5
+ */
6
+ import type { EntryKind, LibraryEntry, RigAlias } from './types';
7
+ export type LibraryErrorCode = 'auth' | 'quota' | 'network' | 'conflict' | 'not-found' | 'unknown';
8
+ export declare class LibraryError extends Error {
9
+ readonly code: LibraryErrorCode;
10
+ readonly cause?: unknown;
11
+ constructor(code: LibraryErrorCode, message: string, cause?: unknown);
12
+ }
13
+ /** 源能力自描述(供 capabilities 查询;可写判别以 putEntry 存在性为准) */
14
+ export type LibrarySourceCapabilities = {
15
+ writable?: boolean;
16
+ permanentUrls?: boolean;
17
+ maxUploadBytes?: number;
18
+ };
19
+ /** 统一数据源(读) */
20
+ export interface LibrarySource {
21
+ readonly id: string;
22
+ listEntries(kind?: EntryKind): Promise<LibraryEntry[]>;
23
+ getEntry(id: string): Promise<LibraryEntry | undefined>;
24
+ /** 每个源自己解析自己的 blob:静态源→CDN 地址,HTTP 源→预签名,IDB→blob: */
25
+ getBlobUrl(blobId: string): Promise<string>;
26
+ capabilities?: LibrarySourceCapabilities;
27
+ /** 远端变更推送(可选,v1 不强制) */
28
+ subscribe?(fn: () => void): () => void;
29
+ }
30
+ /** 可写源 = 用户库(宿主生产存储 / 内置 IDB) */
31
+ export interface WritableLibrarySource extends LibrarySource {
32
+ putEntry(entry: LibraryEntry): Promise<void>;
33
+ deleteEntry(id: string): Promise<void>;
34
+ putBlob(data: Blob, opts?: {
35
+ onProgress?: (ratio: number) => void;
36
+ signal?: AbortSignal;
37
+ }): Promise<string>;
38
+ deleteBlob(blobId: string): Promise<void>;
39
+ getRigAliases(): Promise<RigAlias[]>;
40
+ putRigAlias(alias: RigAlias): Promise<void>;
41
+ /** 孤儿清扫用;HTTP 源不实现则跳过清扫 */
42
+ listBlobIds?(): Promise<string[]>;
43
+ }
44
+ export declare function isWritableSource(s: LibrarySource): s is WritableLibrarySource;
45
+ //# sourceMappingURL=source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/assetLibrary/source.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAA;AAE9D,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,OAAO,GACP,SAAS,GACT,UAAU,GACV,WAAW,GACX,SAAS,CAAA;AAEb,qBAAa,YAAa,SAAQ,KAAK;IAEnC,QAAQ,CAAC,IAAI,EAAE,gBAAgB;IAE/B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,gBAAgB,EAC/B,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,OAAO;CAK3B;AAED,qDAAqD;AACrD,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,eAAe;AACf,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACtD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAA;IACvD,sDAAsD;IACtD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,YAAY,CAAC,EAAE,yBAAyB,CAAA;IACxC,wBAAwB;IACxB,SAAS,CAAC,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CACvC;AAED,iCAAiC;AACjC,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,OAAO,CACL,IAAI,EAAE,IAAI,EACV,IAAI,CAAC,EAAE;QAAC,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAC,GAClE,OAAO,CAAC,MAAM,CAAC,CAAA;IAClB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IACpC,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,2BAA2B;IAC3B,WAAW,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;CAClC;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,IAAI,qBAAqB,CAE7E"}
@@ -0,0 +1,11 @@
1
+ export class LibraryError extends Error {
2
+ constructor(code, message, cause) {
3
+ super(message);
4
+ this.code = code;
5
+ this.cause = cause;
6
+ this.name = 'LibraryError';
7
+ }
8
+ }
9
+ export function isWritableSource(s) {
10
+ return typeof s.putEntry === 'function';
11
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=source.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.test.d.ts","sourceRoot":"","sources":["../../src/assetLibrary/source.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { LibraryError, isWritableSource } from './source';
2
+ test('LibraryError 携带 code 与 cause', () => {
3
+ const cause = new Error('boom');
4
+ const err = new LibraryError('quota', '配额已满', cause);
5
+ expect(err.code).toBe('quota');
6
+ expect(err.cause).toBe(cause);
7
+ expect(err instanceof Error).toBe(true);
8
+ });
9
+ test('isWritableSource:有 putEntry 才判定可写', () => {
10
+ const ro = {
11
+ id: 'ro',
12
+ listEntries: async () => [],
13
+ getEntry: async () => undefined,
14
+ getBlobUrl: async () => '',
15
+ };
16
+ const rw = {
17
+ ...ro,
18
+ id: 'rw',
19
+ putEntry: async () => { },
20
+ deleteEntry: async () => { },
21
+ putBlob: async () => 'x',
22
+ deleteBlob: async () => { },
23
+ getRigAliases: async () => [],
24
+ putRigAlias: async () => { },
25
+ };
26
+ expect(isWritableSource(ro)).toBe(false);
27
+ expect(isWritableSource(rw)).toBe(true);
28
+ });
@@ -0,0 +1,48 @@
1
+ import type { LibrarySource } from './source';
2
+ import type { SeedAssetsManifest } from './seedAssetsManifest';
3
+ import type { EntryKind, LibraryEntry, ModelEntry, PoseEntry } from './types';
4
+ /** 运行时缩略图渲染器:返回可用 URL(blob:/data:),渲染不了返回 undefined */
5
+ export type CatalogThumbRenderer<E extends LibraryEntry> = (entry: E) => Promise<string | undefined>;
6
+ export type StaticCatalogSourceOpts = {
7
+ /** 资产文件根(以 / 结尾);缺省惰性取包内 assets/ */
8
+ baseUrl?: string;
9
+ /** 缺省 = 入库的 seedAssetsManifest(测试可注入缩窄版) */
10
+ manifest?: SeedAssetsManifest;
11
+ /**
12
+ * 预留:宿主自定义取数(代理/鉴权 CDN)时用。源自身不发起网络——
13
+ * 静态文件纯拼 URL 交给 <img>/GLTFLoader 直接取,运行时缩略图由
14
+ * 注入的渲染器自行取数;当前实现不读取此字段。
15
+ */
16
+ fetcher?: typeof fetch;
17
+ renderPoseThumb?: CatalogThumbRenderer<PoseEntry>;
18
+ renderModelThumb?: CatalogThumbRenderer<ModelEntry>;
19
+ };
20
+ export declare class StaticCatalogSource implements LibrarySource {
21
+ readonly id = "catalog";
22
+ readonly capabilities: {
23
+ readonly writable: false;
24
+ readonly permanentUrls: true;
25
+ };
26
+ private readonly manifest;
27
+ private readonly renderPoseThumb?;
28
+ private readonly renderModelThumb?;
29
+ private readonly optsBaseUrl?;
30
+ private resolvedBaseUrl?;
31
+ private entriesById?;
32
+ /** 运行时缩略图 URL 缓存:渲染是 WebGL 离屏,同一 blobId 只渲染一次 */
33
+ private runtimeUrlCache;
34
+ constructor(opts?: StaticCatalogSourceOpts);
35
+ private baseUrl;
36
+ private buildEntries;
37
+ private entries;
38
+ listEntries(kind?: EntryKind): Promise<LibraryEntry[]>;
39
+ getEntry(id: string): Promise<LibraryEntry | undefined>;
40
+ /**
41
+ * blob 路由:静态文件纯拼 baseUrl(不探测可达性——配错由加载方
42
+ * 包 LibraryError('network') 上告,见 PlacementManager);运行时
43
+ * 缩略图调注入渲染器,结果按 blobId 内存缓存(不落地)。
44
+ */
45
+ getBlobUrl(blobId: string): Promise<string>;
46
+ private cachedRuntime;
47
+ }
48
+ //# sourceMappingURL=staticCatalogSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticCatalogSource.d.ts","sourceRoot":"","sources":["../../src/assetLibrary/staticCatalogSource.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,UAAU,CAAA;AAG3C,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAC5D,OAAO,KAAK,EAAC,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,SAAS,CAAA;AAE3E,uDAAuD;AACvD,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,YAAY,IAAI,CACzD,KAAK,EAAE,CAAC,KACL,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;AAEhC,MAAM,MAAM,uBAAuB,GAAG;IACpC,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACtB,eAAe,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAA;IACjD,gBAAgB,CAAC,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAA;CACpD,CAAA;AAaD,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,CAAC,EAAE,aAAY;IACvB,QAAQ,CAAC,YAAY;;;MAAkD;IAEvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiC;IAClE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAkC;IACpE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAQ;IACrC,OAAO,CAAC,eAAe,CAAC,CAAQ;IAChC,OAAO,CAAC,WAAW,CAAC,CAA2B;IAC/C,iDAAiD;IACjD,OAAO,CAAC,eAAe,CAAqC;gBAEhD,IAAI,GAAE,uBAA4B;IAO9C,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,OAAO;IAIT,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKtD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAI7D;;;;OAIG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0CjD,OAAO,CAAC,aAAa;CAoBtB"}
@@ -0,0 +1,140 @@
1
+ // packages/camera-studio/src/assetLibrary/staticCatalogSource.ts
2
+ /**
3
+ * 内置资产目录源(2026-10-10 内置资产目录化):随包发布的模型 GLB 与
4
+ * 姿势预览图,以只读 LibrarySource 形式并入聚合器——与宿主生产存储、
5
+ * 本地 IndexedDB 同一接口,零特判。
6
+ *
7
+ * - 条目来自入库清单(seedAssetsManifest,脚本生成)+ 姿势数据模块;
8
+ * 内置模型 id = seed-model-<contentHash>,姿势 id 保持 seed-pose-* 不变。
9
+ * - blobId 全部带 `catalog:` 前缀,聚合器按前缀路由回本源:
10
+ * catalog:models/<file> → baseUrl 静态文件(纯拼接,不探测)
11
+ * catalog:poseThumbs/<file> → 同上(QBX 手势源包预览图)
12
+ * catalog:runtime/model/<key> → 注入的 renderModelThumb(内存缓存)
13
+ * catalog:runtime/pose/<id> → 注入的 renderPoseThumb(内存缓存)
14
+ * - baseUrl 缺省惰性解析到包内 assets/(jest 不碰:测试一律显式注入)。
15
+ */
16
+ import { LibraryError } from './source';
17
+ import { buildBuiltinPoseEntries, builtinPoseRig } from './seedBuiltinPoses';
18
+ import { seedAssetsManifest } from './seedAssetsManifest';
19
+ const PREFIX = 'catalog:';
20
+ /**
21
+ * 包内 assets/ 的缺省根:src/assetLibrary/ 与 dist/assetLibrary/ 同层深,
22
+ * 两种形态都指到包根 assets/。必须惰性调用——import.meta.url 在 jest
23
+ * (CJS 变换)下不可用,模块加载期求值会让整条 import 链崩掉。
24
+ */
25
+ function defaultBaseUrl() {
26
+ return new URL('../../assets/', import.meta.url).href;
27
+ }
28
+ export class StaticCatalogSource {
29
+ constructor(opts = {}) {
30
+ this.id = 'catalog';
31
+ this.capabilities = { writable: false, permanentUrls: true };
32
+ /** 运行时缩略图 URL 缓存:渲染是 WebGL 离屏,同一 blobId 只渲染一次 */
33
+ this.runtimeUrlCache = new Map();
34
+ this.manifest = opts.manifest ?? seedAssetsManifest;
35
+ this.renderPoseThumb = opts.renderPoseThumb;
36
+ this.renderModelThumb = opts.renderModelThumb;
37
+ this.optsBaseUrl = opts.baseUrl;
38
+ }
39
+ baseUrl() {
40
+ if (!this.resolvedBaseUrl) {
41
+ const raw = this.optsBaseUrl ?? defaultBaseUrl();
42
+ this.resolvedBaseUrl = raw.endsWith('/') ? raw : raw + '/';
43
+ }
44
+ return this.resolvedBaseUrl;
45
+ }
46
+ buildEntries() {
47
+ const byId = new Map();
48
+ const thumbFileByKey = new Map(this.manifest.poseThumbs.map((t) => [t.key, t.file]));
49
+ for (const m of this.manifest.models) {
50
+ const entry = {
51
+ id: `seed-model-${m.contentHash}`,
52
+ kind: 'model',
53
+ name: m.name,
54
+ rig: m.rig,
55
+ blobId: `${PREFIX}models/${m.file}`,
56
+ contentHash: m.contentHash,
57
+ thumbnailId: `${PREFIX}runtime/model/${m.key}`,
58
+ boneCount: m.boneCount,
59
+ vertexCount: m.vertexCount,
60
+ // 内置条目 createdAt 恒 0:目录内容静态,固定值保证 id/排序稳定
61
+ createdAt: 0,
62
+ };
63
+ byId.set(entry.id, entry);
64
+ }
65
+ for (const p of buildBuiltinPoseEntries(builtinPoseRig(this.manifest))) {
66
+ const key = p.id.slice('seed-pose-'.length);
67
+ const thumbFile = thumbFileByKey.get(key);
68
+ byId.set(p.id, {
69
+ ...p,
70
+ thumbnailId: thumbFile
71
+ ? `${PREFIX}poseThumbs/${thumbFile}`
72
+ : `${PREFIX}runtime/pose/${p.id}`,
73
+ });
74
+ }
75
+ return byId;
76
+ }
77
+ entries() {
78
+ return (this.entriesById ?? (this.entriesById = this.buildEntries()));
79
+ }
80
+ async listEntries(kind) {
81
+ const all = [...this.entries().values()];
82
+ return kind ? all.filter((e) => e.kind === kind) : all;
83
+ }
84
+ async getEntry(id) {
85
+ return this.entries().get(id);
86
+ }
87
+ /**
88
+ * blob 路由:静态文件纯拼 baseUrl(不探测可达性——配错由加载方
89
+ * 包 LibraryError('network') 上告,见 PlacementManager);运行时
90
+ * 缩略图调注入渲染器,结果按 blobId 内存缓存(不落地)。
91
+ */
92
+ async getBlobUrl(blobId) {
93
+ if (!blobId.startsWith(PREFIX)) {
94
+ throw new LibraryError('not-found', `非内置目录 blob:${blobId}`);
95
+ }
96
+ const rest = blobId.slice(PREFIX.length);
97
+ if (rest.startsWith('models/') || rest.startsWith('poseThumbs/')) {
98
+ // 逐段编码:文件名可含空格('Y Bot.glb'),目录段不动
99
+ return this.baseUrl() + rest.split('/').map(encodeURIComponent).join('/');
100
+ }
101
+ if (rest.startsWith('runtime/model/')) {
102
+ const key = rest.slice('runtime/model/'.length);
103
+ // key 对上清单条目才认(渲染器按条目渲染,不认裸 key)
104
+ const asset = this.manifest.models.find((m) => m.key === key);
105
+ const entry = asset
106
+ ? this.entries().get(`seed-model-${asset.contentHash}`)
107
+ : undefined;
108
+ if (!this.renderModelThumb || !entry || entry.kind !== 'model') {
109
+ throw new LibraryError('not-found', `模型缩略图不可用(缺渲染器或未知条目):${blobId}`);
110
+ }
111
+ return this.cachedRuntime(blobId, () => this.renderModelThumb(entry));
112
+ }
113
+ if (rest.startsWith('runtime/pose/')) {
114
+ const id = rest.slice('runtime/pose/'.length);
115
+ const entry = this.entries().get(id);
116
+ if (!this.renderPoseThumb || !entry || entry.kind !== 'pose') {
117
+ throw new LibraryError('not-found', `姿势缩略图不可用(缺渲染器或未知条目):${blobId}`);
118
+ }
119
+ return this.cachedRuntime(blobId, () => this.renderPoseThumb(entry));
120
+ }
121
+ throw new LibraryError('not-found', `未知内置目录 blob:${blobId}`);
122
+ }
123
+ cachedRuntime(blobId, render) {
124
+ let cached = this.runtimeUrlCache.get(blobId);
125
+ if (!cached) {
126
+ cached = render().then((url) => {
127
+ if (!url) {
128
+ // 渲染不可用(GL 缺失等):不缓存,下次重试;按 not-found 降级
129
+ this.runtimeUrlCache.delete(blobId);
130
+ throw new LibraryError('not-found', `缩略图渲染不可用:${blobId}`);
131
+ }
132
+ return url;
133
+ });
134
+ this.runtimeUrlCache.set(blobId, cached);
135
+ // 注入渲染器自身抛错也不缓存(瞬时故障可重试)
136
+ cached.catch(() => this.runtimeUrlCache.delete(blobId));
137
+ }
138
+ return cached;
139
+ }
140
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=staticCatalogSource.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staticCatalogSource.test.d.ts","sourceRoot":"","sources":["../../src/assetLibrary/staticCatalogSource.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * StaticCatalogSource(内置资产目录源)契约:
3
+ * - 条目来自入库清单 + 姿势数据模块,数量一律数据驱动(不写死);
4
+ * - 内置模型 id = seed-model-<contentHash>,姿势 id 保持 seed-pose-*;
5
+ * - blobId 全部带 catalog: 前缀,聚合器按前缀路由回本源;
6
+ * - 静态文件(models/poseThumbs)纯拼接 baseUrl 不探测;
7
+ * - 运行时缩略图(模型/身体姿势)走注入渲染器,内存缓存,缺注入抛 not-found;
8
+ * - 清单 rig 与运行时 FBX 解析同一判定(parity 兜底)。
9
+ */
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ import { FBXLoader } from 'three-stdlib';
13
+ import { WebIO } from '@gltf-transform/core';
14
+ import { ALL_EXTENSIONS } from '@gltf-transform/extensions';
15
+ import draco3dgltf from 'draco3dgltf';
16
+ import { LibraryError } from './source';
17
+ import { StaticCatalogSource } from './staticCatalogSource';
18
+ import { buildBuiltinPoseEntries } from './seedBuiltinPoses';
19
+ import { seedAssetsManifest } from './seedAssetsManifest';
20
+ import { seedPoses } from './seedPoses';
21
+ import { seedPosesDpl } from './seedPosesDpl';
22
+ import { seedPosesQbx } from './seedPosesQbx';
23
+ import { collectBoneNames, rigIdOf } from './rig';
24
+ import { Library } from './library';
25
+ import { loadLibraryModel } from '../PlacementManager';
26
+ const BASE = 'https://cdn.example.com/a/';
27
+ describe('StaticCatalogSource', () => {
28
+ test('目录源:条目齐全,id 前缀与 blobId 路由正确', async () => {
29
+ const src = new StaticCatalogSource({ baseUrl: BASE });
30
+ const models = (await src.listEntries('model'));
31
+ const poses = (await src.listEntries('pose'));
32
+ // 数据驱动计数:清单与姿势数据模块是唯一事实源
33
+ expect(models).toHaveLength(seedAssetsManifest.models.length);
34
+ expect(poses).toHaveLength(buildBuiltinPoseEntries().length);
35
+ expect(poses).toHaveLength(seedPoses.length + seedPosesDpl.length + seedPosesQbx.length);
36
+ expect(models.every((m) => m.id.startsWith('seed-model-'))).toBe(true);
37
+ expect(poses.every((p) => p.id.startsWith('seed-pose-'))).toBe(true);
38
+ // 模型 blobId 带 catalog: 前缀,聚合器按前缀路由;URL 纯拼接
39
+ expect(models.every((m) => m.blobId.startsWith('catalog:models/'))).toBe(true);
40
+ const url = await src.getBlobUrl(models[0].blobId);
41
+ expect(url.startsWith(`${BASE}models/`)).toBe(true);
42
+ // getEntry 按 id 直查
43
+ expect(await src.getEntry(models[0].id)).toMatchObject({ id: models[0].id });
44
+ expect(await src.getEntry('seed-pose-nope')).toBeUndefined();
45
+ // 不分 kind 时全量返回
46
+ expect(await src.listEntries()).toHaveLength(models.length + poses.length);
47
+ // 只读目录:不可写,URL 长效可跨挂载缓存
48
+ expect(src.capabilities).toMatchObject({
49
+ writable: false,
50
+ permanentUrls: true,
51
+ });
52
+ });
53
+ test('QBX 预览图走静态文件;身体姿势缩略图走注入渲染器(内存缓存,不落地)', async () => {
54
+ const renderPoseThumb = jest.fn(async () => 'data:image/png;base64,x');
55
+ const src = new StaticCatalogSource({
56
+ baseUrl: BASE,
57
+ renderPoseThumb,
58
+ });
59
+ const poses = (await src.listEntries('pose'));
60
+ // QBX 子集 = 手势数据模块全量,且每个 key 都命中清单预览图
61
+ const qbx = poses.filter((p) => p.id.startsWith('seed-pose-qbx-'));
62
+ expect(qbx).toHaveLength(seedPosesQbx.length);
63
+ expect(qbx.every((p) => p.thumbnailId?.startsWith('catalog:poseThumbs/'))).toBe(true);
64
+ const qbx0 = poses.find((p) => p.id === 'seed-pose-qbx-hands-01-base-base-l');
65
+ expect(await src.getBlobUrl(qbx0.thumbnailId)).toContain(`${BASE}poseThumbs/`);
66
+ // 非 QBX(身体姿势):thumbnailId 走运行时渲染,渲染结果内存缓存
67
+ const dpl = poses.find((p) => !p.id.startsWith('seed-pose-qbx-'));
68
+ expect(dpl.thumbnailId).toBe(`catalog:runtime/pose/${dpl.id}`);
69
+ const t1 = await src.getBlobUrl(dpl.thumbnailId);
70
+ const t2 = await src.getBlobUrl(dpl.thumbnailId);
71
+ expect(t1).toBe('data:image/png;base64,x');
72
+ expect(renderPoseThumb).toHaveBeenCalledTimes(1); // 内存缓存
73
+ expect(t2).toBe(t1);
74
+ });
75
+ test('模型缩略图走 renderModelThumb 注入;缺注入抛 LibraryError(not-found)', async () => {
76
+ const renderModelThumb = jest.fn(async () => 'blob:model-thumb');
77
+ const src = new StaticCatalogSource({ baseUrl: BASE, renderModelThumb });
78
+ const [model] = (await src.listEntries('model'));
79
+ // thumbnailId = catalog:runtime/model/<key>,key 来自清单
80
+ const key = seedAssetsManifest.models[0].key;
81
+ expect(model.thumbnailId).toBe(`catalog:runtime/model/${key}`);
82
+ expect(await src.getBlobUrl(model.thumbnailId)).toBe('blob:model-thumb');
83
+ expect(renderModelThumb).toHaveBeenCalledTimes(1);
84
+ const bare = new StaticCatalogSource({ baseUrl: BASE });
85
+ await expect(bare.getBlobUrl(model.thumbnailId)).rejects.toThrow(LibraryError);
86
+ await expect(bare.getBlobUrl(model.thumbnailId)).rejects.toMatchObject({
87
+ code: 'not-found',
88
+ });
89
+ // 未知 blobId / 非本目录前缀同样 not-found
90
+ await expect(bare.getBlobUrl('catalog:bogus/x')).rejects.toMatchObject({
91
+ code: 'not-found',
92
+ });
93
+ });
94
+ test('清单 rig 与运行时解析一致(FBXLoader + rigIdOf 同一函数)', async () => {
95
+ // 清单 rig 来自生成脚本对 FBX 的 rigIdOf;这里独立重算一遍兜底
96
+ const fbxPath = path.resolve(__dirname, '../../scripts/pose-pipeline/models/Y Bot.fbx');
97
+ const buf = fs.readFileSync(fbxPath);
98
+ const root = new FBXLoader().parse(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength), '');
99
+ const manifestModel = seedAssetsManifest.models.find((m) => m.name === 'Y Bot');
100
+ expect(manifestModel.rig).toBe(rigIdOf(root));
101
+ expect(manifestModel.boneCount).toBe(collectBoneNames(root).length);
102
+ // GLB 产物完整性:skins joints 名是 FBX 骨名子集(转换丢骨/改名回归)。
103
+ // WebIO.readBinary 在 jest 可用(draco.test.ts 先例);NodeIO 的
104
+ // 动态 import fs 会被 jest 拦,不用
105
+ const glb = fs.readFileSync(path.resolve(__dirname, '../../assets/models', manifestModel.file));
106
+ const io = new WebIO()
107
+ .registerExtensions(ALL_EXTENSIONS)
108
+ .registerDependencies({
109
+ 'draco3d.decoder': await draco3dgltf.createDecoderModule(),
110
+ });
111
+ const doc = await io.readBinary(new Uint8Array(glb));
112
+ const fbxNames = new Set(collectBoneNames(root));
113
+ const joints = new Set();
114
+ for (const skin of doc.getRoot().listSkins()) {
115
+ for (const j of skin.listJoints())
116
+ joints.add(j.getName());
117
+ }
118
+ expect(joints.size).toBeGreaterThan(0);
119
+ expect([...joints].every((n) => fbxNames.has(n))).toBe(true);
120
+ });
121
+ test('姿势条目 rig 与清单族代表模型一致(用户导入同款模型才能匹配)', async () => {
122
+ const src = new StaticCatalogSource({ baseUrl: BASE });
123
+ const rig = seedAssetsManifest.models.find((m) => m.name === 'Y Bot').rig;
124
+ const poses = await src.listEntries('pose');
125
+ expect(poses.every((p) => p.rig === rig)).toBe(true);
126
+ });
127
+ test('baseUrl 配错:GLB 加载失败走 LibraryError(network),选择框数据照常', async () => {
128
+ const src = new StaticCatalogSource({ baseUrl: 'https://bad.example/' });
129
+ // getBlobUrl 纯拼接不探测:
130
+ expect(await src.getBlobUrl('catalog:models/x.glb')).toContain('bad.example');
131
+ // 选择框数据照常:条目列表与 baseUrl 可达性无关
132
+ const errors = [];
133
+ const lib = new Library({
134
+ sources: [src],
135
+ onError: (e) => errors.push(e),
136
+ });
137
+ const models = await lib.listEntries('model');
138
+ expect(models).toHaveLength(seedAssetsManifest.models.length);
139
+ // PlacementManager 加载失败 → LibraryError network(fetcher stub 驱动)
140
+ const origFetch = globalThis.fetch;
141
+ globalThis.fetch = (async () => {
142
+ throw new Error('ENOTFOUND bad.example');
143
+ });
144
+ try {
145
+ await expect(loadLibraryModel(models[0].id, lib)).rejects.toMatchObject({
146
+ code: 'network',
147
+ });
148
+ }
149
+ finally {
150
+ globalThis.fetch = origFetch;
151
+ }
152
+ expect(errors.some((e) => e.code === 'network')).toBe(true);
153
+ });
154
+ });