cozyclay 3.2.0 → 3.2.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 (185) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/INSTALL_FOR_AGENTS.md +4 -4
  3. package/README.md +4 -2
  4. package/bin/agent/agent-failure-codes.mjs +34 -8
  5. package/bin/agent/agent-routes.mjs +6 -6
  6. package/bin/agent/agent-runner.mjs +16 -13
  7. package/bin/agent/agent-stream.mjs +26 -3
  8. package/bin/agent/main-prompt.mjs +1 -1
  9. package/bin/agent/studio-prompt.mjs +2 -2
  10. package/bin/agent/supervisor-followup.mjs +34 -0
  11. package/bin/agent/supervisor.mjs +6 -6
  12. package/bin/cozyclay.mjs +23 -60
  13. package/bin/star-prompt.mjs +15 -14
  14. package/bin/studio-routes.mjs +6 -3
  15. package/bin/telemetry-state.mjs +5 -7
  16. package/bin/update-check.mjs +61 -7
  17. package/bin/update-install.mjs +16 -3
  18. package/bin/update-restart.mjs +95 -0
  19. package/bin/update-routes.mjs +25 -3
  20. package/dist/app/index.html +13 -7
  21. package/dist/assets/TaskBoard-tgO0MNKL.js +1 -0
  22. package/dist/assets/analytics-CaTUuLPM.js +1 -0
  23. package/dist/assets/app-CnDkB5WO.css +1 -0
  24. package/dist/assets/app-DJt06Oyb.js +5144 -0
  25. package/dist/assets/{compile-worker-DRWRa9pr.js → compile-worker-D1pl6G7x.js} +5 -5
  26. package/dist/assets/landing-2Fy7DU41.js +1 -0
  27. package/dist/assets/modulepreload-polyfill-P2Xu9kJm.js +1 -0
  28. package/dist/assets/motion3-compile-BxaM0Xwl.js +1 -0
  29. package/dist/assets/scene-asset-sync-CLGNbEBq.js +13 -0
  30. package/dist/assets/task-board-UVGTZLRF.js +15 -0
  31. package/dist/assets/workflow-CSiBlX1s.js +179 -0
  32. package/dist/cozyclay-package.json +1 -1
  33. package/dist/index.html +4 -1
  34. package/dist/privacy/index.html +9 -6
  35. package/dist/sitemap.xml +2 -2
  36. package/dist/workflow/index.html +5 -4
  37. package/mcp/README.md +1 -1
  38. package/mcp/live-hub.mjs +4 -4
  39. package/mcp/tool-handlers.mjs +14 -16
  40. package/package.json +2 -1
  41. package/src/App.jsx +37 -70
  42. package/src/analytics-controls.js +25 -3
  43. package/src/analytics-strict.js +16 -4
  44. package/src/analytics.js +32 -26
  45. package/src/app-version.js +13 -0
  46. package/src/asset-drop.js +39 -0
  47. package/src/asset-pane.css +34 -0
  48. package/src/asset-pane.jsx +4 -35
  49. package/src/bus-tasks.js +1 -1
  50. package/src/character-kind.js +8 -6
  51. package/src/click-friction.js +5 -4
  52. package/src/command-bus-telemetry.js +8 -7
  53. package/src/command-bus.js +2 -16
  54. package/src/commands/cast.js +2 -1
  55. package/src/commands/motion3.js +3 -1
  56. package/src/commands/objects.js +2 -37
  57. package/src/commands/project.js +3 -3
  58. package/src/commands/sculpt-compare.js +53 -0
  59. package/src/content-tile.jsx +36 -0
  60. package/src/domains/cast.js +7 -6
  61. package/src/domains/motion.js +6 -5
  62. package/src/domains/scenes.js +41 -31
  63. package/src/execution-telemetry.js +7 -3
  64. package/src/export-menu-telemetry.js +26 -0
  65. package/src/finger-handles.jsx +128 -0
  66. package/src/friction-hint.js +82 -0
  67. package/src/live-control.js +2 -1
  68. package/src/locale-zh/panels.js +20 -0
  69. package/src/locale-zh/shell.js +4 -0
  70. package/src/locale-zh/workspace.js +6 -0
  71. package/src/motion/find-bone.js +13 -0
  72. package/src/motion/fingers.js +170 -0
  73. package/src/motion/fingertip-pick.js +21 -0
  74. package/src/motion/ik-exposure.js +48 -0
  75. package/src/motion/ik.js +4 -11
  76. package/src/motion3/compiler/head-lead.js +4 -2
  77. package/src/motion3/hybrid-hint.js +19 -0
  78. package/src/motion3/load.js +19 -12
  79. package/src/motion3/qa/hints-contact.js +12 -0
  80. package/src/motion3/qa/patch.js +4 -1
  81. package/src/motion3/qa/verdict.js +7 -2
  82. package/src/motion3/repair.js +28 -8
  83. package/src/motion3/skills/catch.js +2 -1
  84. package/src/panels/FingerPanel.jsx +38 -0
  85. package/src/panels/RigControlPanel.jsx +9 -1
  86. package/src/panels/SculptPanel.jsx +12 -12
  87. package/src/panels/SculptPartTree.jsx +46 -0
  88. package/src/panels/SubjectsPanel.jsx +1 -1
  89. package/src/panels/sculpt.css +11 -0
  90. package/src/pose-fade.js +7 -3
  91. package/src/posestudio.jsx +14 -27
  92. package/src/project-browser.css +6 -0
  93. package/src/project-browser.jsx +9 -18
  94. package/src/project-start-choices.jsx +45 -0
  95. package/src/project.js +16 -12
  96. package/src/proxy-figure-shape.js +11 -0
  97. package/src/proxy-figure.jsx +25 -18
  98. package/src/scene-assets.js +17 -13
  99. package/src/scenes.js +22 -11
  100. package/src/sculpt-blueprint.js +56 -0
  101. package/src/sculpt-mode.js +5 -0
  102. package/src/sculpt-part-edit.js +115 -0
  103. package/src/sculpt-part-gizmo.jsx +159 -0
  104. package/src/sculpt-part-outline.jsx +72 -0
  105. package/src/sculpt-pick.js +53 -0
  106. package/src/sculpt-run-text.js +51 -0
  107. package/src/sculpt-run.js +10 -46
  108. package/src/sculpt-shelf-file.js +92 -0
  109. package/src/sculpt-shelf-tiles.jsx +69 -0
  110. package/src/sculpt-shelf.js +108 -0
  111. package/src/sculpt-stage.jsx +39 -2
  112. package/src/sculpt-thumb.js +72 -0
  113. package/src/sculpt-views.js +75 -0
  114. package/src/semantic-edit.js +0 -87
  115. package/src/settings-menu.jsx +2 -2
  116. package/src/shell/DetailsSlot.jsx +5 -6
  117. package/src/shell/LibrarySlot.jsx +8 -10
  118. package/src/shell/MenuBar.jsx +6 -6
  119. package/src/shell/PreferencesDialog.jsx +2 -3
  120. package/src/shell/ViewportToolbar.jsx +15 -18
  121. package/src/shell/add-character-entries.js +13 -0
  122. package/src/shell/pose-controls.js +32 -0
  123. package/src/shell/preference-pages.jsx +2 -11
  124. package/src/shell/storyboard-caption.js +21 -0
  125. package/src/shell/studio-shell-context.js +1 -0
  126. package/src/shortcut-friction.js +2 -1
  127. package/src/site/landing-analytics.js +28 -0
  128. package/src/studio-actions.js +3 -2
  129. package/src/studio-agent-protocol.js +4 -4
  130. package/src/studio-app-binding.js +4 -3
  131. package/src/update/UpdateChip.jsx +21 -2
  132. package/src/update/UpdateDialog.jsx +26 -6
  133. package/src/update/update-client.js +123 -17
  134. package/src/update/update-telemetry.js +15 -3
  135. package/src/use-sculpt-mode.js +62 -8
  136. package/src/workflow/agent-failure-codes.js +28 -9
  137. package/src/workflow/agent-turn-telemetry.js +1 -1
  138. package/src/workflow/task-board.js +2 -2
  139. package/tools/dev/page-shell.py +1 -1
  140. package/tools/dev/pages/greybox-to-video.html +21 -2
  141. package/tools/dev/pages/previs-software.html +3 -3
  142. package/tools/dev/pages/privacy.html +9 -6
  143. package/tools/dev/pages/seedance-camera-control.html +2 -2
  144. package/tools/loc-baseline.json +10 -10
  145. package/tools/run-tests.mjs +45 -69
  146. package/tools/select-tests.mjs +119 -0
  147. package/tools/test-durations.json +455 -0
  148. package/tools/test-graph.mjs +181 -0
  149. package/tools/test-shards.mjs +78 -0
  150. package/tools/tutorial/README.md +74 -0
  151. package/tools/tutorial/assemble.mjs +43 -0
  152. package/tools/tutorial/captions.mjs +43 -0
  153. package/tools/tutorial/cdp.mjs +55 -0
  154. package/tools/tutorial/cursor.mjs +159 -0
  155. package/tools/tutorial/episode.mjs +173 -0
  156. package/tools/tutorial/episodes/beginner-guide/00-install.mjs +42 -0
  157. package/tools/tutorial/episodes/beginner-guide/01-start.mjs +50 -0
  158. package/tools/tutorial/episodes/beginner-guide/02-layout.mjs +67 -0
  159. package/tools/tutorial/episodes/beginner-guide/03-stage.mjs +58 -0
  160. package/tools/tutorial/episodes/beginner-guide/04-motion.mjs +98 -0
  161. package/tools/tutorial/episodes/beginner-guide/05-camera.mjs +47 -0
  162. package/tools/tutorial/episodes/beginner-guide/06-export.mjs +59 -0
  163. package/tools/tutorial/episodes/beginner-guide/steps.mjs +32 -0
  164. package/tools/tutorial/episodes/beginner-guide.mjs +17 -0
  165. package/tools/tutorial/episodes/cast.mjs +12 -0
  166. package/tools/tutorial/episodes/first-video.mjs +121 -0
  167. package/tools/tutorial/episodes/stub-tour.mjs +97 -0
  168. package/tools/tutorial/launch.mjs +63 -0
  169. package/tools/tutorial/mux.mjs +61 -0
  170. package/tools/tutorial/overlay.mjs +142 -0
  171. package/tools/tutorial/record.mjs +156 -0
  172. package/tools/tutorial/scenes/terminal.html +63 -0
  173. package/tools/tutorial/steps.mjs +111 -0
  174. package/tools/tutorial/terminal.mjs +43 -0
  175. package/tools/tutorial/voice.mjs +49 -0
  176. package/tools/update-test-durations.mjs +42 -0
  177. package/tools/verify-package-tarball.mjs +18 -12
  178. package/dist/assets/TaskBoard-BUjjuvm5.js +0 -1
  179. package/dist/assets/app-Dige7q3X.css +0 -1
  180. package/dist/assets/app-DxoI941o.js +0 -5144
  181. package/dist/assets/motion3-compile-B4SX4TGx.js +0 -1
  182. package/dist/assets/rolldown-runtime-hePW80VL.js +0 -1
  183. package/dist/assets/scene-asset-sync-LeI3eSnO.js +0 -13
  184. package/dist/assets/task-board-5PKn7ZaA.js +0 -15
  185. package/dist/assets/workflow-Dg9jCKOq.js +0 -179
@@ -0,0 +1 @@
1
+ import"./modulepreload-polyfill-P2Xu9kJm.js";import{p as e,w as t,y as n}from"./analytics-CaTUuLPM.js";var r=[[`--via site`,`copy_npx`],[`git clone`,`copy_clone`],[`mcpServers`,`copy_mcp`],[`cclay live`,`copy_terminal`]];function i(e){let t=e.closest?.(`button.copy[data-copy]`);if(t)return r.find(([e])=>t.dataset.copy.includes(e))?.[1]??null;let n=e.closest?.(`a[href]`)?.getAttribute(`href`)??``;return n===`/app/`||n.startsWith(`/app/?`)?`app`:n.includes(`INSTALL_FOR_AGENTS`)?`agent_install_doc`:n.startsWith(`https://github.com/NomaDamas/CozyClay`)?`github`:n.startsWith(`https://discord.gg/`)?`discord`:n.startsWith(`https://www.npmjs.com/package/cozyclay`)?`npm`:null}typeof document<`u`&&(e({lite:!0}),document.addEventListener(`click`,e=>{let r=e.target instanceof Element?i(e.target):null;r&&t.includes(r)&&n(`landing:cta_clicked`,{target:r})},{capture:!0}));
@@ -0,0 +1 @@
1
+ (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();
@@ -0,0 +1 @@
1
+ import{Bt as e,Ht as t,Lt as n,Mn as r,Ut as i,Vt as a,Wn as o,Xt as s,gn as c,hn as l,ki as u,la as d,oa as f,vn as p,zt as m}from"./task-board-UVGTZLRF.js";var h=d(f(),1),g=(0,h.createContext)(null);function _(){let e=(0,h.useContext)(g);return(0,h.useMemo)(()=>({run:(...t)=>e.bus.run(...t),subscribe:(...t)=>e.bus.subscribe(...t)}),[e])}var v=e=>({current:e});function y({characters:e=v(null),scenes:t=v(null),motion:n=v(null),state:r=v(null),getBus:i,notify:a}={}){let o=new Map,s=new WeakMap,c=new WeakSet,l=new Map,d=[],f=[],p=null,m=0,h={},g=e=>o.get(e),_=()=>[...o.values()],y={storeDomain:g,storeDomains:_},b={storeDomain:g,storeDomains:_},x=(e,t)=>{throw new u(e,t)},S=e=>g(e.name)===e.handle&&e.store.isRetained(e.id),C=e=>e.members.every(S),w=e=>e?f[0]:d.at(-1),T=(e,t)=>!p&&e===w(t)&&C(e)&&e.members.every(e=>t?e.store.canRedo()&&e.store.history().future[0]?.historyEntryId===e.id:e.store.canUndo(e.id));function E(){for(let[e,t]of l)t.members.some(e=>{if(g(e.name)!==e.handle)return!1;let t=e.store.history();return e.store.isRetained(e.id)||(t.past[0]??t.present).historyEntryId===e.id})||l.delete(e);d=d.filter(e=>l.has(e.id)),f=f.filter(e=>l.has(e.id))}function D(e,t){if(!e||!T(e,t))return!1;let n=y.revision?.current;for(let n of t?e.members:[...e.members].reverse())(t?n.store.redo:n.store.undo)();return t?(f.shift(),d.push(e)):(d.pop(),f.unshift(e)),m++,n!==void 0&&(y.revision.current=n+1),!0}function O(e){if(!e.length)return{historyEntryId:null};let t=e.length===1?e[0].id:crypto.randomUUID();if(l.has(t))return{historyEntryId:t};for(let e of f)l.delete(e.id);f=[];let n={id:t,members:e};return n.handle=e.length===1?e[0].handle:{documentStore:{isRetained:e=>e===t&&l.has(t)&&C(n)},canUndo:e=>(e===void 0||e===t)&&T(n,!1),stepHistory:e=>D(n,e)},l.set(t,n),d.push(n),m++,E(),{historyEntryId:t}}function k(e,t=null,n=!1){if(p){!p.running&&!n&&x(`TARGET_BUSY`,`A composed document transaction is already open.`);let r=p;return r.touch(e,t),{run:r.run,commit:()=>({historyEntryId:null}),cancel:r.cancel}}let r=new Map,i=!1,a=()=>{i&&x(`STALE_TARGET`,`The composed document transaction is closed.`)},o={running:0,touches:e=>r.has(e),touch(e,t){a();let n=g(e);n||x(`CAPABILITY_MISSING`,`No document owner is registered for ${e}.`),r.has(n)||r.set(n,{name:e,handle:n,store:n.documentStore,session:s.get(n)(t)})},run(e){a(),o.running++;try{return[...r.values()].reduceRight((e,t)=>()=>t.session.run(e),e)()}finally{o.running--}},commit(){a();let e=[...r.values()].flatMap(e=>{let t=e.session.commit();return t.historyEntryId?[{name:e.name,handle:e.handle,store:e.store,id:t.historyEntryId}]:[]});return i=!0,p=null,O(e)},savepoint(){return a(),new Map([...r].map(([e,t])=>[e,t.session.mark()]))},rollback(e=new Map){a();for(let[t,n]of[...r].reverse())n.session.rollback(e.get(t))},cancel(e){if(i)return!1;i=!0,p=null;for(let t of[...r.values()].reverse())t.session.cancel(e);return!0}};p=o;try{o.touch(e,t)}catch(e){throw o.cancel(),e}return o}function A(e,t,n=null,r=!1){let i=k(e,n,r),a=e=>({result:e,...i.commit()}),o=e=>{throw i.cancel(),e};try{let e=i.run(t);return e?.then?e.then(a,o):a(e)}catch(e){return o(e)}}return{beginAction:k,recordAction:A,notify:a,storeDomain:g,storeDomainForReceipt(e){let t=l.get(e?.undo?.historyEntryId);return t&&C(t)?t.handle:void 0},storeDomains:_,registerStoreDomain(e,t){let n=t.documentStore;if(n&&!c.has(n)){c.add(n);let r=r=>(r.historyEntryId&&!p&&O([{name:e,handle:t,store:n,id:r.historyEntryId}]),r),i=n.beginAction,a=n.recordAction;n.beginAction=(...e)=>{let t=i(...e);return{...t,commit:()=>r(t.commit())}},n.recordAction=(...e)=>{let t=a(...e);return t?.then?t.then(r):r(t)}}if(t.beginAction&&!s.has(t)&&(s.set(t,t.beginAction.bind(t)),t.beginAction=t=>k(e,t),t.stepHistory=e=>{let n=w(e);return n?.handle===t&&D(n,e)},t.load)){let e=t.load.bind(t);t.load=(...n)=>{p?.touches(t)&&p.cancel();let r=e(...n);return E(),r}}return o.set(e,t),()=>{p?.touches(t)&&p.cancel(),g(e)===t&&o.delete(e),E()}},nextStoreHistory(e){E();let t=w(e);return t&&T(t,e)?t.handle:void 0},historyEntry(e=!1){let t=w(e);return t&&T(t,e)?t.id:null},loadStoreDomains(e){let t=new Set;for(let[n,r]of o)r.load&&(r.load(r.sceneSlice?r.sceneSlice(e):e[n]),t.add(n));return t},forRender(e){return Object.create(this,{shared:{value:e}})},get undoClock(){return m},live:Object.freeze({get state(){return r.current},get characters(){return e.current},get scenes(){return t.current},get motion(){return n.current}}),publishLive(e){r.current=e},patchLive(e){Object.assign(r.current,e)},patchTimeline(e){Object.assign(r.current.timeline,e)},publishCharacters(t){e.current=t},publishScenes(e){t.current=e},publishMotion(e){n.current=e},get bus(){return i()},ports:y,actionPorts:b,updatePorts(e){h=e;for(let t of Object.keys(e))t===`revision`?y[t]=e[t]:y[t]||(y[t]=(...e)=>h[t](...e))},updateActionPorts(e){Object.assign(b,e)}}}var b=.5,x=[-1,1,-2,2],S=.1,C=5,w=e=>typeof e==`number`&&Number.isFinite(e),T=e=>l(e)<=b*Math.max(Math.abs(e.limit),.01);function E(e,t){let n=/\buse\[(\d+)\] (\w+)/.exec(e),r=Number(n?.[1]),i=n&&t.use?.[r],a=n&&i?.skill===n[2]?s[i.skill]:null;if(!a?.tune)return[];let o=[];for(let e of[1,2])for(let[t,n]of Object.entries(a.tune)){let s=a.args[t]??{},c=i.args?.[t]??s.default;if(w(c))for(let a of x.filter(t=>Math.abs(t)===e)){let e=c+a*n,l=s.type===`integer`?Math.round(e):Math.round(e*1e4)/1e4;!(l>0)||l===c||o.push(i.args?[{op:i.args[t]===void 0?`add`:`replace`,path:`/use/${r}/args/${t}`,value:l}]:[{op:`add`,path:`/use/${r}/args`,value:{[t]:l}}])}}return o}function D(e,t,n){if(![`SPEED`,`ACC`,`POP`].includes(e.kind))return[];let r=/between keys\[(\d+)\] f(\d+) and keys\[(\d+)\] f(\d+)/.exec(t);if(!r)return[];let[i,a,o,s]=r.slice(1).map(Number),c=n.keys??[];if(c[i]?.f!==a||c[o]?.f!==s)return[];let l=Number.isInteger(n.frames)?n.frames-1:1/0,u=[];for(let e of[1,2])a-e>=0&&u.push([{op:`replace`,path:`/keys/${i}/f`,value:a-e}]),s+e<=l&&u.push([{op:`replace`,path:`/keys/${o}/f`,value:s+e}]);return u}var O=e=>Math.round(e*1e4)/1e4;function k(e,t,n){let r=e.keys??[],i=[],a=(e.use??[]).map((e,t)=>({u:e,i:t})).filter(({u:e})=>(e?.skill===`standIdle`||e?.skill===`walkTo`)&&e.f0<=t).sort((e,t)=>e.u.f0-t.u.f0).at(-1),o=r.map((e,t)=>({k:e,j:t})).filter(({k:e})=>Array.isArray(e?.set?.root)&&e.set.root.length===3&&w(e.f)&&e.f>(a?.u.f0??-1));if(o.some(({k:e})=>e.f<=t))for(let e of[0,2])for(let t of[-n,n])i.push(o.map(({k:n,j:r})=>({op:`replace`,path:`/keys/${r}/set/root`,value:n.set.root.map((n,r)=>r===e?O(n+t*.03):n)})));else if(a){let{u:e,i:t}=a,r=s[e.skill].place??{},o=e.args?.steps??8;for(let[a,c]of Object.entries(r)){if(a===`step`&&o<=2)continue;let r=e.args?.[a]??s[e.skill].args[a]?.default,l=n=>[e.args?{op:e.args[a]===void 0?`add`:`replace`,path:`/use/${t}/args/${a}`,value:n}:{op:`add`,path:`/use/${t}/args`,value:{[a]:n}}];if(Array.isArray(r))for(let e of[0,r.length-1])for(let t of[-n,n])i.push(l(r.map((n,r)=>r===e?O(n+t*c):n)));else if(w(r))for(let e of[-n,n])r+e*c>.05&&i.push(l(O(r+e*c)))}}let c=r.map((e,t)=>({f:e?.f,j:t})).filter(({j:e})=>w(r[e]?.set?.spine_pitch)&&w(r[e].f)).sort((e,t)=>e.f-t.f),l=[c.filter(e=>e.f<=t).at(-1),c.find(e=>e.f>t)].filter(Boolean).map(e=>e.j);for(let e of l.length?[n,-n]:[])i.push(l.map(t=>({op:`replace`,path:`/keys/${t}/set/spine_pitch`,value:r[t].set.spine_pitch+e*C})));return i}var A=[10,20,30,-10],j=12;function ee(e,t){let n=e.keys??[],r=Math.round(t),i=Number.isInteger(e.frames)?e.frames-1:1/0,a=n.filter(e=>w(e?.f)&&w(e?.set?.spine_pitch)).sort((e,t)=>e.f-t.f),o=a.filter(e=>e.f<r).at(-1),s=a.find(e=>e.f>r),c=o?.set.spine_pitch??0,l=n.findIndex(e=>e?.f===r&&e.set&&typeof e.set==`object`);return A.map(e=>{let t=c+e,a=[l>=0?{op:n[l].set.spine_pitch===void 0?`add`:`replace`,path:`/keys/${l}/set/spine_pitch`,value:t}:{op:`add`,path:`/keys/-`,value:{f:r,set:{spine_pitch:t}}}];return(!o||r-o.f>j)&&r-j>=0&&a.push({op:`add`,path:`/keys/-`,value:{f:r-j,set:{spine_pitch:c}}}),(!s||s.f-r>j)&&r+j<=i&&a.push({op:`add`,path:`/keys/-`,value:{f:r+j,set:{spine_pitch:s?.set.spine_pitch??c}}}),a})}function M(e,t){if(typeof e.cause!=`string`||e.kind===`WRIST`&&e.cause.startsWith(`fix.self`))return[];if(e.kind===`WRIST`&&w(e.worstFrame))return[...ee(t,e.worstFrame),...[1,2].flatMap(n=>k(t,e.worstFrame,n)).filter(e=>e.every(e=>e.path.endsWith(`/spine_pitch`)))];let n=!e.patch&&T(e)?[...E(e.cause,t),...D(e,e.cause,t)]:[];return e.kind!==`GOAL`||!w(e.worstFrame)||l(e)>S?n:[...n,...k(t,e.worstFrame,1),...k(t,e.worstFrame,2)]}var N=3,P=2,F=2e4,te=4,I=e=>e?.qa?.groups??[],L=e=>I(e).reduce((e,t)=>e+(t.severity??0),0),R=e=>(e?.qa?.goals??[]).filter(e=>!e.ok).length,z=(e,t)=>I(e).find(e=>c(e)===t),B=(e,t)=>a(e?.qa,t?.qa).better,V=/^(hand|farm|uarm)_[lr]\b|^(Left|Right)(Arm|ForeArm|Hand)/,H=e=>e.kind===`REACH`&&/^arm_miss_[lr]$/.test(e.subject)||[`WRIST`,`ELBOW`].includes(e.kind)||[`BODY`,`FACE`,`COLLIDE`,`POP`,`ACC`,`SPEED`,`FLIP`].includes(e.kind)&&V.test(e.subject),U=e=>e.some(e=>/^\/use\/\d+\/args(\/(at|step|firstStep|to))?$/.test(e.path)&&(!e.path.endsWith(`/args`)||[`at`,`step`,`firstStep`,`to`].some(t=>e.value?.[t]!==void 0))||/^\/keys\/\d+\/set\/root$/.test(e.path)||e.path===`/keys/-`&&e.value?.set?.root!==void 0),W=`the body moved: no change that keeps it in place fixed this arm's failure`;function G(e,t,n){let r=Math.min(8,Math.max(1,Math.round(Number(t?.rounds??4))||4)),i=performance.now(),a=()=>performance.now()-i>=(t?.limitMs>0?t.limitMs:F),o=e,s=n(e),l=1,u=0,d=0,f=new Set,m=[],h=e=>{try{let t=p(o,e);return l+=1,{next:t,r:n(t)}}catch{return u+=1,null}},g=e=>{let t=[];for(let n of(e.candidates??[e.patch]).slice(0,te)){if(t.length&&a())break;let e=h(n);if(e&&(t.push({...e,patch:n}),L(e.r)===0&&!R(e.r)&&B(e.r,s)))break}t.sort((e,t)=>L(e.r)-L(t.r));let n=t.find(e=>B(e.r,s))??t[0]??null;return u+=t.filter(e=>e!==n).length,n},_=(e,t,n,{next:r,r:i})=>{let a=H(e)&&U(n);m.push({kind:e.kind,subject:e.subject,patch:n,severity:[e.severity,z(i,t)?.severity??0],...a?{movedBody:W}:{}}),o=r,s=i},v=(e,t)=>{let n=null;for(let e of t){if(a())break;let t=h(e);if(t&&(B(t.r,n?.r??s)?(n&&(u+=1),n={...t,patch:e}):u+=1,n&&L(n.r)===0&&!R(n.r)))break}return n&&_(e,c(e),n.patch,n),!!n},y=e=>{let t=M(e,o);return H(e)?v(e,t.filter(e=>!U(e)))||v(e,t.filter(U)):v(e,t)};for(;d<r&&!a();){let e=I(s).filter(e=>e.patch&&!f.has(JSON.stringify(e.patch))).slice(0,N).map(c),t=I(s).filter(e=>M(e,o).length).slice(0,P).map(c);if(!e.length&&!t.length)break;d+=1;let n=0,r=[];for(let t of e){let e=z(s,t);if(!e?.patch||a())continue;if(H(e)&&U(e.patch)){r.push(t);continue}let i=g(e);i&&B(i.r,s)?(_(e,t,i.patch,i),n+=1):(f.add(JSON.stringify(e.patch)),i&&(u+=1))}for(let e of n?[]:t){let t=z(s,e);if(t&&!a()&&y(t)){n+=1;break}}for(let e of n?[]:r){let t=z(s,e);if(!t?.patch||a())continue;let r=g(t);if(r&&B(r.r,s)){_(t,e,r.patch,r),n+=1;break}f.add(JSON.stringify(t.patch)),r&&(u+=1)}if(!n)break}return{spec:o,result:s,repair:{rounds:d,compiles:l,applied:m,rejected:u}}}var K=2,q=e=>Math.round(e*100)/100;function ne(e,n,r){let i=0;for(let o of n?.groups??[]){if(!o.patch)continue;if(i>=K){delete o.patch;continue}i+=1;let s=c(o),l;try{l=r(p(e,o.patch))}catch(e){l={error:String(e?.message??e).slice(0,160)}}let u=o.patch.map(e=>`${e.op} ${e.path}`).join(`, `),d=o.patch;if(delete o.patch,l?.error||!l?.groups){o.patchTried=`${u}: does not compile (${l?.error??`no QA`})`;continue}let f=[q(t(n,s)),q(t(l,s))],m=a(l,n);if(f[1]<f[0]&&m.better){o.patch=d,o.patchChecked={severity:f,total:m.sev,problems:m.problems};continue}let h=f[1]<f[0]?m.why:`this group ${f[0]} -> ${f[1]}`;o.patchTried=`${u}: compiled, did not help (${h}${h.startsWith(`problems`)?``:`; problems ${m.problems[0]} -> ${m.problems[1]}`})`}return n}var J=24,Y=(e,t)=>{throw Object.assign(Error(t),{code:e})};function re(e){try{return e()}catch(e){throw/^MOTION_SPEC_INVALID/.test(e.message)&&Y(`INVALID_ARGUMENT`,e.message.replace(/^MOTION_SPEC_INVALID:\s*/,``)),e}}function ie({model:t,scene:a,spec:s,probes:c,checks:l,lenient:u,repair:d,bake:f}){let p=o(t),h={...l?{checks:l}:{},...u?{lenient:!0}:{}},g=t=>{let{spec:n,probes:r}=e(t,c);n?.fps!==void 0&&n.fps!==J&&Y(`INVALID_ARGUMENT`,`spec.fps must be ${J}, the timeline rate.`);let i={fps:J,...n},o=re(()=>m(i,{sk:p,scene:a},{...h,probes:r}));return{...o,stored:o.spec===i?n:o.spec}},_=[],v=d&&!u?i(s,{sk:p,scene:a},_):s,y=new Map,b=e=>{let t=g(e);return y.set(JSON.stringify(e),t.qa),t},x=performance.now(),S=d?G(v,d,b):{spec:s,result:b(s)};if(d)ne(S.spec,S.result.qa,e=>y.get(JSON.stringify(e))??b(e).qa);else for(let e of S.result.qa?.groups??[])delete e.patch;let C=S.result,w=S.spec?.label??null,T=S.repair?{...C.ms,repair:Math.round(performance.now()-x)}:C.ms,E=f?n(p,C.out,{position:f.position,yaw:f.yaw},{spec:C.stored,prompt:(`prompt`in f?f.prompt:w)??``}):void 0,D=E&&r(a,[C.expanded,C.stored],C.out);return D&&(E.people=D),{stored:C.stored,qa:C.qa,observations:C.observations,used:C.used,fixed:C.fixed,search:C.search,timeline:C.timeline,...C.probes?{probes:C.probes}:{},...C.notes||_.length?{notes:[..._,...C.notes??[]]}:{},ms:T,frameCount:C.out.frameCount,label:w,...S.repair?{repair:S.repair}:{},...E?{take:E}:{}}}var ae=2;function X(e){throw e?.code&&!(e instanceof u)?new u(e.code,e.message):e instanceof Error?e:Object.assign(Error(e?.message??String(e)),{name:e?.name??`Error`})}var Z=e=>{try{return ie(e)}catch(e){return X(e)}};function oe(){return typeof Worker==`function`?new Worker(new URL(`/assets/compile-worker-D1pl6G7x.js`,``+import.meta.url),{type:`module`,name:`motion-compile`}):null}var Q=new Set,$={running:[],waiting:[]},se=e=>{$=e;for(let e of Q)e($)},ce=()=>$;function le(e){return Q.add(e),()=>Q.delete(e)}function ue({spawn:e=oe,size:t=ae}={}){let n=!1,r=null,i=0,a=[],o=[],s=()=>se({running:a.filter(e=>e.job).map(e=>e.job.meta),waiting:o.map(e=>e.meta)}),c=e=>{n=!0,r??=`The motion compile worker stopped (${e}); compiling on the main thread, which is slower and blocks the editor while it runs.`;let t=[...a.flatMap(e=>e.job?[e.job]:[]),...o.splice(0)];for(let e of a.splice(0))e.worker?.terminate?.();for(let{job:e,resolve:n,reject:r}of t)try{n(Z(e))}catch(e){r(e)}s()},l=()=>{let t;try{t=e()}catch(e){return c(e?.message??String(e)),null}if(!t)return n=!0,null;let r={worker:t,job:null};return t.onmessage=({data:{id:e,value:t,error:n}})=>{let i=r.job;if(!(!i||i.id!==e)){if(r.job=null,n)try{X(n)}catch(e){i.reject(e)}else i.resolve(t);u()}},t.onerror=e=>{e?.preventDefault?.(),c(e?.message||`worker error`)},t.onmessageerror=()=>c(`an answer could not be read`),a.push(r),r},u=()=>{for(;!n&&o.length;){let e=a.find(e=>!e.job)??(a.length<t?l():null);if(!e)break;e.job=o.shift();try{e.worker.postMessage({id:e.job.id,job:e.job.job})}catch(e){c(e?.message??String(e));return}}if(n)for(let e of o.splice(0))try{e.resolve(Z(e.job))}catch(t){e.reject(t)}s()};return{run(e,t={}){return n||!a.length&&!l()?Z(e):new Promise((n,r)=>{o.push({id:++i,job:e,meta:t,resolve:n,reject:r}),u()})},takeWarning(){let e=r;return e&&(r=``),e||null}}}export{y as a,g as i,ue as n,_ as o,le as r,ce as t};