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
@@ -53,12 +53,12 @@ export default function BottomPanel({
53
53
  return new Date().toLocaleTimeString();
54
54
  };
55
55
 
56
- traces.forEach((t) => {
56
+ traces.forEach((t, tIdx) => {
57
57
  const account = t.account || "Agent";
58
58
  const model = t.model || "gemini-3.8-flash";
59
59
  const clientType = t.clientType || (t.provider?.includes("app") ? "app" : "cli");
60
60
  const provider = t.provider || "gemini";
61
- const connId = t.connectionId || t.traceId || "agent";
61
+ const traceUniqueId = t.traceId || t.connectionId || `trace-${tIdx}`;
62
62
 
63
63
  // 1. Incorporate actual real-time event logs if present
64
64
  if (Array.isArray(t.logs) && t.logs.length > 0) {
@@ -66,7 +66,7 @@ export default function BottomPanel({
66
66
  const rawType = (logItem.type || "").toUpperCase();
67
67
  const level = rawType.includes("ERR") ? "ERROR" : rawType.includes("TOOL") ? "TOOL" : "STREAM";
68
68
  list.push({
69
- id: `${connId}-${logItem.timestamp || lIdx}-${lIdx}`,
69
+ id: `${traceUniqueId}-${logItem.timestamp || lIdx}-${lIdx}`,
70
70
  time: formatLogTime(logItem.timestamp),
71
71
  level,
72
72
  provider,
@@ -81,7 +81,7 @@ export default function BottomPanel({
81
81
  // Fallback to trace state snapshot with stable IDs
82
82
  if (t.activeTool) {
83
83
  list.push({
84
- id: `${connId}-tool-${t.activeTool}`,
84
+ id: `${traceUniqueId}-tool-${t.activeTool}`,
85
85
  time: formatLogTime(t.timestamp),
86
86
  level: "TOOL",
87
87
  provider,
@@ -95,7 +95,7 @@ export default function BottomPanel({
95
95
 
96
96
  if (t.state === "streaming" || t.state === "busy") {
97
97
  list.push({
98
- id: `${connId}-stream`,
98
+ id: `${traceUniqueId}-stream`,
99
99
  time: formatLogTime(t.timestamp),
100
100
  level: "STREAM",
101
101
  provider,
@@ -108,7 +108,7 @@ export default function BottomPanel({
108
108
 
109
109
  if (t.state === "error") {
110
110
  list.push({
111
- id: `${connId}-err`,
111
+ id: `${traceUniqueId}-err`,
112
112
  time: formatLogTime(t.timestamp),
113
113
  level: "ERROR",
114
114
  provider,
@@ -22,6 +22,7 @@ import {
22
22
  Type,
23
23
  Files,
24
24
  FolderTree,
25
+ Maximize2,
25
26
  } from "lucide-react";
26
27
  import { openChatInNewWindow } from "../../lib/windowManager.js";
27
28
 
@@ -34,6 +35,7 @@ export default function CommandPalette({
34
35
  onToggleLeftSidebar,
35
36
  onToggleBottomPanel,
36
37
  onToggleRightSidebar,
38
+ onToggleZenFullscreen,
37
39
  onOpenChatSidebar,
38
40
  onOpenFilesExplorer,
39
41
  onToggleSound,
@@ -96,6 +98,16 @@ export default function CommandPalette({
96
98
  onClose();
97
99
  },
98
100
  },
101
+ {
102
+ id: "toggle-zen-fullscreen",
103
+ title: "View: Toggle Virtual Office Chill Mode (Full Screen)",
104
+ shortcut: "Shift+F",
105
+ icon: Maximize2,
106
+ action: () => {
107
+ onToggleZenFullscreen?.();
108
+ onClose();
109
+ },
110
+ },
99
111
  {
100
112
  id: "toggle-right",
101
113
  title: "View: Toggle Secondary Side Bar (Live Chat & Inspector)",
@@ -21,6 +21,8 @@ export default function EditorTabs({
21
21
  activeTabId = "canvas",
22
22
  onSelectTab,
23
23
  onCloseTab,
24
+ isZenFullscreen = false,
25
+ onToggleZenFullscreen = null,
24
26
  }) {
25
27
  const containerRef = useRef(null);
26
28
 
@@ -93,6 +95,21 @@ export default function EditorTabs({
93
95
 
94
96
  {/* Right Tab Controls */}
95
97
  <div className="flex items-center px-2 gap-1 bg-[#252526] border-l border-[#1e1e1e] shrink-0 h-full">
98
+ {onToggleZenFullscreen && activeTabId === "canvas" && (
99
+ <button
100
+ type="button"
101
+ data-testid="editor-zen-fullscreen-btn"
102
+ onClick={onToggleZenFullscreen}
103
+ title={
104
+ isZenFullscreen
105
+ ? "Thoát toàn màn hình (ESC)"
106
+ : "Chế độ Chill toàn màn hình Virtual Office (Shift+F / ESC để thoát)"
107
+ }
108
+ className="p-1 mr-0.5 rounded text-slate-400 hover:text-cyan-300 hover:bg-[#333333] transition-colors cursor-pointer"
109
+ >
110
+ <Maximize2 className="w-3.5 h-3.5" />
111
+ </button>
112
+ )}
96
113
  <button
97
114
  onClick={() => {
98
115
  if (containerRef.current) {
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
 
3
3
  import React from "react";
4
- import { PanelLeft, PanelBottom, PanelRight } from "lucide-react";
4
+ import { PanelLeft, PanelBottom, PanelRight, Maximize2, Minimize2 } from "lucide-react";
5
5
 
6
6
  /**
7
7
  * VS Code Standard Layout Control Buttons
8
- * Renders 3 toggles: Primary Side Bar (Left), Bottom Panel, Secondary Side Bar (Right)
8
+ * Renders layout toggles: Primary Side Bar (Left), Bottom Panel, Secondary Side Bar (Right), Fullscreen Chill Mode
9
9
  */
10
10
  export default function LayoutToggles({
11
11
  isLeftSidebarVisible,
@@ -14,6 +14,8 @@ export default function LayoutToggles({
14
14
  onToggleLeftSidebar,
15
15
  onToggleBottomPanel,
16
16
  onToggleRightSidebar,
17
+ isZenFullscreen = false,
18
+ onToggleZenFullscreen = null,
17
19
  }) {
18
20
  const getButtonClass = (isActive) =>
19
21
  `inline-flex items-center justify-center p-1 rounded transition-colors ${
@@ -56,6 +58,33 @@ export default function LayoutToggles({
56
58
  >
57
59
  <PanelRight className="w-3.5 h-3.5" />
58
60
  </button>
61
+
62
+ {onToggleZenFullscreen && (
63
+ <>
64
+ <div className="w-[1px] h-3 bg-[#333333] my-auto mx-0.5" />
65
+ <button
66
+ type="button"
67
+ data-testid="toggle-zen-fullscreen"
68
+ title={
69
+ isZenFullscreen
70
+ ? "Thoát chế độ toàn màn hình Chill Mode (ESC)"
71
+ : "Chế độ Chill toàn màn hình Virtual Office (Shift+F / ESC để thoát)"
72
+ }
73
+ onClick={onToggleZenFullscreen}
74
+ className={`inline-flex items-center justify-center p-1 rounded transition-colors ${
75
+ isZenFullscreen
76
+ ? "bg-amber-500/20 border border-amber-500/50 text-amber-300 shadow-sm"
77
+ : "border border-transparent text-[#858585] hover:text-[#4fc1ff] hover:bg-[#2a2d2e]"
78
+ }`}
79
+ >
80
+ {isZenFullscreen ? (
81
+ <Minimize2 className="w-3.5 h-3.5 text-amber-400" />
82
+ ) : (
83
+ <Maximize2 className="w-3.5 h-3.5" />
84
+ )}
85
+ </button>
86
+ </>
87
+ )}
59
88
  </div>
60
89
  );
61
90
  }
@@ -20,8 +20,11 @@ import {
20
20
  Bot,
21
21
  ShoppingBag,
22
22
  Blocks,
23
+ Monitor,
24
+ TerminalSquare,
23
25
  } from "lucide-react";
24
26
  import FileExplorer from "./FileExplorer";
27
+ import { TOTAL_CATALOG_COUNT } from "@/lib/catalog/index.js";
25
28
 
26
29
  export default function LeftSidebar({
27
30
  workstations = [],
@@ -72,6 +75,9 @@ export default function LeftSidebar({
72
75
  const groupedAgents = useMemo(() => {
73
76
  const groups = {
74
77
  extensions: [],
78
+ desktop: [],
79
+ codexDesktop: [],
80
+ codexCli: [],
75
81
  geminiApp: [],
76
82
  geminiCli: [],
77
83
  claude: [],
@@ -85,11 +91,23 @@ export default function LeftSidebar({
85
91
  const conn = (w.connectionId || "").toLowerCase();
86
92
  const model = (w.model || "").toLowerCase();
87
93
 
94
+ const isCodex = cli === "codex" || p.includes("codex") || conn.includes("codex");
88
95
  const isExtension = ct === "extension" || ct === "ide" || conn.includes("extension");
96
+ const isDesktop = ct === "desktop" || conn.includes("desktop");
89
97
  const isClaude = cli === "claude" || p.includes("claude") || p.includes("anthropic") || model.includes("claude");
90
98
 
91
- if (isExtension) {
99
+ if (isCodex) {
100
+ if (isExtension) {
101
+ groups.extensions.push(w);
102
+ } else if (isDesktop || ct === "app" || conn.includes("app")) {
103
+ groups.codexDesktop.push(w);
104
+ } else {
105
+ groups.codexCli.push(w);
106
+ }
107
+ } else if (isExtension) {
92
108
  groups.extensions.push(w);
109
+ } else if (isDesktop) {
110
+ groups.desktop.push(w);
93
111
  } else if (ct === "app" || p.includes("app") || conn.includes("app")) {
94
112
  groups.geminiApp.push(w);
95
113
  } else if (isClaude) {
@@ -118,6 +136,10 @@ export default function LeftSidebar({
118
136
  agent.clientType === "extension" ||
119
137
  (agent.provider || "").includes("extension") ||
120
138
  (agent.connectionId || "").toLowerCase().includes("extension");
139
+ const isDesktop =
140
+ agent.clientType === "desktop" ||
141
+ (agent.connectionId || "").toLowerCase().includes("desktop");
142
+ const isCodex = agent.cli === "codex" || (agent.connectionId || "").toLowerCase().includes("codex");
121
143
 
122
144
  const previewText = agent.lastText
123
145
  ? `${agent.lastTextRole === "assistant" ? "AI: " : agent.lastTextRole === "user" ? "You: " : ""}${agent.lastText}`
@@ -125,7 +147,7 @@ export default function LeftSidebar({
125
147
 
126
148
  return (
127
149
  <div
128
- key={agent.connectionId || `agent-${idx}`}
150
+ key={agent.traceId || agent.connectionId || `agent-${idx}`}
129
151
  onClick={() => {
130
152
  onSelectAgent?.(agent.connectionId);
131
153
  onOpenAgentTab?.(agent);
@@ -156,11 +178,27 @@ export default function LeftSidebar({
156
178
  {sessionTitle}
157
179
  </span>
158
180
 
159
- {/* Client Tag: EXT vs APP vs CLI */}
160
- {isExt ? (
181
+ {/* Client Tag: CODEX vs EXT vs DESKTOP vs APP vs CLI */}
182
+ {isCodex ? (
183
+ <span
184
+ className={`shrink-0 text-[9px] font-bold px-1 rounded uppercase tracking-wider border ${
185
+ isExt
186
+ ? "bg-sky-950/80 text-sky-300 border-sky-500/40"
187
+ : isDesktop || isApp
188
+ ? "bg-teal-950/80 text-teal-300 border-teal-500/40"
189
+ : "bg-teal-950/80 text-teal-300 border-teal-500/40"
190
+ }`}
191
+ >
192
+ {isExt ? "EXT" : isDesktop || isApp ? "DESK" : "CLI"}
193
+ </span>
194
+ ) : isExt ? (
161
195
  <span className="shrink-0 bg-sky-950/80 text-sky-300 border border-sky-500/40 text-[9px] font-bold px-1 rounded uppercase tracking-wider">
162
196
  EXT
163
197
  </span>
198
+ ) : isDesktop ? (
199
+ <span className="shrink-0 bg-orange-950/80 text-orange-300 border border-orange-500/40 text-[9px] font-bold px-1 rounded uppercase tracking-wider">
200
+ DESK
201
+ </span>
164
202
  ) : isApp ? (
165
203
  <span className="shrink-0 bg-purple-950/80 text-purple-300 border border-purple-500/40 text-[9px] font-bold px-1 rounded uppercase tracking-wider">
166
204
  APP
@@ -321,6 +359,39 @@ export default function LeftSidebar({
321
359
  </div>
322
360
  )}
323
361
 
362
+ {/* Claude Desktop */}
363
+ {groupedAgents.desktop?.length > 0 && (
364
+ <div className="mb-2">
365
+ <div className="px-3 py-1 text-[9px] font-bold uppercase tracking-wider text-orange-400/90 flex items-center gap-1">
366
+ <Monitor className="w-2.5 h-2.5" />
367
+ <span>Claude Desktop ({groupedAgents.desktop.length})</span>
368
+ </div>
369
+ {groupedAgents.desktop.map(renderAgentRow)}
370
+ </div>
371
+ )}
372
+
373
+ {/* Codex Desktop App */}
374
+ {groupedAgents.codexDesktop?.length > 0 && (
375
+ <div className="mb-2">
376
+ <div className="px-3 py-1 text-[9px] font-bold uppercase tracking-wider text-teal-400/90 flex items-center gap-1">
377
+ <Monitor className="w-2.5 h-2.5" />
378
+ <span>Codex Desktop App ({groupedAgents.codexDesktop.length})</span>
379
+ </div>
380
+ {groupedAgents.codexDesktop.map(renderAgentRow)}
381
+ </div>
382
+ )}
383
+
384
+ {/* Codex CLI */}
385
+ {groupedAgents.codexCli?.length > 0 && (
386
+ <div className="mb-2">
387
+ <div className="px-3 py-1 text-[9px] font-bold uppercase tracking-wider text-teal-400/90 flex items-center gap-1">
388
+ <TerminalSquare className="w-2.5 h-2.5" />
389
+ <span>Codex CLI ({groupedAgents.codexCli.length})</span>
390
+ </div>
391
+ {groupedAgents.codexCli.map(renderAgentRow)}
392
+ </div>
393
+ )}
394
+
324
395
  {/* Gemini App Agents */}
325
396
  {groupedAgents.geminiApp.length > 0 && (
326
397
  <div className="mb-2">
@@ -423,6 +494,17 @@ export default function LeftSidebar({
423
494
  <Folder className="w-3.5 h-3.5 text-amber-400 shrink-0" />
424
495
  <span className="truncate font-mono text-[10px]">~/.claude/projects</span>
425
496
  </div>
497
+ <div
498
+ onClick={() => {
499
+ setExplorerPath("~/.codex/sessions");
500
+ setActiveSidebarTab("files");
501
+ }}
502
+ className="flex items-center gap-2 text-slate-400 hover:text-teal-300 cursor-pointer p-1 rounded hover:bg-[#252526] transition-colors"
503
+ title="Click to browse Codex Sessions files"
504
+ >
505
+ <Folder className="w-3.5 h-3.5 text-teal-400 shrink-0" />
506
+ <span className="truncate font-mono text-[10px]">~/.codex/sessions</span>
507
+ </div>
426
508
  </div>
427
509
  )}
428
510
  </div>
@@ -470,13 +552,13 @@ export default function LeftSidebar({
470
552
  type="button"
471
553
  onClick={onOpenStore}
472
554
  className="w-full flex items-center justify-between p-2 rounded-lg bg-gradient-to-r from-amber-500/15 to-amber-600/10 hover:from-amber-500/25 hover:to-amber-600/20 border border-amber-500/30 text-amber-300 transition-all cursor-pointer text-xs"
473
- title="Open Supporter Store: 1,000 Tech Items & 3D Effects"
555
+ title={`Open Supporter Store: ${TOTAL_CATALOG_COUNT} Tech Items & 3D Effects`}
474
556
  >
475
557
  <div className="flex items-center gap-2">
476
558
  <ShoppingBag className="w-4 h-4 text-amber-400" />
477
559
  <div className="text-left">
478
560
  <div className="font-bold text-white text-[11px] leading-tight">Supporter Store</div>
479
- <div className="text-[10px] text-amber-400/80">1,000 Tech Items & 3D Effects</div>
561
+ <div className="text-[10px] text-amber-400/80">{TOTAL_CATALOG_COUNT} Tech Items & 3D Effects</div>
480
562
  </div>
481
563
  </div>
482
564
  <span className="text-[9px] font-mono px-1.5 py-0.5 rounded bg-amber-500/20 border border-amber-500/40">
@@ -63,10 +63,10 @@ export default function RightSidebar({
63
63
  return (
64
64
  <div
65
65
  data-testid="secondary-sidebar-container"
66
- className="flex flex-col h-full w-full bg-[#1e1e1e] text-[#cccccc] select-none overflow-hidden"
66
+ className="flex flex-col h-full w-full bg-[var(--bg-editor)] text-[var(--text-main)] select-none overflow-hidden"
67
67
  >
68
68
  {/* 1. Header with Tab Switches (Live Chat & Inspector) */}
69
- <div className="h-[36px] min-h-[36px] bg-[#252526] border-b border-[#1e1e1e] px-2 flex items-center justify-between shrink-0">
69
+ <div className="h-[36px] min-h-[36px] bg-[var(--bg-card)] border-b border-[var(--border-subtle)] px-2 flex items-center justify-between shrink-0">
70
70
  {/* Navigation Tabs */}
71
71
  <div className="flex items-center gap-1">
72
72
  {/* Tab 1: Live Chat */}
@@ -75,8 +75,8 @@ export default function RightSidebar({
75
75
  onClick={() => handleTabClick("chat")}
76
76
  className={`flex items-center gap-1.5 px-2.5 py-1 rounded text-xs font-semibold transition-colors cursor-pointer ${
77
77
  currentTab === "chat"
78
- ? "bg-[#1e1e1e] text-cyan-400 border border-[#3e3e42]"
79
- : "text-slate-400 hover:text-slate-200 hover:bg-[#2d2d2d]"
78
+ ? "bg-[var(--bg-editor)] text-[var(--accent-primary)] border border-[var(--border-card)]"
79
+ : "text-[var(--text-muted)] hover:text-[var(--text-bright)] hover:bg-[var(--bg-hover)]"
80
80
  }`}
81
81
  title="View Agent Live Chat & Conversation Transcript"
82
82
  >
@@ -98,8 +98,8 @@ export default function RightSidebar({
98
98
  onClick={() => handleTabClick("inspector")}
99
99
  className={`flex items-center gap-1.5 px-2.5 py-1 rounded text-xs font-semibold transition-colors cursor-pointer ${
100
100
  currentTab === "inspector"
101
- ? "bg-[#1e1e1e] text-cyan-400 border border-[#3e3e42]"
102
- : "text-slate-400 hover:text-slate-200 hover:bg-[#2d2d2d]"
101
+ ? "bg-[var(--bg-editor)] text-[var(--accent-primary)] border border-[var(--border-card)]"
102
+ : "text-[var(--text-muted)] hover:text-[var(--text-bright)] hover:bg-[var(--bg-hover)]"
103
103
  }`}
104
104
  title="View Agent specs, telemetry, and token usage"
105
105
  >
@@ -115,7 +115,7 @@ export default function RightSidebar({
115
115
  <button
116
116
  onClick={() => openChatInNewWindow(selectedAgent.connectionId || selectedAgent.traceId)}
117
117
  title="Open in Detached Window (VS Code style)"
118
- className="p-1 rounded text-slate-400 hover:text-cyan-300 hover:bg-[#333333] transition-colors cursor-pointer"
118
+ className="p-1 rounded text-[var(--text-muted)] hover:text-[var(--accent-primary)] hover:bg-[var(--bg-hover)] transition-colors cursor-pointer"
119
119
  >
120
120
  <AppWindow className="w-3.5 h-3.5" />
121
121
  </button>
@@ -125,7 +125,7 @@ export default function RightSidebar({
125
125
  <button
126
126
  onClick={onClose}
127
127
  title="Close Secondary Sidebar (Cmd+Alt+B)"
128
- className="p-1 rounded text-slate-400 hover:text-white hover:bg-[#333333] transition-colors cursor-pointer"
128
+ className="p-1 rounded text-[var(--text-muted)] hover:text-[var(--text-bright)] hover:bg-[var(--bg-hover)] transition-colors cursor-pointer"
129
129
  >
130
130
  <X className="w-3.5 h-3.5" />
131
131
  </button>
@@ -69,7 +69,7 @@ export default function StatusBar({
69
69
  <span>({selectedAgent.model || "gemini-3.8-flash"})</span>
70
70
  </div>
71
71
  ) : (
72
- <span>Ready · Real-time monitoring Antigravity CLI, App & Claude</span>
72
+ <span>Ready · Real-time monitoring Antigravity, Claude & Codex (CLI & Desktop)</span>
73
73
  )}
74
74
  </div>
75
75
 
@@ -15,6 +15,8 @@ import {
15
15
  Coffee,
16
16
  Palette,
17
17
  Sparkles,
18
+ ListFilter,
19
+ Clock,
18
20
  } from "lucide-react";
19
21
  import LayoutToggles from "./LayoutToggles";
20
22
 
@@ -34,6 +36,12 @@ const PRESETS = [
34
36
 
35
37
  export default function TitleBar({
36
38
  stats = {},
39
+ traces = [],
40
+ totalCount = 0,
41
+ top = 20,
42
+ onTopChange,
43
+ timeframe = "24h",
44
+ onTimeframeChange,
37
45
  mode = "live",
38
46
  mockPreset = "cases",
39
47
  onModeChange,
@@ -53,6 +61,8 @@ export default function TitleBar({
53
61
  onToggleLeftSidebar,
54
62
  onToggleBottomPanel,
55
63
  onToggleRightSidebar,
64
+ isZenFullscreen = false,
65
+ onToggleZenFullscreen = null,
56
66
  }) {
57
67
  return (
58
68
  <header className="h-[34px] min-h-[34px] bg-[#1e1e1e] border-b border-[#2b2b2b] flex items-center justify-between px-3 text-[#cccccc] text-xs select-none shrink-0 z-40">
@@ -101,7 +111,11 @@ export default function TitleBar({
101
111
  className="hidden xl:flex items-center gap-1.5 bg-[#252526] hover:bg-[#2d2d2e] border border-[#333333] hover:border-[#007acc] px-2 py-0.5 rounded text-[11px] cursor-pointer transition-colors"
102
112
  >
103
113
  <span className="text-slate-400">Desks:</span>
104
- <span className="font-bold text-slate-200">{stats?.agents ?? 0}</span>
114
+ <span className="font-bold text-slate-200">
115
+ {totalCount > 0 && traces.length > 0 && traces.length < totalCount
116
+ ? `${traces.length}/${totalCount}`
117
+ : (stats?.agents ?? traces.length ?? 0)}
118
+ </span>
105
119
  <span className="text-slate-600">|</span>
106
120
  <span className="text-slate-400">Active:</span>
107
121
  <span className="font-bold text-cyan-400">{stats?.busy ?? 0}</span>
@@ -110,6 +124,64 @@ export default function TitleBar({
110
124
  <span className="font-bold text-emerald-400">{stats?.tokensLabel ?? "0k"}</span>
111
125
  </div>
112
126
 
127
+ {/* Filter Controls: Top N & Timeframe */}
128
+ <div
129
+ data-testid="telemetry-filter-controls"
130
+ title="Filter active conversations by quantity and time range"
131
+ className="flex items-center rounded bg-[#252526] border border-[#333333] px-1.5 py-0.5 text-[11px] text-slate-300 gap-1.5 shadow-sm"
132
+ >
133
+ <div className="flex items-center gap-1 text-slate-400">
134
+ <ListFilter className="w-3 h-3 text-cyan-400 shrink-0" />
135
+ <span className="hidden 2xl:inline text-[10px] uppercase font-bold tracking-wider text-slate-400">Filter</span>
136
+ </div>
137
+
138
+ {/* Top N Dropdown */}
139
+ <select
140
+ data-testid="filter-top-select"
141
+ aria-label="Filter Top Conversations"
142
+ value={top}
143
+ onChange={(e) => onTopChange?.(e.target.value === "all" ? "all" : Number(e.target.value))}
144
+ className="bg-transparent text-[11px] text-slate-200 outline-none cursor-pointer hover:text-white font-medium pr-0.5"
145
+ >
146
+ <option value={10} className="bg-[#1e1e1e] text-slate-200">Top 10</option>
147
+ <option value={20} className="bg-[#1e1e1e] text-slate-200">Top 20</option>
148
+ <option value={30} className="bg-[#1e1e1e] text-slate-200">Top 30</option>
149
+ <option value={50} className="bg-[#1e1e1e] text-slate-200">Top 50</option>
150
+ <option value="all" className="bg-[#1e1e1e] text-slate-200">All Desks</option>
151
+ </select>
152
+
153
+ <span className="text-slate-600">|</span>
154
+
155
+ {/* Timeframe Dropdown */}
156
+ <div className="flex items-center gap-1">
157
+ <Clock className="w-3 h-3 text-amber-400 shrink-0" />
158
+ <select
159
+ data-testid="filter-timeframe-select"
160
+ aria-label="Filter Time Range"
161
+ value={timeframe}
162
+ onChange={(e) => onTimeframeChange?.(e.target.value)}
163
+ className="bg-transparent text-[11px] text-slate-200 outline-none cursor-pointer hover:text-white font-medium"
164
+ >
165
+ <option value="1h" className="bg-[#1e1e1e] text-slate-200">1h</option>
166
+ <option value="6h" className="bg-[#1e1e1e] text-slate-200">6h</option>
167
+ <option value="24h" className="bg-[#1e1e1e] text-slate-200">24h</option>
168
+ <option value="3d" className="bg-[#1e1e1e] text-slate-200">3d</option>
169
+ <option value="7d" className="bg-[#1e1e1e] text-slate-200">7d</option>
170
+ <option value="all" className="bg-[#1e1e1e] text-slate-200">All time</option>
171
+ </select>
172
+ </div>
173
+
174
+ {/* Filtered badge */}
175
+ {totalCount > 0 && traces.length > 0 && traces.length < totalCount && (
176
+ <span
177
+ title={`Showing ${traces.length} of ${totalCount} recorded conversations`}
178
+ className="hidden lg:inline-flex items-center px-1.5 py-0.2 rounded text-[10px] font-mono bg-cyan-950/60 text-cyan-300 border border-cyan-800/50"
179
+ >
180
+ {traces.length}/{totalCount}
181
+ </span>
182
+ )}
183
+ </div>
184
+
113
185
  {/* Quick Reports Button */}
114
186
  <button
115
187
  onClick={onOpenReports}
@@ -239,7 +311,7 @@ export default function TitleBar({
239
311
  {notifEnabled ? <Bell className="w-3 h-3" /> : <BellOff className="w-3 h-3" />}
240
312
  </button>
241
313
 
242
- {/* Layout Toggles (Left, Bottom, Right) */}
314
+ {/* Layout Toggles (Left, Bottom, Right, Chill Fullscreen) */}
243
315
  <LayoutToggles
244
316
  isLeftSidebarVisible={layout?.isLeftSidebarVisible}
245
317
  isBottomPanelVisible={layout?.isBottomPanelVisible}
@@ -247,6 +319,8 @@ export default function TitleBar({
247
319
  onToggleLeftSidebar={onToggleLeftSidebar}
248
320
  onToggleBottomPanel={onToggleBottomPanel}
249
321
  onToggleRightSidebar={onToggleRightSidebar}
322
+ isZenFullscreen={isZenFullscreen}
323
+ onToggleZenFullscreen={onToggleZenFullscreen}
250
324
  />
251
325
  </div>
252
326
  </header>