agmon 0.2.0 → 0.2.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 (294) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/fallback-build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +8 -8
  5. package/.next/server/app/_global-error.html +1 -1
  6. package/.next/server/app/_global-error.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  11. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +15 -13
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +15 -13
  15. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +8 -6
  16. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  17. package/.next/server/app/api/media/route.js.nft.json +1 -1
  18. package/.next/server/app/api/reports/tokens/route.js.nft.json +1 -1
  19. package/.next/server/app/api/sessions/[id]/transcript/route.js +1 -1
  20. package/.next/server/app/api/sessions/[id]/transcript/route.js.nft.json +1 -1
  21. package/.next/server/app/api/traces/stream/route.js +1 -1
  22. package/.next/server/app/api/traces/stream/route.js.nft.json +1 -1
  23. package/.next/server/app/api/version/route.js.nft.json +1 -1
  24. package/.next/server/app/api/workspace/file-content/route.js.nft.json +1 -1
  25. package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
  26. package/.next/server/app/chat/page.js.nft.json +1 -1
  27. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/chat.html +1 -1
  29. package/.next/server/app/chat.rsc +20 -19
  30. package/.next/server/app/chat.segments/_full.segment.rsc +20 -19
  31. package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  32. package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +22 -20
  33. package/.next/server/app/index.html +1 -1
  34. package/.next/server/app/index.rsc +20 -18
  35. package/.next/server/app/index.segments/__PAGE__.segment.rsc +10 -9
  36. package/.next/server/app/index.segments/_full.segment.rsc +20 -18
  37. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  38. package/.next/server/app/page.js.nft.json +1 -1
  39. package/.next/server/app/page_client-reference-manifest.js +1 -1
  40. package/.next/server/app/reports/page.js.nft.json +1 -1
  41. package/.next/server/app/reports/page_client-reference-manifest.js +1 -1
  42. package/.next/server/app/reports.html +1 -1
  43. package/.next/server/app/reports.rsc +4 -4
  44. package/.next/server/app/reports.segments/_full.segment.rsc +4 -4
  45. package/.next/server/app/reports.segments/_tree.segment.rsc +2 -2
  46. package/.next/server/app/reports.segments/reports/__PAGE__.segment.rsc +6 -5
  47. package/.next/server/app/store/page.js.nft.json +1 -1
  48. package/.next/server/app/store/page_client-reference-manifest.js +1 -1
  49. package/.next/server/app/store.html +1 -1
  50. package/.next/server/app/store.rsc +5 -5
  51. package/.next/server/app/store.segments/_full.segment.rsc +5 -5
  52. package/.next/server/app/store.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/store.segments/store/__PAGE__.segment.rsc +7 -6
  54. package/.next/server/chunks/[root-of-the-server]__0dw97_pahi8uf._.js +3 -0
  55. package/.next/server/chunks/[root-of-the-server]__0dw97_pahi8uf._.js.map +1 -0
  56. package/.next/server/chunks/_0ao-_t4jkb46h._.js +2 -2
  57. package/.next/server/chunks/_0ao-_t4jkb46h._.js.map +1 -1
  58. package/.next/server/chunks/_1-8ipqazoyrrk._.js +1 -1
  59. package/.next/server/chunks/_1-8ipqazoyrrk._.js.map +1 -1
  60. package/.next/server/chunks/ssr/[root-of-the-server]__0i2rbwbkxbdog._.js +3 -0
  61. package/.next/server/chunks/ssr/[root-of-the-server]__0i2rbwbkxbdog._.js.map +1 -0
  62. package/.next/server/chunks/ssr/[root-of-the-server]__0qzscpxebh28_._.js +3 -0
  63. package/.next/server/chunks/ssr/[root-of-the-server]__0qzscpxebh28_._.js.map +1 -0
  64. package/.next/server/chunks/ssr/[root-of-the-server]__1jwplflwix8wi._.js +427 -0
  65. package/.next/server/chunks/ssr/[root-of-the-server]__1jwplflwix8wi._.js.map +1 -0
  66. package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js +1 -1
  67. package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js.map +1 -1
  68. package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js +427 -0
  69. package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js.map +1 -0
  70. package/.next/server/chunks/ssr/_0e3frtjrk-wi9._.js +3 -0
  71. package/.next/server/chunks/ssr/_0e3frtjrk-wi9._.js.map +1 -0
  72. package/.next/server/chunks/ssr/_0h29jdf4relbq._.js +3 -0
  73. package/.next/server/chunks/ssr/_0h29jdf4relbq._.js.map +1 -0
  74. package/.next/server/chunks/ssr/_0zel-n0h--cnl._.js +3 -0
  75. package/.next/server/chunks/ssr/_0zel-n0h--cnl._.js.map +1 -0
  76. package/.next/server/chunks/ssr/_1487-zi23c5eb._.js +1 -1
  77. package/.next/server/chunks/ssr/_1487-zi23c5eb._.js.map +1 -1
  78. package/.next/server/chunks/ssr/_1vgwoe-shb9z7._.js +3 -0
  79. package/.next/server/chunks/ssr/_1vgwoe-shb9z7._.js.map +1 -0
  80. package/.next/server/chunks/ssr/_1zm4m-s8k7oe3._.js +3 -0
  81. package/.next/server/chunks/ssr/_1zm4m-s8k7oe3._.js.map +1 -0
  82. package/.next/server/chunks/ssr/_202tntue-jj6s._.js +3 -0
  83. package/.next/server/chunks/ssr/_202tntue-jj6s._.js.map +1 -0
  84. package/.next/server/chunks/ssr/{node_modules_1wlwrgnt65zus._.js → node_modules_00ebs67b4u61w._.js} +1 -1
  85. package/.next/server/chunks/ssr/{node_modules_0f773uqgzj7y7._.js → node_modules_01avo0bde3tpo._.js} +1 -1
  86. package/.next/server/chunks/ssr/{node_modules_0z3elum1675ve._.js → node_modules_01l0208e5kqic._.js} +1 -1
  87. package/.next/server/chunks/ssr/{node_modules_1c8i3jrmo4393._.js → node_modules_033x29yqle_sj._.js} +1 -1
  88. package/.next/server/chunks/ssr/{node_modules_1kr1c-ncf8q9t._.js → node_modules_03wbg__aslvui._.js} +1 -1
  89. package/.next/server/chunks/ssr/{node_modules_02jwra-d9iqim._.js → node_modules_06mgkab1v5iox._.js} +2 -2
  90. package/.next/server/chunks/ssr/{node_modules_0z7rdbaf13024._.js → node_modules_08-bqkrz7sh0l._.js} +1 -1
  91. package/.next/server/chunks/ssr/{node_modules_13nsmuhey_ti_._.js → node_modules_089w9jm7s2qa3._.js} +2 -2
  92. package/.next/server/chunks/ssr/{node_modules_0m3ihe65818y_._.js → node_modules_08q6a-f2itxyo._.js} +1 -1
  93. package/.next/server/chunks/ssr/{node_modules_0__m9_odts7_e._.js → node_modules_0cy47-s63xjzh._.js} +2 -2
  94. package/.next/server/chunks/ssr/{node_modules_0b8ndnuql44z1._.js → node_modules_0czh0jcnsm5e6._.js} +2 -2
  95. package/.next/server/chunks/ssr/{node_modules_0fs8mckuwk2tj._.js → node_modules_0e6qoh__e4a69._.js} +1 -1
  96. package/.next/server/chunks/ssr/{node_modules_05w7qhtrzvnk6._.js → node_modules_0fv321j1nslkb._.js} +1 -1
  97. package/.next/server/chunks/ssr/{node_modules_061uaylfjwqk7._.js → node_modules_0g-wb7h-hsdwc._.js} +1 -1
  98. package/.next/server/chunks/ssr/{node_modules_1ll-58c1c-qab._.js → node_modules_0hb0q0epwvp--._.js} +1 -1
  99. package/.next/server/chunks/ssr/{node_modules_0dq0dsblt-q0g._.js → node_modules_0l-y0kqtu_r3o._.js} +1 -1
  100. package/.next/server/chunks/ssr/{node_modules_1zs2nou5uogby._.js → node_modules_0l814qpw677vm._.js} +1 -1
  101. package/.next/server/chunks/ssr/{node_modules_1xyxigbqzb8vs._.js → node_modules_0o63z1gd17rhb._.js} +1 -1
  102. package/.next/server/chunks/ssr/{node_modules_1-sz_-qddwilq._.js → node_modules_0oz_zzlh8exwx._.js} +1 -1
  103. package/.next/server/chunks/ssr/{node_modules_0oukyh0iq21ow._.js → node_modules_0so2agzqd9p8l._.js} +2 -2
  104. package/.next/server/chunks/ssr/{node_modules_12qw2ucebdvol._.js → node_modules_0w2w61b8bh769._.js} +1 -1
  105. package/.next/server/chunks/ssr/{node_modules_1dff7b_kvngr-._.js → node_modules_0wd6szix_zku7._.js} +2 -2
  106. package/.next/server/chunks/ssr/{node_modules_0fd1swhk15cx3._.js → node_modules_0wp7omf0xblv8._.js} +1 -1
  107. package/.next/server/chunks/ssr/{node_modules_0nde84kzuwv2n._.js → node_modules_0yayrqhzfk8wy._.js} +1 -1
  108. package/.next/server/chunks/ssr/{node_modules_0f4xh33v3iltc._.js → node_modules_0zb0i39mnjdf3._.js} +1 -1
  109. package/.next/server/chunks/ssr/{node_modules_1iovyom0-y7o_._.js → node_modules_10c51o2qv6mbi._.js} +1 -1
  110. package/.next/server/chunks/ssr/{node_modules_02nv3yff2pqh8._.js → node_modules_10g1mmrf63d8a._.js} +2 -2
  111. package/.next/server/chunks/ssr/{node_modules_0-6sb1gkbjo93._.js → node_modules_152txg4c7ose3._.js} +2 -2
  112. package/.next/server/chunks/ssr/{node_modules_12qn4bepdou5v._.js → node_modules_185fuy4cv7loa._.js} +2 -2
  113. package/.next/server/chunks/ssr/{node_modules_1-iyhsn_1p9nx._.js → node_modules_19vqq7rvf-_ar._.js} +2 -2
  114. package/.next/server/chunks/ssr/{node_modules_0hqa9oxz17hip._.js → node_modules_1hd7j-tdb8drq._.js} +1 -1
  115. package/.next/server/chunks/ssr/{node_modules_1rlnehdn16ay-._.js → node_modules_1hu83gui7_nj2._.js} +1 -1
  116. package/.next/server/chunks/ssr/{node_modules_07maxxr-t28ql._.js → node_modules_1i3x2csuq_-jt._.js} +1 -1
  117. package/.next/server/chunks/ssr/{node_modules_0kovk4b6czb22._.js → node_modules_1j8hpoiygrs5e._.js} +1 -1
  118. package/.next/server/chunks/ssr/{node_modules_0zc49fdcopqu9._.js → node_modules_1l2g7btuh3e4s._.js} +2 -2
  119. package/.next/server/chunks/ssr/{node_modules_0t4h1rucl35hl._.js → node_modules_1n4kig4mj6n4s._.js} +2 -2
  120. package/.next/server/chunks/ssr/{node_modules_0vn0kjn_84lmn._.js → node_modules_1nz3ckv6tu_66._.js} +1 -1
  121. package/.next/server/chunks/ssr/{node_modules_0-nvg0c4pgfb8._.js → node_modules_1qnypguag6s_l._.js} +1 -1
  122. package/.next/server/chunks/ssr/{node_modules_1v4lexrfhnlhs._.js → node_modules_1r6w-jlme6d10._.js} +1 -1
  123. package/.next/server/chunks/ssr/{node_modules_1f4geuvkvlxj1._.js → node_modules_1s8oxeqa5_i3k._.js} +1 -1
  124. package/.next/server/chunks/ssr/{node_modules_1216007ogd5om._.js → node_modules_1tskcaktx6ods._.js} +1 -1
  125. package/.next/server/chunks/ssr/{node_modules_02vtgweceovke._.js → node_modules_1xz1dstlo5ri-._.js} +1 -1
  126. package/.next/server/chunks/ssr/{node_modules_1kv6lsckqs-m0._.js → node_modules_1zii7uk468cay._.js} +2 -2
  127. package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0bmuudv_6eypr._.js → node_modules_katex_dist_katex_mjs_067omoj5szuys._.js} +1 -1
  128. package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0qyy6pq9uzpk0._.js → node_modules_katex_dist_katex_mjs_1604s1ky8db8u._.js} +1 -1
  129. package/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_1d8fezw1qsiob._.js → node_modules_lucide-react_dist_esm_0-5bcc79665lq._.js} +2 -2
  130. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_0-5bcc79665lq._.js.map +1 -0
  131. package/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_0pezg1352q13j._.js → node_modules_lucide-react_dist_esm_0axoa1eg51x1-._.js} +2 -2
  132. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_0axoa1eg51x1-._.js.map +1 -0
  133. package/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_131i-tjzse3ye._.js → node_modules_lucide-react_dist_esm_18ei1-na3kusb._.js} +2 -2
  134. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_18ei1-na3kusb._.js.map +1 -0
  135. package/.next/server/chunks/ssr/{node_modules_lucide-react_dist_esm_1to-9cv1ysvs6._.js → node_modules_lucide-react_dist_esm_1tx493x2_auzs._.js} +2 -2
  136. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_1tx493x2_auzs._.js.map +1 -0
  137. package/.next/server/chunks/ssr/node_modules_mermaid_dist_mermaid_core_mjs_06it7ktosm1dr._.js +3 -0
  138. package/.next/server/chunks/ssr/node_modules_mermaid_dist_mermaid_core_mjs_06it7ktosm1dr._.js.map +1 -0
  139. package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js +1 -1
  140. package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js.map +1 -1
  141. package/.next/server/chunks/ssr/src_components_reports_TokenReportView_jsx_1g3p_enbbsadt._.js +1 -1
  142. package/.next/server/chunks/ssr/src_components_reports_TokenReportView_jsx_1g3p_enbbsadt._.js.map +1 -1
  143. package/.next/server/middleware-build-manifest.js +3 -3
  144. package/.next/server/pages/404.html +1 -1
  145. package/.next/server/pages/500.html +1 -1
  146. package/.next/server/preview-props.json +3 -3
  147. package/.next/server/server-reference-manifest.js +1 -1
  148. package/.next/server/server-reference-manifest.json +1 -1
  149. package/.next/static/chunks/0jo6fy2c_gmqn.js +1 -0
  150. package/.next/static/chunks/0r9apkv3exqv-.js +1 -0
  151. package/.next/static/chunks/1n_lb7wmn81jj.js +1 -0
  152. package/.next/static/chunks/2-w116ewoshm1.js +1 -0
  153. package/.next/static/chunks/23uup1e8841av.js +1 -0
  154. package/.next/static/chunks/2q9cwykv6ox1t.css +1 -0
  155. package/.next/static/chunks/2rx7xvi55ohln.js +1 -0
  156. package/.next/static/chunks/2zf44j8sjo0w0.js +425 -0
  157. package/.next/static/chunks/3rtpnpqd981z9.js +1 -0
  158. package/.next/trace +1 -1
  159. package/.next/trace-build +1 -1
  160. package/bin/cli.js +12 -0
  161. package/package.json +1 -1
  162. package/src/app/api/traces/stream/route.js +41 -5
  163. package/src/app/chat/page.js +14 -14
  164. package/src/app/globals.css +128 -0
  165. package/src/app/layout.js +8 -2
  166. package/src/app/page.js +18 -2
  167. package/src/components/chat/ChatMessageItem.js +12 -12
  168. package/src/components/chat/CodeBlock.js +5 -5
  169. package/src/components/chat/DiffViewer.js +27 -27
  170. package/src/components/chat/MarkdownRenderer.js +19 -19
  171. package/src/components/chat/SessionChatView.js +42 -42
  172. package/src/components/chat/SessionSearch.js +8 -8
  173. package/src/components/chat/ThinkingAccordion.js +3 -3
  174. package/src/components/chat/ToolCallCard.js +6 -6
  175. package/src/components/chat/ToolOutputView.js +19 -19
  176. package/src/components/factory/office-canvas.js +165 -3
  177. package/src/components/factory/scene/characters.js +267 -32
  178. package/src/components/layout/BottomPanel.jsx +6 -6
  179. package/src/components/layout/CommandPalette.jsx +12 -0
  180. package/src/components/layout/EditorTabs.jsx +17 -0
  181. package/src/components/layout/LayoutToggles.jsx +31 -2
  182. package/src/components/layout/LeftSidebar.jsx +88 -6
  183. package/src/components/layout/RightSidebar.jsx +8 -8
  184. package/src/components/layout/StatusBar.jsx +1 -1
  185. package/src/components/layout/TitleBar.jsx +76 -2
  186. package/src/components/layout/VSCodeWorkbench.jsx +99 -14
  187. package/src/components/store/Item3DRenderer.jsx +602 -48
  188. package/src/components/store/LiveFittingRoom.jsx +55 -791
  189. package/src/components/store/LiveReactAgent.jsx +1637 -0
  190. package/src/components/store/SupporterStoreModal.jsx +3 -2
  191. package/src/components/store/SupporterStoreView.jsx +94 -34
  192. package/src/components/theme/ThemeSettingsModal.jsx +40 -40
  193. package/src/components/ui/Button.jsx +4 -4
  194. package/src/components/ui/Input.jsx +1 -1
  195. package/src/components/ui/Modal.jsx +6 -6
  196. package/src/components/ui/Select.jsx +3 -3
  197. package/src/lib/catalog/auras.js +226 -1199
  198. package/src/lib/catalog/index.js +60 -1
  199. package/src/lib/catalog/pets.js +291 -2398
  200. package/src/lib/catalog/props.js +488 -4199
  201. package/src/lib/catalog/skins.js +773 -3249
  202. package/src/lib/catalog/trophies.js +226 -1199
  203. package/src/lib/mockTraces.js +28 -26
  204. package/src/lib/parsers/codexParser.js +373 -0
  205. package/src/lib/parsers/transcriptParser.js +35 -3
  206. package/src/lib/supporterStore.js +1 -1
  207. package/src/lib/traceContract.js +1 -1
  208. package/src/lib/useFactoryTraces.js +70 -5
  209. package/src/lib/watchers/antigravityWatcher.js +15 -1
  210. package/src/lib/watchers/claudeWatcher.js +86 -70
  211. package/src/lib/watchers/codexWatcher.js +482 -0
  212. package/src/lib/watchers/watcherManager.js +46 -30
  213. package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js +0 -3
  214. package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js.map +0 -1
  215. package/.next/server/chunks/ssr/[root-of-the-server]__19s2v5rryc14o._.js +0 -3
  216. package/.next/server/chunks/ssr/[root-of-the-server]__19s2v5rryc14o._.js.map +0 -1
  217. package/.next/server/chunks/ssr/[root-of-the-server]__1_jerxrctq6ev._.js +0 -427
  218. package/.next/server/chunks/ssr/[root-of-the-server]__1_jerxrctq6ev._.js.map +0 -1
  219. package/.next/server/chunks/ssr/[root-of-the-server]__1pvso-uyf--97._.js +0 -427
  220. package/.next/server/chunks/ssr/[root-of-the-server]__1pvso-uyf--97._.js.map +0 -1
  221. package/.next/server/chunks/ssr/[root-of-the-server]__1y78dc7oiz7ks._.js +0 -3
  222. package/.next/server/chunks/ssr/[root-of-the-server]__1y78dc7oiz7ks._.js.map +0 -1
  223. package/.next/server/chunks/ssr/_0ozao7omdwbvd._.js +0 -3
  224. package/.next/server/chunks/ssr/_0ozao7omdwbvd._.js.map +0 -1
  225. package/.next/server/chunks/ssr/_0rcmpdyxc1qwj._.js +0 -3
  226. package/.next/server/chunks/ssr/_0rcmpdyxc1qwj._.js.map +0 -1
  227. package/.next/server/chunks/ssr/_0wv0xnhun3mk7._.js +0 -3
  228. package/.next/server/chunks/ssr/_0wv0xnhun3mk7._.js.map +0 -1
  229. package/.next/server/chunks/ssr/_17rmaft1zusua._.js +0 -3
  230. package/.next/server/chunks/ssr/_17rmaft1zusua._.js.map +0 -1
  231. package/.next/server/chunks/ssr/_1e-d4pcj59a7a._.js +0 -3
  232. package/.next/server/chunks/ssr/_1e-d4pcj59a7a._.js.map +0 -1
  233. package/.next/server/chunks/ssr/_1qr5gnh64z8pg._.js +0 -3
  234. package/.next/server/chunks/ssr/_1qr5gnh64z8pg._.js.map +0 -1
  235. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_0pezg1352q13j._.js.map +0 -1
  236. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_131i-tjzse3ye._.js.map +0 -1
  237. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_1d8fezw1qsiob._.js.map +0 -1
  238. package/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_1to-9cv1ysvs6._.js.map +0 -1
  239. package/.next/static/chunks/0_3s_e4gd9xl0.js +0 -1
  240. package/.next/static/chunks/0i4kx4yl-dwfg.js +0 -425
  241. package/.next/static/chunks/0z0jbobmmvqoc.js +0 -1
  242. package/.next/static/chunks/1_a_gmob5qzho.js +0 -1
  243. package/.next/static/chunks/1ifqr4qo4697b.js +0 -1
  244. package/.next/static/chunks/2ccq9i8ev4dsx.js +0 -1
  245. package/.next/static/chunks/2mif7onk_9jy-.css +0 -1
  246. package/.next/static/chunks/40wyf-mv0tiu3.js +0 -1
  247. /package/.next/server/chunks/ssr/{node_modules_1c8i3jrmo4393._.js.map → node_modules_00ebs67b4u61w._.js.map} +0 -0
  248. /package/.next/server/chunks/ssr/{node_modules_0f773uqgzj7y7._.js.map → node_modules_01avo0bde3tpo._.js.map} +0 -0
  249. /package/.next/server/chunks/ssr/{node_modules_0z3elum1675ve._.js.map → node_modules_01l0208e5kqic._.js.map} +0 -0
  250. /package/.next/server/chunks/ssr/{node_modules_1wlwrgnt65zus._.js.map → node_modules_033x29yqle_sj._.js.map} +0 -0
  251. /package/.next/server/chunks/ssr/{node_modules_1kr1c-ncf8q9t._.js.map → node_modules_03wbg__aslvui._.js.map} +0 -0
  252. /package/.next/server/chunks/ssr/{node_modules_02jwra-d9iqim._.js.map → node_modules_06mgkab1v5iox._.js.map} +0 -0
  253. /package/.next/server/chunks/ssr/{node_modules_0fs8mckuwk2tj._.js.map → node_modules_08-bqkrz7sh0l._.js.map} +0 -0
  254. /package/.next/server/chunks/ssr/{node_modules_0-6sb1gkbjo93._.js.map → node_modules_089w9jm7s2qa3._.js.map} +0 -0
  255. /package/.next/server/chunks/ssr/{node_modules_02vtgweceovke._.js.map → node_modules_08q6a-f2itxyo._.js.map} +0 -0
  256. /package/.next/server/chunks/ssr/{node_modules_0__m9_odts7_e._.js.map → node_modules_0cy47-s63xjzh._.js.map} +0 -0
  257. /package/.next/server/chunks/ssr/{node_modules_02nv3yff2pqh8._.js.map → node_modules_0czh0jcnsm5e6._.js.map} +0 -0
  258. /package/.next/server/chunks/ssr/{node_modules_0z7rdbaf13024._.js.map → node_modules_0e6qoh__e4a69._.js.map} +0 -0
  259. /package/.next/server/chunks/ssr/{node_modules_0-nvg0c4pgfb8._.js.map → node_modules_0fv321j1nslkb._.js.map} +0 -0
  260. /package/.next/server/chunks/ssr/{node_modules_061uaylfjwqk7._.js.map → node_modules_0g-wb7h-hsdwc._.js.map} +0 -0
  261. /package/.next/server/chunks/ssr/{node_modules_0t4h1rucl35hl._.js.map → node_modules_0hb0q0epwvp--._.js.map} +0 -0
  262. /package/.next/server/chunks/ssr/{node_modules_0dq0dsblt-q0g._.js.map → node_modules_0l-y0kqtu_r3o._.js.map} +0 -0
  263. /package/.next/server/chunks/ssr/{node_modules_0zc49fdcopqu9._.js.map → node_modules_0l814qpw677vm._.js.map} +0 -0
  264. /package/.next/server/chunks/ssr/{node_modules_1xyxigbqzb8vs._.js.map → node_modules_0o63z1gd17rhb._.js.map} +0 -0
  265. /package/.next/server/chunks/ssr/{node_modules_1-iyhsn_1p9nx._.js.map → node_modules_0oz_zzlh8exwx._.js.map} +0 -0
  266. /package/.next/server/chunks/ssr/{node_modules_0oukyh0iq21ow._.js.map → node_modules_0so2agzqd9p8l._.js.map} +0 -0
  267. /package/.next/server/chunks/ssr/{node_modules_07maxxr-t28ql._.js.map → node_modules_0w2w61b8bh769._.js.map} +0 -0
  268. /package/.next/server/chunks/ssr/{node_modules_1dff7b_kvngr-._.js.map → node_modules_0wd6szix_zku7._.js.map} +0 -0
  269. /package/.next/server/chunks/ssr/{node_modules_0fd1swhk15cx3._.js.map → node_modules_0wp7omf0xblv8._.js.map} +0 -0
  270. /package/.next/server/chunks/ssr/{node_modules_0nde84kzuwv2n._.js.map → node_modules_0yayrqhzfk8wy._.js.map} +0 -0
  271. /package/.next/server/chunks/ssr/{node_modules_0f4xh33v3iltc._.js.map → node_modules_0zb0i39mnjdf3._.js.map} +0 -0
  272. /package/.next/server/chunks/ssr/{node_modules_1-sz_-qddwilq._.js.map → node_modules_10c51o2qv6mbi._.js.map} +0 -0
  273. /package/.next/server/chunks/ssr/{node_modules_0b8ndnuql44z1._.js.map → node_modules_10g1mmrf63d8a._.js.map} +0 -0
  274. /package/.next/server/chunks/ssr/{node_modules_13nsmuhey_ti_._.js.map → node_modules_152txg4c7ose3._.js.map} +0 -0
  275. /package/.next/server/chunks/ssr/{node_modules_12qn4bepdou5v._.js.map → node_modules_185fuy4cv7loa._.js.map} +0 -0
  276. /package/.next/server/chunks/ssr/{node_modules_1iovyom0-y7o_._.js.map → node_modules_19vqq7rvf-_ar._.js.map} +0 -0
  277. /package/.next/server/chunks/ssr/{node_modules_0hqa9oxz17hip._.js.map → node_modules_1hd7j-tdb8drq._.js.map} +0 -0
  278. /package/.next/server/chunks/ssr/{node_modules_1rlnehdn16ay-._.js.map → node_modules_1hu83gui7_nj2._.js.map} +0 -0
  279. /package/.next/server/chunks/ssr/{node_modules_12qw2ucebdvol._.js.map → node_modules_1i3x2csuq_-jt._.js.map} +0 -0
  280. /package/.next/server/chunks/ssr/{node_modules_0kovk4b6czb22._.js.map → node_modules_1j8hpoiygrs5e._.js.map} +0 -0
  281. /package/.next/server/chunks/ssr/{node_modules_1ll-58c1c-qab._.js.map → node_modules_1l2g7btuh3e4s._.js.map} +0 -0
  282. /package/.next/server/chunks/ssr/{node_modules_1zs2nou5uogby._.js.map → node_modules_1n4kig4mj6n4s._.js.map} +0 -0
  283. /package/.next/server/chunks/ssr/{node_modules_0vn0kjn_84lmn._.js.map → node_modules_1nz3ckv6tu_66._.js.map} +0 -0
  284. /package/.next/server/chunks/ssr/{node_modules_05w7qhtrzvnk6._.js.map → node_modules_1qnypguag6s_l._.js.map} +0 -0
  285. /package/.next/server/chunks/ssr/{node_modules_1v4lexrfhnlhs._.js.map → node_modules_1r6w-jlme6d10._.js.map} +0 -0
  286. /package/.next/server/chunks/ssr/{node_modules_1f4geuvkvlxj1._.js.map → node_modules_1s8oxeqa5_i3k._.js.map} +0 -0
  287. /package/.next/server/chunks/ssr/{node_modules_1216007ogd5om._.js.map → node_modules_1tskcaktx6ods._.js.map} +0 -0
  288. /package/.next/server/chunks/ssr/{node_modules_0m3ihe65818y_._.js.map → node_modules_1xz1dstlo5ri-._.js.map} +0 -0
  289. /package/.next/server/chunks/ssr/{node_modules_1kv6lsckqs-m0._.js.map → node_modules_1zii7uk468cay._.js.map} +0 -0
  290. /package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0bmuudv_6eypr._.js.map → node_modules_katex_dist_katex_mjs_067omoj5szuys._.js.map} +0 -0
  291. /package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0qyy6pq9uzpk0._.js.map → node_modules_katex_dist_katex_mjs_1604s1ky8db8u._.js.map} +0 -0
  292. /package/.next/static/{sQnXeiP8rV6y2v0az_xw3 → dGN2VKPk5TJgezxS3JvRc}/_buildManifest.js +0 -0
  293. /package/.next/static/{sQnXeiP8rV6y2v0az_xw3 → dGN2VKPk5TJgezxS3JvRc}/_clientMiddlewareManifest.js +0 -0
  294. /package/.next/static/{sQnXeiP8rV6y2v0az_xw3 → dGN2VKPk5TJgezxS3JvRc}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import React, { useState, useEffect, useRef, useMemo } from "react";
3
+ import React, { useState, useEffect, useMemo } from "react";
4
4
  import {
5
5
  Sparkles,
6
6
  Bot,
@@ -27,20 +27,9 @@ import {
27
27
  equipCustomLoadout,
28
28
  SUPPORTER_CHANGE_EVENT,
29
29
  } from "@/lib/supporterStore";
30
+ import { LiveReactAgent } from "./LiveReactAgent";
31
+
30
32
 
31
- // Color presets for known archetypes & themes
32
- const THEME_STYLES = {
33
- theme_default: { name: "Classic Charcoal Slate", base: "#14161a", tile: "#1e222b", grid: "#2d3548", glow: "#38bdf8" },
34
- theme_cyberpunk: { name: "Cyberpunk Neon Night", base: "#0d0819", tile: "#1c0d33", grid: "#ff2a85", glow: "#00f0ff" },
35
- theme_matrix: { name: "Phosphor Matrix Terminal", base: "#020d05", tile: "#051f0b", grid: "#00ff66", glow: "#10b981" },
36
- theme_wood: { name: "Cozy Scandinavian Loft", base: "#1f1610", tile: "#2c2017", grid: "#451a03", glow: "#f59e0b" },
37
- theme_space: { name: "Deep Space Void", base: "#030712", tile: "#0b1329", grid: "#1e1b4b", glow: "#6366f1" },
38
- theme_blueprint: { name: "Blueprint CAD Grid", base: "#0b1a30", tile: "#1e3a8a", grid: "#1d4ed8", glow: "#38bdf8" },
39
- theme_synthwave: { name: "Retro Synthwave 80s", base: "#1a052e", tile: "#3b0764", grid: "#d946ef", glow: "#ec4899" },
40
- theme_sakura_cyber: { name: "Sakura Cyber Garden", base: "#1c0e18", tile: "#2e1022", grid: "#f43f5e", glow: "#fb7185" },
41
- theme_nordic_ice: { name: "Minimalist Nordic Ice", base: "#0f172a", tile: "#1e293b", grid: "#38bdf8", glow: "#e2e8f0" },
42
- theme_industrial: { name: "High-Voltage Industrial", base: "#18181b", tile: "#27272a", grid: "#eab308", glow: "#f59e0b" },
43
- };
44
33
 
45
34
  export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
46
35
  const [storeState, setStoreState] = useState(initialStoreState || getSupporterState());
@@ -64,10 +53,7 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
64
53
  const [archetypeFilter, setArchetypeFilter] = useState("all");
65
54
  const [saveToast, setSaveToast] = useState(false);
66
55
 
67
- const canvasRef = useRef(null);
68
- const animFrameRef = useRef(null);
69
- const telemetryRef = useRef({ bob: 0, shake: 0, rotL: 0, rotR: 0, blink: false, fps: 60 });
70
- const [telemetry, setTelemetry] = useState(telemetryRef.current);
56
+ const [telemetry, setTelemetry] = useState({ bob: 0, shake: 0, rotL: 0, rotR: 0, blink: false, fps: 60 });
71
57
 
72
58
  // Sync with store state changes
73
59
  useEffect(() => {
@@ -96,760 +82,7 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
96
82
  return (COSMETIC_CATALOG.officeThemes || []).find((t) => t.id === activeThemeId) || (COSMETIC_CATALOG.officeThemes || [])[0];
97
83
  }, [activeThemeId]);
98
84
 
99
- // --------------------------------------------------------------------------
100
- // CANVAS ANIMATION ENGINE (Procedural Vector Drawing)
101
- // --------------------------------------------------------------------------
102
- useEffect(() => {
103
- const canvas = canvasRef.current;
104
- if (!canvas) return;
105
- const ctx = canvas.getContext("2d");
106
-
107
- let lastTime = performance.now();
108
- let frameCount = 0;
109
- let fpsTimer = 0;
110
-
111
- const render = (now) => {
112
- const dt = now - lastTime;
113
- lastTime = now;
114
-
115
- // Telemetry FPS
116
- frameCount++;
117
- fpsTimer += dt;
118
- if (fpsTimer >= 500) {
119
- telemetryRef.current.fps = Math.round((frameCount * 1000) / fpsTimer);
120
- frameCount = 0;
121
- fpsTimer = 0;
122
- setTelemetry({ ...telemetryRef.current });
123
- }
124
-
125
- ctx.clearRect(0, 0, canvas.width, canvas.height);
126
-
127
- const cx = canvas.width / 2;
128
- const cy = canvas.height / 2 + 55;
129
- const t = isPlaying ? now : 0;
130
-
131
- // 1. Draw Floor Theme Environment Background
132
- drawFloorEnvironment(ctx, cx, cy, canvas.width, canvas.height, activeThemeId, t);
133
-
134
- // 2. Draw Aura Behind Character
135
- drawAura(ctx, cx, cy - 50, currentAuraItem, t, currentMode);
136
-
137
- // 3. Draw Character Avatar Behind Desk
138
- const tel = drawCharacter(
139
- ctx,
140
- cx,
141
- cy - 50,
142
- 1.75,
143
- t,
144
- currentMode,
145
- intensity,
146
- currentSkinItem,
147
- clientType
148
- );
149
-
150
- // 4. Draw Desk & Workstation in Front of Character
151
- drawDesk(
152
- ctx,
153
- cx,
154
- cy,
155
- t,
156
- intensity,
157
- currentMode,
158
- clientType,
159
- activeProps,
160
- currentSkinItem?.color || "#00f0ff"
161
- );
162
-
163
- // 5. Draw Companion Pet on/near Desk
164
- drawPet(ctx, cx + 80, cy + 2, currentPetItem, t, currentMode);
165
-
166
- telemetryRef.current.bob = tel.bob;
167
- telemetryRef.current.shake = tel.shake;
168
- telemetryRef.current.rotL = tel.rotL;
169
- telemetryRef.current.rotR = tel.rotR;
170
- telemetryRef.current.blink = tel.blinking;
171
-
172
- if (isPlaying) {
173
- animFrameRef.current = requestAnimationFrame(render);
174
- }
175
- };
176
-
177
- animFrameRef.current = requestAnimationFrame(render);
178
- return () => {
179
- if (animFrameRef.current) cancelAnimationFrame(animFrameRef.current);
180
- };
181
- }, [
182
- activeSkinId,
183
- activePetId,
184
- activeProps,
185
- activeAuraId,
186
- activeThemeId,
187
- currentMode,
188
- intensity,
189
- clientType,
190
- isPlaying,
191
- currentSkinItem,
192
- currentPetItem,
193
- currentAuraItem,
194
- currentThemeId,
195
- ]);
196
-
197
- // --------------------------------------------------------------------------
198
- // DRAWING ROUTINES (Canvas 2D Vector Primitives)
199
- // --------------------------------------------------------------------------
200
-
201
- function drawFloorEnvironment(ctx, cx, cy, width, height, themeId, t) {
202
- ctx.save();
203
- const style = THEME_STYLES[themeId] || THEME_STYLES.theme_default;
204
-
205
- // Background radial ambient glow
206
- const bgRad = ctx.createRadialGradient(cx, cy - 20, 20, cx, cy, width * 0.7);
207
- bgRad.addColorStop(0, style.base);
208
- bgRad.addColorStop(0.7, "#08090c");
209
- bgRad.addColorStop(1, "#040507");
210
- ctx.fillStyle = bgRad;
211
- ctx.fillRect(0, 0, width, height);
212
-
213
- // 3D Isometric Floor Slate
214
- ctx.save();
215
- ctx.translate(cx, cy + 70);
216
-
217
- // Outer Floor Shadow
218
- ctx.fillStyle = "rgba(0,0,0,0.55)";
219
- ctx.beginPath();
220
- ctx.ellipse(0, 15, 230, 75, 0, 0, Math.PI * 2);
221
- ctx.fill();
222
-
223
- // Isometric Floor Polygon
224
- const fW = 240;
225
- const fH = 110;
226
- ctx.beginPath();
227
- ctx.moveTo(0, -fH);
228
- ctx.lineTo(fW, 0);
229
- ctx.lineTo(0, fH);
230
- ctx.lineTo(-fW, 0);
231
- ctx.closePath();
232
-
233
- const fGrad = ctx.createLinearGradient(0, -fH, 0, fH);
234
- fGrad.addColorStop(0, style.tile);
235
- fGrad.addColorStop(1, style.base);
236
- ctx.fillStyle = fGrad;
237
- ctx.fill();
238
-
239
- // Floor Bevel Rim
240
- ctx.strokeStyle = style.grid;
241
- ctx.lineWidth = 1.8;
242
- ctx.stroke();
243
-
244
- // Floor Edge Thickness (Extrusion)
245
- ctx.fillStyle = "rgba(0,0,0,0.4)";
246
- ctx.beginPath();
247
- ctx.moveTo(-fW, 0);
248
- ctx.lineTo(0, fH);
249
- ctx.lineTo(0, fH + 12);
250
- ctx.lineTo(-fW, 12);
251
- ctx.closePath();
252
- ctx.fill();
253
-
254
- ctx.fillStyle = "rgba(0,0,0,0.6)";
255
- ctx.beginPath();
256
- ctx.moveTo(fW, 0);
257
- ctx.lineTo(0, fH);
258
- ctx.lineTo(0, fH + 12);
259
- ctx.lineTo(fW, 12);
260
- ctx.closePath();
261
- ctx.fill();
262
-
263
- // Isometric Gridlines
264
- ctx.strokeStyle = style.grid;
265
- ctx.lineWidth = 1;
266
- ctx.globalAlpha = 0.45;
267
- for (let i = -3; i <= 3; i++) {
268
- const off = i * 40;
269
- ctx.beginPath();
270
- ctx.moveTo(-fW / 2 + off, -fH / 2);
271
- ctx.lineTo(fW / 2 + off, fH / 2);
272
- ctx.stroke();
273
-
274
- ctx.beginPath();
275
- ctx.moveTo(fW / 2 - off, -fH / 2);
276
- ctx.lineTo(-fW / 2 - off, fH / 2);
277
- ctx.stroke();
278
- }
279
- ctx.globalAlpha = 1;
280
-
281
- // Corner Neon Glow Brackets
282
- ctx.strokeStyle = style.glow;
283
- ctx.lineWidth = 2;
284
- ctx.shadowColor = style.glow;
285
- ctx.shadowBlur = 10;
286
- ctx.beginPath();
287
- ctx.moveTo(-fW + 30, -5); ctx.lineTo(-fW + 10, 0); ctx.lineTo(-fW + 30, 5);
288
- ctx.moveTo(fW - 30, -5); ctx.lineTo(fW - 10, 0); ctx.lineTo(fW - 30, 5);
289
- ctx.stroke();
290
- ctx.shadowBlur = 0;
291
-
292
- ctx.restore();
293
- ctx.restore();
294
- }
295
-
296
- function drawAura(ctx, cx, cy, auraItem, t, mode) {
297
- if (!auraItem || auraItem.id === "none" || auraItem.archetype === "none") return;
298
- ctx.save();
299
- ctx.translate(cx, cy);
300
-
301
- const color = auraItem.color || "#00f0ff";
302
- const arch = auraItem.archetype || "plasma_ring";
303
- const pulse = 1 + Math.sin(t * 0.006) * 0.12;
304
- const aAlpha = mode === "happy" ? 0.95 : mode === "error" ? 0.4 : mode === "sleeping" ? 0.25 : 0.65;
305
-
306
- ctx.shadowColor = color;
307
- ctx.shadowBlur = 12;
308
-
309
- if (arch === "matrix_rain") {
310
- ctx.strokeStyle = color;
311
- ctx.fillStyle = "#ffffff";
312
- ctx.lineWidth = 1.6;
313
- for (let col = -3; col <= 3; col++) {
314
- const rx = col * 12;
315
- const dropP = ((t * 0.002 + col * 0.33) % 1);
316
- const ry = -80 + dropP * 65;
317
- ctx.globalAlpha = aAlpha * 0.8;
318
- ctx.beginPath();
319
- ctx.moveTo(rx, ry - 10);
320
- ctx.lineTo(rx, ry);
321
- ctx.stroke();
322
- ctx.beginPath();
323
- ctx.arc(rx, ry, 1.4, 0, Math.PI * 2);
324
- ctx.fill();
325
- }
326
- } else if (arch === "quantum_mist") {
327
- ctx.strokeStyle = color;
328
- ctx.lineWidth = 1.4;
329
- ctx.globalAlpha = aAlpha * 0.5;
330
- for (let p = 0; p < 4; p++) {
331
- const ang = t * 0.003 + (p * Math.PI) / 2;
332
- const rx = 36 * pulse + Math.sin(ang) * 5;
333
- const ry = 16 * pulse + Math.cos(ang) * 4;
334
- ctx.beginPath();
335
- ctx.ellipse(0, -42, rx, ry, 0, 0, Math.PI * 2);
336
- ctx.stroke();
337
- }
338
- ctx.fillStyle = "#ffffff";
339
- ctx.globalAlpha = aAlpha;
340
- ctx.beginPath();
341
- ctx.arc(Math.sin(t * 0.007) * 34, -42 + Math.cos(t * 0.007) * 14, 2.5, 0, Math.PI * 2);
342
- ctx.fill();
343
- } else if (arch === "glitch_halo") {
344
- const jx = Math.sin(t * 0.09) * 3;
345
- ctx.strokeStyle = color;
346
- ctx.lineWidth = 2.2;
347
- ctx.globalAlpha = aAlpha;
348
- ctx.strokeRect(-38 * pulse + jx, -64 * pulse, 76 * pulse, 30 * pulse);
349
- } else {
350
- // Plasma Ring default
351
- ctx.strokeStyle = color;
352
- ctx.lineWidth = 2.4;
353
- ctx.globalAlpha = aAlpha;
354
- ctx.beginPath();
355
- ctx.ellipse(0, -42, 42 * pulse, 16 * pulse, 0, 0, Math.PI * 2);
356
- ctx.stroke();
357
-
358
- ctx.strokeStyle = "#ffffff";
359
- ctx.lineWidth = 1.2;
360
- ctx.beginPath();
361
- ctx.ellipse(0, -42, 32 * pulse, 11 * pulse, 0, 0, Math.PI * 2);
362
- ctx.stroke();
363
- }
364
-
365
- ctx.restore();
366
- }
367
-
368
- function drawCharacter(ctx, cx, cy, scale, t, mode, intensity, skinItem, clientType) {
369
- ctx.save();
370
- ctx.translate(cx, cy);
371
- ctx.scale(scale, scale);
372
-
373
- const skinColor = skinItem?.color || "#00f0ff";
374
- const skinArch = skinItem?.archetype || "cyber_classic";
375
- const trimColor = clientType === "app" ? "#8b5cf6" : "#10b981";
376
- const SHELL = "#1e2430";
377
- const SHADE = "#111622";
378
- const phase = t * 0.012;
379
-
380
- // Body Motion Calculations
381
- let bob = Math.sin(t * 0.004) * (0.8 + intensity * 1.4);
382
- let shake = 0;
383
- let tilt = 0;
384
-
385
- if (mode === "happy") bob = -Math.abs(Math.sin(t * 0.005)) * 4.2;
386
- if (mode === "sleeping") {
387
- bob = Math.sin(t * 0.0016) * 1.1 + 2.2;
388
- tilt = 0.12 + Math.sin(t * 0.0016) * 0.02;
389
- }
390
- if (mode === "error") shake = Math.sin(t * 0.09) * 2.2;
391
- if (mode === "looping") {
392
- shake = Math.sin(t * 0.08) * 2.5;
393
- bob = Math.sin(t * 0.015) * 1.8;
394
- tilt = Math.sin(t * 0.02) * 0.18;
395
- }
396
-
397
- ctx.translate(shake, bob);
398
- ctx.rotate(tilt);
399
-
400
- // 1. Torso
401
- const bGrad = ctx.createLinearGradient(0, -30, 0, 0);
402
- bGrad.addColorStop(0, "#ffffff");
403
- bGrad.addColorStop(0.5, SHELL);
404
- bGrad.addColorStop(1, SHADE);
405
- ctx.fillStyle = bGrad;
406
- ctx.beginPath();
407
- ctx.roundRect(-17, -30, 34, 22, 11);
408
- ctx.fill();
409
-
410
- // Torso Trim Band
411
- ctx.fillStyle = trimColor;
412
- ctx.fillRect(-14, -12, 28, 6);
413
-
414
- // Chest Arc Reactor
415
- ctx.fillStyle = "#0f172a";
416
- ctx.beginPath();
417
- ctx.arc(0, -18, 4.5, 0, Math.PI * 2);
418
- ctx.fill();
419
- ctx.strokeStyle = skinColor;
420
- ctx.lineWidth = 1.4;
421
- ctx.stroke();
422
- ctx.fillStyle = skinColor;
423
- ctx.beginPath();
424
- ctx.arc(0, -18, 2.2, 0, Math.PI * 2);
425
- ctx.fill();
426
-
427
- // 2. Arms (Pivot at shoulder)
428
- let rotL = 0;
429
- let rotR = 0;
430
85
 
431
- if (mode === "streaming") {
432
- rotL = Math.sin(phase) * 0.14 * (0.3 + intensity);
433
- rotR = -Math.sin(phase + 1.3) * 0.14 * (0.3 + intensity);
434
- } else if (mode === "pending") {
435
- rotL = 2.5 + Math.sin(t * 0.012) * 0.35;
436
- rotR = -Math.sin(phase + 1.3) * 0.06;
437
- } else if (mode === "happy") {
438
- rotL = 2.2 + Math.sin(t * 0.01) * 0.2;
439
- rotR = -2.2 - Math.sin(t * 0.01 + 1) * 0.2;
440
- } else if (mode === "error") {
441
- rotL = 2.7 + Math.sin(t * 0.08) * 0.1;
442
- rotR = -2.7 - Math.sin(t * 0.08) * 0.1;
443
- } else if (mode === "looping") {
444
- rotL = 2.4 + Math.sin(t * 0.02) * 0.4;
445
- rotR = -2.4 - Math.sin(t * 0.02 + 1) * 0.4;
446
- }
447
-
448
- // Left Arm
449
- ctx.save();
450
- ctx.translate(-22, -26);
451
- ctx.rotate(rotL);
452
- ctx.fillStyle = SHELL;
453
- ctx.beginPath();
454
- ctx.roundRect(-4, 0, 8, 24, 4);
455
- ctx.fill();
456
- ctx.restore();
457
-
458
- // Right Arm
459
- ctx.save();
460
- ctx.translate(22, -26);
461
- ctx.rotate(rotR);
462
- ctx.fillStyle = SHELL;
463
- ctx.beginPath();
464
- ctx.roundRect(-4, 0, 8, 24, 4);
465
- ctx.fill();
466
- ctx.restore();
467
-
468
- // 3. Head & Comm Pods
469
- ctx.fillStyle = skinColor;
470
- ctx.beginPath();
471
- ctx.arc(-27, -56, 8, 0, Math.PI * 2);
472
- ctx.arc(27, -56, 8, 0, Math.PI * 2);
473
- ctx.fill();
474
-
475
- // Helmet Sphere
476
- const hGrad = ctx.createLinearGradient(0, -80, 0, -32);
477
- hGrad.addColorStop(0, "#2d3748");
478
- hGrad.addColorStop(0.6, SHELL);
479
- hGrad.addColorStop(1, SHADE);
480
- ctx.fillStyle = hGrad;
481
- ctx.strokeStyle = skinColor;
482
- ctx.lineWidth = 2.2;
483
- ctx.beginPath();
484
- ctx.ellipse(0, -56, 26, 24, 0, 0, Math.PI * 2);
485
- ctx.fill();
486
- ctx.stroke();
487
-
488
- // Visor Cavity
489
- ctx.fillStyle = "#0f141c";
490
- ctx.beginPath();
491
- ctx.ellipse(0, -53, 20, 15.5, 0, 0, Math.PI * 2);
492
- ctx.fill();
493
-
494
- // Head Archetype Accessories
495
- if (skinArch === "cyber_cat") {
496
- // Cute Cat Ears
497
- ctx.fillStyle = SHELL;
498
- ctx.beginPath();
499
- ctx.moveTo(-22, -72); ctx.lineTo(-14, -86); ctx.lineTo(-6, -76); ctx.closePath();
500
- ctx.moveTo(6, -76); ctx.lineTo(14, -86); ctx.lineTo(22, -72); ctx.closePath();
501
- ctx.fill();
502
- ctx.fillStyle = "#f472b6";
503
- ctx.beginPath();
504
- ctx.moveTo(-20, -73); ctx.lineTo(-14, -83); ctx.lineTo(-8, -76); ctx.closePath();
505
- ctx.moveTo(8, -76); ctx.lineTo(14, -83); ctx.lineTo(20, -73); ctx.closePath();
506
- ctx.fill();
507
- } else if (skinArch === "stealth_ninja") {
508
- // Ninja Headband
509
- ctx.fillStyle = "#1e1b4b";
510
- ctx.strokeStyle = skinColor;
511
- ctx.lineWidth = 1.5;
512
- ctx.fillRect(-24, -66, 48, 8);
513
- ctx.strokeRect(-24, -66, 48, 8);
514
- ctx.fillStyle = "#38bdf8";
515
- ctx.beginPath();
516
- ctx.arc(0, -62, 3, 0, Math.PI * 2);
517
- ctx.fill();
518
- } else if (skinArch === "mecha_pilot") {
519
- // Dual Antennas
520
- ctx.fillStyle = skinColor;
521
- ctx.fillRect(-20, -88, 3, 20);
522
- ctx.fillRect(17, -88, 3, 20);
523
- ctx.fillStyle = "#ffffff";
524
- ctx.beginPath();
525
- ctx.arc(-18.5, -88, 3, 0, Math.PI * 2);
526
- ctx.arc(18.5, -88, 3, 0, Math.PI * 2);
527
- ctx.fill();
528
- } else if (skinArch === "celestial_astro") {
529
- // Solar Halo
530
- ctx.strokeStyle = skinColor;
531
- ctx.lineWidth = 2;
532
- ctx.beginPath();
533
- ctx.ellipse(0, -64, 30, 8, 0, 0, Math.PI * 2);
534
- ctx.stroke();
535
- } else if (skinArch === "matrix_hacker") {
536
- // Hacker Hoodie Cowl
537
- ctx.strokeStyle = skinColor;
538
- ctx.lineWidth = 1.8;
539
- ctx.strokeRect(-26, -76, 52, 44);
540
- } else if (skinArch === "cyber_suit") {
541
- // Tactical Brow & Wing Antennas
542
- ctx.fillStyle = skinColor;
543
- ctx.fillRect(-24, -66, 48, 6);
544
- }
545
-
546
- // 4. Eyes & Facial Expression
547
- const blinking = Math.sin(t * 0.0013) > 0.985;
548
- const flicker = 0.85 + Math.sin(t * 0.01) * 0.15;
549
- ctx.strokeStyle = skinColor;
550
- ctx.fillStyle = skinColor;
551
- ctx.lineWidth = 2.2;
552
- ctx.globalAlpha = flicker;
553
-
554
- const drawEye = (ex, ey, kind) => {
555
- ctx.save();
556
- if (kind === "happy") {
557
- ctx.beginPath();
558
- ctx.arc(ex, ey + 2, 4.6, Math.PI, 0);
559
- ctx.stroke();
560
- } else if (kind === "sleep") {
561
- ctx.beginPath();
562
- ctx.arc(ex, ey, 4.6, 0, Math.PI);
563
- ctx.stroke();
564
- } else if (kind === "x") {
565
- ctx.beginPath();
566
- ctx.moveTo(ex - 4, ey - 4); ctx.lineTo(ex + 4, ey + 4);
567
- ctx.moveTo(ex + 4, ey - 4); ctx.lineTo(ex - 4, ey + 4);
568
- ctx.stroke();
569
- } else if (kind === "looping") {
570
- ctx.beginPath();
571
- ctx.arc(ex, ey, 4.2, 0, Math.PI * 2);
572
- ctx.stroke();
573
- ctx.beginPath();
574
- ctx.arc(ex, ey, 2.0, 0, Math.PI * 2);
575
- ctx.stroke();
576
- } else {
577
- const eh = blinking ? 0.8 : 4.4;
578
- ctx.beginPath();
579
- ctx.ellipse(ex, ey, 4.8, eh, 0, 0, Math.PI * 2);
580
- ctx.fill();
581
- if (!blinking) {
582
- ctx.fillStyle = "#0f141c";
583
- for (let sy = ey - eh + 1; sy < ey + eh; sy += 2.4) {
584
- ctx.fillRect(ex - 6, sy, 12, 1);
585
- }
586
- }
587
- }
588
- ctx.restore();
589
- };
590
-
591
- const eyeKind =
592
- mode === "happy"
593
- ? "happy"
594
- : mode === "sleeping"
595
- ? "sleep"
596
- : mode === "error"
597
- ? "x"
598
- : mode === "looping"
599
- ? "looping"
600
- : "scan";
601
-
602
- drawEye(-8, -57, eyeKind);
603
- drawEye(8, -57, eyeKind);
604
-
605
- // Mouth
606
- if (mode === "happy") {
607
- ctx.beginPath();
608
- ctx.arc(0, -48, 6, 0, Math.PI);
609
- ctx.stroke();
610
- } else if (mode === "sleeping") {
611
- ctx.beginPath();
612
- ctx.arc(0, -45, 1.8, 0, Math.PI * 2);
613
- ctx.stroke();
614
- } else if (mode === "error") {
615
- ctx.beginPath();
616
- ctx.moveTo(-7, -45); ctx.lineTo(-3.5, -48); ctx.lineTo(0, -45); ctx.lineTo(3.5, -48); ctx.lineTo(7, -45);
617
- ctx.stroke();
618
- } else if (mode === "looping") {
619
- ctx.beginPath();
620
- ctx.arc(0, -46, 3.2, 0, Math.PI * 2);
621
- ctx.stroke();
622
- } else {
623
- const mw = 5 + intensity * 3;
624
- ctx.beginPath();
625
- ctx.ellipse(0, -46, mw, 2.4 + intensity * 1.2, 0, 0, Math.PI * 2);
626
- ctx.fill();
627
- }
628
-
629
- // 5. Particles (Z's or Smoke)
630
- if (mode === "sleeping") {
631
- for (let k = 0; k < 3; k++) {
632
- const p = ((t * 0.0004 + k / 3) % 1);
633
- const zx = 20 + p * 16;
634
- const zy = -78 - p * 30;
635
- const s = 3 + p * 4;
636
- ctx.strokeStyle = "#a5b4cc";
637
- ctx.globalAlpha = 1 - p;
638
- ctx.lineWidth = 1.6;
639
- ctx.beginPath();
640
- ctx.moveTo(zx, zy); ctx.lineTo(zx + s, zy); ctx.lineTo(zx, zy + s); ctx.lineTo(zx + s, zy + s);
641
- ctx.stroke();
642
- }
643
- } else if (mode === "error" || mode === "looping") {
644
- for (let k = 0; k < 5; k++) {
645
- const p = ((t * 0.0008 + k / 5) % 1);
646
- const sx = Math.sin(p * 8 + k * 1.3) * 7 + (k - 2) * 3.5;
647
- const sy = -76 - p * 38;
648
- const r = 2.5 + p * 7;
649
- ctx.fillStyle = "#4b5563";
650
- ctx.globalAlpha = 0.65 * (1 - p);
651
- ctx.beginPath();
652
- ctx.arc(sx, sy, r, 0, Math.PI * 2);
653
- ctx.fill();
654
- }
655
- }
656
-
657
- ctx.restore();
658
- return { bob, shake, rotL, rotR, blinking };
659
- }
660
-
661
- function drawDesk(ctx, cx, cy, t, intensity, mode, clientType, propsList, accentColor) {
662
- ctx.save();
663
- ctx.translate(cx, cy);
664
-
665
- const W = 210;
666
- const H = 120;
667
-
668
- // Desk Slab
669
- const dGrad = ctx.createLinearGradient(0, -30, 0, H - 30);
670
- dGrad.addColorStop(0, "#2b3443");
671
- dGrad.addColorStop(1, "#181d26");
672
- ctx.fillStyle = dGrad;
673
- ctx.beginPath();
674
- ctx.roundRect(-W / 2, 0, W, H, 10);
675
- ctx.fill();
676
- ctx.strokeStyle = "#475569";
677
- ctx.lineWidth = 1.5;
678
- ctx.stroke();
679
-
680
- // Desk Lip Highlight
681
- ctx.fillStyle = "rgba(255,255,255,0.15)";
682
- ctx.fillRect(-W / 2, 0, W, 4);
683
-
684
- // Latency Progress Bar
685
- const barW = W - 40;
686
- ctx.fillStyle = "#0f141c";
687
- ctx.fillRect(-barW / 2, H - 14, barW, 6);
688
- ctx.fillStyle = mode === "error" ? "#f43f5e" : intensity > 0.8 ? "#f59e0b" : "#10b981";
689
- ctx.fillRect(-barW / 2, H - 14, barW * (0.3 + intensity * 0.7), 6);
690
-
691
- // Center Monitor Screen
692
- ctx.fillStyle = "#0b0e13";
693
- ctx.fillRect(-45, -45, 90, 48);
694
- ctx.fillStyle = mode === "error" ? "rgba(244,63,94,0.3)" : "rgba(0,240,255,0.25)";
695
- ctx.fillRect(-42, -42, 84, 42);
696
-
697
- // Screen Code Lines
698
- ctx.fillStyle = "#ffffff";
699
- for (let i = 0; i < 4; i++) {
700
- ctx.globalAlpha = 0.4 + Math.sin(t * 0.01 + i) * 0.2;
701
- ctx.fillRect(-38, -38 + i * 9, 20 + ((i * 19) % 36), 3);
702
- }
703
- ctx.globalAlpha = 1;
704
-
705
- // Monitor Client Badge
706
- ctx.fillStyle = clientType === "app" ? "#3b0764" : "#064e3b";
707
- ctx.fillRect(-42, -42, 28, 12);
708
- ctx.fillStyle = clientType === "app" ? "#d8b4fe" : "#6ee7b7";
709
- ctx.font = "bold 8px monospace";
710
- ctx.fillText(clientType === "app" ? "APP" : "CLI", -38, -33);
711
-
712
- // ------------------------------------------------------------------------
713
- // PROPS ON DESK (Dynamic based on activeProps)
714
- // ------------------------------------------------------------------------
715
- const hasProp = (keyword) => activeProps.some((p) => String(p).toLowerCase().includes(keyword));
716
-
717
- // 1. Hologram Cube
718
- if (hasProp("holo") || hasProp("cube") || hasProp("prop_2") || activeProps.length > 2) {
719
- ctx.save();
720
- ctx.translate(65, -15);
721
- ctx.rotate(t * 0.002);
722
- ctx.strokeStyle = accentColor || "#38bdf8";
723
- ctx.lineWidth = 1.4;
724
- ctx.strokeRect(-10, -10, 20, 20);
725
- ctx.restore();
726
- }
727
-
728
- // 2. Steaming Coffee Mug
729
- if (hasProp("coffee") || hasProp("mug") || hasProp("prop_0") || activeProps.length > 0) {
730
- ctx.fillStyle = "#e2e8f0";
731
- ctx.fillRect(-80, 10, 14, 16);
732
- if (intensity > 0) {
733
- for (let i = 0; i < 3; i++) {
734
- const p = ((t * 0.001 + i / 3) % 1);
735
- const sx = -73 + Math.sin(p * 5 + i) * 3;
736
- const sy = 8 - p * 14;
737
- ctx.fillStyle = "rgba(255,255,255," + (0.45 * (1 - p)) + ")";
738
- ctx.beginPath();
739
- ctx.arc(sx, sy, 1 + p * 2, 0, Math.PI * 2);
740
- ctx.fill();
741
- }
742
- }
743
- }
744
-
745
- // 3. Server Tower with Multi-Color Blinking LEDs
746
- if (hasProp("server") || hasProp("tower") || hasProp("prop_1") || activeProps.length > 1) {
747
- ctx.fillStyle = "#1e293b";
748
- ctx.fillRect(-96, -26, 12, 38);
749
- for (let idx = 0; idx < 4; idx++) {
750
- const blink = Math.sin(t * 0.008 + idx * 1.6) > 0;
751
- const ledCol = ["#22c55e", "#00f0ff", "#f59e0b", "#ec4899"][idx];
752
- ctx.fillStyle = blink ? ledCol : "#0f172a";
753
- ctx.beginPath();
754
- ctx.arc(-90, -20 + idx * 8, 1.6, 0, Math.PI * 2);
755
- ctx.fill();
756
- }
757
- }
758
-
759
- // 4. Oscilloscope
760
- if (hasProp("osc") || hasProp("wave") || hasProp("prop_3")) {
761
- ctx.fillStyle = "#111827";
762
- ctx.fillRect(55, 10, 32, 22);
763
- ctx.strokeStyle = "#10b981";
764
- ctx.lineWidth = 1.2;
765
- ctx.beginPath();
766
- ctx.moveTo(57, 21);
767
- for (let ox = 57; ox <= 85; ox += 2) {
768
- const oy = 21 + Math.sin(t * 0.01 + ox * 0.8) * 4;
769
- ctx.lineTo(ox, oy);
770
- }
771
- ctx.stroke();
772
- }
773
-
774
- ctx.restore();
775
- }
776
-
777
- function drawPet(ctx, cx, cy, petItem, t, mode) {
778
- if (!petItem || petItem.id === "pet_0" || petItem.archetype === "none") return;
779
- ctx.save();
780
-
781
- const arch = petItem.archetype || "hover_drone";
782
- const color = petItem.color || "#00f0ff";
783
-
784
- let py = cy;
785
- let px = cx;
786
- let scaleY = 1;
787
-
788
- if (arch === "hover_drone") {
789
- py = cy - 25 + Math.sin(t * 0.005) * 5;
790
- } else if (mode === "happy") {
791
- py = cy - Math.abs(Math.sin(t * 0.008)) * 8;
792
- scaleY = 1 + Math.abs(Math.sin(t * 0.008)) * 0.15;
793
- } else if (mode === "sleeping") {
794
- scaleY = 1 + Math.sin(t * 0.0016) * 0.04;
795
- } else if (mode === "error") {
796
- px = cx + Math.sin(t * 0.08) * 2;
797
- } else if (mode === "looping") {
798
- ctx.rotate(Math.sin(t * 0.04) * 0.15);
799
- }
800
-
801
- ctx.translate(px, py);
802
- ctx.scale(1, scaleY);
803
-
804
- if (arch === "hover_drone") {
805
- // Hover Drone
806
- ctx.fillStyle = "#0f172a";
807
- ctx.beginPath();
808
- ctx.ellipse(0, 0, 14, 8, 0, 0, Math.PI * 2);
809
- ctx.fill();
810
- ctx.strokeStyle = color;
811
- ctx.lineWidth = 1.5;
812
- ctx.stroke();
813
-
814
- // Spinning Halo Rotor
815
- ctx.strokeStyle = "#ffffff";
816
- ctx.lineWidth = 1;
817
- ctx.beginPath();
818
- ctx.ellipse(0, -6, 16, 3, 0, 0, Math.PI * 2);
819
- ctx.stroke();
820
-
821
- // Scanner Eye
822
- ctx.fillStyle = color;
823
- ctx.beginPath();
824
- ctx.arc(0, 0, 2.5, 0, Math.PI * 2);
825
- ctx.fill();
826
- } else {
827
- // Cyber Cat / Robo Pup Ground Companion
828
- ctx.fillStyle = "#1e293b";
829
- ctx.beginPath();
830
- ctx.roundRect(-10, -14, 20, 16, 5);
831
- ctx.fill();
832
- ctx.strokeStyle = color;
833
- ctx.lineWidth = 1.4;
834
- ctx.stroke();
835
-
836
- // Ears
837
- ctx.fillStyle = color;
838
- ctx.beginPath();
839
- ctx.moveTo(-8, -14); ctx.lineTo(-4, -20); ctx.lineTo(-1, -14);
840
- ctx.moveTo(1, -14); ctx.lineTo(4, -20); ctx.lineTo(8, -14);
841
- ctx.fill();
842
-
843
- // Glowing Eyes
844
- ctx.fillStyle = mode === "sleeping" ? "#64748b" : "#ffffff";
845
- ctx.beginPath();
846
- ctx.arc(-4, -8, 1.5, 0, Math.PI * 2);
847
- ctx.arc(4, -8, 1.5, 0, Math.PI * 2);
848
- ctx.fill();
849
- }
850
-
851
- ctx.restore();
852
- }
853
86
 
854
87
  // --------------------------------------------------------------------------
855
88
  // ACTIONS: RANDOMIZE, RESET, APPLY LOADOUT
@@ -957,7 +190,7 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
957
190
  </span>
958
191
  </div>
959
192
  <p className="text-xs text-slate-400">
960
- Mix and match 1,010 skins, desk props, cyber pets, auras, and floor themes with live animated actions.
193
+ Mix and match 148 skins, desk props, cyber pets, auras, and floor themes with live animated actions.
961
194
  </p>
962
195
  </div>
963
196
  </div>
@@ -1024,18 +257,37 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
1024
257
  </div>
1025
258
  </div>
1026
259
 
1027
- {/* Canvas Stage Viewport */}
260
+ {/* Live React SVG Agent Viewport */}
1028
261
  <div className="relative rounded-lg overflow-hidden border border-[#2d2d3a] bg-[#0c0d12] flex items-center justify-center shadow-inner h-[380px]">
1029
- <canvas ref={canvasRef} width={640} height={460} className="w-full h-full block select-none" />
262
+ <LiveReactAgent
263
+ skinId={activeSkinId}
264
+ skinItem={currentSkinItem}
265
+ petId={activePetId}
266
+ petItem={currentPetItem}
267
+ propsList={activeProps}
268
+ auraId={activeAuraId}
269
+ auraItem={currentAuraItem}
270
+ themeId={activeThemeId}
271
+ themeItem={currentThemeItem}
272
+ mode={currentMode}
273
+ intensity={intensity}
274
+ clientType={clientType}
275
+ isPlaying={isPlaying}
276
+ interactive={true}
277
+ showFloor={true}
278
+ showDesk={true}
279
+ onTelemetry={setTelemetry}
280
+ className="w-full h-full"
281
+ />
1030
282
 
1031
283
  {/* Theme Badge Overlay */}
1032
- <div className="absolute top-2.5 left-2.5 px-2.5 py-1 rounded-md bg-black/60 backdrop-blur-md border border-white/10 text-[10px] font-mono text-slate-300 flex items-center gap-1.5">
284
+ <div className="absolute top-2.5 left-2.5 px-2.5 py-1 rounded-md bg-black/60 backdrop-blur-md border border-white/10 text-[10px] font-mono text-slate-300 flex items-center gap-1.5 pointer-events-none z-10">
1033
285
  <Palette className="w-3 h-3 text-cyan-400" />
1034
286
  <span>{currentThemeItem?.name || "Classic Slate"}</span>
1035
287
  </div>
1036
288
 
1037
289
  {/* Action Mode Overlay */}
1038
- <div className="absolute top-2.5 right-2.5 px-2.5 py-1 rounded-md bg-black/60 backdrop-blur-md border border-white/10 text-[10px] font-mono font-bold text-cyan-300 uppercase">
290
+ <div className="absolute top-2.5 right-2.5 px-2.5 py-1 rounded-md bg-black/60 backdrop-blur-md border border-white/10 text-[10px] font-mono font-bold text-cyan-300 uppercase pointer-events-none z-10">
1039
291
  {currentMode}
1040
292
  </div>
1041
293
  </div>
@@ -1118,6 +370,18 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
1118
370
  </div>
1119
371
  </div>
1120
372
 
373
+ {/* Active VFX Indicator */}
374
+ <div className="flex items-center justify-between px-2.5 py-1.5 rounded-lg bg-[#13141a] border border-[#272836] text-[11px]">
375
+ <div className="flex items-center gap-1.5 text-slate-300">
376
+ <Sparkles className="w-3.5 h-3.5 text-cyan-400" />
377
+ <span className="text-slate-400">Equipped VFX:</span>
378
+ <span className="font-bold text-cyan-300 truncate max-w-[200px]">{currentAuraItem?.name || "None"}</span>
379
+ </div>
380
+ <span className="px-1.5 py-0.5 rounded bg-cyan-500/20 text-cyan-300 font-mono font-bold text-[9px] uppercase border border-cyan-500/30">
381
+ Live 60 FPS VFX
382
+ </span>
383
+ </div>
384
+
1121
385
  {/* Live Telemetry Measurements */}
1122
386
  <div className="grid grid-cols-4 gap-2 p-2 rounded-lg bg-[#121217] border border-[#252530] text-[10px] font-mono text-center">
1123
387
  <div>
@@ -1148,11 +412,11 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
1148
412
  {/* Mixer Category Navigation Tabs */}
1149
413
  <div className="flex items-center gap-1.5 border-b border-[#2b2b38] pb-2 overflow-x-auto">
1150
414
  {[
1151
- { id: "skins", label: "Skins (250)", icon: Bot, count: 250 },
1152
- { id: "props", label: "Props (350)", icon: Laptop, count: 350 },
1153
- { id: "pets", label: "Pets (200)", icon: Sparkles, count: 200 },
1154
- { id: "auras", label: "Auras (100)", icon: Layers, count: 100 },
1155
- { id: "themes", label: "Themes (10)", icon: Palette, count: 10 },
415
+ { id: "skins", label: `Skins (${(COSMETIC_CATALOG.skins || []).length})`, icon: Bot, count: (COSMETIC_CATALOG.skins || []).length },
416
+ { id: "props", label: `Props (${(COSMETIC_CATALOG.props || []).length})`, icon: Laptop, count: (COSMETIC_CATALOG.props || []).length },
417
+ { id: "pets", label: `Pets (${(COSMETIC_CATALOG.pets || []).length})`, icon: Sparkles, count: (COSMETIC_CATALOG.pets || []).length },
418
+ { id: "auras", label: `Auras (${(COSMETIC_CATALOG.auras || []).length})`, icon: Layers, count: (COSMETIC_CATALOG.auras || []).length },
419
+ { id: "themes", label: `Themes (${(COSMETIC_CATALOG.officeThemes || []).length})`, icon: Palette, count: (COSMETIC_CATALOG.officeThemes || []).length },
1156
420
  ].map((tab) => {
1157
421
  const Icon = tab.icon;
1158
422
  const active = mixerTab === tab.id;
@@ -1196,13 +460,12 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
1196
460
  onChange={(e) => setArchetypeFilter(e.target.value)}
1197
461
  className="bg-[#111116] border border-[#2b2b36] rounded-lg px-2.5 py-1.5 text-xs text-slate-300 focus:outline-none"
1198
462
  >
1199
- <option value="all">All Archetypes</option>
1200
- <option value="cyber_cat">Cyber Cat</option>
1201
- <option value="stealth_ninja">Stealth Ninja</option>
1202
- <option value="mecha_pilot">Mecha Pilot</option>
1203
- <option value="matrix_hacker">Matrix Hacker</option>
1204
- <option value="celestial_astro">Celestial</option>
1205
- <option value="cyber_suit">Cyber Suit</option>
463
+ <option value="all">All Archetypes (50)</option>
464
+ <option value="cyber_suit">Cyber Suit (10)</option>
465
+ <option value="mecha_pilot">Mecha Pilot (10)</option>
466
+ <option value="stealth_ninja">Stealth Ninja (10)</option>
467
+ <option value="matrix_hacker">Matrix Hacker (10)</option>
468
+ <option value="celestial_astro">Celestial Astro (10)</option>
1206
469
  </select>
1207
470
  )}
1208
471
  </div>
@@ -1276,11 +539,12 @@ export default function LiveFittingRoom({ initialStoreState, onEquipSuccess }) {
1276
539
 
1277
540
  {/* Loadout Summary Footer */}
1278
541
  <div className="pt-2 border-t border-[#262632] flex flex-wrap items-center justify-between text-[11px] text-slate-400">
1279
- <div className="truncate">
542
+ <div className="truncate max-w-[80%]">
1280
543
  <span>Loadout: </span>
1281
- <strong className="text-slate-200">{currentSkinItem?.name}</strong> +{" "}
544
+ <strong className="text-slate-200">{currentSkinItem?.name || "Agent"}</strong> +{" "}
1282
545
  <strong className="text-slate-200">{activeProps.length} Props</strong> +{" "}
1283
- <strong className="text-slate-200">{currentPetItem?.name}</strong>
546
+ <strong className="text-slate-200">{currentPetItem?.name || "None"}</strong> +{" "}
547
+ <strong className="text-cyan-300">{currentAuraItem?.name || "No VFX"}</strong>
1284
548
  </div>
1285
549
  <button
1286
550
  onClick={handleApplyLoadout}