cozyclay 1.10.0 → 2.0.2

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 (275) hide show
  1. package/CHANGELOG.md +193 -0
  2. package/bin/agent/agent-routes.mjs +82 -72
  3. package/bin/agent/agent-runner.mjs +10 -3
  4. package/bin/agent/motion-runtime.mjs +32 -260
  5. package/bin/agent/providers.mjs +46 -3
  6. package/bin/agent/session-store.mjs +41 -5
  7. package/bin/agent/studio-prompt.mjs +1 -1
  8. package/bin/agent/studio-tools.mjs +48 -11
  9. package/bin/codex-auth.mjs +2 -1
  10. package/bin/cozyclay.mjs +38 -11
  11. package/bin/live/cli.mjs +22 -3
  12. package/bin/mcp-runtime.mjs +45 -20
  13. package/bin/telemetry-state.mjs +5 -2
  14. package/bin/update-check.mjs +15 -0
  15. package/dist/app/index.html +6 -6
  16. package/dist/assets/analytics-MVZOEW8O.js +1 -0
  17. package/dist/assets/app-BxBLC6GT.js +4876 -0
  18. package/dist/assets/app-CJdxvnrl.css +1 -0
  19. package/dist/assets/{demo-B-eg1CT8.js → demo-ByeYp-dY.js} +1 -1
  20. package/dist/assets/{first-shot-handoff-CGgnvNu8.js → first-shot-handoff-DgT28ZiV.js} +1 -1
  21. package/dist/assets/{landing-IbRp3FnQ.js → landing-BaXkpFip.js} +1 -1
  22. package/dist/assets/shot-prompt-CbqWcWYi.css +1 -0
  23. package/dist/assets/shot-prompt-hN0j_O-p.js +17 -0
  24. package/dist/assets/{ticket-BgIzOBOf.js → ticket-BcmsnHn5.js} +1 -1
  25. package/dist/assets/workflow-B5XZwVfe.js +179 -0
  26. package/dist/assets/workflow-DRdwoDBT.css +1 -0
  27. package/dist/cozyclay-package.json +1 -1
  28. package/dist/fonts/IBM-Plex-Sans-OFL.txt +92 -0
  29. package/dist/fonts/JetBrains-Mono-OFL.txt +93 -0
  30. package/dist/fonts/README.md +13 -9
  31. package/dist/fonts/ibm-plex-sans-400-latin.woff2 +0 -0
  32. package/dist/fonts/ibm-plex-sans-500-latin.woff2 +0 -0
  33. package/dist/fonts/ibm-plex-sans-600-latin.woff2 +0 -0
  34. package/dist/fonts/jetbrains-mono-400-latin.woff2 +0 -0
  35. package/dist/fonts/jetbrains-mono-500-latin.woff2 +0 -0
  36. package/dist/index.html +7 -7
  37. package/dist/privacy/index.html +13 -8
  38. package/dist/sitemap.xml +2 -2
  39. package/dist/workflow/index.html +5 -5
  40. package/mcp/live-hub.mjs +35 -93
  41. package/mcp/mesh-file.mjs +48 -0
  42. package/mcp/server.mjs +6 -77
  43. package/mcp/tool-handlers.mjs +219 -376
  44. package/package.json +2 -1
  45. package/src/App.jsx +1275 -9086
  46. package/src/analytics.js +393 -9
  47. package/src/app-context.js +211 -0
  48. package/src/app-stage.jsx +25 -24
  49. package/src/ardy/auto-fix-panel.css +108 -0
  50. package/src/ardy/fix-collisions.js +10 -66
  51. package/src/ardy/ik-drag.js +101 -0
  52. package/src/ardy/ik-key-json.js +43 -0
  53. package/src/ardy/ik.js +97 -67
  54. package/src/ardy/physics-panel.css +2 -0
  55. package/src/ardy/physics-panel.jsx +17 -5
  56. package/src/ardy/platform-fit-panel.css +64 -0
  57. package/src/ardy/platform-fit-panel.jsx +40 -0
  58. package/src/ardy/platform-fit.js +326 -0
  59. package/src/ardy/playback.js +166 -20
  60. package/src/ardy/range-pin.js +299 -0
  61. package/src/ardy/timeline-coordinates.js +26 -0
  62. package/src/ardy/timeline.css +1214 -0
  63. package/src/ardy/timeline.jsx +152 -41
  64. package/src/ardy/waypoints.js +3 -3
  65. package/src/asset-pane.css +462 -0
  66. package/src/asset-pane.jsx +461 -232
  67. package/src/camera-tutorial.jsx +38 -18
  68. package/src/command-bus.js +349 -0
  69. package/src/commands/ai.js +31 -0
  70. package/src/commands/cast.js +140 -0
  71. package/src/commands/elements/character.js +13 -0
  72. package/src/commands/elements/motion.js +14 -0
  73. package/src/commands/elements/object.js +22 -0
  74. package/src/commands/elements/scene.js +16 -0
  75. package/src/commands/elements/shot.js +9 -0
  76. package/src/commands/elements/stage.js +11 -0
  77. package/src/commands/elements.js +155 -0
  78. package/src/commands/export.js +20 -0
  79. package/src/commands/index.js +40 -0
  80. package/src/commands/motion.js +231 -0
  81. package/src/commands/objects.js +174 -0
  82. package/src/commands/project.js +53 -0
  83. package/src/commands/scene.js +81 -0
  84. package/src/commands/shared.js +19 -0
  85. package/src/commands/shot.js +103 -0
  86. package/src/commands/stage.js +17 -0
  87. package/src/commands/view.js +42 -0
  88. package/src/document-store.js +144 -0
  89. package/src/domains/cast.js +1007 -0
  90. package/src/domains/motion.js +3219 -0
  91. package/src/domains/objects.js +932 -0
  92. package/src/domains/scenes.js +823 -0
  93. package/src/domains/shots.js +404 -0
  94. package/src/domains/stage.js +93 -0
  95. package/src/dualview.jsx +113 -57
  96. package/src/facing-marks.js +3 -0
  97. package/src/first-success-guide.jsx +14 -14
  98. package/src/grid-view.js +18 -5
  99. package/src/hierarchy-panel.css +386 -0
  100. package/src/hierarchy-panel.jsx +88 -19
  101. package/src/{fal-motion-client.js → i2v-motion-client.js} +13 -13
  102. package/src/i2v-motion-studio.jsx +180 -0
  103. package/src/ik-camera.js +3 -0
  104. package/src/main.jsx +6 -0
  105. package/src/motion/generation.js +105 -0
  106. package/src/motion-readiness-ui.jsx +4 -4
  107. package/src/motion-readiness.js +11 -0
  108. package/src/motion-trail.js +366 -9
  109. package/src/object-gizmo.jsx +7 -1
  110. package/src/panels/CameraPanel.jsx +60 -0
  111. package/src/panels/CharacterTransformPanel.jsx +48 -0
  112. package/src/panels/EnvironmentPanel.jsx +40 -0
  113. package/src/panels/Foldout.jsx +32 -0
  114. package/src/panels/LightPanel.jsx +24 -0
  115. package/src/panels/ObjectTransformPanel.jsx +554 -0
  116. package/src/panels/PosePanel.jsx +97 -0
  117. package/src/panels/ProjectPanel.jsx +33 -0
  118. package/src/panels/PromptBlocksPanel.jsx +442 -0
  119. package/src/panels/PropsPanel.jsx +70 -0
  120. package/src/panels/ReferenceImageField.jsx +91 -0
  121. package/src/panels/RigControlPanel.jsx +78 -0
  122. package/src/panels/RigPanel.jsx +37 -0
  123. package/src/panels/SubjectBox.jsx +47 -0
  124. package/src/panels/SubjectsPanel.jsx +39 -0
  125. package/src/panels/VideoCapturePanel.jsx +180 -0
  126. package/src/panels/details.css +1171 -0
  127. package/src/panels/motion.css +197 -0
  128. package/src/panels/pose.css +39 -0
  129. package/src/planview.jsx +60 -31
  130. package/src/posestudio.jsx +59 -4
  131. package/src/project-browser.css +1073 -0
  132. package/src/project-browser.jsx +288 -123
  133. package/src/range-pin-object-transform.js +19 -0
  134. package/src/range-pin-panel.css +518 -0
  135. package/src/range-pin-panel.jsx +344 -0
  136. package/src/result-modal.jsx +5 -5
  137. package/src/room.jsx +79 -51
  138. package/src/scenes.js +9 -8
  139. package/src/semantic-edit.js +2 -0
  140. package/src/settings-menu.jsx +39 -105
  141. package/src/shell/BottomDock.jsx +450 -0
  142. package/src/shell/DetailsSlot.jsx +513 -0
  143. package/src/shell/LibrarySlot.jsx +86 -0
  144. package/src/shell/MenuBar.jsx +601 -0
  145. package/src/shell/OutlinerSlot.jsx +50 -0
  146. package/src/shell/PreferencesDialog.jsx +538 -0
  147. package/src/shell/PreferencesSlot.jsx +40 -0
  148. package/src/shell/StatusBar.jsx +125 -0
  149. package/src/shell/StudioShell.jsx +92 -0
  150. package/src/shell/TopBar.jsx +129 -0
  151. package/src/shell/ViewportToolbar.jsx +656 -0
  152. package/src/shell/agent-glass.css +296 -0
  153. package/src/shell/dock.css +93 -0
  154. package/src/shell/glass-regions.css +985 -0
  155. package/src/shell/glass.css +687 -0
  156. package/src/shell/log-store.js +52 -0
  157. package/src/shell/mode.css +9 -0
  158. package/src/shell/preferences.css +651 -0
  159. package/src/shell/shell.css +282 -0
  160. package/src/shell/studio-shell-context.js +19 -0
  161. package/src/shell/topbar.css +435 -0
  162. package/src/shell/viewport.css +451 -0
  163. package/src/store/authored-intent.js +22 -0
  164. package/src/store/runtime-adapters.js +92 -0
  165. package/src/store/scene-stage.js +21 -0
  166. package/src/store/use-document-store.js +14 -0
  167. package/src/studio-actions.js +210 -0
  168. package/src/studio-agent-commands.js +38 -268
  169. package/src/studio-agent-context.js +38 -9
  170. package/src/studio-agent-motion.js +122 -378
  171. package/src/studio-agent-protocol.js +66 -30
  172. package/src/studio-app-binding.js +379 -0
  173. package/src/studio-contact-sheet.js +73 -0
  174. package/src/studio-elements.js +58 -51
  175. package/src/styles/themes.css +200 -0
  176. package/src/styles/tokens.css +69 -0
  177. package/src/styles.css +456 -1748
  178. package/src/theme.js +44 -0
  179. package/src/timeline-extent.js +16 -0
  180. package/src/timeline-fps.js +13 -0
  181. package/src/trail-key-conflicts.js +39 -0
  182. package/src/trail-pick.js +59 -0
  183. package/src/ui.jsx +8 -8
  184. package/src/use-case-question.jsx +66 -0
  185. package/src/workflow/AgentPanel.jsx +86 -71
  186. package/src/workflow/agent-client.js +12 -2
  187. package/src/workflow/agent-panel.css +34 -32
  188. package/src/workflow/cozy-scene-node.css +2 -0
  189. package/src/workflow/workflow.css +2 -0
  190. package/tools/ardy/bridge.mjs +164 -146
  191. package/tools/ardy/visual-qa.mjs +5 -5
  192. package/tools/bench/EXP3.md +61 -0
  193. package/tools/bench/cclay_bench_extract_incam.py +125 -0
  194. package/tools/bench/cclay_bench_extract_obs.py +204 -0
  195. package/tools/bench/cclay_bench_runner.py +42 -0
  196. package/tools/bench/cube-contact.mjs +162 -0
  197. package/tools/bench/exp3.mjs +152 -0
  198. package/tools/bench/extract-bench-lib.mjs +216 -0
  199. package/tools/bench/extract-bench.mjs +302 -0
  200. package/tools/bench/fal-generate.mjs +88 -0
  201. package/tools/bench/fit/README.md +189 -0
  202. package/tools/bench/fit/camera.mjs +59 -0
  203. package/tools/bench/fit/contact.mjs +419 -0
  204. package/tools/bench/fit/footlock.mjs +234 -0
  205. package/tools/bench/fit/motion.mjs +85 -0
  206. package/tools/bench/fit/pin.mjs +27 -0
  207. package/tools/bench/fit/remote.mjs +105 -0
  208. package/tools/bench/fit-bench.mjs +126 -0
  209. package/tools/bench/fit-sanity.mjs +45 -0
  210. package/tools/bench/metrics.mjs +313 -0
  211. package/tools/bench/obs/depth.mjs +258 -0
  212. package/tools/bench/obs/extrinsics.mjs +175 -0
  213. package/tools/bench/obs/fit_mannequin_betas.py +340 -0
  214. package/tools/bench/obs/ground.mjs +294 -0
  215. package/tools/bench/obs/heading.mjs +151 -0
  216. package/tools/bench/obs/ladder.mjs +555 -0
  217. package/tools/bench/obs/mannequin-betas.json +124 -0
  218. package/tools/bench/obs/remote.mjs +83 -0
  219. package/tools/bench/obs/rest_joints.py +52 -0
  220. package/tools/bench/obs/ybot-targets.mjs +49 -0
  221. package/tools/bench/obs-bench.mjs +520 -0
  222. package/tools/bench/score.mjs +343 -0
  223. package/tools/bench/summarize.mjs +86 -0
  224. package/tools/dev/pages/privacy.html +13 -8
  225. package/tools/gt-render/browser.mjs +159 -0
  226. package/tools/gt-render/camera-math.mjs +276 -0
  227. package/tools/gt-render/page.mjs +267 -0
  228. package/tools/gt-render/render.mjs +514 -0
  229. package/tools/gt-render/scene-box.mjs +31 -0
  230. package/tools/gt-render/take-transform.mjs +87 -0
  231. package/tools/qa/css-rule-usage.mjs +283 -0
  232. package/tools/qa/studio-control-count.mjs +70 -32
  233. package/tools/run-tests.mjs +60 -3
  234. package/tools/track/DESIGN.md +513 -0
  235. package/tools/track/backfill-provenance.mjs +116 -0
  236. package/tools/track/budget.mjs +8 -0
  237. package/tools/track/check-rig.mjs +209 -0
  238. package/tools/track/diagnostics.schema.json +60 -0
  239. package/tools/track/export-rig.mjs +256 -0
  240. package/tools/track/fallback.mjs +7 -0
  241. package/tools/track/fk-parity-fixture.mjs +161 -0
  242. package/tools/track/gate.mjs +349 -0
  243. package/tools/track/masks.mjs +318 -0
  244. package/tools/track/metrics.mjs +201 -0
  245. package/tools/track/publish-obs.mjs +108 -0
  246. package/tools/track/py/check_env.py +61 -0
  247. package/tools/track/py/eval_lr.py +229 -0
  248. package/tools/track/py/lr_viterbi.py +294 -0
  249. package/tools/track/py/masks.py +405 -0
  250. package/tools/track/py/objective.py +382 -0
  251. package/tools/track/py/rig.py +508 -0
  252. package/tools/track/py/scene.py +326 -0
  253. package/tools/track/py/test_joint_indices.py +123 -0
  254. package/tools/track/py/test_lr_viterbi.py +195 -0
  255. package/tools/track/py/test_masks.py +229 -0
  256. package/tools/track/py/test_rig.py +288 -0
  257. package/tools/track/py/test_scene.py +354 -0
  258. package/tools/track/py/test_track.py +328 -0
  259. package/tools/track/py/track.py +411 -0
  260. package/tools/track/remote.mjs +140 -0
  261. package/tools/track/rig-dump.mjs +227 -0
  262. package/tools/track/run-box-tests.mjs +14 -0
  263. package/tools/track/run-box.mjs +168 -0
  264. package/tools/track/setup-box.sh +59 -0
  265. package/tools/track/study-2d.mjs +728 -0
  266. package/dist/assets/analytics-B1hnH66c.js +0 -1
  267. package/dist/assets/app-Cu1cexZR.css +0 -1
  268. package/dist/assets/app-Dxdh8kds.js +0 -4861
  269. package/dist/assets/shot-prompt-C_g2BHVc.css +0 -1
  270. package/dist/assets/shot-prompt-HVJRP4Gr.js +0 -17
  271. package/dist/assets/workflow-CJd-PDtV.js +0 -179
  272. package/dist/assets/workflow-DsudxKHF.css +0 -1
  273. package/src/fal-motion-studio.jsx +0 -180
  274. package/src/scene-history.js +0 -129
  275. package/tools/ardy/__pycache__/cclay_gvhmr_worker.cpython-313.pyc +0 -0
@@ -1 +1 @@
1
- import{g as e,u as t}from"./analytics-B1hnH66c.js";import{t as n}from"./config-Bx7pYsD9.js";t();var r=3e4,i=`Usually a few minutes while the generator is online.`,a=null,o=null,s=!1,c=null,l=!1;function u(e){return typeof document>`u`?null:document.getElementById(e)}function d(e){if(typeof e!=`string`)return null;let t=e.trim();return/^[A-Za-z0-9][A-Za-z0-9._~-]{0,199}$/u.test(t)?t:null}function f(e){if(typeof e!=`string`)return null;let t=e.startsWith(`#`)?e.slice(1):e;try{return d(new URLSearchParams(t).get(`t`))}catch{return null}}function p(){try{return new URL(globalThis.location.href)}catch{return null}}function m(){let e=p();if(!e)return null;if(e.searchParams.has(`t`)){let t=d(e.searchParams.get(`t`));e.searchParams.delete(`t`);let n=e.searchParams.toString(),r=`${e.pathname}${n?`?${n}`:``}${t?`#t=${encodeURIComponent(t)}`:``}`;try{globalThis.history?.replaceState(null,``,r)}catch{}return t}return f(e.hash)}function h(e,t){let n=u(e);return n&&(n.textContent=t==null?``:String(t)),n}function g(e,t){let n=u(e);return n&&n.classList.toggle(`is-hidden`,!t),n}function _(e){h(`ticket-message`,e)}function v(e){let t=u(`ticket-prompt`);t&&(t.textContent=typeof e==`string`?e:``,t.hidden=!t.textContent)}function y(){g(`open-result`,!1),g(`copy-link`,!1),g(`ticket-result`,!1)}function b(e){h(`ticket-state-title`,`Queued`);let t=Number(e?.position);h(`ticket-position`,Number.isInteger(t)&&t>0?`You are #${t} in line`:`You are in line`);let n=Number(e?.etaMinutes),r=e?.etaMinutes!==null&&e?.etaMinutes!==void 0&&Number.isFinite(n)&&n>=0,a=typeof e?.etaText==`string`?e.etaText.trim():``;r?h(`ticket-eta`,a||`About ${n} minute${n===1?``:`s`}`):h(`ticket-eta`,/\b\d+\s+minutes?\b/iu.test(a)||/^Usually within a few hours\s+(?:—|-)\s+at most 48 hours\.$/iu.test(a)?i:a||i),y(),g(`copy-link`,!0),_(``)}function x(e=null){h(`ticket-state-title`,`Running`),h(`ticket-position`,`Your motion is being prepared.`),h(`ticket-eta`,`The generator is working on it now.`),y(),g(`copy-link`,!0),_(``)}function S(t){l||(l=!0,e(`hosted:result_opened`)),h(`ticket-state-title`,`Ready`),h(`ticket-position`,`Your motion is ready.`),h(`ticket-eta`,`Open it in CozyClay to play it back.`),y(),v(t?.promptText);let n=typeof t?.resultUrl==`string`?t.resultUrl:``,r=u(`open-result`);r&&n&&(r.href=`/app/?motion=${encodeURIComponent(n)}`,g(`open-result`,!0)),g(`copy-link`,!0),g(`ticket-result`,!0),_(``)}function C(e=null){h(`ticket-state-title`,`Could not complete`),h(`ticket-position`,`This motion failed.`),h(`ticket-eta`,`No charge was made. You can create another motion.`),y(),_(``)}function w(e=null){h(`ticket-state-title`,`Ticket unavailable`),h(`ticket-position`,`This ticket has been revoked.`),h(`ticket-eta`,`The result link is no longer active.`),y(),_(``)}function T(e=null){h(`ticket-state-title`,`Ticket expired`),h(`ticket-position`,`This link has expired.`),h(`ticket-eta`,`Results are kept for 30 days.`),y(),_(``)}function E(){h(`ticket-state-title`,`Ticket not found`),h(`ticket-position`,`We could not find that ticket.`),h(`ticket-eta`,`Check the link and try again.`),v(``),y(),_(``)}function D(e){switch(v(e?.promptText),e?.status){case`queued`:b(e);break;case`running`:x(e);break;case`done`:S(e);break;case`failed`:C(e);break;case`revoked`:case`canceled`:w(e);break;default:h(`ticket-state-title`,`Ticket unavailable`),h(`ticket-position`,`We could not read this ticket.`),h(`ticket-eta`,`Please return to the composer and try again.`),y(),_(``)}}function O(e){return e===`done`||e===`failed`||e===`revoked`||e===`canceled`}function k(){o!==null&&(globalThis.clearInterval?.(o),o=null)}function A(){o===null&&(o=globalThis.setInterval(N,r))}async function j(e){try{return await e.json()}catch{return{}}}async function M(e){return fetch(`${n}/jobs/${encodeURIComponent(e)}`,{method:`GET`,credentials:`omit`,cache:`no-store`,headers:{Accept:`application/json`}})}async function N(){if(!a||s)return null;s=!0;try{let e=await M(a),t=await j(e);if(e.status===404||t.error===`not_found`)return E(),k(),t;if(e.status===410)return t.error===`expired`?T():w(),k(),t;if(!e.ok)throw Error(t.error||`poll_failed`);return c=t,D(t),O(t.status)?k():A(),t}catch{return c||(h(`ticket-state-title`,`Connection problem`),h(`ticket-position`,`We could not reach the queue.`),h(`ticket-eta`,`We will keep trying.`)),_(`The latest update did not arrive. We will try again shortly.`),A(),null}finally{s=!1}}async function P(){let e=globalThis.location?.href??``;if(e)try{if(globalThis.navigator?.clipboard?.writeText)await globalThis.navigator.clipboard.writeText(e);else{let t=document.createElement(`input`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.opacity=`0`,document.body.append(t),t.select(),document.execCommand(`copy`),t.remove()}_(`Share link copied.`)}catch{_(`Copy was not available. Copy the link from your address bar.`)}}function F(){typeof document<`u`&&document.visibilityState===`visible`&&N()}function I(){if(u(`copy-link`)?.addEventListener(`click`,P),u(`open-result`)?.addEventListener(`click`,()=>e(`hosted:opened_in_studio`)),a){let e=u(`report-link`);e&&(e.href=`mailto:hello@cozyclay.org?subject=${encodeURIComponent(`CozyClay ticket ${a}`)}`)}document.addEventListener(`visibilitychange`,F)}function L(){if(a=m(),I(),!a){E();return}N(),A()}typeof document<`u`&&(document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,L,{once:!0}):L());
1
+ import{b as e,d as t}from"./analytics-MVZOEW8O.js";import{t as n}from"./config-Bx7pYsD9.js";t();var r=3e4,i=`Usually a few minutes while the generator is online.`,a=null,o=null,s=!1,c=null,l=!1;function u(e){return typeof document>`u`?null:document.getElementById(e)}function d(e){if(typeof e!=`string`)return null;let t=e.trim();return/^[A-Za-z0-9][A-Za-z0-9._~-]{0,199}$/u.test(t)?t:null}function f(e){if(typeof e!=`string`)return null;let t=e.startsWith(`#`)?e.slice(1):e;try{return d(new URLSearchParams(t).get(`t`))}catch{return null}}function p(){try{return new URL(globalThis.location.href)}catch{return null}}function m(){let e=p();if(!e)return null;if(e.searchParams.has(`t`)){let t=d(e.searchParams.get(`t`));e.searchParams.delete(`t`);let n=e.searchParams.toString(),r=`${e.pathname}${n?`?${n}`:``}${t?`#t=${encodeURIComponent(t)}`:``}`;try{globalThis.history?.replaceState(null,``,r)}catch{}return t}return f(e.hash)}function h(e,t){let n=u(e);return n&&(n.textContent=t==null?``:String(t)),n}function g(e,t){let n=u(e);return n&&n.classList.toggle(`is-hidden`,!t),n}function _(e){h(`ticket-message`,e)}function v(e){let t=u(`ticket-prompt`);t&&(t.textContent=typeof e==`string`?e:``,t.hidden=!t.textContent)}function y(){g(`open-result`,!1),g(`copy-link`,!1),g(`ticket-result`,!1)}function b(e){h(`ticket-state-title`,`Queued`);let t=Number(e?.position);h(`ticket-position`,Number.isInteger(t)&&t>0?`You are #${t} in line`:`You are in line`);let n=Number(e?.etaMinutes),r=e?.etaMinutes!==null&&e?.etaMinutes!==void 0&&Number.isFinite(n)&&n>=0,a=typeof e?.etaText==`string`?e.etaText.trim():``;r?h(`ticket-eta`,a||`About ${n} minute${n===1?``:`s`}`):h(`ticket-eta`,/\b\d+\s+minutes?\b/iu.test(a)||/^Usually within a few hours\s+(?:—|-)\s+at most 48 hours\.$/iu.test(a)?i:a||i),y(),g(`copy-link`,!0),_(``)}function x(e=null){h(`ticket-state-title`,`Running`),h(`ticket-position`,`Your motion is being prepared.`),h(`ticket-eta`,`The generator is working on it now.`),y(),g(`copy-link`,!0),_(``)}function S(t){l||(l=!0,e(`hosted:result_opened`)),h(`ticket-state-title`,`Ready`),h(`ticket-position`,`Your motion is ready.`),h(`ticket-eta`,`Open it in CozyClay to play it back.`),y(),v(t?.promptText);let n=typeof t?.resultUrl==`string`?t.resultUrl:``,r=u(`open-result`);r&&n&&(r.href=`/app/?motion=${encodeURIComponent(n)}`,g(`open-result`,!0)),g(`copy-link`,!0),g(`ticket-result`,!0),_(``)}function C(e=null){h(`ticket-state-title`,`Could not complete`),h(`ticket-position`,`This motion failed.`),h(`ticket-eta`,`No charge was made. You can create another motion.`),y(),_(``)}function w(e=null){h(`ticket-state-title`,`Ticket unavailable`),h(`ticket-position`,`This ticket has been revoked.`),h(`ticket-eta`,`The result link is no longer active.`),y(),_(``)}function T(e=null){h(`ticket-state-title`,`Ticket expired`),h(`ticket-position`,`This link has expired.`),h(`ticket-eta`,`Results are kept for 30 days.`),y(),_(``)}function E(){h(`ticket-state-title`,`Ticket not found`),h(`ticket-position`,`We could not find that ticket.`),h(`ticket-eta`,`Check the link and try again.`),v(``),y(),_(``)}function D(e){switch(v(e?.promptText),e?.status){case`queued`:b(e);break;case`running`:x(e);break;case`done`:S(e);break;case`failed`:C(e);break;case`revoked`:case`canceled`:w(e);break;default:h(`ticket-state-title`,`Ticket unavailable`),h(`ticket-position`,`We could not read this ticket.`),h(`ticket-eta`,`Please return to the composer and try again.`),y(),_(``)}}function O(e){return e===`done`||e===`failed`||e===`revoked`||e===`canceled`}function k(){o!==null&&(globalThis.clearInterval?.(o),o=null)}function A(){o===null&&(o=globalThis.setInterval(N,r))}async function j(e){try{return await e.json()}catch{return{}}}async function M(e){return fetch(`${n}/jobs/${encodeURIComponent(e)}`,{method:`GET`,credentials:`omit`,cache:`no-store`,headers:{Accept:`application/json`}})}async function N(){if(!a||s)return null;s=!0;try{let e=await M(a),t=await j(e);if(e.status===404||t.error===`not_found`)return E(),k(),t;if(e.status===410)return t.error===`expired`?T():w(),k(),t;if(!e.ok)throw Error(t.error||`poll_failed`);return c=t,D(t),O(t.status)?k():A(),t}catch{return c||(h(`ticket-state-title`,`Connection problem`),h(`ticket-position`,`We could not reach the queue.`),h(`ticket-eta`,`We will keep trying.`)),_(`The latest update did not arrive. We will try again shortly.`),A(),null}finally{s=!1}}async function P(){let e=globalThis.location?.href??``;if(e)try{if(globalThis.navigator?.clipboard?.writeText)await globalThis.navigator.clipboard.writeText(e);else{let t=document.createElement(`input`);t.value=e,t.setAttribute(`readonly`,``),t.style.position=`fixed`,t.style.opacity=`0`,document.body.append(t),t.select(),document.execCommand(`copy`),t.remove()}_(`Share link copied.`)}catch{_(`Copy was not available. Copy the link from your address bar.`)}}function F(){typeof document<`u`&&document.visibilityState===`visible`&&N()}function I(){if(u(`copy-link`)?.addEventListener(`click`,P),u(`open-result`)?.addEventListener(`click`,()=>e(`hosted:opened_in_studio`)),a){let e=u(`report-link`);e&&(e.href=`mailto:hello@cozyclay.org?subject=${encodeURIComponent(`CozyClay ticket ${a}`)}`)}document.addEventListener(`visibilitychange`,F)}function L(){if(a=m(),I(),!a){E();return}N(),A()}typeof document<`u`&&(document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,L,{once:!0}):L());