cozyclay 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (583) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +12 -30
  3. package/bin/agent/agent-routes.mjs +40 -113
  4. package/bin/agent/agent-runner.mjs +9 -10
  5. package/bin/agent/cliproxy-provider.mjs +135 -0
  6. package/bin/agent/credential-store.mjs +30 -7
  7. package/bin/agent/pi-tools.mjs +4 -1
  8. package/bin/agent/provider-keys.mjs +32 -0
  9. package/bin/agent/provider-login.mjs +110 -0
  10. package/bin/agent/provider-routes.mjs +99 -0
  11. package/bin/agent/providers.mjs +19 -97
  12. package/bin/agent/script-tool.mjs +17 -4
  13. package/bin/agent/studio-motion-reference.mjs +23 -0
  14. package/bin/agent/studio-prompt.mjs +1 -1
  15. package/bin/agent/studio-rebase-text.mjs +32 -0
  16. package/bin/agent/studio-rebase.mjs +26 -39
  17. package/bin/agent/studio-tools.mjs +9 -28
  18. package/bin/agent/tool-arguments.mjs +49 -0
  19. package/bin/agent/turn-frames.mjs +66 -0
  20. package/bin/codex-auth.mjs +9 -2
  21. package/bin/cozyclay.mjs +10 -116
  22. package/bin/live/cli.mjs +22 -6
  23. package/bin/mcp-runtime.mjs +2 -12
  24. package/bin/package-signature.mjs +0 -4
  25. package/dist/app/index.html +7 -6
  26. package/dist/assets/EXRLoader-CvVIvGVE.js +1 -0
  27. package/dist/assets/analytics-C9sUnndd.js +1 -0
  28. package/dist/assets/app-CCh--1Hc.js +5087 -0
  29. package/dist/assets/app-f-fkV5uP.css +1 -0
  30. package/dist/assets/compile-worker-CkxiD6lH.js +5 -0
  31. package/dist/assets/fflate.module-KbGj5-H6.js +5 -0
  32. package/dist/assets/{first-shot-handoff-BlT33CGf.js → first-shot-handoff-CC4xe4HM.js} +1 -1
  33. package/dist/assets/{landing-BSesrCpL.js → landing-DjHD8u7k.js} +1 -1
  34. package/dist/assets/scene-asset-sync-Hx_FzdOH.js +20 -0
  35. package/dist/assets/scene-asset-sync-_S8NQl5B.css +1 -0
  36. package/dist/assets/workflow-C4yKH1p4.js +179 -0
  37. package/dist/cozyclay-package.json +1 -1
  38. package/dist/index.html +3 -3
  39. package/dist/llms.txt +14 -0
  40. package/dist/sw.js +3 -6
  41. package/dist/workflow/index.html +5 -4
  42. package/mcp/LIVE-PROTOCOL.md +7 -47
  43. package/mcp/README.md +16 -26
  44. package/mcp/live-hub.mjs +6 -10
  45. package/mcp/package.json +1 -3
  46. package/mcp/tool-handlers.mjs +4 -168
  47. package/package.json +3 -22
  48. package/src/App.jsx +174 -2639
  49. package/src/agent-progress.js +79 -0
  50. package/src/agent-turn-mark.js +30 -0
  51. package/src/analytics.js +1 -19
  52. package/src/app-context.js +5 -0
  53. package/src/app-stage.jsx +2 -34
  54. package/src/asset-pane.jsx +6 -5
  55. package/src/camera-block.js +21 -0
  56. package/src/camera-direction.js +120 -0
  57. package/src/character-kind.js +3 -9
  58. package/src/command-bus.js +8 -6
  59. package/src/commands/cast.js +5 -34
  60. package/src/commands/elements/character.js +1 -1
  61. package/src/commands/elements/motion.js +1 -6
  62. package/src/commands/elements/object.js +6 -2
  63. package/src/commands/elements/shot.js +4 -1
  64. package/src/commands/elements.js +38 -14
  65. package/src/commands/index.js +3 -1
  66. package/src/commands/kits.js +37 -0
  67. package/src/commands/motion-timing.js +57 -0
  68. package/src/commands/motion.js +9 -152
  69. package/src/commands/motion3-compile.js +65 -0
  70. package/src/commands/motion3.js +207 -0
  71. package/src/commands/objects.js +6 -4
  72. package/src/commands/shot.js +49 -11
  73. package/src/commands/stage.js +14 -1
  74. package/src/commands/view.js +4 -1
  75. package/src/document-mirrors.js +42 -0
  76. package/src/document-store.js +4 -0
  77. package/src/domains/cast.js +19 -194
  78. package/src/domains/motion/motion-range-pin-rules.js +1 -1
  79. package/src/domains/motion/take-source.js +51 -0
  80. package/src/domains/motion.js +60 -1838
  81. package/src/domains/scenes.js +12 -55
  82. package/src/domains/shots.js +2 -2
  83. package/src/domains/stage.js +4 -2
  84. package/src/draft-ghost.js +46 -0
  85. package/src/draft-ghost.jsx +129 -0
  86. package/src/dualview.jsx +4 -3
  87. package/src/effects/EffectsLayer.jsx +112 -0
  88. package/src/effects/effect-meshes.js +232 -0
  89. package/src/effects/effect-record.js +103 -0
  90. package/src/effects/emitter.js +59 -0
  91. package/src/effects/simulate.js +261 -0
  92. package/src/effects/state.js +59 -0
  93. package/src/execution-telemetry.js +2 -3
  94. package/src/first-success-guide.jsx +5 -5
  95. package/src/ghost-set.js +257 -0
  96. package/src/held-object-edit.jsx +113 -0
  97. package/src/held-object-pose.js +175 -0
  98. package/src/hierarchy-model.js +1 -1
  99. package/src/hierarchy-panel.jsx +1 -1
  100. package/src/imported-mesh.jsx +103 -0
  101. package/src/kits/held.js +84 -0
  102. package/src/kits/index.js +70 -0
  103. package/src/kits/smoking.js +57 -0
  104. package/src/light-blockers.js +93 -0
  105. package/src/motion/beat-board-model.js +84 -0
  106. package/src/motion/beat-board.css +124 -0
  107. package/src/motion/beat-board.jsx +59 -0
  108. package/src/motion/center-of-mass.js +66 -0
  109. package/src/motion/fix-collisions.js +850 -0
  110. package/src/motion/physics-review.js +118 -0
  111. package/src/{ardy → motion}/physics-support.js +1 -76
  112. package/src/motion/rig-snapshot.js +22 -0
  113. package/src/motion/take-segments.jsx +140 -0
  114. package/src/{ardy → motion}/timeline-coordinates.js +0 -21
  115. package/src/{ardy → motion}/timeline.css +1 -2
  116. package/src/{ardy → motion}/timeline.jsx +48 -419
  117. package/src/motion/waypoints.js +76 -0
  118. package/src/motion3/beats.js +83 -0
  119. package/src/motion3/body.js +158 -0
  120. package/src/motion3/bones.js +47 -0
  121. package/src/motion3/carried.js +47 -0
  122. package/src/motion3/compile-job.js +75 -0
  123. package/src/motion3/compile-worker.js +10 -0
  124. package/src/motion3/compiler/anchors.js +105 -0
  125. package/src/motion3/compiler/arm-orient.js +128 -0
  126. package/src/motion3/compiler/channels.js +125 -0
  127. package/src/motion3/compiler/compile.js +205 -0
  128. package/src/motion3/compiler/gait-rhythm.js +97 -0
  129. package/src/motion3/compiler/grip.js +171 -0
  130. package/src/motion3/compiler/head-steady.js +48 -0
  131. package/src/motion3/compiler/hold.js +134 -0
  132. package/src/motion3/compiler/idle.js +113 -0
  133. package/src/motion3/compiler/limbs.js +170 -0
  134. package/src/motion3/compiler/math.js +72 -0
  135. package/src/motion3/compiler/pose.js +162 -0
  136. package/src/motion3/compiler/quat.js +49 -0
  137. package/src/motion3/compiler/skeleton.js +74 -0
  138. package/src/motion3/compiler/validate-common.js +32 -0
  139. package/src/motion3/compiler/validate-goals.js +118 -0
  140. package/src/motion3/compiler/validate-objects.js +143 -0
  141. package/src/motion3/compiler/validate-parts.js +116 -0
  142. package/src/motion3/compiler/validate.js +122 -0
  143. package/src/motion3/compiler/vocab.js +73 -0
  144. package/src/motion3/compiler/walk-pelvis.js +275 -0
  145. package/src/motion3/compiler/walk.js +207 -0
  146. package/src/motion3/compiler/wrist-clamp.js +32 -0
  147. package/src/motion3/delta.js +47 -0
  148. package/src/motion3/describe.js +174 -0
  149. package/src/motion3/docs.js +27 -0
  150. package/src/motion3/edit-carry.js +21 -0
  151. package/src/motion3/fix/ease.js +16 -0
  152. package/src/motion3/fix/ground.js +37 -0
  153. package/src/motion3/fix/index.js +52 -0
  154. package/src/motion3/fix/push.js +71 -0
  155. package/src/motion3/fix/reach.js +46 -0
  156. package/src/motion3/fix/retime.js +79 -0
  157. package/src/motion3/fix/self.js +211 -0
  158. package/src/motion3/fix/slide.js +70 -0
  159. package/src/motion3/fix/turn.js +51 -0
  160. package/src/motion3/follow.js +39 -0
  161. package/src/motion3/free-motion.js +173 -0
  162. package/src/motion3/grip-choice.js +130 -0
  163. package/src/motion3/hold-plan.js +157 -0
  164. package/src/motion3/json-patch.js +77 -0
  165. package/src/motion3/key-aim.js +105 -0
  166. package/src/motion3/key-edit.js +82 -0
  167. package/src/motion3/lenient.js +127 -0
  168. package/src/motion3/object-keys.js +236 -0
  169. package/src/motion3/object-pose.js +182 -0
  170. package/src/motion3/object-tracks.js +12 -0
  171. package/src/motion3/pipeline.js +102 -0
  172. package/src/motion3/playback.js +51 -0
  173. package/src/motion3/probes.js +91 -0
  174. package/src/motion3/qa/body-checks.js +34 -0
  175. package/src/motion3/qa/check-names.js +14 -0
  176. package/src/motion3/qa/checks.js +121 -0
  177. package/src/motion3/qa/contact-checks.js +51 -0
  178. package/src/motion3/qa/explain.js +80 -0
  179. package/src/motion3/qa/fmt.js +5 -0
  180. package/src/motion3/qa/foot-checks.js +72 -0
  181. package/src/motion3/qa/geometry.js +77 -0
  182. package/src/motion3/qa/goals.js +191 -0
  183. package/src/motion3/qa/ground.js +60 -0
  184. package/src/motion3/qa/hints-contact.js +179 -0
  185. package/src/motion3/qa/hints-goal.js +160 -0
  186. package/src/motion3/qa/hints-knee.js +24 -0
  187. package/src/motion3/qa/hints-motion.js +209 -0
  188. package/src/motion3/qa/hints-object.js +91 -0
  189. package/src/motion3/qa/index.js +42 -0
  190. package/src/motion3/qa/key-checks.js +82 -0
  191. package/src/motion3/qa/near.js +96 -0
  192. package/src/motion3/qa/object-checks.js +135 -0
  193. package/src/motion3/qa/patch.js +161 -0
  194. package/src/motion3/qa/severity.js +38 -0
  195. package/src/motion3/qa/spec-checks.js +65 -0
  196. package/src/motion3/qa/style.js +218 -0
  197. package/src/motion3/qa/wrist-checks.js +69 -0
  198. package/src/motion3/qa/wrist-obs.js +60 -0
  199. package/src/motion3/refs.js +120 -0
  200. package/src/motion3/repair-tune.js +121 -0
  201. package/src/motion3/repair.js +83 -0
  202. package/src/motion3/report.js +67 -0
  203. package/src/motion3/rigs/index.js +14 -0
  204. package/src/motion3/rigs/x-bot-tpose-body.json +1 -0
  205. package/src/motion3/rigs/x-bot-tpose.json +1 -0
  206. package/src/motion3/rigs/y-bot-tpose-body.json +1 -0
  207. package/src/motion3/rigs/y-bot-tpose.json +1 -0
  208. package/src/motion3/scene.js +60 -0
  209. package/src/motion3/schema/brief.js +89 -0
  210. package/src/motion3/schema/fields.js +44 -0
  211. package/src/motion3/schema/spec-examples.js +46 -0
  212. package/src/motion3/schema/topics.js +111 -0
  213. package/src/motion3/schema/types.js +147 -0
  214. package/src/motion3/search.js +117 -0
  215. package/src/motion3/second-hand.js +112 -0
  216. package/src/motion3/skills/basic.js +82 -0
  217. package/src/motion3/skills/book.js +76 -0
  218. package/src/motion3/skills/car.js +145 -0
  219. package/src/motion3/skills/frames-auto.js +29 -0
  220. package/src/motion3/skills/index.js +83 -0
  221. package/src/motion3/skills/info.js +65 -0
  222. package/src/motion3/skills/smoke-kit.js +109 -0
  223. package/src/motion3/skills/smoke.js +160 -0
  224. package/src/motion3/spec-store.js +59 -0
  225. package/src/motion3/take-edit.js +155 -0
  226. package/src/motion3/take.js +63 -0
  227. package/src/motion3/timeline.js +127 -0
  228. package/src/motion3/views.js +121 -0
  229. package/src/motion3/walk-plan.js +119 -0
  230. package/src/object-catalog.jsx +7 -1
  231. package/src/object-colors.js +98 -0
  232. package/src/object-gizmo-parts.js +115 -0
  233. package/src/object-gizmo.jsx +37 -122
  234. package/src/object-glow.js +139 -0
  235. package/src/object-hidden.js +33 -0
  236. package/src/object-look.js +196 -0
  237. package/src/object-size.js +10 -0
  238. package/src/object-travel.js +71 -6
  239. package/src/panels/CameraPanel.jsx +7 -7
  240. package/src/panels/HdrEnvironmentControls.jsx +59 -0
  241. package/src/panels/LightPanel.jsx +25 -4
  242. package/src/panels/ObjectLookPanel.jsx +88 -0
  243. package/src/panels/PoseImagePanel.jsx +1 -1
  244. package/src/panels/PosePanel.jsx +2 -17
  245. package/src/panels/RigControlPanel.jsx +5 -53
  246. package/src/panels/SubjectBox.jsx +4 -1
  247. package/src/panels/details.css +14 -0
  248. package/src/posestudio.jsx +4 -27
  249. package/src/project-browser.jsx +3 -4
  250. package/src/project-resources.js +18 -31
  251. package/src/project.js +13 -104
  252. package/src/props.jsx +25 -280
  253. package/src/rail-dot-drag.js +23 -0
  254. package/src/render-passes.js +10 -0
  255. package/src/resource-status.jsx +1 -0
  256. package/src/result-modal.jsx +4 -19
  257. package/src/room.jsx +20 -12
  258. package/src/scene-assets.js +8 -6
  259. package/src/scene-light-place.js +72 -0
  260. package/src/scene-lights.jsx +148 -0
  261. package/src/scene-objects.js +31 -139
  262. package/src/scenes.js +15 -105
  263. package/src/semantic-edit.js +2 -5
  264. package/src/set-pieces.jsx +183 -0
  265. package/src/settings-menu.jsx +3 -11
  266. package/src/shell/BottomDock.jsx +11 -53
  267. package/src/shell/CompositionGuideButton.jsx +20 -0
  268. package/src/shell/DetailsSlot.jsx +16 -200
  269. package/src/shell/GhostsMenuGroup.jsx +74 -0
  270. package/src/shell/LibrarySlot.jsx +1 -3
  271. package/src/shell/MenuBar.jsx +3 -3
  272. package/src/shell/PreferencesDialog.jsx +15 -264
  273. package/src/shell/PreferencesSlot.jsx +2 -8
  274. package/src/shell/ShotPreviewHeader.jsx +17 -0
  275. package/src/shell/TopBar.jsx +5 -83
  276. package/src/shell/ViewportToolbar.jsx +23 -93
  277. package/src/shell/agent-glass.css +19 -6
  278. package/src/shell/details-selection.js +42 -0
  279. package/src/shell/ghosts-menu.css +22 -0
  280. package/src/shell/glass-regions.css +29 -3
  281. package/src/shell/preferences.css +6 -1
  282. package/src/shell/viewport.css +12 -0
  283. package/src/shot-authoring.js +4 -7
  284. package/src/soft-shadows.js +37 -0
  285. package/src/stage-attach-frames.js +12 -12
  286. package/src/stage-canvas-rigs.jsx +3 -3
  287. package/src/stage-capture.jsx +42 -8
  288. package/src/stage-characters.jsx +22 -216
  289. package/src/stage-editor-gizmos.jsx +6 -6
  290. package/src/stage-environment.js +93 -0
  291. package/src/stage-hdr-builtins.js +107 -0
  292. package/src/stage-hdr-image.js +116 -0
  293. package/src/stage-hdr-library.js +70 -0
  294. package/src/stage-hdr-map.js +94 -0
  295. package/src/stage-hdr.js +130 -0
  296. package/src/stage-lighting.js +149 -0
  297. package/src/stage-occlusion.js +210 -0
  298. package/src/stage-sky.jsx +159 -0
  299. package/src/stage-startup-defaults.js +5 -9
  300. package/src/studio-actions.js +12 -14
  301. package/src/studio-agent-commands.js +46 -16
  302. package/src/studio-agent-motion.js +9 -9
  303. package/src/studio-agent-protocol.js +46 -73
  304. package/src/studio-app-binding.js +29 -45
  305. package/src/studio-asset-list.js +17 -0
  306. package/src/studio-contact-sheet.js +37 -5
  307. package/src/studio-elements.js +27 -7
  308. package/src/studio-entity-bounds.js +18 -0
  309. package/src/studio-error-codes.js +8 -0
  310. package/src/studio-export-framing.js +152 -0
  311. package/src/studio-lighting-check.js +103 -0
  312. package/src/studio-motion-visual.js +150 -0
  313. package/src/studio-schema-errors.js +80 -0
  314. package/src/studio-support-gap.js +74 -0
  315. package/src/styles.css +1 -19
  316. package/src/timeline-defaults.js +5 -0
  317. package/src/timeline-extent.js +8 -20
  318. package/src/tutorial-walk.js +17 -0
  319. package/src/ui-scrub.js +1 -1
  320. package/src/use-shot-camera-tracks.js +12 -0
  321. package/src/view-ghosts.js +97 -0
  322. package/src/view-ghosts.jsx +49 -0
  323. package/src/workflow/AgentPanel.jsx +47 -166
  324. package/src/workflow/AgentProgressCard.jsx +107 -0
  325. package/src/workflow/AgentReplyText.jsx +37 -0
  326. package/src/workflow/AgentTurnSteps.jsx +84 -0
  327. package/src/workflow/LoginPanel.jsx +140 -0
  328. package/src/workflow/WorkflowBuilder.jsx +7 -23
  329. package/src/workflow/agent-client.js +54 -51
  330. package/src/workflow/agent-panel.css +71 -1
  331. package/src/workflow/agent-progress-card.css +167 -0
  332. package/src/workflow/agent-progress-view.js +47 -0
  333. package/src/workflow/agent-turn-steps.css +113 -0
  334. package/src/workflow/agent-turn.js +191 -0
  335. package/src/workflow/login-client.js +34 -0
  336. package/src/workflow/motion-input.js +18 -31
  337. package/src/workflow/node-schema.js +1 -1
  338. package/src/workflow/reply-markdown.js +69 -0
  339. package/src/workflow/scene-asset-sync.js +8 -8
  340. package/tools/agent-session-stats.mjs +61 -0
  341. package/tools/dev-full.mjs +5 -56
  342. package/tools/eslint-baseline.json +12 -13
  343. package/tools/headless-studio.mjs +85 -0
  344. package/tools/knip-baseline.json +0 -179
  345. package/tools/loc-baseline.json +33 -83
  346. package/tools/motion3/extract-body.mjs +103 -0
  347. package/tools/motion3/extract-rig.mjs +85 -0
  348. package/tools/process-supervisor.mjs +0 -88
  349. package/tools/run-tests.mjs +9 -124
  350. package/bin/agent/motion-runtime.mjs +0 -76
  351. package/dist/ardy/cskel27-rest.json +0 -557
  352. package/dist/assets/analytics-B41FmPYI.js +0 -1
  353. package/dist/assets/app-Do-Og5Pu.css +0 -1
  354. package/dist/assets/app-DwP-tl2x.js +0 -4920
  355. package/dist/assets/config-Bx7pYsD9.js +0 -1
  356. package/dist/assets/config-DeoFTYzb.css +0 -1
  357. package/dist/assets/demo-Dt0qZfS7.js +0 -1
  358. package/dist/assets/scene-asset-sync-BCWDJB1d.js +0 -19
  359. package/dist/assets/scene-asset-sync-DjJ_cJ2R.css +0 -1
  360. package/dist/assets/ticket-jqMhqL88.js +0 -1
  361. package/dist/assets/workflow-Br-K7Srs.js +0 -179
  362. package/dist/demo/walk-then-stop.npz +0 -0
  363. package/mcp/ardy-prompts.mjs +0 -218
  364. package/src/ardy/auto-fix-panel.css +0 -108
  365. package/src/ardy/auto-physics.js +0 -1194
  366. package/src/ardy/client.js +0 -153
  367. package/src/ardy/convert.js +0 -313
  368. package/src/ardy/cskel27-neutral.js +0 -39
  369. package/src/ardy/cskel27.js +0 -77
  370. package/src/ardy/export.js +0 -165
  371. package/src/ardy/fix-collisions.js +0 -2257
  372. package/src/ardy/foot-lock.js +0 -230
  373. package/src/ardy/motion-calibration.js +0 -118
  374. package/src/ardy/motion-edit.js +0 -213
  375. package/src/ardy/motion-url.js +0 -55
  376. package/src/ardy/mp4-duration.js +0 -102
  377. package/src/ardy/npz.js +0 -595
  378. package/src/ardy/physics-panel.css +0 -21
  379. package/src/ardy/physics-panel.jsx +0 -89
  380. package/src/ardy/physics-refine.js +0 -111
  381. package/src/ardy/physics-review.js +0 -567
  382. package/src/ardy/physics-temporal.js +0 -54
  383. package/src/ardy/platform-fit-panel.css +0 -64
  384. package/src/ardy/platform-fit-panel.jsx +0 -41
  385. package/src/ardy/platform-fit.js +0 -326
  386. package/src/ardy/playback.js +0 -711
  387. package/src/ardy/pose-pin.js +0 -97
  388. package/src/ardy/prompt-clips.js +0 -30
  389. package/src/ardy/retime.js +0 -211
  390. package/src/ardy/root-drop.js +0 -369
  391. package/src/ardy/timeline-resize.js +0 -13
  392. package/src/ardy/to-cskel27.js +0 -225
  393. package/src/ardy/trim.js +0 -33
  394. package/src/ardy/waypoints.js +0 -369
  395. package/src/ardy-bridge-contract.js +0 -281
  396. package/src/domains/motion/motion-video-capture.js +0 -664
  397. package/src/i2v-motion-client.js +0 -77
  398. package/src/i2v-motion-studio.jsx +0 -180
  399. package/src/line-edit.js +0 -1348
  400. package/src/motion/generation.js +0 -105
  401. package/src/motion-readiness-ui.jsx +0 -67
  402. package/src/motion-readiness.js +0 -40
  403. package/src/motion-resources.js +0 -177
  404. package/src/motion-store.js +0 -65
  405. package/src/motion-trail.js +0 -601
  406. package/src/multimodel-ingest.js +0 -394
  407. package/src/panels/PromptBlocksPanel.jsx +0 -444
  408. package/src/panels/VideoCapturePanel.jsx +0 -181
  409. package/src/pose-extract/browser.js +0 -42
  410. package/src/pose-extract/detector.js +0 -100
  411. package/src/pose-extract/fit.js +0 -227
  412. package/src/pose-extract/image-frame.js +0 -51
  413. package/src/pose-extract/index.js +0 -58
  414. package/src/pose-extract/keyframes.js +0 -74
  415. package/src/pose-extract/landmarks.js +0 -162
  416. package/src/pose-extract/mirror.js +0 -153
  417. package/src/pose-extract/take.js +0 -131
  418. package/src/pose-extract/video-frames.js +0 -91
  419. package/src/take-recipe.js +0 -165
  420. package/src/trail-key-conflicts.js +0 -39
  421. package/src/trail-pick.js +0 -59
  422. package/src/use-i2v-capture-modal.js +0 -15
  423. package/tools/ardy/BRIDGE.md +0 -37
  424. package/tools/ardy/GVHMR-NPZ.md +0 -68
  425. package/tools/ardy/README.md +0 -124
  426. package/tools/ardy/__pycache__/cclay_gvhmr_worker.cpython-313.pyc +0 -0
  427. package/tools/ardy/artifacts.mjs +0 -34
  428. package/tools/ardy/bridge.mjs +0 -1732
  429. package/tools/ardy/bvh-cskel27.mjs +0 -1265
  430. package/tools/ardy/cclay_constrained_generate.py +0 -561
  431. package/tools/ardy/cclay_gvhmr_worker.py +0 -264
  432. package/tools/ardy/cclay_motion_edit.py +0 -510
  433. package/tools/ardy/cclay_sequence_generate.py +0 -705
  434. package/tools/ardy/cclay_worker.py +0 -304
  435. package/tools/ardy/dump-npz.py +0 -205
  436. package/tools/ardy/extract-rest.mjs +0 -299
  437. package/tools/ardy/extract.mjs +0 -507
  438. package/tools/ardy/footage.mjs +0 -467
  439. package/tools/ardy/gvhmr-floor.mjs +0 -102
  440. package/tools/ardy/gvhmr-to-cskel27.mjs +0 -21
  441. package/tools/ardy/gvhmr_fastpath.py +0 -168
  442. package/tools/ardy/gvhmr_trajectory.py +0 -240
  443. package/tools/ardy/merge-text-encoder.py +0 -160
  444. package/tools/ardy/mocap-metrics.mjs +0 -200
  445. package/tools/ardy/mocap-quality-gate.mjs +0 -110
  446. package/tools/ardy/motion-stabilize.mjs +0 -348
  447. package/tools/ardy/npz.mjs +0 -414
  448. package/tools/ardy/pose-to-npz.mjs +0 -106
  449. package/tools/ardy/prompt-limits.mjs +0 -5
  450. package/tools/ardy/run-edit-on-box.sh +0 -73
  451. package/tools/ardy/run-local.mjs +0 -233
  452. package/tools/ardy/run-on-box.sh +0 -593
  453. package/tools/ardy/run-sequence-on-box.sh +0 -177
  454. package/tools/ardy/runners/gvhmr-worker.mjs +0 -206
  455. package/tools/ardy/runners/index.mjs +0 -18
  456. package/tools/ardy/runners/local.mjs +0 -455
  457. package/tools/ardy/runners/proc.mjs +0 -125
  458. package/tools/ardy/runners/remote.mjs +0 -252
  459. package/tools/ardy/setup-local.mjs +0 -189
  460. package/tools/ardy/setup-text-encoder-on-box.sh +0 -93
  461. package/tools/ardy/setup-text-encoder.py +0 -306
  462. package/tools/ardy/smpl-cskel27.mjs +0 -178
  463. package/tools/ardy/visual-qa.mjs +0 -196
  464. package/tools/ardy/vq-car.mjs +0 -52
  465. package/tools/bench/EXP3.md +0 -61
  466. package/tools/bench/cclay_bench_extract_incam.py +0 -125
  467. package/tools/bench/cclay_bench_extract_obs.py +0 -204
  468. package/tools/bench/cclay_bench_runner.py +0 -42
  469. package/tools/bench/cube-contact.mjs +0 -162
  470. package/tools/bench/exp3.mjs +0 -152
  471. package/tools/bench/extract-bench-lib.mjs +0 -216
  472. package/tools/bench/extract-bench.mjs +0 -302
  473. package/tools/bench/fal-generate.mjs +0 -88
  474. package/tools/bench/fit/README.md +0 -189
  475. package/tools/bench/fit/camera.mjs +0 -59
  476. package/tools/bench/fit/contact.mjs +0 -419
  477. package/tools/bench/fit/footlock.mjs +0 -234
  478. package/tools/bench/fit/motion.mjs +0 -85
  479. package/tools/bench/fit/pin.mjs +0 -27
  480. package/tools/bench/fit/remote.mjs +0 -105
  481. package/tools/bench/fit-bench.mjs +0 -126
  482. package/tools/bench/fit-sanity.mjs +0 -45
  483. package/tools/bench/metrics.mjs +0 -313
  484. package/tools/bench/obs/depth.mjs +0 -258
  485. package/tools/bench/obs/extrinsics.mjs +0 -175
  486. package/tools/bench/obs/fit_mannequin_betas.py +0 -340
  487. package/tools/bench/obs/ground.mjs +0 -294
  488. package/tools/bench/obs/heading.mjs +0 -151
  489. package/tools/bench/obs/ladder.mjs +0 -555
  490. package/tools/bench/obs/mannequin-betas.json +0 -124
  491. package/tools/bench/obs/remote.mjs +0 -83
  492. package/tools/bench/obs/rest_joints.py +0 -52
  493. package/tools/bench/obs/ybot-targets.mjs +0 -49
  494. package/tools/bench/obs-bench.mjs +0 -520
  495. package/tools/bench/score.mjs +0 -343
  496. package/tools/bench/summarize.mjs +0 -86
  497. package/tools/demo-worker/README.md +0 -137
  498. package/tools/demo-worker/api-client.mjs +0 -233
  499. package/tools/demo-worker/generate.mjs +0 -301
  500. package/tools/demo-worker/index.mjs +0 -466
  501. package/tools/demo-worker/sign-core.mjs +0 -112
  502. package/tools/demo-worker/sign.mjs +0 -161
  503. package/tools/gt-render/browser.mjs +0 -159
  504. package/tools/gt-render/camera-math.mjs +0 -276
  505. package/tools/gt-render/page.mjs +0 -267
  506. package/tools/gt-render/render.mjs +0 -514
  507. package/tools/gt-render/scene-box.mjs +0 -31
  508. package/tools/gt-render/take-transform.mjs +0 -87
  509. package/tools/kimodo/compare-seam.mjs +0 -108
  510. package/tools/kimodo/constraints.mjs +0 -244
  511. package/tools/kimodo/edit.mjs +0 -259
  512. package/tools/kimodo/effector-constraints.mjs +0 -200
  513. package/tools/kimodo/generate.mjs +0 -646
  514. package/tools/kimodo/local-output.mjs +0 -265
  515. package/tools/kimodo/measure-pose.mjs +0 -65
  516. package/tools/kimodo/measure-preserve.mjs +0 -899
  517. package/tools/kimodo/measure-waypoints.mjs +0 -55
  518. package/tools/kimodo/mlx-generate.py +0 -111
  519. package/tools/kimodo/pose-constraints.mjs +0 -248
  520. package/tools/kimodo/preserve-mask.mjs +0 -543
  521. package/tools/kimodo/read-npz.mjs +0 -189
  522. package/tools/kimodo/run-edit-on-box.mjs +0 -155
  523. package/tools/kimodo/run-sequence-on-box.mjs +0 -178
  524. package/tools/kimodo/runner.mjs +0 -284
  525. package/tools/kimodo/seam-batch.mjs +0 -77
  526. package/tools/kimodo/setup-local.mjs +0 -30
  527. package/tools/kimodo/setup-on-box.sh +0 -339
  528. package/tools/kimodo/soma77-to-cskel27.mjs +0 -305
  529. package/tools/morphgs/assets/gen_truth.py +0 -39
  530. package/tools/morphgs/assets/mesh_ori_rig.txt +0 -27
  531. package/tools/morphgs/assets/playback-check.mjs +0 -30
  532. package/tools/morphgs/demo-gate.sh +0 -26
  533. package/tools/morphgs/fbx2morphgs.mjs +0 -68
  534. package/tools/morphgs/morphgs-to-cskel27.mjs +0 -105
  535. package/tools/morphgs/patches/preprocess_src-none-mode.patch +0 -76
  536. package/tools/morphgs/setup-on-cluster.sh +0 -126
  537. package/tools/projflow/driver.py +0 -1069
  538. package/tools/projflow/generate.mjs +0 -805
  539. package/tools/projflow/hml22-to-cskel27.mjs +0 -735
  540. package/tools/projflow/line-edit-job.mjs +0 -547
  541. package/tools/projflow/replay.mjs +0 -452
  542. package/tools/projflow/runner.mjs +0 -269
  543. package/tools/projflow/service.mjs +0 -742
  544. package/tools/track/DESIGN.md +0 -513
  545. package/tools/track/backfill-provenance.mjs +0 -116
  546. package/tools/track/budget.mjs +0 -8
  547. package/tools/track/check-rig.mjs +0 -209
  548. package/tools/track/diagnostics.schema.json +0 -60
  549. package/tools/track/export-rig.mjs +0 -256
  550. package/tools/track/fallback.mjs +0 -7
  551. package/tools/track/fk-parity-fixture.mjs +0 -161
  552. package/tools/track/gate.mjs +0 -349
  553. package/tools/track/masks.mjs +0 -318
  554. package/tools/track/metrics.mjs +0 -201
  555. package/tools/track/publish-obs.mjs +0 -108
  556. package/tools/track/py/check_env.py +0 -61
  557. package/tools/track/py/eval_lr.py +0 -229
  558. package/tools/track/py/lr_viterbi.py +0 -294
  559. package/tools/track/py/masks.py +0 -405
  560. package/tools/track/py/objective.py +0 -382
  561. package/tools/track/py/rig.py +0 -508
  562. package/tools/track/py/scene.py +0 -326
  563. package/tools/track/py/test_joint_indices.py +0 -123
  564. package/tools/track/py/test_lr_viterbi.py +0 -195
  565. package/tools/track/py/test_masks.py +0 -229
  566. package/tools/track/py/test_rig.py +0 -288
  567. package/tools/track/py/test_scene.py +0 -354
  568. package/tools/track/py/test_track.py +0 -328
  569. package/tools/track/py/track.py +0 -411
  570. package/tools/track/remote.mjs +0 -140
  571. package/tools/track/rig-dump.mjs +0 -227
  572. package/tools/track/run-box-tests.mjs +0 -14
  573. package/tools/track/run-box.mjs +0 -168
  574. package/tools/track/setup-box.sh +0 -59
  575. package/tools/track/study-2d.mjs +0 -728
  576. /package/src/{ardy → motion}/collision-blockers.js +0 -0
  577. /package/src/{ardy → motion}/ground.js +0 -0
  578. /package/src/{ardy → motion}/ik-drag.js +0 -0
  579. /package/src/{ardy → motion}/ik-key-json.js +0 -0
  580. /package/src/{ardy → motion}/ik.js +0 -0
  581. /package/src/{ardy → motion}/physics-surface.js +0 -0
  582. /package/src/{ardy → motion}/playback-clock.js +0 -0
  583. /package/src/{ardy → motion}/range-pin.js +0 -0
@@ -1,7 +1,6 @@
1
1
  import { useStudioShell } from "./studio-shell-context.js";
2
2
  import { ko } from "../locale.js";
3
- import { sceneObjectNameDisplayKo, HIERARCHY_INSPECTOR_TITLES, CHARACTER_MODEL_LABELS } from "../app-stage.jsx";
4
- import { CUTOUT_KIND, EMPTY_KIND, SCULPT_KIND } from "../scene-objects.js";
3
+ import { detailsSelection } from "./details-selection.js";
5
4
  import LightPanel from "../panels/LightPanel.jsx";
6
5
  import CameraPanel from "../panels/CameraPanel.jsx";
7
6
  import SubjectsPanel from "../panels/SubjectsPanel.jsx";
@@ -9,85 +8,32 @@ import CharacterTransformPanel from "../panels/CharacterTransformPanel.jsx";
9
8
  import RigPanel from "../panels/RigPanel.jsx";
10
9
  import ProxyFigurePanel from "../panels/ProxyFigurePanel.jsx";
11
10
  import PosePanel from "../panels/PosePanel.jsx";
12
- import VideoCapturePanel from "../panels/VideoCapturePanel.jsx";
13
- import PromptBlocksPanel from "../panels/PromptBlocksPanel.jsx";
14
11
  import RigControlPanel from "../panels/RigControlPanel.jsx";
15
12
  import PoseImagePanel from "../panels/PoseImagePanel.jsx";
16
13
  import EnvironmentPanel from "../panels/EnvironmentPanel.jsx";
17
14
  import PropsPanel from "../panels/PropsPanel.jsx";
18
15
  import ObjectTransformPanel from "../panels/ObjectTransformPanel.jsx";
19
- import { ASSET_IMAGE_TYPES } from "../scene-assets.js";
16
+ import ObjectLookPanel from "../panels/ObjectLookPanel.jsx";
20
17
  import { PoseStudioPanel } from "../posestudio.jsx";
21
18
  import { DEFAULT_POSE } from "../poses.js";
22
19
  import "../panels/details.css";
23
20
 
24
- const characterIndexForRow = (rowId, characters) => rowId === "characterA" ? 0
25
- : rowId === "characterB" ? 1
26
- : characters.findIndex((entry) => `character:${entry.id}` === rowId);
27
- const characterTitle = (index) => ko(`Character ${index + 1}`, `인물 ${index + 1}`);
28
-
29
- /** The 2a selection header: the selected item's name and a "Kind · detail"
30
- * type line. Null when nothing that owns settings is selected. */
31
- function detailsSelection({ selectedHierarchyId: id, selectedSceneObject, rigSelection, characters, shot, inspectorHasContent }) {
32
- if (!inspectorHasContent) return null;
33
- if (selectedSceneObject) {
34
- const kind = selectedSceneObject.renderer === CUTOUT_KIND ? ko("Cutout", "컷아웃") : selectedSceneObject.renderer === EMPTY_KIND ? ko("Empty", "빈 오브젝트") : selectedSceneObject.renderer === SCULPT_KIND ? ko("Sculpt", "조형") : ko("Mesh", "메시");
35
- return { name: sceneObjectNameDisplayKo(selectedSceneObject.name), type: `${selectedSceneObject.renderer === EMPTY_KIND ? ko("Node", "노드") : ko("Prop", "소품")} · ${kind}` };
36
- }
37
- if (rigSelection) {
38
- const index = characterIndexForRow(rigSelection.rowId, characters);
39
- const kind = rigSelection.token === "rig" ? ko("Rig", "리그") : ko("Bone", "본");
40
- return { name: HIERARCHY_INSPECTOR_TITLES[rigSelection.token] ?? kind, type: index >= 0 ? `${kind} · ${characterTitle(index)}` : kind };
41
- }
42
- if (id === "camera") return { name: HIERARCHY_INSPECTOR_TITLES.camera, type: `${ko("Camera", "카메라")} · ${shot.focalMm}mm` };
43
- if (id === "characterA" || id === "characterB" || id.startsWith("character:")) {
44
- const index = characterIndexForRow(id, characters);
45
- const model = CHARACTER_MODEL_LABELS[characters[index]?.model];
46
- return { name: characterTitle(Math.max(index, 0)), type: model ? `${ko("Character", "인물")} · ${model}` : ko("Character", "인물") };
47
- }
48
- const types = {
49
- shot: ko("Scene", "장면"),
50
- light: ko("Light", "조명"),
51
- characters: ko("Folder", "폴더"),
52
- environment: ko("Environment", "환경"),
53
- props: ko("Folder", "폴더"),
54
- };
55
- return { name: HIERARCHY_INSPECTOR_TITLES[id] ?? ko("Selection", "선택 항목"), type: types[id] ?? "" };
56
- }
57
-
58
21
  export default function DetailsSlot() {
59
22
  const {
60
23
  sculptPanel, selectedHierarchyId, sceneSaveError, studioAgentError, embedMode, studioAgentMode,
61
24
  setStudioAgentMode, AgentPanel, setAgentCollapsed, scenes, activeSceneId,
62
- buildStudioAgentContext, highlightAgentTargets, generateI2vMotionFromUi, selectedSceneObject, rigSelection,
25
+ buildStudioAgentContext, highlightAgentTargets, selectedSceneObject, rigSelection,
63
26
  inspectorActionsOpen, setInspectorActionsOpen, runStudioAction, deleteSelectedSceneObject, inspectorHasContent,
64
- keyLightSelected, keyLight, isCameraSelection,
27
+ keyLightSelected, keyLight, lighting, isCameraSelection,
65
28
  shot, moveSequence, cameraKeys, activeShot,
66
29
  isCharacterSelection, showB, characters, openStudio,
67
30
  posing, workflowMode, activeChar,
68
- activeCharIndex, i2vMotionModel, i2vMotionActions, setI2vMotionStudioOpen,
31
+ activeCharIndex,
69
32
  selectablePoses, ikMode, ikApplyPoseAsKey, motion, setStudioPick,
70
- appContext, removePose, setPhotoPoseError, photoPoseFileRef, photoPoseState,
71
- photoPoseError, activeRig, saveCurrentPose, multiModelStatus, multiModelStage,
72
- multiModelFileRef, chooseMultiModelFile, multiModelSource, multiModelUrl, setMultiModelUrl,
73
- useMultiModelUrl, pasteMultiModelUrl, multiModelProgress, multiModelError, multiModelFootage,
74
- extractMultiModelMotion, multiModelExtract, multiModelTake, multiModelExtractProgress, multiModelExtractError,
75
- bridge, promptBlocksReveal, promptClips, selectedPromptId, setSelectedPromptId,
76
- setArdyPrompt, setTlFrame, tlFrameCount, ardySeed,
77
- changeArdySeed, lineEditMode, toggleLineEditMode, linePreviewUrl, lineCurve,
78
- lineDrifted, lineTrack, setLineTrack, linePinMode, setLinePinMode,
79
- linePins, lineClipFrames, lineEditRange, setLineRange, lineRadius,
80
- changeLineRadius, lineCurveDirty, lineEditFrom, lineEditTo, lineCurvePointCount,
81
- lineDriftHint, lineCurveHidden, linePreviewBusy, linePreviewMs, linePreviewError,
82
- generationBusy, bridgeChecking, lineReadinessState, runLineEdit, openMotionSetup,
83
- recheckMotionHealth, resetLineCurve, exitLineEditMode, readinessState, ardyRunning,
84
- cancelArdy, ardyStatus, ardyOutcome, tlFrame,
85
- isRigSelection, ikChains, ikFocus, footSnap, poseObjectOpacity, setPoseObjectOpacity, capturePoseImage, collisionCleanupSupported,
86
- autoPhysicsRunning, physicsProgress, physicsPreview,
87
- physicsShow, physicsOptions, platformFitRunning, platformFitProgress, platformFitLast,
88
- platformFitApplied, changePhysicsOptions, runAutoPhysics, showPhysicsPreview, applyPhysicsPreview,
89
- cancelPhysicsPreview, ikEditTool, setIkEditTool, showTrails, setShowTrails,
90
- trailFalloffS, setTrailFalloffS, trailEdit, trailTrackFocus, selectTrailTrack, clearTrailTrackFocus, runTrailRegeneration, trailReadinessState,
33
+ appContext, removePose, activeRig, saveCurrentPose,
34
+ tlFrame,
35
+ isRigSelection, ikChains, ikFocus, footSnap, poseObjectOpacity, setPoseObjectOpacity, capturePoseImage,
36
+ ikEditTool, setIkEditTool,
91
37
  pendingIkEdit, applyPendingIkEdit, cancelPendingIkEdit,
92
38
  rangePins, rangePinResiduals, rangePinSelection, rangePinPartPick, rangePinPreview,
93
39
  sceneObjects, setRangePinSelection, setRangePinPartPick, previewRangePinDraft, applyRangePinDraft,
@@ -99,7 +45,7 @@ export default function DetailsSlot() {
99
45
  matteTolerance, setMatteTolerance, matteBrush, setMatteBrush, matteShrink,
100
46
  setMatteShrink, matteFeather, setMatteFeather, matteBusy,
101
47
  autoColor, recentObjectColors, rememberSceneObjectColor, objectColorDraft, setObjectColorDraft,
102
- posePhotoFile, posingIndex, posingChar, charA, allPoses,
48
+ posingIndex, posingChar, charA, allPoses,
103
49
  studioPick, posingClosing, closeStudio, castDomain, setToast,
104
50
  savePose, beginWorkspaceResize,
105
51
  } = useStudioShell();
@@ -164,8 +110,8 @@ export default function DetailsSlot() {
164
110
  {!inspectorHasContent && (
165
111
  <p className="inspector-empty" data-inspector-empty role="status">
166
112
  {ko(
167
- "Select something in the hierarchy — the scene, the camera, a character, the environment or a prop — and its settings appear here.",
168
- "계층에서 항목을 고르면 — 씨, 카메라, 캐릭터, 환경, 소품 — 그 설정이 여기 나타납니다.",
113
+ "Select the camera, a character, the light, the environment or a prop in the Outliner, and its settings appear here.",
114
+ "아웃라이너에서 카메라, 캐릭터, 조명, 환경, 소품을 고르면 그 설정이 여기 나타납니다.",
169
115
  )}
170
116
  </p>
171
117
  )}
@@ -175,7 +121,7 @@ export default function DetailsSlot() {
175
121
 
176
122
  {/* Camera animation is authored against the same playhead as motion,
177
123
  so keep its controls beside the Motion tools as well as Shot setup. */}
178
- <LightPanel keyLightSelected={keyLightSelected} keyLight={keyLight} />
124
+ <LightPanel keyLightSelected={keyLightSelected} keyLight={keyLight} lighting={lighting} />
179
125
  {/* Lens, Recenter and Record used to live here as well as in the
180
126
  viewport camera bar and the topbar Export menu. One home each
181
127
  (#193, R1): framing is the bar's job, delivery is Export's, and
@@ -218,9 +164,6 @@ export default function DetailsSlot() {
218
164
  <PosePanel
219
165
  isCharacterSelection={isCharacterSelection}
220
166
  activeCharIndex={activeCharIndex}
221
- i2vMotionModel={i2vMotionModel}
222
- i2vMotionActions={i2vMotionActions}
223
- setI2vMotionStudioOpen={setI2vMotionStudioOpen}
224
167
  selectablePoses={selectablePoses}
225
168
  activeChar={activeChar}
226
169
  ikMode={ikMode}
@@ -229,87 +172,10 @@ export default function DetailsSlot() {
229
172
  setStudioPick={setStudioPick}
230
173
  setToast={appContext.notify}
231
174
  removePose={removePose}
232
- setPhotoPoseError={setPhotoPoseError}
233
- photoPoseFileRef={photoPoseFileRef}
234
- photoPoseState={photoPoseState}
235
- photoPoseError={photoPoseError}
236
175
  activeRig={activeRig}
237
176
  saveCurrentPose={saveCurrentPose}
238
177
  />
239
178
 
240
- <VideoCapturePanel
241
- isCharacterSelection={isCharacterSelection}
242
- multiModelStatus={multiModelStatus}
243
- multiModelStage={multiModelStage}
244
- multiModelFileRef={multiModelFileRef}
245
- chooseMultiModelFile={chooseMultiModelFile}
246
- multiModelSource={multiModelSource}
247
- multiModelUrl={multiModelUrl}
248
- setMultiModelUrl={setMultiModelUrl}
249
- useMultiModelUrl={useMultiModelUrl}
250
- pasteMultiModelUrl={pasteMultiModelUrl}
251
- multiModelProgress={multiModelProgress}
252
- multiModelError={multiModelError}
253
- multiModelFootage={multiModelFootage}
254
- extractMultiModelMotion={extractMultiModelMotion}
255
- multiModelExtract={multiModelExtract}
256
- multiModelTake={multiModelTake}
257
- multiModelExtractProgress={multiModelExtractProgress}
258
- multiModelExtractError={multiModelExtractError}
259
- activeChar={activeChar}
260
- bridge={bridge}
261
- />
262
- <PromptBlocksPanel
263
- isCharacterSelection={isCharacterSelection}
264
- promptBlocksReveal={promptBlocksReveal}
265
- promptClips={promptClips}
266
- selectedPromptId={selectedPromptId}
267
- setSelectedPromptId={setSelectedPromptId}
268
- setArdyPrompt={setArdyPrompt}
269
- setTlFrame={setTlFrame}
270
- tlFrameCount={tlFrameCount}
271
- ardySeed={ardySeed}
272
- changeArdySeed={changeArdySeed}
273
- motion={motion}
274
- lineEditMode={lineEditMode}
275
- toggleLineEditMode={toggleLineEditMode}
276
- linePreviewUrl={linePreviewUrl}
277
- lineCurve={lineCurve}
278
- lineDrifted={lineDrifted}
279
- lineTrack={lineTrack}
280
- setLineTrack={setLineTrack}
281
- linePinMode={linePinMode}
282
- setLinePinMode={setLinePinMode}
283
- linePins={linePins}
284
- lineClipFrames={lineClipFrames}
285
- lineEditRange={lineEditRange}
286
- setLineRange={setLineRange}
287
- lineRadius={lineRadius}
288
- changeLineRadius={changeLineRadius}
289
- lineCurveDirty={lineCurveDirty}
290
- lineEditFrom={lineEditFrom}
291
- lineEditTo={lineEditTo}
292
- lineCurvePointCount={lineCurvePointCount}
293
- lineDriftHint={lineDriftHint}
294
- lineCurveHidden={lineCurveHidden}
295
- linePreviewBusy={linePreviewBusy}
296
- linePreviewMs={linePreviewMs}
297
- linePreviewError={linePreviewError}
298
- generationBusy={generationBusy}
299
- bridgeChecking={bridgeChecking}
300
- bridge={bridge}
301
- lineReadinessState={lineReadinessState}
302
- runLineEdit={runLineEdit}
303
- openMotionSetup={openMotionSetup}
304
- recheckMotionHealth={recheckMotionHealth}
305
- resetLineCurve={resetLineCurve}
306
- exitLineEditMode={exitLineEditMode}
307
- readinessState={readinessState}
308
- ardyRunning={ardyRunning}
309
- cancelArdy={cancelArdy}
310
- ardyStatus={ardyStatus}
311
- ardyOutcome={ardyOutcome}
312
- />
313
179
 
314
180
  <RigControlPanel
315
181
  isRigSelection={isRigSelection}
@@ -320,44 +186,14 @@ export default function DetailsSlot() {
320
186
  poseObjectOpacity={poseObjectOpacity}
321
187
  setPoseObjectOpacity={setPoseObjectOpacity}
322
188
  ikMode={ikMode}
323
- collisionCleanupSupported={collisionCleanupSupported}
324
189
  motion={motion}
325
- autoPhysicsRunning={autoPhysicsRunning}
326
- physicsProgress={physicsProgress}
327
- physicsPreview={physicsPreview}
328
- physicsShow={physicsShow}
329
- physicsOptions={physicsOptions}
330
- platformFitRunning={platformFitRunning}
331
- platformFitProgress={platformFitProgress}
332
- platformFitLast={platformFitLast}
333
- platformFitApplied={platformFitApplied}
334
190
  tlFrame={tlFrame}
335
- changePhysicsOptions={changePhysicsOptions}
336
- runAutoPhysics={runAutoPhysics}
337
- showPhysicsPreview={showPhysicsPreview}
338
- applyPhysicsPreview={applyPhysicsPreview}
339
- cancelPhysicsPreview={cancelPhysicsPreview}
340
- setTlFrame={setTlFrame}
341
191
  ikEditTool={ikEditTool}
342
192
  setIkEditTool={setIkEditTool}
343
- showTrails={showTrails}
344
- setShowTrails={setShowTrails}
345
- trailFalloffS={trailFalloffS}
346
- setTrailFalloffS={setTrailFalloffS}
347
- trailEdit={trailEdit}
348
- trailTrackFocus={trailTrackFocus}
349
- selectTrailTrack={selectTrailTrack}
350
- clearTrailTrackFocus={clearTrailTrackFocus}
193
+
351
194
  pendingIkEdit={pendingIkEdit}
352
195
  applyPendingIkEdit={applyPendingIkEdit}
353
196
  cancelPendingIkEdit={cancelPendingIkEdit}
354
- generationBusy={generationBusy}
355
- bridgeChecking={bridgeChecking}
356
- bridge={bridge}
357
- runTrailRegeneration={runTrailRegeneration}
358
- trailReadinessState={trailReadinessState}
359
- openMotionSetup={openMotionSetup}
360
- recheckMotionHealth={recheckMotionHealth}
361
197
  rangePins={rangePins}
362
198
  rangePinResiduals={rangePinResiduals}
363
199
  rangePinSelection={rangePinSelection}
@@ -419,6 +255,7 @@ export default function DetailsSlot() {
419
255
  objectColorDraft={objectColorDraft}
420
256
  setObjectColorDraft={setObjectColorDraft}
421
257
  />
258
+ <ObjectLookPanel />
422
259
  </>)}
423
260
  </div>
424
261
  {selectedSceneObject && (
@@ -465,23 +302,8 @@ export default function DetailsSlot() {
465
302
  </button>
466
303
  <AgentPanel embedded hidden={!studioAgentMode} surface="studio" defaultCollapsed onCollapsedChange={setAgentCollapsed}
467
304
  sceneName={scenes.find((entry) => entry.id === activeSceneId)?.name ?? ko("Untitled Scene", "제목 없는 씬")}
468
- buildContext={buildStudioAgentContext} onReceipt={highlightAgentTargets}
469
- onI2vAction={(instruction) => void generateI2vMotionFromUi(instruction)} />
305
+ buildContext={buildStudioAgentContext} onReceipt={highlightAgentTargets} />
470
306
  </div>}
471
- {/* The reference-photo picker sits outside the panel so re-mounting
472
- the studio cannot cancel an in-flight read. */}
473
- <input
474
- ref={photoPoseFileRef}
475
- className="multimodel-file-input"
476
- type="file"
477
- accept={ASSET_IMAGE_TYPES.join(",")}
478
- data-pose-photo-input
479
- onChange={(event) => {
480
- const file = event.target.files?.[0];
481
- event.target.value = ""; // the same photo must be re-pickable after an error
482
- if (file) posePhotoFile(file);
483
- }}
484
- />
485
307
  {/* Pose Studio docks under the inspector instead of floating over
486
308
  the shot: the viewport keeps the posed character unobstructed. */}
487
309
  {posing && (
@@ -518,12 +340,6 @@ export default function DetailsSlot() {
518
340
  setToast(ko("Back to the default pose", "기본 포즈로 돌아왔어요"));
519
341
  }}
520
342
  onSave={savePose}
521
- onPhoto={() => {
522
- setPhotoPoseError("");
523
- photoPoseFileRef.current?.click();
524
- }}
525
- photoState={photoPoseState}
526
- photoError={photoPoseError}
527
343
  onDelete={removePose}
528
344
  onClose={closeStudio}
529
345
  />
@@ -0,0 +1,74 @@
1
+ // The View menu's Ghosts group: onion skin on or off, every N frames or at the key frames, and
2
+ // how many on each side. Every control runs view.setGhosts, the agent's door to the same setting.
3
+ // The last item shows or hides the agent's draft ghost (draft-ghost.js), a viewer-only setting.
4
+ import { useStudioShell } from "./studio-shell-context.js";
5
+ import { ko } from "../locale.js";
6
+ import { GHOST_COLORS, GHOST_COUNT, GHOST_STEP, useGhostSettings } from "../view-ghosts.js";
7
+ import { DRAFT_GHOST_COLOR, setDraftGhostShown, useDraftGhostShown } from "../draft-ghost.js";
8
+ import "./ghosts-menu.css";
9
+
10
+ function Stepper({ label, value, range, disabled, onChange, testId }) {
11
+ return (
12
+ <div className={"view-menu-item ghost-stepper" + (disabled ? " disabled" : "")} data-testid={testId}>
13
+ <span className="view-menu-mark" aria-hidden="true" />
14
+ <span className="ghost-stepper-label">{label}</span>
15
+ <button type="button" role="menuitem" aria-label={`${label} −`} disabled={disabled || value <= range.min} onClick={() => onChange(value - 1)}>−</button>
16
+ <output className="ghost-stepper-value">{value}</output>
17
+ <button type="button" role="menuitem" aria-label={`${label} +`} disabled={disabled || value >= range.max} onClick={() => onChange(value + 1)}>+</button>
18
+ </div>
19
+ );
20
+ }
21
+
22
+ export default function GhostsMenuGroup() {
23
+ const { runStudioAction } = useStudioShell();
24
+ const ghosts = useGhostSettings();
25
+ const drafts = useDraftGhostShown();
26
+ const set = (patch) => runStudioAction("view.setGhosts", { mode: ghosts.mode, count: ghosts.count, step: ghosts.step, ...patch });
27
+ const options = [
28
+ { value: "off", label: ko("Off", "끔") },
29
+ { value: "step", label: ko(`Every ${ghosts.step} frames`, `${ghosts.step}프레임마다`) },
30
+ { value: "keys", label: ko("Key frames", "키 프레임") },
31
+ ];
32
+ return (
33
+ <div className="view-menu-group ghosts-menu" role="group" aria-label={ko("Ghosts (onion skin)", "고스트 (어니언 스킨)")}>
34
+ <span className="view-menu-label" aria-hidden="true">
35
+ {ko("Ghosts", "고스트")}
36
+ <i className="ghost-swatch" style={{ background: GHOST_COLORS.before }} title={ko("before the playhead", "재생 헤드 앞")} />
37
+ <i className="ghost-swatch" style={{ background: GHOST_COLORS.after }} title={ko("after the playhead", "재생 헤드 뒤")} />
38
+ </span>
39
+ {options.map((option) => {
40
+ const checked = option.value === ghosts.mode;
41
+ return (
42
+ <button
43
+ type="button"
44
+ key={option.value}
45
+ role="menuitemradio"
46
+ className={"view-menu-item ghost-mode-option" + (checked ? " active" : "")}
47
+ data-ghosts={option.value}
48
+ aria-checked={checked}
49
+ title={ko("Translucent poses of the selected character's take before and after the playhead; never in exports", "선택한 캐릭터 테이크의 앞뒤 포즈를 반투명하게 표시합니다. 내보내기에는 나오지 않습니다")}
50
+ onClick={() => set({ mode: option.value })}
51
+ >
52
+ <span className="view-menu-mark" aria-hidden="true">{checked ? "✓" : ""}</span>
53
+ {option.label}
54
+ </button>
55
+ );
56
+ })}
57
+ <Stepper label={ko("Each side", "양쪽 개수")} value={ghosts.count} range={GHOST_COUNT} disabled={ghosts.mode === "off"} onChange={(count) => set({ count })} testId="ghost-count" />
58
+ <Stepper label={ko("Step", "간격")} value={ghosts.step} range={GHOST_STEP} disabled={ghosts.mode !== "step"} onChange={(step) => set({ step })} testId="ghost-step" />
59
+ <button
60
+ type="button"
61
+ role="menuitemcheckbox"
62
+ className={"view-menu-item draft-ghost-option" + (drafts ? " active" : "")}
63
+ data-testid="draft-ghost-toggle"
64
+ aria-checked={drafts}
65
+ title={ko("While the agent works, its latest motion draft plays on the character as a teal figure; never in exports", "에이전트가 작업하는 동안 최신 모션 초안을 캐릭터 위에 청록색으로 재생합니다. 내보내기에는 나오지 않습니다")}
66
+ onClick={() => setDraftGhostShown(!drafts)}
67
+ >
68
+ <span className="view-menu-mark" aria-hidden="true">{drafts ? "✓" : ""}</span>
69
+ {ko("Agent draft", "에이전트 초안")}
70
+ <i className="ghost-swatch" style={{ background: DRAFT_GHOST_COLOR, marginLeft: "auto" }} aria-hidden="true" />
71
+ </button>
72
+ </div>
73
+ );
74
+ }
@@ -28,7 +28,7 @@ export default function LibrarySlot({ active = true }) {
28
28
  setBottomTab, beginAssetDrag, shelfImageIds, shelfMeshIds,
29
29
  manageAssetStorage, setManageAssetStorage, unusedAssetIds, usedAssetIds, usageCounts,
30
30
  projectAssetGraphSignature, assetTrash, deleteUnusedAsset, undoDeletedAsset, deletingAssetId,
31
- projectManifest, takeVersions, loadTakeVersion, shots, selectTimelineShot, allPoses,
31
+ projectManifest, shots, selectTimelineShot, allPoses,
32
32
  spawnCharacter, addSceneObject, runStudioAction,
33
33
  } = useStudioShell();
34
34
  const [collapsed, setCollapsed] = useState(readContentCollapsed);
@@ -70,10 +70,8 @@ export default function LibrarySlot({ active = true }) {
70
70
  deletingAssetId={deletingAssetId}
71
71
  resourceManifest={projectManifest}
72
72
  shots={shots}
73
- takeVersions={takeVersions}
74
73
  poses={allPoses}
75
74
  onShotOpen={selectTimelineShot}
76
- onTakeOpen={loadTakeVersion}
77
75
  collapsed={collapsed}
78
76
  onCollapsedChange={(next) => {
79
77
  setCollapsed(next);
@@ -74,7 +74,7 @@ function useFirstItemFocus(ref, box, autoFocus, onAutoFocused) {
74
74
  /** One portaled menu. Outside presses, Escape and window resizes dismiss it;
75
75
  * arrow keys walk its items. `keepOpen` reports a nested flyout that owns
76
76
  * Escape first (App closes the Export flyout on the same key). */
77
- export function MenuPopover({ anchorRef, ignoreRef, onClose, align = "start", label, className = "", keepOpen, onKeyDown, autoFocus, onAutoFocused, children, menuRef: externalRef, ...props }) {
77
+ function MenuPopover({ anchorRef, ignoreRef, onClose, align = "start", label, className = "", keepOpen, onKeyDown, autoFocus, onAutoFocused, children, menuRef: externalRef, ...props }) {
78
78
  const ownRef = useRef(null);
79
79
  const menuRef = externalRef ?? ownRef;
80
80
  const box = usePlacement(anchorRef, menuRef, "below", align, true);
@@ -316,8 +316,8 @@ export default function MenuBar({ preferences }) {
316
316
  ko("Every panel held for its hold, as one MP4", "모든 패널을 홀드만큼 이어 MP4 하나로"), () => void exportAnimatic())}
317
317
  {panelItem("export-otio", ko("Cut list (OTIO)", "컷 목록 (OTIO)"),
318
318
  ko("Download the OTIO cut list; each panel is a clip as long as its hold", "OTIO 컷 목록 다운로드 — 패널마다 홀드 길이의 클립"), () => downloadOtioCutList())}
319
- {panelItem("export-render-passes", ko("Depth + normal (PNG)", "뎄스 + 노멀 (PNG)"),
320
- ko("Depth and normal conditioning plates of the current framing", "현재 프레이밍의 뎄스·노멀 컨디션 플레이트"), () => exportRenderPasses())}
319
+ {panelItem("export-render-passes", ko("Depth + normal (PNG)", "뎁스 + 노멀 (PNG)"),
320
+ ko("Depth and normal conditioning plates of the current framing", "현재 프레이밍의 뎁스·노멀 컨디션 플레이트"), () => exportRenderPasses())}
321
321
  </>
322
322
  );
323
323