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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +8 -8
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +16 -15
- package/.next/server/app/_not-found.segments/_full.segment.rsc +16 -15
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +8 -7
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/media/route.js.nft.json +1 -1
- package/.next/server/app/api/reports/tokens/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/transcript/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/transcript/route.js.nft.json +1 -1
- package/.next/server/app/api/traces/stream/route.js +1 -1
- package/.next/server/app/api/traces/stream/route.js.nft.json +1 -1
- package/.next/server/app/api/version/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/file-content/route.js.nft.json +1 -1
- package/.next/server/app/api/workspace/files/route.js.nft.json +1 -1
- package/.next/server/app/chat/page.js.nft.json +1 -1
- package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
- package/.next/server/app/chat.html +1 -1
- package/.next/server/app/chat.rsc +4 -4
- package/.next/server/app/chat.segments/_full.segment.rsc +4 -4
- package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +6 -5
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +5 -5
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +7 -6
- package/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/reports/page.js.nft.json +1 -1
- package/.next/server/app/reports/page_client-reference-manifest.js +1 -1
- package/.next/server/app/reports.html +1 -1
- package/.next/server/app/reports.rsc +2 -2
- package/.next/server/app/reports.segments/_full.segment.rsc +2 -2
- package/.next/server/app/reports.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/reports.segments/reports/__PAGE__.segment.rsc +4 -3
- package/.next/server/app/store/page.js.nft.json +1 -1
- package/.next/server/app/store/page_client-reference-manifest.js +1 -1
- package/.next/server/app/store.html +1 -1
- package/.next/server/app/store.rsc +2 -2
- package/.next/server/app/store.segments/_full.segment.rsc +2 -2
- package/.next/server/app/store.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/store.segments/store/__PAGE__.segment.rsc +4 -3
- package/.next/server/chunks/[root-of-the-server]__0dw97_pahi8uf._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0dw97_pahi8uf._.js.map +1 -0
- package/.next/server/chunks/_0ao-_t4jkb46h._.js +2 -2
- package/.next/server/chunks/_0ao-_t4jkb46h._.js.map +1 -1
- package/.next/server/chunks/_1-8ipqazoyrrk._.js +1 -1
- package/.next/server/chunks/_1-8ipqazoyrrk._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1jwplflwix8wi._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1jwplflwix8wi._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1kt7h7bz59mdn._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1otsvjy81s8my._.js.map +1 -1
- package/.next/server/chunks/ssr/{_0--937zhi743v._.js → _0zel-n0h--cnl._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0jla9ugf1y6rb._.js → node_modules_01avo0bde3tpo._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0sjdrli5douui._.js → node_modules_01l0208e5kqic._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0lqovp8j8ld76._.js → node_modules_033x29yqle_sj._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_05i69rc9pwcdx._.js → node_modules_03wbg__aslvui._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1ltys5mwtcv-n._.js → node_modules_08-bqkrz7sh0l._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_09v49jhajmvl4._.js → node_modules_089w9jm7s2qa3._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0z1e37smavebg._.js → node_modules_0cy47-s63xjzh._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0dw0vozejrnml._.js → node_modules_0czh0jcnsm5e6._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_0e3njj436xau-._.js → node_modules_0fv321j1nslkb._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0d2ios01ot1in._.js → node_modules_0g-wb7h-hsdwc._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1l46or7mgko0z._.js → node_modules_0oz_zzlh8exwx._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0b8zi3pbl-y9n._.js → node_modules_0so2agzqd9p8l._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_1wew4nn7i1uup._.js → node_modules_0w2w61b8bh769._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_07bjxeq9dfgn1._.js → node_modules_0wd6szix_zku7._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_1aqaelh-8fme6._.js → node_modules_0wp7omf0xblv8._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_0xh8tnq1niblb._.js → node_modules_10c51o2qv6mbi._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1d4sreyq0ubqg._.js → node_modules_19vqq7rvf-_ar._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_1e_nc2eyg4djz._.js → node_modules_1hu83gui7_nj2._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1zbmc81s-4zsm._.js → node_modules_1j8hpoiygrs5e._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_1pquu5wprusnc._.js → node_modules_1n4kig4mj6n4s._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_1st9dwe66yx93._.js → node_modules_1s8oxeqa5_i3k._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_01p9ctt-n2dxp._.js → node_modules_1xz1dstlo5ri-._.js} +1 -1
- package/.next/server/chunks/ssr/{node_modules_katex_dist_katex_mjs_0kqo9zl9cgwbo._.js → node_modules_katex_dist_katex_mjs_067omoj5szuys._.js} +1 -1
- package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js +1 -1
- package/.next/server/chunks/ssr/src_app_page_1vqfk0-j72fp6.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/preview-props.json +3 -3
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/0jo6fy2c_gmqn.js +1 -0
- package/.next/static/chunks/2q9cwykv6ox1t.css +1 -0
- package/.next/static/chunks/{3og0e9qcff393.js → 2zf44j8sjo0w0.js} +4 -4
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/package.json +1 -1
- package/src/app/api/traces/stream/route.js +41 -5
- package/src/app/layout.js +2 -1
- package/src/app/page.js +17 -1
- package/src/components/chat/SessionChatView.js +1 -1
- package/src/components/factory/office-canvas.js +32 -1
- package/src/components/layout/BottomPanel.jsx +6 -6
- package/src/components/layout/LeftSidebar.jsx +62 -4
- package/src/components/layout/StatusBar.jsx +1 -1
- package/src/components/layout/TitleBar.jsx +71 -1
- package/src/components/layout/VSCodeWorkbench.jsx +21 -0
- package/src/lib/mockTraces.js +13 -11
- package/src/lib/parsers/codexParser.js +373 -0
- package/src/lib/parsers/transcriptParser.js +35 -3
- package/src/lib/useFactoryTraces.js +70 -5
- package/src/lib/watchers/antigravityWatcher.js +15 -1
- package/src/lib/watchers/claudeWatcher.js +64 -53
- package/src/lib/watchers/codexWatcher.js +482 -0
- package/src/lib/watchers/watcherManager.js +46 -30
- package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js +0 -3
- package/.next/server/chunks/src_lib_watchers_antigravityWatcher_0w1-atg39y__p.js.map +0 -1
- package/.next/static/chunks/17jorrh_pfel_.js +0 -1
- package/.next/static/chunks/25l0z48vlvdu4.css +0 -1
- /package/.next/server/chunks/ssr/{_0--937zhi743v._.js.map → _0zel-n0h--cnl._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0jla9ugf1y6rb._.js.map → node_modules_01avo0bde3tpo._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0sjdrli5douui._.js.map → node_modules_01l0208e5kqic._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0lqovp8j8ld76._.js.map → node_modules_033x29yqle_sj._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_05i69rc9pwcdx._.js.map → node_modules_03wbg__aslvui._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1ltys5mwtcv-n._.js.map → node_modules_08-bqkrz7sh0l._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_09v49jhajmvl4._.js.map → node_modules_089w9jm7s2qa3._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0z1e37smavebg._.js.map → node_modules_0cy47-s63xjzh._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0dw0vozejrnml._.js.map → node_modules_0czh0jcnsm5e6._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0e3njj436xau-._.js.map → node_modules_0fv321j1nslkb._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0d2ios01ot1in._.js.map → node_modules_0g-wb7h-hsdwc._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0xh8tnq1niblb._.js.map → node_modules_0oz_zzlh8exwx._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_0b8zi3pbl-y9n._.js.map → node_modules_0so2agzqd9p8l._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1wew4nn7i1uup._.js.map → node_modules_0w2w61b8bh769._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_07bjxeq9dfgn1._.js.map → node_modules_0wd6szix_zku7._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1aqaelh-8fme6._.js.map → node_modules_0wp7omf0xblv8._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1d4sreyq0ubqg._.js.map → node_modules_10c51o2qv6mbi._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1l46or7mgko0z._.js.map → node_modules_19vqq7rvf-_ar._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1e_nc2eyg4djz._.js.map → node_modules_1hu83gui7_nj2._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1zbmc81s-4zsm._.js.map → node_modules_1j8hpoiygrs5e._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1pquu5wprusnc._.js.map → node_modules_1n4kig4mj6n4s._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_1st9dwe66yx93._.js.map → node_modules_1s8oxeqa5_i3k._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_01p9ctt-n2dxp._.js.map → node_modules_1xz1dstlo5ri-._.js.map} +0 -0
- /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
- /package/.next/static/{1y6Da0YgnPr2_6ncpWrbV → dGN2VKPk5TJgezxS3JvRc}/_buildManifest.js +0 -0
- /package/.next/static/{1y6Da0YgnPr2_6ncpWrbV → dGN2VKPk5TJgezxS3JvRc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{1y6Da0YgnPr2_6ncpWrbV → dGN2VKPk5TJgezxS3JvRc}/_ssgManifest.js +0 -0
package/.next/trace
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"name":"generate-buildid","duration":
|
|
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":
|
|
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
|
@@ -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
|
|
11
|
-
|
|
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
|
|
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({
|
|
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 {
|
|
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
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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: `${
|
|
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 (
|
|
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
|
-
{
|
|
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
|
|
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">
|
|
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}
|