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/kimodo/runner.mjs
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* runner.mjs — Kimodo backend for the generation bridge.
|
|
3
|
-
*
|
|
4
|
-
* Implements the same runner surface as tools/ardy/runners/{local,remote}.mjs
|
|
5
|
-
* ({ mode, describe, probeHealth, listBases, singleCommand, sequenceCommand,
|
|
6
|
-
* editCommand }) so bridge.mjs needs no backend-specific branch: it spawns the
|
|
7
|
-
* returned command and greps its `done - <path> (<bytes>)` line exactly as it
|
|
8
|
-
* does for ARDY.
|
|
9
|
-
*
|
|
10
|
-
* WHAT THIS BACKEND DOES NOT DO. Kimodo is wired here for text-to-motion
|
|
11
|
-
* sequencing, root 2D paths, pinned poses, motion edit and scheduled
|
|
12
|
-
* inpainting. Base clips remain ARDY-specific machinery in this repo (a base
|
|
13
|
-
* clip is autoregressive history, which Kimodo has no input for) and refuse by
|
|
14
|
-
* name instead of silently producing a take that ignored them.
|
|
15
|
-
*
|
|
16
|
-
* HOW SCHEDULED INPAINTING TRAVELS. Between this runner and the code that
|
|
17
|
-
* actually builds the kimodo_gen command line (tools/kimodo/generate.mjs) sit
|
|
18
|
-
* the two wrapper scripts run-sequence-on-box.mjs and run-edit-on-box.mjs,
|
|
19
|
-
* whose argv is a stable contract shared with the ARDY wrappers. Preserve
|
|
20
|
-
* inputs therefore ride the ENVIRONMENT, which is the channel every other
|
|
21
|
-
* Kimodo tunable already uses (CCLAY_KIMODO_GEN_FPS, _DIFFUSION_STEPS,
|
|
22
|
-
* _TRANSITION_FRAMES ...):
|
|
23
|
-
*
|
|
24
|
-
* CCLAY_KIMODO_PRESERVE JSON {basePath, sigmaS, sigmaE, strength,
|
|
25
|
-
* editRanges, maskPath, rootFree}
|
|
26
|
-
* CCLAY_KIMODO_NATIVE_OUT where this run keeps Kimodo's own npz, so a LATER
|
|
27
|
-
* run can preserve from it
|
|
28
|
-
*
|
|
29
|
-
* The round-2 additions ride the same channel untouched: `editRanges[i].tracks`
|
|
30
|
-
* scopes a range to its mask groups, and `rootFree` (set by the bridge when the
|
|
31
|
-
* request also carries waypoints) frees the mask's `root` group for the whole
|
|
32
|
-
* clip so the authored path owns the trajectory. Neither needs a flag here —
|
|
33
|
-
* boxEnv forwards the preserve object verbatim and generate.mjs is the only
|
|
34
|
-
* layer that interprets it. Waypoints themselves still travel on ARGV
|
|
35
|
-
* (`--root-2d`), so a preserve + waypoints run uses BOTH channels at once; that
|
|
36
|
-
* is why they compose without a merge step.
|
|
37
|
-
*/
|
|
38
|
-
|
|
39
|
-
import { fileURLToPath } from "node:url";
|
|
40
|
-
import { dirname, join } from "node:path";
|
|
41
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
42
|
-
import { spawn } from "node:child_process";
|
|
43
|
-
import { KIMODO_BACKENDS } from "./generate.mjs";
|
|
44
|
-
|
|
45
|
-
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
46
|
-
const RUN_SEQUENCE = join(HERE, "run-sequence-on-box.mjs");
|
|
47
|
-
const RUN_EDIT = join(HERE, "run-edit-on-box.mjs");
|
|
48
|
-
|
|
49
|
-
const SSH_OPTS = ["-o", "BatchMode=yes", "-o", "ConnectTimeout=10"];
|
|
50
|
-
|
|
51
|
-
function run(argv, timeoutMs = 60_000) {
|
|
52
|
-
return new Promise((resolve) => {
|
|
53
|
-
const child = spawn(argv[0], argv.slice(1), { stdio: ["ignore", "pipe", "pipe"] });
|
|
54
|
-
let stdout = "";
|
|
55
|
-
let stderr = "";
|
|
56
|
-
const timer = setTimeout(() => child.kill("SIGKILL"), timeoutMs);
|
|
57
|
-
child.stdout.on("data", (c) => (stdout += c));
|
|
58
|
-
child.stderr.on("data", (c) => (stderr += c));
|
|
59
|
-
child.on("close", (code) => {
|
|
60
|
-
clearTimeout(timer);
|
|
61
|
-
resolve({ code, stdout, stderr });
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Where a run whose bridge output is `outputPath` keeps Kimodo's OWN npz.
|
|
68
|
-
*
|
|
69
|
-
* `--base_motion` reads the format kimodo_gen writes (77-joint somaskel, no fps
|
|
70
|
-
* member); the file the bridge serves at /ardy/motions/<id> is the cskel27
|
|
71
|
-
* conversion of it and cannot be fed back in. One place decides this name:
|
|
72
|
-
* generate.mjs writes the file, baseMotionFor finds it again.
|
|
73
|
-
*/
|
|
74
|
-
export function nativeMotionPath(outputPath) {
|
|
75
|
-
return `${String(outputPath).replace(/\.npz$/i, "")}.kimodo.npz`;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** The preserve mask this run ships, kept beside the take for inspection. */
|
|
79
|
-
export function preserveMaskPath(outputPath) {
|
|
80
|
-
return join(dirname(outputPath), "preserve-mask.json");
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function unsupported(feature) {
|
|
84
|
-
return () => {
|
|
85
|
-
throw new Error(
|
|
86
|
-
`the Kimodo backend does not implement ${feature}`
|
|
87
|
-
);
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export function createKimodoRunner() {
|
|
92
|
-
const HOST = process.env.CCLAY_KIMODO_HOST || "";
|
|
93
|
-
let installed = {};
|
|
94
|
-
try { installed = JSON.parse(readFileSync(process.env.CCLAY_KIMODO_BACKEND_FILE || `${process.env.HOME || ""}/.cozyclay/kimodo-backend.json`, "utf8")); } catch {}
|
|
95
|
-
const BACKEND = process.env.CCLAY_KIMODO_BACKEND || installed.backend || "nvidia-cuda";
|
|
96
|
-
const REPO = process.env.CCLAY_KIMODO_REPO || (BACKEND === "kimodo-mlx" ? "$HOME/.cozyclay/kimodo-mlx" : BACKEND.startsWith("kimodo.cpp") ? "$HOME/.cozyclay/kimodo.cpp" : "$HOME/.cozyclay/kimodo");
|
|
97
|
-
const MODEL = process.env.CCLAY_KIMODO_MODEL || installed.model || "Kimodo-SOMA-RP-v1.1";
|
|
98
|
-
const MOTION = process.env.CCLAY_KIMODO_MLX_MOTION || process.env.CCLAY_KIMODO_CPP_MOTION_GGUF || installed.motion || "";
|
|
99
|
-
const TEXT = process.env.CCLAY_KIMODO_MLX_TEXT || process.env.CCLAY_KIMODO_CPP_TEXT_BUNDLE || installed.text || "";
|
|
100
|
-
const TARGET_FPS = Number(process.env.CCLAY_KIMODO_TARGET_FPS || 24);
|
|
101
|
-
|
|
102
|
-
if (!HOST && BACKEND === "nvidia-cuda") {
|
|
103
|
-
throw new Error("CCLAY_KIMODO_HOST is required for the Kimodo backend (for example: user@gpu-box)");
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function expandHome(path) {
|
|
107
|
-
return path?.startsWith("$HOME/") ? join(process.env.HOME || "", path.slice(6)) : path;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function localArtifactReady(path) {
|
|
111
|
-
return Boolean(path && existsSync(expandHome(path)));
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function localRuntimeReady() {
|
|
115
|
-
const spec = KIMODO_BACKENDS[BACKEND];
|
|
116
|
-
if (!spec || spec.mode === "cuda") return false;
|
|
117
|
-
const entry = spec.entry.startsWith("$HOME/") ? spec.entry : `${REPO}/${spec.entry}`;
|
|
118
|
-
return existsSync(expandHome(entry));
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
async function probeHealth() {
|
|
122
|
-
if (!HOST) {
|
|
123
|
-
// A selected local route is not end-to-end ready merely because its
|
|
124
|
-
// wrapper is installed. Generation also needs both model artifacts.
|
|
125
|
-
const defaults = KIMODO_BACKENDS[BACKEND];
|
|
126
|
-
const artifactsReady = localRuntimeReady()
|
|
127
|
-
&& localArtifactReady(MOTION || defaults.motion)
|
|
128
|
-
&& localArtifactReady(TEXT || defaults.text);
|
|
129
|
-
return {
|
|
130
|
-
ok: artifactsReady,
|
|
131
|
-
backend: "local_kimodo",
|
|
132
|
-
host: "local",
|
|
133
|
-
host_configured: true,
|
|
134
|
-
encoder: "in-process",
|
|
135
|
-
device: "local",
|
|
136
|
-
...(artifactsReady ? {} : { capabilities: { lineEdit: false } }),
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
const remote = [
|
|
140
|
-
`cd ${REPO}`,
|
|
141
|
-
`DEV="$(.venv/bin/python -c 'import torch; print("cuda:0" if torch.cuda.is_available() else "cpu")')"`,
|
|
142
|
-
`printf 'device=%s\\n' "$DEV"`,
|
|
143
|
-
].join(" && ");
|
|
144
|
-
const { code, stdout, stderr } = await run(["ssh", ...SSH_OPTS, HOST, remote]);
|
|
145
|
-
if (code !== 0) {
|
|
146
|
-
throw new Error(`ssh probe on ${HOST} failed (exit ${code}): ${stderr.trim().split("\n").pop()}`);
|
|
147
|
-
}
|
|
148
|
-
const device = /^device=(.*)$/m.exec(stdout)?.[1] ?? "unknown";
|
|
149
|
-
// Kimodo needs no separate encoder sidecar: the text encoder loads in
|
|
150
|
-
// the generation process (on the CPU by default here), so health has
|
|
151
|
-
// nothing to report for it and says so rather than faking a port.
|
|
152
|
-
return { ok: true, host: HOST, encoder: "in-process", device };
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Kimodo generates from text and constraints only — it takes no base clip,
|
|
156
|
-
// so there is nothing to list. An empty listing is a valid answer, not a
|
|
157
|
-
// failure, and the bridge already tolerates it.
|
|
158
|
-
async function listBases() {
|
|
159
|
-
return [];
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// The environment every box wrapper inherits. Scheduled inpainting is
|
|
163
|
-
// carried here rather than on argv (see the header); both keys are DELETED
|
|
164
|
-
// when this run does not want them, because process.env is inherited from a
|
|
165
|
-
// long-lived sidecar and a leftover value would silently preserve the wrong
|
|
166
|
-
// take on the next request.
|
|
167
|
-
function boxEnv({ output, keepNative = false, preserve = null } = {}) {
|
|
168
|
-
const env = {
|
|
169
|
-
...process.env,
|
|
170
|
-
CCLAY_KIMODO_HOST: HOST,
|
|
171
|
-
CCLAY_KIMODO_REPO: REPO,
|
|
172
|
-
CCLAY_KIMODO_MODEL: MODEL,
|
|
173
|
-
...(MOTION ? { CCLAY_KIMODO_MLX_MOTION: MOTION, CCLAY_KIMODO_CPP_MOTION_GGUF: MOTION } : {}),
|
|
174
|
-
...(TEXT ? { CCLAY_KIMODO_MLX_TEXT: TEXT, CCLAY_KIMODO_CPP_TEXT_BUNDLE: TEXT } : {}),
|
|
175
|
-
};
|
|
176
|
-
delete env.CCLAY_KIMODO_NATIVE_OUT;
|
|
177
|
-
delete env.CCLAY_KIMODO_PRESERVE;
|
|
178
|
-
if (keepNative && output) env.CCLAY_KIMODO_NATIVE_OUT = nativeMotionPath(output);
|
|
179
|
-
if (preserve && output) {
|
|
180
|
-
// `preserve.basePath` is a take to reconstruct, NOT the ARDY `basePath`
|
|
181
|
-
// (autoregressive history) that singleCommand still refuses below.
|
|
182
|
-
env.CCLAY_KIMODO_PRESERVE = JSON.stringify({ ...preserve, maskPath: preserveMaskPath(output) });
|
|
183
|
-
}
|
|
184
|
-
return env;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// Which artifact of an earlier run can serve as this backend's preserve
|
|
188
|
-
// base, or null when that take has none — it was spliced together rather
|
|
189
|
-
// than generated whole, or it predates scheduled inpainting. The bridge
|
|
190
|
-
// degrades to a plain generation and says so on the status stream.
|
|
191
|
-
function baseMotionFor(motionPath) {
|
|
192
|
-
const native = nativeMotionPath(motionPath);
|
|
193
|
-
return existsSync(native) ? native : null;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function sequenceCommand({ segments, waypoints, poseFroms, seed, output, keepNative, preserve }) {
|
|
197
|
-
const args = [RUN_SEQUENCE];
|
|
198
|
-
for (const segment of segments) {
|
|
199
|
-
args.push("--segment", segment.prompt, String(segment.durationS));
|
|
200
|
-
}
|
|
201
|
-
// Root waypoints become a Kimodo root2d constraint downstream; the same
|
|
202
|
-
// 4-token shape the ARDY wrapper takes, so the bridge passes them through
|
|
203
|
-
// unchanged regardless of backend.
|
|
204
|
-
for (const waypoint of waypoints || []) {
|
|
205
|
-
args.push(
|
|
206
|
-
"--root-2d",
|
|
207
|
-
String(waypoint.frame),
|
|
208
|
-
String(waypoint.x),
|
|
209
|
-
String(waypoint.z),
|
|
210
|
-
waypoint.heading === null || waypoint.heading === undefined ? "none" : String(waypoint.heading)
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
for (const entry of poseFroms || []) {
|
|
214
|
-
args.push("--pose", entry.npz, String(entry.dstFrame));
|
|
215
|
-
}
|
|
216
|
-
if (Number.isInteger(seed)) args.push("--seed", String(seed));
|
|
217
|
-
args.push("--target-fps", String(TARGET_FPS), "--output", output);
|
|
218
|
-
return {
|
|
219
|
-
command: process.execPath,
|
|
220
|
-
args,
|
|
221
|
-
env: boxEnv({ output, keepNative, preserve }),
|
|
222
|
-
doneRe: /^run-kimodo-sequence: done - (.+) \((\d+) bytes\)$/,
|
|
223
|
-
label: "run-kimodo-sequence",
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// A single prompt is just a one-segment sequence, but only when the request
|
|
228
|
-
// carries none of the ARDY-only conditioning.
|
|
229
|
-
function singleCommand({ prompt, durationS, seed, output, basePath, poseFroms, waypoints, keepNative, preserve }) {
|
|
230
|
-
if (basePath) throw new Error("the Kimodo backend does not implement base clips");
|
|
231
|
-
return sequenceCommand({
|
|
232
|
-
segments: [{ prompt, durationS }],
|
|
233
|
-
waypoints,
|
|
234
|
-
keepNative,
|
|
235
|
-
preserve,
|
|
236
|
-
// Pinned poses become Kimodo `fullbody` constraints downstream. The
|
|
237
|
-
// bridge hands them over as npz paths plus the clip frame to pin them
|
|
238
|
-
// at; src-frame is an ARDY concept (which frame of a multi-frame npz to
|
|
239
|
-
// read) and a cclay pose npz always holds exactly one.
|
|
240
|
-
poseFroms,
|
|
241
|
-
seed,
|
|
242
|
-
output,
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// Regenerating a span is a whole-clip generation pinned to the source take on
|
|
247
|
-
// both sides of the edit, then spliced back — Kimodo has no history input, so
|
|
248
|
-
// the surrounding motion is expressed as constraints instead.
|
|
249
|
-
function editCommand({ source, manifest, prompt, contextBefore, contextAfter, seed, output, preserve }) {
|
|
250
|
-
const args = [
|
|
251
|
-
RUN_EDIT,
|
|
252
|
-
"--source", source,
|
|
253
|
-
"--manifest", manifest,
|
|
254
|
-
"--prompt", prompt,
|
|
255
|
-
"--context-before", String(contextBefore ?? 0),
|
|
256
|
-
"--context-after", String(contextAfter ?? 0),
|
|
257
|
-
"--target-fps", String(TARGET_FPS),
|
|
258
|
-
];
|
|
259
|
-
if (Number.isInteger(seed)) args.push("--seed", String(seed));
|
|
260
|
-
args.push("--output", output);
|
|
261
|
-
return {
|
|
262
|
-
command: process.execPath,
|
|
263
|
-
args,
|
|
264
|
-
// An edit SPLICES its regenerated span into the source take, so the
|
|
265
|
-
// npz Kimodo wrote is not the take that comes out and must never be
|
|
266
|
-
// kept as a base — keepNative stays off here. Preserving one is a
|
|
267
|
-
// different direction and fully supported.
|
|
268
|
-
env: boxEnv({ output, keepNative: false, preserve }),
|
|
269
|
-
doneRe: /^run-kimodo-edit: done - (.+) \((\d+) bytes\)$/,
|
|
270
|
-
label: "run-kimodo-edit",
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
return {
|
|
275
|
-
mode: "kimodo",
|
|
276
|
-
describe: () => `${HOST ? `box ${HOST}` : "local"} (${BACKEND}, repo ${REPO}, model ${MODEL}, retimed to ${TARGET_FPS} fps${HOST ? "" : ", single unconstrained SOMA30 prompt to Studio NPZ"})`,
|
|
277
|
-
probeHealth,
|
|
278
|
-
listBases,
|
|
279
|
-
baseMotionFor,
|
|
280
|
-
singleCommand,
|
|
281
|
-
sequenceCommand,
|
|
282
|
-
editCommand,
|
|
283
|
-
};
|
|
284
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* seam-batch.mjs — aggregate seam behaviour over several seeds so the ARDY vs
|
|
3
|
-
* Kimodo comparison rests on a distribution rather than one lucky sample.
|
|
4
|
-
*
|
|
5
|
-
* Everything is per SECOND because the two backends run at different frame
|
|
6
|
-
* rates (ARDY-Core 20 fps, Kimodo-SOMA 30 fps).
|
|
7
|
-
*
|
|
8
|
-
* usage: seam-batch.mjs <label> <fps> <glob-dir> <prefix> [...]
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { readdirSync } from "node:fs";
|
|
12
|
-
import { join } from "node:path";
|
|
13
|
-
import { readNpz } from "./read-npz.mjs";
|
|
14
|
-
import { seamReport } from "./compare-seam.mjs";
|
|
15
|
-
|
|
16
|
-
function stats(values) {
|
|
17
|
-
if (values.length === 0) return null;
|
|
18
|
-
const sorted = [...values].sort((a, b) => a - b);
|
|
19
|
-
const mean = values.reduce((a, b) => a + b, 0) / values.length;
|
|
20
|
-
return {
|
|
21
|
-
n: values.length,
|
|
22
|
-
mean,
|
|
23
|
-
median: sorted[Math.floor(sorted.length / 2)],
|
|
24
|
-
min: sorted[0],
|
|
25
|
-
max: sorted[sorted.length - 1],
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function collect(dir, prefix, fps, boundaryFraction) {
|
|
30
|
-
const files = readdirSync(dir).filter((f) => f.startsWith(prefix) && f.endsWith(".npz"));
|
|
31
|
-
const rows = [];
|
|
32
|
-
for (const file of files.sort()) {
|
|
33
|
-
const members = readNpz(join(dir, file));
|
|
34
|
-
const root = members.root_positions ?? members.smooth_root_pos;
|
|
35
|
-
if (!root) continue;
|
|
36
|
-
const frames = root.shape[0];
|
|
37
|
-
const report = seamReport(root.data, frames, fps, Math.round(frames * boundaryFraction));
|
|
38
|
-
rows.push({ file, ...report });
|
|
39
|
-
}
|
|
40
|
-
return rows;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const [, , ...args] = process.argv;
|
|
44
|
-
// label fps dir prefix boundaryFraction
|
|
45
|
-
const groups = [];
|
|
46
|
-
for (let i = 0; i < args.length; i += 5) {
|
|
47
|
-
groups.push({
|
|
48
|
-
label: args[i],
|
|
49
|
-
fps: Number(args[i + 1]),
|
|
50
|
-
dir: args[i + 2],
|
|
51
|
-
prefix: args[i + 3],
|
|
52
|
-
boundaryFraction: Number(args[i + 4]),
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
for (const group of groups) {
|
|
57
|
-
const rows = collect(group.dir, group.prefix, group.fps, group.boundaryFraction);
|
|
58
|
-
if (rows.length === 0) {
|
|
59
|
-
console.log(`\n=== ${group.label} === (no files matched ${group.prefix} in ${group.dir})`);
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
const stall = stats(rows.map((r) => r.stall_ratio));
|
|
63
|
-
const cruise = stats(rows.map((r) => r.cruise_speed_mps));
|
|
64
|
-
const seamMin = stats(rows.map((r) => r.seam_min_speed_mps));
|
|
65
|
-
console.log(`\n=== ${group.label} === (${rows.length} takes @ ${group.fps} fps)`);
|
|
66
|
-
console.log(
|
|
67
|
-
` STALL RATIO mean ${stall.mean.toFixed(3)} median ${stall.median.toFixed(3)} min ${stall.min.toFixed(3)} max ${stall.max.toFixed(3)}`
|
|
68
|
-
);
|
|
69
|
-
console.log(` cruise m/s mean ${cruise.mean.toFixed(3)}`);
|
|
70
|
-
console.log(` seam min m/s mean ${seamMin.mean.toFixed(3)}`);
|
|
71
|
-
for (const row of rows) {
|
|
72
|
-
console.log(
|
|
73
|
-
` ${row.file.padEnd(24)} stall ${row.stall_ratio.toFixed(3)} cruise ${row.cruise_speed_mps.toFixed(2)} seammin ${row.seam_min_speed_mps.toFixed(2)}`
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
console.log("");
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/** Install Kimodo on the configured remote GPU host. */
|
|
3
|
-
import { spawnSync } from "node:child_process";
|
|
4
|
-
import { readFileSync } from "node:fs";
|
|
5
|
-
import { dirname, join } from "node:path";
|
|
6
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
-
|
|
8
|
-
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
9
|
-
const script = join(HERE, "setup-on-box.sh");
|
|
10
|
-
const host = process.env.CCLAY_KIMODO_HOST || "";
|
|
11
|
-
const args = process.argv.slice(2);
|
|
12
|
-
|
|
13
|
-
function usage() {
|
|
14
|
-
console.log("Usage: CCLAY_KIMODO_HOST=user@gpu-box node tools/kimodo/setup-local.mjs [installer options]");
|
|
15
|
-
console.log("Passes options to setup-on-box.sh; use --dry-run to inspect without changing the host.");
|
|
16
|
-
}
|
|
17
|
-
if (args.includes("--help") || args.includes("-h")) { usage(); process.exit(0); }
|
|
18
|
-
if (!host) {
|
|
19
|
-
console.error("setup-kimodo: CCLAY_KIMODO_HOST is required (for example user@gpu-box)");
|
|
20
|
-
process.exit(2);
|
|
21
|
-
}
|
|
22
|
-
const result = spawnSync("ssh", ["-o", "BatchMode=yes", "-o", "ConnectTimeout=15", host, "bash -s --", ...args], {
|
|
23
|
-
input: readFileSync(script),
|
|
24
|
-
stdio: ["pipe", "inherit", "inherit"],
|
|
25
|
-
});
|
|
26
|
-
if (result.error) {
|
|
27
|
-
console.error(`setup-kimodo: ssh failed: ${result.error.message}`);
|
|
28
|
-
process.exit(1);
|
|
29
|
-
}
|
|
30
|
-
process.exit(result.status ?? 1);
|