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.
- package/CHANGELOG.md +60 -0
- package/README.md +12 -30
- package/bin/agent/agent-routes.mjs +40 -113
- package/bin/agent/agent-runner.mjs +9 -10
- package/bin/agent/cliproxy-provider.mjs +135 -0
- package/bin/agent/credential-store.mjs +30 -7
- package/bin/agent/pi-tools.mjs +4 -1
- package/bin/agent/provider-keys.mjs +32 -0
- package/bin/agent/provider-login.mjs +110 -0
- package/bin/agent/provider-routes.mjs +99 -0
- package/bin/agent/providers.mjs +19 -97
- package/bin/agent/script-tool.mjs +17 -4
- package/bin/agent/studio-motion-reference.mjs +23 -0
- package/bin/agent/studio-prompt.mjs +1 -1
- package/bin/agent/studio-rebase-text.mjs +32 -0
- package/bin/agent/studio-rebase.mjs +26 -39
- package/bin/agent/studio-tools.mjs +9 -28
- package/bin/agent/tool-arguments.mjs +49 -0
- package/bin/agent/turn-frames.mjs +66 -0
- package/bin/codex-auth.mjs +9 -2
- package/bin/cozyclay.mjs +10 -116
- package/bin/live/cli.mjs +3 -3
- package/bin/mcp-runtime.mjs +2 -12
- package/bin/package-signature.mjs +0 -4
- package/dist/app/index.html +7 -6
- package/dist/assets/EXRLoader-CvVIvGVE.js +1 -0
- package/dist/assets/analytics-C9sUnndd.js +1 -0
- package/dist/assets/app-CCh--1Hc.js +5087 -0
- package/dist/assets/app-f-fkV5uP.css +1 -0
- package/dist/assets/compile-worker-CkxiD6lH.js +5 -0
- package/dist/assets/fflate.module-KbGj5-H6.js +5 -0
- package/dist/assets/{first-shot-handoff-msLI71g1.js → first-shot-handoff-CC4xe4HM.js} +1 -1
- package/dist/assets/{landing-ChUvB_zL.js → landing-DjHD8u7k.js} +1 -1
- package/dist/assets/scene-asset-sync-Hx_FzdOH.js +20 -0
- package/dist/assets/scene-asset-sync-_S8NQl5B.css +1 -0
- package/dist/assets/workflow-C4yKH1p4.js +179 -0
- package/dist/cozyclay-package.json +1 -1
- package/dist/index.html +3 -3
- package/dist/sw.js +3 -6
- package/dist/workflow/index.html +5 -4
- package/mcp/LIVE-PROTOCOL.md +7 -47
- package/mcp/README.md +16 -26
- package/mcp/live-hub.mjs +6 -10
- package/mcp/package.json +1 -3
- package/mcp/tool-handlers.mjs +4 -168
- package/package.json +3 -22
- package/src/App.jsx +150 -2624
- package/src/agent-progress.js +79 -0
- package/src/agent-turn-mark.js +30 -0
- package/src/analytics.js +1 -19
- package/src/app-context.js +5 -0
- package/src/app-stage.jsx +2 -34
- package/src/asset-pane.jsx +6 -5
- package/src/camera-block.js +21 -0
- package/src/camera-direction.js +120 -0
- package/src/character-kind.js +3 -9
- package/src/command-bus.js +8 -6
- package/src/commands/cast.js +5 -34
- package/src/commands/elements/character.js +1 -1
- package/src/commands/elements/motion.js +1 -6
- package/src/commands/elements/object.js +6 -2
- package/src/commands/elements/shot.js +4 -1
- package/src/commands/elements.js +38 -14
- package/src/commands/index.js +3 -1
- package/src/commands/kits.js +37 -0
- package/src/commands/motion-timing.js +57 -0
- package/src/commands/motion.js +9 -152
- package/src/commands/motion3-compile.js +65 -0
- package/src/commands/motion3.js +207 -0
- package/src/commands/objects.js +6 -4
- package/src/commands/shot.js +49 -11
- package/src/commands/stage.js +14 -1
- package/src/commands/view.js +4 -1
- package/src/document-mirrors.js +42 -0
- package/src/document-store.js +4 -0
- package/src/domains/cast.js +19 -194
- package/src/domains/motion/motion-range-pin-rules.js +1 -1
- package/src/domains/motion/take-source.js +51 -0
- package/src/domains/motion.js +60 -1838
- package/src/domains/scenes.js +12 -55
- package/src/domains/shots.js +2 -2
- package/src/domains/stage.js +4 -2
- package/src/draft-ghost.js +46 -0
- package/src/draft-ghost.jsx +129 -0
- package/src/dualview.jsx +4 -3
- package/src/effects/EffectsLayer.jsx +112 -0
- package/src/effects/effect-meshes.js +232 -0
- package/src/effects/effect-record.js +103 -0
- package/src/effects/emitter.js +59 -0
- package/src/effects/simulate.js +261 -0
- package/src/effects/state.js +59 -0
- package/src/execution-telemetry.js +2 -3
- package/src/first-success-guide.jsx +5 -5
- package/src/ghost-set.js +257 -0
- package/src/held-object-edit.jsx +113 -0
- package/src/held-object-pose.js +175 -0
- package/src/hierarchy-model.js +1 -1
- package/src/hierarchy-panel.jsx +1 -1
- package/src/imported-mesh.jsx +103 -0
- package/src/kits/held.js +84 -0
- package/src/kits/index.js +70 -0
- package/src/kits/smoking.js +57 -0
- package/src/light-blockers.js +93 -0
- package/src/motion/beat-board-model.js +84 -0
- package/src/motion/beat-board.css +124 -0
- package/src/motion/beat-board.jsx +59 -0
- package/src/motion/center-of-mass.js +66 -0
- package/src/motion/fix-collisions.js +850 -0
- package/src/motion/physics-review.js +118 -0
- package/src/{ardy → motion}/physics-support.js +1 -76
- package/src/motion/rig-snapshot.js +22 -0
- package/src/motion/take-segments.jsx +140 -0
- package/src/{ardy → motion}/timeline-coordinates.js +0 -21
- package/src/{ardy → motion}/timeline.css +1 -2
- package/src/{ardy → motion}/timeline.jsx +42 -413
- package/src/motion/waypoints.js +76 -0
- package/src/motion3/beats.js +83 -0
- package/src/motion3/body.js +158 -0
- package/src/motion3/bones.js +47 -0
- package/src/motion3/carried.js +47 -0
- package/src/motion3/compile-job.js +75 -0
- package/src/motion3/compile-worker.js +10 -0
- package/src/motion3/compiler/anchors.js +105 -0
- package/src/motion3/compiler/arm-orient.js +128 -0
- package/src/motion3/compiler/channels.js +125 -0
- package/src/motion3/compiler/compile.js +205 -0
- package/src/motion3/compiler/gait-rhythm.js +97 -0
- package/src/motion3/compiler/grip.js +171 -0
- package/src/motion3/compiler/head-steady.js +48 -0
- package/src/motion3/compiler/hold.js +134 -0
- package/src/motion3/compiler/idle.js +113 -0
- package/src/motion3/compiler/limbs.js +170 -0
- package/src/motion3/compiler/math.js +72 -0
- package/src/motion3/compiler/pose.js +162 -0
- package/src/motion3/compiler/quat.js +49 -0
- package/src/motion3/compiler/skeleton.js +74 -0
- package/src/motion3/compiler/validate-common.js +32 -0
- package/src/motion3/compiler/validate-goals.js +118 -0
- package/src/motion3/compiler/validate-objects.js +143 -0
- package/src/motion3/compiler/validate-parts.js +116 -0
- package/src/motion3/compiler/validate.js +122 -0
- package/src/motion3/compiler/vocab.js +73 -0
- package/src/motion3/compiler/walk-pelvis.js +275 -0
- package/src/motion3/compiler/walk.js +207 -0
- package/src/motion3/compiler/wrist-clamp.js +32 -0
- package/src/motion3/delta.js +47 -0
- package/src/motion3/describe.js +174 -0
- package/src/motion3/docs.js +27 -0
- package/src/motion3/edit-carry.js +21 -0
- package/src/motion3/fix/ease.js +16 -0
- package/src/motion3/fix/ground.js +37 -0
- package/src/motion3/fix/index.js +52 -0
- package/src/motion3/fix/push.js +71 -0
- package/src/motion3/fix/reach.js +46 -0
- package/src/motion3/fix/retime.js +79 -0
- package/src/motion3/fix/self.js +211 -0
- package/src/motion3/fix/slide.js +70 -0
- package/src/motion3/fix/turn.js +51 -0
- package/src/motion3/follow.js +39 -0
- package/src/motion3/free-motion.js +173 -0
- package/src/motion3/grip-choice.js +130 -0
- package/src/motion3/hold-plan.js +157 -0
- package/src/motion3/json-patch.js +77 -0
- package/src/motion3/key-aim.js +105 -0
- package/src/motion3/key-edit.js +82 -0
- package/src/motion3/lenient.js +127 -0
- package/src/motion3/object-keys.js +236 -0
- package/src/motion3/object-pose.js +182 -0
- package/src/motion3/object-tracks.js +12 -0
- package/src/motion3/pipeline.js +102 -0
- package/src/motion3/playback.js +51 -0
- package/src/motion3/probes.js +91 -0
- package/src/motion3/qa/body-checks.js +34 -0
- package/src/motion3/qa/check-names.js +14 -0
- package/src/motion3/qa/checks.js +121 -0
- package/src/motion3/qa/contact-checks.js +51 -0
- package/src/motion3/qa/explain.js +80 -0
- package/src/motion3/qa/fmt.js +5 -0
- package/src/motion3/qa/foot-checks.js +72 -0
- package/src/motion3/qa/geometry.js +77 -0
- package/src/motion3/qa/goals.js +191 -0
- package/src/motion3/qa/ground.js +60 -0
- package/src/motion3/qa/hints-contact.js +179 -0
- package/src/motion3/qa/hints-goal.js +160 -0
- package/src/motion3/qa/hints-knee.js +24 -0
- package/src/motion3/qa/hints-motion.js +209 -0
- package/src/motion3/qa/hints-object.js +91 -0
- package/src/motion3/qa/index.js +42 -0
- package/src/motion3/qa/key-checks.js +82 -0
- package/src/motion3/qa/near.js +96 -0
- package/src/motion3/qa/object-checks.js +135 -0
- package/src/motion3/qa/patch.js +161 -0
- package/src/motion3/qa/severity.js +38 -0
- package/src/motion3/qa/spec-checks.js +65 -0
- package/src/motion3/qa/style.js +218 -0
- package/src/motion3/qa/wrist-checks.js +69 -0
- package/src/motion3/qa/wrist-obs.js +60 -0
- package/src/motion3/refs.js +120 -0
- package/src/motion3/repair-tune.js +121 -0
- package/src/motion3/repair.js +83 -0
- package/src/motion3/report.js +67 -0
- package/src/motion3/rigs/index.js +14 -0
- package/src/motion3/rigs/x-bot-tpose-body.json +1 -0
- package/src/motion3/rigs/x-bot-tpose.json +1 -0
- package/src/motion3/rigs/y-bot-tpose-body.json +1 -0
- package/src/motion3/rigs/y-bot-tpose.json +1 -0
- package/src/motion3/scene.js +60 -0
- package/src/motion3/schema/brief.js +89 -0
- package/src/motion3/schema/fields.js +44 -0
- package/src/motion3/schema/spec-examples.js +46 -0
- package/src/motion3/schema/topics.js +111 -0
- package/src/motion3/schema/types.js +147 -0
- package/src/motion3/search.js +117 -0
- package/src/motion3/second-hand.js +112 -0
- package/src/motion3/skills/basic.js +82 -0
- package/src/motion3/skills/book.js +76 -0
- package/src/motion3/skills/car.js +145 -0
- package/src/motion3/skills/frames-auto.js +29 -0
- package/src/motion3/skills/index.js +83 -0
- package/src/motion3/skills/info.js +65 -0
- package/src/motion3/skills/smoke-kit.js +109 -0
- package/src/motion3/skills/smoke.js +160 -0
- package/src/motion3/spec-store.js +59 -0
- package/src/motion3/take-edit.js +155 -0
- package/src/motion3/take.js +63 -0
- package/src/motion3/timeline.js +127 -0
- package/src/motion3/views.js +121 -0
- package/src/motion3/walk-plan.js +119 -0
- package/src/object-catalog.jsx +7 -1
- package/src/object-colors.js +98 -0
- package/src/object-gizmo-parts.js +115 -0
- package/src/object-gizmo.jsx +37 -122
- package/src/object-glow.js +139 -0
- package/src/object-hidden.js +33 -0
- package/src/object-look.js +196 -0
- package/src/object-size.js +10 -0
- package/src/object-travel.js +71 -6
- package/src/panels/CameraPanel.jsx +7 -7
- package/src/panels/HdrEnvironmentControls.jsx +59 -0
- package/src/panels/LightPanel.jsx +25 -4
- package/src/panels/ObjectLookPanel.jsx +88 -0
- package/src/panels/PosePanel.jsx +2 -17
- package/src/panels/RigControlPanel.jsx +5 -53
- package/src/panels/SubjectBox.jsx +4 -1
- package/src/panels/details.css +14 -0
- package/src/posestudio.jsx +4 -27
- package/src/project-browser.jsx +3 -4
- package/src/project-resources.js +18 -31
- package/src/project.js +13 -104
- package/src/props.jsx +25 -280
- package/src/rail-dot-drag.js +23 -0
- package/src/render-passes.js +10 -0
- package/src/resource-status.jsx +1 -0
- package/src/result-modal.jsx +4 -19
- package/src/room.jsx +20 -12
- package/src/scene-assets.js +8 -6
- package/src/scene-light-place.js +72 -0
- package/src/scene-lights.jsx +148 -0
- package/src/scene-objects.js +31 -139
- package/src/scenes.js +15 -105
- package/src/semantic-edit.js +2 -5
- package/src/set-pieces.jsx +183 -0
- package/src/settings-menu.jsx +3 -11
- package/src/shell/BottomDock.jsx +9 -51
- package/src/shell/DetailsSlot.jsx +16 -200
- package/src/shell/GhostsMenuGroup.jsx +74 -0
- package/src/shell/LibrarySlot.jsx +1 -3
- package/src/shell/MenuBar.jsx +3 -3
- package/src/shell/PreferencesDialog.jsx +15 -264
- package/src/shell/PreferencesSlot.jsx +2 -8
- package/src/shell/TopBar.jsx +5 -84
- package/src/shell/ViewportToolbar.jsx +10 -70
- package/src/shell/agent-glass.css +19 -6
- package/src/shell/details-selection.js +42 -0
- package/src/shell/ghosts-menu.css +22 -0
- package/src/shell/glass-regions.css +29 -3
- package/src/shell/preferences.css +6 -1
- package/src/shot-authoring.js +4 -7
- package/src/soft-shadows.js +37 -0
- package/src/stage-attach-frames.js +12 -12
- package/src/stage-canvas-rigs.jsx +3 -3
- package/src/stage-capture.jsx +42 -8
- package/src/stage-characters.jsx +22 -216
- package/src/stage-editor-gizmos.jsx +6 -6
- package/src/stage-environment.js +93 -0
- package/src/stage-hdr-builtins.js +107 -0
- package/src/stage-hdr-image.js +116 -0
- package/src/stage-hdr-library.js +70 -0
- package/src/stage-hdr-map.js +94 -0
- package/src/stage-hdr.js +130 -0
- package/src/stage-lighting.js +149 -0
- package/src/stage-occlusion.js +210 -0
- package/src/stage-sky.jsx +159 -0
- package/src/stage-startup-defaults.js +5 -9
- package/src/studio-actions.js +12 -14
- package/src/studio-agent-commands.js +19 -16
- package/src/studio-agent-motion.js +9 -9
- package/src/studio-agent-protocol.js +41 -71
- package/src/studio-app-binding.js +25 -45
- package/src/studio-asset-list.js +17 -0
- package/src/studio-contact-sheet.js +37 -5
- package/src/studio-elements.js +27 -7
- package/src/studio-entity-bounds.js +18 -0
- package/src/studio-error-codes.js +8 -0
- package/src/studio-export-framing.js +152 -0
- package/src/studio-lighting-check.js +103 -0
- package/src/studio-motion-visual.js +150 -0
- package/src/studio-schema-errors.js +80 -0
- package/src/studio-support-gap.js +74 -0
- package/src/styles.css +1 -19
- package/src/timeline-defaults.js +5 -0
- package/src/timeline-extent.js +8 -20
- package/src/tutorial-walk.js +17 -0
- package/src/ui-scrub.js +1 -1
- package/src/use-shot-camera-tracks.js +12 -0
- package/src/view-ghosts.js +97 -0
- package/src/view-ghosts.jsx +49 -0
- package/src/workflow/AgentPanel.jsx +47 -166
- package/src/workflow/AgentProgressCard.jsx +107 -0
- package/src/workflow/AgentReplyText.jsx +37 -0
- package/src/workflow/AgentTurnSteps.jsx +84 -0
- package/src/workflow/LoginPanel.jsx +140 -0
- package/src/workflow/WorkflowBuilder.jsx +7 -23
- package/src/workflow/agent-client.js +54 -51
- package/src/workflow/agent-panel.css +71 -1
- package/src/workflow/agent-progress-card.css +167 -0
- package/src/workflow/agent-progress-view.js +47 -0
- package/src/workflow/agent-turn-steps.css +113 -0
- package/src/workflow/agent-turn.js +191 -0
- package/src/workflow/login-client.js +34 -0
- package/src/workflow/motion-input.js +18 -31
- package/src/workflow/node-schema.js +1 -1
- package/src/workflow/reply-markdown.js +69 -0
- package/src/workflow/scene-asset-sync.js +8 -8
- package/tools/agent-session-stats.mjs +61 -0
- package/tools/dev-full.mjs +5 -56
- package/tools/eslint-baseline.json +12 -13
- package/tools/knip-baseline.json +0 -179
- package/tools/loc-baseline.json +31 -81
- package/tools/motion3/extract-body.mjs +103 -0
- package/tools/motion3/extract-rig.mjs +85 -0
- package/tools/process-supervisor.mjs +0 -88
- package/tools/run-tests.mjs +8 -124
- package/bin/agent/motion-runtime.mjs +0 -76
- package/dist/ardy/cskel27-rest.json +0 -557
- package/dist/assets/analytics-C9pMpW7s.js +0 -1
- package/dist/assets/app-B_2XB9rw.css +0 -1
- package/dist/assets/app-DAuvKPP8.js +0 -4920
- package/dist/assets/config-Bx7pYsD9.js +0 -1
- package/dist/assets/config-DeoFTYzb.css +0 -1
- package/dist/assets/demo-CvKuBgy5.js +0 -1
- package/dist/assets/scene-asset-sync-DKkpjKBV.js +0 -19
- package/dist/assets/scene-asset-sync-DjJ_cJ2R.css +0 -1
- package/dist/assets/ticket-BPk2Ni95.js +0 -1
- package/dist/assets/workflow-jJRBR94Z.js +0 -179
- package/dist/demo/walk-then-stop.npz +0 -0
- package/mcp/ardy-prompts.mjs +0 -218
- package/src/ardy/auto-fix-panel.css +0 -108
- package/src/ardy/auto-physics.js +0 -1194
- package/src/ardy/client.js +0 -153
- package/src/ardy/convert.js +0 -313
- package/src/ardy/cskel27-neutral.js +0 -39
- package/src/ardy/cskel27.js +0 -77
- package/src/ardy/export.js +0 -165
- package/src/ardy/fix-collisions.js +0 -2257
- package/src/ardy/foot-lock.js +0 -230
- package/src/ardy/motion-calibration.js +0 -118
- package/src/ardy/motion-edit.js +0 -213
- package/src/ardy/motion-url.js +0 -55
- package/src/ardy/mp4-duration.js +0 -102
- package/src/ardy/npz.js +0 -595
- package/src/ardy/physics-panel.css +0 -21
- package/src/ardy/physics-panel.jsx +0 -89
- package/src/ardy/physics-refine.js +0 -111
- package/src/ardy/physics-review.js +0 -567
- package/src/ardy/physics-temporal.js +0 -54
- package/src/ardy/platform-fit-panel.css +0 -64
- package/src/ardy/platform-fit-panel.jsx +0 -41
- package/src/ardy/platform-fit.js +0 -326
- package/src/ardy/playback.js +0 -711
- package/src/ardy/pose-pin.js +0 -97
- package/src/ardy/prompt-clips.js +0 -30
- package/src/ardy/retime.js +0 -211
- package/src/ardy/root-drop.js +0 -369
- package/src/ardy/timeline-resize.js +0 -13
- package/src/ardy/to-cskel27.js +0 -225
- package/src/ardy/trim.js +0 -33
- package/src/ardy/waypoints.js +0 -369
- package/src/ardy-bridge-contract.js +0 -281
- package/src/domains/motion/motion-video-capture.js +0 -664
- package/src/i2v-motion-client.js +0 -77
- package/src/i2v-motion-studio.jsx +0 -180
- package/src/line-edit.js +0 -1348
- package/src/motion/generation.js +0 -105
- package/src/motion-readiness-ui.jsx +0 -67
- package/src/motion-readiness.js +0 -40
- package/src/motion-resources.js +0 -177
- package/src/motion-store.js +0 -65
- package/src/motion-trail.js +0 -601
- package/src/multimodel-ingest.js +0 -394
- package/src/panels/PromptBlocksPanel.jsx +0 -444
- package/src/panels/VideoCapturePanel.jsx +0 -181
- package/src/pose-extract/browser.js +0 -42
- package/src/pose-extract/detector.js +0 -100
- package/src/pose-extract/fit.js +0 -227
- package/src/pose-extract/image-frame.js +0 -51
- package/src/pose-extract/index.js +0 -58
- package/src/pose-extract/keyframes.js +0 -74
- package/src/pose-extract/landmarks.js +0 -162
- package/src/pose-extract/mirror.js +0 -153
- package/src/pose-extract/take.js +0 -131
- package/src/pose-extract/video-frames.js +0 -91
- package/src/take-recipe.js +0 -165
- package/src/trail-key-conflicts.js +0 -39
- package/src/trail-pick.js +0 -59
- package/src/use-i2v-capture-modal.js +0 -15
- package/tools/ardy/BRIDGE.md +0 -37
- package/tools/ardy/GVHMR-NPZ.md +0 -68
- package/tools/ardy/README.md +0 -124
- package/tools/ardy/__pycache__/cclay_gvhmr_worker.cpython-313.pyc +0 -0
- package/tools/ardy/artifacts.mjs +0 -34
- package/tools/ardy/bridge.mjs +0 -1732
- package/tools/ardy/bvh-cskel27.mjs +0 -1265
- package/tools/ardy/cclay_constrained_generate.py +0 -561
- package/tools/ardy/cclay_gvhmr_worker.py +0 -264
- package/tools/ardy/cclay_motion_edit.py +0 -510
- package/tools/ardy/cclay_sequence_generate.py +0 -705
- package/tools/ardy/cclay_worker.py +0 -304
- package/tools/ardy/dump-npz.py +0 -205
- package/tools/ardy/extract-rest.mjs +0 -299
- package/tools/ardy/extract.mjs +0 -507
- package/tools/ardy/footage.mjs +0 -467
- package/tools/ardy/gvhmr-floor.mjs +0 -102
- package/tools/ardy/gvhmr-to-cskel27.mjs +0 -21
- package/tools/ardy/gvhmr_fastpath.py +0 -168
- package/tools/ardy/gvhmr_trajectory.py +0 -240
- package/tools/ardy/merge-text-encoder.py +0 -160
- package/tools/ardy/mocap-metrics.mjs +0 -200
- package/tools/ardy/mocap-quality-gate.mjs +0 -110
- package/tools/ardy/motion-stabilize.mjs +0 -348
- package/tools/ardy/npz.mjs +0 -414
- package/tools/ardy/pose-to-npz.mjs +0 -106
- package/tools/ardy/prompt-limits.mjs +0 -5
- package/tools/ardy/run-edit-on-box.sh +0 -73
- package/tools/ardy/run-local.mjs +0 -233
- package/tools/ardy/run-on-box.sh +0 -593
- package/tools/ardy/run-sequence-on-box.sh +0 -177
- package/tools/ardy/runners/gvhmr-worker.mjs +0 -206
- package/tools/ardy/runners/index.mjs +0 -18
- package/tools/ardy/runners/local.mjs +0 -455
- package/tools/ardy/runners/proc.mjs +0 -125
- package/tools/ardy/runners/remote.mjs +0 -252
- package/tools/ardy/setup-local.mjs +0 -189
- package/tools/ardy/setup-text-encoder-on-box.sh +0 -93
- package/tools/ardy/setup-text-encoder.py +0 -306
- package/tools/ardy/smpl-cskel27.mjs +0 -178
- package/tools/ardy/visual-qa.mjs +0 -196
- package/tools/ardy/vq-car.mjs +0 -52
- package/tools/bench/EXP3.md +0 -61
- package/tools/bench/cclay_bench_extract_incam.py +0 -125
- package/tools/bench/cclay_bench_extract_obs.py +0 -204
- package/tools/bench/cclay_bench_runner.py +0 -42
- package/tools/bench/cube-contact.mjs +0 -162
- package/tools/bench/exp3.mjs +0 -152
- package/tools/bench/extract-bench-lib.mjs +0 -216
- package/tools/bench/extract-bench.mjs +0 -302
- package/tools/bench/fal-generate.mjs +0 -88
- package/tools/bench/fit/README.md +0 -189
- package/tools/bench/fit/camera.mjs +0 -59
- package/tools/bench/fit/contact.mjs +0 -419
- package/tools/bench/fit/footlock.mjs +0 -234
- package/tools/bench/fit/motion.mjs +0 -85
- package/tools/bench/fit/pin.mjs +0 -27
- package/tools/bench/fit/remote.mjs +0 -105
- package/tools/bench/fit-bench.mjs +0 -126
- package/tools/bench/fit-sanity.mjs +0 -45
- package/tools/bench/metrics.mjs +0 -313
- package/tools/bench/obs/depth.mjs +0 -258
- package/tools/bench/obs/extrinsics.mjs +0 -175
- package/tools/bench/obs/fit_mannequin_betas.py +0 -340
- package/tools/bench/obs/ground.mjs +0 -294
- package/tools/bench/obs/heading.mjs +0 -151
- package/tools/bench/obs/ladder.mjs +0 -555
- package/tools/bench/obs/mannequin-betas.json +0 -124
- package/tools/bench/obs/remote.mjs +0 -83
- package/tools/bench/obs/rest_joints.py +0 -52
- package/tools/bench/obs/ybot-targets.mjs +0 -49
- package/tools/bench/obs-bench.mjs +0 -520
- package/tools/bench/score.mjs +0 -343
- package/tools/bench/summarize.mjs +0 -86
- package/tools/demo-worker/README.md +0 -137
- package/tools/demo-worker/api-client.mjs +0 -233
- package/tools/demo-worker/generate.mjs +0 -301
- package/tools/demo-worker/index.mjs +0 -466
- package/tools/demo-worker/sign-core.mjs +0 -112
- package/tools/demo-worker/sign.mjs +0 -161
- package/tools/gt-render/browser.mjs +0 -182
- package/tools/gt-render/camera-math.mjs +0 -276
- package/tools/gt-render/page.mjs +0 -267
- package/tools/gt-render/render.mjs +0 -514
- package/tools/gt-render/scene-box.mjs +0 -31
- package/tools/gt-render/take-transform.mjs +0 -87
- package/tools/kimodo/compare-seam.mjs +0 -108
- package/tools/kimodo/constraints.mjs +0 -244
- package/tools/kimodo/edit.mjs +0 -259
- package/tools/kimodo/effector-constraints.mjs +0 -200
- package/tools/kimodo/generate.mjs +0 -646
- package/tools/kimodo/local-output.mjs +0 -265
- package/tools/kimodo/measure-pose.mjs +0 -65
- package/tools/kimodo/measure-preserve.mjs +0 -899
- package/tools/kimodo/measure-waypoints.mjs +0 -55
- package/tools/kimodo/mlx-generate.py +0 -111
- package/tools/kimodo/pose-constraints.mjs +0 -248
- package/tools/kimodo/preserve-mask.mjs +0 -543
- package/tools/kimodo/read-npz.mjs +0 -189
- package/tools/kimodo/run-edit-on-box.mjs +0 -155
- package/tools/kimodo/run-sequence-on-box.mjs +0 -178
- package/tools/kimodo/runner.mjs +0 -284
- package/tools/kimodo/seam-batch.mjs +0 -77
- package/tools/kimodo/setup-local.mjs +0 -30
- package/tools/kimodo/setup-on-box.sh +0 -339
- package/tools/kimodo/soma77-to-cskel27.mjs +0 -305
- package/tools/morphgs/assets/gen_truth.py +0 -39
- package/tools/morphgs/assets/mesh_ori_rig.txt +0 -27
- package/tools/morphgs/assets/playback-check.mjs +0 -30
- package/tools/morphgs/demo-gate.sh +0 -26
- package/tools/morphgs/fbx2morphgs.mjs +0 -68
- package/tools/morphgs/morphgs-to-cskel27.mjs +0 -105
- package/tools/morphgs/patches/preprocess_src-none-mode.patch +0 -76
- package/tools/morphgs/setup-on-cluster.sh +0 -126
- package/tools/projflow/driver.py +0 -1069
- package/tools/projflow/generate.mjs +0 -805
- package/tools/projflow/hml22-to-cskel27.mjs +0 -735
- package/tools/projflow/line-edit-job.mjs +0 -547
- package/tools/projflow/replay.mjs +0 -452
- package/tools/projflow/runner.mjs +0 -269
- package/tools/projflow/service.mjs +0 -742
- package/tools/track/DESIGN.md +0 -513
- package/tools/track/backfill-provenance.mjs +0 -116
- package/tools/track/budget.mjs +0 -8
- package/tools/track/check-rig.mjs +0 -209
- package/tools/track/diagnostics.schema.json +0 -60
- package/tools/track/export-rig.mjs +0 -256
- package/tools/track/fallback.mjs +0 -7
- package/tools/track/fk-parity-fixture.mjs +0 -161
- package/tools/track/gate.mjs +0 -349
- package/tools/track/masks.mjs +0 -318
- package/tools/track/metrics.mjs +0 -201
- package/tools/track/publish-obs.mjs +0 -108
- package/tools/track/py/check_env.py +0 -61
- package/tools/track/py/eval_lr.py +0 -229
- package/tools/track/py/lr_viterbi.py +0 -294
- package/tools/track/py/masks.py +0 -405
- package/tools/track/py/objective.py +0 -382
- package/tools/track/py/rig.py +0 -508
- package/tools/track/py/scene.py +0 -326
- package/tools/track/py/test_joint_indices.py +0 -123
- package/tools/track/py/test_lr_viterbi.py +0 -195
- package/tools/track/py/test_masks.py +0 -229
- package/tools/track/py/test_rig.py +0 -288
- package/tools/track/py/test_scene.py +0 -354
- package/tools/track/py/test_track.py +0 -328
- package/tools/track/py/track.py +0 -411
- package/tools/track/remote.mjs +0 -140
- package/tools/track/rig-dump.mjs +0 -227
- package/tools/track/run-box-tests.mjs +0 -14
- package/tools/track/run-box.mjs +0 -168
- package/tools/track/setup-box.sh +0 -59
- package/tools/track/study-2d.mjs +0 -728
- /package/src/{ardy → motion}/collision-blockers.js +0 -0
- /package/src/{ardy → motion}/ground.js +0 -0
- /package/src/{ardy → motion}/ik-drag.js +0 -0
- /package/src/{ardy → motion}/ik-key-json.js +0 -0
- /package/src/{ardy → motion}/ik.js +0 -0
- /package/src/{ardy → motion}/physics-surface.js +0 -0
- /package/src/{ardy → motion}/playback-clock.js +0 -0
- /package/src/{ardy → motion}/range-pin.js +0 -0
package/tools/track/rig-dump.mjs
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* rig-dump.mjs — pack a plain-JSON Studio rig dump (tools/track/export-rig.mjs
|
|
3
|
-
* `dumpRig`, or the synthetic fixture test/fixtures/track-rig-dump.json) into
|
|
4
|
-
* the numpy members the tracker reads (todo 6, tools/track/py/rig.py).
|
|
5
|
-
*
|
|
6
|
-
* Pure: no three.js, no filesystem. Everything is validated here so a bad dump
|
|
7
|
-
* fails loudly instead of producing a rig the tracker silently mis-skins.
|
|
8
|
-
*
|
|
9
|
-
* Conventions of the packed arrays (also recorded in `meta_json`):
|
|
10
|
-
* - matrices are 4x4 ROW-major (numpy order, M @ [x, y, z, 1]); quaternions
|
|
11
|
-
* are [x, y, z, w] (three.js order).
|
|
12
|
-
* - `vertices`, `bone_rest_world`, `bone_bind_inverse`: metres, world space
|
|
13
|
-
* of the Studio rig at rest (rig root at the origin with its 0.01
|
|
14
|
-
* centimetre scale, Character scale 1, no clip-to-scene yaw). Skinning:
|
|
15
|
-
* v(pose) = sum_k w_k * boneWorld_k(pose) @ bone_bind_inverse_k @ v_rest
|
|
16
|
-
* - `bone_rest_local` and every `prep_*` array: rig units (the space BELOW
|
|
17
|
-
* the rig root, Mixamo centimetres), exactly the values
|
|
18
|
-
* src/ardy/playback.js prepOf/applyMotionFrame compute with;
|
|
19
|
-
* `rig_root_scale` (0.01) maps rig units to metres.
|
|
20
|
-
* - cskel27-indexed arrays have 27 rows; rows of joints that drive no bone
|
|
21
|
-
* are zero (vectors) / identity (matrices) with prep_bone = -1.
|
|
22
|
-
* - `meta_json` is the UTF-8 bytes of a JSON document (names, conventions),
|
|
23
|
-
* stored as int32 because writeNpz carries only float32/int32:
|
|
24
|
-
* json.loads(bytes(z["meta_json"].astype("uint8")))
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
export const RIG_DUMP_VERSION = 1;
|
|
28
|
-
const CSKEL = 27;
|
|
29
|
-
const INFLUENCES = 4;
|
|
30
|
-
const WEIGHT_TOLERANCE = 1e-5;
|
|
31
|
-
|
|
32
|
-
const IDENTITY16 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
|
|
33
|
-
|
|
34
|
-
function fail(code, detail) {
|
|
35
|
-
throw new Error(`${code}: ${detail}`);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function finiteList(value, length, label) {
|
|
39
|
-
if (!Array.isArray(value) || value.length !== length || !value.every(Number.isFinite)) {
|
|
40
|
-
fail("bad-rig-dump", `${label} must be ${length} finite numbers`);
|
|
41
|
-
}
|
|
42
|
-
return value;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** Rows of a cskel27-indexed field; null rows become `fill`. */
|
|
46
|
-
function jointRows(rows, width, fill, label) {
|
|
47
|
-
if (!Array.isArray(rows) || rows.length !== CSKEL) fail("bad-rig-dump", `${label} must have ${CSKEL} rows`);
|
|
48
|
-
const out = new Float32Array(CSKEL * width);
|
|
49
|
-
rows.forEach((row, j) => out.set(finiteList(row ?? fill, width, `${label}[${j}]`), j * width));
|
|
50
|
-
return out;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function intList(value, length, label, min, max) {
|
|
54
|
-
if (!Array.isArray(value) || value.length !== length || !value.every((v) => Number.isInteger(v) && v >= min && v < max)) {
|
|
55
|
-
fail("bad-rig-dump", `${label} must be ${length} integers in [${min}, ${max})`);
|
|
56
|
-
}
|
|
57
|
-
return Int32Array.from(value);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function nameMask(names, label, joints) {
|
|
61
|
-
if (!Array.isArray(names)) fail("bad-rig-dump", `${label} must be a list of cskel27 names`);
|
|
62
|
-
const mask = new Int32Array(CSKEL);
|
|
63
|
-
for (const name of names) {
|
|
64
|
-
const j = joints.indexOf(name);
|
|
65
|
-
if (j < 0) fail("bad-rig-dump", `${label}: ${name} is not a cskel27 joint`);
|
|
66
|
-
mask[j] = 1;
|
|
67
|
-
}
|
|
68
|
-
return mask;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const member = (data, shape) => ({ data, shape });
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* dump -> { members, meta }. `members` goes straight into
|
|
75
|
-
* tools/ardy/npz.mjs writeNpz; `meta` is the decoded meta_json document.
|
|
76
|
-
*/
|
|
77
|
-
export function rigArraysFromDump(dump) {
|
|
78
|
-
if (!dump || dump.version !== RIG_DUMP_VERSION) fail("bad-rig-dump", `version must be ${RIG_DUMP_VERSION}`);
|
|
79
|
-
const { bones, meshes, prep, cskel27 } = dump;
|
|
80
|
-
if (!(dump.rootScale > 0)) fail("bad-rig-dump", "rootScale must be positive");
|
|
81
|
-
|
|
82
|
-
// --- cskel27 reference --------------------------------------------------
|
|
83
|
-
if (!cskel27 || !Array.isArray(cskel27.joints) || cskel27.joints.length !== CSKEL) {
|
|
84
|
-
fail("bad-rig-dump", `cskel27.joints must list ${CSKEL} joints`);
|
|
85
|
-
}
|
|
86
|
-
const cskelParents = intList(cskel27.parents, CSKEL, "cskel27.parents", -1, CSKEL);
|
|
87
|
-
cskelParents.forEach((p, j) => { if (p >= j) fail("bad-rig-dump", `cskel27 parent ${p} of joint ${j} is not topological`); });
|
|
88
|
-
const neutral = jointRows(cskel27.neutral, 3, null, "cskel27.neutral");
|
|
89
|
-
|
|
90
|
-
// --- bones ---------------------------------------------------------------
|
|
91
|
-
if (!Array.isArray(bones) || bones.length === 0) fail("bad-rig-dump", "bones must be a non-empty list");
|
|
92
|
-
const B = bones.length;
|
|
93
|
-
const boneParent = new Int32Array(B);
|
|
94
|
-
const restLocal = new Float32Array(B * 16);
|
|
95
|
-
const restWorld = new Float32Array(B * 16);
|
|
96
|
-
const bindInverse = new Float32Array(B * 16);
|
|
97
|
-
bones.forEach((bone, i) => {
|
|
98
|
-
if (typeof bone.name !== "string" || !bone.name) fail("bad-rig-dump", `bones[${i}].name missing`);
|
|
99
|
-
if (!Number.isInteger(bone.parent) || bone.parent < -1 || bone.parent >= i) {
|
|
100
|
-
fail("bone-order", `bone ${i} (${bone.name}) has parent ${bone.parent}; parents must precede children`);
|
|
101
|
-
}
|
|
102
|
-
boneParent[i] = bone.parent;
|
|
103
|
-
restLocal.set(finiteList(bone.restLocal, 16, `bones[${i}].restLocal`), i * 16);
|
|
104
|
-
restWorld.set(finiteList(bone.restWorld, 16, `bones[${i}].restWorld`), i * 16);
|
|
105
|
-
bindInverse.set(finiteList(bone.bindInverse, 16, `bones[${i}].bindInverse`), i * 16);
|
|
106
|
-
});
|
|
107
|
-
const boneNames = bones.map((b) => b.name);
|
|
108
|
-
if (new Set(boneNames).size !== B) fail("bad-rig-dump", "bone names must be unique");
|
|
109
|
-
|
|
110
|
-
// --- merged mesh -----------------------------------------------------------
|
|
111
|
-
if (!Array.isArray(meshes) || meshes.length === 0) fail("bad-rig-dump", "meshes must be a non-empty list");
|
|
112
|
-
let V = 0;
|
|
113
|
-
let F = 0;
|
|
114
|
-
for (const [m, mesh] of meshes.entries()) {
|
|
115
|
-
const n = mesh.vertices?.length / 3;
|
|
116
|
-
if (!Number.isInteger(n) || n < 3) fail("bad-rig-dump", `meshes[${m}].vertices must be a flat xyz list`);
|
|
117
|
-
if (!Number.isInteger(mesh.faces?.length / 3)) fail("bad-rig-dump", `meshes[${m}].faces must be a flat triangle list`);
|
|
118
|
-
V += n;
|
|
119
|
-
F += mesh.faces.length / 3;
|
|
120
|
-
}
|
|
121
|
-
const vertices = new Float32Array(V * 3);
|
|
122
|
-
const faces = new Int32Array(F * 3);
|
|
123
|
-
const skinIndex = new Int32Array(V * INFLUENCES);
|
|
124
|
-
const skinWeight = new Float32Array(V * INFLUENCES);
|
|
125
|
-
const meshRanges = new Int32Array(meshes.length * 4);
|
|
126
|
-
let v0 = 0;
|
|
127
|
-
let f0 = 0;
|
|
128
|
-
for (const [m, mesh] of meshes.entries()) {
|
|
129
|
-
const n = mesh.vertices.length / 3;
|
|
130
|
-
const nf = mesh.faces.length / 3;
|
|
131
|
-
vertices.set(finiteList(mesh.vertices, n * 3, `meshes[${m}].vertices`), v0 * 3);
|
|
132
|
-
faces.set(intList(mesh.faces, nf * 3, `meshes[${m}].faces`, 0, n).map((i) => i + v0), f0 * 3);
|
|
133
|
-
skinIndex.set(intList(mesh.skinIndex, n * INFLUENCES, `meshes[${m}].skinIndex`, 0, B), v0 * INFLUENCES);
|
|
134
|
-
skinWeight.set(finiteList(mesh.skinWeight, n * INFLUENCES, `meshes[${m}].skinWeight`), v0 * INFLUENCES);
|
|
135
|
-
meshRanges.set([v0, n, f0, nf], m * 4);
|
|
136
|
-
v0 += n;
|
|
137
|
-
f0 += nf;
|
|
138
|
-
}
|
|
139
|
-
for (let v = 0; v < V; v += 1) {
|
|
140
|
-
let sum = 0;
|
|
141
|
-
for (let k = 0; k < INFLUENCES; k += 1) {
|
|
142
|
-
const w = skinWeight[v * INFLUENCES + k];
|
|
143
|
-
if (w < 0) fail("bad-skin-weights", `vertex ${v} has negative weight ${w}`);
|
|
144
|
-
sum += w;
|
|
145
|
-
}
|
|
146
|
-
if (Math.abs(sum - 1) > WEIGHT_TOLERANCE) fail("bad-skin-weights", `vertex ${v} weights sum to ${sum}`);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// --- Studio positional-skinning prep (playback.js prepOf) ------------------
|
|
150
|
-
if (!prep) fail("bad-rig-dump", "prep missing");
|
|
151
|
-
const prepBone = intList(prep.bones, CSKEL, "prep.bones", -1, B);
|
|
152
|
-
if (!prepBone.some((b) => b >= 0)) fail("bad-rig-dump", "prep.bones maps no cskel27 joint to a bone");
|
|
153
|
-
const chainParent = intList(prep.chainParent, CSKEL, "prep.chainParent", -1, CSKEL);
|
|
154
|
-
chainParent.forEach((p, j) => {
|
|
155
|
-
if (p >= 0 && (p >= j || prepBone[p] < 0 || prepBone[j] < 0)) fail("bad-rig-dump", `prep.chainParent[${j}]=${p} must be an earlier mapped joint`);
|
|
156
|
-
});
|
|
157
|
-
if (!(prep.scale > 0)) fail("bad-rig-dump", "prep.scale must be positive");
|
|
158
|
-
const leaves = prep.stretchedLeaves;
|
|
159
|
-
if (!Array.isArray(leaves)) fail("bad-rig-dump", "prep.stretchedLeaves must be a list");
|
|
160
|
-
const leafIndex = new Int32Array(leaves.length * 2);
|
|
161
|
-
const leafPos = new Float32Array(leaves.length * 3);
|
|
162
|
-
const leafQuat = new Float32Array(leaves.length * 4);
|
|
163
|
-
leaves.forEach((leaf, i) => {
|
|
164
|
-
leafIndex.set(intList([leaf.bone], 1, `prep.stretchedLeaves[${i}].bone`, 0, B), i * 2);
|
|
165
|
-
leafIndex.set(intList([leaf.joint], 1, `prep.stretchedLeaves[${i}].joint`, 0, CSKEL), i * 2 + 1);
|
|
166
|
-
leafPos.set(finiteList(leaf.bindLocalPos, 3, `prep.stretchedLeaves[${i}].bindLocalPos`), i * 3);
|
|
167
|
-
leafQuat.set(finiteList(leaf.bindLocalQuat, 4, `prep.stretchedLeaves[${i}].bindLocalQuat`), i * 4);
|
|
168
|
-
});
|
|
169
|
-
const hierarchyPreserved = nameMask(prep.hierarchyPreserved, "prep.hierarchyPreserved", cskel27.joints);
|
|
170
|
-
const girdle = nameMask(prep.girdleJoints, "prep.girdleJoints", cskel27.joints);
|
|
171
|
-
if (!Number.isFinite(prep.ardyNeutralMinY)) fail("bad-rig-dump", "prep.ardyNeutralMinY must be finite");
|
|
172
|
-
|
|
173
|
-
const meta = {
|
|
174
|
-
version: RIG_DUMP_VERSION,
|
|
175
|
-
model: dump.model ?? null,
|
|
176
|
-
source: dump.source ?? null,
|
|
177
|
-
boneNames,
|
|
178
|
-
meshNames: meshes.map((m) => m.name ?? ""),
|
|
179
|
-
cskel27Joints: cskel27.joints,
|
|
180
|
-
hierarchyPreservedJoints: prep.hierarchyPreserved,
|
|
181
|
-
girdleJoints: prep.girdleJoints,
|
|
182
|
-
conventions: {
|
|
183
|
-
matrices: "4x4 row-major, M @ [x, y, z, 1]",
|
|
184
|
-
quaternions: "[x, y, z, w]",
|
|
185
|
-
worldArrays: "vertices, bone_rest_world, bone_bind_inverse: metres, Studio world at rest (rig root scale applied, Character scale 1)",
|
|
186
|
-
rigArrays: "bone_rest_local, prep_*: rig units below the rig root; multiply by rig_root_scale for metres",
|
|
187
|
-
skinning: "v = sum_k w_k * boneWorld_k @ bone_bind_inverse_k @ v_rest",
|
|
188
|
-
meshRanges: "mesh_ranges[m] = [vertexStart, vertexCount, faceStart, faceCount]",
|
|
189
|
-
},
|
|
190
|
-
};
|
|
191
|
-
const metaBytes = Int32Array.from(new TextEncoder().encode(JSON.stringify(meta)));
|
|
192
|
-
|
|
193
|
-
const members = {
|
|
194
|
-
meta_json: member(metaBytes, [metaBytes.length]),
|
|
195
|
-
rig_root_scale: member(Float32Array.of(dump.rootScale), [1]),
|
|
196
|
-
vertices: member(vertices, [V, 3]),
|
|
197
|
-
faces: member(faces, [F, 3]),
|
|
198
|
-
skin_index: member(skinIndex, [V, INFLUENCES]),
|
|
199
|
-
skin_weight: member(skinWeight, [V, INFLUENCES]),
|
|
200
|
-
mesh_ranges: member(meshRanges, [meshes.length, 4]),
|
|
201
|
-
bone_parent: member(boneParent, [B]),
|
|
202
|
-
bone_rest_local: member(restLocal, [B, 4, 4]),
|
|
203
|
-
bone_rest_world: member(restWorld, [B, 4, 4]),
|
|
204
|
-
bone_bind_inverse: member(bindInverse, [B, 4, 4]),
|
|
205
|
-
prep_bone: member(prepBone, [CSKEL]),
|
|
206
|
-
prep_scale: member(Float32Array.of(prep.scale), [1]),
|
|
207
|
-
prep_offsets: member(jointRows(prep.offsets, 3, [0, 0, 0], "prep.offsets"), [CSKEL, 3]),
|
|
208
|
-
prep_bind_pos: member(jointRows(prep.bindPos, 3, [0, 0, 0], "prep.bindPos"), [CSKEL, 3]),
|
|
209
|
-
prep_bind_quat: member(jointRows(prep.bindQuat, 4, [0, 0, 0, 1], "prep.bindQuat"), [CSKEL, 4]),
|
|
210
|
-
prep_bind_scale: member(jointRows(prep.bindScale, 3, [1, 1, 1], "prep.bindScale"), [CSKEL, 3]),
|
|
211
|
-
prep_bind_local_pos: member(jointRows(prep.bindLocalPos, 3, [0, 0, 0], "prep.bindLocalPos"), [CSKEL, 3]),
|
|
212
|
-
prep_parent_bind_world: member(jointRows(prep.parentBindWorld, 16, IDENTITY16, "prep.parentBindWorld"), [CSKEL, 4, 4]),
|
|
213
|
-
prep_chain_parent: member(chainParent, [CSKEL]),
|
|
214
|
-
prep_chain_rel: member(jointRows(prep.chainRel, 16, IDENTITY16, "prep.chainRel"), [CSKEL, 4, 4]),
|
|
215
|
-
prep_canonical_bone_length: member(Float32Array.from(finiteList(prep.canonicalBoneLength, CSKEL, "prep.canonicalBoneLength")), [CSKEL]),
|
|
216
|
-
prep_rig_bone_length: member(Float32Array.from(finiteList(prep.rigBoneLength, CSKEL, "prep.rigBoneLength")), [CSKEL]),
|
|
217
|
-
prep_stretched_leaves: member(leafIndex, [leaves.length, 2]),
|
|
218
|
-
prep_stretched_leaf_local_pos: member(leafPos, [leaves.length, 3]),
|
|
219
|
-
prep_stretched_leaf_local_quat: member(leafQuat, [leaves.length, 4]),
|
|
220
|
-
hierarchy_preserved: member(hierarchyPreserved, [CSKEL]),
|
|
221
|
-
girdle_joints: member(girdle, [CSKEL]),
|
|
222
|
-
ardy_neutral_min_y: member(Float32Array.of(prep.ardyNeutralMinY), [1]),
|
|
223
|
-
cskel27_parents: member(cskelParents, [CSKEL]),
|
|
224
|
-
cskel27_neutral: member(neutral, [CSKEL, 3]),
|
|
225
|
-
};
|
|
226
|
-
return { members, meta };
|
|
227
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { runBox } from "./run-box.mjs";
|
|
3
|
-
|
|
4
|
-
const tests = process.argv.slice(2);
|
|
5
|
-
if (!tests.length || tests.some(name => !/^test_[A-Za-z0-9_.-]+\.py$/.test(name))) {
|
|
6
|
-
console.error("usage: run-box-tests.mjs test_*.py [test_*.py ...]");
|
|
7
|
-
process.exit(2);
|
|
8
|
-
}
|
|
9
|
-
try {
|
|
10
|
-
await runBox({ entry: "pytest", args: ["-q", ...tests] });
|
|
11
|
-
} catch (error) {
|
|
12
|
-
console.error(error.message);
|
|
13
|
-
process.exitCode = 1;
|
|
14
|
-
}
|
package/tools/track/run-box.mjs
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { spawn } from "node:child_process";
|
|
3
|
-
import { randomBytes } from "node:crypto";
|
|
4
|
-
import { mkdirSync, readdirSync, statSync } from "node:fs";
|
|
5
|
-
import { fileURLToPath } from "node:url";
|
|
6
|
-
import { dirname, join } from "node:path";
|
|
7
|
-
|
|
8
|
-
const here = dirname(fileURLToPath(import.meta.url));
|
|
9
|
-
const host = process.env.COZYFIT_HOST || "ubuntu-baremetal";
|
|
10
|
-
const sshBase = ["-o", "BatchMode=yes", "-o", "ConnectTimeout=15", "-o", "ServerAliveInterval=15", "-o", "ServerAliveCountMax=3"];
|
|
11
|
-
const port = process.env.CCLAY_EXTRACT_SSH_PORT;
|
|
12
|
-
const sshFlags = port ? [...sshBase, "-p", port] : sshBase;
|
|
13
|
-
const scpFlags = port ? [...sshBase, "-P", port] : sshBase;
|
|
14
|
-
|
|
15
|
-
export const quote = value => `'${String(value).replaceAll("'", "'\\''")}'`;
|
|
16
|
-
export const idleCheck = `python3 - <<'PY'
|
|
17
|
-
from pathlib import Path
|
|
18
|
-
import subprocess
|
|
19
|
-
busy = []
|
|
20
|
-
for p in Path('/proc').iterdir():
|
|
21
|
-
if not p.name.isdigit(): continue
|
|
22
|
-
try:
|
|
23
|
-
argv = (p/'cmdline').read_bytes().split(b'\\0')
|
|
24
|
-
executable = Path(argv[0].decode(errors='replace')).name
|
|
25
|
-
cmd = b' '.join(argv).decode(errors='replace')
|
|
26
|
-
except (FileNotFoundError, ProcessLookupError, PermissionError): continue
|
|
27
|
-
if 'python' in executable and ('cclay_gvhmr' in cmd or 'cclay_bench' in cmd): busy.append(cmd)
|
|
28
|
-
usage = subprocess.check_output(['nvidia-smi','--query-compute-apps=used_memory','--format=csv,noheader,nounits'], text=True)
|
|
29
|
-
used = sum(int(v.strip()) for v in usage.splitlines() if v.strip())
|
|
30
|
-
if busy or used > 1600:
|
|
31
|
-
raise SystemExit('gpu-busy: ' + repr(busy) + '; compute memory=' + str(used) + ' MiB')
|
|
32
|
-
print('GPU idle for GVHMR; compute memory=' + str(used) + ' MiB')
|
|
33
|
-
PY`;
|
|
34
|
-
|
|
35
|
-
export function gpuBusyDecision({ processes = [], usedMiB = 0 } = {}) {
|
|
36
|
-
return processes.some(command => /(?:^|\s)python(?:\d(?:\.\d+)?)?(?:\s|$)/.test(command) && (command.includes("cclay_gvhmr") || command.includes("cclay_bench"))) || usedMiB > 1600;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function buildRemoteCommand(remote, entry, args = []) {
|
|
40
|
-
if (entry !== "pytest" && !/^[A-Za-z0-9_.-]+\.py$/.test(entry)) throw new Error(`invalid Python entry: ${entry}`);
|
|
41
|
-
const executable = entry === "pytest" ? "$HOME/cclay-ingest/cozyfit/.venv/bin/pytest" : "$HOME/cclay-ingest/cozyfit/.venv/bin/python";
|
|
42
|
-
const target = entry === "pytest" ? "" : ` ${quote(join(remote, entry))}`;
|
|
43
|
-
return `set -e\n${idleCheck}\ncd ${quote(remote)}\nexec ${executable}${target}${args.length ? ` ${args.map(quote).join(" ")}` : ""}`;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function exec(program, args, { onLine } = {}) {
|
|
47
|
-
return new Promise((resolve, reject) => {
|
|
48
|
-
const child = spawn(program, args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
49
|
-
let output = "", pending = "";
|
|
50
|
-
const onData = chunk => {
|
|
51
|
-
const text = String(chunk);
|
|
52
|
-
process.stdout.write(text);
|
|
53
|
-
output += text;
|
|
54
|
-
pending += text;
|
|
55
|
-
const lines = pending.split(/\\r?\\n/);
|
|
56
|
-
pending = lines.pop() ?? "";
|
|
57
|
-
for (const line of lines) if (line) onLine?.(line);
|
|
58
|
-
};
|
|
59
|
-
child.stdout.on("data", onData); child.stderr.on("data", onData);
|
|
60
|
-
child.once("error", reject);
|
|
61
|
-
child.once("close", code => {
|
|
62
|
-
if (pending) onLine?.(pending);
|
|
63
|
-
code === 0 ? resolve(output) : reject(new Error(`${program} exited ${code}: ${output.slice(-4000)}`));
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function pyFiles(root) {
|
|
69
|
-
return readdirSync(root).filter(name => name.endsWith(".py") && statSync(join(root, name)).isFile()).sort();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function transfer(item, kind) {
|
|
73
|
-
if (typeof item === "string") {
|
|
74
|
-
const separator = item.indexOf(":");
|
|
75
|
-
if (separator < 1 || separator === item.length - 1) throw new Error(`${kind} must be ${kind === "upload" ? "localPath:remoteRelPath" : "remoteRelPath:localPath"}`);
|
|
76
|
-
return kind === "upload"
|
|
77
|
-
? { localPath: item.slice(0, separator), remoteRelPath: item.slice(separator + 1) }
|
|
78
|
-
: { remoteRelPath: item.slice(0, separator), localPath: item.slice(separator + 1) };
|
|
79
|
-
}
|
|
80
|
-
const localPath = item?.localPath ?? item?.path;
|
|
81
|
-
const remoteRelPath = item?.remoteRelPath ?? item?.remotePath;
|
|
82
|
-
if (typeof localPath !== "string" || typeof remoteRelPath !== "string") throw new Error(`${kind} requires localPath and remoteRelPath`);
|
|
83
|
-
return { localPath, remoteRelPath };
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function safeRemoteRelPath(path) {
|
|
87
|
-
if (!path || path.startsWith("/") || path.split("/").includes("..")) throw new Error(`unsafe remote relative path: ${path}`);
|
|
88
|
-
return path;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export function normalizeTransfers(items = [], kind) {
|
|
92
|
-
return items.map(item => {
|
|
93
|
-
const value = transfer(item, kind);
|
|
94
|
-
return { ...value, remoteRelPath: safeRemoteRelPath(value.remoteRelPath) };
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Upload, run and fetch. When the remote command fails, every requested output
|
|
100
|
-
* that exists is still fetched (a failed tracker writes diagnostics.json), and
|
|
101
|
-
* the command's own error is rethrown with `fetched` = local paths retrieved.
|
|
102
|
-
* A missing output on a failed run never replaces that error. `spawnCommand`
|
|
103
|
-
* is the (program, args, {onLine}) -> Promise<output> seam for tests.
|
|
104
|
-
*/
|
|
105
|
-
export async function runBox({ entry, args = [], hostName = host, onLine, upload = [], fetch = [], spawnCommand = exec } = {}) {
|
|
106
|
-
if (!entry) throw new Error("usage: run-box.mjs <entry.py> [args...]");
|
|
107
|
-
if (entry !== "pytest" && !/^[A-Za-z0-9_.-]+\.py$/.test(entry)) throw new Error(`invalid Python entry: ${entry}`);
|
|
108
|
-
const uploads = normalizeTransfers(upload, "upload");
|
|
109
|
-
const fetches = normalizeTransfers(fetch, "fetch");
|
|
110
|
-
const remote = `/tmp/cozyfit-${Date.now()}-${randomBytes(5).toString("hex")}`;
|
|
111
|
-
const ssh = (command, options = {}) => spawnCommand("ssh", [...sshFlags, hostName, command], options);
|
|
112
|
-
const scp = (source, destination, options = {}) => spawnCommand("scp", [...scpFlags, source, destination], options);
|
|
113
|
-
const stream = { onLine };
|
|
114
|
-
let failure, output;
|
|
115
|
-
try {
|
|
116
|
-
await ssh(`umask 077 && mkdir -p ${quote(remote)}`, stream);
|
|
117
|
-
for (const name of pyFiles(join(here, "py"))) await scp(join(here, "py", name), `${hostName}:${join(remote, name)}`);
|
|
118
|
-
for (const item of uploads) {
|
|
119
|
-
await ssh(`mkdir -p ${quote(join(remote, item.remoteRelPath, ".."))}`, stream);
|
|
120
|
-
await scp(item.localPath, `${hostName}:${join(remote, item.remoteRelPath)}`);
|
|
121
|
-
}
|
|
122
|
-
let runError;
|
|
123
|
-
try { output = await ssh(buildRemoteCommand(remote, entry, args), stream); }
|
|
124
|
-
catch (error) { runError = error; }
|
|
125
|
-
const fetched = [];
|
|
126
|
-
for (const item of fetches) {
|
|
127
|
-
mkdirSync(join(item.localPath, ".."), { recursive: true });
|
|
128
|
-
if (!runError) {
|
|
129
|
-
await scp(`${hostName}:${join(remote, item.remoteRelPath)}`, item.localPath);
|
|
130
|
-
fetched.push(item.localPath);
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
// Best effort after a failed command: absent outputs are expected.
|
|
134
|
-
try {
|
|
135
|
-
await scp(`${hostName}:${join(remote, item.remoteRelPath)}`, item.localPath);
|
|
136
|
-
fetched.push(item.localPath);
|
|
137
|
-
} catch { /* the command error below is the reported failure */ }
|
|
138
|
-
}
|
|
139
|
-
if (runError) {
|
|
140
|
-
runError.fetched = fetched;
|
|
141
|
-
throw runError;
|
|
142
|
-
}
|
|
143
|
-
return fetches.length ? { output, fetched } : output;
|
|
144
|
-
} catch (error) {
|
|
145
|
-
failure = error;
|
|
146
|
-
throw error;
|
|
147
|
-
} finally {
|
|
148
|
-
try { await ssh(`rm -rf ${quote(remote)}`); }
|
|
149
|
-
catch (cleanupError) { if (failure) throw new AggregateError([failure, cleanupError], `box cleanup failed: ${remote}`); throw cleanupError; }
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
if (process.argv[1] && fileURLToPath(import.meta.url) === process.argv[1]) {
|
|
154
|
-
const argv = process.argv.slice(2), entry = argv.shift();
|
|
155
|
-
const args = [], upload = [], fetch = [];
|
|
156
|
-
for (let i = 0; i < argv.length; i++) {
|
|
157
|
-
const flag = argv[i];
|
|
158
|
-
if (flag === "--fetch" || flag === "--upload") {
|
|
159
|
-
const value = argv[++i];
|
|
160
|
-
if (!value) throw new Error(`${flag} requires a value`);
|
|
161
|
-
(flag === "--fetch" ? fetch : upload).push(value);
|
|
162
|
-
} else args.push(flag);
|
|
163
|
-
}
|
|
164
|
-
runBox({ entry, args, upload, fetch }).catch(error => {
|
|
165
|
-
console.error(error.message);
|
|
166
|
-
process.exitCode = 1;
|
|
167
|
-
});
|
|
168
|
-
}
|
package/tools/track/setup-box.sh
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
ROOT="$HOME/cclay-ingest/cozyfit"
|
|
5
|
-
VENV="$ROOT/.venv"
|
|
6
|
-
PYTHON="$VENV/bin/python"
|
|
7
|
-
GVHMR_PY="$HOME/cclay-ingest/GVHMR/.venv/bin/python"
|
|
8
|
-
|
|
9
|
-
if [[ ! -x "$GVHMR_PY" ]]; then
|
|
10
|
-
echo "missing GVHMR interpreter: $GVHMR_PY" >&2
|
|
11
|
-
exit 1
|
|
12
|
-
fi
|
|
13
|
-
read -r PY_MAJOR PY_MINOR < <("$GVHMR_PY" -c 'import sys; print(sys.version_info.major, sys.version_info.minor)')
|
|
14
|
-
PY_BIN="python${PY_MAJOR}.${PY_MINOR}"
|
|
15
|
-
if ! command -v "$PY_BIN" >/dev/null 2>&1; then
|
|
16
|
-
echo "missing matching Python minor: $PY_BIN" >&2
|
|
17
|
-
exit 1
|
|
18
|
-
fi
|
|
19
|
-
|
|
20
|
-
mkdir -p "$ROOT/checkpoints"
|
|
21
|
-
if [[ ! -x "$PYTHON" ]]; then
|
|
22
|
-
"$PY_BIN" -m venv "$VENV"
|
|
23
|
-
fi
|
|
24
|
-
|
|
25
|
-
# Keep all installs in CozyFit's venv. In particular, never invoke or modify
|
|
26
|
-
# the existing GVHMR environment after reading its Python minor above.
|
|
27
|
-
pip_install() {
|
|
28
|
-
"$PYTHON" - "$@" <<'PY'
|
|
29
|
-
import subprocess
|
|
30
|
-
import sys
|
|
31
|
-
subprocess.run([sys.executable, "-m", "pip", "install", *sys.argv[1:]], check=True, timeout=1200)
|
|
32
|
-
PY
|
|
33
|
-
}
|
|
34
|
-
pip_install --upgrade pip setuptools wheel
|
|
35
|
-
pip_install \
|
|
36
|
-
--index-url https://download.pytorch.org/whl/cu121 \
|
|
37
|
-
--extra-index-url https://pypi.org/simple \
|
|
38
|
-
'torch==2.5.1+cu121' 'torchvision==0.20.1+cu121'
|
|
39
|
-
pip_install \
|
|
40
|
-
'git+https://github.com/facebookresearch/sam2.git' \
|
|
41
|
-
fast-simplification numpy scipy opencv-python-headless pytest
|
|
42
|
-
|
|
43
|
-
CHECKPOINT="$ROOT/checkpoints/sam2.1_hiera_small.pt"
|
|
44
|
-
if [[ ! -s "$CHECKPOINT" ]]; then
|
|
45
|
-
tmp="$CHECKPOINT.tmp.$$"
|
|
46
|
-
trap 'rm -f "$tmp"' EXIT
|
|
47
|
-
curl --fail --location --retry 3 --connect-timeout 15 --max-time 900 \
|
|
48
|
-
-o "$tmp" \
|
|
49
|
-
https://dl.fbaipublicfiles.com/segment_anything_2/092824/sam2.1_hiera_small.pt
|
|
50
|
-
mv "$tmp" "$CHECKPOINT"
|
|
51
|
-
trap - EXIT
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
"$PYTHON" - <<'PY'
|
|
55
|
-
import torch
|
|
56
|
-
assert torch.__version__.startswith("2.5.1+cu121"), torch.__version__
|
|
57
|
-
import sam2
|
|
58
|
-
print("cozyfit environment ready", torch.__version__, sam2.__file__)
|
|
59
|
-
PY
|