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,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