cozyclay 2.1.1 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +88 -0
- package/README.md +12 -30
- package/bin/agent/agent-routes.mjs +43 -116
- package/bin/agent/agent-runner.mjs +14 -15
- 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/session-store.mjs +2 -2
- package/bin/agent/studio-context-budget.mjs +93 -0
- 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-BWCqdgWA.js +1 -0
- package/dist/assets/app-DfTCxaKk.js +5087 -0
- package/dist/assets/app-f-fkV5uP.css +1 -0
- package/dist/assets/compile-worker-BxKXh07s.js +5 -0
- package/dist/assets/fflate.module-KbGj5-H6.js +5 -0
- package/dist/assets/{first-shot-handoff-msLI71g1.js → first-shot-handoff-DNO8kv_N.js} +1 -1
- package/dist/assets/{landing-ChUvB_zL.js → landing-yfZaJkWc.js} +1 -1
- package/dist/assets/scene-asset-sync-U3kS2rvK.js +20 -0
- package/dist/assets/scene-asset-sync-_S8NQl5B.css +1 -0
- package/dist/assets/workflow-D78eiKTa.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 +151 -2625
- package/src/agent-progress.js +80 -0
- package/src/agent-turn-mark.js +30 -0
- package/src/analytics.js +1 -19
- package/src/app-context.js +12 -2
- 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 +10 -8
- 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 +214 -0
- package/src/commands/objects.js +6 -4
- package/src/commands/shot.js +55 -13
- 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 +53 -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 +47 -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 +60 -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 +79 -0
- package/src/motion3/compile-worker.js +10 -0
- package/src/motion3/compiler/anchors.js +113 -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 +197 -0
- package/src/motion3/compiler/math.js +72 -0
- package/src/motion3/compiler/pose.js +177 -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 +144 -0
- package/src/motion3/compiler/validate-parts.js +118 -0
- package/src/motion3/compiler/validate.js +122 -0
- package/src/motion3/compiler/vocab.js +74 -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 +177 -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 +204 -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/people.js +82 -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 +125 -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 +195 -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 +44 -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/people-checks.js +37 -0
- package/src/motion3/qa/severity.js +38 -0
- package/src/motion3/qa/spec-checks.js +65 -0
- package/src/motion3/qa/style.js +228 -0
- package/src/motion3/qa/wrist-checks.js +69 -0
- package/src/motion3/qa/wrist-obs.js +60 -0
- package/src/motion3/refs.js +129 -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 +113 -0
- package/src/motion3/schema/types.js +149 -0
- package/src/motion3/search.js +117 -0
- package/src/motion3/second-hand.js +112 -0
- package/src/motion3/settle.js +136 -0
- package/src/motion3/skills/basic.js +83 -0
- package/src/motion3/skills/book.js +76 -0
- package/src/motion3/skills/car.js +145 -0
- package/src/motion3/skills/flip.js +200 -0
- package/src/motion3/skills/frames-auto.js +29 -0
- package/src/motion3/skills/impact.js +109 -0
- package/src/motion3/skills/index.js +85 -0
- package/src/motion3/skills/info.js +80 -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/qa-label.js +25 -0
- 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 +16 -14
- package/src/studio-agent-commands.js +19 -16
- package/src/studio-agent-motion.js +9 -9
- package/src/studio-agent-protocol.js +47 -77
- package/src/studio-app-binding.js +27 -47
- 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 +15 -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 +109 -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 +9 -125
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"payload":"{\"distribution\":\"npm\",\"package\":\"cozyclay\",\"version\":\"
|
|
1
|
+
{"payload":"{\"distribution\":\"npm\",\"package\":\"cozyclay\",\"version\":\"3.0.1\",\"repository\":\"NomaDamas/CozyClay\",\"content_sha256\":\"bedf955b7367c9d4e883baa9c0b6fd14a205f6d39a3bf447f628488cd2893564\"}","signature":"+2TEXB+bXFUPN34/ls1YvimKkHfSdSCs0IiIyjIhsHqvz3j+XcKkEkqx1zjXn8MQlybgStGOS290YH40Nw1hBQ=="}
|
package/dist/index.html
CHANGED
|
@@ -301,9 +301,9 @@
|
|
|
301
301
|
.btn, a.card, .seg button, .tutorial-steps li { transition: none; }
|
|
302
302
|
}
|
|
303
303
|
</style>
|
|
304
|
-
<script type="module" crossorigin src="/assets/landing-
|
|
305
|
-
<link rel="modulepreload" crossorigin href="/assets/analytics-
|
|
306
|
-
<link rel="modulepreload" crossorigin href="/assets/first-shot-handoff-
|
|
304
|
+
<script type="module" crossorigin src="/assets/landing-yfZaJkWc.js"></script>
|
|
305
|
+
<link rel="modulepreload" crossorigin href="/assets/analytics-BWCqdgWA.js">
|
|
306
|
+
<link rel="modulepreload" crossorigin href="/assets/first-shot-handoff-DNO8kv_N.js">
|
|
307
307
|
</head>
|
|
308
308
|
<body>
|
|
309
309
|
<header class="site">
|
package/dist/sw.js
CHANGED
|
@@ -9,7 +9,8 @@ const CACHE_PREFIX = "cozyclay-pwa-";
|
|
|
9
9
|
// v6 also: hosted demo and ticket pages are network-only; never freeze queue state.
|
|
10
10
|
// v7: force-refresh the asset cache — v6 clients were holding a stale app shell
|
|
11
11
|
// (the html-flex crash-screen regression) and never re-fetching it.
|
|
12
|
-
|
|
12
|
+
// v8: CozyClay 3 drops the shipped walk clip (motion is compiled in the studio).
|
|
13
|
+
const CACHE_NAME = `${CACHE_PREFIX}v8`;
|
|
13
14
|
// The installable app is the studio, not the landing page.
|
|
14
15
|
const APP_SHELL = "/app/";
|
|
15
16
|
const CORE_ASSETS = [
|
|
@@ -23,7 +24,6 @@ const CORE_ASSETS = [
|
|
|
23
24
|
"./icons/apple-touch-icon.png",
|
|
24
25
|
"./favicon.ico",
|
|
25
26
|
"./fonts/inter-latin.woff2",
|
|
26
|
-
"./demo/walk-then-stop.npz",
|
|
27
27
|
"./models/x-bot-tpose.fbx",
|
|
28
28
|
"./models/y-bot-tpose.fbx",
|
|
29
29
|
];
|
|
@@ -79,14 +79,11 @@ self.addEventListener("message", (event) => {
|
|
|
79
79
|
self.addEventListener("fetch", (event) => {
|
|
80
80
|
const { request } = event;
|
|
81
81
|
const url = new URL(request.url);
|
|
82
|
-
// The composer and ticket are live API surfaces. A stale shell would either
|
|
83
|
-
// submit with an old Turnstile key or show a frozen queue position.
|
|
84
|
-
if (url.pathname.startsWith("/d/") || url.pathname.startsWith("/demo/")) return;
|
|
85
82
|
// Landing-page playground presets are edited in place; a cache-first hit
|
|
86
83
|
// would pin the first version a visitor ever saw.
|
|
87
84
|
if (url.pathname.startsWith("/scenes/")) return;
|
|
88
85
|
if (request.method !== "GET") return;
|
|
89
|
-
if (url.origin !== self.location.origin
|
|
86
|
+
if (url.origin !== self.location.origin) return;
|
|
90
87
|
if (request.headers.has("range")) {
|
|
91
88
|
event.respondWith((async () => {
|
|
92
89
|
try {
|
package/dist/workflow/index.html
CHANGED
|
@@ -8,11 +8,12 @@
|
|
|
8
8
|
<meta name="theme-color" content="#101116" />
|
|
9
9
|
<meta name="description" content="CozyClay visual workflow builder" />
|
|
10
10
|
<title>CozyClay Workflow</title>
|
|
11
|
-
<script type="module" crossorigin src="/assets/workflow-
|
|
11
|
+
<script type="module" crossorigin src="/assets/workflow-D78eiKTa.js"></script>
|
|
12
12
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-hePW80VL.js">
|
|
13
|
-
<link rel="modulepreload" crossorigin href="/assets/analytics-
|
|
14
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
15
|
-
<link rel="
|
|
13
|
+
<link rel="modulepreload" crossorigin href="/assets/analytics-BWCqdgWA.js">
|
|
14
|
+
<link rel="modulepreload" crossorigin href="/assets/fflate.module-KbGj5-H6.js">
|
|
15
|
+
<link rel="modulepreload" crossorigin href="/assets/scene-asset-sync-U3kS2rvK.js">
|
|
16
|
+
<link rel="stylesheet" crossorigin href="/assets/scene-asset-sync-_S8NQl5B.css">
|
|
16
17
|
<link rel="stylesheet" crossorigin href="/assets/workflow-DRdwoDBT.css">
|
|
17
18
|
</head>
|
|
18
19
|
<body>
|
package/mcp/LIVE-PROTOCOL.md
CHANGED
|
@@ -43,28 +43,15 @@ server -> editor, one per command:
|
|
|
43
43
|
|
|
44
44
|
{ "type": "cmd", "id": "<opaque string>", "name": "<command>", "args": { ... } }
|
|
45
45
|
|
|
46
|
-
server -> editor, for an MCP-owned motion job state or terminal outcome (and again
|
|
47
|
-
on reconnect while retained). A completed event follows the editor's successful
|
|
48
|
-
`load_motion` acknowledgement:
|
|
49
|
-
|
|
50
|
-
{ "type": "event", "name": "motion_job", "payload": { "taskId", "status", "createdAt", "lastUpdatedAt", "ttlMs", "pollIntervalMs", "outcome?" } }
|
|
51
|
-
|
|
52
|
-
editor -> server, to cancel its own active job before editor delivery:
|
|
53
|
-
|
|
54
|
-
{ "type": "event", "name": "motion_job_cancel", "payload": { "taskId": "<opaque task id>" } }
|
|
55
|
-
|
|
56
46
|
editor -> server, one per command, echoing `id`:
|
|
57
47
|
|
|
58
48
|
{ "type": "result", "id": "<same id>", "ok": true, "value": { ... } }
|
|
59
49
|
{ "type": "result", "id": "<same id>", "ok": false, "error": "<human message>" }
|
|
60
50
|
|
|
61
51
|
Unknown `name` MUST answer `ok:false`, never silence. The server times a
|
|
62
|
-
command out after 5 s and treats it as failed, except `
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
justifies the existing headroom: 12 real editor installs of one 94,672-byte
|
|
66
|
-
ARDY NPZ had nearest-rank p50 29.96 ms, p95 547.29 ms, and p99 547.29 ms;
|
|
67
|
-
30 s remains appropriate for materially larger cold-cache production takes. A timeout or disconnect during
|
|
52
|
+
command out after 5 s and treats it as failed, except `import_asset` and the
|
|
53
|
+
Studio commands (`inspect_studio`, `run_action`, `capture_framing_png`, ...),
|
|
54
|
+
which retain a dedicated 30 s editor bound. A timeout or disconnect during
|
|
68
55
|
a mutation is ambiguous: it may already have applied, so callers MUST NOT retry
|
|
69
56
|
blindly and should `describe` before recovering.
|
|
70
57
|
|
|
@@ -113,29 +100,6 @@ can wait for an editor instead of polling:
|
|
|
113
100
|
|
|
114
101
|
{ "type": "event", "name": "editor_connected" | "editor_disconnected", "payload": { "handle", "workspaceId", "meta" } }
|
|
115
102
|
|
|
116
|
-
## Motion jobs
|
|
117
|
-
|
|
118
|
-
`generate_motion` returns immediately with exactly `{ taskId, status, createdAt,
|
|
119
|
-
lastUpdatedAt, ttlMs, pollIntervalMs }`; `pollIntervalMs` is `0` because the
|
|
120
|
-
model never polls it. The MCP server retains terminal outcomes for `ttlMs`
|
|
121
|
-
(currently 10 minutes) and pushes `motion_job` to the matching stable workspace
|
|
122
|
-
on completion, failure, cancellation, or reconnect. For a completed job, the
|
|
123
|
-
server first installs the take through the request/response `load_motion`
|
|
124
|
-
command, then publishes the terminal lifecycle event. The event never installs
|
|
125
|
-
the take a second time. A retained outcome that passes its TTL is explicitly
|
|
126
|
-
expired and is never replayed.
|
|
127
|
-
|
|
128
|
-
If the editor explicitly rejects `load_motion`, the job transitions to `failed`
|
|
129
|
-
and publishes that terminal event. If the socket disconnects or times out while
|
|
130
|
-
installation is in flight, the job also fails but is not retried: the mutation
|
|
131
|
-
may already have applied, so retrying could install the same take twice.
|
|
132
|
-
|
|
133
|
-
Cancellation is cooperative at the bridge HTTP stream: `motion_job_cancel`
|
|
134
|
-
aborts that request. The ARDY bridge detects the disconnected stream and kills
|
|
135
|
-
its request-owned child process groups. A cancelled job is terminal and is never
|
|
136
|
-
sent to editor installation. There are no `tasks/*` tools or start/status/list
|
|
137
|
-
polling tools in the MCP surface.
|
|
138
|
-
|
|
139
103
|
## Commands (v1)
|
|
140
104
|
|
|
141
105
|
All coordinates are metres, rotations are degrees of yaw, ids are the ids the
|
|
@@ -158,8 +122,6 @@ scene document already uses.
|
|
|
158
122
|
| `group_objects` | `{ parent, children }` | `{ parent, children }` | attach every child under parent |
|
|
159
123
|
| `ungroup_objects` | `{ children }` | `{ children }` | detach every child |
|
|
160
124
|
| `apply_batch` | `{ ops, atomic?: false, stopOnError?: true, label?: "MCP batch" }` | `{ label, applied: number[], failed: [{ index, error }], rolledBack }` | executes at most 100 object mutations as one undo entry. `atomic` and `stopOnError` are independent; atomic failure restores the pre-batch objects and creates no undo entry. Nested batches are rejected. v1 rejects character mutations because cast history is a separate store. |
|
|
161
|
-
| `set_prompt_blocks` | `{ blocks: [{ startFrame, endFrame, text }] }` | `{ blocks }` | replace the active character's authored prompt clips after validating each frame range and text |
|
|
162
|
-
| `load_motion` | `{ url, prompt?, blocks?, drop? }` | `{ loaded, url, blocks }` | install an ARDY motion on the selected character. It has the dedicated 30-second editor-processing timeout; motion-job completion carries the character id captured when generation started |
|
|
163
125
|
| `load_scenes` | `{ document }` | `{ sceneName, activeSceneId, scenes: [{ id, name }] }` | replace the whole scene document (same shape `serializeSceneDocument` emits); the response attests the full scene list and active scene for `add_scene` and `switch_scene` parity |
|
|
164
126
|
|
|
165
127
|
### Previs mode and character kind in the Studio context
|
|
@@ -176,12 +138,10 @@ is admitted against. Two parts of it describe what a project and its cast can do
|
|
|
176
138
|
|
|
177
139
|
Before an animation-only tool runs, the server reads these fields from the
|
|
178
140
|
context it admits the command against (`mark_camera_move`, which sends no
|
|
179
|
-
command, reads `previsMode` from `describe`). In a storyboard project
|
|
180
|
-
`mark_camera_move`
|
|
181
|
-
no command
|
|
182
|
-
|
|
183
|
-
editor's own motion, take, IK and pose commands refuse a capsule figure with
|
|
184
|
-
`TARGET_NOT_READY` as well, so `studio_run` reaches the same answer.
|
|
141
|
+
command, reads `previsMode` from `describe`). In a storyboard project
|
|
142
|
+
`mark_camera_move` answers `{ ok: false, code: "NOT_IN_MODE", reason }` and sends
|
|
143
|
+
no command. The editor's own motion, take, IK and pose commands refuse a capsule
|
|
144
|
+
figure with `TARGET_NOT_READY`, so `studio_run` reaches that answer.
|
|
185
145
|
|
|
186
146
|
## Hard rules for the editor side
|
|
187
147
|
|
package/mcp/README.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# CozyClay MCP server
|
|
2
2
|
|
|
3
3
|
Lets an AI assistant (Claude Desktop, Cursor, any MCP client) block a scene, place the camera,
|
|
4
|
-
|
|
4
|
+
compile character motion and read the shot back as film vocabulary — then turn it into an AI
|
|
5
5
|
image/video prompt.
|
|
6
6
|
|
|
7
7
|
Works two ways, with one tool catalog:
|
|
8
8
|
|
|
9
|
-
- **Editor open** — tool calls drive the visible viewport live: camera, cast, set
|
|
10
|
-
|
|
9
|
+
- **Editor open** — tool calls drive the visible viewport live: camera, cast, set and the
|
|
10
|
+
compiled motion on the timeline (`studio_run` with `motion.compile`).
|
|
11
11
|
- **No editor** — scene, camera, prompt and project-file tools run in memory with no browser,
|
|
12
|
-
GPU or build step. `capture_frame`, `
|
|
13
|
-
|
|
12
|
+
GPU or build step. `capture_frame`, `apply_batch` and `import_mesh` explicitly require a
|
|
13
|
+
live editor.
|
|
14
14
|
|
|
15
15
|
## Run it locally
|
|
16
16
|
|
|
@@ -77,7 +77,6 @@ generated frame matches the blocking instead of drifting off into a generic shot
|
|
|
77
77
|
| `group_objects` | attach children to a parent so they move as one; pass `parent: null` to detach |
|
|
78
78
|
| `apply_batch` | execute up to 100 object mutations as one user-visible undo transaction |
|
|
79
79
|
| `render_prompt` | the shot as an AI image or video prompt |
|
|
80
|
-
| `generate_motion` | multi-phase character motion through the ARDY bridge — phases land as prompt blocks |
|
|
81
80
|
| `mark_camera_move` / `describe_camera_move` | name a move between two camera positions |
|
|
82
81
|
| `add_scene` / `switch_scene` | multiple scenes per project |
|
|
83
82
|
| `open_project` / `save_project` | read and write `.cclayproject` files |
|
|
@@ -116,38 +115,29 @@ thin terminal front end over this hub, not a parallel surface, so anything true
|
|
|
116
115
|
above (admission envelopes, receipts, per-workspace exclusion) is true of it too. The
|
|
117
116
|
terminal-agent guide for it is [`../docs/agent-cli.md`](../docs/agent-cli.md).
|
|
118
117
|
|
|
119
|
-
## Motion
|
|
118
|
+
## Motion
|
|
120
119
|
|
|
121
|
-
`
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
"trips and falls hard to the ground"]
|
|
127
|
-
seconds: 10
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
It tiles them into contiguous ARDY segments, streams the generation through the local bridge
|
|
131
|
-
(`127.0.0.1:5181`, started by `npm run dev`), and — when an editor is connected — loads the
|
|
132
|
-
result onto the active character with prompt blocks on the timeline. Beats longer than the
|
|
133
|
-
per-block limit are split into consecutive blocks, so one phase can produce multiple blocks.
|
|
134
|
-
Pass a previous `motion_url` to reload a clip without generating again.
|
|
120
|
+
Motion is compiled, not generated: run `motion.compile` through `studio_run` with a motion
|
|
121
|
+
spec (key poses, anchors, props, walks, hinged objects, task checks). The Studio bakes every
|
|
122
|
+
frame on the rig, answers the QA groups, and installs the take; `motion.sample` and
|
|
123
|
+
`motion.qa` read it back. The spec format and the loop are in
|
|
124
|
+
[`../docs/motion3-agent-guide.md`](../docs/motion3-agent-guide.md).
|
|
135
125
|
|
|
136
126
|
## Storyboard projects and capsule figures
|
|
137
127
|
|
|
138
|
-
The tool list is fixed when the server starts, so it is the same
|
|
128
|
+
The tool list is fixed when the server starts, so it is the same 27 tools in every project. A
|
|
139
129
|
tool that does not apply to the project or to its target answers a structured refusal instead
|
|
140
130
|
of acting; nothing is sent to the editor and nothing changes. The refusal is the tool's only
|
|
141
131
|
text content, with `isError: true`:
|
|
142
132
|
|
|
143
133
|
```json
|
|
144
|
-
{ "ok": false, "code": "NOT_IN_MODE", "reason": "This project is a Storyboard -
|
|
134
|
+
{ "ok": false, "code": "NOT_IN_MODE", "reason": "This project is a Storyboard - mark_camera_move is available in Animation projects." }
|
|
145
135
|
```
|
|
146
136
|
|
|
147
137
|
| code | when | tools |
|
|
148
138
|
| --- | --- | --- |
|
|
149
|
-
| `NOT_IN_MODE` | the project's `previsMode` is `storyboard` | `
|
|
150
|
-
| `TARGET_NOT_READY` | the target character is a capsule figure (`model: "proxy-figure"`) | `
|
|
139
|
+
| `NOT_IN_MODE` | the project's `previsMode` is `storyboard` | `mark_camera_move` |
|
|
140
|
+
| `TARGET_NOT_READY` | the target character is a capsule figure (`model: "proxy-figure"`) | `studio_run` motion, take, IK and pose actions |
|
|
151
141
|
|
|
152
142
|
`describe_scene` reports `previsMode: storyboard` or `previsMode: animation` (the connected
|
|
153
143
|
editor's project; `open_project` sets it without one) and marks each cast member
|
|
@@ -156,7 +146,7 @@ editor's project; `open_project` sets it without one) and marks each cast member
|
|
|
156
146
|
A **storyboard project** is a sequence of still shots: one picture per panel, held for a
|
|
157
147
|
number of frames, with a caption. Block it with the camera, cast and set tools, and run the
|
|
158
148
|
still-shot commands (`shot.createStill`, `shot.setCaption`, `shot.setHold`, ...) through
|
|
159
|
-
`studio_run`. Motion
|
|
149
|
+
`studio_run`. Motion and named camera moves belong to Animation projects.
|
|
160
150
|
|
|
161
151
|
A **capsule figure** is a rigless stand-in for blocking: `add_character { subject, model:
|
|
162
152
|
"proxy-figure", posture: "sit" }`. It places, turns and frames like any cast member and holds a
|
package/mcp/live-hub.mjs
CHANGED
|
@@ -11,7 +11,7 @@ export const DEFAULT_COMMAND_TIMEOUT_MS = 5_000;
|
|
|
11
11
|
export const MAX_COMMAND_TIMEOUT_MS = 300_000;
|
|
12
12
|
export const DEFAULT_HEARTBEAT_MS = 15_000;
|
|
13
13
|
export const RUN_WORKFLOW_TIMEOUT_MS = 180_000;
|
|
14
|
-
|
|
14
|
+
|
|
15
15
|
export const IMPORT_ASSET_TIMEOUT_MS = 30_000;
|
|
16
16
|
export const CAPTURE_FRAME_TIMEOUT_MS = 30_000;
|
|
17
17
|
export const STUDIO_COMMAND_TIMEOUT_MS = 30_000;
|
|
@@ -31,9 +31,7 @@ const mutationCommands = new Set([
|
|
|
31
31
|
"remove_object",
|
|
32
32
|
"group_objects",
|
|
33
33
|
"ungroup_objects",
|
|
34
|
-
|
|
35
|
-
"set_prompt_blocks",
|
|
36
|
-
"load_motion",
|
|
34
|
+
"apply_batch",
|
|
37
35
|
"load_scenes",
|
|
38
36
|
"operate_studio", "arrange_objects", "arrange_characters", "patch_elements", "frame_shot", "undo_edit", "run_action",
|
|
39
37
|
"import_asset",
|
|
@@ -75,7 +73,7 @@ const safely = (work) => {
|
|
|
75
73
|
const mutationState = (name, description) => {
|
|
76
74
|
if (!description || typeof description !== "object") return undefined;
|
|
77
75
|
if (name === "set_camera") return description.camera;
|
|
78
|
-
if (["add_character", "update_character", "remove_character"
|
|
76
|
+
if (["add_character", "update_character", "remove_character"].includes(name)) return description.characters;
|
|
79
77
|
if (name === "load_scenes") return description.document;
|
|
80
78
|
return description.objects;
|
|
81
79
|
};
|
|
@@ -138,7 +136,7 @@ export class LiveHub {
|
|
|
138
136
|
}
|
|
139
137
|
|
|
140
138
|
static commandTimeoutMs(name) {
|
|
141
|
-
|
|
139
|
+
|
|
142
140
|
// A 32 MiB mesh as a data URL will not decode, store and stand in 5 s.
|
|
143
141
|
if (name === "import_asset") return IMPORT_ASSET_TIMEOUT_MS;
|
|
144
142
|
// Close two-person shots (OTS) raycast two skinned rigs over a full-frame
|
|
@@ -216,7 +214,7 @@ export class LiveHub {
|
|
|
216
214
|
const observer = {
|
|
217
215
|
hub: this, handle,
|
|
218
216
|
before(command) {
|
|
219
|
-
if (!LiveHub.commandMayMutate(command) || command === "
|
|
217
|
+
if (!LiveHub.commandMayMutate(command) || command === "run_action") return false;
|
|
220
218
|
mutation = { name: command, before: mutationState(command, description), acknowledged: false };
|
|
221
219
|
description = undefined;
|
|
222
220
|
return mutation.before === undefined;
|
|
@@ -253,9 +251,7 @@ export class LiveHub {
|
|
|
253
251
|
if (mutation) mutation.rolledBack = value?.rolledBack === true;
|
|
254
252
|
if (value?.rolledBack === true || value?.failed?.length > 0) failure = "failed";
|
|
255
253
|
}
|
|
256
|
-
|
|
257
|
-
// including generation jobs whose MCP control response was queued.
|
|
258
|
-
if (command === "load_motion" && value?.loaded === true) applied = true;
|
|
254
|
+
|
|
259
255
|
}
|
|
260
256
|
emitApplied();
|
|
261
257
|
},
|
package/mcp/package.json
CHANGED
|
@@ -11,10 +11,8 @@
|
|
|
11
11
|
"start": "node server.mjs",
|
|
12
12
|
"verify": "node verify.mjs && node verify-protocol-version.mjs && node verify-http-origin.mjs && node verify-import-mesh.mjs",
|
|
13
13
|
"verify:annotations": "node verify-tool-annotations.mjs",
|
|
14
|
-
"verify:prompts": "node verify-prompts.mjs",
|
|
15
14
|
"verify:live": "node verify-live.mjs && node verify-live-p0.mjs && node verify-live-routing.mjs && node verify-live-controller.mjs && node verify-live-scene-parity.mjs && node verify-live-batch.mjs && node verify-live-editor-model.mjs && node verify-live-port.mjs",
|
|
16
|
-
"verify:capture": "node verify-live-capture.mjs"
|
|
17
|
-
"verify:motion-job": "node verify-live-motion-job.mjs"
|
|
15
|
+
"verify:capture": "node verify-live-capture.mjs"
|
|
18
16
|
},
|
|
19
17
|
"engines": {
|
|
20
18
|
"node": ">=22.13"
|
package/mcp/tool-handlers.mjs
CHANGED
|
@@ -33,8 +33,6 @@ import { readMeshFromPath } from "./mesh-file.mjs";
|
|
|
33
33
|
import { encodePng, readImageFromPath } from "./image-file.mjs";
|
|
34
34
|
import { rankingRow, scoreSculptAgainstReference } from "../src/sculpt-compare.js";
|
|
35
35
|
import { DEFAULT_POSE } from "../src/poses.js";
|
|
36
|
-
import { generationArgs } from '../src/motion/generation.js';
|
|
37
|
-
import { BLOCK_MAX_SECONDS, PROMPT_GUIDE, normalizePhases, splitLongBeat, tileClipFrames } from "./ardy-prompts.mjs";
|
|
38
36
|
|
|
39
37
|
import {
|
|
40
38
|
CAMERA_MOVES,
|
|
@@ -105,8 +103,8 @@ export const liveWorkspace = new AsyncLocalStorage();
|
|
|
105
103
|
const liveWorkspaceTools = new Set([
|
|
106
104
|
"describe_scene", "describe_shot", "render_prompt", "mark_camera_move", "describe_camera_move", "save_project",
|
|
107
105
|
"set_camera", "frame_shot", "add_character", "place_character", "remove_character",
|
|
108
|
-
"focus_character", "place_object", "import_mesh", "sculpt_object", "compare_sculpt", "group_objects", "
|
|
109
|
-
"remove_object", "apply_batch", "add_scene", "switch_scene", "open_project", "capture_frame",
|
|
106
|
+
"focus_character", "place_object", "import_mesh", "sculpt_object", "compare_sculpt", "group_objects", "update_object",
|
|
107
|
+
"remove_object", "apply_batch", "add_scene", "switch_scene", "open_project", "capture_frame",
|
|
110
108
|
"studio_commands", "studio_run",
|
|
111
109
|
]);
|
|
112
110
|
const MAX_CAPTURE_BYTES = 1_000_000;
|
|
@@ -114,7 +112,6 @@ const CAPTURE_ARTIFACT_TTL_MS = 10 * 60_000;
|
|
|
114
112
|
const MAX_CAPTURE_ARTIFACTS = 20;
|
|
115
113
|
const captureArtifacts = [];
|
|
116
114
|
const captureArtifactPattern = /^cozyclay-capture-[0-9a-f-]+\.png$/;
|
|
117
|
-
const motionUrlPattern = /^\/(ardy\/motions\/[0-9]+-[0-9a-f]{6}|ardy\/assembled\/[A-Za-z0-9._-]+\.npz)$/;
|
|
118
115
|
export const cleanupCaptureArtifacts = () => {
|
|
119
116
|
for (const path of captureArtifacts.splice(0)) {
|
|
120
117
|
try { unlinkSync(path); } catch {}
|
|
@@ -164,9 +161,6 @@ const TOOL_ANNOTATIONS = Object.freeze({
|
|
|
164
161
|
sculpt_object: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
165
162
|
compare_sculpt: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
166
163
|
group_objects: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
167
|
-
set_prompt_blocks: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
168
|
-
load_motion: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
169
|
-
generate_motion: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
|
|
170
164
|
update_object: { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
171
165
|
remove_object: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
|
|
172
166
|
apply_batch: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false },
|
|
@@ -242,8 +236,6 @@ const previsRefusal = (toolName, { feature, context, characterId } = {}) => {
|
|
|
242
236
|
: isProxyFigure(findCharacter(characterId ?? state.focus));
|
|
243
237
|
return proxy ? refusal("TARGET_NOT_READY", kindRefusal(feature)) : null;
|
|
244
238
|
};
|
|
245
|
-
/** The Studio context and one command's declaration, as executeStudioCommand admits it. */
|
|
246
|
-
const inspectAction = (action) => liveHub.command("inspect_studio", { scope: "actions", ids: [action] }, liveWorkspace.getStore());
|
|
247
239
|
|
|
248
240
|
const scene = () => activeScene(state.doc.scenes, state.doc.activeSceneId);
|
|
249
241
|
const stage = () => scene().stage;
|
|
@@ -514,8 +506,7 @@ function sceneReport({ characterCursor = 0, objectCursor = 0, limit = 50 } = {})
|
|
|
514
506
|
`${c.pose ? " posed" : ""}${c.hidden ? " hidden" : ""}` +
|
|
515
507
|
`${c === framed ? " <- framed" : ""}`,
|
|
516
508
|
` model: ${c.model} kind: ${isProxyFigure(c) ? "proxy" : "rig"}${isProxyFigure(c) ? ` posture: ${c.posture ?? "stand"}` : ""} pose: ${JSON.stringify(c.pose ?? null)} tint: ${c.tint ?? null} scale: ${c.scale ?? 1}`,
|
|
517
|
-
|
|
518
|
-
` layer: ${JSON.stringify({ waypoints: c.layer?.waypoints ?? [], promptClips: c.layer?.promptClips ?? [] })}`,
|
|
509
|
+
` layer: ${JSON.stringify({ waypoints: c.layer?.waypoints ?? [] })}`,
|
|
519
510
|
);
|
|
520
511
|
}
|
|
521
512
|
|
|
@@ -589,7 +580,7 @@ function shotReport() {
|
|
|
589
580
|
const studioAliasTools = new Set([
|
|
590
581
|
"set_camera", "frame_shot", "place_object", "update_object", "remove_object",
|
|
591
582
|
"import_mesh", "sculpt_object", "group_objects", "add_scene", "switch_scene", "apply_batch", "open_project",
|
|
592
|
-
"add_character", "place_character", "remove_character",
|
|
583
|
+
"add_character", "place_character", "remove_character",
|
|
593
584
|
]);
|
|
594
585
|
const studioAdmissionSchema = {
|
|
595
586
|
expectedRevision: z.number().int().min(0).optional().describe("scene revision to admit against; defaults to the inspected revision"),
|
|
@@ -1319,161 +1310,6 @@ export const createToolHandlers = ({ projectRootPromise } = {}) => {
|
|
|
1319
1310
|
},
|
|
1320
1311
|
),
|
|
1321
1312
|
|
|
1322
|
-
tool(
|
|
1323
|
-
"set_prompt_blocks",
|
|
1324
|
-
{
|
|
1325
|
-
title: "Author the motion beats on the timeline",
|
|
1326
|
-
description:
|
|
1327
|
-
"Write Prompt Blocks onto the timeline WITHOUT generating — the beats and their frame " +
|
|
1328
|
-
"ranges, so a schedule can be read and revised before any GPU time is spent. Hit " +
|
|
1329
|
-
"the studio's top-bar Generate Motion button, or call generate_motion, when it reads right.\n\n" +
|
|
1330
|
-
PROMPT_GUIDE,
|
|
1331
|
-
inputSchema: {
|
|
1332
|
-
beats: z
|
|
1333
|
-
.array(
|
|
1334
|
-
z.object({
|
|
1335
|
-
text: z.string().min(3).describe("the beat, in ARDY's sentence shape"),
|
|
1336
|
-
seconds: z
|
|
1337
|
-
.number()
|
|
1338
|
-
.min(0.5)
|
|
1339
|
-
.max(20)
|
|
1340
|
-
.optional()
|
|
1341
|
-
.describe(`how long this beat holds; defaults to 3 s when omitted, and over ${BLOCK_MAX_SECONDS}s it becomes chained blocks`),
|
|
1342
|
-
}),
|
|
1343
|
-
)
|
|
1344
|
-
.min(1)
|
|
1345
|
-
.max(8)
|
|
1346
|
-
.describe("beats in order; each one becomes a contiguous block"),
|
|
1347
|
-
},
|
|
1348
|
-
},
|
|
1349
|
-
async ({ beats, ...admission }) => {
|
|
1350
|
-
if (!liveHub?.connected) {
|
|
1351
|
-
return previsRefusal("set_prompt_blocks") ?? text("Prompt Blocks live on the studio timeline — open the editor and try again.");
|
|
1352
|
-
}
|
|
1353
|
-
const normalized = normalizePhases(beats.map((b) => b.text));
|
|
1354
|
-
// The timeline runs on a 24 fps production clock.
|
|
1355
|
-
const TIMELINE_FPS = 24;
|
|
1356
|
-
let cursor = 0;
|
|
1357
|
-
const blocks = [];
|
|
1358
|
-
for (const [i, textValue] of normalized.texts.entries()) {
|
|
1359
|
-
const whole = beats[Math.min(normalized.sources[i], beats.length - 1)].seconds ?? 3;
|
|
1360
|
-
const spans = splitLongBeat(whole);
|
|
1361
|
-
for (const span of spans) {
|
|
1362
|
-
const frames = Math.max(1, Math.round(span * TIMELINE_FPS));
|
|
1363
|
-
blocks.push({ startFrame: cursor, endFrame: cursor + frames, text: textValue });
|
|
1364
|
-
cursor += frames;
|
|
1365
|
-
}
|
|
1366
|
-
}
|
|
1367
|
-
try {
|
|
1368
|
-
const inspected = await inspectAction("character.setPromptBlocks");
|
|
1369
|
-
return previsRefusal("set_prompt_blocks", { context: await contextOf(inspected) }) ??
|
|
1370
|
-
await runStudioCommand({ ...admission, inspected, action: "character.setPromptBlocks", args: context => ({
|
|
1371
|
-
characterId: context.activeCharacterId, blocks,
|
|
1372
|
-
}) });
|
|
1373
|
-
} catch (error) {
|
|
1374
|
-
return liveError(error);
|
|
1375
|
-
}
|
|
1376
|
-
},
|
|
1377
|
-
),
|
|
1378
|
-
|
|
1379
|
-
tool(
|
|
1380
|
-
"load_motion",
|
|
1381
|
-
{
|
|
1382
|
-
title: "Load an existing motion take",
|
|
1383
|
-
description:
|
|
1384
|
-
"Unlike generate_motion, load_motion installs a previously generated or assembled motion take WITHOUT regenerating — " +
|
|
1385
|
-
"re-using a completed /ardy/motions/<id> take or an /ardy/assembled/*.npz tile (the long-take recipe). " +
|
|
1386
|
-
"It is synchronous and returns the editor's confirmation.",
|
|
1387
|
-
inputSchema: {
|
|
1388
|
-
url: z.string().describe("/ardy/motions/<id> or /ardy/assembled/<name>.npz"),
|
|
1389
|
-
prompt: z.string().optional().describe("Label shown on the timeline block."),
|
|
1390
|
-
character: z.string().optional().describe('which character receives the take — letter, slot number or id; defaults to the editor\u2019s active character'),
|
|
1391
|
-
},
|
|
1392
|
-
},
|
|
1393
|
-
async (args) => {
|
|
1394
|
-
if (!motionUrlPattern.test(args.url)) {
|
|
1395
|
-
throw new Error(`Unsupported motion url "${args.url}". Use /ardy/motions/<id> or /ardy/assembled/<name>.npz.`);
|
|
1396
|
-
}
|
|
1397
|
-
const inspected = liveHub?.connected ? await inspectAction('motion.replace') : undefined;
|
|
1398
|
-
const characterId = args.character === undefined ? inspected?.context?.activeCharacterId : await liveCharacterId(args.character);
|
|
1399
|
-
const refused = previsRefusal("load_motion", { feature: "take", context: await contextOf(inspected), characterId });
|
|
1400
|
-
if (refused) return refused;
|
|
1401
|
-
return runStudioCommand({ ...args, inspected, action: 'motion.replace', args: context => ({
|
|
1402
|
-
characterId: args.character === undefined ? context.activeCharacterId : characterId,
|
|
1403
|
-
url: args.url, prompt: args.prompt ?? '',
|
|
1404
|
-
}) });
|
|
1405
|
-
},
|
|
1406
|
-
),
|
|
1407
|
-
|
|
1408
|
-
tool(
|
|
1409
|
-
"generate_motion",
|
|
1410
|
-
{
|
|
1411
|
-
title: "Generate character motion (Kimodo)",
|
|
1412
|
-
description:
|
|
1413
|
-
"Alias for motion.generate in the editor. Returns its bus receipt; started jobs carry jobId for studio_run job.await or job.cancel. " +
|
|
1414
|
-
"The installed take is undoable with studio_run edit.undo.\n\n" +
|
|
1415
|
-
PROMPT_GUIDE,
|
|
1416
|
-
inputSchema: {
|
|
1417
|
-
phases: z
|
|
1418
|
-
.array(
|
|
1419
|
-
z.union([
|
|
1420
|
-
z.string().min(3),
|
|
1421
|
-
z.object({
|
|
1422
|
-
text: z.string().min(3),
|
|
1423
|
-
seconds: z.number().min(0.5).max(30).describe("how long THIS beat holds"),
|
|
1424
|
-
}),
|
|
1425
|
-
]),
|
|
1426
|
-
)
|
|
1427
|
-
.min(1)
|
|
1428
|
-
.max(8)
|
|
1429
|
-
.describe(
|
|
1430
|
-
"one beat per phase, in order. Follow the shared Kimodo prompt guide in this tool's " +
|
|
1431
|
-
"description; it is the single source for prompt wording and phase guidance. Give a " +
|
|
1432
|
-
"plain string to share the clip evenly, or { text, seconds } to hold a beat for a " +
|
|
1433
|
-
"specific time.",
|
|
1434
|
-
),
|
|
1435
|
-
seconds: z
|
|
1436
|
-
.number()
|
|
1437
|
-
.min(2)
|
|
1438
|
-
.max(60)
|
|
1439
|
-
.default(9)
|
|
1440
|
-
.describe("total clip length; ignored when every phase carries its own seconds"),
|
|
1441
|
-
seed: z.number().int().optional().describe("generation seed"),
|
|
1442
|
-
motion_url: z
|
|
1443
|
-
.string()
|
|
1444
|
-
.regex(motionUrlPattern)
|
|
1445
|
-
.optional()
|
|
1446
|
-
.describe("reuse an already-generated clip, or a curated clip staged under public/ardy/assembled/"),
|
|
1447
|
-
drop: z
|
|
1448
|
-
.object({
|
|
1449
|
-
from_s: z.number().min(0).describe("clip time the plunge begins, seconds"),
|
|
1450
|
-
to_s: z.number().positive().describe("clip time it lands, seconds; must be after from_s"),
|
|
1451
|
-
meters: z.number().positive().max(30).describe("how far the body falls"),
|
|
1452
|
-
})
|
|
1453
|
-
.optional()
|
|
1454
|
-
.describe(
|
|
1455
|
-
"a vertical fall staged onto the clip — the whole body drops this many metres over " +
|
|
1456
|
-
"[from_s, to_s] on a gravity curve. Stand the character on a roof with place_character's " +
|
|
1457
|
-
"y, then drop them past its edge; ARDY itself only generates flat-ground motion.",
|
|
1458
|
-
),
|
|
1459
|
-
},
|
|
1460
|
-
},
|
|
1461
|
-
async ({ phases, seconds = 9, seed, motion_url, drop, ...admission }) => {
|
|
1462
|
-
if (!liveHub?.connected) return previsRefusal("generate_motion", { feature: "motion" }) ?? text(noLiveEditor("Motion requires a connected CozyClay editor."));
|
|
1463
|
-
const normalized = normalizePhases(phases.map(phase => typeof phase === 'string' ? phase : phase.text));
|
|
1464
|
-
const beats = normalized.texts.map((text, index) => ({ text, seconds: phases[normalized.sources[index]]?.seconds ?? seconds / phases.length })).filter(beat => beat.text);
|
|
1465
|
-
const action = motion_url ? 'motion.replace' : 'motion.generate', inspected = await inspectAction(action);
|
|
1466
|
-
const refused = previsRefusal("generate_motion", { feature: "motion", context: await contextOf(inspected) });
|
|
1467
|
-
if (refused) return refused;
|
|
1468
|
-
return runStudioCommand({ ...admission, inspected, action, args: context => {
|
|
1469
|
-
const generated = generationArgs({ characterId: context.activeCharacterId, source: { kind: 'generate', beats, ...(seed === undefined ? {} : { seed }) } });
|
|
1470
|
-
return motion_url ? { characterId: generated.characterId, url: motion_url, prompt: beats.map(beat => beat.text).join(' '),
|
|
1471
|
-
blocks: generated.blocks.map(({ startFrame, endFrame, text: prompt }) => ({ startFrame, endFrame, prompt })), ...(drop ? { drop } : {}) }
|
|
1472
|
-
: { ...generated, ...(drop ? { drop } : {}) };
|
|
1473
|
-
} });
|
|
1474
|
-
},
|
|
1475
|
-
),
|
|
1476
|
-
|
|
1477
1313
|
tool(
|
|
1478
1314
|
"update_object",
|
|
1479
1315
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cozyclay",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "Open source previs software in the browser: block a scene, pose characters, author camera moves and cuts, then take the same shots to an AI video model.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"dev": "node tools/dev-full.mjs --host 127.0.0.1 --port 5180",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"test": "npm run build && node tools/run-tests.mjs",
|
|
12
12
|
"test:manifest": "node tools/run-tests.mjs --list",
|
|
13
13
|
"test:analytics": "node test/verify-analytics.mjs",
|
|
14
|
-
"test:lifecycle": "npm run build && node test/process/verify-lifecycle.mjs
|
|
14
|
+
"test:lifecycle": "npm run build && node test/process/verify-lifecycle.mjs",
|
|
15
15
|
"test:mcp-package": "node test/process/verify-mcp-package-isolation.mjs",
|
|
16
16
|
"test:hierarchy": "node test/verify-hierarchy.mjs",
|
|
17
17
|
"test:history": "node test/verify-history.mjs",
|
|
@@ -37,15 +37,10 @@
|
|
|
37
37
|
"test:timeline-camera": "node test/verify-timeline-camera.mjs",
|
|
38
38
|
"test:timeline-shots": "node test/verify-timeline-shots.mjs",
|
|
39
39
|
"preview": "vite preview",
|
|
40
|
-
"ardy:rest": "node tools/ardy/extract-rest.mjs",
|
|
41
|
-
"ardy:pose": "node tools/ardy/pose-to-npz.mjs",
|
|
42
40
|
"test:ardy": "node tools/run-tests.mjs --scope ardy",
|
|
43
41
|
"test:ik-browser": "node tools/qa-browser.mjs -- node test/verify-ik-browser.mjs",
|
|
44
|
-
"bridge": "node tools/ardy/bridge.mjs",
|
|
45
42
|
"demo:api": "npm --prefix workers/api run dev",
|
|
46
43
|
"demo:api:install": "npm --prefix workers/api ci",
|
|
47
|
-
"demo:worker": "node tools/demo-worker/index.mjs",
|
|
48
|
-
"kimodo:setup": "node tools/kimodo/setup-local.mjs",
|
|
49
44
|
"qa:browser": "node tools/qa-browser.mjs --",
|
|
50
45
|
"test:shot-authoring": "node test/verify-shot-authoring.mjs",
|
|
51
46
|
"test:camera-follow": "node test/verify-camera-follow.mjs",
|
|
@@ -55,23 +50,14 @@
|
|
|
55
50
|
"test:otio": "node test/verify-otio.mjs",
|
|
56
51
|
"test:usd-camera": "node test/verify-usd-camera.mjs",
|
|
57
52
|
"test:camera-rail-browser": "node tools/qa-browser.mjs -- node test/verify-camera-rail-browser.mjs",
|
|
58
|
-
"test:pose-extract": "node test/verify-pose-extract.mjs",
|
|
59
53
|
"test:blocking-depth": "node test/verify-blocking-depth.mjs",
|
|
60
|
-
"test:image-pose": "node test/verify-image-pose.mjs",
|
|
61
54
|
"test:pwa": "node test/verify-pwa.mjs",
|
|
62
55
|
"test:update-check": "node test/verify-update-check.mjs",
|
|
63
56
|
"test:korean-ui": "node test/verify-korean-ui.mjs",
|
|
64
57
|
"prepack": "npm run build && node tools/prepare-package.mjs",
|
|
65
58
|
"postpack": "node tools/prepare-package.mjs --clean",
|
|
66
59
|
"prepublishOnly": "npm run build && node tools/prepare-package.mjs --check-key && node tools/prepare-package.mjs && node tools/verify-package-tarball.mjs",
|
|
67
|
-
"metrics:traffic": "node tools/metrics/archive-traffic.mjs"
|
|
68
|
-
"test:multimodel": "node test/verify-multimodel-ingest.mjs",
|
|
69
|
-
"test:video-frames": "node test/verify-video-frames.mjs",
|
|
70
|
-
"test:retime": "node test/verify-retime.mjs",
|
|
71
|
-
"test:trim": "node test/verify-trim.mjs",
|
|
72
|
-
"test:motion-edit": "node test/verify-motion-edit.mjs",
|
|
73
|
-
"test:footage-bridge": "node test/verify-footage-bridge.mjs",
|
|
74
|
-
"test:bvh-cskel27": "node test/verify-bvh-cskel27.mjs"
|
|
60
|
+
"metrics:traffic": "node tools/metrics/archive-traffic.mjs"
|
|
75
61
|
},
|
|
76
62
|
"license": "AGPL-3.0-or-later",
|
|
77
63
|
"type": "module",
|
|
@@ -82,7 +68,6 @@
|
|
|
82
68
|
},
|
|
83
69
|
"devDependencies": {
|
|
84
70
|
"@eslint/js": "^10.0.1",
|
|
85
|
-
"@mediapipe/tasks-vision": "0.10.17",
|
|
86
71
|
"@react-three/drei": "^10.7.7",
|
|
87
72
|
"@react-three/fiber": "^9.7.0",
|
|
88
73
|
"@vitejs/plugin-react": "^6.0.5",
|
|
@@ -108,18 +93,14 @@
|
|
|
108
93
|
"bin",
|
|
109
94
|
"dist",
|
|
110
95
|
"!dist/media/*.mp4",
|
|
111
|
-
"!dist/demo/index.html",
|
|
112
|
-
"!dist/d/index.html",
|
|
113
96
|
"src",
|
|
114
97
|
"tools",
|
|
115
|
-
"!tools/ardy/out",
|
|
116
98
|
"!tools/qa-*.mjs",
|
|
117
99
|
"mcp/server.mjs",
|
|
118
100
|
"mcp/tool-handlers.mjs",
|
|
119
101
|
"mcp/live-hub.mjs",
|
|
120
102
|
"mcp/mesh-file.mjs",
|
|
121
103
|
"mcp/image-file.mjs",
|
|
122
|
-
"mcp/ardy-prompts.mjs",
|
|
123
104
|
"mcp/runtime",
|
|
124
105
|
"mcp/package.json",
|
|
125
106
|
"mcp/README.md",
|