cozyclay 2.1.1 → 3.0.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 (577) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +12 -30
  3. package/bin/agent/agent-routes.mjs +40 -113
  4. package/bin/agent/agent-runner.mjs +9 -10
  5. package/bin/agent/cliproxy-provider.mjs +135 -0
  6. package/bin/agent/credential-store.mjs +30 -7
  7. package/bin/agent/pi-tools.mjs +4 -1
  8. package/bin/agent/provider-keys.mjs +32 -0
  9. package/bin/agent/provider-login.mjs +110 -0
  10. package/bin/agent/provider-routes.mjs +99 -0
  11. package/bin/agent/providers.mjs +19 -97
  12. package/bin/agent/script-tool.mjs +17 -4
  13. package/bin/agent/studio-motion-reference.mjs +23 -0
  14. package/bin/agent/studio-prompt.mjs +1 -1
  15. package/bin/agent/studio-rebase-text.mjs +32 -0
  16. package/bin/agent/studio-rebase.mjs +26 -39
  17. package/bin/agent/studio-tools.mjs +9 -28
  18. package/bin/agent/tool-arguments.mjs +49 -0
  19. package/bin/agent/turn-frames.mjs +66 -0
  20. package/bin/codex-auth.mjs +9 -2
  21. package/bin/cozyclay.mjs +10 -116
  22. package/bin/live/cli.mjs +3 -3
  23. package/bin/mcp-runtime.mjs +2 -12
  24. package/bin/package-signature.mjs +0 -4
  25. package/dist/app/index.html +7 -6
  26. package/dist/assets/EXRLoader-CvVIvGVE.js +1 -0
  27. package/dist/assets/analytics-C9sUnndd.js +1 -0
  28. package/dist/assets/app-CCh--1Hc.js +5087 -0
  29. package/dist/assets/app-f-fkV5uP.css +1 -0
  30. package/dist/assets/compile-worker-CkxiD6lH.js +5 -0
  31. package/dist/assets/fflate.module-KbGj5-H6.js +5 -0
  32. package/dist/assets/{first-shot-handoff-msLI71g1.js → first-shot-handoff-CC4xe4HM.js} +1 -1
  33. package/dist/assets/{landing-ChUvB_zL.js → landing-DjHD8u7k.js} +1 -1
  34. package/dist/assets/scene-asset-sync-Hx_FzdOH.js +20 -0
  35. package/dist/assets/scene-asset-sync-_S8NQl5B.css +1 -0
  36. package/dist/assets/workflow-C4yKH1p4.js +179 -0
  37. package/dist/cozyclay-package.json +1 -1
  38. package/dist/index.html +3 -3
  39. package/dist/sw.js +3 -6
  40. package/dist/workflow/index.html +5 -4
  41. package/mcp/LIVE-PROTOCOL.md +7 -47
  42. package/mcp/README.md +16 -26
  43. package/mcp/live-hub.mjs +6 -10
  44. package/mcp/package.json +1 -3
  45. package/mcp/tool-handlers.mjs +4 -168
  46. package/package.json +3 -22
  47. package/src/App.jsx +150 -2624
  48. package/src/agent-progress.js +79 -0
  49. package/src/agent-turn-mark.js +30 -0
  50. package/src/analytics.js +1 -19
  51. package/src/app-context.js +5 -0
  52. package/src/app-stage.jsx +2 -34
  53. package/src/asset-pane.jsx +6 -5
  54. package/src/camera-block.js +21 -0
  55. package/src/camera-direction.js +120 -0
  56. package/src/character-kind.js +3 -9
  57. package/src/command-bus.js +8 -6
  58. package/src/commands/cast.js +5 -34
  59. package/src/commands/elements/character.js +1 -1
  60. package/src/commands/elements/motion.js +1 -6
  61. package/src/commands/elements/object.js +6 -2
  62. package/src/commands/elements/shot.js +4 -1
  63. package/src/commands/elements.js +38 -14
  64. package/src/commands/index.js +3 -1
  65. package/src/commands/kits.js +37 -0
  66. package/src/commands/motion-timing.js +57 -0
  67. package/src/commands/motion.js +9 -152
  68. package/src/commands/motion3-compile.js +65 -0
  69. package/src/commands/motion3.js +207 -0
  70. package/src/commands/objects.js +6 -4
  71. package/src/commands/shot.js +49 -11
  72. package/src/commands/stage.js +14 -1
  73. package/src/commands/view.js +4 -1
  74. package/src/document-mirrors.js +42 -0
  75. package/src/document-store.js +4 -0
  76. package/src/domains/cast.js +19 -194
  77. package/src/domains/motion/motion-range-pin-rules.js +1 -1
  78. package/src/domains/motion/take-source.js +51 -0
  79. package/src/domains/motion.js +60 -1838
  80. package/src/domains/scenes.js +12 -55
  81. package/src/domains/shots.js +2 -2
  82. package/src/domains/stage.js +4 -2
  83. package/src/draft-ghost.js +46 -0
  84. package/src/draft-ghost.jsx +129 -0
  85. package/src/dualview.jsx +4 -3
  86. package/src/effects/EffectsLayer.jsx +112 -0
  87. package/src/effects/effect-meshes.js +232 -0
  88. package/src/effects/effect-record.js +103 -0
  89. package/src/effects/emitter.js +59 -0
  90. package/src/effects/simulate.js +261 -0
  91. package/src/effects/state.js +59 -0
  92. package/src/execution-telemetry.js +2 -3
  93. package/src/first-success-guide.jsx +5 -5
  94. package/src/ghost-set.js +257 -0
  95. package/src/held-object-edit.jsx +113 -0
  96. package/src/held-object-pose.js +175 -0
  97. package/src/hierarchy-model.js +1 -1
  98. package/src/hierarchy-panel.jsx +1 -1
  99. package/src/imported-mesh.jsx +103 -0
  100. package/src/kits/held.js +84 -0
  101. package/src/kits/index.js +70 -0
  102. package/src/kits/smoking.js +57 -0
  103. package/src/light-blockers.js +93 -0
  104. package/src/motion/beat-board-model.js +84 -0
  105. package/src/motion/beat-board.css +124 -0
  106. package/src/motion/beat-board.jsx +59 -0
  107. package/src/motion/center-of-mass.js +66 -0
  108. package/src/motion/fix-collisions.js +850 -0
  109. package/src/motion/physics-review.js +118 -0
  110. package/src/{ardy → motion}/physics-support.js +1 -76
  111. package/src/motion/rig-snapshot.js +22 -0
  112. package/src/motion/take-segments.jsx +140 -0
  113. package/src/{ardy → motion}/timeline-coordinates.js +0 -21
  114. package/src/{ardy → motion}/timeline.css +1 -2
  115. package/src/{ardy → motion}/timeline.jsx +42 -413
  116. package/src/motion/waypoints.js +76 -0
  117. package/src/motion3/beats.js +83 -0
  118. package/src/motion3/body.js +158 -0
  119. package/src/motion3/bones.js +47 -0
  120. package/src/motion3/carried.js +47 -0
  121. package/src/motion3/compile-job.js +75 -0
  122. package/src/motion3/compile-worker.js +10 -0
  123. package/src/motion3/compiler/anchors.js +105 -0
  124. package/src/motion3/compiler/arm-orient.js +128 -0
  125. package/src/motion3/compiler/channels.js +125 -0
  126. package/src/motion3/compiler/compile.js +205 -0
  127. package/src/motion3/compiler/gait-rhythm.js +97 -0
  128. package/src/motion3/compiler/grip.js +171 -0
  129. package/src/motion3/compiler/head-steady.js +48 -0
  130. package/src/motion3/compiler/hold.js +134 -0
  131. package/src/motion3/compiler/idle.js +113 -0
  132. package/src/motion3/compiler/limbs.js +170 -0
  133. package/src/motion3/compiler/math.js +72 -0
  134. package/src/motion3/compiler/pose.js +162 -0
  135. package/src/motion3/compiler/quat.js +49 -0
  136. package/src/motion3/compiler/skeleton.js +74 -0
  137. package/src/motion3/compiler/validate-common.js +32 -0
  138. package/src/motion3/compiler/validate-goals.js +118 -0
  139. package/src/motion3/compiler/validate-objects.js +143 -0
  140. package/src/motion3/compiler/validate-parts.js +116 -0
  141. package/src/motion3/compiler/validate.js +122 -0
  142. package/src/motion3/compiler/vocab.js +73 -0
  143. package/src/motion3/compiler/walk-pelvis.js +275 -0
  144. package/src/motion3/compiler/walk.js +207 -0
  145. package/src/motion3/compiler/wrist-clamp.js +32 -0
  146. package/src/motion3/delta.js +47 -0
  147. package/src/motion3/describe.js +174 -0
  148. package/src/motion3/docs.js +27 -0
  149. package/src/motion3/edit-carry.js +21 -0
  150. package/src/motion3/fix/ease.js +16 -0
  151. package/src/motion3/fix/ground.js +37 -0
  152. package/src/motion3/fix/index.js +52 -0
  153. package/src/motion3/fix/push.js +71 -0
  154. package/src/motion3/fix/reach.js +46 -0
  155. package/src/motion3/fix/retime.js +79 -0
  156. package/src/motion3/fix/self.js +211 -0
  157. package/src/motion3/fix/slide.js +70 -0
  158. package/src/motion3/fix/turn.js +51 -0
  159. package/src/motion3/follow.js +39 -0
  160. package/src/motion3/free-motion.js +173 -0
  161. package/src/motion3/grip-choice.js +130 -0
  162. package/src/motion3/hold-plan.js +157 -0
  163. package/src/motion3/json-patch.js +77 -0
  164. package/src/motion3/key-aim.js +105 -0
  165. package/src/motion3/key-edit.js +82 -0
  166. package/src/motion3/lenient.js +127 -0
  167. package/src/motion3/object-keys.js +236 -0
  168. package/src/motion3/object-pose.js +182 -0
  169. package/src/motion3/object-tracks.js +12 -0
  170. package/src/motion3/pipeline.js +102 -0
  171. package/src/motion3/playback.js +51 -0
  172. package/src/motion3/probes.js +91 -0
  173. package/src/motion3/qa/body-checks.js +34 -0
  174. package/src/motion3/qa/check-names.js +14 -0
  175. package/src/motion3/qa/checks.js +121 -0
  176. package/src/motion3/qa/contact-checks.js +51 -0
  177. package/src/motion3/qa/explain.js +80 -0
  178. package/src/motion3/qa/fmt.js +5 -0
  179. package/src/motion3/qa/foot-checks.js +72 -0
  180. package/src/motion3/qa/geometry.js +77 -0
  181. package/src/motion3/qa/goals.js +191 -0
  182. package/src/motion3/qa/ground.js +60 -0
  183. package/src/motion3/qa/hints-contact.js +179 -0
  184. package/src/motion3/qa/hints-goal.js +160 -0
  185. package/src/motion3/qa/hints-knee.js +24 -0
  186. package/src/motion3/qa/hints-motion.js +209 -0
  187. package/src/motion3/qa/hints-object.js +91 -0
  188. package/src/motion3/qa/index.js +42 -0
  189. package/src/motion3/qa/key-checks.js +82 -0
  190. package/src/motion3/qa/near.js +96 -0
  191. package/src/motion3/qa/object-checks.js +135 -0
  192. package/src/motion3/qa/patch.js +161 -0
  193. package/src/motion3/qa/severity.js +38 -0
  194. package/src/motion3/qa/spec-checks.js +65 -0
  195. package/src/motion3/qa/style.js +218 -0
  196. package/src/motion3/qa/wrist-checks.js +69 -0
  197. package/src/motion3/qa/wrist-obs.js +60 -0
  198. package/src/motion3/refs.js +120 -0
  199. package/src/motion3/repair-tune.js +121 -0
  200. package/src/motion3/repair.js +83 -0
  201. package/src/motion3/report.js +67 -0
  202. package/src/motion3/rigs/index.js +14 -0
  203. package/src/motion3/rigs/x-bot-tpose-body.json +1 -0
  204. package/src/motion3/rigs/x-bot-tpose.json +1 -0
  205. package/src/motion3/rigs/y-bot-tpose-body.json +1 -0
  206. package/src/motion3/rigs/y-bot-tpose.json +1 -0
  207. package/src/motion3/scene.js +60 -0
  208. package/src/motion3/schema/brief.js +89 -0
  209. package/src/motion3/schema/fields.js +44 -0
  210. package/src/motion3/schema/spec-examples.js +46 -0
  211. package/src/motion3/schema/topics.js +111 -0
  212. package/src/motion3/schema/types.js +147 -0
  213. package/src/motion3/search.js +117 -0
  214. package/src/motion3/second-hand.js +112 -0
  215. package/src/motion3/skills/basic.js +82 -0
  216. package/src/motion3/skills/book.js +76 -0
  217. package/src/motion3/skills/car.js +145 -0
  218. package/src/motion3/skills/frames-auto.js +29 -0
  219. package/src/motion3/skills/index.js +83 -0
  220. package/src/motion3/skills/info.js +65 -0
  221. package/src/motion3/skills/smoke-kit.js +109 -0
  222. package/src/motion3/skills/smoke.js +160 -0
  223. package/src/motion3/spec-store.js +59 -0
  224. package/src/motion3/take-edit.js +155 -0
  225. package/src/motion3/take.js +63 -0
  226. package/src/motion3/timeline.js +127 -0
  227. package/src/motion3/views.js +121 -0
  228. package/src/motion3/walk-plan.js +119 -0
  229. package/src/object-catalog.jsx +7 -1
  230. package/src/object-colors.js +98 -0
  231. package/src/object-gizmo-parts.js +115 -0
  232. package/src/object-gizmo.jsx +37 -122
  233. package/src/object-glow.js +139 -0
  234. package/src/object-hidden.js +33 -0
  235. package/src/object-look.js +196 -0
  236. package/src/object-size.js +10 -0
  237. package/src/object-travel.js +71 -6
  238. package/src/panels/CameraPanel.jsx +7 -7
  239. package/src/panels/HdrEnvironmentControls.jsx +59 -0
  240. package/src/panels/LightPanel.jsx +25 -4
  241. package/src/panels/ObjectLookPanel.jsx +88 -0
  242. package/src/panels/PosePanel.jsx +2 -17
  243. package/src/panels/RigControlPanel.jsx +5 -53
  244. package/src/panels/SubjectBox.jsx +4 -1
  245. package/src/panels/details.css +14 -0
  246. package/src/posestudio.jsx +4 -27
  247. package/src/project-browser.jsx +3 -4
  248. package/src/project-resources.js +18 -31
  249. package/src/project.js +13 -104
  250. package/src/props.jsx +25 -280
  251. package/src/rail-dot-drag.js +23 -0
  252. package/src/render-passes.js +10 -0
  253. package/src/resource-status.jsx +1 -0
  254. package/src/result-modal.jsx +4 -19
  255. package/src/room.jsx +20 -12
  256. package/src/scene-assets.js +8 -6
  257. package/src/scene-light-place.js +72 -0
  258. package/src/scene-lights.jsx +148 -0
  259. package/src/scene-objects.js +31 -139
  260. package/src/scenes.js +15 -105
  261. package/src/semantic-edit.js +2 -5
  262. package/src/set-pieces.jsx +183 -0
  263. package/src/settings-menu.jsx +3 -11
  264. package/src/shell/BottomDock.jsx +9 -51
  265. package/src/shell/DetailsSlot.jsx +16 -200
  266. package/src/shell/GhostsMenuGroup.jsx +74 -0
  267. package/src/shell/LibrarySlot.jsx +1 -3
  268. package/src/shell/MenuBar.jsx +3 -3
  269. package/src/shell/PreferencesDialog.jsx +15 -264
  270. package/src/shell/PreferencesSlot.jsx +2 -8
  271. package/src/shell/TopBar.jsx +5 -84
  272. package/src/shell/ViewportToolbar.jsx +10 -70
  273. package/src/shell/agent-glass.css +19 -6
  274. package/src/shell/details-selection.js +42 -0
  275. package/src/shell/ghosts-menu.css +22 -0
  276. package/src/shell/glass-regions.css +29 -3
  277. package/src/shell/preferences.css +6 -1
  278. package/src/shot-authoring.js +4 -7
  279. package/src/soft-shadows.js +37 -0
  280. package/src/stage-attach-frames.js +12 -12
  281. package/src/stage-canvas-rigs.jsx +3 -3
  282. package/src/stage-capture.jsx +42 -8
  283. package/src/stage-characters.jsx +22 -216
  284. package/src/stage-editor-gizmos.jsx +6 -6
  285. package/src/stage-environment.js +93 -0
  286. package/src/stage-hdr-builtins.js +107 -0
  287. package/src/stage-hdr-image.js +116 -0
  288. package/src/stage-hdr-library.js +70 -0
  289. package/src/stage-hdr-map.js +94 -0
  290. package/src/stage-hdr.js +130 -0
  291. package/src/stage-lighting.js +149 -0
  292. package/src/stage-occlusion.js +210 -0
  293. package/src/stage-sky.jsx +159 -0
  294. package/src/stage-startup-defaults.js +5 -9
  295. package/src/studio-actions.js +12 -14
  296. package/src/studio-agent-commands.js +19 -16
  297. package/src/studio-agent-motion.js +9 -9
  298. package/src/studio-agent-protocol.js +41 -71
  299. package/src/studio-app-binding.js +25 -45
  300. package/src/studio-asset-list.js +17 -0
  301. package/src/studio-contact-sheet.js +37 -5
  302. package/src/studio-elements.js +27 -7
  303. package/src/studio-entity-bounds.js +18 -0
  304. package/src/studio-error-codes.js +8 -0
  305. package/src/studio-export-framing.js +152 -0
  306. package/src/studio-lighting-check.js +103 -0
  307. package/src/studio-motion-visual.js +150 -0
  308. package/src/studio-schema-errors.js +80 -0
  309. package/src/studio-support-gap.js +74 -0
  310. package/src/styles.css +1 -19
  311. package/src/timeline-defaults.js +5 -0
  312. package/src/timeline-extent.js +8 -20
  313. package/src/tutorial-walk.js +17 -0
  314. package/src/ui-scrub.js +1 -1
  315. package/src/use-shot-camera-tracks.js +12 -0
  316. package/src/view-ghosts.js +97 -0
  317. package/src/view-ghosts.jsx +49 -0
  318. package/src/workflow/AgentPanel.jsx +47 -166
  319. package/src/workflow/AgentProgressCard.jsx +107 -0
  320. package/src/workflow/AgentReplyText.jsx +37 -0
  321. package/src/workflow/AgentTurnSteps.jsx +84 -0
  322. package/src/workflow/LoginPanel.jsx +140 -0
  323. package/src/workflow/WorkflowBuilder.jsx +7 -23
  324. package/src/workflow/agent-client.js +54 -51
  325. package/src/workflow/agent-panel.css +71 -1
  326. package/src/workflow/agent-progress-card.css +167 -0
  327. package/src/workflow/agent-progress-view.js +47 -0
  328. package/src/workflow/agent-turn-steps.css +113 -0
  329. package/src/workflow/agent-turn.js +191 -0
  330. package/src/workflow/login-client.js +34 -0
  331. package/src/workflow/motion-input.js +18 -31
  332. package/src/workflow/node-schema.js +1 -1
  333. package/src/workflow/reply-markdown.js +69 -0
  334. package/src/workflow/scene-asset-sync.js +8 -8
  335. package/tools/agent-session-stats.mjs +61 -0
  336. package/tools/dev-full.mjs +5 -56
  337. package/tools/eslint-baseline.json +12 -13
  338. package/tools/knip-baseline.json +0 -179
  339. package/tools/loc-baseline.json +31 -81
  340. package/tools/motion3/extract-body.mjs +103 -0
  341. package/tools/motion3/extract-rig.mjs +85 -0
  342. package/tools/process-supervisor.mjs +0 -88
  343. package/tools/run-tests.mjs +8 -124
  344. package/bin/agent/motion-runtime.mjs +0 -76
  345. package/dist/ardy/cskel27-rest.json +0 -557
  346. package/dist/assets/analytics-C9pMpW7s.js +0 -1
  347. package/dist/assets/app-B_2XB9rw.css +0 -1
  348. package/dist/assets/app-DAuvKPP8.js +0 -4920
  349. package/dist/assets/config-Bx7pYsD9.js +0 -1
  350. package/dist/assets/config-DeoFTYzb.css +0 -1
  351. package/dist/assets/demo-CvKuBgy5.js +0 -1
  352. package/dist/assets/scene-asset-sync-DKkpjKBV.js +0 -19
  353. package/dist/assets/scene-asset-sync-DjJ_cJ2R.css +0 -1
  354. package/dist/assets/ticket-BPk2Ni95.js +0 -1
  355. package/dist/assets/workflow-jJRBR94Z.js +0 -179
  356. package/dist/demo/walk-then-stop.npz +0 -0
  357. package/mcp/ardy-prompts.mjs +0 -218
  358. package/src/ardy/auto-fix-panel.css +0 -108
  359. package/src/ardy/auto-physics.js +0 -1194
  360. package/src/ardy/client.js +0 -153
  361. package/src/ardy/convert.js +0 -313
  362. package/src/ardy/cskel27-neutral.js +0 -39
  363. package/src/ardy/cskel27.js +0 -77
  364. package/src/ardy/export.js +0 -165
  365. package/src/ardy/fix-collisions.js +0 -2257
  366. package/src/ardy/foot-lock.js +0 -230
  367. package/src/ardy/motion-calibration.js +0 -118
  368. package/src/ardy/motion-edit.js +0 -213
  369. package/src/ardy/motion-url.js +0 -55
  370. package/src/ardy/mp4-duration.js +0 -102
  371. package/src/ardy/npz.js +0 -595
  372. package/src/ardy/physics-panel.css +0 -21
  373. package/src/ardy/physics-panel.jsx +0 -89
  374. package/src/ardy/physics-refine.js +0 -111
  375. package/src/ardy/physics-review.js +0 -567
  376. package/src/ardy/physics-temporal.js +0 -54
  377. package/src/ardy/platform-fit-panel.css +0 -64
  378. package/src/ardy/platform-fit-panel.jsx +0 -41
  379. package/src/ardy/platform-fit.js +0 -326
  380. package/src/ardy/playback.js +0 -711
  381. package/src/ardy/pose-pin.js +0 -97
  382. package/src/ardy/prompt-clips.js +0 -30
  383. package/src/ardy/retime.js +0 -211
  384. package/src/ardy/root-drop.js +0 -369
  385. package/src/ardy/timeline-resize.js +0 -13
  386. package/src/ardy/to-cskel27.js +0 -225
  387. package/src/ardy/trim.js +0 -33
  388. package/src/ardy/waypoints.js +0 -369
  389. package/src/ardy-bridge-contract.js +0 -281
  390. package/src/domains/motion/motion-video-capture.js +0 -664
  391. package/src/i2v-motion-client.js +0 -77
  392. package/src/i2v-motion-studio.jsx +0 -180
  393. package/src/line-edit.js +0 -1348
  394. package/src/motion/generation.js +0 -105
  395. package/src/motion-readiness-ui.jsx +0 -67
  396. package/src/motion-readiness.js +0 -40
  397. package/src/motion-resources.js +0 -177
  398. package/src/motion-store.js +0 -65
  399. package/src/motion-trail.js +0 -601
  400. package/src/multimodel-ingest.js +0 -394
  401. package/src/panels/PromptBlocksPanel.jsx +0 -444
  402. package/src/panels/VideoCapturePanel.jsx +0 -181
  403. package/src/pose-extract/browser.js +0 -42
  404. package/src/pose-extract/detector.js +0 -100
  405. package/src/pose-extract/fit.js +0 -227
  406. package/src/pose-extract/image-frame.js +0 -51
  407. package/src/pose-extract/index.js +0 -58
  408. package/src/pose-extract/keyframes.js +0 -74
  409. package/src/pose-extract/landmarks.js +0 -162
  410. package/src/pose-extract/mirror.js +0 -153
  411. package/src/pose-extract/take.js +0 -131
  412. package/src/pose-extract/video-frames.js +0 -91
  413. package/src/take-recipe.js +0 -165
  414. package/src/trail-key-conflicts.js +0 -39
  415. package/src/trail-pick.js +0 -59
  416. package/src/use-i2v-capture-modal.js +0 -15
  417. package/tools/ardy/BRIDGE.md +0 -37
  418. package/tools/ardy/GVHMR-NPZ.md +0 -68
  419. package/tools/ardy/README.md +0 -124
  420. package/tools/ardy/__pycache__/cclay_gvhmr_worker.cpython-313.pyc +0 -0
  421. package/tools/ardy/artifacts.mjs +0 -34
  422. package/tools/ardy/bridge.mjs +0 -1732
  423. package/tools/ardy/bvh-cskel27.mjs +0 -1265
  424. package/tools/ardy/cclay_constrained_generate.py +0 -561
  425. package/tools/ardy/cclay_gvhmr_worker.py +0 -264
  426. package/tools/ardy/cclay_motion_edit.py +0 -510
  427. package/tools/ardy/cclay_sequence_generate.py +0 -705
  428. package/tools/ardy/cclay_worker.py +0 -304
  429. package/tools/ardy/dump-npz.py +0 -205
  430. package/tools/ardy/extract-rest.mjs +0 -299
  431. package/tools/ardy/extract.mjs +0 -507
  432. package/tools/ardy/footage.mjs +0 -467
  433. package/tools/ardy/gvhmr-floor.mjs +0 -102
  434. package/tools/ardy/gvhmr-to-cskel27.mjs +0 -21
  435. package/tools/ardy/gvhmr_fastpath.py +0 -168
  436. package/tools/ardy/gvhmr_trajectory.py +0 -240
  437. package/tools/ardy/merge-text-encoder.py +0 -160
  438. package/tools/ardy/mocap-metrics.mjs +0 -200
  439. package/tools/ardy/mocap-quality-gate.mjs +0 -110
  440. package/tools/ardy/motion-stabilize.mjs +0 -348
  441. package/tools/ardy/npz.mjs +0 -414
  442. package/tools/ardy/pose-to-npz.mjs +0 -106
  443. package/tools/ardy/prompt-limits.mjs +0 -5
  444. package/tools/ardy/run-edit-on-box.sh +0 -73
  445. package/tools/ardy/run-local.mjs +0 -233
  446. package/tools/ardy/run-on-box.sh +0 -593
  447. package/tools/ardy/run-sequence-on-box.sh +0 -177
  448. package/tools/ardy/runners/gvhmr-worker.mjs +0 -206
  449. package/tools/ardy/runners/index.mjs +0 -18
  450. package/tools/ardy/runners/local.mjs +0 -455
  451. package/tools/ardy/runners/proc.mjs +0 -125
  452. package/tools/ardy/runners/remote.mjs +0 -252
  453. package/tools/ardy/setup-local.mjs +0 -189
  454. package/tools/ardy/setup-text-encoder-on-box.sh +0 -93
  455. package/tools/ardy/setup-text-encoder.py +0 -306
  456. package/tools/ardy/smpl-cskel27.mjs +0 -178
  457. package/tools/ardy/visual-qa.mjs +0 -196
  458. package/tools/ardy/vq-car.mjs +0 -52
  459. package/tools/bench/EXP3.md +0 -61
  460. package/tools/bench/cclay_bench_extract_incam.py +0 -125
  461. package/tools/bench/cclay_bench_extract_obs.py +0 -204
  462. package/tools/bench/cclay_bench_runner.py +0 -42
  463. package/tools/bench/cube-contact.mjs +0 -162
  464. package/tools/bench/exp3.mjs +0 -152
  465. package/tools/bench/extract-bench-lib.mjs +0 -216
  466. package/tools/bench/extract-bench.mjs +0 -302
  467. package/tools/bench/fal-generate.mjs +0 -88
  468. package/tools/bench/fit/README.md +0 -189
  469. package/tools/bench/fit/camera.mjs +0 -59
  470. package/tools/bench/fit/contact.mjs +0 -419
  471. package/tools/bench/fit/footlock.mjs +0 -234
  472. package/tools/bench/fit/motion.mjs +0 -85
  473. package/tools/bench/fit/pin.mjs +0 -27
  474. package/tools/bench/fit/remote.mjs +0 -105
  475. package/tools/bench/fit-bench.mjs +0 -126
  476. package/tools/bench/fit-sanity.mjs +0 -45
  477. package/tools/bench/metrics.mjs +0 -313
  478. package/tools/bench/obs/depth.mjs +0 -258
  479. package/tools/bench/obs/extrinsics.mjs +0 -175
  480. package/tools/bench/obs/fit_mannequin_betas.py +0 -340
  481. package/tools/bench/obs/ground.mjs +0 -294
  482. package/tools/bench/obs/heading.mjs +0 -151
  483. package/tools/bench/obs/ladder.mjs +0 -555
  484. package/tools/bench/obs/mannequin-betas.json +0 -124
  485. package/tools/bench/obs/remote.mjs +0 -83
  486. package/tools/bench/obs/rest_joints.py +0 -52
  487. package/tools/bench/obs/ybot-targets.mjs +0 -49
  488. package/tools/bench/obs-bench.mjs +0 -520
  489. package/tools/bench/score.mjs +0 -343
  490. package/tools/bench/summarize.mjs +0 -86
  491. package/tools/demo-worker/README.md +0 -137
  492. package/tools/demo-worker/api-client.mjs +0 -233
  493. package/tools/demo-worker/generate.mjs +0 -301
  494. package/tools/demo-worker/index.mjs +0 -466
  495. package/tools/demo-worker/sign-core.mjs +0 -112
  496. package/tools/demo-worker/sign.mjs +0 -161
  497. package/tools/gt-render/browser.mjs +0 -182
  498. package/tools/gt-render/camera-math.mjs +0 -276
  499. package/tools/gt-render/page.mjs +0 -267
  500. package/tools/gt-render/render.mjs +0 -514
  501. package/tools/gt-render/scene-box.mjs +0 -31
  502. package/tools/gt-render/take-transform.mjs +0 -87
  503. package/tools/kimodo/compare-seam.mjs +0 -108
  504. package/tools/kimodo/constraints.mjs +0 -244
  505. package/tools/kimodo/edit.mjs +0 -259
  506. package/tools/kimodo/effector-constraints.mjs +0 -200
  507. package/tools/kimodo/generate.mjs +0 -646
  508. package/tools/kimodo/local-output.mjs +0 -265
  509. package/tools/kimodo/measure-pose.mjs +0 -65
  510. package/tools/kimodo/measure-preserve.mjs +0 -899
  511. package/tools/kimodo/measure-waypoints.mjs +0 -55
  512. package/tools/kimodo/mlx-generate.py +0 -111
  513. package/tools/kimodo/pose-constraints.mjs +0 -248
  514. package/tools/kimodo/preserve-mask.mjs +0 -543
  515. package/tools/kimodo/read-npz.mjs +0 -189
  516. package/tools/kimodo/run-edit-on-box.mjs +0 -155
  517. package/tools/kimodo/run-sequence-on-box.mjs +0 -178
  518. package/tools/kimodo/runner.mjs +0 -284
  519. package/tools/kimodo/seam-batch.mjs +0 -77
  520. package/tools/kimodo/setup-local.mjs +0 -30
  521. package/tools/kimodo/setup-on-box.sh +0 -339
  522. package/tools/kimodo/soma77-to-cskel27.mjs +0 -305
  523. package/tools/morphgs/assets/gen_truth.py +0 -39
  524. package/tools/morphgs/assets/mesh_ori_rig.txt +0 -27
  525. package/tools/morphgs/assets/playback-check.mjs +0 -30
  526. package/tools/morphgs/demo-gate.sh +0 -26
  527. package/tools/morphgs/fbx2morphgs.mjs +0 -68
  528. package/tools/morphgs/morphgs-to-cskel27.mjs +0 -105
  529. package/tools/morphgs/patches/preprocess_src-none-mode.patch +0 -76
  530. package/tools/morphgs/setup-on-cluster.sh +0 -126
  531. package/tools/projflow/driver.py +0 -1069
  532. package/tools/projflow/generate.mjs +0 -805
  533. package/tools/projflow/hml22-to-cskel27.mjs +0 -735
  534. package/tools/projflow/line-edit-job.mjs +0 -547
  535. package/tools/projflow/replay.mjs +0 -452
  536. package/tools/projflow/runner.mjs +0 -269
  537. package/tools/projflow/service.mjs +0 -742
  538. package/tools/track/DESIGN.md +0 -513
  539. package/tools/track/backfill-provenance.mjs +0 -116
  540. package/tools/track/budget.mjs +0 -8
  541. package/tools/track/check-rig.mjs +0 -209
  542. package/tools/track/diagnostics.schema.json +0 -60
  543. package/tools/track/export-rig.mjs +0 -256
  544. package/tools/track/fallback.mjs +0 -7
  545. package/tools/track/fk-parity-fixture.mjs +0 -161
  546. package/tools/track/gate.mjs +0 -349
  547. package/tools/track/masks.mjs +0 -318
  548. package/tools/track/metrics.mjs +0 -201
  549. package/tools/track/publish-obs.mjs +0 -108
  550. package/tools/track/py/check_env.py +0 -61
  551. package/tools/track/py/eval_lr.py +0 -229
  552. package/tools/track/py/lr_viterbi.py +0 -294
  553. package/tools/track/py/masks.py +0 -405
  554. package/tools/track/py/objective.py +0 -382
  555. package/tools/track/py/rig.py +0 -508
  556. package/tools/track/py/scene.py +0 -326
  557. package/tools/track/py/test_joint_indices.py +0 -123
  558. package/tools/track/py/test_lr_viterbi.py +0 -195
  559. package/tools/track/py/test_masks.py +0 -229
  560. package/tools/track/py/test_rig.py +0 -288
  561. package/tools/track/py/test_scene.py +0 -354
  562. package/tools/track/py/test_track.py +0 -328
  563. package/tools/track/py/track.py +0 -411
  564. package/tools/track/remote.mjs +0 -140
  565. package/tools/track/rig-dump.mjs +0 -227
  566. package/tools/track/run-box-tests.mjs +0 -14
  567. package/tools/track/run-box.mjs +0 -168
  568. package/tools/track/setup-box.sh +0 -59
  569. package/tools/track/study-2d.mjs +0 -728
  570. /package/src/{ardy → motion}/collision-blockers.js +0 -0
  571. /package/src/{ardy → motion}/ground.js +0 -0
  572. /package/src/{ardy → motion}/ik-drag.js +0 -0
  573. /package/src/{ardy → motion}/ik-key-json.js +0 -0
  574. /package/src/{ardy → motion}/ik.js +0 -0
  575. /package/src/{ardy → motion}/physics-surface.js +0 -0
  576. /package/src/{ardy → motion}/playback-clock.js +0 -0
  577. /package/src/{ardy → motion}/range-pin.js +0 -0
@@ -8,7 +8,6 @@ import { fileURLToPath } from "node:url";
8
8
  import {
9
9
  installSignalCleanup,
10
10
  spawnOwned,
11
- startBridge,
12
11
  terminateOwned,
13
12
  waitForExit,
14
13
  } from "./process-supervisor.mjs";
@@ -32,10 +31,9 @@ const livePort = process.env.COZYCLAY_LIVE_PORT ?? "5184";
32
31
  const configuredOAuthPort = process.env.COZYCLAY_OAUTH_PORT?.trim();
33
32
  const mainPort = mainPortFrom(viteArgs);
34
33
 
35
- // Vite runs with --strictPort and reports a taken port as a raw stack trace —
36
- // after the bridge has already started and printed its own banner. Probe the
37
- // port first so the failure is one actionable line before anything spawns,
38
- // the same courtesy `npx cozyclay` already extends.
34
+ // Vite runs with --strictPort and reports a taken port as a raw stack trace.
35
+ // Probe the port first so the failure is one actionable line before anything
36
+ // spawns, the same courtesy `npx cozyclay` already extends.
39
37
  await new Promise((resolvePromise, reject) => {
40
38
  const probe = createNetServer();
41
39
  probe.once("error", reject);
@@ -47,53 +45,8 @@ await new Promise((resolvePromise, reject) => {
47
45
  });
48
46
 
49
47
  const children = [];
50
- let stopping = false;
51
- const removeSignalCleanup = installSignalCleanup(() => children, () => { stopping = true; });
52
- const trackChild = (child) => children.push(child);
53
- const untrackChild = (child) => children.splice(children.indexOf(child), 1);
54
- // The bridge's only backend is Kimodo, and that runner refuses to start
55
- // without a box to talk to. Starting it unconditionally turned a fresh
56
- // clone's first `npm run dev` into a hard exit over a variable a new
57
- // contributor has no reason to have set yet. An unset CCLAY_KIMODO_HOST is
58
- // the normal case, not a fault — `npx cozyclay` has always treated it that
59
- // way, and the studio itself already renders the sidecar as absent rather
60
- // than crashing, which is exactly what `npm run dev:ui` is.
61
- const kimodoHost = process.env.CCLAY_KIMODO_HOST?.trim();
62
- let bridge;
63
- let bridgePort;
64
- if (kimodoHost) {
65
- try {
66
- ({ child: bridge, port: bridgePort } = await startBridge({
67
- command: process.execPath,
68
- args: ["tools/ardy/bridge.mjs"],
69
- cwd: REPO,
70
- env: process.env,
71
- mainPort,
72
- onSpawn: trackChild,
73
- onFailure: untrackChild,
74
- onReady: (child) => child.once("exit", () => {
75
- if (stopping) return;
76
- stopping = true;
77
- console.error("[dev] motion generation sidecar exited unexpectedly");
78
- void Promise.allSettled(children.filter((entry) => entry !== child).map((entry) => terminateOwned(entry))).then(() => process.exit(1));
79
- }),
80
- }));
81
- } catch (err) {
82
- console.error(`[dev] Studio did not start: ${err.message}`);
83
- removeSignalCleanup();
84
- await Promise.allSettled(children.map((child) => terminateOwned(child)));
85
- process.exit(1);
86
- }
87
- } else {
88
- console.error(
89
- "[dev] CCLAY_KIMODO_HOST is not set — starting the studio without motion generation (set CCLAY_KIMODO_HOST=user@gpu-box to enable Block Generation).",
90
- );
91
- }
92
-
93
- // Resolved once per Studio admission by task 6, not from the historical port.
94
- const getBridgeOrigin = () => bridge && bridgePort !== undefined && bridge.exitCode === null && bridge.signalCode === null
95
- ? `http://127.0.0.1:${bridgePort}` : null;
96
- const agentHandler = createAgentHandler({ port: mainPort, getBridgeOrigin });
48
+ const removeSignalCleanup = installSignalCleanup(() => children, () => {});
49
+ const agentHandler = createAgentHandler({ port: mainPort });
97
50
  const oauthServer = createServer((req, res) => {
98
51
  const path = (req.url || "").split("?")[0];
99
52
  const hosts = new Set([`127.0.0.1:${mainPort}`, `localhost:${mainPort}`]);
@@ -113,10 +66,6 @@ const vite = spawnOwned(process.execPath, ["node_modules/vite/bin/vite.js", ...v
113
66
  cwd: REPO,
114
67
  env: {
115
68
  ...process.env,
116
- // Left as it came in when no bridge runs: Vite's /ardy proxy then
117
- // falls back the same way `dev:ui` does, and the probe fails
118
- // gracefully instead of pointing at a port nothing owns.
119
- ...(bridgePort === undefined ? {} : { COZYCLAY_BRIDGE_PORT: String(bridgePort), COZYCLAY_BRIDGE_ORIGIN: `http://127.0.0.1:${bridgePort}` }),
120
69
  COZYCLAY_LIVE_PORT: livePort,
121
70
  COZYCLAY_OAUTH_PORT: String(actualOAuthPort),
122
71
  },
@@ -2,22 +2,21 @@
2
2
  "no-async-promise-executor": 1,
3
3
  "no-case-declarations": 1,
4
4
  "no-constant-binary-expression": 2,
5
- "no-control-regex": 5,
5
+ "no-control-regex": 4,
6
6
  "no-dupe-keys": 1,
7
- "no-loss-of-precision": 1,
8
7
  "no-regex-spaces": 2,
9
- "no-undef": 25,
10
- "no-unsafe-finally": 5,
11
- "no-unused-vars": 168,
12
- "no-useless-assignment": 21,
13
- "no-useless-catch": 2,
14
- "no-useless-escape": 7,
15
- "preserve-caught-error": 16,
16
- "react-hooks/immutability": 66,
8
+ "no-undef": 24,
9
+ "no-unsafe-finally": 2,
10
+ "no-unused-vars": 100,
11
+ "no-useless-assignment": 10,
12
+ "no-useless-escape": 6,
13
+ "preserve-caught-error": 6,
14
+ "react-hooks/immutability": 88,
15
+ "react-hooks/preserve-manual-memoization": 31,
17
16
  "react-hooks/purity": 5,
18
- "react-hooks/refs": 87,
19
- "react-hooks/rules-of-hooks": 3,
20
- "react-hooks/set-state-in-effect": 31,
17
+ "react-hooks/refs": 111,
18
+ "react-hooks/rules-of-hooks": 2,
19
+ "react-hooks/set-state-in-effect": 30,
21
20
  "react-hooks/use-memo": 1,
22
21
  "require-yield": 2
23
22
  }
@@ -5,11 +5,6 @@
5
5
  "export bin/agent/video-adapters.mjs#falVideoContract",
6
6
  "export bin/package-signature.mjs#PACKAGE_SIGNATURE_PUBLIC_KEY",
7
7
  "export mcp/image-file.mjs#REFERENCE_MAX_BYTES",
8
- "export src/ardy/client.js#listBases",
9
- "export src/ardy/convert.js#basisToLocal",
10
- "export src/ardy/npz.js#CHARACTER_SCALE_MAX",
11
- "export src/ardy/npz.js#CHARACTER_SCALE_MIN",
12
- "export src/ardy/playback.js#boneStretch",
13
8
  "export src/asset-pane.jsx#CHARACTER_ASSETS",
14
9
  "export src/asset-pane.jsx#FolderGrid",
15
10
  "export src/burn-in.js#burnInCapture",
@@ -22,37 +17,13 @@
22
17
  "export src/camera-tutorial.jsx#default",
23
18
  "export src/domains/motion.js#createMotionDomain",
24
19
  "export src/domains/objects.js#createObjectsDomain",
25
- "export src/grid-view.js#STAGE_BACKGROUND",
26
20
  "export src/grid-view.js#STAGE_BACKGROUND_LIGHT",
27
21
  "export src/mesh-sniff.js#isFbxBinaryMagic",
28
22
  "export src/mesh-sniff.js#isGlbMagic",
29
23
  "export src/mesh-sniff.js#looksLikeObj",
30
24
  "export src/mesh-sniff.js#readFbxVersion",
31
- "export src/motion-resources.js#loadMotionFromUrl",
32
25
  "export src/object-catalog.jsx#default",
33
26
  "export src/object-path.js#MAX_PATH_HEIGHT",
34
- "export src/pose-extract/detector.js#POSE_WASM_BASE",
35
- "export src/pose-extract/detector.js#TASKS_VISION_VERSION",
36
- "export src/pose-extract/image-frame.js#decodeImage",
37
- "export src/pose-extract/index.js#LEFT_RIGHT_PAIRS",
38
- "export src/pose-extract/index.js#POSE_LANDMARK",
39
- "export src/pose-extract/index.js#POSE_MODELS",
40
- "export src/pose-extract/index.js#POSE_MODEL_URL",
41
- "export src/pose-extract/index.js#POSE_MODEL_URL_HEAVY",
42
- "export src/pose-extract/index.js#POSE_WASM_BASE",
43
- "export src/pose-extract/index.js#TASKS_VISION_VERSION",
44
- "export src/pose-extract/index.js#averageLandmarkSets",
45
- "export src/pose-extract/index.js#decodeImage",
46
- "export src/pose-extract/index.js#detectMirrorAveraged",
47
- "export src/pose-extract/index.js#filterLandmarkTrack",
48
- "export src/pose-extract/index.js#fitLandmarksToPose",
49
- "export src/pose-extract/index.js#mirrorLandmarks",
50
- "export src/pose-extract/index.js#normalizeLandmarkTrack",
51
- "export src/pose-extract/index.js#poseChangeScores",
52
- "export src/pose-extract/index.js#sampleTimes",
53
- "export src/pose-extract/index.js#selectPoseKeyframes",
54
- "export src/pose-extract/index.js#videoFrames",
55
- "export src/pose-extract/keyframes.js#poseChangeScores",
56
27
  "export src/project.js#storeProjectHandle",
57
28
  "export src/range-pin-panel.jsx#RANGE_PIN_TRACKS",
58
29
  "export src/scene-asset-cache.js#loadAssetTexture",
@@ -91,139 +62,21 @@
91
62
  "export test/bus/generation-hooks.mjs#begin",
92
63
  "export test/bus/generation-hooks.mjs#subscribe",
93
64
  "export test/bus/generation-hooks.mjs#useState",
94
- "export test/bus/motion-cache-fixture.mjs#getMotion",
95
- "export test/bus/motion-cache-fixture.mjs#openMotionDb",
96
- "export test/bus/motion-cache-fixture.mjs#putMotion",
97
- "export test/bus/motion-cache-fixture.mjs#records",
98
- "export test/bus/motion-cache-fixture.mjs#subscribe",
99
65
  "export test/bus/objects-asset-db.mjs#db",
100
66
  "export test/bus/objects-asset-db.mjs#holdNextWrite",
101
67
  "export test/bus/objects-asset-db.mjs#records",
102
68
  "export test/bus/objects-fixture.mjs#objectPanels",
103
69
  "export test/bus/stage-fixture.mjs#stagePanels",
104
70
  "export test/bus/verify-bus-coverage.mjs#applyRatchet",
105
- "export test/bus/verify-motion-concurrent.mjs#motionJobParity",
106
- "export test/bus/verify-motion-generation.mjs#ok",
107
- "export test/bus/verify-motion-generation.mjs#source",
108
71
  "export test/bus/verify-motion-private-owners-removed.mjs#sourceFiles",
109
72
  "export test/bus/verify-parity-matrix.mjs#executeParity",
110
73
  "export test/bus/verify-parity-matrix.mjs#parityMatrix",
111
74
  "export test/bus/verify-stage-gestures.mjs#elements",
112
75
  "export test/fixtures/fake-model.mjs#createFauxModel",
113
76
  "export test/fixtures/fake-model.mjs#fakeModel",
114
- "export test/fixtures/studio-agent-motion.mjs#createFixtureMotion",
115
77
  "export test/fixtures/write-cube-glb.mjs#cubeGeometry",
116
78
  "export test/fixtures/write-cube-glb.mjs#writeGlb",
117
79
  "export test/fixtures/write-cube-obj.mjs#cubeObj",
118
- "export test/verify-gvhmr-detector-flag.mjs#GVHMR_SMOOTH_SIGMA",
119
- "export tools/ardy/runners/remote.mjs#createRemoteRunner",
120
- "export tools/bench/exp3.mjs#main",
121
- "export tools/bench/exp3.mjs#summarizeGt",
122
- "export tools/bench/extract-bench-lib.mjs#CONDITIONS",
123
- "export tools/bench/extract-bench-lib.mjs#DEFAULT_CONDITIONS",
124
- "export tools/bench/extract-bench-lib.mjs#DEFAULT_VARIANTS",
125
- "export tools/bench/extract-bench-lib.mjs#FMM_SUFFIX",
126
- "export tools/bench/fal-generate.mjs#costFields",
127
- "export tools/bench/fit-bench.mjs#USAGE",
128
- "export tools/bench/fit/camera.mjs#transformMotion",
129
- "export tools/bench/fit/contact.mjs#continuousSceneDeltas",
130
- "export tools/bench/metrics.mjs#DEG",
131
- "export tools/bench/obs-bench.mjs#DEFAULT_OBS_ROOT",
132
- "export tools/bench/obs-bench.mjs#USAGE",
133
- "export tools/bench/obs-bench.mjs#characterStandingAnkle",
134
- "export tools/bench/obs-bench.mjs#main",
135
- "export tools/bench/obs-bench.mjs#scoreFal",
136
- "export tools/bench/obs-bench.mjs#trackerRigPath",
137
- "export tools/bench/obs/heading.mjs#worldYawDeg",
138
- "export tools/bench/obs/ladder.mjs#DEFAULTS",
139
- "export tools/bench/obs/ladder.mjs#SMPL_PARENTS",
140
- "export tools/bench/obs/ladder.mjs#ayfzNormalize",
141
- "export tools/bench/obs/ladder.mjs#calibrateAnklePlane",
142
- "export tools/bench/obs/ladder.mjs#floorOffset",
143
- "export tools/bench/obs/ladder.mjs#framesOf",
144
- "export tools/bench/obs/ladder.mjs#obsFps",
145
- "export tools/bench/obs/ladder.mjs#obsGlobal",
146
- "export tools/bench/obs/ladder.mjs#smoothSmplParams",
147
- "export tools/bench/obs/ladder.mjs#toCskel27",
148
- "export tools/bench/obs/ladder.mjs#vectorsOf",
149
- "export tools/bench/obs/ybot-targets.mjs#RIG_SEGMENTS",
150
- "export tools/bench/obs/ybot-targets.mjs#ybotTargets",
151
- "export tools/demo-worker/index.mjs#BACKOFF_MAX_MS",
152
- "export tools/demo-worker/index.mjs#BACKOFF_MIN_MS",
153
- "export tools/demo-worker/index.mjs#EMPTY_QUEUE_BACKOFF_MAX_MS",
154
- "export tools/demo-worker/index.mjs#EMPTY_QUEUE_BACKOFF_MIN_MS",
155
- "export tools/demo-worker/index.mjs#HEARTBEAT_INTERVAL_MS",
156
- "export tools/demo-worker/index.mjs#JOB_HARD_TIMEOUT_MS",
157
- "export tools/demo-worker/index.mjs#default",
158
- "export tools/demo-worker/index.mjs#main",
159
- "export tools/demo-worker/index.mjs#run",
160
- "export tools/demo-worker/sign.mjs#bodyBytes",
161
- "export tools/demo-worker/sign.mjs#canonicalString",
162
- "export tools/demo-worker/sign.mjs#digestHex",
163
- "export tools/demo-worker/sign.mjs#randomNonce",
164
- "export tools/demo-worker/sign.mjs#runCli",
165
- "export tools/demo-worker/sign.mjs#signRequest",
166
- "export tools/demo-worker/sign.mjs#toBase64Url",
167
- "export tools/gt-render/browser.mjs#connect",
168
- "export tools/gt-render/camera-math.mjs#FULL_FRAME_DIAGONAL_MM",
169
- "export tools/gt-render/camera-math.mjs#rotationYXZ",
170
- "export tools/gt-render/camera-math.mjs#solvePlacement",
171
- "export tools/gt-render/camera-math.mjs#worldToCameraCv",
172
- "export tools/gt-render/camera-math.mjs#worldToCameraGl",
173
- "export tools/kimodo/compare-seam.mjs#rootSpeeds",
174
- "export tools/kimodo/measure-preserve.mjs#CSKEL27_GROUPS",
175
- "export tools/kimodo/measure-preserve.mjs#buildFrameMap",
176
- "export tools/kimodo/measure-preserve.mjs#footSliding",
177
- "export tools/kimodo/measure-preserve.mjs#loadMotion",
178
- "export tools/kimodo/measure-preserve.mjs#measurePreserve",
179
- "export tools/kimodo/measure-preserve.mjs#parseRanges",
180
- "export tools/kimodo/soma77-to-cskel27.mjs#CSKEL27_IDENTITY",
181
- "export tools/projflow/hml22-to-cskel27.mjs#CSKEL27_IDENTITY",
182
- "export tools/projflow/line-edit-job.mjs#maxJointStep",
183
- "export tools/projflow/replay.mjs#LINE_EDIT_PINS_MAX",
184
- "export tools/projflow/replay.mjs#LINE_EDIT_PINS_MIN",
185
- "export tools/projflow/service.mjs#stopResidentService",
186
- "export tools/track/backfill-provenance.mjs#KINDS",
187
- "export tools/track/backfill-provenance.mjs#USAGE",
188
- "export tools/track/backfill-provenance.mjs#main",
189
- "export tools/track/backfill-provenance.mjs#parseArgs",
190
- "export tools/track/backfill-provenance.mjs#plan",
191
- "export tools/track/check-rig.mjs#boneWorlds",
192
- "export tools/track/check-rig.mjs#checkRig",
193
- "export tools/track/check-rig.mjs#restJoints",
194
- "export tools/track/check-rig.mjs#skinVertex",
195
- "export tools/track/export-rig.mjs#dumpRig",
196
- "export tools/track/export-rig.mjs#exportRig",
197
- "export tools/track/fk-parity-fixture.mjs#buildFixture",
198
- "export tools/track/fk-parity-fixture.mjs#prng",
199
- "export tools/track/gate.mjs#evaluate",
200
- "export tools/track/masks.mjs#DEFAULT_CACHE_ROOT",
201
- "export tools/track/masks.mjs#HASHED_PROVENANCE",
202
- "export tools/track/masks.mjs#MASKS_SCRIPT",
203
- "export tools/track/metrics.mjs#STANCE_SPEED_MPS",
204
- "export tools/track/publish-obs.mjs#USAGE",
205
- "export tools/track/publish-obs.mjs#parseArgs",
206
- "export tools/track/publish-obs.mjs#plan",
207
- "export tools/track/publish-obs.mjs#runItems",
208
- "export tools/track/run-box.mjs#idleCheck",
209
- "export tools/track/study-2d.mjs#BILATERAL",
210
- "export tools/track/study-2d.mjs#BODY_KEYPOINTS",
211
- "export tools/track/study-2d.mjs#COCO_NAMES",
212
- "export tools/track/study-2d.mjs#COCO_TO_RIG",
213
- "export tools/track/study-2d.mjs#SWAP_CONF_MIN",
214
- "export tools/track/study-2d.mjs#SWAP_MARGIN",
215
- "export tools/track/study-2d.mjs#SWAP_MIN_PAIRS",
216
- "export tools/track/study-2d.mjs#USAGE",
217
- "export tools/track/study-2d.mjs#cameraProbe",
218
- "export tools/track/study-2d.mjs#ceilingInputs",
219
- "export tools/track/study-2d.mjs#ceilingItem",
220
- "export tools/track/study-2d.mjs#codeSha",
221
- "export tools/track/study-2d.mjs#handoffCheck",
222
- "export tools/track/study-2d.mjs#inputKey",
223
- "export tools/track/study-2d.mjs#main",
224
- "export tools/track/study-2d.mjs#parseArgs",
225
- "export tools/track/study-2d.mjs#skinProvenance",
226
- "export tools/track/study-2d.mjs#stanceItem",
227
80
  "export workers/api/src/auth.js#OAUTH_COOKIE",
228
81
  "export workers/api/src/auth.js#PROVIDERS",
229
82
  "export workers/api/src/auth.js#SESSION_COOKIE",
@@ -238,39 +91,13 @@
238
91
  "export workers/api/src/auth.js#signedState",
239
92
  "export workers/api/src/auth.js#verifyState",
240
93
  "export workers/api/src/cors.js#originAllowed",
241
- "export workers/api/src/eta.js#ETA_FALLBACK_TEXT",
242
94
  "export workers/api/src/index.js#clearSessionCookie",
243
95
  "export workers/api/src/index.js#json",
244
- "export workers/api/src/index.js#motionEnabled",
245
- "export workers/api/src/index.js#motionUsageFor",
246
96
  "export workers/api/src/index.js#mutationGuard",
247
- "export workers/api/src/index.js#npzLooksValid",
248
- "export workers/api/src/index.js#publicMotionJob",
249
97
  "export workers/api/src/index.js#requireOrigin",
250
98
  "export workers/api/src/index.js#route",
251
- "export workers/api/src/index.js#runMotionJob",
252
- "export workers/api/src/index.js#submitMotion",
253
99
  "export workers/api/src/index.js#withCors",
254
- "export workers/api/src/motion.js#MAX_DURATION",
255
- "export workers/api/src/motion.js#MAX_STILL_BYTES",
256
- "export workers/api/src/motion.js#MIN_DURATION",
257
- "export workers/api/src/motion.js#uploadStill",
258
100
  "export workers/api/src/policy.js#SITE_ORIGIN",
259
- "export workers/api/src/policy.js#apiOriginFor",
260
- "export workers/api/src/prompt.js#PROMPT_MAX_CHARS",
261
- "export workers/api/src/queue.js#changesOf",
262
- "export workers/api/src/queue.js#cleanupWorkerNonces",
263
- "export workers/api/src/queue.js#positionFormula",
264
- "export workers/api/src/turnstile.js#TURNSTILE_ALWAYS_BLOCK_SECRET_KEY",
265
- "export workers/api/src/turnstile.js#TURNSTILE_ALWAYS_BLOCK_SITE_KEY",
266
- "export workers/api/src/turnstile.js#TURNSTILE_ALWAYS_PASS_SECRET_KEY",
267
- "export workers/api/src/turnstile.js#TURNSTILE_ALWAYS_PASS_SITE_KEY",
268
- "export workers/api/src/worker-auth.js#bodyBytes",
269
- "export workers/api/src/worker-auth.js#digestHex",
270
- "export workers/api/src/worker-auth.js#fromBase64Url",
271
- "export workers/api/src/worker-auth.js#randomNonce",
272
- "export workers/api/src/worker-auth.js#signedHeaders",
273
- "export workers/api/src/worker-auth.js#toBase64Url",
274
101
  "file test/scene-panel-harness.jsx",
275
102
  "file workers/api/scripts/dev-session.mjs",
276
103
  "unlisted bin/agent/pi-tools.mjs#typebox",
@@ -288,8 +115,6 @@
288
115
  "unlisted mcp/verify-live-controller.mjs#ws",
289
116
  "unlisted mcp/verify-live-editor-model.mjs#@modelcontextprotocol/sdk",
290
117
  "unlisted mcp/verify-live-execution.mjs#ws",
291
- "unlisted mcp/verify-live-motion-job.mjs#@modelcontextprotocol/sdk",
292
- "unlisted mcp/verify-live-motion-job.mjs#ws",
293
118
  "unlisted mcp/verify-live-p0.mjs#@modelcontextprotocol/sdk",
294
119
  "unlisted mcp/verify-live-p0.mjs#ws",
295
120
  "unlisted mcp/verify-live-routing.mjs#@modelcontextprotocol/sdk",
@@ -300,11 +125,8 @@
300
125
  "unlisted mcp/verify-sculpt-object.mjs#jpeg-js",
301
126
  "unlisted mcp/verify-tool-annotations.mjs#@modelcontextprotocol/sdk",
302
127
  "unlisted mcp/verify.mjs#@modelcontextprotocol/sdk",
303
- "unlisted test/ardy/compare-npz.mjs#fflate",
304
- "unlisted test/ardy/verify-compare-npz.mjs#fflate",
305
128
  "unlisted test/bus/agent-path-loc.mjs#rolldown",
306
129
  "unlisted test/bus/cast-fixture.mjs#rolldown",
307
- "unlisted test/bus/generation-fixture.mjs#rolldown",
308
130
  "unlisted test/bus/handler-coverage.mjs#rolldown",
309
131
  "unlisted test/bus/history-owners.mjs#rolldown",
310
132
  "unlisted test/bus/motion-fixture.mjs#rolldown",
@@ -323,7 +145,6 @@
323
145
  "unlisted test/bus/verify-store-domain-routing.mjs#rolldown",
324
146
  "unlisted test/verify-agent-panel.mjs#rolldown",
325
147
  "unlisted test/verify-export-recovery.mjs#rolldown",
326
- "unlisted test/verify-motion-trail-persistence.mjs#rolldown",
327
148
  "unlisted test/verify-schema-to-typebox.mjs#typebox",
328
149
  "unlisted test/verify-studio-agent-binding.mjs#rolldown",
329
150
  "unlisted test/verify-studio-undo-hygiene.mjs#rolldown",
@@ -1,126 +1,76 @@
1
1
  {
2
- "bin/agent/agent-routes.mjs": 903,
2
+ "bin/agent/agent-routes.mjs": 865,
3
3
  "bin/agent/agent-runner.mjs": 496,
4
4
  "bin/agent/providers.mjs": 409,
5
5
  "bin/agent/session-store.mjs": 324,
6
- "bin/agent/studio-rebase.mjs": 268,
7
6
  "bin/agent/supervisor.mjs": 283,
8
7
  "bin/agent/video-adapters.mjs": 334,
9
- "bin/cozyclay.mjs": 527,
8
+ "bin/cozyclay.mjs": 440,
10
9
  "bin/live/cli.mjs": 456,
11
- "mcp/live-hub.mjs": 534,
12
- "mcp/tool-handlers.mjs": 1890,
13
- "mcp/verify-live-batch.mjs": 490,
10
+ "mcp/live-hub.mjs": 529,
11
+ "mcp/tool-handlers.mjs": 1730,
12
+ "mcp/verify-live-batch.mjs": 486,
14
13
  "mcp/verify-live-capture.mjs": 268,
15
14
  "mcp/verify-live-controller.mjs": 340,
16
- "mcp/verify-live-motion-job.mjs": 336,
17
- "mcp/verify-live-p0.mjs": 287,
18
- "mcp/verify-live.mjs": 455,
19
- "src/analytics.js": 1181,
20
- "src/App.jsx": 6644,
21
- "src/ardy/auto-physics.js": 1094,
22
- "src/ardy/collision-blockers.js": 273,
23
- "src/ardy/convert.js": 285,
24
- "src/ardy/fix-collisions.js": 1987,
25
- "src/ardy/ik.js": 1135,
26
- "src/ardy/npz.js": 534,
27
- "src/ardy/physics-review.js": 510,
28
- "src/ardy/platform-fit.js": 277,
29
- "src/ardy/playback.js": 565,
30
- "src/ardy/range-pin.js": 277,
31
- "src/ardy/root-drop.js": 313,
32
- "src/ardy/timeline.jsx": 2384,
33
- "src/ardy/waypoints.js": 311,
15
+ "mcp/verify-live-p0.mjs": 264,
16
+ "mcp/verify-live.mjs": 416,
17
+ "src/analytics.js": 1169,
18
+ "src/App.jsx": 4711,
34
19
  "src/asset-pane.jsx": 648,
35
20
  "src/camera-follow.js": 505,
36
21
  "src/camera-move.js": 289,
37
22
  "src/camera-tutorial.jsx": 443,
38
23
  "src/command-bus.js": 378,
39
24
  "src/controls.jsx": 340,
40
- "src/domains/cast.js": 859,
41
- "src/domains/motion.js": 2277,
42
- "src/domains/motion/motion-video-capture.js": 592,
25
+ "src/domains/cast.js": 717,
26
+ "src/domains/motion.js": 812,
43
27
  "src/domains/objects.js": 907,
44
- "src/domains/scenes.js": 801,
28
+ "src/domains/scenes.js": 754,
45
29
  "src/domains/shots.js": 411,
46
30
  "src/dualview.jsx": 371,
47
31
  "src/hierarchy-panel.jsx": 779,
48
- "src/line-edit.js": 1215,
49
32
  "src/live-control.js": 338,
50
33
  "src/matte-editor.js": 486,
51
34
  "src/matte.js": 472,
52
- "src/motion-trail.js": 550,
53
- "src/multimodel-ingest.js": 344,
35
+ "src/motion/collision-blockers.js": 273,
36
+ "src/motion/fix-collisions.js": 748,
37
+ "src/motion/ik.js": 1135,
38
+ "src/motion/range-pin.js": 277,
39
+ "src/motion/timeline.jsx": 2047,
54
40
  "src/object-gizmo.jsx": 824,
55
41
  "src/object-path.js": 410,
56
42
  "src/panels/ObjectTransformPanel.jsx": 545,
57
- "src/panels/PromptBlocksPanel.jsx": 433,
58
43
  "src/panels/SculptPanel.jsx": 370,
59
44
  "src/planview.jsx": 887,
60
45
  "src/poses.js": 321,
61
- "src/posestudio.jsx": 1263,
46
+ "src/posestudio.jsx": 1240,
62
47
  "src/project-browser.jsx": 401,
63
- "src/project-resources.js": 256,
64
- "src/project.js": 691,
65
- "src/props.jsx": 649,
48
+ "src/project.js": 603,
49
+ "src/props.jsx": 417,
66
50
  "src/range-pin-panel.jsx": 305,
67
51
  "src/scene-assets.js": 400,
68
52
  "src/scene-mesh.js": 350,
69
- "src/scene-objects.js": 1233,
70
- "src/scenes.js": 456,
53
+ "src/scene-objects.js": 1136,
54
+ "src/scenes.js": 387,
71
55
  "src/sculpt-compare.js": 357,
72
56
  "src/sculpt-recipe.js": 363,
73
57
  "src/sculpt-run.js": 309,
74
58
  "src/shell/BoardSlot.jsx": 316,
75
- "src/shell/BottomDock.jsx": 460,
76
- "src/shell/DetailsSlot.jsx": 517,
59
+ "src/shell/BottomDock.jsx": 416,
60
+ "src/shell/DetailsSlot.jsx": 334,
77
61
  "src/shell/MenuBar.jsx": 640,
78
- "src/shell/PreferencesDialog.jsx": 516,
79
- "src/shell/ViewportToolbar.jsx": 638,
62
+ "src/shell/PreferencesDialog.jsx": 466,
63
+ "src/shell/ViewportToolbar.jsx": 567,
80
64
  "src/shot-authoring.js": 348,
81
65
  "src/stage-canvas-rigs.jsx": 352,
82
66
  "src/stage-editor-gizmos.jsx": 1116,
83
67
  "src/studio-agent-commands.js": 492,
84
- "src/studio-agent-protocol.js": 521,
85
- "src/studio-app-binding.js": 364,
68
+ "src/studio-agent-protocol.js": 486,
69
+ "src/studio-app-binding.js": 346,
86
70
  "src/ui.jsx": 393,
87
71
  "src/workflow/agent-client.js": 1386,
88
- "src/workflow/AgentPanel.jsx": 894,
89
- "src/workflow/WorkflowBuilder.jsx": 608,
90
- "tools/ardy/bridge.mjs": 1321,
91
- "tools/ardy/bvh-cskel27.mjs": 912,
92
- "tools/ardy/extract-rest.mjs": 266,
93
- "tools/ardy/extract.mjs": 412,
94
- "tools/ardy/footage.mjs": 409,
95
- "tools/ardy/motion-stabilize.mjs": 279,
96
- "tools/ardy/npz.mjs": 369,
97
- "tools/ardy/runners/local.mjs": 367,
98
- "tools/bench/extract-bench.mjs": 284,
99
- "tools/bench/fit/contact.mjs": 380,
100
- "tools/bench/metrics.mjs": 290,
101
- "tools/bench/obs-bench.mjs": 486,
102
- "tools/bench/obs/ground.mjs": 265,
103
- "tools/bench/obs/ladder.mjs": 480,
104
- "tools/bench/score.mjs": 316,
105
- "tools/demo-worker/generate.mjs": 274,
106
- "tools/demo-worker/index.mjs": 426,
107
- "tools/gt-render/camera-math.mjs": 255,
108
- "tools/gt-render/render.mjs": 485,
109
- "tools/kimodo/generate.mjs": 519,
110
- "tools/kimodo/local-output.mjs": 255,
111
- "tools/kimodo/measure-preserve.mjs": 795,
112
- "tools/kimodo/preserve-mask.mjs": 452,
113
- "tools/kimodo/soma77-to-cskel27.mjs": 271,
114
- "tools/projflow/generate.mjs": 682,
115
- "tools/projflow/hml22-to-cskel27.mjs": 633,
116
- "tools/projflow/line-edit-job.mjs": 484,
117
- "tools/projflow/replay.mjs": 397,
118
- "tools/projflow/service.mjs": 651,
72
+ "src/workflow/AgentPanel.jsx": 880,
73
+ "src/workflow/WorkflowBuilder.jsx": 592,
119
74
  "tools/qa/css-rule-usage.mjs": 251,
120
- "tools/run-tests.mjs": 564,
121
- "tools/track/gate.mjs": 325,
122
- "tools/track/masks.mjs": 297,
123
- "tools/track/study-2d.mjs": 663,
124
- "workers/api/src/index.js": 426,
125
- "workers/api/src/queue.js": 441
75
+ "tools/run-tests.mjs": 448
126
76
  }
@@ -0,0 +1,103 @@
1
+ // Fit the collision body of a Mixamo FBX rig from its skin to src/motion3/rigs/<model>-body.json
2
+ // for motion3's self-collision (src/motion3/body.js): one signed distance grid per skinned bone, in
3
+ // that bone's bind frame (the bone moves it rigidly), from the skin vertices the bone carries; and
4
+ // for each limb bone the radius of its skin along the bone (the probe spheres a limb collides with).
5
+ // Run once per rig: node tools/motion3/extract-body.mjs y-bot-tpose
6
+ import fs from "node:fs";
7
+ import path from "node:path";
8
+ import * as THREE from "three";
9
+ import { FBXLoader } from "three/examples/jsm/loaders/FBXLoader.js";
10
+ import { skeletonFor } from "../../src/motion3/rigs/index.js";
11
+ import { axisEnd } from "../../src/motion3/body.js";
12
+ import { sub, apply, T, dot, len } from "../../src/motion3/compiler/math.js";
13
+
14
+ const model = process.argv[2] ?? "y-bot-tpose";
15
+ const STEP = 0.015, MARGIN = 0.04, MEMBER = 0.25, MM = 1000;
16
+ const buf = fs.readFileSync(path.resolve("public/models", `${model}.fbx`));
17
+ const root = new FBXLoader().parse(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength), "");
18
+ root.updateMatrixWorld(true);
19
+ const sk = skeletonFor(model), name = n => n.replace(/^mixamorig:?/, "");
20
+
21
+ // Skin vertices (metres, bind pose) with normals and the bones that carry them, both meshes (the
22
+ // Y/X Bot joint balls are their own mesh), duplicates merged.
23
+ const verts = new Map();
24
+ root.traverse(o => {
25
+ if (!o.isSkinnedMesh) return;
26
+ const g = o.geometry, pos = g.attributes.position, nrm = g.attributes.normal, si = g.attributes.skinIndex, sw = g.attributes.skinWeight;
27
+ const v = new THREE.Vector3(), n = new THREE.Vector3(), nm = new THREE.Matrix3().getNormalMatrix(o.matrixWorld);
28
+ for (let i = 0; i < pos.count; i++) {
29
+ v.fromBufferAttribute(pos, i).applyMatrix4(o.matrixWorld).multiplyScalar(0.01);
30
+ const key = v.toArray().map(x => Math.round(x * 2000)).join();
31
+ const entry = verts.get(key) ?? { p: v.toArray(), n: [0, 0, 0], w: new Map() };
32
+ n.fromBufferAttribute(nrm, i).applyMatrix3(nm).normalize();
33
+ entry.n = entry.n.map((x, k) => x + n.getComponent(k));
34
+ for (let k = 0; k < 4; k++) {
35
+ const w = sw.getComponent(i, k), b = sk.index[name(o.skeleton.bones[si.getComponent(i, k)].name)];
36
+ if (w > 0 && b !== undefined) entry.w.set(b, Math.max(entry.w.get(b) ?? 0, w));
37
+ }
38
+ verts.set(key, entry);
39
+ }
40
+ });
41
+ const V = [...verts.values()].map(e => ({ ...e, n: e.n.map(x => x / (len(e.n) || 1)) }));
42
+ const dominant = e => [...e.w].sort((a, b) => b[1] - a[1])[0]?.[0];
43
+ // Fingers bend inside the hand: their skin is no grid of the hand; every other skinned bone gets one.
44
+ const FINGER = /Hand(Thumb|Index|Middle|Ring|Pinky)/;
45
+ const owners = [...new Set(V.map(dominant))].filter(b => b !== undefined && !FINGER.test(sk.names[b]));
46
+
47
+ /** Signed distance grid of the skin bone b carries, in b's bind frame (millimetres, Int8, outside +). */
48
+ function grid(b) {
49
+ const toLocal = p => apply(T(sk.restWorldRot[b]), sub(p, sk.restWorldPos[b]));
50
+ const pts = V.filter(e => (e.w.get(b) ?? 0) >= MEMBER || dominant(e) === b).map(e => ({ p: toLocal(e.p), n: apply(T(sk.restWorldRot[b]), e.n) }));
51
+ const own = V.filter(e => dominant(e) === b).map(e => toLocal(e.p));
52
+ const lo = [0, 1, 2].map(k => Math.min(...own.map(p => p[k])) - MARGIN), hi = [0, 1, 2].map(k => Math.max(...own.map(p => p[k])) + MARGIN);
53
+ const dims = lo.map((l, k) => Math.max(2, Math.ceil((hi[k] - l) / STEP) + 1));
54
+ // a hash of the member points: the nearest few decide distance and side
55
+ const cell = 0.03, hash = new Map(), at = p => p.map(x => Math.floor(x / cell)).join();
56
+ for (const q of pts) { const k = at(q.p); if (!hash.has(k)) hash.set(k, []); hash.get(k).push(q); }
57
+ const near = p => {
58
+ const c = p.map(x => Math.floor(x / cell)), found = [];
59
+ for (let r = 1; r <= 6 && found.length < 6; r++) {
60
+ found.length = 0;
61
+ for (let i = -r; i <= r; i++) for (let j = -r; j <= r; j++) for (let k = -r; k <= r; k++) found.push(...(hash.get(`${c[0] + i},${c[1] + j},${c[2] + k}`) ?? []));
62
+ }
63
+ return found.map(q => ({ q, d: len(sub(p, q.p)) })).sort((x, y) => x.d - y.d).slice(0, 6);
64
+ };
65
+ const data = new Int8Array(dims[0] * dims[1] * dims[2]);
66
+ for (let x = 0; x < dims[0]; x++) for (let y = 0; y < dims[1]; y++) for (let z = 0; z < dims[2]; z++) {
67
+ const p = [lo[0] + x * STEP, lo[1] + y * STEP, lo[2] + z * STEP], nn = near(p);
68
+ let d = 0.127;
69
+ if (nn.length) {
70
+ // side: the nearest points' normals vote, nearer ones louder; distance: to the nearest point's
71
+ // tangent plane where the point lies over it, else to the point
72
+ const side = nn.reduce((acc, { q, d: dq }) => acc + Math.sign(dot(sub(p, q.p), q.n)) / (dq + 0.005), 0) >= 0 ? 1 : -1;
73
+ const { q, d: dq } = nn[0], along = Math.abs(dot(sub(p, q.p), q.n)), lateral = Math.sqrt(Math.max(0, dq * dq - along * along));
74
+ d = side * (lateral < STEP ? along : dq);
75
+ }
76
+ data[(x * dims[1] + y) * dims[2] + z] = Math.max(-127, Math.min(127, Math.round(d * MM)));
77
+ }
78
+ return { min: lo.map(v => +v.toFixed(4)), dims, data: Buffer.from(data.buffer).toString("base64") };
79
+ }
80
+
81
+ /** Skin radius along a limb bone (bone to its first child), [t, r] at 6 stations: the 80th percentile of
82
+ * the skin's distance from the bone, but for a hand the median capped at HAND (the palm is flat, and the
83
+ * thumb's root rides the hand bone: a round 80th percentile would make it a 10 cm ball); HAND is the palm's half thickness (qa/geometry.js hand_*). */
84
+ const HAND = 0.022;
85
+ function profile(b) {
86
+ const hand = /Hand$/.test(sk.names[b]);
87
+ const child = axisEnd(sk, b), A = sk.restWorldPos[b], B = sk.restWorldPos[child], axis = sub(B, A), L2 = dot(axis, axis);
88
+ const bins = Array.from({ length: 6 }, () => []);
89
+ for (const e of V) {
90
+ if (dominant(e) !== b) continue;
91
+ const t = dot(sub(e.p, A), axis) / L2;
92
+ if (t < 0 || t > 1) continue;
93
+ bins[Math.min(5, Math.floor(t * 6))].push(len(sub(sub(e.p, A), axis.map(v => v * t))));
94
+ }
95
+ const pick = r => { const v = r.sort((x, y) => x - y)[Math.floor(r.length * (hand ? 0.5 : 0.8))]; return +(hand ? Math.min(HAND, v) : v).toFixed(4); };
96
+ return bins.map((r, i) => [+((i + 0.5) / 6).toFixed(3), r.length ? pick(r) : null]).filter(([, r]) => r !== null);
97
+ }
98
+
99
+ const LIMBS = ["Arm", "ForeArm", "Hand", "UpLeg", "Leg"].flatMap(n => [`Left${n}`, `Right${n}`]);
100
+ const out = { model, step: STEP, unit: "mm", grids: Object.fromEntries(owners.map(b => [sk.names[b], grid(b)])), radii: Object.fromEntries(LIMBS.map(n => [n, profile(sk.index[n])])) };
101
+ const file = path.resolve("src/motion3/rigs", `${model}-body.json`);
102
+ fs.writeFileSync(file, `${JSON.stringify(out)}\n`);
103
+ console.log(`${file}: ${owners.length} grids, ${(fs.statSync(file).size / 1024).toFixed(0)} KB`);