@mndrk/agx 2.0.22 → 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/{_a19a362a._.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/{_a88b4884._.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/_d021529a._.js +3 -0
- 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 +115 -310
- 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 +173 -193
- 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]__3fe0b1a1._.js +0 -3
- 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]__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/_2da02644._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_60f7e403._.js +0 -3
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_7dbc349d._.js +0 -95
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_a17cabe8._.js +0 -95
- package/cloud-runtime/standalone/.next/server/chunks/ssr/_d743f11d._.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_lucide-react_dist_esm_icons_001a8448._.js +0 -3
- 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/1f1b912fe2e3d5bd.js +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/4b3358c52d01a3f9.css +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/4ee6151684568990.js +0 -93
- package/cloud-runtime/standalone/.next/static/chunks/5488a71a8515e8b2.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/5aad4adabb65cd20.js +0 -1
- package/cloud-runtime/standalone/.next/static/chunks/5ce01dbd17ce3bb2.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/7f2513325b592f25.js +0 -18
- 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/b649593a57df218f.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/{H3MuYxcqCPfZoSC2uYW8f → Rn0z3Af30mHwrHLLwgKlz}/_buildManifest.js +0 -0
- /package/cloud-runtime/standalone/.next/static/{H3MuYxcqCPfZoSC2uYW8f → Rn0z3Af30mHwrHLLwgKlz}/_clientMiddlewareManifest.json +0 -0
- /package/cloud-runtime/standalone/.next/static/{H3MuYxcqCPfZoSC2uYW8f → Rn0z3Af30mHwrHLLwgKlz}/_ssgManifest.js +0 -0
|
@@ -12,6 +12,8 @@ import {
|
|
|
12
12
|
FolderOpen,
|
|
13
13
|
ChevronDown,
|
|
14
14
|
GripVertical,
|
|
15
|
+
Copy,
|
|
16
|
+
Check,
|
|
15
17
|
} from 'lucide-react';
|
|
16
18
|
import RichTextEditor from "@/components/RichTextEditor";
|
|
17
19
|
import {
|
|
@@ -86,11 +88,11 @@ function SortableAgentItem({
|
|
|
86
88
|
return (
|
|
87
89
|
<div ref={setNodeRef} style={style} className="relative group">
|
|
88
90
|
<div
|
|
89
|
-
className={`w-full flex items-center justify-between gap-1 px-1.5 py-1.5 rounded-md transition-colors ${isActive ? "text-
|
|
91
|
+
className={`w-full flex items-center justify-between gap-1 px-1.5 py-1.5 rounded-md transition-colors ${isActive ? "text-[var(--foreground)] hover:bg-[var(--muted)]" : "text-[var(--muted-foreground)] hover:bg-[var(--app-shell-subtle)]"}`}
|
|
90
92
|
>
|
|
91
93
|
<button
|
|
92
94
|
type="button"
|
|
93
|
-
className="flex-shrink-0 cursor-grab active:cursor-grabbing p-1 text-
|
|
95
|
+
className="flex-shrink-0 cursor-grab active:cursor-grabbing p-1 text-[var(--muted-foreground)] hover:text-[var(--muted-foreground)] transition-colors"
|
|
94
96
|
{...attributes}
|
|
95
97
|
{...listeners}
|
|
96
98
|
>
|
|
@@ -121,9 +123,9 @@ function SortableAgentItem({
|
|
|
121
123
|
}}
|
|
122
124
|
aria-label={`${isActive ? "Disable" : "Enable"} ${p.name}`}
|
|
123
125
|
aria-pressed={isActive}
|
|
124
|
-
className={`relative w-5 h-3 rounded-full transition-colors flex-shrink-0 ${isActive ? "bg-violet-300" : "bg-
|
|
126
|
+
className={`relative w-5 h-3 rounded-full transition-colors flex-shrink-0 ${isActive ? "bg-violet-300" : "bg-[var(--muted)]"}`}
|
|
125
127
|
>
|
|
126
|
-
<span className={`absolute top-[2px] left-[2px] w-2 h-2 bg-
|
|
128
|
+
<span className={`absolute top-[2px] left-[2px] w-2 h-2 bg-[var(--card-bg)] rounded-full shadow-sm transition-transform ${isActive ? "translate-x-2" : "translate-x-0"}`} />
|
|
127
129
|
</button>
|
|
128
130
|
</div>
|
|
129
131
|
</div>
|
|
@@ -160,6 +162,102 @@ export interface ProjectMembership {
|
|
|
160
162
|
available: { id: string; name: string }[];
|
|
161
163
|
}
|
|
162
164
|
|
|
165
|
+
type AgentFormViewMode = "form" | "json";
|
|
166
|
+
|
|
167
|
+
const AGENT_FORM_PROVIDERS: ChatProvider[] = ["claude", "ollama", "gemini", "codex", "zai"];
|
|
168
|
+
|
|
169
|
+
function serializeSkills(skills: AgentFormData["skills"]) {
|
|
170
|
+
return (skills ?? []).map((skill) => (
|
|
171
|
+
skill.condition?.trim()
|
|
172
|
+
? `${skill.file} | ${skill.condition}`
|
|
173
|
+
: skill.file
|
|
174
|
+
)).join("\n");
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function parseSkillsText(skillsText: string) {
|
|
178
|
+
return skillsText
|
|
179
|
+
.split("\n")
|
|
180
|
+
.map((line) => line.trim())
|
|
181
|
+
.filter(Boolean)
|
|
182
|
+
.map((line) => {
|
|
183
|
+
const [file, ...conditionParts] = line.split("|");
|
|
184
|
+
return {
|
|
185
|
+
file: file.trim(),
|
|
186
|
+
condition: conditionParts.join("|").trim(),
|
|
187
|
+
};
|
|
188
|
+
})
|
|
189
|
+
.filter((skill) => skill.file.length > 0);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function buildAgentFormJson(data: AgentFormData, projectIds?: string[]) {
|
|
193
|
+
return JSON.stringify(
|
|
194
|
+
{
|
|
195
|
+
name: data.name,
|
|
196
|
+
provider: data.provider,
|
|
197
|
+
model: data.model,
|
|
198
|
+
identity: data.identity,
|
|
199
|
+
color: data.color ?? "#6B7280",
|
|
200
|
+
skills: data.skills ?? [],
|
|
201
|
+
...(projectIds ? { projectIds } : {}),
|
|
202
|
+
},
|
|
203
|
+
null,
|
|
204
|
+
2
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function parseAgentFormJson(raw: string, currentProvider: ChatProvider) {
|
|
209
|
+
let parsed: unknown;
|
|
210
|
+
try {
|
|
211
|
+
parsed = JSON.parse(raw);
|
|
212
|
+
} catch {
|
|
213
|
+
throw new Error("JSON is invalid.");
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
217
|
+
throw new Error("JSON must be an object.");
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const obj = parsed as Record<string, unknown>;
|
|
221
|
+
const providerValue = typeof obj.provider === "string" ? obj.provider : currentProvider;
|
|
222
|
+
const provider = AGENT_FORM_PROVIDERS.includes(providerValue as ChatProvider)
|
|
223
|
+
? providerValue as ChatProvider
|
|
224
|
+
: currentProvider;
|
|
225
|
+
|
|
226
|
+
const skillsInput = Array.isArray(obj.skills) ? obj.skills : [];
|
|
227
|
+
const skills = skillsInput.flatMap((entry) => {
|
|
228
|
+
if (typeof entry === "string") {
|
|
229
|
+
const [file, ...conditionParts] = entry.split("|");
|
|
230
|
+
const trimmedFile = file.trim();
|
|
231
|
+
return trimmedFile
|
|
232
|
+
? [{ file: trimmedFile, condition: conditionParts.join("|").trim() }]
|
|
233
|
+
: [];
|
|
234
|
+
}
|
|
235
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) return [];
|
|
236
|
+
const file = typeof entry.file === "string" ? entry.file.trim() : "";
|
|
237
|
+
if (!file) return [];
|
|
238
|
+
return [{
|
|
239
|
+
file,
|
|
240
|
+
condition: typeof entry.condition === "string" ? entry.condition.trim() : "",
|
|
241
|
+
}];
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
const projectIds = Array.isArray(obj.projectIds)
|
|
245
|
+
? obj.projectIds.filter((projectId): projectId is string => typeof projectId === "string" && projectId.trim().length > 0)
|
|
246
|
+
: undefined;
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
data: {
|
|
250
|
+
name: typeof obj.name === "string" ? obj.name : "",
|
|
251
|
+
provider,
|
|
252
|
+
model: typeof obj.model === "string" ? obj.model : "",
|
|
253
|
+
identity: typeof obj.identity === "string" ? obj.identity : "",
|
|
254
|
+
color: typeof obj.color === "string" && obj.color.trim() ? obj.color : "#6B7280",
|
|
255
|
+
skills,
|
|
256
|
+
} satisfies AgentFormData,
|
|
257
|
+
projectIds,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
163
261
|
interface AgentInspectabilitySummary {
|
|
164
262
|
learnedMemories: Array<{
|
|
165
263
|
id: string;
|
|
@@ -212,20 +310,36 @@ export function AgentForm({
|
|
|
212
310
|
const [model, setModel] = useState(initial.model);
|
|
213
311
|
const [identity, setIdentity] = useState(initial.identity);
|
|
214
312
|
const [color, setColor] = useState(initial.color ?? "#6B7280");
|
|
215
|
-
const [skillsText, setSkillsText] = useState(
|
|
216
|
-
(initial.skills ?? []).map((skill) => (
|
|
217
|
-
skill.condition?.trim()
|
|
218
|
-
? `${skill.file} | ${skill.condition}`
|
|
219
|
-
: skill.file
|
|
220
|
-
)).join("\n")
|
|
221
|
-
);
|
|
313
|
+
const [skillsText, setSkillsText] = useState(serializeSkills(initial.skills));
|
|
222
314
|
const [selectedProjectIds, setSelectedProjectIds] = useState<Set<string>>(new Set(initialProjectIds ?? []));
|
|
223
315
|
const [inspectability, setInspectability] = useState<AgentInspectabilitySummary | null>(null);
|
|
224
316
|
const [projectKnowledgeSummaries, setProjectKnowledgeSummaries] = useState<ProjectKnowledgeSummary[]>([]);
|
|
317
|
+
const [viewMode, setViewMode] = useState<AgentFormViewMode>("form");
|
|
318
|
+
const [jsonText, setJsonText] = useState(() => buildAgentFormJson(initial, projects ? (initialProjectIds ?? []) : undefined));
|
|
319
|
+
const [jsonError, setJsonError] = useState<string | null>(null);
|
|
320
|
+
const [jsonCopied, setJsonCopied] = useState(false);
|
|
225
321
|
const ref = useRef<HTMLDivElement>(null);
|
|
226
322
|
|
|
227
323
|
useClickOutside(ref, onCancel);
|
|
228
324
|
|
|
325
|
+
useEffect(() => {
|
|
326
|
+
if (viewMode !== "form") return;
|
|
327
|
+
setJsonText(buildAgentFormJson({
|
|
328
|
+
name,
|
|
329
|
+
provider,
|
|
330
|
+
model,
|
|
331
|
+
identity,
|
|
332
|
+
color,
|
|
333
|
+
skills: parseSkillsText(skillsText),
|
|
334
|
+
}, projects ? Array.from(selectedProjectIds) : undefined));
|
|
335
|
+
}, [viewMode, name, provider, model, identity, color, skillsText, selectedProjectIds, projects]);
|
|
336
|
+
|
|
337
|
+
useEffect(() => {
|
|
338
|
+
if (!jsonCopied) return;
|
|
339
|
+
const timeoutId = window.setTimeout(() => setJsonCopied(false), 1200);
|
|
340
|
+
return () => window.clearTimeout(timeoutId);
|
|
341
|
+
}, [jsonCopied]);
|
|
342
|
+
|
|
229
343
|
useEffect(() => {
|
|
230
344
|
let cancelled = false;
|
|
231
345
|
|
|
@@ -321,43 +435,109 @@ export function AgentForm({
|
|
|
321
435
|
};
|
|
322
436
|
}, [projectMemberships, projects]);
|
|
323
437
|
|
|
438
|
+
const applyParsedJson = (raw: string) => {
|
|
439
|
+
const parsed = parseAgentFormJson(raw, provider);
|
|
440
|
+
const validProjectIds = projects
|
|
441
|
+
? (parsed.projectIds ?? []).filter((projectId) => projects.some((project) => project.id === projectId))
|
|
442
|
+
: undefined;
|
|
443
|
+
setName(parsed.data.name);
|
|
444
|
+
setProvider(parsed.data.provider);
|
|
445
|
+
setModel(parsed.data.model);
|
|
446
|
+
setIdentity(parsed.data.identity);
|
|
447
|
+
setColor(parsed.data.color ?? "#6B7280");
|
|
448
|
+
setSkillsText(serializeSkills(parsed.data.skills));
|
|
449
|
+
if (projects) {
|
|
450
|
+
setSelectedProjectIds(new Set(validProjectIds ?? []));
|
|
451
|
+
}
|
|
452
|
+
setJsonText(buildAgentFormJson(parsed.data, projects ? (validProjectIds ?? []) : undefined));
|
|
453
|
+
setJsonError(null);
|
|
454
|
+
return {
|
|
455
|
+
...parsed,
|
|
456
|
+
projectIds: validProjectIds,
|
|
457
|
+
};
|
|
458
|
+
};
|
|
459
|
+
|
|
460
|
+
const switchToFormView = () => {
|
|
461
|
+
if (viewMode === "form") return;
|
|
462
|
+
try {
|
|
463
|
+
applyParsedJson(jsonText);
|
|
464
|
+
setViewMode("form");
|
|
465
|
+
} catch (error) {
|
|
466
|
+
setJsonError(error instanceof Error ? error.message : "Unable to parse JSON.");
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
const switchToJsonView = () => {
|
|
471
|
+
setJsonText(buildAgentFormJson({
|
|
472
|
+
name,
|
|
473
|
+
provider,
|
|
474
|
+
model,
|
|
475
|
+
identity,
|
|
476
|
+
color,
|
|
477
|
+
skills: parseSkillsText(skillsText),
|
|
478
|
+
}, projects ? Array.from(selectedProjectIds) : undefined));
|
|
479
|
+
setJsonError(null);
|
|
480
|
+
setViewMode("json");
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
const handleCopyJson = async () => {
|
|
484
|
+
try {
|
|
485
|
+
await navigator.clipboard.writeText(jsonText);
|
|
486
|
+
setJsonCopied(true);
|
|
487
|
+
} catch {
|
|
488
|
+
setJsonCopied(false);
|
|
489
|
+
}
|
|
490
|
+
};
|
|
491
|
+
|
|
324
492
|
const handleSubmit = () => {
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
493
|
+
let nextName = name.trim();
|
|
494
|
+
let nextProvider = provider;
|
|
495
|
+
let nextModel = model.trim();
|
|
496
|
+
let nextIdentity = identity.trim();
|
|
497
|
+
let nextColor = color;
|
|
498
|
+
let nextSkills = parseSkillsText(skillsText);
|
|
499
|
+
let nextProjectIds = projects ? Array.from(selectedProjectIds) : undefined;
|
|
500
|
+
|
|
501
|
+
if (viewMode === "json") {
|
|
502
|
+
try {
|
|
503
|
+
const parsed = applyParsedJson(jsonText);
|
|
504
|
+
nextName = parsed.data.name.trim();
|
|
505
|
+
nextProvider = parsed.data.provider;
|
|
506
|
+
nextModel = parsed.data.model.trim();
|
|
507
|
+
nextIdentity = parsed.data.identity.trim();
|
|
508
|
+
nextColor = parsed.data.color ?? "#6B7280";
|
|
509
|
+
nextSkills = parsed.data.skills ?? [];
|
|
510
|
+
nextProjectIds = projects ? (parsed.projectIds ?? []) : undefined;
|
|
511
|
+
} catch (error) {
|
|
512
|
+
setJsonError(error instanceof Error ? error.message : "Unable to parse JSON.");
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
if (!nextName || !nextModel) return;
|
|
338
518
|
|
|
339
519
|
onSubmit(
|
|
340
520
|
{
|
|
341
|
-
name:
|
|
342
|
-
provider,
|
|
343
|
-
model:
|
|
344
|
-
identity:
|
|
345
|
-
color,
|
|
346
|
-
skills,
|
|
521
|
+
name: nextName,
|
|
522
|
+
provider: nextProvider,
|
|
523
|
+
model: nextModel,
|
|
524
|
+
identity: nextIdentity,
|
|
525
|
+
color: nextColor,
|
|
526
|
+
skills: nextSkills,
|
|
347
527
|
},
|
|
348
|
-
|
|
528
|
+
nextProjectIds
|
|
349
529
|
);
|
|
350
530
|
};
|
|
351
531
|
|
|
352
532
|
return (
|
|
353
533
|
<div
|
|
354
534
|
ref={ref}
|
|
355
|
-
className="fixed inset-0 z-[100] flex items-center justify-center p-4 bg-
|
|
535
|
+
className="fixed inset-0 z-[100] flex items-center justify-center p-4 bg-black/30 backdrop-blur-sm"
|
|
356
536
|
onKeyDown={(e) => {
|
|
357
537
|
if (e.key === "Escape") onCancel();
|
|
358
538
|
}}
|
|
359
539
|
>
|
|
360
|
-
<div className="bg-
|
|
540
|
+
<div className="bg-[var(--card-bg)] rounded-[32px] shadow-2xl overflow-hidden w-full max-w-2xl max-h-[90vh] flex flex-col animate-in fade-in zoom-in duration-300">
|
|
361
541
|
<div className="px-8 pt-8 pb-4 shrink-0 flex items-center justify-between">
|
|
362
542
|
<div className="flex items-center gap-4">
|
|
363
543
|
{agentId && (
|
|
@@ -365,291 +545,355 @@ export function AgentForm({
|
|
|
365
545
|
<img
|
|
366
546
|
src={agentAvatarUrl(agentId, 64, color)}
|
|
367
547
|
alt={name}
|
|
368
|
-
className="w-14 h-14 rounded-full bg-
|
|
548
|
+
className="w-14 h-14 rounded-full bg-[var(--muted)]"
|
|
369
549
|
/>
|
|
370
550
|
<div className="flex items-center gap-1.5">
|
|
371
|
-
<label className="text-[10px] text-
|
|
551
|
+
<label className="text-[10px] text-[var(--muted-foreground)]">Color</label>
|
|
372
552
|
<input
|
|
373
553
|
type="color"
|
|
374
554
|
value={color}
|
|
375
555
|
onChange={(e) => setColor(e.target.value)}
|
|
376
|
-
className="w-5 h-5 rounded border border-
|
|
556
|
+
className="w-5 h-5 rounded border border-[var(--border)] cursor-pointer p-0"
|
|
377
557
|
/>
|
|
378
558
|
</div>
|
|
379
559
|
</div>
|
|
380
560
|
)}
|
|
381
561
|
<div>
|
|
382
|
-
<h2 className="text-[10px] font-bold tracking-widest text-
|
|
562
|
+
<h2 className="text-[10px] font-bold tracking-widest text-[var(--muted-foreground)] uppercase">{title}</h2>
|
|
383
563
|
<h1 className="text-2xl font-semibold mt-1">{name || "Configure Agent"}</h1>
|
|
384
564
|
</div>
|
|
385
565
|
</div>
|
|
386
566
|
<button
|
|
387
567
|
onClick={onCancel}
|
|
388
|
-
className="p-2 text-
|
|
568
|
+
className="p-2 text-[var(--muted-foreground)] hover:text-[var(--muted-foreground)] hover:bg-[var(--muted)] rounded-full transition-all"
|
|
389
569
|
>
|
|
390
570
|
<X size={20} />
|
|
391
571
|
</button>
|
|
392
572
|
</div>
|
|
393
573
|
|
|
394
574
|
<div className="px-8 pb-8 space-y-6 overflow-y-auto">
|
|
395
|
-
<div className="
|
|
396
|
-
<
|
|
397
|
-
<
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
575
|
+
<div className="flex items-center justify-between gap-3">
|
|
576
|
+
<div className="inline-flex rounded-xl bg-[var(--muted)] p-1">
|
|
577
|
+
<button
|
|
578
|
+
type="button"
|
|
579
|
+
onClick={switchToFormView}
|
|
580
|
+
className={viewMode === "form"
|
|
581
|
+
? "px-3 py-1.5 text-xs font-semibold rounded-lg bg-[var(--card-bg)] text-[var(--foreground)] shadow-sm"
|
|
582
|
+
: "px-3 py-1.5 text-xs font-semibold rounded-lg text-[var(--muted-foreground)] hover:text-[var(--foreground)]"}
|
|
583
|
+
>
|
|
584
|
+
Form
|
|
585
|
+
</button>
|
|
586
|
+
<button
|
|
587
|
+
type="button"
|
|
588
|
+
onClick={switchToJsonView}
|
|
589
|
+
className={viewMode === "json"
|
|
590
|
+
? "px-3 py-1.5 text-xs font-semibold rounded-lg bg-[var(--card-bg)] text-[var(--foreground)] shadow-sm"
|
|
591
|
+
: "px-3 py-1.5 text-xs font-semibold rounded-lg text-[var(--muted-foreground)] hover:text-[var(--foreground)]"}
|
|
592
|
+
>
|
|
593
|
+
JSON
|
|
594
|
+
</button>
|
|
595
|
+
</div>
|
|
596
|
+
{viewMode === "json" && (
|
|
597
|
+
<button
|
|
598
|
+
type="button"
|
|
599
|
+
onClick={handleCopyJson}
|
|
600
|
+
className="inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-semibold text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--muted)] rounded-lg transition-colors"
|
|
601
|
+
>
|
|
602
|
+
{jsonCopied ? <Check size={14} className="text-emerald-500" /> : <Copy size={14} />}
|
|
603
|
+
{jsonCopied ? "Copied" : "Copy"}
|
|
604
|
+
</button>
|
|
605
|
+
)}
|
|
407
606
|
</div>
|
|
408
607
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
<
|
|
412
|
-
<
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
<
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
<option value="codex">Codex</option>
|
|
424
|
-
<option value="zai">Z.AI</option>
|
|
425
|
-
</select>
|
|
426
|
-
<ChevronDown className="absolute right-3 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none" size={16} />
|
|
608
|
+
{viewMode === "form" ? (
|
|
609
|
+
<>
|
|
610
|
+
<div className="space-y-2">
|
|
611
|
+
<label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
|
|
612
|
+
<User size={16} /> Name
|
|
613
|
+
</label>
|
|
614
|
+
<input
|
|
615
|
+
type="text"
|
|
616
|
+
value={name}
|
|
617
|
+
onChange={(e) => setName(e.target.value)}
|
|
618
|
+
className="w-full px-4 py-3 bg-[var(--app-shell-subtle)] border border-[var(--border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all"
|
|
619
|
+
placeholder="Enter agent name..."
|
|
620
|
+
autoFocus
|
|
621
|
+
/>
|
|
427
622
|
</div>
|
|
428
|
-
</div>
|
|
429
|
-
<div className="space-y-2">
|
|
430
|
-
<label className="flex items-center gap-2 text-sm font-medium text-slate-500">
|
|
431
|
-
<Cpu size={16} /> Model
|
|
432
|
-
</label>
|
|
433
|
-
<input
|
|
434
|
-
type="text"
|
|
435
|
-
value={model}
|
|
436
|
-
onChange={(e) => setModel(e.target.value)}
|
|
437
|
-
className="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all font-mono text-sm"
|
|
438
|
-
placeholder="e.g. claude-sonnet-4-6"
|
|
439
|
-
/>
|
|
440
|
-
</div>
|
|
441
|
-
</div>
|
|
442
623
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
624
|
+
<div className="grid grid-cols-2 gap-4">
|
|
625
|
+
<div className="space-y-2">
|
|
626
|
+
<label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
|
|
627
|
+
<Box size={16} /> Provider
|
|
628
|
+
</label>
|
|
629
|
+
<div className="relative">
|
|
630
|
+
<select
|
|
631
|
+
value={provider}
|
|
632
|
+
onChange={(e) => setProvider(e.target.value as ChatProvider)}
|
|
633
|
+
className="w-full appearance-none px-4 py-3 bg-[var(--app-shell-subtle)] border border-[var(--border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all pr-10 cursor-pointer"
|
|
634
|
+
>
|
|
635
|
+
<option value="claude">Claude</option>
|
|
636
|
+
<option value="ollama">Ollama</option>
|
|
637
|
+
<option value="gemini">Gemini</option>
|
|
638
|
+
<option value="codex">Codex</option>
|
|
639
|
+
<option value="zai">Z.AI</option>
|
|
640
|
+
</select>
|
|
641
|
+
<ChevronDown className="absolute right-3 top-1/2 -translate-y-1/2 text-[var(--muted-foreground)] pointer-events-none" size={16} />
|
|
642
|
+
</div>
|
|
643
|
+
</div>
|
|
644
|
+
<div className="space-y-2">
|
|
645
|
+
<label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
|
|
646
|
+
<Cpu size={16} /> Model
|
|
647
|
+
</label>
|
|
648
|
+
<input
|
|
649
|
+
type="text"
|
|
650
|
+
value={model}
|
|
651
|
+
onChange={(e) => setModel(e.target.value)}
|
|
652
|
+
className="w-full px-4 py-3 bg-[var(--app-shell-subtle)] border border-[var(--border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all font-mono text-sm"
|
|
653
|
+
placeholder="e.g. claude-sonnet-4-6"
|
|
654
|
+
/>
|
|
655
|
+
</div>
|
|
656
|
+
</div>
|
|
456
657
|
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
658
|
+
<div className="space-y-2">
|
|
659
|
+
<label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
|
|
660
|
+
<BookOpen size={16} /> Identity
|
|
661
|
+
</label>
|
|
662
|
+
<div className="border border-[var(--border)] rounded-xl overflow-hidden bg-[var(--app-shell-subtle)] focus-within:ring-2 focus-within:ring-indigo-500/20 focus-within:border-indigo-500 transition-all">
|
|
663
|
+
<RichTextEditor
|
|
664
|
+
content={identity}
|
|
665
|
+
onChange={(md) => setIdentity(md)}
|
|
666
|
+
placeholder="Describe the agent's identity and role..."
|
|
667
|
+
/>
|
|
668
|
+
</div>
|
|
669
|
+
<p className="text-xs text-[var(--muted-foreground)]">Identity defines who the agent is. Keep portable knowledge separate below; project and repo knowledge belong on their scoped surfaces.</p>
|
|
670
|
+
</div>
|
|
470
671
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
{
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
672
|
+
<div className="space-y-2">
|
|
673
|
+
<label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
|
|
674
|
+
<Sparkles size={16} /> Portable Knowledge
|
|
675
|
+
</label>
|
|
676
|
+
<textarea
|
|
677
|
+
value={skillsText}
|
|
678
|
+
onChange={(e) => setSkillsText(e.target.value)}
|
|
679
|
+
rows={5}
|
|
680
|
+
className="w-full px-4 py-3 bg-[var(--app-shell-subtle)] border border-[var(--border)] rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 transition-all font-mono text-xs"
|
|
681
|
+
placeholder={"one/path/to/skill.md\npath/to/skill.md | when coding in TypeScript"}
|
|
682
|
+
/>
|
|
683
|
+
<p className="text-xs text-[var(--muted-foreground)]">Portable agent knowledge only. One reference per line. Use <code>|</code> to add an optional condition.</p>
|
|
684
|
+
</div>
|
|
685
|
+
|
|
686
|
+
{agentId && (
|
|
687
|
+
<div className="space-y-3">
|
|
688
|
+
<label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
|
|
689
|
+
<Sparkles size={16} /> System-Generated Agent Knowledge
|
|
690
|
+
</label>
|
|
691
|
+
{inspectability?.learnedMemories?.length ? (
|
|
692
|
+
<div className="space-y-2 max-h-48 overflow-y-auto">
|
|
693
|
+
{inspectability.learnedMemories.map((item) => (
|
|
694
|
+
<div key={item.id} className="rounded-xl border border-[var(--border)] bg-[var(--app-shell-subtle)] px-3 py-2">
|
|
695
|
+
<div className="flex items-center justify-between gap-2">
|
|
696
|
+
<span className="text-[10px] font-bold uppercase tracking-wide text-[var(--muted-foreground)]">{item.type}</span>
|
|
697
|
+
<span className="text-[10px] text-[var(--muted-foreground)]">{new Date(item.createdAt).toLocaleString()}</span>
|
|
698
|
+
</div>
|
|
699
|
+
<p className="mt-1 text-xs text-[var(--foreground)] leading-relaxed">{item.content}</p>
|
|
700
|
+
</div>
|
|
701
|
+
))}
|
|
485
702
|
</div>
|
|
486
|
-
)
|
|
703
|
+
) : (
|
|
704
|
+
<p className="text-xs text-[var(--muted-foreground)]">No system-generated agent knowledge yet.</p>
|
|
705
|
+
)}
|
|
487
706
|
</div>
|
|
488
|
-
) : (
|
|
489
|
-
<p className="text-xs text-slate-400">No system-generated agent knowledge yet.</p>
|
|
490
707
|
)}
|
|
491
|
-
</div>
|
|
492
|
-
)}
|
|
493
708
|
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
<button
|
|
504
|
-
key={project.id}
|
|
505
|
-
type="button"
|
|
506
|
-
className={
|
|
507
|
-
checked
|
|
508
|
-
? "w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors bg-indigo-50 text-indigo-700"
|
|
509
|
-
: "w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-slate-600 hover:bg-slate-50"
|
|
510
|
-
}
|
|
511
|
-
onClick={() => setSelectedProjectIds((prev) => {
|
|
512
|
-
const next = new Set(prev);
|
|
513
|
-
if (next.has(project.id)) next.delete(project.id); else next.add(project.id);
|
|
514
|
-
return next;
|
|
515
|
-
})}
|
|
516
|
-
>
|
|
517
|
-
<div className={
|
|
518
|
-
checked
|
|
519
|
-
? "w-4 h-4 rounded border flex-shrink-0 flex items-center justify-center bg-indigo-600 border-indigo-600"
|
|
520
|
-
: "w-4 h-4 rounded border flex-shrink-0 flex items-center justify-center border-slate-300"
|
|
521
|
-
}>
|
|
522
|
-
{checked && <svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 5l2 2 4-4" stroke="white" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/></svg>}
|
|
523
|
-
</div>
|
|
524
|
-
<span className="text-xs font-medium text-left">{project.label ?? project.name}</span>
|
|
525
|
-
</button>
|
|
526
|
-
);
|
|
527
|
-
})}
|
|
528
|
-
</div>
|
|
529
|
-
</div>
|
|
530
|
-
)}
|
|
531
|
-
|
|
532
|
-
{projectMemberships && (
|
|
533
|
-
<div className="space-y-3">
|
|
534
|
-
<label className="flex items-center gap-2 text-sm font-medium text-slate-500">
|
|
535
|
-
<FolderOpen size={16} /> Project Memberships
|
|
536
|
-
</label>
|
|
537
|
-
{projectMemberships.current.length > 0 ? (
|
|
538
|
-
<div className="flex flex-col gap-1">
|
|
539
|
-
{projectMemberships.current.map((project) => (
|
|
540
|
-
<div key={project.id} className="flex items-center gap-2 text-xs bg-slate-50 rounded-lg px-3 py-2">
|
|
541
|
-
<FolderOpen size={12} className="text-slate-400 shrink-0" />
|
|
542
|
-
<span className="truncate flex-1">{project.name}</span>
|
|
543
|
-
{onRemoveFromProject && !project.is_default && (
|
|
709
|
+
{projects && projects.length > 0 && (
|
|
710
|
+
<div className="space-y-3">
|
|
711
|
+
<label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
|
|
712
|
+
<FolderOpen size={16} /> Assign To Projects
|
|
713
|
+
</label>
|
|
714
|
+
<div className="space-y-1 max-h-[160px] overflow-y-auto">
|
|
715
|
+
{projects.map((project) => {
|
|
716
|
+
const checked = selectedProjectIds.has(project.id);
|
|
717
|
+
return (
|
|
544
718
|
<button
|
|
719
|
+
key={project.id}
|
|
545
720
|
type="button"
|
|
546
|
-
className=
|
|
547
|
-
|
|
548
|
-
|
|
721
|
+
className={
|
|
722
|
+
checked
|
|
723
|
+
? "w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors bg-indigo-50 text-indigo-700"
|
|
724
|
+
: "w-full flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors text-[var(--muted-foreground)] hover:bg-[var(--app-shell-subtle)]"
|
|
725
|
+
}
|
|
726
|
+
onClick={() => setSelectedProjectIds((prev) => {
|
|
727
|
+
const next = new Set(prev);
|
|
728
|
+
if (next.has(project.id)) next.delete(project.id); else next.add(project.id);
|
|
729
|
+
return next;
|
|
730
|
+
})}
|
|
549
731
|
>
|
|
550
|
-
<
|
|
732
|
+
<div className={
|
|
733
|
+
checked
|
|
734
|
+
? "w-4 h-4 rounded border flex-shrink-0 flex items-center justify-center bg-indigo-600 border-indigo-600"
|
|
735
|
+
: "w-4 h-4 rounded border flex-shrink-0 flex items-center justify-center border-[var(--border)]"
|
|
736
|
+
}>
|
|
737
|
+
{checked && <svg width="10" height="10" viewBox="0 0 10 10" fill="none"><path d="M2 5l2 2 4-4" stroke="white" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/></svg>}
|
|
738
|
+
</div>
|
|
739
|
+
<span className="text-xs font-medium text-left">{project.label ?? project.name}</span>
|
|
551
740
|
</button>
|
|
552
|
-
)
|
|
553
|
-
|
|
554
|
-
|
|
741
|
+
);
|
|
742
|
+
})}
|
|
743
|
+
</div>
|
|
555
744
|
</div>
|
|
556
|
-
) : (
|
|
557
|
-
<p className="text-xs text-slate-400 italic">Not assigned to any projects</p>
|
|
558
745
|
)}
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
746
|
+
|
|
747
|
+
{projectMemberships && (
|
|
748
|
+
<div className="space-y-3">
|
|
749
|
+
<label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
|
|
750
|
+
<FolderOpen size={16} /> Project Memberships
|
|
751
|
+
</label>
|
|
752
|
+
{projectMemberships.current.length > 0 ? (
|
|
753
|
+
<div className="flex flex-col gap-1">
|
|
754
|
+
{projectMemberships.current.map((project) => (
|
|
755
|
+
<div key={project.id} className="flex items-center gap-2 text-xs bg-[var(--app-shell-subtle)] rounded-lg px-3 py-2">
|
|
756
|
+
<FolderOpen size={12} className="text-[var(--muted-foreground)] shrink-0" />
|
|
757
|
+
<span className="truncate flex-1">{project.name}</span>
|
|
758
|
+
{onRemoveFromProject && !project.is_default && (
|
|
759
|
+
<button
|
|
760
|
+
type="button"
|
|
761
|
+
className="text-[var(--muted-foreground)] hover:text-red-500 transition-colors"
|
|
762
|
+
onClick={() => onRemoveFromProject(project.id)}
|
|
763
|
+
title="Remove from project"
|
|
764
|
+
>
|
|
765
|
+
<X size={12} />
|
|
766
|
+
</button>
|
|
767
|
+
)}
|
|
768
|
+
</div>
|
|
769
|
+
))}
|
|
770
|
+
</div>
|
|
771
|
+
) : (
|
|
772
|
+
<p className="text-xs text-[var(--muted-foreground)] italic">Not assigned to any projects</p>
|
|
773
|
+
)}
|
|
774
|
+
{projectMemberships.available.length > 0 && onAddToProject && (
|
|
775
|
+
<div className="flex flex-wrap gap-1">
|
|
776
|
+
{projectMemberships.available.map((project) => (
|
|
777
|
+
<button
|
|
778
|
+
key={project.id}
|
|
779
|
+
type="button"
|
|
780
|
+
className="inline-flex items-center gap-1 text-[10px] px-2 py-1 rounded-lg border border-dashed border-[var(--border)] text-[var(--muted-foreground)] hover:border-[var(--border)] hover:text-[var(--foreground)] transition-colors"
|
|
781
|
+
onClick={() => onAddToProject(project.id)}
|
|
782
|
+
>
|
|
783
|
+
<Plus size={10} />
|
|
784
|
+
{project.name}
|
|
785
|
+
</button>
|
|
786
|
+
))}
|
|
787
|
+
</div>
|
|
788
|
+
)}
|
|
572
789
|
</div>
|
|
573
790
|
)}
|
|
574
|
-
</div>
|
|
575
|
-
)}
|
|
576
791
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
</div>
|
|
591
|
-
<div className="rounded-lg bg-white px-2 py-2 border border-slate-100">
|
|
592
|
-
<div className="font-bold text-slate-700">{project.projectKnowledgeNotes}</div>
|
|
593
|
-
<div>Project notes</div>
|
|
594
|
-
</div>
|
|
595
|
-
<div className="rounded-lg bg-white px-2 py-2 border border-slate-100">
|
|
596
|
-
<div className="font-bold text-slate-700">{project.systemProjectKnowledge}</div>
|
|
597
|
-
<div>Project generated</div>
|
|
598
|
-
</div>
|
|
599
|
-
<div className="rounded-lg bg-white px-2 py-2 border border-slate-100">
|
|
600
|
-
<div className="font-bold text-slate-700">{project.repoKnowledgeNotes}</div>
|
|
601
|
-
<div>Repo notes</div>
|
|
602
|
-
</div>
|
|
603
|
-
<div className="rounded-lg bg-white px-2 py-2 border border-slate-100">
|
|
604
|
-
<div className="font-bold text-slate-700">{project.systemRepoKnowledge}</div>
|
|
605
|
-
<div>Repo generated</div>
|
|
606
|
-
</div>
|
|
607
|
-
</div>
|
|
608
|
-
{(project.projectGeneratedItems.length > 0 || project.repoGeneratedItems.length > 0) && (
|
|
609
|
-
<div className="mt-3 space-y-2">
|
|
610
|
-
{project.projectGeneratedItems.length > 0 && (
|
|
611
|
-
<div className="rounded-lg border border-slate-200 bg-white px-3 py-2">
|
|
612
|
-
<div className="text-[10px] font-black uppercase tracking-wide text-slate-400">Project generated</div>
|
|
613
|
-
<div className="mt-2 space-y-1">
|
|
614
|
-
{project.projectGeneratedItems.map((item) => (
|
|
615
|
-
<div key={item.id} className="text-xs text-slate-700 leading-relaxed">
|
|
616
|
-
{item.content}
|
|
617
|
-
</div>
|
|
618
|
-
))}
|
|
619
|
-
</div>
|
|
792
|
+
{agentId && projectKnowledgeSummaries.length > 0 && (
|
|
793
|
+
<div className="space-y-3">
|
|
794
|
+
<label className="flex items-center gap-2 text-sm font-medium text-[var(--muted-foreground)]">
|
|
795
|
+
<FolderOpen size={16} /> Scoped Knowledge Summary
|
|
796
|
+
</label>
|
|
797
|
+
<div className="space-y-2">
|
|
798
|
+
{projectKnowledgeSummaries.map((project) => (
|
|
799
|
+
<div key={project.id} className="rounded-xl border border-[var(--border)] bg-[var(--app-shell-subtle)] px-3 py-3">
|
|
800
|
+
<div className="text-xs font-semibold text-[var(--foreground)]">{project.name}</div>
|
|
801
|
+
<div className="mt-2 grid grid-cols-2 sm:grid-cols-5 gap-2 text-[10px] text-[var(--muted-foreground)]">
|
|
802
|
+
<div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
|
|
803
|
+
<div className="font-bold text-[var(--foreground)]">{project.projectKnowledgeReferences}</div>
|
|
804
|
+
<div>Project refs</div>
|
|
620
805
|
</div>
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
806
|
+
<div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
|
|
807
|
+
<div className="font-bold text-[var(--foreground)]">{project.projectKnowledgeNotes}</div>
|
|
808
|
+
<div>Project notes</div>
|
|
809
|
+
</div>
|
|
810
|
+
<div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
|
|
811
|
+
<div className="font-bold text-[var(--foreground)]">{project.systemProjectKnowledge}</div>
|
|
812
|
+
<div>Project generated</div>
|
|
813
|
+
</div>
|
|
814
|
+
<div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
|
|
815
|
+
<div className="font-bold text-[var(--foreground)]">{project.repoKnowledgeNotes}</div>
|
|
816
|
+
<div>Repo notes</div>
|
|
817
|
+
</div>
|
|
818
|
+
<div className="rounded-lg bg-[var(--card-bg)] px-2 py-2 border border-[var(--border)]">
|
|
819
|
+
<div className="font-bold text-[var(--foreground)]">{project.systemRepoKnowledge}</div>
|
|
820
|
+
<div>Repo generated</div>
|
|
821
|
+
</div>
|
|
822
|
+
</div>
|
|
823
|
+
{(project.projectGeneratedItems.length > 0 || project.repoGeneratedItems.length > 0) && (
|
|
824
|
+
<div className="mt-3 space-y-2">
|
|
825
|
+
{project.projectGeneratedItems.length > 0 && (
|
|
826
|
+
<div className="rounded-lg border border-[var(--border)] bg-[var(--card-bg)] px-3 py-2">
|
|
827
|
+
<div className="text-[10px] font-black uppercase tracking-wide text-[var(--muted-foreground)]">Project generated</div>
|
|
828
|
+
<div className="mt-2 space-y-1">
|
|
829
|
+
{project.projectGeneratedItems.map((item) => (
|
|
830
|
+
<div key={item.id} className="text-xs text-[var(--foreground)] leading-relaxed">
|
|
831
|
+
{item.content}
|
|
832
|
+
</div>
|
|
833
|
+
))}
|
|
629
834
|
</div>
|
|
630
|
-
|
|
631
|
-
|
|
835
|
+
</div>
|
|
836
|
+
)}
|
|
837
|
+
{project.repoGeneratedItems.length > 0 && (
|
|
838
|
+
<div className="rounded-lg border border-[var(--border)] bg-[var(--card-bg)] px-3 py-2">
|
|
839
|
+
<div className="text-[10px] font-black uppercase tracking-wide text-[var(--muted-foreground)]">Repo generated</div>
|
|
840
|
+
<div className="mt-2 space-y-1">
|
|
841
|
+
{project.repoGeneratedItems.map((item) => (
|
|
842
|
+
<div key={item.id} className="text-xs text-[var(--foreground)] leading-relaxed">
|
|
843
|
+
{item.repoName ? `${item.repoName}: ` : ""}{item.content}
|
|
844
|
+
</div>
|
|
845
|
+
))}
|
|
846
|
+
</div>
|
|
847
|
+
</div>
|
|
848
|
+
)}
|
|
632
849
|
</div>
|
|
633
850
|
)}
|
|
634
851
|
</div>
|
|
635
|
-
)}
|
|
852
|
+
))}
|
|
636
853
|
</div>
|
|
637
|
-
|
|
854
|
+
<p className="text-xs text-[var(--muted-foreground)]">Project and repo knowledge are edited on their scoped project surfaces.</p>
|
|
855
|
+
</div>
|
|
856
|
+
)}
|
|
857
|
+
</>
|
|
858
|
+
) : (
|
|
859
|
+
<div className="space-y-3">
|
|
860
|
+
<div className="flex items-center justify-between gap-3">
|
|
861
|
+
<p className="text-xs text-[var(--muted-foreground)]">Paste agent JSON here. Switching back to Form or saving will apply valid JSON to the form state.</p>
|
|
862
|
+
<button
|
|
863
|
+
type="button"
|
|
864
|
+
onClick={switchToFormView}
|
|
865
|
+
className="px-3 py-1.5 text-xs font-semibold text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--muted)] rounded-lg transition-colors"
|
|
866
|
+
>
|
|
867
|
+
Apply to Form
|
|
868
|
+
</button>
|
|
638
869
|
</div>
|
|
639
|
-
<
|
|
870
|
+
<textarea
|
|
871
|
+
value={jsonText}
|
|
872
|
+
onChange={(e) => {
|
|
873
|
+
setJsonText(e.target.value);
|
|
874
|
+
if (jsonError) setJsonError(null);
|
|
875
|
+
}}
|
|
876
|
+
rows={22}
|
|
877
|
+
className="w-full px-4 py-3 bg-[var(--app-shell-bg)] text-[var(--foreground)] border border-[var(--app-shell-border)] rounded-2xl focus:outline-none focus:ring-2 focus:ring-[var(--ring)] focus:border-[var(--primary)] transition-all font-mono text-xs"
|
|
878
|
+
spellCheck={false}
|
|
879
|
+
autoFocus
|
|
880
|
+
/>
|
|
881
|
+
{jsonError && (
|
|
882
|
+
<p className="text-xs text-red-500">{jsonError}</p>
|
|
883
|
+
)}
|
|
640
884
|
</div>
|
|
641
885
|
)}
|
|
642
886
|
|
|
643
|
-
<div className="flex items-center justify-end gap-3 pt-4 border-t border-
|
|
887
|
+
<div className="flex items-center justify-end gap-3 pt-4 border-t border-[var(--border)]">
|
|
644
888
|
<button
|
|
645
889
|
onClick={onCancel}
|
|
646
|
-
className="px-6 py-2.5 text-sm font-semibold text-
|
|
890
|
+
className="px-6 py-2.5 text-sm font-semibold text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--app-shell-subtle)] rounded-xl transition-all"
|
|
647
891
|
>
|
|
648
892
|
Cancel
|
|
649
893
|
</button>
|
|
650
894
|
<button
|
|
651
895
|
onClick={handleSubmit}
|
|
652
|
-
disabled={!name.trim() || !model.trim()}
|
|
896
|
+
disabled={viewMode === "form" ? (!name.trim() || !model.trim()) : false}
|
|
653
897
|
className="px-8 py-2.5 bg-indigo-600 text-white text-sm font-semibold rounded-xl shadow-[0_4px_12px_rgba(79,70,229,0.3)] hover:bg-indigo-700 active:scale-95 disabled:opacity-50 transition-all font-bold"
|
|
654
898
|
>
|
|
655
899
|
{submitLabel}
|
|
@@ -723,7 +967,7 @@ export function ParticipantBar({
|
|
|
723
967
|
return (
|
|
724
968
|
<React.Fragment key={p.id}>
|
|
725
969
|
{showDivider && (
|
|
726
|
-
<div className="mx-2 my-1 border-t border-dashed border-
|
|
970
|
+
<div className="mx-2 my-1 border-t border-dashed border-[var(--border)]" />
|
|
727
971
|
)}
|
|
728
972
|
<SortableAgentItem
|
|
729
973
|
p={p}
|
|
@@ -757,7 +1001,7 @@ export function ParticipantBar({
|
|
|
757
1001
|
onClick={() => {
|
|
758
1002
|
setOpenPanel(openPanel === "add" ? null : "add");
|
|
759
1003
|
}}
|
|
760
|
-
className="w-full flex items-center justify-center gap-1 px-3 py-2 rounded-md text-sm font-medium text-
|
|
1004
|
+
className="w-full flex items-center justify-center gap-1 px-3 py-2 rounded-md text-sm font-medium text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:bg-[var(--muted)] transition-colors"
|
|
761
1005
|
>
|
|
762
1006
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="M12 5v14" /></svg>
|
|
763
1007
|
Add agent
|
|
@@ -821,7 +1065,7 @@ export function ParticipantBar({
|
|
|
821
1065
|
<div className="relative">
|
|
822
1066
|
<button
|
|
823
1067
|
onClick={() => setOpenPanel(openPanel === "add" ? null : "add")}
|
|
824
|
-
className="text-xs border border-
|
|
1068
|
+
className="text-xs border border-[var(--border)] text-[var(--muted-foreground)] hover:text-[var(--foreground)] hover:border-[var(--border)] hover:bg-[var(--app-shell-subtle)] transition-all font-medium flex items-center gap-1 px-2.5 py-1 rounded-full"
|
|
825
1069
|
>
|
|
826
1070
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14" /><path d="M12 5v14" /></svg>
|
|
827
1071
|
Add agent
|