agmon 0.2.1 → 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 (152) 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 +16 -15
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +16 -15
  15. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +8 -7
  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 +4 -4
  30. package/.next/server/app/chat.segments/_full.segment.rsc +4 -4
  31. package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  32. package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +6 -5
  33. package/.next/server/app/index.html +1 -1
  34. package/.next/server/app/index.rsc +5 -5
  35. package/.next/server/app/index.segments/__PAGE__.segment.rsc +7 -6
  36. package/.next/server/app/index.segments/_full.segment.rsc +5 -5
  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 +2 -2
  44. package/.next/server/app/reports.segments/_full.segment.rsc +2 -2
  45. package/.next/server/app/reports.segments/_tree.segment.rsc +2 -2
  46. package/.next/server/app/reports.segments/reports/__PAGE__.segment.rsc +4 -3
  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 +2 -2
  51. package/.next/server/app/store.segments/_full.segment.rsc +2 -2
  52. package/.next/server/app/store.segments/_tree.segment.rsc +2 -2
  53. package/.next/server/app/store.segments/store/__PAGE__.segment.rsc +4 -3
  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]__1jwplflwix8wi._.js +1 -1
  61. package/.next/server/chunks/ssr/[root-of-the-server]__1jwplflwix8wi._.js.map +1 -1
  62. package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js +1 -1
  63. package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js.map +1 -1
  64. package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js +1 -1
  65. package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js.map +1 -1
  66. package/.next/server/chunks/ssr/{_0--937zhi743v._.js → _0zel-n0h--cnl._.js} +1 -1
  67. package/.next/server/chunks/ssr/{node_modules_0jla9ugf1y6rb._.js → node_modules_01avo0bde3tpo._.js} +1 -1
  68. package/.next/server/chunks/ssr/{node_modules_0sjdrli5douui._.js → node_modules_01l0208e5kqic._.js} +1 -1
  69. package/.next/server/chunks/ssr/{node_modules_0lqovp8j8ld76._.js → node_modules_033x29yqle_sj._.js} +1 -1
  70. package/.next/server/chunks/ssr/{node_modules_05i69rc9pwcdx._.js → node_modules_03wbg__aslvui._.js} +1 -1
  71. package/.next/server/chunks/ssr/{node_modules_1ltys5mwtcv-n._.js → node_modules_08-bqkrz7sh0l._.js} +1 -1
  72. package/.next/server/chunks/ssr/{node_modules_09v49jhajmvl4._.js → node_modules_089w9jm7s2qa3._.js} +2 -2
  73. package/.next/server/chunks/ssr/{node_modules_0z1e37smavebg._.js → node_modules_0cy47-s63xjzh._.js} +2 -2
  74. package/.next/server/chunks/ssr/{node_modules_0dw0vozejrnml._.js → node_modules_0czh0jcnsm5e6._.js} +2 -2
  75. package/.next/server/chunks/ssr/{node_modules_0e3njj436xau-._.js → node_modules_0fv321j1nslkb._.js} +1 -1
  76. package/.next/server/chunks/ssr/{node_modules_0d2ios01ot1in._.js → node_modules_0g-wb7h-hsdwc._.js} +1 -1
  77. package/.next/server/chunks/ssr/{node_modules_1l46or7mgko0z._.js → node_modules_0oz_zzlh8exwx._.js} +1 -1
  78. package/.next/server/chunks/ssr/{node_modules_0b8zi3pbl-y9n._.js → node_modules_0so2agzqd9p8l._.js} +2 -2
  79. package/.next/server/chunks/ssr/{node_modules_1wew4nn7i1uup._.js → node_modules_0w2w61b8bh769._.js} +1 -1
  80. package/.next/server/chunks/ssr/{node_modules_07bjxeq9dfgn1._.js → node_modules_0wd6szix_zku7._.js} +2 -2
  81. package/.next/server/chunks/ssr/{node_modules_1aqaelh-8fme6._.js → node_modules_0wp7omf0xblv8._.js} +1 -1
  82. package/.next/server/chunks/ssr/{node_modules_0xh8tnq1niblb._.js → node_modules_10c51o2qv6mbi._.js} +1 -1
  83. package/.next/server/chunks/ssr/{node_modules_1d4sreyq0ubqg._.js → node_modules_19vqq7rvf-_ar._.js} +2 -2
  84. package/.next/server/chunks/ssr/{node_modules_1e_nc2eyg4djz._.js → node_modules_1hu83gui7_nj2._.js} +1 -1
  85. package/.next/server/chunks/ssr/{node_modules_1zbmc81s-4zsm._.js → node_modules_1j8hpoiygrs5e._.js} +1 -1
  86. package/.next/server/chunks/ssr/{node_modules_1pquu5wprusnc._.js → node_modules_1n4kig4mj6n4s._.js} +2 -2
  87. package/.next/server/chunks/ssr/{node_modules_1st9dwe66yx93._.js → node_modules_1s8oxeqa5_i3k._.js} +1 -1
  88. package/.next/server/chunks/ssr/{node_modules_01p9ctt-n2dxp._.js → node_modules_1xz1dstlo5ri-._.js} +1 -1
  89. package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0kqo9zl9cgwbo._.js → node_modules_katex_dist_katex_mjs_067omoj5szuys._.js} +1 -1
  90. package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js +1 -1
  91. package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js.map +1 -1
  92. package/.next/server/middleware-build-manifest.js +3 -3
  93. package/.next/server/pages/404.html +1 -1
  94. package/.next/server/pages/500.html +1 -1
  95. package/.next/server/preview-props.json +3 -3
  96. package/.next/server/server-reference-manifest.js +1 -1
  97. package/.next/server/server-reference-manifest.json +1 -1
  98. package/.next/static/chunks/0jo6fy2c_gmqn.js +1 -0
  99. package/.next/static/chunks/2q9cwykv6ox1t.css +1 -0
  100. package/.next/static/chunks/{3og0e9qcff393.js → 2zf44j8sjo0w0.js} +4 -4
  101. package/.next/trace +1 -1
  102. package/.next/trace-build +1 -1
  103. package/package.json +1 -1
  104. package/src/app/api/traces/stream/route.js +41 -5
  105. package/src/app/layout.js +2 -1
  106. package/src/app/page.js +17 -1
  107. package/src/components/chat/SessionChatView.js +1 -1
  108. package/src/components/factory/office-canvas.js +32 -1
  109. package/src/components/layout/BottomPanel.jsx +6 -6
  110. package/src/components/layout/LeftSidebar.jsx +62 -4
  111. package/src/components/layout/StatusBar.jsx +1 -1
  112. package/src/components/layout/TitleBar.jsx +71 -1
  113. package/src/components/layout/VSCodeWorkbench.jsx +21 -0
  114. package/src/lib/mockTraces.js +13 -11
  115. package/src/lib/parsers/codexParser.js +373 -0
  116. package/src/lib/parsers/transcriptParser.js +35 -3
  117. package/src/lib/useFactoryTraces.js +70 -5
  118. package/src/lib/watchers/antigravityWatcher.js +15 -1
  119. package/src/lib/watchers/claudeWatcher.js +64 -53
  120. package/src/lib/watchers/codexWatcher.js +482 -0
  121. package/src/lib/watchers/watcherManager.js +46 -30
  122. package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js +0 -3
  123. package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js.map +0 -1
  124. package/.next/static/chunks/17jorrh_pfel_.js +0 -1
  125. package/.next/static/chunks/25l0z48vlvdu4.css +0 -1
  126. /package/.next/server/chunks/ssr/{_0--937zhi743v._.js.map → _0zel-n0h--cnl._.js.map} +0 -0
  127. /package/.next/server/chunks/ssr/{node_modules_0jla9ugf1y6rb._.js.map → node_modules_01avo0bde3tpo._.js.map} +0 -0
  128. /package/.next/server/chunks/ssr/{node_modules_0sjdrli5douui._.js.map → node_modules_01l0208e5kqic._.js.map} +0 -0
  129. /package/.next/server/chunks/ssr/{node_modules_0lqovp8j8ld76._.js.map → node_modules_033x29yqle_sj._.js.map} +0 -0
  130. /package/.next/server/chunks/ssr/{node_modules_05i69rc9pwcdx._.js.map → node_modules_03wbg__aslvui._.js.map} +0 -0
  131. /package/.next/server/chunks/ssr/{node_modules_1ltys5mwtcv-n._.js.map → node_modules_08-bqkrz7sh0l._.js.map} +0 -0
  132. /package/.next/server/chunks/ssr/{node_modules_09v49jhajmvl4._.js.map → node_modules_089w9jm7s2qa3._.js.map} +0 -0
  133. /package/.next/server/chunks/ssr/{node_modules_0z1e37smavebg._.js.map → node_modules_0cy47-s63xjzh._.js.map} +0 -0
  134. /package/.next/server/chunks/ssr/{node_modules_0dw0vozejrnml._.js.map → node_modules_0czh0jcnsm5e6._.js.map} +0 -0
  135. /package/.next/server/chunks/ssr/{node_modules_0e3njj436xau-._.js.map → node_modules_0fv321j1nslkb._.js.map} +0 -0
  136. /package/.next/server/chunks/ssr/{node_modules_0d2ios01ot1in._.js.map → node_modules_0g-wb7h-hsdwc._.js.map} +0 -0
  137. /package/.next/server/chunks/ssr/{node_modules_0xh8tnq1niblb._.js.map → node_modules_0oz_zzlh8exwx._.js.map} +0 -0
  138. /package/.next/server/chunks/ssr/{node_modules_0b8zi3pbl-y9n._.js.map → node_modules_0so2agzqd9p8l._.js.map} +0 -0
  139. /package/.next/server/chunks/ssr/{node_modules_1wew4nn7i1uup._.js.map → node_modules_0w2w61b8bh769._.js.map} +0 -0
  140. /package/.next/server/chunks/ssr/{node_modules_07bjxeq9dfgn1._.js.map → node_modules_0wd6szix_zku7._.js.map} +0 -0
  141. /package/.next/server/chunks/ssr/{node_modules_1aqaelh-8fme6._.js.map → node_modules_0wp7omf0xblv8._.js.map} +0 -0
  142. /package/.next/server/chunks/ssr/{node_modules_1d4sreyq0ubqg._.js.map → node_modules_10c51o2qv6mbi._.js.map} +0 -0
  143. /package/.next/server/chunks/ssr/{node_modules_1l46or7mgko0z._.js.map → node_modules_19vqq7rvf-_ar._.js.map} +0 -0
  144. /package/.next/server/chunks/ssr/{node_modules_1e_nc2eyg4djz._.js.map → node_modules_1hu83gui7_nj2._.js.map} +0 -0
  145. /package/.next/server/chunks/ssr/{node_modules_1zbmc81s-4zsm._.js.map → node_modules_1j8hpoiygrs5e._.js.map} +0 -0
  146. /package/.next/server/chunks/ssr/{node_modules_1pquu5wprusnc._.js.map → node_modules_1n4kig4mj6n4s._.js.map} +0 -0
  147. /package/.next/server/chunks/ssr/{node_modules_1st9dwe66yx93._.js.map → node_modules_1s8oxeqa5_i3k._.js.map} +0 -0
  148. /package/.next/server/chunks/ssr/{node_modules_01p9ctt-n2dxp._.js.map → node_modules_1xz1dstlo5ri-._.js.map} +0 -0
  149. /package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0kqo9zl9cgwbo._.js.map → node_modules_katex_dist_katex_mjs_067omoj5szuys._.js.map} +0 -0
  150. /package/.next/static/{1y6Da0YgnPr2_6ncpWrbV → dGN2VKPk5TJgezxS3JvRc}/_buildManifest.js +0 -0
  151. /package/.next/static/{1y6Da0YgnPr2_6ncpWrbV → dGN2VKPk5TJgezxS3JvRc}/_clientMiddlewareManifest.js +0 -0
  152. /package/.next/static/{1y6Da0YgnPr2_6ncpWrbV → dGN2VKPk5TJgezxS3JvRc}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1 +1 @@
1
- [{"name":"generate-buildid","duration":184,"timestamp":25430307705,"id":4,"parentId":1,"tags":{},"startTime":1791447339851,"traceId":"5279fd7c8f9a97fc"},{"name":"load-custom-routes","duration":535,"timestamp":25430308332,"id":5,"parentId":1,"tags":{},"startTime":1791447339851,"traceId":"5279fd7c8f9a97fc"},{"name":"create-dist-dir","duration":13736,"timestamp":25430308949,"id":6,"parentId":1,"tags":{},"startTime":1791447339852,"traceId":"5279fd7c8f9a97fc"},{"name":"clean","duration":137918,"timestamp":25430323158,"id":7,"parentId":1,"tags":{},"startTime":1791447339866,"traceId":"5279fd7c8f9a97fc"},{"name":"discover-routes","duration":21520,"timestamp":25430579571,"id":8,"parentId":1,"tags":{},"startTime":1791447340122,"traceId":"5279fd7c8f9a97fc"},{"name":"create-root-mapping","duration":61,"timestamp":25430601180,"id":9,"parentId":1,"tags":{},"startTime":1791447340144,"traceId":"5279fd7c8f9a97fc"},{"name":"generate-route-types","duration":186475,"timestamp":25430608446,"id":10,"parentId":1,"tags":{},"startTime":1791447340151,"traceId":"5279fd7c8f9a97fc"},{"name":"public-dir-conflict-check","duration":264,"timestamp":25430801112,"id":11,"parentId":1,"tags":{},"startTime":1791447340344,"traceId":"5279fd7c8f9a97fc"},{"name":"generate-routes-manifest","duration":9084,"timestamp":25430801471,"id":12,"parentId":1,"tags":{},"startTime":1791447340344,"traceId":"5279fd7c8f9a97fc"},{"name":"turbopack-emit","duration":239000,"timestamp":25433378697,"id":15,"parentId":1,"tags":{},"startTime":1791447342922,"traceId":"5279fd7c8f9a97fc"},{"name":"run-turbopack","duration":2940856,"timestamp":25430826681,"id":14,"parentId":1,"tags":{},"startTime":1791447340370,"traceId":"5279fd7c8f9a97fc"},{"name":"run-typescript","duration":15643,"timestamp":25433795049,"id":18,"parentId":1,"tags":{},"startTime":1791447343338,"traceId":"5279fd7c8f9a97fc"},{"name":"generate-required-server-files","duration":721,"timestamp":25433811353,"id":20,"parentId":1,"tags":{},"startTime":1791447343354,"traceId":"5279fd7c8f9a97fc"},{"name":"check-static-error-page","duration":172069,"timestamp":25434004706,"id":22,"parentId":21,"tags":{},"startTime":1791447343548,"traceId":"5279fd7c8f9a97fc"},{"name":"turbopack-persistence","duration":379000,"timestamp":25433767657,"id":38,"parentId":1,"tags":{"reason":"stop","snapshot_duration_ms":24.239541,"persist_duration_ms":354.211875,"task_count":2042,"bytes_written":4401880,"bytes_deleted":0},"startTime":1791447343311,"traceId":"5279fd7c8f9a97fc"},{"name":"turbopack-compaction","duration":123000,"timestamp":25434148479,"id":51,"parentId":1,"tags":{"bytes_written":3775615,"bytes_deleted":6161769},"startTime":1791447343691,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":923056,"timestamp":25434178037,"id":37,"parentId":24,"tags":{},"startTime":1791447343721,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1091568,"timestamp":25434009594,"id":24,"parentId":21,"tags":{"page":"/_global-error"},"startTime":1791447343552,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1172087,"timestamp":25434193733,"id":42,"parentId":26,"tags":{},"startTime":1791447343737,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1346296,"timestamp":25434019610,"id":26,"parentId":21,"tags":{"page":"/api/reports/tokens"},"startTime":1791447343562,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1189874,"timestamp":25434197049,"id":47,"parentId":32,"tags":{},"startTime":1791447343740,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1210610,"timestamp":25434176390,"id":32,"parentId":21,"tags":{"page":"/chat"},"startTime":1791447343719,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1199276,"timestamp":25434197104,"id":49,"parentId":34,"tags":{},"startTime":1791447343740,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1219794,"timestamp":25434176643,"id":34,"parentId":21,"tags":{"page":"/reports"},"startTime":1791447343720,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1207273,"timestamp":25434197106,"id":50,"parentId":35,"tags":{},"startTime":1791447343740,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1227757,"timestamp":25434176707,"id":35,"parentId":21,"tags":{"page":"/store"},"startTime":1791447343720,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1233924,"timestamp":25434197094,"id":48,"parentId":33,"tags":{},"startTime":1791447343740,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1255192,"timestamp":25434176560,"id":33,"parentId":21,"tags":{"page":"/"},"startTime":1791447343719,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1247574,"timestamp":25434194195,"id":44,"parentId":28,"tags":{},"startTime":1791447343737,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1421921,"timestamp":25434019890,"id":28,"parentId":21,"tags":{"page":"/api/traces/stream"},"startTime":1791447343563,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1251631,"timestamp":25434193941,"id":43,"parentId":29,"tags":{},"startTime":1791447343737,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1398682,"timestamp":25434047016,"id":29,"parentId":21,"tags":{"page":"/api/version"},"startTime":1791447343590,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1255201,"timestamp":25434195421,"id":45,"parentId":30,"tags":{},"startTime":1791447343738,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1276975,"timestamp":25434173722,"id":30,"parentId":21,"tags":{"page":"/api/workspace/file-content"},"startTime":1791447343717,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1261192,"timestamp":25434196198,"id":46,"parentId":31,"tags":{},"startTime":1791447343739,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1282146,"timestamp":25434175311,"id":31,"parentId":21,"tags":{"page":"/api/workspace/files"},"startTime":1791447343718,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1294471,"timestamp":25434177414,"id":36,"parentId":23,"tags":{},"startTime":1791447343720,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1465665,"timestamp":25434006263,"id":23,"parentId":21,"tags":{"page":"/_not-found"},"startTime":1791447343549,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1291571,"timestamp":25434191552,"id":40,"parentId":27,"tags":{},"startTime":1791447343734,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1463404,"timestamp":25434019810,"id":27,"parentId":21,"tags":{"page":"/api/sessions/[id]/transcript"},"startTime":1791447343563,"traceId":"5279fd7c8f9a97fc"},{"name":"is-page-static","duration":1322275,"timestamp":25434193156,"id":41,"parentId":25,"tags":{},"startTime":1791447343736,"traceId":"5279fd7c8f9a97fc"},{"name":"check-page","duration":1504806,"timestamp":25434010666,"id":25,"parentId":21,"tags":{"page":"/api/media"},"startTime":1791447343554,"traceId":"5279fd7c8f9a97fc"},{"name":"static-check","duration":1511181,"timestamp":25434004325,"id":21,"parentId":1,"tags":{},"startTime":1791447343547,"traceId":"5279fd7c8f9a97fc"},{"name":"write-routes-manifest","duration":771,"timestamp":25435518032,"id":54,"parentId":1,"tags":{},"startTime":1791447345061,"traceId":"5279fd7c8f9a97fc"},{"name":"load-dotenv","duration":12,"timestamp":25435531963,"id":57,"parentId":56,"tags":{},"startTime":1791447345075,"traceId":"5279fd7c8f9a97fc"},{"name":"run-export-path-map","duration":1696,"timestamp":25435536336,"id":58,"parentId":56,"tags":{},"startTime":1791447345079,"traceId":"5279fd7c8f9a97fc"},{"name":"next-export","duration":459907,"timestamp":25435531407,"id":56,"parentId":1,"tags":{},"startTime":1791447345074,"traceId":"5279fd7c8f9a97fc"},{"name":"move-exported-app-not-found-","duration":587,"timestamp":25435992399,"id":59,"parentId":55,"tags":{},"startTime":1791447345535,"traceId":"5279fd7c8f9a97fc"},{"name":"move-exported-app-global-error-","duration":272,"timestamp":25435993037,"id":60,"parentId":55,"tags":{},"startTime":1791447345536,"traceId":"5279fd7c8f9a97fc"},{"name":"static-generation","duration":471007,"timestamp":25435522614,"id":55,"parentId":1,"tags":{},"startTime":1791447345066,"traceId":"5279fd7c8f9a97fc"},{"name":"write-routes-manifest","duration":250,"timestamp":25435993725,"id":61,"parentId":1,"tags":{},"startTime":1791447345537,"traceId":"5279fd7c8f9a97fc"},{"name":"print-tree-view","duration":1482,"timestamp":25436023178,"id":62,"parentId":1,"tags":{},"startTime":1791447345566,"traceId":"5279fd7c8f9a97fc"},{"name":"write-route-bundle-stats","duration":2653,"timestamp":25436024701,"id":63,"parentId":1,"tags":{},"startTime":1791447345568,"traceId":"5279fd7c8f9a97fc"},{"name":"telemetry-flush","duration":214335,"timestamp":25436027373,"id":64,"parentId":1,"tags":{},"startTime":1791447345570,"traceId":"5279fd7c8f9a97fc"},{"name":"next-build","duration":6095156,"timestamp":25430146609,"id":1,"tags":{"buildMode":"default","version":"16.4.0","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1791447339689,"traceId":"5279fd7c8f9a97fc"}]
1
+ [{"name":"generate-buildid","duration":124,"timestamp":29780594751,"id":4,"parentId":1,"tags":{},"startTime":1791451690162,"traceId":"e0935f27aa69d534"},{"name":"load-custom-routes","duration":165,"timestamp":29780595034,"id":5,"parentId":1,"tags":{},"startTime":1791451690162,"traceId":"e0935f27aa69d534"},{"name":"create-dist-dir","duration":1658,"timestamp":29780595216,"id":6,"parentId":1,"tags":{},"startTime":1791451690163,"traceId":"e0935f27aa69d534"},{"name":"clean","duration":104977,"timestamp":29780597422,"id":7,"parentId":1,"tags":{},"startTime":1791451690165,"traceId":"e0935f27aa69d534"},{"name":"discover-routes","duration":39366,"timestamp":29780718923,"id":8,"parentId":1,"tags":{},"startTime":1791451690286,"traceId":"e0935f27aa69d534"},{"name":"create-root-mapping","duration":440,"timestamp":29780758618,"id":9,"parentId":1,"tags":{},"startTime":1791451690326,"traceId":"e0935f27aa69d534"},{"name":"generate-route-types","duration":76556,"timestamp":29780762650,"id":10,"parentId":1,"tags":{},"startTime":1791451690330,"traceId":"e0935f27aa69d534"},{"name":"public-dir-conflict-check","duration":40,"timestamp":29780839348,"id":11,"parentId":1,"tags":{},"startTime":1791451690407,"traceId":"e0935f27aa69d534"},{"name":"generate-routes-manifest","duration":3384,"timestamp":29780839423,"id":12,"parentId":1,"tags":{},"startTime":1791451690407,"traceId":"e0935f27aa69d534"},{"name":"turbopack-emit","duration":582000,"timestamp":29783026443,"id":15,"parentId":1,"tags":{},"startTime":1791451692594,"traceId":"e0935f27aa69d534"},{"name":"run-turbopack","duration":3134275,"timestamp":29780855205,"id":14,"parentId":1,"tags":{},"startTime":1791451690423,"traceId":"e0935f27aa69d534"},{"name":"run-typescript","duration":4158,"timestamp":29784001908,"id":18,"parentId":1,"tags":{},"startTime":1791451693569,"traceId":"e0935f27aa69d534"},{"name":"generate-required-server-files","duration":755,"timestamp":29784006805,"id":20,"parentId":1,"tags":{},"startTime":1791451693574,"traceId":"e0935f27aa69d534"},{"name":"check-static-error-page","duration":18203,"timestamp":29784068653,"id":22,"parentId":21,"tags":{},"startTime":1791451693636,"traceId":"e0935f27aa69d534"},{"name":"turbopack-persistence","duration":84000,"timestamp":29783990634,"id":38,"parentId":1,"tags":{"reason":"stop","snapshot_duration_ms":14.245125000000002,"persist_duration_ms":69.842666,"task_count":956,"bytes_written":1463103,"bytes_deleted":0},"startTime":1791451693558,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1049246,"timestamp":29784087943,"id":37,"parentId":24,"tags":{},"startTime":1791451693655,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1058000,"timestamp":29784079266,"id":24,"parentId":21,"tags":{"page":"/_global-error"},"startTime":1791451693647,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1286523,"timestamp":29784106467,"id":44,"parentId":30,"tags":{},"startTime":1791451693674,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1308133,"timestamp":29784084925,"id":30,"parentId":21,"tags":{"page":"/api/workspace/file-content"},"startTime":1791451693652,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1308376,"timestamp":29784107214,"id":46,"parentId":33,"tags":{},"startTime":1791451693675,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1328967,"timestamp":29784086668,"id":33,"parentId":21,"tags":{"page":"/"},"startTime":1791451693654,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1310692,"timestamp":29784105492,"id":43,"parentId":31,"tags":{},"startTime":1791451693673,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1331077,"timestamp":29784085129,"id":31,"parentId":21,"tags":{"page":"/api/workspace/files"},"startTime":1791451693653,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1332397,"timestamp":29784087312,"id":36,"parentId":23,"tags":{},"startTime":1791451693655,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1346994,"timestamp":29784072775,"id":23,"parentId":21,"tags":{"page":"/_not-found"},"startTime":1791451693640,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1314248,"timestamp":29784107997,"id":50,"parentId":29,"tags":{},"startTime":1791451693675,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1337933,"timestamp":29784084368,"id":29,"parentId":21,"tags":{"page":"/api/version"},"startTime":1791451693652,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1319969,"timestamp":29784107176,"id":45,"parentId":32,"tags":{},"startTime":1791451693675,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1340797,"timestamp":29784086384,"id":32,"parentId":21,"tags":{"page":"/chat"},"startTime":1791451693654,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1323197,"timestamp":29784107464,"id":47,"parentId":34,"tags":{},"startTime":1791451693675,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1343935,"timestamp":29784086771,"id":34,"parentId":21,"tags":{"page":"/reports"},"startTime":1791451693654,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1327199,"timestamp":29784104275,"id":40,"parentId":28,"tags":{},"startTime":1791451693672,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1347788,"timestamp":29784083735,"id":28,"parentId":21,"tags":{"page":"/api/traces/stream"},"startTime":1791451693651,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1341641,"timestamp":29784104854,"id":41,"parentId":26,"tags":{},"startTime":1791451693672,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1363126,"timestamp":29784083423,"id":26,"parentId":21,"tags":{"page":"/api/reports/tokens"},"startTime":1791451693651,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1339083,"timestamp":29784107534,"id":48,"parentId":35,"tags":{},"startTime":1791451693675,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1359830,"timestamp":29784086810,"id":35,"parentId":21,"tags":{"page":"/store"},"startTime":1791451693654,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1344717,"timestamp":29784105236,"id":42,"parentId":25,"tags":{},"startTime":1791451693673,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1370329,"timestamp":29784079734,"id":25,"parentId":21,"tags":{"page":"/api/media"},"startTime":1791451693647,"traceId":"e0935f27aa69d534"},{"name":"is-page-static","duration":1363853,"timestamp":29784107845,"id":49,"parentId":27,"tags":{},"startTime":1791451693675,"traceId":"e0935f27aa69d534"},{"name":"check-page","duration":1388157,"timestamp":29784083624,"id":27,"parentId":21,"tags":{"page":"/api/sessions/[id]/transcript"},"startTime":1791451693651,"traceId":"e0935f27aa69d534"},{"name":"static-check","duration":1405662,"timestamp":29784066136,"id":21,"parentId":1,"tags":{},"startTime":1791451693634,"traceId":"e0935f27aa69d534"},{"name":"write-routes-manifest","duration":408,"timestamp":29785472573,"id":52,"parentId":1,"tags":{},"startTime":1791451695040,"traceId":"e0935f27aa69d534"},{"name":"load-dotenv","duration":15,"timestamp":29785480842,"id":55,"parentId":54,"tags":{},"startTime":1791451695048,"traceId":"e0935f27aa69d534"},{"name":"run-export-path-map","duration":549,"timestamp":29785482648,"id":56,"parentId":54,"tags":{},"startTime":1791451695050,"traceId":"e0935f27aa69d534"},{"name":"next-export","duration":887134,"timestamp":29785480075,"id":54,"parentId":1,"tags":{},"startTime":1791451695048,"traceId":"e0935f27aa69d534"},{"name":"move-exported-app-not-found-","duration":4406,"timestamp":29786370719,"id":57,"parentId":53,"tags":{},"startTime":1791451695938,"traceId":"e0935f27aa69d534"},{"name":"move-exported-app-global-error-","duration":589,"timestamp":29786375233,"id":58,"parentId":53,"tags":{},"startTime":1791451695943,"traceId":"e0935f27aa69d534"},{"name":"static-generation","duration":901102,"timestamp":29785475219,"id":53,"parentId":1,"tags":{},"startTime":1791451695043,"traceId":"e0935f27aa69d534"},{"name":"write-routes-manifest","duration":345,"timestamp":29786376449,"id":59,"parentId":1,"tags":{},"startTime":1791451695944,"traceId":"e0935f27aa69d534"},{"name":"print-tree-view","duration":1729,"timestamp":29786449571,"id":60,"parentId":1,"tags":{},"startTime":1791451696017,"traceId":"e0935f27aa69d534"},{"name":"write-route-bundle-stats","duration":7428,"timestamp":29786451333,"id":61,"parentId":1,"tags":{},"startTime":1791451696019,"traceId":"e0935f27aa69d534"},{"name":"telemetry-flush","duration":209144,"timestamp":29786458786,"id":62,"parentId":1,"tags":{},"startTime":1791451696026,"traceId":"e0935f27aa69d534"},{"name":"next-build","duration":6179885,"timestamp":29780488100,"id":1,"tags":{"buildMode":"default","version":"16.4.0","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1791451690056,"traceId":"e0935f27aa69d534"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"turbopack-emit","duration":239000,"timestamp":25433378697,"id":15,"parentId":1,"tags":{},"startTime":1791447342922,"traceId":"5279fd7c8f9a97fc"},{"name":"run-turbopack","duration":2940856,"timestamp":25430826681,"id":14,"parentId":1,"tags":{},"startTime":1791447340370,"traceId":"5279fd7c8f9a97fc"},{"name":"run-typescript","duration":15643,"timestamp":25433795049,"id":18,"parentId":1,"tags":{},"startTime":1791447343338,"traceId":"5279fd7c8f9a97fc"},{"name":"turbopack-persistence","duration":379000,"timestamp":25433767657,"id":38,"parentId":1,"tags":{"reason":"stop","snapshot_duration_ms":24.239541,"persist_duration_ms":354.211875,"task_count":2042,"bytes_written":4401880,"bytes_deleted":0},"startTime":1791447343311,"traceId":"5279fd7c8f9a97fc"},{"name":"turbopack-compaction","duration":123000,"timestamp":25434148479,"id":51,"parentId":1,"tags":{"bytes_written":3775615,"bytes_deleted":6161769},"startTime":1791447343691,"traceId":"5279fd7c8f9a97fc"},{"name":"static-check","duration":1511181,"timestamp":25434004325,"id":21,"parentId":1,"tags":{},"startTime":1791447343547,"traceId":"5279fd7c8f9a97fc"},{"name":"static-generation","duration":471007,"timestamp":25435522614,"id":55,"parentId":1,"tags":{},"startTime":1791447345066,"traceId":"5279fd7c8f9a97fc"},{"name":"telemetry-flush","duration":214335,"timestamp":25436027373,"id":64,"parentId":1,"tags":{},"startTime":1791447345570,"traceId":"5279fd7c8f9a97fc"},{"name":"next-build","duration":6095156,"timestamp":25430146609,"id":1,"tags":{"buildMode":"default","version":"16.4.0","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1791447339689,"traceId":"5279fd7c8f9a97fc"}]
1
+ [{"name":"turbopack-emit","duration":582000,"timestamp":29783026443,"id":15,"parentId":1,"tags":{},"startTime":1791451692594,"traceId":"e0935f27aa69d534"},{"name":"run-turbopack","duration":3134275,"timestamp":29780855205,"id":14,"parentId":1,"tags":{},"startTime":1791451690423,"traceId":"e0935f27aa69d534"},{"name":"run-typescript","duration":4158,"timestamp":29784001908,"id":18,"parentId":1,"tags":{},"startTime":1791451693569,"traceId":"e0935f27aa69d534"},{"name":"turbopack-persistence","duration":84000,"timestamp":29783990634,"id":38,"parentId":1,"tags":{"reason":"stop","snapshot_duration_ms":14.245125000000002,"persist_duration_ms":69.842666,"task_count":956,"bytes_written":1463103,"bytes_deleted":0},"startTime":1791451693558,"traceId":"e0935f27aa69d534"},{"name":"static-check","duration":1405662,"timestamp":29784066136,"id":21,"parentId":1,"tags":{},"startTime":1791451693634,"traceId":"e0935f27aa69d534"},{"name":"static-generation","duration":901102,"timestamp":29785475219,"id":53,"parentId":1,"tags":{},"startTime":1791451695043,"traceId":"e0935f27aa69d534"},{"name":"telemetry-flush","duration":209144,"timestamp":29786458786,"id":62,"parentId":1,"tags":{},"startTime":1791451696026,"traceId":"e0935f27aa69d534"},{"name":"next-build","duration":6179885,"timestamp":29780488100,"id":1,"tags":{"buildMode":"default","version":"16.4.0","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1791451690056,"traceId":"e0935f27aa69d534"}]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agmon",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Realtime AI Agent Office & Activity Visualizer for Antigravity, Claude Code & AI CLIs",
5
5
  "type": "module",
6
6
  "bin": {
@@ -7,8 +7,32 @@ export async function GET(request) {
7
7
  const { searchParams } = new URL(request.url);
8
8
  const source = searchParams.get("source") || "live";
9
9
  const mockPreset = searchParams.get("mockPreset") || searchParams.get("preset");
10
- const hours = Number(searchParams.get("hours") || 24);
11
- const maxAgeMs = Math.max(1, hours) * 60 * 60 * 1000;
10
+ const rawHours = searchParams.get("hours");
11
+ let hours = 24;
12
+ if (rawHours !== null) {
13
+ if (rawHours === "0" || rawHours === "all") {
14
+ hours = 0;
15
+ } else {
16
+ const parsedHours = Number(rawHours);
17
+ if (!Number.isNaN(parsedHours) && parsedHours >= 0) {
18
+ hours = parsedHours;
19
+ }
20
+ }
21
+ }
22
+ const maxAgeMs = hours > 0 ? hours * 60 * 60 * 1000 : Infinity;
23
+
24
+ const rawLimit = searchParams.get("limit") || searchParams.get("top");
25
+ let limit = 20;
26
+ if (rawLimit !== null) {
27
+ if (rawLimit === "0" || rawLimit === "all") {
28
+ limit = 0;
29
+ } else {
30
+ const parsedLimit = Number(rawLimit);
31
+ if (!Number.isNaN(parsedLimit) && parsedLimit >= 0) {
32
+ limit = parsedLimit;
33
+ }
34
+ }
35
+ }
12
36
 
13
37
  const encoder = new TextEncoder();
14
38
 
@@ -30,24 +54,35 @@ export async function GET(request) {
30
54
 
31
55
  if (source === "mock" || mockPreset) {
32
56
  const presetConfig = MOCK_PRESETS[mockPreset] || MOCK_PRESETS.cases;
33
- const traces = generateMockTraces({
57
+ const rawTraces = generateMockTraces({
34
58
  count: presetConfig.agents,
35
59
  errorRatio: presetConfig.errorRatio,
36
60
  cases: !!presetConfig.cases,
37
61
  preset: mockPreset,
38
62
  seed: 42,
39
63
  });
64
+ const totalCount = rawTraces.length;
65
+ const traces = (limit > 0 && limit < totalCount) ? rawTraces.slice(0, limit) : rawTraces;
40
66
  const providers = mockProviderDescriptors(traces);
41
- send({ traces, providers, timestamp: Date.now(), mode: "mock", preset: mockPreset || "cases" });
67
+ send({
68
+ traces,
69
+ totalCount,
70
+ providers,
71
+ timestamp: Date.now(),
72
+ mode: "mock",
73
+ preset: mockPreset || "cases",
74
+ activeAgents: traces.filter((t) => t.state === "streaming" || t.state === "pending").length,
75
+ });
42
76
  return;
43
77
  }
44
78
 
45
79
  // Live Mode
46
80
  try {
47
- const { traces, errors } = await getLiveTraceSnapshot(false, maxAgeMs);
81
+ const { traces, totalCount, errors } = await getLiveTraceSnapshot(false, maxAgeMs, limit);
48
82
  const providers = getProvidersFromTraces(traces);
49
83
  send({
50
84
  traces,
85
+ totalCount,
51
86
  providers,
52
87
  errors,
53
88
  timestamp: Date.now(),
@@ -58,6 +93,7 @@ export async function GET(request) {
58
93
  console.error("[SSE] Failed to fetch live traces:", err);
59
94
  send({
60
95
  traces: [],
96
+ totalCount: 0,
61
97
  providers: [],
62
98
  errors: [{ source: "telemetry", message: err.message || "Failed to read live traces" }],
63
99
  timestamp: Date.now(),
package/src/app/layout.js CHANGED
@@ -26,7 +26,7 @@ export const viewport = {
26
26
 
27
27
  export default function RootLayout({ children }) {
28
28
  return (
29
- <html lang="en" className="dark">
29
+ <html lang="en" className="dark" suppressHydrationWarning>
30
30
  <head>
31
31
  <link rel="manifest" href="/manifest.json" />
32
32
  <link rel="apple-touch-icon" href="/icons/icon.svg" />
@@ -39,6 +39,7 @@ export default function RootLayout({ children }) {
39
39
  rel="stylesheet"
40
40
  />
41
41
  <script
42
+ suppressHydrationWarning
42
43
  dangerouslySetInnerHTML={{
43
44
  __html: `(function(){try{var raw=localStorage.getItem("agmon_theme_settings");var t="dark-plus";var fz="13";var uf="";var cf="";if(raw){var s=JSON.parse(raw);if(s.theme)t=s.theme;if(s.fontSize)fz=s.fontSize;if(s.uiFont)uf=s.uiFont;if(s.codeFont)cf=s.codeFont;}document.documentElement.setAttribute("data-theme",t);if(t==="light-plus"){document.documentElement.classList.remove("dark");document.documentElement.classList.add("light");}else{document.documentElement.classList.remove("light");document.documentElement.classList.add("dark");}document.documentElement.style.setProperty("--font-size-ui",fz+"px");document.documentElement.style.setProperty("--font-size-base",fz+"px");}catch(e){}})();`,
44
45
  }}
package/src/app/page.js CHANGED
@@ -26,7 +26,18 @@ export default function FactoryPage() {
26
26
  }
27
27
  }, []);
28
28
 
29
- const { traces, connected, live, isRefreshing, refresh } = useFactoryTraces({
29
+ const {
30
+ traces,
31
+ totalCount,
32
+ top,
33
+ setTop,
34
+ timeframe,
35
+ setTimeframe,
36
+ connected,
37
+ live,
38
+ isRefreshing,
39
+ refresh,
40
+ } = useFactoryTraces({
30
41
  mode,
31
42
  preset: mockPreset,
32
43
  });
@@ -38,6 +49,11 @@ export default function FactoryPage() {
38
49
  <UpdateNotification />
39
50
  <VSCodeWorkbench
40
51
  traces={traces}
52
+ totalCount={totalCount}
53
+ top={top}
54
+ onTopChange={setTop}
55
+ timeframe={timeframe}
56
+ onTimeframeChange={setTimeframe}
41
57
  office={office}
42
58
  mode={mode}
43
59
  mockPreset={mockPreset}
@@ -108,7 +108,7 @@ export default function SessionChatView({
108
108
  sessionTrace?.traces?.[0]?.traceId ||
109
109
  sessionTrace?.connectionId ||
110
110
  "";
111
- const sessionId = targetTraceId.replace(/^agy-|^claude-/, "") || targetTraceId;
111
+ const sessionId = targetTraceId.replace(/^agy-|^claude-|^codex-/, "") || targetTraceId;
112
112
  const isAgentActive =
113
113
  sessionTrace?.state === "streaming" ||
114
114
  sessionTrace?.state === "busy" ||
@@ -1,12 +1,17 @@
1
1
  "use client";
2
2
 
3
3
  import { useEffect, useRef, useState } from "react";
4
- import { ZoomIn, ZoomOut, Maximize2, Minimize2, Sparkles, Volume2, VolumeX, Maximize } from "lucide-react";
4
+ import { ZoomIn, ZoomOut, Maximize2, Minimize2, Sparkles, Volume2, VolumeX, Maximize, ListFilter, Clock } from "lucide-react";
5
5
  import { mountOfficeScene } from "./office-scene";
6
6
  import { SUPPORTER_CHANGE_EVENT } from "@/lib/supporterStore";
7
7
 
8
8
  export default function OfficeCanvas({
9
9
  traces = [],
10
+ totalCount = 0,
11
+ top = 20,
12
+ onTopChange = null,
13
+ timeframe = "24h",
14
+ onTimeframeChange = null,
10
15
  onStats,
11
16
  onSelect,
12
17
  selectedId = null,
@@ -171,6 +176,32 @@ export default function OfficeCanvas({
171
176
  </div>
172
177
  )}
173
178
 
179
+ {/* Floating Canvas Filter Badge (Top-left) */}
180
+ {!isZenFullscreen && (
181
+ <div
182
+ data-testid="canvas-filter-pill"
183
+ className="absolute top-3 left-3 z-10 hidden sm:flex items-center gap-1.5 px-2.5 py-1 rounded-lg border border-slate-800/80 bg-slate-950/80 backdrop-blur-md shadow-xl text-slate-300 text-xs select-none pointer-events-none"
184
+ >
185
+ <ListFilter className="w-3 h-3 text-cyan-400 shrink-0" />
186
+ <span className="font-semibold text-[11px] text-slate-200">
187
+ {top === "all" ? "All Desks" : `Top ${top}`}
188
+ </span>
189
+ <span className="text-slate-600">·</span>
190
+ <Clock className="w-3 h-3 text-amber-400 shrink-0" />
191
+ <span className="text-[11px] text-slate-300">
192
+ {timeframe === "all" ? "All time" : timeframe}
193
+ </span>
194
+ {totalCount > 0 && traces.length > 0 && traces.length < totalCount && (
195
+ <span
196
+ title={`Showing ${traces.length} of ${totalCount} recorded conversations`}
197
+ className="ml-0.5 px-1.5 py-0.2 rounded text-[10px] font-mono bg-cyan-950/60 text-cyan-300 border border-cyan-800/40"
198
+ >
199
+ {traces.length}/{totalCount}
200
+ </span>
201
+ )}
202
+ </div>
203
+ )}
204
+
174
205
  {/* Chill Mode Entry Toast Banner */}
175
206
  {showToast && (
176
207
  <div className="absolute top-5 left-1/2 -translate-x-1/2 z-30 pointer-events-none transition-all duration-300 animate-in fade-in slide-in-from-top-2">
@@ -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,
@@ -21,6 +21,7 @@ import {
21
21
  ShoppingBag,
22
22
  Blocks,
23
23
  Monitor,
24
+ TerminalSquare,
24
25
  } from "lucide-react";
25
26
  import FileExplorer from "./FileExplorer";
26
27
  import { TOTAL_CATALOG_COUNT } from "@/lib/catalog/index.js";
@@ -75,6 +76,8 @@ export default function LeftSidebar({
75
76
  const groups = {
76
77
  extensions: [],
77
78
  desktop: [],
79
+ codexDesktop: [],
80
+ codexCli: [],
78
81
  geminiApp: [],
79
82
  geminiCli: [],
80
83
  claude: [],
@@ -88,11 +91,20 @@ export default function LeftSidebar({
88
91
  const conn = (w.connectionId || "").toLowerCase();
89
92
  const model = (w.model || "").toLowerCase();
90
93
 
94
+ const isCodex = cli === "codex" || p.includes("codex") || conn.includes("codex");
91
95
  const isExtension = ct === "extension" || ct === "ide" || conn.includes("extension");
92
96
  const isDesktop = ct === "desktop" || conn.includes("desktop");
93
97
  const isClaude = cli === "claude" || p.includes("claude") || p.includes("anthropic") || model.includes("claude");
94
98
 
95
- 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) {
96
108
  groups.extensions.push(w);
97
109
  } else if (isDesktop) {
98
110
  groups.desktop.push(w);
@@ -127,6 +139,7 @@ export default function LeftSidebar({
127
139
  const isDesktop =
128
140
  agent.clientType === "desktop" ||
129
141
  (agent.connectionId || "").toLowerCase().includes("desktop");
142
+ const isCodex = agent.cli === "codex" || (agent.connectionId || "").toLowerCase().includes("codex");
130
143
 
131
144
  const previewText = agent.lastText
132
145
  ? `${agent.lastTextRole === "assistant" ? "AI: " : agent.lastTextRole === "user" ? "You: " : ""}${agent.lastText}`
@@ -134,7 +147,7 @@ export default function LeftSidebar({
134
147
 
135
148
  return (
136
149
  <div
137
- key={agent.connectionId || `agent-${idx}`}
150
+ key={agent.traceId || agent.connectionId || `agent-${idx}`}
138
151
  onClick={() => {
139
152
  onSelectAgent?.(agent.connectionId);
140
153
  onOpenAgentTab?.(agent);
@@ -165,8 +178,20 @@ export default function LeftSidebar({
165
178
  {sessionTitle}
166
179
  </span>
167
180
 
168
- {/* Client Tag: EXT vs DESKTOP vs APP vs CLI */}
169
- {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 ? (
170
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">
171
196
  EXT
172
197
  </span>
@@ -345,6 +370,28 @@ export default function LeftSidebar({
345
370
  </div>
346
371
  )}
347
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
+
348
395
  {/* Gemini App Agents */}
349
396
  {groupedAgents.geminiApp.length > 0 && (
350
397
  <div className="mb-2">
@@ -447,6 +494,17 @@ export default function LeftSidebar({
447
494
  <Folder className="w-3.5 h-3.5 text-amber-400 shrink-0" />
448
495
  <span className="truncate font-mono text-[10px]">~/.claude/projects</span>
449
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>
450
508
  </div>
451
509
  )}
452
510
  </div>
@@ -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,
@@ -103,7 +111,11 @@ export default function TitleBar({
103
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"
104
112
  >
105
113
  <span className="text-slate-400">Desks:</span>
106
- <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>
107
119
  <span className="text-slate-600">|</span>
108
120
  <span className="text-slate-400">Active:</span>
109
121
  <span className="font-bold text-cyan-400">{stats?.busy ?? 0}</span>
@@ -112,6 +124,64 @@ export default function TitleBar({
112
124
  <span className="font-bold text-emerald-400">{stats?.tokensLabel ?? "0k"}</span>
113
125
  </div>
114
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
+
115
185
  {/* Quick Reports Button */}
116
186
  <button
117
187
  onClick={onOpenReports}
@@ -34,6 +34,11 @@ import {
34
34
 
35
35
  export default function VSCodeWorkbench({
36
36
  traces = [],
37
+ totalCount = 0,
38
+ top = 20,
39
+ onTopChange,
40
+ timeframe = "24h",
41
+ onTimeframeChange,
37
42
  office = { workstations: [], stats: {} },
38
43
  mode = "live",
39
44
  mockPreset = "cases",
@@ -399,6 +404,12 @@ export default function VSCodeWorkbench({
399
404
  {/* 1. VS Code Standard TitleBar (34px) */}
400
405
  <TitleBar
401
406
  stats={office.stats}
407
+ traces={effectiveTraces}
408
+ totalCount={totalCount}
409
+ top={top}
410
+ onTopChange={onTopChange}
411
+ timeframe={timeframe}
412
+ onTimeframeChange={onTimeframeChange}
402
413
  mode={mode}
403
414
  mockPreset={mockPreset}
404
415
  onModeChange={onModeChange}
@@ -586,6 +597,11 @@ export default function VSCodeWorkbench({
586
597
  ) : (
587
598
  <OfficeCanvas
588
599
  traces={effectiveTraces}
600
+ totalCount={totalCount}
601
+ top={top}
602
+ onTopChange={onTopChange}
603
+ timeframe={timeframe}
604
+ onTimeframeChange={onTimeframeChange}
589
605
  selectedId={selectedId}
590
606
  onSelect={(id) => handleSelectAgent(id)}
591
607
  isZenFullscreen={isZenFullscreen}
@@ -610,6 +626,11 @@ export default function VSCodeWorkbench({
610
626
  >
611
627
  <OfficeCanvas
612
628
  traces={effectiveTraces}
629
+ totalCount={totalCount}
630
+ top={top}
631
+ onTopChange={onTopChange}
632
+ timeframe={timeframe}
633
+ onTimeframeChange={onTimeframeChange}
613
634
  selectedId={selectedId}
614
635
  onSelect={(id) => handleSelectAgent(id)}
615
636
  isZenFullscreen={isZenFullscreen}