@mndrk/agx 2.0.23 → 2.0.24
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/cloud-runtime/standalone/.next/BUILD_ID +1 -1
- package/cloud-runtime/standalone/.next/app-path-routes-manifest.json +1 -0
- package/cloud-runtime/standalone/.next/build-manifest.json +6 -6
- package/cloud-runtime/standalone/.next/prerender-manifest.json +3 -3
- package/cloud-runtime/standalone/.next/routes-manifest.json +6 -0
- package/cloud-runtime/standalone/.next/server/app/_global-error/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/_global-error/page.js +2 -2
- package/cloud-runtime/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.html +2 -2
- package/cloud-runtime/standalone/.next/server/app/_global-error.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cloud-runtime/standalone/.next/server/app/_not-found/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/_not-found/page.js +6 -5
- package/cloud-runtime/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/_not-found.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/_not-found.rsc +11 -11
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +11 -11
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +7 -7
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/agents/[id]/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/agents/[id]/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/agents/[id]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/agents/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/agents/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/agents/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/agents/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/agents.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/agents.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/agents.segments/_full.segment.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/agents.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/agents.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/agents.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/agents.segments/agents/__PAGE__.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/agents.segments/agents.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/api/file-search/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route/app-paths-manifest.json +3 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route/build-manifest.json +11 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route/server-reference-manifest.json +4 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route.js +7 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route.js.map +5 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route.js.nft.json +1 -0
- package/cloud-runtime/standalone/.next/server/app/api/filesystem/browse/route_client-reference-manifest.js +2 -0
- package/cloud-runtime/standalone/.next/server/app/api/providers/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/status/route.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/api/status/route.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/automations/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/automations/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/automations/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/automations/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/automations.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/automations.rsc +11 -11
- package/cloud-runtime/standalone/.next/server/app/automations.segments/_full.segment.rsc +11 -11
- package/cloud-runtime/standalone/.next/server/app/automations.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/automations.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/automations.segments/_tree.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/automations.segments/automations/__PAGE__.segment.rsc +5 -5
- package/cloud-runtime/standalone/.next/server/app/automations.segments/automations.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/board/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/board/page.js +6 -6
- package/cloud-runtime/standalone/.next/server/app/board/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/board/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/board.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/board.rsc +8 -8
- package/cloud-runtime/standalone/.next/server/app/board.segments/_full.segment.rsc +8 -8
- package/cloud-runtime/standalone/.next/server/app/board.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/board.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/board.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/board.segments/board/__PAGE__.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/board.segments/board.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/execution-graph/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/execution-graph/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/execution-graph/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/execution-graph/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/execution-graph.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/execution-graph.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_full.segment.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/execution-graph/__PAGE__.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/execution-graph.segments/execution-graph.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/index.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/index.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/index.segments/_full.segment.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/index.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/index.segments/_tree.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/graph/[taskId]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/[slug]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/orphans/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/orphans/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/projects/orphans/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/orphans/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.html +13 -1
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_full.segment.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects/orphans/__PAGE__.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects/orphans.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/projects/orphans.segments/projects.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/projects/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/projects/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/projects.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/projects.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/projects.segments/_full.segment.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/projects.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/projects.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/projects.segments/projects/__PAGE__.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/projects.segments/projects.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/settings/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/settings/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/settings/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/settings.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/settings.rsc +9 -9
- package/cloud-runtime/standalone/.next/server/app/settings.segments/_full.segment.rsc +9 -9
- package/cloud-runtime/standalone/.next/server/app/settings.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/settings.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/settings.segments/settings.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/status/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/status/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/status/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/status.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/status.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/status.segments/_full.segment.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/status.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/status.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/status.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/status.segments/status/__PAGE__.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/status.segments/status.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/thread/[id]/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/thread/[id]/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/thread/[id]/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/thread/[id]/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/welcome/page/build-manifest.json +4 -4
- package/cloud-runtime/standalone/.next/server/app/welcome/page.js +5 -5
- package/cloud-runtime/standalone/.next/server/app/welcome/page.js.nft.json +1 -1
- package/cloud-runtime/standalone/.next/server/app/welcome/page_client-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/app/welcome.html +14 -2
- package/cloud-runtime/standalone/.next/server/app/welcome.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/_full.segment.rsc +10 -10
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/_head.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/_index.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/_tree.segment.rsc +2 -2
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/welcome/__PAGE__.segment.rsc +4 -4
- package/cloud-runtime/standalone/.next/server/app/welcome.segments/welcome.segment.rsc +3 -3
- package/cloud-runtime/standalone/.next/server/app-paths-manifest.json +1 -0
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__60ba5058._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/[root-of-the-server]__621dcb4a._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__babd2675._.js → [root-of-the-server]__82d76712._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/{[root-of-the-server]__d36da34d._.js → [root-of-the-server]__c2767ca5._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/_next-internal_server_app_api_filesystem_browse_route_actions_8e268170.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/lib_history-store_ts_2e721df2._.js +4 -4
- package/cloud-runtime/standalone/.next/server/chunks/lib_history-store_ts_74d1c060._.js +6 -6
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__fb05a385._.js → [root-of-the-server]__056cdf7d._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__113d6767._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__8d1af2c9._.js → [root-of-the-server]__11e33b9b._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__296a25b5._.js → [root-of-the-server]__19cd257e._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__226f8a19._.js +13 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__51980630._.js → [root-of-the-server]__26d669c2._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__47caef59._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0a103abc._.js → [root-of-the-server]__4ebf5947._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__5ffa2883._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__6a9d3855._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__942ca438._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__c45c7360._.js → [root-of-the-server]__a667191a._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1cfbd715._.js → [root-of-the-server]__aa28d46f._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__bd4d5430._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__ab36b420._.js → [root-of-the-server]__bde5bc78._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__cde88183._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__ce3b51aa._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__2503b467._.js → [root-of-the-server]__d36dd8bc._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__b77ae83d._.js → [root-of-the-server]__dac5ab29._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__3405b8e4._.js → [root-of-the-server]__e87ba2b0._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__b9356576._.js → [root-of-the-server]__f62d412e._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__756711b8._.js → [root-of-the-server]__f63d6594._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__46de03a9._.js → [root-of-the-server]__febbd0b8._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{[root-of-the-server]__89c70d6f._.js → [root-of-the-server]__ff22a10e._.js} +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_a88b4884._.js → _02c78cac._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{node_modules_next_dist_08570d7f._.js → _0b36c9d6._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_0ff7c687._.js +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_0ffd2660._.js +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_37435df3._.js → _173da79d._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_4fe611fe._.js → _1c58ab2d._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_a19a362a._.js → _222af282._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_27cb3359._.js +95 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_8ebf36f6._.js → _3aa32c11._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_43472af3._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_4b5d7c9b._.js +95 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_c52176ad._.js → _4d4ba84b._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_194cda6c._.js → _50d04b8f._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_a8eaf6bc._.js → _629dc55c._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_6a367524._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_93914ecd._.js +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_94effa0f._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_a696e9b3._.js +95 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_ae20456d._.js +4 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_c838f593._.js +95 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_cd5e154b._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_fc18d7b5._.js → _e04b4053._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_e1769638._.js +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_b9d3574c._.js → _f1465cc8._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_d4878ef1._.js → _f2a7beb1._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_fbced30b._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{_8d8836a8._.js → _fc1aaf9e._.js} +3 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_agents_[id]_page_tsx_9c49d8c8._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_agents_page_tsx_f5f08ed8._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_automations_page_tsx_3d732184._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_execution-graph_page_tsx_f854185a._.js +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_global-error_tsx_9170b7a0._.js +3 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/app_projects_[slug]_page_tsx_e0fabf6e._.js +2 -2
- package/cloud-runtime/standalone/.next/server/chunks/ssr/components_chat-ui_bfeda794._.js +5 -5
- package/cloud-runtime/standalone/.next/server/chunks/ssr/components_thread_WorkspaceSidebar_tsx_e660301b._.js +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_next_dist_03ec2107._.js +4 -0
- package/cloud-runtime/standalone/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_d92e159d.js → node_modules_next_dist_esm_build_templates_app-page_61c49327.js} +3 -3
- package/cloud-runtime/standalone/.next/server/middleware-build-manifest.js +4 -4
- package/cloud-runtime/standalone/.next/server/middleware-manifest.json +5 -5
- package/cloud-runtime/standalone/.next/server/pages/404.html +13 -1
- package/cloud-runtime/standalone/.next/server/pages/500.html +2 -2
- package/cloud-runtime/standalone/.next/server/server-reference-manifest.js +1 -1
- package/cloud-runtime/standalone/.next/server/server-reference-manifest.json +1 -1
- package/cloud-runtime/standalone/.next/static/chunks/{785cb91c31bb3303.js → 09f9eeea393db0fd.js} +3 -3
- package/cloud-runtime/standalone/.next/static/chunks/1184bf1bfdf97666.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/2acd153dc5252e88.js +30 -0
- package/cloud-runtime/standalone/.next/static/chunks/2deeba875ec50761.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/45b4d0ee5c92d45b.js +93 -0
- package/cloud-runtime/standalone/.next/static/chunks/5ace4b4f4475962a.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/616d66dbec9e4b8b.js +93 -0
- package/cloud-runtime/standalone/.next/static/chunks/64f812259cf8c243.js +18 -0
- package/cloud-runtime/standalone/.next/static/chunks/6dbf5940e30fa9c7.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/7d4c1d97169c8522.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/7f13efe9329d3f97.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/80219bbddcf65109.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/{47ef8bb2118ea917.js → 86ace6febb11ad71.js} +1 -1
- package/cloud-runtime/standalone/.next/static/chunks/{90c7dbc004f59a42.js → 88e24940a5d5d386.js} +1 -1
- package/cloud-runtime/standalone/.next/static/chunks/9d50c2514f72d926.css +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/b079c677d9b39f98.js +5 -0
- package/cloud-runtime/standalone/.next/static/chunks/b4e298542d366e31.js +93 -0
- package/cloud-runtime/standalone/.next/static/chunks/b88352740262931f.js +6 -0
- package/cloud-runtime/standalone/.next/static/chunks/bd6c5b5b4fbd6413.css +2 -0
- package/cloud-runtime/standalone/.next/static/chunks/c5609fd2abb65850.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/{7ca3e4f9ed7425a8.js → d95cd010361834be.js} +1 -1
- package/cloud-runtime/standalone/.next/static/chunks/da434b1ad885d636.js +30 -0
- package/cloud-runtime/standalone/.next/static/chunks/e44264686aa5ecbf.js +93 -0
- package/cloud-runtime/standalone/.next/static/chunks/eab1c7d0246592f8.js +8 -0
- package/cloud-runtime/standalone/.next/static/chunks/f7bbf5cfcfed8ba9.js +1 -0
- package/cloud-runtime/standalone/.next/static/chunks/{turbopack-92401168917c21f2.js → turbopack-5b5918f610666d2d.js} +1 -1
- package/cloud-runtime/standalone/README.md +15 -3
- package/cloud-runtime/standalone/app/agents/[id]/page.tsx +147 -147
- package/cloud-runtime/standalone/app/agents/page.tsx +101 -101
- package/cloud-runtime/standalone/app/api/filesystem/browse/route.ts +39 -0
- package/cloud-runtime/standalone/app/api/status/route.ts +1 -1
- package/cloud-runtime/standalone/app/api/threads/route.ts +4 -5
- package/cloud-runtime/standalone/app/automations/page.tsx +1 -1
- package/cloud-runtime/standalone/app/execution-graph/page.tsx +86 -86
- package/cloud-runtime/standalone/app/global-error.tsx +54 -0
- package/cloud-runtime/standalone/app/globals.css +165 -59
- package/cloud-runtime/standalone/app/layout.tsx +17 -0
- package/cloud-runtime/standalone/app/projects/[slug]/layout.tsx +1 -1
- package/cloud-runtime/standalone/app/projects/[slug]/page.tsx +58 -58
- package/cloud-runtime/standalone/app/status/page.tsx +20 -20
- package/cloud-runtime/standalone/app/welcome/page.tsx +20 -15
- package/cloud-runtime/standalone/components/AutomationsBoard.tsx +1 -1
- package/cloud-runtime/standalone/components/ClientOnly.tsx +17 -0
- package/cloud-runtime/standalone/components/ConsentToggle/index.tsx +3 -3
- package/cloud-runtime/standalone/components/ContextMenu.tsx +123 -0
- package/cloud-runtime/standalone/components/DaemonBar.tsx +9 -9
- package/cloud-runtime/standalone/components/DirectoryBrowser.tsx +140 -0
- package/cloud-runtime/standalone/components/FirstRunModal/index.tsx +10 -10
- package/cloud-runtime/standalone/components/KanbanBoard.tsx +9 -9
- package/cloud-runtime/standalone/components/OfflineIndicator.tsx +149 -0
- package/cloud-runtime/standalone/components/ProjectModal.tsx +32 -8
- package/cloud-runtime/standalone/components/TaskCard.tsx +3 -3
- package/cloud-runtime/standalone/components/WorkspaceRootsList/index.tsx +57 -35
- package/cloud-runtime/standalone/components/chat-ui/AttachmentTray.tsx +7 -7
- package/cloud-runtime/standalone/components/chat-ui/ChatContainer.tsx +218 -121
- package/cloud-runtime/standalone/components/chat-ui/ChatPreview.tsx +4 -4
- package/cloud-runtime/standalone/components/chat-ui/CommandPopover.tsx +4 -4
- package/cloud-runtime/standalone/components/chat-ui/Composer.tsx +65 -29
- package/cloud-runtime/standalone/components/chat-ui/FileMentionPopover.tsx +4 -4
- package/cloud-runtime/standalone/components/chat-ui/FileMentionPopoverItem.tsx +9 -9
- package/cloud-runtime/standalone/components/chat-ui/LogPanel.tsx +5 -5
- package/cloud-runtime/standalone/components/chat-ui/Markdown.tsx +11 -11
- package/cloud-runtime/standalone/components/chat-ui/MentionPopover.tsx +11 -11
- package/cloud-runtime/standalone/components/chat-ui/MessageAttachments.tsx +5 -5
- package/cloud-runtime/standalone/components/chat-ui/MessageBubble.tsx +6 -6
- package/cloud-runtime/standalone/components/chat-ui/MessageList.tsx +60 -135
- package/cloud-runtime/standalone/components/chat-ui/ParticipantBar.tsx +507 -263
- package/cloud-runtime/standalone/components/chat-ui/ProjectPicker.tsx +17 -17
- package/cloud-runtime/standalone/components/chat-ui/ReactionChip.tsx +1 -1
- package/cloud-runtime/standalone/components/chat-ui/SearchResults.tsx +14 -14
- package/cloud-runtime/standalone/components/chat-ui/StatusIndicator.tsx +7 -7
- package/cloud-runtime/standalone/components/chat-ui/TaskDraftCard.tsx +14 -14
- package/cloud-runtime/standalone/components/chat-ui/TaskStatusCard.tsx +10 -10
- package/cloud-runtime/standalone/components/chat-ui/ThreadMentionPopover.tsx +8 -8
- package/cloud-runtime/standalone/components/chat-ui/ThreadView.tsx +36 -33
- package/cloud-runtime/standalone/components/chat-ui/TypingIndicator.tsx +7 -7
- package/cloud-runtime/standalone/components/errors/StartupGuardWrapper.tsx +96 -0
- package/cloud-runtime/standalone/components/thread/WorkspaceSidebar.tsx +83 -111
- package/cloud-runtime/standalone/fix-primary.js +30 -0
- package/cloud-runtime/standalone/fix-theme.js +78 -0
- package/cloud-runtime/standalone/hooks/useKeyboardShortcuts.ts +131 -0
- package/cloud-runtime/standalone/lib/history-store.ts +6 -1
- package/cloud-runtime/standalone/lib/storage/thread-adapter.ts +3 -3
- package/cloud-runtime/standalone/state/windowState.ts +179 -0
- package/cloud-runtime/standalone/styles/workspaceSidebar.css +89 -94
- package/cloud-runtime/standalone/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__5ea3dff5._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__931817d6._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__d2c48923._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__e68a6e30._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/[root-of-the-server]__fad8b80a._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_181427d4._.js +0 -95
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_7dbc349d._.js +0 -95
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_8bbe2ac1._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_a17cabe8._.js +0 -95
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_cf5fdbfb._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_e05b04a5._.js +0 -4
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_f2970e5f._.js +0 -4
- package/cloud-runtime/standalone/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js +0 -3
- package/cloud-runtime/standalone/.next/static/chunks/047593c886feba72.css +0 -2
- package/cloud-runtime/standalone/.next/static/chunks/0c589ec8063c3a1f.js +0 -30
- package/cloud-runtime/standalone/.next/static/chunks/1826707bd2f73ca6.js +0 -8
- package/cloud-runtime/standalone/.next/static/chunks/2a3594d4cb2efe79.css +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/32f13ace6661115d.js +0 -93
- package/cloud-runtime/standalone/.next/static/chunks/3b0a3b913dd15028.js +0 -30
- package/cloud-runtime/standalone/.next/static/chunks/4ee6151684568990.js +0 -93
- package/cloud-runtime/standalone/.next/static/chunks/5aad4adabb65cd20.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/5f5ae2ea4fa2b8f0.js +0 -12
- package/cloud-runtime/standalone/.next/static/chunks/6bb1ecbc3b80922c.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/7657d70cc0c40c81.js +0 -6
- package/cloud-runtime/standalone/.next/static/chunks/78f6cef7d2129d30.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/7f2513325b592f25.js +0 -18
- package/cloud-runtime/standalone/.next/static/chunks/81704a1c525bf2ee.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/8b658ccf17b771b9.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/b39122b85655e5b0.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/b8ca4cb386211980.js +0 -5
- package/cloud-runtime/standalone/.next/static/chunks/e103488c85a7b445.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/e355ac901e70f43d.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/ebebe08434070698.js +0 -93
- /package/cloud-runtime/standalone/.next/static/{R2CPNTvy5domQF90j_DYV → Rn0z3Af30mHwrHLLwgKlz}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/.next/static/{R2CPNTvy5domQF90j_DYV → Rn0z3Af30mHwrHLLwgKlz}/_clientMiddlewareManifest.json +0 -0
- /package/cloud-runtime/standalone/.next/static/{R2CPNTvy5domQF90j_DYV → Rn0z3Af30mHwrHLLwgKlz}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React, { useEffect, useState, useRef, useCallback } from "react";
|
|
4
|
+
|
|
5
|
+
export interface ContextMenuItem {
|
|
6
|
+
label: string;
|
|
7
|
+
icon?: React.ReactNode;
|
|
8
|
+
shortcut?: string;
|
|
9
|
+
action: () => void;
|
|
10
|
+
destructive?: boolean;
|
|
11
|
+
divider?: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface ContextMenuProps {
|
|
15
|
+
items: ContextMenuItem[];
|
|
16
|
+
children: React.ReactNode;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function ContextMenu({ items, children }: ContextMenuProps) {
|
|
20
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
21
|
+
const [position, setPosition] = useState({ x: 0, y: 0 });
|
|
22
|
+
const [focusIndex, setFocusIndex] = useState(-1);
|
|
23
|
+
const menuRef = useRef<HTMLDivElement>(null);
|
|
24
|
+
|
|
25
|
+
const close = useCallback(() => {
|
|
26
|
+
setIsOpen(false);
|
|
27
|
+
setFocusIndex(-1);
|
|
28
|
+
}, []);
|
|
29
|
+
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!isOpen) return;
|
|
32
|
+
|
|
33
|
+
const handleClickOutside = (e: MouseEvent) => {
|
|
34
|
+
if (menuRef.current && !menuRef.current.contains(e.target as Node)) {
|
|
35
|
+
close();
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const handleKeyDown = (e: KeyboardEvent) => {
|
|
40
|
+
if (e.key === "Escape") {
|
|
41
|
+
close();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const actionItems = items.filter((item) => !item.divider);
|
|
46
|
+
if (e.key === "ArrowDown") {
|
|
47
|
+
e.preventDefault();
|
|
48
|
+
setFocusIndex((prev) => (prev + 1) % actionItems.length);
|
|
49
|
+
} else if (e.key === "ArrowUp") {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
setFocusIndex((prev) => (prev - 1 + actionItems.length) % actionItems.length);
|
|
52
|
+
} else if (e.key === "Enter" && focusIndex >= 0) {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
actionItems[focusIndex]?.action();
|
|
55
|
+
close();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
60
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
61
|
+
return () => {
|
|
62
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
63
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
64
|
+
};
|
|
65
|
+
}, [isOpen, close, focusIndex, items]);
|
|
66
|
+
|
|
67
|
+
// Reposition if menu would overflow viewport
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (!isOpen || !menuRef.current) return;
|
|
70
|
+
const rect = menuRef.current.getBoundingClientRect();
|
|
71
|
+
let { x, y } = position;
|
|
72
|
+
if (rect.right > window.innerWidth - 8) x = window.innerWidth - rect.width - 8;
|
|
73
|
+
if (rect.bottom > window.innerHeight - 8) y = window.innerHeight - rect.height - 8;
|
|
74
|
+
if (x !== position.x || y !== position.y) setPosition({ x, y });
|
|
75
|
+
}, [isOpen, position]);
|
|
76
|
+
|
|
77
|
+
const handleContextMenu = (e: React.MouseEvent) => {
|
|
78
|
+
e.preventDefault();
|
|
79
|
+
setPosition({ x: e.clientX, y: e.clientY });
|
|
80
|
+
setFocusIndex(-1);
|
|
81
|
+
setIsOpen(true);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
let actionIndex = -1;
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<>
|
|
88
|
+
<div onContextMenu={handleContextMenu} className="w-full h-full">
|
|
89
|
+
{children}
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
{isOpen && (
|
|
93
|
+
<div
|
|
94
|
+
ref={menuRef}
|
|
95
|
+
style={{ top: position.y, left: position.x }}
|
|
96
|
+
className="context-menu"
|
|
97
|
+
>
|
|
98
|
+
{items.map((item, index) => {
|
|
99
|
+
if (item.divider) {
|
|
100
|
+
return <div key={index} className="context-menu__divider" />;
|
|
101
|
+
}
|
|
102
|
+
actionIndex++;
|
|
103
|
+
const isFocused = actionIndex === focusIndex;
|
|
104
|
+
return (
|
|
105
|
+
<button
|
|
106
|
+
key={index}
|
|
107
|
+
onClick={() => {
|
|
108
|
+
item.action();
|
|
109
|
+
close();
|
|
110
|
+
}}
|
|
111
|
+
className={`context-menu__item ${item.destructive ? "context-menu__item--destructive" : ""} ${isFocused ? "context-menu__item--focused" : ""}`}
|
|
112
|
+
>
|
|
113
|
+
{item.icon && <span className="context-menu__icon">{item.icon}</span>}
|
|
114
|
+
<span className="context-menu__label">{item.label}</span>
|
|
115
|
+
{item.shortcut && <span className="context-menu__shortcut">{item.shortcut}</span>}
|
|
116
|
+
</button>
|
|
117
|
+
);
|
|
118
|
+
})}
|
|
119
|
+
</div>
|
|
120
|
+
)}
|
|
121
|
+
</>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
@@ -73,18 +73,18 @@ export default function DaemonBar() {
|
|
|
73
73
|
const running = status.running;
|
|
74
74
|
|
|
75
75
|
return (
|
|
76
|
-
<div className="flex items-center gap-3 py-2 text-xs text-
|
|
76
|
+
<div className="flex items-center gap-3 py-2 text-xs text-[var(--muted-foreground)]">
|
|
77
77
|
{/* Status dot + label */}
|
|
78
78
|
<button
|
|
79
79
|
type="button"
|
|
80
80
|
onClick={toggle}
|
|
81
81
|
disabled={loading}
|
|
82
|
-
className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full border border-
|
|
82
|
+
className="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full border border-[var(--border)] hover:border-[var(--border)] transition-colors disabled:opacity-50"
|
|
83
83
|
>
|
|
84
84
|
<span
|
|
85
|
-
className={`w-1.5 h-1.5 rounded-full ${running ? "bg-emerald-500" : "bg-
|
|
85
|
+
className={`w-1.5 h-1.5 rounded-full ${running ? "bg-emerald-500" : "bg-[var(--app-shell-soft-text)]"}`}
|
|
86
86
|
/>
|
|
87
|
-
<span className="font-medium text-
|
|
87
|
+
<span className="font-medium text-[var(--muted-foreground)]">
|
|
88
88
|
{loading ? "..." : running ? "Daemon running" : "Daemon stopped"}
|
|
89
89
|
</span>
|
|
90
90
|
</button>
|
|
@@ -92,23 +92,23 @@ export default function DaemonBar() {
|
|
|
92
92
|
{running && (
|
|
93
93
|
<>
|
|
94
94
|
{/* Worker count with +/- */}
|
|
95
|
-
<div className="inline-flex items-center rounded-full border border-
|
|
95
|
+
<div className="inline-flex items-center rounded-full border border-[var(--border)] overflow-hidden">
|
|
96
96
|
<button
|
|
97
97
|
type="button"
|
|
98
98
|
onClick={() => scale(-1)}
|
|
99
99
|
disabled={loading || status.targetWorkers <= 1}
|
|
100
|
-
className="px-1.5 py-0.5 hover:bg-
|
|
100
|
+
className="px-1.5 py-0.5 hover:bg-[var(--muted)] transition-colors disabled:opacity-30 text-[var(--muted-foreground)]"
|
|
101
101
|
>
|
|
102
102
|
-
|
|
103
103
|
</button>
|
|
104
|
-
<span className="px-2 py-0.5 font-mono text-
|
|
104
|
+
<span className="px-2 py-0.5 font-mono text-[var(--muted-foreground)] border-x border-[var(--border)]">
|
|
105
105
|
{status.activeWorkers}/{status.targetWorkers}w
|
|
106
106
|
</span>
|
|
107
107
|
<button
|
|
108
108
|
type="button"
|
|
109
109
|
onClick={() => scale(1)}
|
|
110
110
|
disabled={loading || status.targetWorkers >= status.maxWorkers}
|
|
111
|
-
className="px-1.5 py-0.5 hover:bg-
|
|
111
|
+
className="px-1.5 py-0.5 hover:bg-[var(--muted)] transition-colors disabled:opacity-30 text-[var(--muted-foreground)]"
|
|
112
112
|
>
|
|
113
113
|
+
|
|
114
114
|
</button>
|
|
@@ -116,7 +116,7 @@ export default function DaemonBar() {
|
|
|
116
116
|
|
|
117
117
|
{/* Uptime */}
|
|
118
118
|
{status.startedAt && (
|
|
119
|
-
<span className="text-
|
|
119
|
+
<span className="text-[var(--muted-foreground)]">
|
|
120
120
|
up since {new Date(status.startedAt).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })}
|
|
121
121
|
</span>
|
|
122
122
|
)}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
+
|
|
5
|
+
interface DirEntry {
|
|
6
|
+
name: string;
|
|
7
|
+
path: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface BrowseResult {
|
|
11
|
+
current: string;
|
|
12
|
+
parent: string | null;
|
|
13
|
+
dirs: DirEntry[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default function DirectoryBrowser({
|
|
17
|
+
initialPath,
|
|
18
|
+
onSelect,
|
|
19
|
+
onCancel,
|
|
20
|
+
}: {
|
|
21
|
+
initialPath: string;
|
|
22
|
+
onSelect: (path: string) => void;
|
|
23
|
+
onCancel: () => void;
|
|
24
|
+
}) {
|
|
25
|
+
const [browsePath, setBrowsePath] = useState(initialPath || "");
|
|
26
|
+
const [result, setResult] = useState<BrowseResult | null>(null);
|
|
27
|
+
const [loading, setLoading] = useState(false);
|
|
28
|
+
const [error, setError] = useState<string | null>(null);
|
|
29
|
+
const listRef = useRef<HTMLDivElement>(null);
|
|
30
|
+
|
|
31
|
+
const fetchDir = useCallback(async (dirPath: string) => {
|
|
32
|
+
setLoading(true);
|
|
33
|
+
setError(null);
|
|
34
|
+
try {
|
|
35
|
+
const params = dirPath ? `?path=${encodeURIComponent(dirPath)}` : "";
|
|
36
|
+
const res = await fetch(`/api/filesystem/browse${params}`);
|
|
37
|
+
const data = await res.json();
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
setError(data.error || "Failed to browse");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
setResult(data);
|
|
43
|
+
setBrowsePath(data.current);
|
|
44
|
+
listRef.current?.scrollTo(0, 0);
|
|
45
|
+
} catch {
|
|
46
|
+
setError("Failed to connect");
|
|
47
|
+
} finally {
|
|
48
|
+
setLoading(false);
|
|
49
|
+
}
|
|
50
|
+
}, []);
|
|
51
|
+
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
fetchDir(initialPath || "");
|
|
54
|
+
}, []);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<div className="rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] overflow-hidden shadow-lg">
|
|
58
|
+
{/* Path bar */}
|
|
59
|
+
<div className="flex items-center gap-2 px-3 py-2 border-b border-[var(--card-border)] bg-[var(--muted)]/30">
|
|
60
|
+
<input
|
|
61
|
+
value={browsePath}
|
|
62
|
+
onChange={(e) => setBrowsePath(e.target.value)}
|
|
63
|
+
onKeyDown={(e) => {
|
|
64
|
+
if (e.key === "Enter") fetchDir(browsePath);
|
|
65
|
+
}}
|
|
66
|
+
className="input text-xs flex-1 py-1"
|
|
67
|
+
placeholder="Enter path..."
|
|
68
|
+
/>
|
|
69
|
+
<button
|
|
70
|
+
type="button"
|
|
71
|
+
onClick={() => fetchDir(browsePath)}
|
|
72
|
+
className="text-[10px] font-bold uppercase tracking-wider text-[var(--primary)] hover:underline px-2 py-1 shrink-0"
|
|
73
|
+
>
|
|
74
|
+
Go
|
|
75
|
+
</button>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
{/* Directory listing */}
|
|
79
|
+
<div ref={listRef} className="max-h-48 overflow-y-auto">
|
|
80
|
+
{loading && (
|
|
81
|
+
<div className="px-3 py-4 text-xs text-[var(--muted-foreground)] text-center">Loading...</div>
|
|
82
|
+
)}
|
|
83
|
+
{error && (
|
|
84
|
+
<div className="px-3 py-4 text-xs text-[var(--destructive)] text-center">{error}</div>
|
|
85
|
+
)}
|
|
86
|
+
{!loading && result && (
|
|
87
|
+
<div className="py-1">
|
|
88
|
+
{result.parent && (
|
|
89
|
+
<button
|
|
90
|
+
type="button"
|
|
91
|
+
onClick={() => fetchDir(result.parent!)}
|
|
92
|
+
className="w-full text-left px-3 py-1.5 text-sm hover:bg-[var(--muted)]/50 transition-colors flex items-center gap-2"
|
|
93
|
+
>
|
|
94
|
+
<span className="text-[var(--muted-foreground)]">↑</span>
|
|
95
|
+
<span className="text-[var(--muted-foreground)]">..</span>
|
|
96
|
+
</button>
|
|
97
|
+
)}
|
|
98
|
+
{result.dirs.length === 0 && !result.parent && (
|
|
99
|
+
<div className="px-3 py-3 text-xs text-[var(--muted-foreground)] text-center">No subdirectories</div>
|
|
100
|
+
)}
|
|
101
|
+
{result.dirs.map((dir) => (
|
|
102
|
+
<button
|
|
103
|
+
key={dir.path}
|
|
104
|
+
type="button"
|
|
105
|
+
onClick={() => fetchDir(dir.path)}
|
|
106
|
+
className="w-full text-left px-3 py-1.5 text-sm hover:bg-[var(--muted)]/50 transition-colors flex items-center gap-2"
|
|
107
|
+
>
|
|
108
|
+
<span className="text-[var(--muted-foreground)]">📁</span>
|
|
109
|
+
<span className="truncate">{dir.name}</span>
|
|
110
|
+
</button>
|
|
111
|
+
))}
|
|
112
|
+
</div>
|
|
113
|
+
)}
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
{/* Actions */}
|
|
117
|
+
<div className="flex items-center justify-between px-3 py-2 border-t border-[var(--card-border)] bg-[var(--muted)]/30">
|
|
118
|
+
<span className="text-[10px] text-[var(--muted-foreground)] truncate max-w-[60%]">
|
|
119
|
+
{result?.current || browsePath}
|
|
120
|
+
</span>
|
|
121
|
+
<div className="flex items-center gap-2">
|
|
122
|
+
<button
|
|
123
|
+
type="button"
|
|
124
|
+
onClick={onCancel}
|
|
125
|
+
className="text-xs font-medium text-[var(--muted-foreground)] hover:underline px-2 py-1"
|
|
126
|
+
>
|
|
127
|
+
Cancel
|
|
128
|
+
</button>
|
|
129
|
+
<button
|
|
130
|
+
type="button"
|
|
131
|
+
onClick={() => onSelect(result?.current || browsePath)}
|
|
132
|
+
className="text-xs font-bold text-[var(--primary)] hover:underline px-2 py-1"
|
|
133
|
+
>
|
|
134
|
+
Select
|
|
135
|
+
</button>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
);
|
|
140
|
+
}
|
|
@@ -111,23 +111,23 @@ export const FirstRunModal: React.FC<FirstRunModalProps> = ({
|
|
|
111
111
|
aria-modal="true"
|
|
112
112
|
aria-labelledby={headingId}
|
|
113
113
|
aria-describedby={descId}
|
|
114
|
-
className="relative w-full max-w-lg rounded-xl bg-
|
|
114
|
+
className="relative w-full max-w-lg rounded-xl bg-[var(--card-bg)] shadow-xl ring-1 ring-[var(--border)] flex flex-col max-h-[90vh] min-w-0"
|
|
115
115
|
>
|
|
116
116
|
{/* Header */}
|
|
117
|
-
<div className="px-4 sm:px-6 pt-5 sm:pt-6 pb-4 border-b border-
|
|
117
|
+
<div className="px-4 sm:px-6 pt-5 sm:pt-6 pb-4 border-b border-[var(--border)]">
|
|
118
118
|
<h2
|
|
119
119
|
id={headingId}
|
|
120
|
-
className="text-lg font-semibold text-
|
|
120
|
+
className="text-lg font-semibold text-[var(--foreground)] leading-snug"
|
|
121
121
|
>
|
|
122
122
|
Set up your workspace
|
|
123
123
|
</h2>
|
|
124
124
|
<p
|
|
125
125
|
id={descId}
|
|
126
|
-
className="mt-1 text-sm text-
|
|
126
|
+
className="mt-1 text-sm text-[var(--muted-foreground)] leading-relaxed"
|
|
127
127
|
>
|
|
128
128
|
Add one or more folders where you keep your projects. agx-chat will
|
|
129
129
|
use these to suggest files when you type{" "}
|
|
130
|
-
<code className="rounded bg-
|
|
130
|
+
<code className="rounded bg-[var(--muted)] px-1 py-0.5 text-xs font-mono text-[var(--foreground)]">
|
|
131
131
|
@filename
|
|
132
132
|
</code>
|
|
133
133
|
.
|
|
@@ -140,7 +140,7 @@ export const FirstRunModal: React.FC<FirstRunModalProps> = ({
|
|
|
140
140
|
<section aria-labelledby="first-run-roots-heading">
|
|
141
141
|
<h3
|
|
142
142
|
id="first-run-roots-heading"
|
|
143
|
-
className="text-sm font-semibold text-
|
|
143
|
+
className="text-sm font-semibold text-[var(--foreground)] mb-3"
|
|
144
144
|
>
|
|
145
145
|
Workspace folders
|
|
146
146
|
</h3>
|
|
@@ -169,11 +169,11 @@ export const FirstRunModal: React.FC<FirstRunModalProps> = ({
|
|
|
169
169
|
{/* Home search consent */}
|
|
170
170
|
<section
|
|
171
171
|
aria-labelledby="first-run-consent-heading"
|
|
172
|
-
className="border-t border-
|
|
172
|
+
className="border-t border-[var(--border)] pt-5"
|
|
173
173
|
>
|
|
174
174
|
<h3
|
|
175
175
|
id="first-run-consent-heading"
|
|
176
|
-
className="text-sm font-semibold text-
|
|
176
|
+
className="text-sm font-semibold text-[var(--foreground)] mb-3"
|
|
177
177
|
>
|
|
178
178
|
Home directory search
|
|
179
179
|
</h3>
|
|
@@ -186,11 +186,11 @@ export const FirstRunModal: React.FC<FirstRunModalProps> = ({
|
|
|
186
186
|
</div>
|
|
187
187
|
|
|
188
188
|
{/* Footer */}
|
|
189
|
-
<div className="px-4 sm:px-6 py-4 border-t border-
|
|
189
|
+
<div className="px-4 sm:px-6 py-4 border-t border-[var(--border)] flex flex-col-reverse sm:flex-row justify-between gap-3">
|
|
190
190
|
<button
|
|
191
191
|
type="button"
|
|
192
192
|
onClick={handleSkip}
|
|
193
|
-
className="text-sm text-
|
|
193
|
+
className="text-sm text-[var(--muted-foreground)] hover:text-[var(--foreground)] underline underline-offset-2 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--border)] rounded"
|
|
194
194
|
>
|
|
195
195
|
Skip for now
|
|
196
196
|
</button>
|
|
@@ -503,21 +503,21 @@ function StageColumn({
|
|
|
503
503
|
data-testid={stage}
|
|
504
504
|
className={`
|
|
505
505
|
w-full xl:flex-shrink-0 xl:w-80 flex flex-col min-h-0
|
|
506
|
-
bg-
|
|
506
|
+
bg-[var(--muted)]/40 rounded-2xl border border-[var(--border)]/50 shadow-inner overflow-hidden
|
|
507
507
|
transition-all duration-200
|
|
508
508
|
${isOver ? 'ring-2 ring-[var(--primary)] ring-opacity-30 bg-[var(--primary-muted)]/10' : ''}
|
|
509
509
|
`}
|
|
510
510
|
style={{ animationDelay: `${index * 50}ms` }}
|
|
511
511
|
>
|
|
512
512
|
{/* Glassmorphic Column Header */}
|
|
513
|
-
<div className="p-4 flex items-center justify-between bg-
|
|
513
|
+
<div className="p-4 flex items-center justify-between bg-[var(--card-bg)]/30 backdrop-blur-sm border-b border-[var(--border)]/20">
|
|
514
514
|
<div className="flex items-center gap-3">
|
|
515
515
|
<span className="text-lg">{config.icon}</span>
|
|
516
|
-
<h3 className="font-bold text-[11px] uppercase tracking-widest text-
|
|
516
|
+
<h3 className="font-bold text-[11px] uppercase tracking-widest text-[var(--muted-foreground)]">
|
|
517
517
|
{config.label}
|
|
518
518
|
</h3>
|
|
519
519
|
</div>
|
|
520
|
-
<span className="text-[10px] font-bold text-
|
|
520
|
+
<span className="text-[10px] font-bold text-[var(--muted-foreground)] bg-[var(--card-bg)] px-2 py-0.5 rounded-full border border-[var(--border)]">
|
|
521
521
|
{tasks.length}
|
|
522
522
|
</span>
|
|
523
523
|
</div>
|
|
@@ -598,10 +598,10 @@ function FlatColumnContent({ stage, tasks, allTasks, selectedTaskId, setSelected
|
|
|
598
598
|
<button
|
|
599
599
|
onClick={(e) => { e.stopPropagation(); handleAddClick(); }}
|
|
600
600
|
disabled={isCreating}
|
|
601
|
-
className="w-full py-2.5 rounded-xl border border-dashed border-
|
|
601
|
+
className="w-full py-2.5 rounded-xl border border-dashed border-[var(--border)] text-[var(--muted-foreground)] text-[10px] font-bold uppercase tracking-widest hover:bg-[var(--card-bg)] hover:border-indigo-200 hover:text-indigo-400 transition-all flex items-center justify-center gap-2 mb-1"
|
|
602
602
|
>
|
|
603
603
|
{isCreating ? (
|
|
604
|
-
<span className="spinner w-3 h-3 border-2 border-
|
|
604
|
+
<span className="spinner w-3 h-3 border-2 border-[var(--border)] border-t-indigo-400 rounded-full" />
|
|
605
605
|
) : (
|
|
606
606
|
<>
|
|
607
607
|
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none"
|
|
@@ -616,7 +616,7 @@ function FlatColumnContent({ stage, tasks, allTasks, selectedTaskId, setSelected
|
|
|
616
616
|
|
|
617
617
|
{/* Inline editable placeholder */}
|
|
618
618
|
{isAdding && (
|
|
619
|
-
<div className="bg-
|
|
619
|
+
<div className="bg-[var(--card-bg)] border-2 border-indigo-400 rounded-xl p-3 shadow-lg shadow-indigo-50 mb-1" onClick={(e) => e.stopPropagation()}>
|
|
620
620
|
<input
|
|
621
621
|
ref={inputRef}
|
|
622
622
|
type="text"
|
|
@@ -631,9 +631,9 @@ function FlatColumnContent({ stage, tasks, allTasks, selectedTaskId, setSelected
|
|
|
631
631
|
else handleSave();
|
|
632
632
|
}}
|
|
633
633
|
placeholder="Task title..."
|
|
634
|
-
className="w-full text-sm font-medium text-
|
|
634
|
+
className="w-full text-sm font-medium text-[var(--foreground)] bg-transparent outline-none placeholder:text-[var(--muted-foreground)]"
|
|
635
635
|
/>
|
|
636
|
-
<p className="text-[10px] text-
|
|
636
|
+
<p className="text-[10px] text-[var(--muted-foreground)] mt-1">Press Enter to create · Esc to cancel</p>
|
|
637
637
|
</div>
|
|
638
638
|
)}
|
|
639
639
|
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect } from "react";
|
|
4
|
+
import { WifiOff, Wifi } from "lucide-react";
|
|
5
|
+
|
|
6
|
+
interface OfflineIndicatorProps {
|
|
7
|
+
/** Custom check interval in milliseconds (default: 30000) */
|
|
8
|
+
checkInterval?: number;
|
|
9
|
+
/** Custom endpoint to check (default: /api/health) */
|
|
10
|
+
checkEndpoint?: string;
|
|
11
|
+
/** Show reconnecting status when coming back online */
|
|
12
|
+
showReconnecting?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Offline indicator that shows when the app loses connection to the backend.
|
|
17
|
+
* Displays a subtle banner at the top of the screen.
|
|
18
|
+
*/
|
|
19
|
+
export function OfflineIndicator({
|
|
20
|
+
checkInterval = 30000,
|
|
21
|
+
checkEndpoint = "/api/health",
|
|
22
|
+
showReconnecting = true,
|
|
23
|
+
}: OfflineIndicatorProps) {
|
|
24
|
+
const [isOnline, setIsOnline] = useState(true);
|
|
25
|
+
const [isReconnecting, setIsReconnecting] = useState(false);
|
|
26
|
+
const [lastOnlineTime, setLastOnlineTime] = useState<Date | null>(null);
|
|
27
|
+
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
let checkTimer: NodeJS.Timeout;
|
|
30
|
+
let reconnectAttempts = 0;
|
|
31
|
+
const maxReconnectAttempts = 5;
|
|
32
|
+
const reconnectDelay = 2000;
|
|
33
|
+
|
|
34
|
+
const checkConnection = async () => {
|
|
35
|
+
try {
|
|
36
|
+
const response = await fetch(checkEndpoint, {
|
|
37
|
+
method: "HEAD",
|
|
38
|
+
cache: "no-store",
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
if (response.ok) {
|
|
42
|
+
setIsOnline(true);
|
|
43
|
+
setIsReconnecting(false);
|
|
44
|
+
setLastOnlineTime(new Date());
|
|
45
|
+
reconnectAttempts = 0;
|
|
46
|
+
} else {
|
|
47
|
+
setIsOnline(false);
|
|
48
|
+
}
|
|
49
|
+
} catch {
|
|
50
|
+
setIsOnline(false);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const handleOffline = () => {
|
|
55
|
+
setIsOnline(false);
|
|
56
|
+
setLastOnlineTime(new Date());
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const handleOnline = () => {
|
|
60
|
+
setIsReconnecting(true);
|
|
61
|
+
checkConnection();
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Listen for browser online/offline events
|
|
65
|
+
window.addEventListener("offline", handleOffline);
|
|
66
|
+
window.addEventListener("online", handleOnline);
|
|
67
|
+
|
|
68
|
+
// Periodic health checks
|
|
69
|
+
checkTimer = setInterval(checkConnection, checkInterval);
|
|
70
|
+
|
|
71
|
+
// Initial check
|
|
72
|
+
checkConnection();
|
|
73
|
+
|
|
74
|
+
return () => {
|
|
75
|
+
window.removeEventListener("offline", handleOffline);
|
|
76
|
+
window.removeEventListener("online", handleOnline);
|
|
77
|
+
clearInterval(checkTimer);
|
|
78
|
+
};
|
|
79
|
+
}, [checkEndpoint, checkInterval]);
|
|
80
|
+
|
|
81
|
+
// Don't render anything when online
|
|
82
|
+
if (isOnline && !isReconnecting) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<div
|
|
88
|
+
className="fixed top-0 left-0 right-0 z-[100] px-4 py-2 flex items-center justify-center gap-2 text-sm font-medium animate-fade-in-down"
|
|
89
|
+
style={{
|
|
90
|
+
background: isOnline
|
|
91
|
+
? "var(--success-muted)"
|
|
92
|
+
: "var(--destructive-muted)",
|
|
93
|
+
color: isOnline ? "var(--success)" : "var(--destructive)",
|
|
94
|
+
borderBottom: `1px solid ${isOnline ? "var(--status-completed-border)" : "var(--status-failed-border)"}`,
|
|
95
|
+
}}
|
|
96
|
+
>
|
|
97
|
+
{isOnline ? (
|
|
98
|
+
<>
|
|
99
|
+
<Wifi size={14} />
|
|
100
|
+
<span>Reconnected</span>
|
|
101
|
+
</>
|
|
102
|
+
) : (
|
|
103
|
+
<>
|
|
104
|
+
<WifiOff size={14} />
|
|
105
|
+
<span>Offline</span>
|
|
106
|
+
{lastOnlineTime && (
|
|
107
|
+
<span className="opacity-70">
|
|
108
|
+
— Last synced {formatTimeAgo(lastOnlineTime)}
|
|
109
|
+
</span>
|
|
110
|
+
)}
|
|
111
|
+
</>
|
|
112
|
+
)}
|
|
113
|
+
</div>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function formatTimeAgo(date: Date): string {
|
|
118
|
+
const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
|
|
119
|
+
|
|
120
|
+
if (seconds < 60) return "just now";
|
|
121
|
+
if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;
|
|
122
|
+
if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;
|
|
123
|
+
return `${Math.floor(seconds / 86400)}d ago`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Add the animation keyframe to globals.css or inline
|
|
127
|
+
const styles = `
|
|
128
|
+
@keyframes fade-in-down {
|
|
129
|
+
from {
|
|
130
|
+
opacity: 0;
|
|
131
|
+
transform: translateY(-100%);
|
|
132
|
+
}
|
|
133
|
+
to {
|
|
134
|
+
opacity: 1;
|
|
135
|
+
transform: translateY(0);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
`;
|
|
139
|
+
|
|
140
|
+
// Inject styles if not already present
|
|
141
|
+
if (typeof document !== "undefined") {
|
|
142
|
+
const styleId = "offline-indicator-styles";
|
|
143
|
+
if (!document.getElementById(styleId)) {
|
|
144
|
+
const style = document.createElement("style");
|
|
145
|
+
style.id = styleId;
|
|
146
|
+
style.textContent = styles;
|
|
147
|
+
document.head.appendChild(style);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
4
|
import { ProjectWithRepos } from "@/hooks/useProjects";
|
|
5
|
+
import DirectoryBrowser from "@/components/DirectoryBrowser";
|
|
5
6
|
|
|
6
7
|
export interface ProjectFormState {
|
|
7
8
|
name: string;
|
|
@@ -135,6 +136,7 @@ function ProjectFormFields({
|
|
|
135
136
|
onRemoveRepo: (index: number) => void;
|
|
136
137
|
}) {
|
|
137
138
|
const [expandedRepoIndexes, setExpandedRepoIndexes] = useState<number[]>([]);
|
|
139
|
+
const [browsingRepoIndex, setBrowsingRepoIndex] = useState<number | null>(null);
|
|
138
140
|
const previousRepoCountRef = useRef(0);
|
|
139
141
|
|
|
140
142
|
useEffect(() => {
|
|
@@ -266,13 +268,35 @@ function ProjectFormFields({
|
|
|
266
268
|
className="input text-sm"
|
|
267
269
|
disabled={isSubmitting}
|
|
268
270
|
/>
|
|
269
|
-
<
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
271
|
+
<div className="flex items-center gap-2">
|
|
272
|
+
<input
|
|
273
|
+
value={repo.path}
|
|
274
|
+
onChange={(e) => onRepoChange(index, "path", e.target.value)}
|
|
275
|
+
placeholder="Local path (mandatory)"
|
|
276
|
+
className="input text-sm flex-1"
|
|
277
|
+
disabled={isSubmitting}
|
|
278
|
+
/>
|
|
279
|
+
<button
|
|
280
|
+
type="button"
|
|
281
|
+
onClick={() => setBrowsingRepoIndex(browsingRepoIndex === index ? null : index)}
|
|
282
|
+
className="px-3 py-2 rounded-xl border border-[var(--card-border)] bg-[var(--muted)]/30 hover:bg-[var(--muted)]/60 transition-colors text-xs font-semibold text-[var(--muted-foreground)] whitespace-nowrap"
|
|
283
|
+
disabled={isSubmitting}
|
|
284
|
+
>
|
|
285
|
+
Browse
|
|
286
|
+
</button>
|
|
287
|
+
</div>
|
|
288
|
+
{browsingRepoIndex === index && (
|
|
289
|
+
<div className="md:col-span-2">
|
|
290
|
+
<DirectoryBrowser
|
|
291
|
+
initialPath={repo.path || ""}
|
|
292
|
+
onSelect={(selectedPath) => {
|
|
293
|
+
onRepoChange(index, "path", selectedPath);
|
|
294
|
+
setBrowsingRepoIndex(null);
|
|
295
|
+
}}
|
|
296
|
+
onCancel={() => setBrowsingRepoIndex(null)}
|
|
297
|
+
/>
|
|
298
|
+
</div>
|
|
299
|
+
)}
|
|
276
300
|
<div className="md:col-span-2">
|
|
277
301
|
<textarea
|
|
278
302
|
value={repo.notes}
|
|
@@ -381,7 +405,7 @@ export default function ProjectModal({
|
|
|
381
405
|
{projectGeneratedKnowledge.length > 0 ? (
|
|
382
406
|
<div className="mt-3 space-y-2">
|
|
383
407
|
{projectGeneratedKnowledge.slice(0, 5).map((item) => (
|
|
384
|
-
<div key={item.id} className="rounded-xl border border-[var(--card-border)] bg-
|
|
408
|
+
<div key={item.id} className="rounded-xl border border-[var(--card-border)] bg-[var(--card-bg)] px-3 py-2 text-sm text-[var(--foreground)]">
|
|
385
409
|
<div>{item.content}</div>
|
|
386
410
|
{item.created_at ? (
|
|
387
411
|
<div className="mt-1 text-[11px] text-[var(--muted-foreground)]">{new Date(item.created_at).toLocaleString()}</div>
|