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.
Files changed (585) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/README.md +12 -30
  3. package/bin/agent/agent-routes.mjs +43 -116
  4. package/bin/agent/agent-runner.mjs +14 -15
  5. package/bin/agent/cliproxy-provider.mjs +135 -0
  6. package/bin/agent/credential-store.mjs +30 -7
  7. package/bin/agent/pi-tools.mjs +4 -1
  8. package/bin/agent/provider-keys.mjs +32 -0
  9. package/bin/agent/provider-login.mjs +110 -0
  10. package/bin/agent/provider-routes.mjs +99 -0
  11. package/bin/agent/providers.mjs +19 -97
  12. package/bin/agent/script-tool.mjs +17 -4
  13. package/bin/agent/session-store.mjs +2 -2
  14. package/bin/agent/studio-context-budget.mjs +93 -0
  15. package/bin/agent/studio-motion-reference.mjs +23 -0
  16. package/bin/agent/studio-prompt.mjs +1 -1
  17. package/bin/agent/studio-rebase-text.mjs +32 -0
  18. package/bin/agent/studio-rebase.mjs +26 -39
  19. package/bin/agent/studio-tools.mjs +9 -28
  20. package/bin/agent/tool-arguments.mjs +49 -0
  21. package/bin/agent/turn-frames.mjs +66 -0
  22. package/bin/codex-auth.mjs +9 -2
  23. package/bin/cozyclay.mjs +10 -116
  24. package/bin/live/cli.mjs +3 -3
  25. package/bin/mcp-runtime.mjs +2 -12
  26. package/bin/package-signature.mjs +0 -4
  27. package/dist/app/index.html +7 -6
  28. package/dist/assets/EXRLoader-CvVIvGVE.js +1 -0
  29. package/dist/assets/analytics-BWCqdgWA.js +1 -0
  30. package/dist/assets/app-DfTCxaKk.js +5087 -0
  31. package/dist/assets/app-f-fkV5uP.css +1 -0
  32. package/dist/assets/compile-worker-BxKXh07s.js +5 -0
  33. package/dist/assets/fflate.module-KbGj5-H6.js +5 -0
  34. package/dist/assets/{first-shot-handoff-msLI71g1.js → first-shot-handoff-DNO8kv_N.js} +1 -1
  35. package/dist/assets/{landing-ChUvB_zL.js → landing-yfZaJkWc.js} +1 -1
  36. package/dist/assets/scene-asset-sync-U3kS2rvK.js +20 -0
  37. package/dist/assets/scene-asset-sync-_S8NQl5B.css +1 -0
  38. package/dist/assets/workflow-D78eiKTa.js +179 -0
  39. package/dist/cozyclay-package.json +1 -1
  40. package/dist/index.html +3 -3
  41. package/dist/sw.js +3 -6
  42. package/dist/workflow/index.html +5 -4
  43. package/mcp/LIVE-PROTOCOL.md +7 -47
  44. package/mcp/README.md +16 -26
  45. package/mcp/live-hub.mjs +6 -10
  46. package/mcp/package.json +1 -3
  47. package/mcp/tool-handlers.mjs +4 -168
  48. package/package.json +3 -22
  49. package/src/App.jsx +151 -2625
  50. package/src/agent-progress.js +80 -0
  51. package/src/agent-turn-mark.js +30 -0
  52. package/src/analytics.js +1 -19
  53. package/src/app-context.js +12 -2
  54. package/src/app-stage.jsx +2 -34
  55. package/src/asset-pane.jsx +6 -5
  56. package/src/camera-block.js +21 -0
  57. package/src/camera-direction.js +120 -0
  58. package/src/character-kind.js +3 -9
  59. package/src/command-bus.js +10 -8
  60. package/src/commands/cast.js +5 -34
  61. package/src/commands/elements/character.js +1 -1
  62. package/src/commands/elements/motion.js +1 -6
  63. package/src/commands/elements/object.js +6 -2
  64. package/src/commands/elements/shot.js +4 -1
  65. package/src/commands/elements.js +38 -14
  66. package/src/commands/index.js +3 -1
  67. package/src/commands/kits.js +37 -0
  68. package/src/commands/motion-timing.js +57 -0
  69. package/src/commands/motion.js +9 -152
  70. package/src/commands/motion3-compile.js +65 -0
  71. package/src/commands/motion3.js +214 -0
  72. package/src/commands/objects.js +6 -4
  73. package/src/commands/shot.js +55 -13
  74. package/src/commands/stage.js +14 -1
  75. package/src/commands/view.js +4 -1
  76. package/src/document-mirrors.js +42 -0
  77. package/src/document-store.js +4 -0
  78. package/src/domains/cast.js +19 -194
  79. package/src/domains/motion/motion-range-pin-rules.js +1 -1
  80. package/src/domains/motion/take-source.js +53 -0
  81. package/src/domains/motion.js +60 -1838
  82. package/src/domains/scenes.js +12 -55
  83. package/src/domains/shots.js +2 -2
  84. package/src/domains/stage.js +4 -2
  85. package/src/draft-ghost.js +47 -0
  86. package/src/draft-ghost.jsx +129 -0
  87. package/src/dualview.jsx +4 -3
  88. package/src/effects/EffectsLayer.jsx +112 -0
  89. package/src/effects/effect-meshes.js +232 -0
  90. package/src/effects/effect-record.js +103 -0
  91. package/src/effects/emitter.js +59 -0
  92. package/src/effects/simulate.js +261 -0
  93. package/src/effects/state.js +59 -0
  94. package/src/execution-telemetry.js +2 -3
  95. package/src/first-success-guide.jsx +5 -5
  96. package/src/ghost-set.js +257 -0
  97. package/src/held-object-edit.jsx +113 -0
  98. package/src/held-object-pose.js +175 -0
  99. package/src/hierarchy-model.js +1 -1
  100. package/src/hierarchy-panel.jsx +1 -1
  101. package/src/imported-mesh.jsx +103 -0
  102. package/src/kits/held.js +84 -0
  103. package/src/kits/index.js +70 -0
  104. package/src/kits/smoking.js +57 -0
  105. package/src/light-blockers.js +93 -0
  106. package/src/motion/beat-board-model.js +84 -0
  107. package/src/motion/beat-board.css +124 -0
  108. package/src/motion/beat-board.jsx +60 -0
  109. package/src/motion/center-of-mass.js +66 -0
  110. package/src/motion/fix-collisions.js +850 -0
  111. package/src/motion/physics-review.js +118 -0
  112. package/src/{ardy → motion}/physics-support.js +1 -76
  113. package/src/motion/rig-snapshot.js +22 -0
  114. package/src/motion/take-segments.jsx +140 -0
  115. package/src/{ardy → motion}/timeline-coordinates.js +0 -21
  116. package/src/{ardy → motion}/timeline.css +1 -2
  117. package/src/{ardy → motion}/timeline.jsx +42 -413
  118. package/src/motion/waypoints.js +76 -0
  119. package/src/motion3/beats.js +83 -0
  120. package/src/motion3/body.js +158 -0
  121. package/src/motion3/bones.js +47 -0
  122. package/src/motion3/carried.js +47 -0
  123. package/src/motion3/compile-job.js +79 -0
  124. package/src/motion3/compile-worker.js +10 -0
  125. package/src/motion3/compiler/anchors.js +113 -0
  126. package/src/motion3/compiler/arm-orient.js +128 -0
  127. package/src/motion3/compiler/channels.js +125 -0
  128. package/src/motion3/compiler/compile.js +205 -0
  129. package/src/motion3/compiler/gait-rhythm.js +97 -0
  130. package/src/motion3/compiler/grip.js +171 -0
  131. package/src/motion3/compiler/head-steady.js +48 -0
  132. package/src/motion3/compiler/hold.js +134 -0
  133. package/src/motion3/compiler/idle.js +113 -0
  134. package/src/motion3/compiler/limbs.js +197 -0
  135. package/src/motion3/compiler/math.js +72 -0
  136. package/src/motion3/compiler/pose.js +177 -0
  137. package/src/motion3/compiler/quat.js +49 -0
  138. package/src/motion3/compiler/skeleton.js +74 -0
  139. package/src/motion3/compiler/validate-common.js +32 -0
  140. package/src/motion3/compiler/validate-goals.js +118 -0
  141. package/src/motion3/compiler/validate-objects.js +144 -0
  142. package/src/motion3/compiler/validate-parts.js +118 -0
  143. package/src/motion3/compiler/validate.js +122 -0
  144. package/src/motion3/compiler/vocab.js +74 -0
  145. package/src/motion3/compiler/walk-pelvis.js +275 -0
  146. package/src/motion3/compiler/walk.js +207 -0
  147. package/src/motion3/compiler/wrist-clamp.js +32 -0
  148. package/src/motion3/delta.js +47 -0
  149. package/src/motion3/describe.js +177 -0
  150. package/src/motion3/docs.js +27 -0
  151. package/src/motion3/edit-carry.js +21 -0
  152. package/src/motion3/fix/ease.js +16 -0
  153. package/src/motion3/fix/ground.js +37 -0
  154. package/src/motion3/fix/index.js +52 -0
  155. package/src/motion3/fix/push.js +71 -0
  156. package/src/motion3/fix/reach.js +46 -0
  157. package/src/motion3/fix/retime.js +79 -0
  158. package/src/motion3/fix/self.js +211 -0
  159. package/src/motion3/fix/slide.js +70 -0
  160. package/src/motion3/fix/turn.js +51 -0
  161. package/src/motion3/follow.js +39 -0
  162. package/src/motion3/free-motion.js +204 -0
  163. package/src/motion3/grip-choice.js +130 -0
  164. package/src/motion3/hold-plan.js +157 -0
  165. package/src/motion3/json-patch.js +77 -0
  166. package/src/motion3/key-aim.js +105 -0
  167. package/src/motion3/key-edit.js +82 -0
  168. package/src/motion3/lenient.js +127 -0
  169. package/src/motion3/object-keys.js +236 -0
  170. package/src/motion3/object-pose.js +182 -0
  171. package/src/motion3/object-tracks.js +12 -0
  172. package/src/motion3/people.js +82 -0
  173. package/src/motion3/pipeline.js +102 -0
  174. package/src/motion3/playback.js +51 -0
  175. package/src/motion3/probes.js +91 -0
  176. package/src/motion3/qa/body-checks.js +34 -0
  177. package/src/motion3/qa/check-names.js +14 -0
  178. package/src/motion3/qa/checks.js +125 -0
  179. package/src/motion3/qa/contact-checks.js +51 -0
  180. package/src/motion3/qa/explain.js +80 -0
  181. package/src/motion3/qa/fmt.js +5 -0
  182. package/src/motion3/qa/foot-checks.js +72 -0
  183. package/src/motion3/qa/geometry.js +77 -0
  184. package/src/motion3/qa/goals.js +191 -0
  185. package/src/motion3/qa/ground.js +60 -0
  186. package/src/motion3/qa/hints-contact.js +195 -0
  187. package/src/motion3/qa/hints-goal.js +160 -0
  188. package/src/motion3/qa/hints-knee.js +24 -0
  189. package/src/motion3/qa/hints-motion.js +209 -0
  190. package/src/motion3/qa/hints-object.js +91 -0
  191. package/src/motion3/qa/index.js +44 -0
  192. package/src/motion3/qa/key-checks.js +82 -0
  193. package/src/motion3/qa/near.js +96 -0
  194. package/src/motion3/qa/object-checks.js +135 -0
  195. package/src/motion3/qa/patch.js +161 -0
  196. package/src/motion3/qa/people-checks.js +37 -0
  197. package/src/motion3/qa/severity.js +38 -0
  198. package/src/motion3/qa/spec-checks.js +65 -0
  199. package/src/motion3/qa/style.js +228 -0
  200. package/src/motion3/qa/wrist-checks.js +69 -0
  201. package/src/motion3/qa/wrist-obs.js +60 -0
  202. package/src/motion3/refs.js +129 -0
  203. package/src/motion3/repair-tune.js +121 -0
  204. package/src/motion3/repair.js +83 -0
  205. package/src/motion3/report.js +67 -0
  206. package/src/motion3/rigs/index.js +14 -0
  207. package/src/motion3/rigs/x-bot-tpose-body.json +1 -0
  208. package/src/motion3/rigs/x-bot-tpose.json +1 -0
  209. package/src/motion3/rigs/y-bot-tpose-body.json +1 -0
  210. package/src/motion3/rigs/y-bot-tpose.json +1 -0
  211. package/src/motion3/scene.js +60 -0
  212. package/src/motion3/schema/brief.js +89 -0
  213. package/src/motion3/schema/fields.js +44 -0
  214. package/src/motion3/schema/spec-examples.js +46 -0
  215. package/src/motion3/schema/topics.js +113 -0
  216. package/src/motion3/schema/types.js +149 -0
  217. package/src/motion3/search.js +117 -0
  218. package/src/motion3/second-hand.js +112 -0
  219. package/src/motion3/settle.js +136 -0
  220. package/src/motion3/skills/basic.js +83 -0
  221. package/src/motion3/skills/book.js +76 -0
  222. package/src/motion3/skills/car.js +145 -0
  223. package/src/motion3/skills/flip.js +200 -0
  224. package/src/motion3/skills/frames-auto.js +29 -0
  225. package/src/motion3/skills/impact.js +109 -0
  226. package/src/motion3/skills/index.js +85 -0
  227. package/src/motion3/skills/info.js +80 -0
  228. package/src/motion3/skills/smoke-kit.js +109 -0
  229. package/src/motion3/skills/smoke.js +160 -0
  230. package/src/motion3/spec-store.js +59 -0
  231. package/src/motion3/take-edit.js +155 -0
  232. package/src/motion3/take.js +63 -0
  233. package/src/motion3/timeline.js +127 -0
  234. package/src/motion3/views.js +121 -0
  235. package/src/motion3/walk-plan.js +119 -0
  236. package/src/object-catalog.jsx +7 -1
  237. package/src/object-colors.js +98 -0
  238. package/src/object-gizmo-parts.js +115 -0
  239. package/src/object-gizmo.jsx +37 -122
  240. package/src/object-glow.js +139 -0
  241. package/src/object-hidden.js +33 -0
  242. package/src/object-look.js +196 -0
  243. package/src/object-size.js +10 -0
  244. package/src/object-travel.js +71 -6
  245. package/src/panels/CameraPanel.jsx +7 -7
  246. package/src/panels/HdrEnvironmentControls.jsx +59 -0
  247. package/src/panels/LightPanel.jsx +25 -4
  248. package/src/panels/ObjectLookPanel.jsx +88 -0
  249. package/src/panels/PosePanel.jsx +2 -17
  250. package/src/panels/RigControlPanel.jsx +5 -53
  251. package/src/panels/SubjectBox.jsx +4 -1
  252. package/src/panels/details.css +14 -0
  253. package/src/posestudio.jsx +4 -27
  254. package/src/project-browser.jsx +3 -4
  255. package/src/project-resources.js +18 -31
  256. package/src/project.js +13 -104
  257. package/src/props.jsx +25 -280
  258. package/src/qa-label.js +25 -0
  259. package/src/rail-dot-drag.js +23 -0
  260. package/src/render-passes.js +10 -0
  261. package/src/resource-status.jsx +1 -0
  262. package/src/result-modal.jsx +4 -19
  263. package/src/room.jsx +20 -12
  264. package/src/scene-assets.js +8 -6
  265. package/src/scene-light-place.js +72 -0
  266. package/src/scene-lights.jsx +148 -0
  267. package/src/scene-objects.js +31 -139
  268. package/src/scenes.js +15 -105
  269. package/src/semantic-edit.js +2 -5
  270. package/src/set-pieces.jsx +183 -0
  271. package/src/settings-menu.jsx +3 -11
  272. package/src/shell/BottomDock.jsx +9 -51
  273. package/src/shell/DetailsSlot.jsx +16 -200
  274. package/src/shell/GhostsMenuGroup.jsx +74 -0
  275. package/src/shell/LibrarySlot.jsx +1 -3
  276. package/src/shell/MenuBar.jsx +3 -3
  277. package/src/shell/PreferencesDialog.jsx +15 -264
  278. package/src/shell/PreferencesSlot.jsx +2 -8
  279. package/src/shell/TopBar.jsx +5 -84
  280. package/src/shell/ViewportToolbar.jsx +10 -70
  281. package/src/shell/agent-glass.css +19 -6
  282. package/src/shell/details-selection.js +42 -0
  283. package/src/shell/ghosts-menu.css +22 -0
  284. package/src/shell/glass-regions.css +29 -3
  285. package/src/shell/preferences.css +6 -1
  286. package/src/shot-authoring.js +4 -7
  287. package/src/soft-shadows.js +37 -0
  288. package/src/stage-attach-frames.js +12 -12
  289. package/src/stage-canvas-rigs.jsx +3 -3
  290. package/src/stage-capture.jsx +42 -8
  291. package/src/stage-characters.jsx +22 -216
  292. package/src/stage-editor-gizmos.jsx +6 -6
  293. package/src/stage-environment.js +93 -0
  294. package/src/stage-hdr-builtins.js +107 -0
  295. package/src/stage-hdr-image.js +116 -0
  296. package/src/stage-hdr-library.js +70 -0
  297. package/src/stage-hdr-map.js +94 -0
  298. package/src/stage-hdr.js +130 -0
  299. package/src/stage-lighting.js +149 -0
  300. package/src/stage-occlusion.js +210 -0
  301. package/src/stage-sky.jsx +159 -0
  302. package/src/stage-startup-defaults.js +5 -9
  303. package/src/studio-actions.js +16 -14
  304. package/src/studio-agent-commands.js +19 -16
  305. package/src/studio-agent-motion.js +9 -9
  306. package/src/studio-agent-protocol.js +47 -77
  307. package/src/studio-app-binding.js +27 -47
  308. package/src/studio-asset-list.js +17 -0
  309. package/src/studio-contact-sheet.js +37 -5
  310. package/src/studio-elements.js +27 -7
  311. package/src/studio-entity-bounds.js +18 -0
  312. package/src/studio-error-codes.js +15 -0
  313. package/src/studio-export-framing.js +152 -0
  314. package/src/studio-lighting-check.js +103 -0
  315. package/src/studio-motion-visual.js +150 -0
  316. package/src/studio-schema-errors.js +80 -0
  317. package/src/studio-support-gap.js +74 -0
  318. package/src/styles.css +1 -19
  319. package/src/timeline-defaults.js +5 -0
  320. package/src/timeline-extent.js +8 -20
  321. package/src/tutorial-walk.js +17 -0
  322. package/src/ui-scrub.js +1 -1
  323. package/src/use-shot-camera-tracks.js +12 -0
  324. package/src/view-ghosts.js +97 -0
  325. package/src/view-ghosts.jsx +49 -0
  326. package/src/workflow/AgentPanel.jsx +47 -166
  327. package/src/workflow/AgentProgressCard.jsx +109 -0
  328. package/src/workflow/AgentReplyText.jsx +37 -0
  329. package/src/workflow/AgentTurnSteps.jsx +84 -0
  330. package/src/workflow/LoginPanel.jsx +140 -0
  331. package/src/workflow/WorkflowBuilder.jsx +7 -23
  332. package/src/workflow/agent-client.js +54 -51
  333. package/src/workflow/agent-panel.css +71 -1
  334. package/src/workflow/agent-progress-card.css +167 -0
  335. package/src/workflow/agent-progress-view.js +47 -0
  336. package/src/workflow/agent-turn-steps.css +113 -0
  337. package/src/workflow/agent-turn.js +191 -0
  338. package/src/workflow/login-client.js +34 -0
  339. package/src/workflow/motion-input.js +18 -31
  340. package/src/workflow/node-schema.js +1 -1
  341. package/src/workflow/reply-markdown.js +69 -0
  342. package/src/workflow/scene-asset-sync.js +8 -8
  343. package/tools/agent-session-stats.mjs +61 -0
  344. package/tools/dev-full.mjs +5 -56
  345. package/tools/eslint-baseline.json +12 -13
  346. package/tools/knip-baseline.json +0 -179
  347. package/tools/loc-baseline.json +31 -81
  348. package/tools/motion3/extract-body.mjs +103 -0
  349. package/tools/motion3/extract-rig.mjs +85 -0
  350. package/tools/process-supervisor.mjs +0 -88
  351. package/tools/run-tests.mjs +9 -125
  352. package/bin/agent/motion-runtime.mjs +0 -76
  353. package/dist/ardy/cskel27-rest.json +0 -557
  354. package/dist/assets/analytics-C9pMpW7s.js +0 -1
  355. package/dist/assets/app-B_2XB9rw.css +0 -1
  356. package/dist/assets/app-DAuvKPP8.js +0 -4920
  357. package/dist/assets/config-Bx7pYsD9.js +0 -1
  358. package/dist/assets/config-DeoFTYzb.css +0 -1
  359. package/dist/assets/demo-CvKuBgy5.js +0 -1
  360. package/dist/assets/scene-asset-sync-DKkpjKBV.js +0 -19
  361. package/dist/assets/scene-asset-sync-DjJ_cJ2R.css +0 -1
  362. package/dist/assets/ticket-BPk2Ni95.js +0 -1
  363. package/dist/assets/workflow-jJRBR94Z.js +0 -179
  364. package/dist/demo/walk-then-stop.npz +0 -0
  365. package/mcp/ardy-prompts.mjs +0 -218
  366. package/src/ardy/auto-fix-panel.css +0 -108
  367. package/src/ardy/auto-physics.js +0 -1194
  368. package/src/ardy/client.js +0 -153
  369. package/src/ardy/convert.js +0 -313
  370. package/src/ardy/cskel27-neutral.js +0 -39
  371. package/src/ardy/cskel27.js +0 -77
  372. package/src/ardy/export.js +0 -165
  373. package/src/ardy/fix-collisions.js +0 -2257
  374. package/src/ardy/foot-lock.js +0 -230
  375. package/src/ardy/motion-calibration.js +0 -118
  376. package/src/ardy/motion-edit.js +0 -213
  377. package/src/ardy/motion-url.js +0 -55
  378. package/src/ardy/mp4-duration.js +0 -102
  379. package/src/ardy/npz.js +0 -595
  380. package/src/ardy/physics-panel.css +0 -21
  381. package/src/ardy/physics-panel.jsx +0 -89
  382. package/src/ardy/physics-refine.js +0 -111
  383. package/src/ardy/physics-review.js +0 -567
  384. package/src/ardy/physics-temporal.js +0 -54
  385. package/src/ardy/platform-fit-panel.css +0 -64
  386. package/src/ardy/platform-fit-panel.jsx +0 -41
  387. package/src/ardy/platform-fit.js +0 -326
  388. package/src/ardy/playback.js +0 -711
  389. package/src/ardy/pose-pin.js +0 -97
  390. package/src/ardy/prompt-clips.js +0 -30
  391. package/src/ardy/retime.js +0 -211
  392. package/src/ardy/root-drop.js +0 -369
  393. package/src/ardy/timeline-resize.js +0 -13
  394. package/src/ardy/to-cskel27.js +0 -225
  395. package/src/ardy/trim.js +0 -33
  396. package/src/ardy/waypoints.js +0 -369
  397. package/src/ardy-bridge-contract.js +0 -281
  398. package/src/domains/motion/motion-video-capture.js +0 -664
  399. package/src/i2v-motion-client.js +0 -77
  400. package/src/i2v-motion-studio.jsx +0 -180
  401. package/src/line-edit.js +0 -1348
  402. package/src/motion/generation.js +0 -105
  403. package/src/motion-readiness-ui.jsx +0 -67
  404. package/src/motion-readiness.js +0 -40
  405. package/src/motion-resources.js +0 -177
  406. package/src/motion-store.js +0 -65
  407. package/src/motion-trail.js +0 -601
  408. package/src/multimodel-ingest.js +0 -394
  409. package/src/panels/PromptBlocksPanel.jsx +0 -444
  410. package/src/panels/VideoCapturePanel.jsx +0 -181
  411. package/src/pose-extract/browser.js +0 -42
  412. package/src/pose-extract/detector.js +0 -100
  413. package/src/pose-extract/fit.js +0 -227
  414. package/src/pose-extract/image-frame.js +0 -51
  415. package/src/pose-extract/index.js +0 -58
  416. package/src/pose-extract/keyframes.js +0 -74
  417. package/src/pose-extract/landmarks.js +0 -162
  418. package/src/pose-extract/mirror.js +0 -153
  419. package/src/pose-extract/take.js +0 -131
  420. package/src/pose-extract/video-frames.js +0 -91
  421. package/src/take-recipe.js +0 -165
  422. package/src/trail-key-conflicts.js +0 -39
  423. package/src/trail-pick.js +0 -59
  424. package/src/use-i2v-capture-modal.js +0 -15
  425. package/tools/ardy/BRIDGE.md +0 -37
  426. package/tools/ardy/GVHMR-NPZ.md +0 -68
  427. package/tools/ardy/README.md +0 -124
  428. package/tools/ardy/__pycache__/cclay_gvhmr_worker.cpython-313.pyc +0 -0
  429. package/tools/ardy/artifacts.mjs +0 -34
  430. package/tools/ardy/bridge.mjs +0 -1732
  431. package/tools/ardy/bvh-cskel27.mjs +0 -1265
  432. package/tools/ardy/cclay_constrained_generate.py +0 -561
  433. package/tools/ardy/cclay_gvhmr_worker.py +0 -264
  434. package/tools/ardy/cclay_motion_edit.py +0 -510
  435. package/tools/ardy/cclay_sequence_generate.py +0 -705
  436. package/tools/ardy/cclay_worker.py +0 -304
  437. package/tools/ardy/dump-npz.py +0 -205
  438. package/tools/ardy/extract-rest.mjs +0 -299
  439. package/tools/ardy/extract.mjs +0 -507
  440. package/tools/ardy/footage.mjs +0 -467
  441. package/tools/ardy/gvhmr-floor.mjs +0 -102
  442. package/tools/ardy/gvhmr-to-cskel27.mjs +0 -21
  443. package/tools/ardy/gvhmr_fastpath.py +0 -168
  444. package/tools/ardy/gvhmr_trajectory.py +0 -240
  445. package/tools/ardy/merge-text-encoder.py +0 -160
  446. package/tools/ardy/mocap-metrics.mjs +0 -200
  447. package/tools/ardy/mocap-quality-gate.mjs +0 -110
  448. package/tools/ardy/motion-stabilize.mjs +0 -348
  449. package/tools/ardy/npz.mjs +0 -414
  450. package/tools/ardy/pose-to-npz.mjs +0 -106
  451. package/tools/ardy/prompt-limits.mjs +0 -5
  452. package/tools/ardy/run-edit-on-box.sh +0 -73
  453. package/tools/ardy/run-local.mjs +0 -233
  454. package/tools/ardy/run-on-box.sh +0 -593
  455. package/tools/ardy/run-sequence-on-box.sh +0 -177
  456. package/tools/ardy/runners/gvhmr-worker.mjs +0 -206
  457. package/tools/ardy/runners/index.mjs +0 -18
  458. package/tools/ardy/runners/local.mjs +0 -455
  459. package/tools/ardy/runners/proc.mjs +0 -125
  460. package/tools/ardy/runners/remote.mjs +0 -252
  461. package/tools/ardy/setup-local.mjs +0 -189
  462. package/tools/ardy/setup-text-encoder-on-box.sh +0 -93
  463. package/tools/ardy/setup-text-encoder.py +0 -306
  464. package/tools/ardy/smpl-cskel27.mjs +0 -178
  465. package/tools/ardy/visual-qa.mjs +0 -196
  466. package/tools/ardy/vq-car.mjs +0 -52
  467. package/tools/bench/EXP3.md +0 -61
  468. package/tools/bench/cclay_bench_extract_incam.py +0 -125
  469. package/tools/bench/cclay_bench_extract_obs.py +0 -204
  470. package/tools/bench/cclay_bench_runner.py +0 -42
  471. package/tools/bench/cube-contact.mjs +0 -162
  472. package/tools/bench/exp3.mjs +0 -152
  473. package/tools/bench/extract-bench-lib.mjs +0 -216
  474. package/tools/bench/extract-bench.mjs +0 -302
  475. package/tools/bench/fal-generate.mjs +0 -88
  476. package/tools/bench/fit/README.md +0 -189
  477. package/tools/bench/fit/camera.mjs +0 -59
  478. package/tools/bench/fit/contact.mjs +0 -419
  479. package/tools/bench/fit/footlock.mjs +0 -234
  480. package/tools/bench/fit/motion.mjs +0 -85
  481. package/tools/bench/fit/pin.mjs +0 -27
  482. package/tools/bench/fit/remote.mjs +0 -105
  483. package/tools/bench/fit-bench.mjs +0 -126
  484. package/tools/bench/fit-sanity.mjs +0 -45
  485. package/tools/bench/metrics.mjs +0 -313
  486. package/tools/bench/obs/depth.mjs +0 -258
  487. package/tools/bench/obs/extrinsics.mjs +0 -175
  488. package/tools/bench/obs/fit_mannequin_betas.py +0 -340
  489. package/tools/bench/obs/ground.mjs +0 -294
  490. package/tools/bench/obs/heading.mjs +0 -151
  491. package/tools/bench/obs/ladder.mjs +0 -555
  492. package/tools/bench/obs/mannequin-betas.json +0 -124
  493. package/tools/bench/obs/remote.mjs +0 -83
  494. package/tools/bench/obs/rest_joints.py +0 -52
  495. package/tools/bench/obs/ybot-targets.mjs +0 -49
  496. package/tools/bench/obs-bench.mjs +0 -520
  497. package/tools/bench/score.mjs +0 -343
  498. package/tools/bench/summarize.mjs +0 -86
  499. package/tools/demo-worker/README.md +0 -137
  500. package/tools/demo-worker/api-client.mjs +0 -233
  501. package/tools/demo-worker/generate.mjs +0 -301
  502. package/tools/demo-worker/index.mjs +0 -466
  503. package/tools/demo-worker/sign-core.mjs +0 -112
  504. package/tools/demo-worker/sign.mjs +0 -161
  505. package/tools/gt-render/browser.mjs +0 -182
  506. package/tools/gt-render/camera-math.mjs +0 -276
  507. package/tools/gt-render/page.mjs +0 -267
  508. package/tools/gt-render/render.mjs +0 -514
  509. package/tools/gt-render/scene-box.mjs +0 -31
  510. package/tools/gt-render/take-transform.mjs +0 -87
  511. package/tools/kimodo/compare-seam.mjs +0 -108
  512. package/tools/kimodo/constraints.mjs +0 -244
  513. package/tools/kimodo/edit.mjs +0 -259
  514. package/tools/kimodo/effector-constraints.mjs +0 -200
  515. package/tools/kimodo/generate.mjs +0 -646
  516. package/tools/kimodo/local-output.mjs +0 -265
  517. package/tools/kimodo/measure-pose.mjs +0 -65
  518. package/tools/kimodo/measure-preserve.mjs +0 -899
  519. package/tools/kimodo/measure-waypoints.mjs +0 -55
  520. package/tools/kimodo/mlx-generate.py +0 -111
  521. package/tools/kimodo/pose-constraints.mjs +0 -248
  522. package/tools/kimodo/preserve-mask.mjs +0 -543
  523. package/tools/kimodo/read-npz.mjs +0 -189
  524. package/tools/kimodo/run-edit-on-box.mjs +0 -155
  525. package/tools/kimodo/run-sequence-on-box.mjs +0 -178
  526. package/tools/kimodo/runner.mjs +0 -284
  527. package/tools/kimodo/seam-batch.mjs +0 -77
  528. package/tools/kimodo/setup-local.mjs +0 -30
  529. package/tools/kimodo/setup-on-box.sh +0 -339
  530. package/tools/kimodo/soma77-to-cskel27.mjs +0 -305
  531. package/tools/morphgs/assets/gen_truth.py +0 -39
  532. package/tools/morphgs/assets/mesh_ori_rig.txt +0 -27
  533. package/tools/morphgs/assets/playback-check.mjs +0 -30
  534. package/tools/morphgs/demo-gate.sh +0 -26
  535. package/tools/morphgs/fbx2morphgs.mjs +0 -68
  536. package/tools/morphgs/morphgs-to-cskel27.mjs +0 -105
  537. package/tools/morphgs/patches/preprocess_src-none-mode.patch +0 -76
  538. package/tools/morphgs/setup-on-cluster.sh +0 -126
  539. package/tools/projflow/driver.py +0 -1069
  540. package/tools/projflow/generate.mjs +0 -805
  541. package/tools/projflow/hml22-to-cskel27.mjs +0 -735
  542. package/tools/projflow/line-edit-job.mjs +0 -547
  543. package/tools/projflow/replay.mjs +0 -452
  544. package/tools/projflow/runner.mjs +0 -269
  545. package/tools/projflow/service.mjs +0 -742
  546. package/tools/track/DESIGN.md +0 -513
  547. package/tools/track/backfill-provenance.mjs +0 -116
  548. package/tools/track/budget.mjs +0 -8
  549. package/tools/track/check-rig.mjs +0 -209
  550. package/tools/track/diagnostics.schema.json +0 -60
  551. package/tools/track/export-rig.mjs +0 -256
  552. package/tools/track/fallback.mjs +0 -7
  553. package/tools/track/fk-parity-fixture.mjs +0 -161
  554. package/tools/track/gate.mjs +0 -349
  555. package/tools/track/masks.mjs +0 -318
  556. package/tools/track/metrics.mjs +0 -201
  557. package/tools/track/publish-obs.mjs +0 -108
  558. package/tools/track/py/check_env.py +0 -61
  559. package/tools/track/py/eval_lr.py +0 -229
  560. package/tools/track/py/lr_viterbi.py +0 -294
  561. package/tools/track/py/masks.py +0 -405
  562. package/tools/track/py/objective.py +0 -382
  563. package/tools/track/py/rig.py +0 -508
  564. package/tools/track/py/scene.py +0 -326
  565. package/tools/track/py/test_joint_indices.py +0 -123
  566. package/tools/track/py/test_lr_viterbi.py +0 -195
  567. package/tools/track/py/test_masks.py +0 -229
  568. package/tools/track/py/test_rig.py +0 -288
  569. package/tools/track/py/test_scene.py +0 -354
  570. package/tools/track/py/test_track.py +0 -328
  571. package/tools/track/py/track.py +0 -411
  572. package/tools/track/remote.mjs +0 -140
  573. package/tools/track/rig-dump.mjs +0 -227
  574. package/tools/track/run-box-tests.mjs +0 -14
  575. package/tools/track/run-box.mjs +0 -168
  576. package/tools/track/setup-box.sh +0 -59
  577. package/tools/track/study-2d.mjs +0 -728
  578. /package/src/{ardy → motion}/collision-blockers.js +0 -0
  579. /package/src/{ardy → motion}/ground.js +0 -0
  580. /package/src/{ardy → motion}/ik-drag.js +0 -0
  581. /package/src/{ardy → motion}/ik-key-json.js +0 -0
  582. /package/src/{ardy → motion}/ik.js +0 -0
  583. /package/src/{ardy → motion}/physics-surface.js +0 -0
  584. /package/src/{ardy → motion}/playback-clock.js +0 -0
  585. /package/src/{ardy → motion}/range-pin.js +0 -0
@@ -1 +1 @@
1
- {"payload":"{\"distribution\":\"npm\",\"package\":\"cozyclay\",\"version\":\"2.1.1\",\"repository\":\"NomaDamas/CozyClay\",\"content_sha256\":\"05301230e82860f17fdf3043274840c0f9959ec99907187cb5d516cc937dfabb\"}","signature":"GuUScV2s3XXtftHL6hEMO+nBbLKD37dy3TSdrqeM4mg0+Fm5V+sFbISCkGAMLKyaGkNDCeMUmtNGWsWGENm9Aw=="}
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-ChUvB_zL.js"></script>
305
- <link rel="modulepreload" crossorigin href="/assets/analytics-C9pMpW7s.js">
306
- <link rel="modulepreload" crossorigin href="/assets/first-shot-handoff-msLI71g1.js">
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
- const CACHE_NAME = `${CACHE_PREFIX}v7`;
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 || url.pathname.includes("/ardy/")) return;
86
+ if (url.origin !== self.location.origin) return;
90
87
  if (request.headers.has("range")) {
91
88
  event.respondWith((async () => {
92
89
  try {
@@ -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-jJRBR94Z.js"></script>
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-C9pMpW7s.js">
14
- <link rel="modulepreload" crossorigin href="/assets/scene-asset-sync-DKkpjKBV.js">
15
- <link rel="stylesheet" crossorigin href="/assets/scene-asset-sync-DjJ_cJ2R.css">
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>
@@ -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 `load_motion` and
63
- `import_asset`, which retain a dedicated 30 s editor bound (decode and stand a
64
- mesh, or install a take). Measurement
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 `generate_motion`, `set_prompt_blocks`, `load_motion` and
180
- `mark_camera_move` answer `{ ok: false, code: "NOT_IN_MODE", reason }` and send
181
- no command; `generate_motion` and `load_motion` on a capsule figure answer
182
- `{ ok: false, code: "TARGET_NOT_READY", reason }` with the kind's reason. The
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
- generate character motion and read the shot back as film vocabulary — then turn it into an AI
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, motion,
10
- prompt blocks on the timeline.
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`, `set_prompt_blocks`, `generate_motion`, `apply_batch`,
13
- and `import_mesh` explicitly require a live editor.
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 generation
118
+ ## Motion
120
119
 
121
- `generate_motion` takes plain-language beats and a length:
122
-
123
- ```
124
- phases: ["seated on a chair, slowly stands up",
125
- "breaks into a sprint",
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 28 tools in every project. A
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 - generate_motion is available in Animation projects." }
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` | `generate_motion`, `set_prompt_blocks`, `load_motion`, `mark_camera_move` |
150
- | `TARGET_NOT_READY` | the target character is a capsule figure (`model: "proxy-figure"`) | `generate_motion` (the editor's active character), `load_motion` (its `character`, else the active one) |
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, prompt blocks and named camera moves belong to Animation projects.
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
- export const LOAD_MOTION_TIMEOUT_MS = 30_000;
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
- "apply_batch",
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", "set_prompt_blocks"].includes(name)) return description.characters;
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
- if (name === "load_motion") return LOAD_MOTION_TIMEOUT_MS;
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 === "load_motion" || command === "run_action") return false;
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
- // The load acknowledgement is the existing installation receipt,
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"
@@ -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", "set_prompt_blocks", "generate_motion", "update_object",
109
- "remove_object", "apply_batch", "add_scene", "switch_scene", "open_project", "capture_frame", "load_motion",
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
- ` motionRef: ${JSON.stringify(c.motionRef ?? null)}`,
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", "set_prompt_blocks", "load_motion", "generate_motion",
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": "2.1.1",
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 && node test/process/verify-bridge-launch.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",