@jiggai/kitchen 0.1.3 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +0 -24
- package/.next/server/app/_global-error/page.js +1 -1
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +1 -1
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/agents/[agentId]/page.js +1 -1
- package/.next/server/app/agents/[agentId]/page.js.nft.json +1 -1
- package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/[id]/route.js +1 -1
- package/.next/server/app/api/agents/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/add/route.js +1 -1
- package/.next/server/app/api/agents/add/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/file/route.js +1 -1
- package/.next/server/app/api/agents/file/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/files/route.js +1 -1
- package/.next/server/app/api/agents/files/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/identity/route.js +1 -1
- package/.next/server/app/api/agents/identity/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/route.js +1 -1
- package/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/install/route.js +1 -1
- package/.next/server/app/api/agents/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/route.js +1 -1
- package/.next/server/app/api/agents/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route.js +1 -1
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
- package/.next/server/app/api/channels/bindings/route.js +1 -1
- package/.next/server/app/api/channels/bindings/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/delete/route.js +1 -1
- package/.next/server/app/api/cron/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/job/route.js +1 -1
- package/.next/server/app/api/cron/job/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/jobs/route.js +1 -1
- package/.next/server/app/api/cron/jobs/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/recipe-installed/route.js +1 -1
- package/.next/server/app/api/cron/recipe-installed/route.js.nft.json +1 -1
- package/.next/server/app/api/gateway/restart/route.js +1 -1
- package/.next/server/app/api/gateway/restart/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/promote/route.js +1 -1
- package/.next/server/app/api/goals/[id]/promote/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/route.js +1 -1
- package/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/route.js +1 -1
- package/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/server/app/api/ids/check/route.js +1 -1
- package/.next/server/app/api/ids/check/route.js.nft.json +1 -1
- package/.next/server/app/api/marketplace/recipes/[slug]/route.js +1 -1
- package/.next/server/app/api/marketplace/recipes/[slug]/route.js.nft.json +1 -1
- package/.next/server/app/api/marketplace/recipes/route.js +1 -1
- package/.next/server/app/api/marketplace/recipes/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/[id]/route.js +1 -1
- package/.next/server/app/api/recipes/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/clone/route.js +1 -1
- package/.next/server/app/api/recipes/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/delete/route.js +1 -1
- package/.next/server/app/api/recipes/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/route.js +1 -1
- package/.next/server/app/api/recipes/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/team-agents/route.js +1 -1
- package/.next/server/app/api/recipes/team-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/scaffold/route.js +2 -2
- package/.next/server/app/api/scaffold/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/cron-installation/route.js +1 -1
- package/.next/server/app/api/settings/cron-installation/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/available/route.js +1 -1
- package/.next/server/app/api/skills/available/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/file/route.js +1 -1
- package/.next/server/app/api/teams/file/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/files/route.js +1 -1
- package/.next/server/app/api/teams/files/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/meta/route.js +1 -1
- package/.next/server/app/api/teams/meta/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/remove-team/route.js +1 -1
- package/.next/server/app/api/teams/remove-team/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/install/route.js +1 -1
- package/.next/server/app/api/teams/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/route.js +1 -1
- package/.next/server/app/api/teams/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/move/route.js +1 -1
- package/.next/server/app/api/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/channels/page.js +1 -1
- package/.next/server/app/channels/page.js.nft.json +1 -1
- package/.next/server/app/channels.html +2 -2
- package/.next/server/app/channels.rsc +1 -1
- package/.next/server/app/channels.segments/_full.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_index.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
- package/.next/server/app/cron-jobs/page.js +1 -1
- package/.next/server/app/cron-jobs/page.js.nft.json +1 -1
- package/.next/server/app/cron-jobs.html +1 -1
- package/.next/server/app/cron-jobs.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/_full.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/_index.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/cron-jobs/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/cron-jobs.segment.rsc +1 -1
- package/.next/server/app/goals/[id]/page.js +1 -1
- package/.next/server/app/goals/[id]/page.js.nft.json +1 -1
- package/.next/server/app/goals/new/page.js +1 -1
- package/.next/server/app/goals/new/page.js.nft.json +1 -1
- package/.next/server/app/goals/new.html +2 -2
- package/.next/server/app/goals/new.rsc +1 -1
- package/.next/server/app/goals/new.segments/_full.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_index.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
- package/.next/server/app/goals/page.js +1 -1
- package/.next/server/app/goals/page.js.nft.json +1 -1
- package/.next/server/app/goals.html +1 -1
- package/.next/server/app/goals.rsc +1 -1
- package/.next/server/app/goals.segments/_full.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_index.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
- package/.next/server/app/page.js +3 -3
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/recipes/[id]/page.js +4 -3
- package/.next/server/app/recipes/[id]/page.js.nft.json +1 -1
- package/.next/server/app/recipes/page.js +4 -3
- package/.next/server/app/recipes/page.js.nft.json +1 -1
- package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js +1 -1
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +1 -1
- package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/teams/[teamId]/page.js +3 -3
- package/.next/server/app/teams/[teamId]/page.js.nft.json +1 -1
- package/.next/server/app/tickets/[ticket]/page.js +2 -2
- package/.next/server/app/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/tickets/page.js +2 -2
- package/.next/server/app/tickets/page.js.nft.json +1 -1
- package/.next/server/app/tickets.html +1 -1
- package/.next/server/app/tickets.rsc +2 -2
- package/.next/server/app/tickets.segments/_full.segment.rsc +2 -2
- package/.next/server/app/tickets.segments/_head.segment.rsc +1 -1
- package/.next/server/app/tickets.segments/_index.segment.rsc +1 -1
- package/.next/server/app/tickets.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/tickets.segments/tickets/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/tickets.segments/tickets.segment.rsc +1 -1
- package/.next/server/chunks/[root-of-the-server]__055885ce._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__055885ce._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0c01c5c7._.js +10 -0
- package/.next/server/chunks/[root-of-the-server]__0c01c5c7._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1398a33a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1398a33a._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__159c002b._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__159c002b._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__20c60fb7._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__20c60fb7._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__2588560d._.js +6 -0
- package/.next/server/chunks/[root-of-the-server]__2588560d._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__27293e91._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__27293e91._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__29c85a51._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__29c85a51._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__29fa8108._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__29fa8108._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__2bd44067._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__2bd44067._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__2dd1afff._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__2dd1afff._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__401ab759._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__401ab759._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__422c7160._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__422c7160._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__4670294e._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__4670294e._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__4898071c._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__4898071c._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__4eda99a9._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__4eda99a9._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__54478298._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__54478298._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__6dbdb384._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__6dbdb384._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__dc6c67a5._.js → [root-of-the-server]__74b80ca4._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__94d68aa3._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__94d68aa3._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__9ecbb339._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__9ecbb339._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__a27f8405._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__a27f8405._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__a6ac3ddf._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__a6ac3ddf._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__b11231a9._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__b11231a9._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__b59b3cdd._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__b59b3cdd._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__94ebcd84._.js → [root-of-the-server]__b5c2b370._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__b955e35a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__b955e35a._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__920d7db4._.js → [root-of-the-server]__be5f57b2._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__c4ff0427._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__c4ff0427._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__c4ffbb03._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__c4ffbb03._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__d737ca42._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__d737ca42._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__df7df3ac._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__df7df3ac._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__dfca6557._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__dfca6557._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__e6184ba3._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__e6184ba3._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__ed0323e9._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__ed0323e9._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__f585823b._.js +6 -0
- package/.next/server/chunks/[root-of-the-server]__f585823b._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__ff940674._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__ff940674._.js.map +1 -0
- package/.next/server/chunks/src_lib_d2210cbf._.js +3 -0
- package/.next/server/chunks/src_lib_d2210cbf._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4393e897._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4393e897._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__ae77070e._.js → [root-of-the-server]__4c6cc96d._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__4c6cc96d._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__b6de1782._.js → [root-of-the-server]__507d2fc9._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__c72e7548._.js → [root-of-the-server]__7180d770._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__7180d770._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__82ce3aee._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__82ce3aee._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8d24c9c3._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8d24c9c3._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__bc3b27b0._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__bc3b27b0._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__72721a7e._.js → [root-of-the-server]__f75a61bf._.js} +2 -2
- package/.next/server/chunks/ssr/_1aad1d9b._.js +24 -0
- package/.next/server/chunks/ssr/_1aad1d9b._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_aefa2538._.js → _da6f800e._.js} +2 -2
- package/.next/server/chunks/ssr/_da6f800e._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_agents_[agentId]_agent-editor_tsx_f85bbe65._.js +1 -1
- package/.next/server/chunks/ssr/src_app_agents_[agentId]_agent-editor_tsx_f85bbe65._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js.map +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/static/chunks/{a33f8641aafb9e7f.js → 54beb791bcc086ae.js} +1 -1
- package/.next/static/chunks/55866d57aa2c7a9c.js +1 -0
- package/openclaw/index.ts +4 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/src/app/agents/[agentId]/agent-editor.tsx +66 -23
- package/src/app/api/agents/[id]/route.ts +37 -0
- package/src/app/api/agents/add/route.ts +7 -7
- package/src/app/api/agents/files/route.ts +3 -1
- package/src/app/api/agents/skills/install/route.ts +27 -3
- package/src/app/api/agents/skills/route.ts +28 -12
- package/src/app/api/goals/[id]/promote/route.ts +12 -18
- package/src/app/api/recipes/team-agents/route.ts +1 -1
- package/src/app/api/teams/skills/install/route.ts +3 -1
- package/src/app/api/tickets/move/route.ts +3 -4
- package/src/app/recipes/[id]/page.tsx +7 -0
- package/src/app/recipes/page.tsx +7 -0
- package/src/app/recipes/recipes-client.tsx +0 -5
- package/src/lib/agent-workspace.ts +14 -0
- package/src/lib/gateway.ts +5 -8
- package/src/lib/kitchen-api.ts +19 -0
- package/src/lib/openclaw.ts +28 -26
- package/src/lib/paths.ts +4 -3
- package/src/proxy.ts +2 -2
- package/.next/server/app/recipes.html +0 -1
- package/.next/server/app/recipes.meta +0 -15
- package/.next/server/app/recipes.rsc +0 -21
- package/.next/server/app/recipes.segments/_full.segment.rsc +0 -21
- package/.next/server/app/recipes.segments/_head.segment.rsc +0 -6
- package/.next/server/app/recipes.segments/_index.segment.rsc +0 -6
- package/.next/server/app/recipes.segments/_tree.segment.rsc +0 -4
- package/.next/server/app/recipes.segments/recipes/__PAGE__.segment.rsc +0 -10
- package/.next/server/app/recipes.segments/recipes.segment.rsc +0 -4
- package/.next/server/chunks/[root-of-the-server]__02ebb205._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__02ebb205._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0761ac0a._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0761ac0a._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0a87d140._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__0a87d140._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__13e03a23._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__13e03a23._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__16252fca._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__16252fca._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__1ab15cc6._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1ab15cc6._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__1cb96385._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1cb96385._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__20cb8aee._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__20cb8aee._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__22a29d25._.js +0 -6
- package/.next/server/chunks/[root-of-the-server]__22a29d25._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__2369d373._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__2369d373._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__24fa7b94._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__24fa7b94._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__2c9b0df9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__2c9b0df9._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__2ffbbf0e._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__2ffbbf0e._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__394097c4._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__394097c4._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__457a879e._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__457a879e._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__4ae35c7d._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__4ae35c7d._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__4d1845bd._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__4d1845bd._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__593499ba._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__593499ba._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__69bcd4b9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__69bcd4b9._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__7f23701b._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__7f23701b._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__8f127b48._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__8f127b48._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__93e05771._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__93e05771._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__9a65704e._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__9a65704e._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__b76a826e._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__b76a826e._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__baf1631b._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__baf1631b._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__bfd1044e._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__bfd1044e._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__c4a25b8f._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__c4a25b8f._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__c4e76686._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__c4e76686._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__c6906128._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__c6906128._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__c8eb444c._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__c8eb444c._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__e28b8399._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__e28b8399._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__e31f8972._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__e31f8972._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__fee3f59e._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__fee3f59e._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__fff0b9c4._.js +0 -6
- package/.next/server/chunks/[root-of-the-server]__fff0b9c4._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__277a8350._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__277a8350._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__7458e8cf._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__7458e8cf._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__8aa0b951._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__8aa0b951._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__91b2c698._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__91b2c698._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ae77070e._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__c72e7548._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_aefa2538._.js.map +0 -1
- package/.next/static/chunks/4fb7740933125c6a.js +0 -1
- /package/.next/server/chunks/{[root-of-the-server]__dc6c67a5._.js.map → [root-of-the-server]__74b80ca4._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__94ebcd84._.js.map → [root-of-the-server]__b5c2b370._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__920d7db4._.js.map → [root-of-the-server]__be5f57b2._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__b6de1782._.js.map → [root-of-the-server]__507d2fc9._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__72721a7e._.js.map → [root-of-the-server]__f75a61bf._.js.map} +0 -0
- /package/.next/static/{8pxUnfVjZMQrso_jWABg7 → uZkSG3UgZ81MwaAQa74zD}/_buildManifest.js +0 -0
- /package/.next/static/{8pxUnfVjZMQrso_jWABg7 → uZkSG3UgZ81MwaAQa74zD}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{8pxUnfVjZMQrso_jWABg7 → uZkSG3UgZ81MwaAQa74zD}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[98262,a=>{"use strict";var b=a.i(87924),c=a.i(35112),d=a.i(72131),e=a.i(50944);function f({open:a,agentId:d,busy:e,error:f,onClose:g,onConfirm:h}){return a?(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:g}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete agent"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete agent ",(0,b.jsx)("code",{className:"font-mono",children:d}),"? This will remove its workspace/state."]}),f?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:f}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:g,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:e,onClick:h,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:e?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function g({agentId:a,returnTo:c}){let g=(0,e.useRouter)(),[h,i]=(0,d.useState)(null),[j,k]=(0,d.useState)(!0),[l,m]=(0,d.useState)(!1),[n,o]=(0,d.useState)(!1),[p,q]=(0,d.useState)(""),[r,s]=(0,d.useState)(""),[t,u]=(0,d.useState)(""),[v,w]=(0,d.useState)(""),[x,y]=(0,d.useState)(!1),[z,A]=(0,d.useState)(!1),[B,C]=(0,d.useState)(null),[D,E]=(0,d.useState)("identity"),[F,G]=(0,d.useState)(""),[H,I]=(0,d.useState)(""),[J,K]=(0,d.useState)(""),[L,M]=(0,d.useState)(""),[N,O]=(0,d.useState)(""),[P,Q]=(0,d.useState)([]),[R,S]=(0,d.useState)([]),[T,U]=(0,d.useState)(!1),[V,W]=(0,d.useState)(""),[X,Y]=(0,d.useState)(!1),[Z,$]=(0,d.useState)([]),[_,aa]=(0,d.useState)(!1),[ab,ac]=(0,d.useState)(!1),[ad,ae]=(0,d.useState)("IDENTITY.md"),[af,ag]=(0,d.useState)(""),ah=a.includes("-")?a.split("-").slice(0,-1).join("-"):"";async function ai(){m(!0),q("");try{let b=await fetch("/api/agents/identity",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:F,emoji:H,theme:J,avatar:L})}),c=await b.json();if(!b.ok)throw Error(c.message||c.error||"Save failed");q("Saved identity via openclaw agents set-identity")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function aj(){m(!0),q(""),setTimeout(()=>q(""),6e3);try{let b=await fetch("/api/agents/update",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,patch:{model:N}})}),c=await b.json();if(!b.ok)throw Error(c.error||"Save config failed");q("Saved agent config (model) and restarted gateway")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function ak(b){ae(b),ag(""),o(!0),s("");try{let c=await fetch(`/api/agents/file?agentId=${encodeURIComponent(a)}&name=${encodeURIComponent(b)}`,{cache:"no-store"}),d=await c.json();if(!c.ok||!d.ok)throw Error(d.error||"Failed to load file");ag(String(d.content??""))}catch(a){s(a instanceof Error?a.message:String(a)),setTimeout(()=>s(""),12e3)}finally{o(!1)}}async function al(){m(!0),s("");try{let b=await fetch("/api/agents/file",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:ad,content:af})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to save file")}catch(a){s(a instanceof Error?a.message:String(a)),setTimeout(()=>s(""),12e3)}finally{m(!1)}}async function am(){A(!0),C(null),q("");try{let b=await fetch(`/api/agents/${encodeURIComponent(a)}`,{method:"DELETE"}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||c.message||c.stderr||"Delete failed");window.location.href="/"}catch(a){C(a instanceof Error?a.message:String(a)),A(!1)}}return((0,d.useEffect)(()=>{(async()=>{k(!0),q("");try{let b=await fetch("/api/agents",{cache:"no-store"}),c=await b.json(),d=(Array.isArray(c.agents)?c.agents:[]).find(b=>b.id===a)??null;i(d),G(d?.identityName??""),O(d?.model??""),k(!1),(async()=>{aa(!0),U(!0);try{let[b,c,d]=await Promise.all([fetch(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch("/api/skills/available",{cache:"no-store"})]),e=[];try{let a=await b.json();if(b.ok&&a.ok){let b=Array.isArray(a.files)?a.files:[];$(b.map(a=>({name:String(a.name??""),missing:!!a.missing,required:!!a.required,rationale:"string"==typeof a.rationale?a.rationale:void 0})))}}catch{}try{let a=await c.json();c.ok&&a.ok&&(e=Array.isArray(a.skills)?a.skills:[],Q(e))}catch{}try{let a=await d.json();if(d.ok&&a.ok){let b=Array.isArray(a.skills)?a.skills:[];S(b);let c=b.find(a=>!e.includes(a));W(c??b[0]??"")}}catch{}}finally{aa(!1),U(!1)}})()}catch(a){q(a instanceof Error?a.message:String(a))}finally{k(!1)}})()},[a]),(0,d.useEffect)(()=>{if("files"!==D||!Z.length)return;let a=Z.some(a=>a.name===ad),b=Z[0]?.name,c=a?ad:b;c&&(c!==ad&&(ae(c),ag("")),af||ak(c))},[D,a,Z.length]),j)?(0,b.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Loading…"}):h?(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6 sm:p-8",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Agent editor"}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[h.id,h.isDefault?" • default":"",h.model?` • ${h.model}`:""]})]}),(0,b.jsx)("button",{type:"button",disabled:l,onClick:()=>{C(null),y(!0)},className:"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50",children:"Delete agent"})]}),h.workspace?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Workspace: ",h.workspace]}):null,ah?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Team: ",ah]}):null,p?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]",children:p}):null,(0,b.jsx)("div",{className:"mt-6 flex flex-wrap gap-2",children:[{id:"identity",label:"Identity"},{id:"config",label:"Config"},{id:"skills",label:"Skills"},{id:"files",label:"Files"}].map(a=>(0,b.jsx)("button",{onClick:()=>E(a.id),className:D===a.id?"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]":"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10",children:a.label},a.id))}),(0,b.jsxs)("div",{className:"mt-6 grid grid-cols-1 gap-4",children:["identity"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Identity"}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Name"}),(0,b.jsx)("input",{value:F,onChange:a=>G(a.target.value),className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Emoji"}),(0,b.jsx)("input",{value:H,onChange:a=>I(a.target.value),placeholder:"🦞",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Theme"}),(0,b.jsx)("input",{value:J,onChange:a=>K(a.target.value),placeholder:"warm, sharp, calm",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Avatar"}),(0,b.jsx)("input",{value:L,onChange:a=>M(a.target.value),placeholder:"avatars/openclaw.png",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col gap-2 sm:flex-row",children:[(0,b.jsx)("button",{disabled:l,onClick:ai,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50",children:l?"Saving…":"Save"}),c?(0,b.jsx)("button",{disabled:l,onClick:async()=>{await ai(),g.push(c)},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50",children:"Save & return"}):null]})]}):null,"config"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Config"}),(0,b.jsx)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:"Thin slice: edit the configured model id for this agent (writes to OpenClaw config)."}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Model"}),(0,b.jsx)("input",{value:N,onChange:a=>O(a.target.value),placeholder:"openai/gpt-5.2",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsx)("button",{disabled:l,onClick:aj,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save config"})})]}):null,"skills"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Skills"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Skills installed in this ",(0,b.jsx)("strong",{children:"agent"})," workspace (",(0,b.jsx)("code",{children:"skills/"}),"). If you want a skill available to all agents, add it at the team level."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Installed"}),(0,b.jsx)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]",children:T?(0,b.jsx)("li",{children:"Loading…"}):P.length?P.map(a=>(0,b.jsx)("li",{children:a},a)):(0,b.jsx)("li",{children:"None installed."})})]}),(0,b.jsxs)("div",{className:"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Add a skill"}),(0,b.jsxs)("div",{className:"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center",children:[(0,b.jsx)("select",{value:V,onChange:a=>W(a.target.value),className:"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",disabled:X||!R.length,children:R.length?R.map(a=>(0,b.jsx)("option",{value:a,children:a},a)):(0,b.jsx)("option",{value:"",children:"No skills found"})}),(0,b.jsx)("button",{type:"button",disabled:X||!V,onClick:async()=>{Y(!0),u(""),w("");try{let b=await fetch("/api/agents/skills/install",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,skill:V})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to install skill");u(`Installed skill: ${V}`),setTimeout(()=>u(""),8e3);let d=await fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await d.json();d.ok&&e.ok&&Q(Array.isArray(e.skills)?e.skills:[])}catch(a){w(a instanceof Error?a.message:String(a)),setTimeout(()=>w(""),12e3)}finally{Y(!1)}},className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:X?"Adding…":"Add"})]}),v?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:v}):t?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100",children:t}):null,(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["This uses ",(0,b.jsxs)("code",{children:["openclaw recipes install-skill <skill> --agent-id ",a," --yes"]}),"."]})]})]}):null,"files"===D?(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent files"}),(0,b.jsxs)("label",{className:"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:ab,onChange:a=>ac(a.target.checked)}),"Show optional"]})]}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"Default view hides optional missing files to reduce noise."}),(0,b.jsxs)("ul",{className:"mt-3 space-y-1",children:[_?(0,b.jsx)("li",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}):null,Z.filter(a=>!!ab||!!a.required||!a.missing).map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("button",{onClick:()=>ak(a.name),className:ad===a.name?"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]":"w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5",children:[(0,b.jsx)("span",{className:a.required?"text-[color:var(--ck-text-primary)]":"text-[color:var(--ck-text-secondary)]",children:a.name}),(0,b.jsx)("span",{className:"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:a.required?"required":"optional"}),a.missing?(0,b.jsx)("span",{className:"ml-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"missing"}):null]})},a.name))]})]}),(0,b.jsxs)("div",{className:"ck-glass-strong p-4 lg:col-span-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Edit: ",ad]}),(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[n?(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Loading…"}):null,(0,b.jsx)("button",{disabled:l,onClick:al,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save file"})]})]}),r?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:r}):null,(0,b.jsx)("textarea",{value:af,onChange:a=>ag(a.target.value),className:"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]",spellCheck:!1})]})]}):null]}),(0,b.jsx)(f,{open:x,agentId:a,busy:z,error:B,onClose:()=>y(!1),onConfirm:()=>void am()})]}):(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:["Agent not found: ",a]})}a.s(["default",()=>g])}];
|
|
1
|
+
module.exports=[98262,a=>{"use strict";var b=a.i(87924),c=a.i(35112),d=a.i(72131),e=a.i(50944);function f({open:a,agentId:d,busy:e,error:f,onClose:g,onConfirm:h}){return a?(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:g}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete agent"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete agent ",(0,b.jsx)("code",{className:"font-mono",children:d}),"? This will remove its workspace/state."]}),f?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:f}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:g,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:e,onClick:h,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:e?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function g({agentId:a,returnTo:c}){let g=(0,e.useRouter)(),[h,i]=(0,d.useState)(null),[j,k]=(0,d.useState)(!0),[l,m]=(0,d.useState)(!1),[n,o]=(0,d.useState)(!1),[p,q]=(0,d.useState)(""),[r,s]=(0,d.useState)(""),[t,u]=(0,d.useState)(""),[v,w]=(0,d.useState)(""),[x,y]=(0,d.useState)(!1),[z,A]=(0,d.useState)(!1),[B,C]=(0,d.useState)(null),[D,E]=(0,d.useState)("identity"),[F,G]=(0,d.useState)(""),[H,I]=(0,d.useState)(""),[J,K]=(0,d.useState)(""),[L,M]=(0,d.useState)(""),[N,O]=(0,d.useState)(""),[P,Q]=(0,d.useState)([]),[R,S]=(0,d.useState)([]),[T,U]=(0,d.useState)(!1),[V,W]=(0,d.useState)(""),[X,Y]=(0,d.useState)(!1),[Z,$]=(0,d.useState)([]),[_,aa]=(0,d.useState)(!1),[ab,ac]=(0,d.useState)(!1),[ad,ae]=(0,d.useState)("SOUL.md"),[af,ag]=(0,d.useState)(""),ah=a.includes("-")?a.split("-").slice(0,-1).join("-"):"";async function ai(){m(!0),q("");try{let b=await fetch("/api/agents/identity",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:F,emoji:H,theme:J,avatar:L})}),c=await b.json();if(!b.ok)throw Error(c.message||c.error||"Save failed");q("Saved identity via openclaw agents set-identity")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function aj(){m(!0),q("");try{let b=await fetch("/api/agents/update",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,patch:{model:N}})}),c=await b.json();if(!b.ok)throw Error(c.error||"Save config failed");q("Saved agent config (model) and restarted gateway")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function ak(b){ae(b),ag(""),o(!0),s("");try{let c=await fetch(`/api/agents/file?agentId=${encodeURIComponent(a)}&name=${encodeURIComponent(b)}`,{cache:"no-store"}),d=await c.json();if(!c.ok||!d.ok)throw Error(d.error||"Failed to load file");ag(String(d.content??""))}catch(a){s(a instanceof Error?a.message:String(a))}finally{o(!1)}}async function al(){m(!0),s("");try{let b=await fetch("/api/agents/file",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:ad,content:af})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to save file");let d=await fetch(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await d.json();d.ok&&e.ok&&Array.isArray(e.files)&&$(e.files)}catch(a){s(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function am(a){ae(a),s(""),ag(function(a){switch(a){case"SOUL.md":return"# SOUL.md\n\n";case"AGENTS.md":return"# AGENTS.md\n\n";case"TOOLS.md":return"# TOOLS.md\n\n";case"STATUS.md":return"# STATUS.md\n\n- (empty)\n";case"NOTES.md":return"# NOTES.md\n\n- (empty)\n";case"IDENTITY.md":return"# IDENTITY.md\n\n- **Name:**\n- **Creature:**\n- **Vibe:**\n- **Emoji:**\n- **Avatar:**\n";case"USER.md":return"# USER.md\n\n";case"HEARTBEAT.md":return"# HEARTBEAT.md\n\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\n";default:return""}}(a)),await al()}async function an(){A(!0),C(null),q("");try{let b=await fetch(`/api/agents/${encodeURIComponent(a)}`,{method:"DELETE"}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||c.message||c.stderr||"Delete failed");window.location.href="/"}catch(a){C(a instanceof Error?a.message:String(a)),A(!1)}}return(0,d.useEffect)(()=>{(async()=>{k(!0),q("");try{let b=await fetch("/api/agents",{cache:"no-store"}),c=await b.json(),d=(Array.isArray(c.agents)?c.agents:[]).find(b=>b.id===a)??null;i(d),G(d?.identityName??""),O(d?.model??""),k(!1),(async()=>{aa(!0),U(!0);try{let[b,c,d]=await Promise.all([fetch(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch("/api/skills/available",{cache:"no-store"})]),e=[];try{let a=await b.json();if(b.ok&&a.ok){let b=Array.isArray(a.files)?a.files:[];$(b.map(a=>({name:String(a.name??""),missing:!!a.missing,required:!!a.required,rationale:"string"==typeof a.rationale?a.rationale:void 0})))}}catch{}try{let a=await c.json();c.ok&&a.ok&&(e=Array.isArray(a.skills)?a.skills:[],Q(e))}catch{}try{let a=await d.json();if(d.ok&&a.ok){let b=Array.isArray(a.skills)?a.skills:[];S(b);let c=b.find(a=>!e.includes(a));W(c??b[0]??"")}}catch{}}finally{aa(!1),U(!1)}})()}catch(a){q(a instanceof Error?a.message:String(a))}finally{k(!1)}})()},[a]),(0,d.useEffect)(()=>{if("files"!==D||!Z.length)return;let a=Z.some(a=>a.name===ad),b=Z[0]?.name,c=a?ad:b;c&&(c!==ad&&(ae(c),ag("")),af||ak(c))},[D,a,Z.length]),j?(0,b.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Loading…"}):h?(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6 sm:p-8",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Agent editor"}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[h.id,h.isDefault?" • default":"",h.model?` • ${h.model}`:""]})]}),(0,b.jsx)("button",{type:"button",disabled:l,onClick:()=>{C(null),y(!0)},className:"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50",children:"Delete agent"})]}),h.workspace?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Workspace: ",h.workspace]}):null,ah?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Team: ",ah]}):null,p?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]",children:p}):null,(0,b.jsx)("div",{className:"mt-6 flex flex-wrap gap-2",children:[{id:"identity",label:"Identity"},{id:"config",label:"Config"},{id:"skills",label:"Skills"},{id:"files",label:"Files"}].map(a=>(0,b.jsx)("button",{onClick:()=>E(a.id),className:D===a.id?"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]":"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10",children:a.label},a.id))}),(0,b.jsxs)("div",{className:"mt-6 grid grid-cols-1 gap-4",children:["identity"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Identity"}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Name"}),(0,b.jsx)("input",{value:F,onChange:a=>G(a.target.value),className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Emoji"}),(0,b.jsx)("input",{value:H,onChange:a=>I(a.target.value),placeholder:"🦞",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Theme"}),(0,b.jsx)("input",{value:J,onChange:a=>K(a.target.value),placeholder:"warm, sharp, calm",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Avatar"}),(0,b.jsx)("input",{value:L,onChange:a=>M(a.target.value),placeholder:"avatars/openclaw.png",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col gap-2 sm:flex-row",children:[(0,b.jsx)("button",{disabled:l,onClick:ai,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50",children:l?"Saving…":"Save"}),c?(0,b.jsx)("button",{disabled:l,onClick:async()=>{await ai(),g.push(c)},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50",children:"Save & return"}):null]})]}):null,"config"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Config"}),(0,b.jsx)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:"Thin slice: edit the configured model id for this agent (writes to OpenClaw config)."}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Model"}),(0,b.jsx)("input",{value:N,onChange:a=>O(a.target.value),placeholder:"openai/gpt-5.2",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsx)("button",{disabled:l,onClick:aj,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save config"})})]}):null,"skills"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Skills"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Skills installed in this ",(0,b.jsx)("strong",{children:"agent"})," workspace (",(0,b.jsx)("code",{children:"skills/"}),"). If you want a skill available to all agents, add it at the team level."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Installed"}),(0,b.jsx)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]",children:T?(0,b.jsx)("li",{children:"Loading…"}):P.length?P.map(a=>(0,b.jsx)("li",{children:a},a)):(0,b.jsx)("li",{children:"None installed."})})]}),(0,b.jsxs)("div",{className:"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Add a skill"}),(0,b.jsxs)("div",{className:"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center",children:[(0,b.jsx)("select",{value:V,onChange:a=>W(a.target.value),className:"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",disabled:X||!R.length,children:R.length?R.map(a=>(0,b.jsx)("option",{value:a,children:a},a)):(0,b.jsx)("option",{value:"",children:"No skills found"})}),(0,b.jsx)("button",{type:"button",disabled:X||!V,onClick:async()=>{Y(!0),u(""),w("");try{let b=await fetch("/api/agents/skills/install",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,skill:V})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to install skill");u(`Installed skill: ${V}`);let d=await fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await d.json();d.ok&&e.ok&&Q(Array.isArray(e.skills)?e.skills:[])}catch(a){w(a instanceof Error?a.message:String(a))}finally{Y(!1)}},className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:X?"Adding…":"Add"})]}),v?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:v}):t?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100",children:t}):null,(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["This uses ",(0,b.jsxs)("code",{children:["openclaw recipes install-skill <skill> --agent-id ",a," --yes"]}),"."]})]})]}):null,"files"===D?(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent files"}),(0,b.jsxs)("label",{className:"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:ab,onChange:a=>ac(a.target.checked)}),"Show optional"]})]}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"Default view hides optional missing files to reduce noise."}),(0,b.jsxs)("ul",{className:"mt-3 space-y-1",children:[_?(0,b.jsx)("li",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}):null,Z.filter(a=>!!ab||!!a.required||!a.missing).map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsxs)("button",{onClick:()=>ak(a.name),className:ad===a.name?"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]":"w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5",children:[(0,b.jsx)("span",{className:a.required?"text-[color:var(--ck-text-primary)]":"text-[color:var(--ck-text-secondary)]",children:a.name}),(0,b.jsx)("span",{className:"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:a.required?"required":"optional"}),a.missing?(0,b.jsx)("span",{className:"ml-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"missing"}):null]}),a.missing?(0,b.jsx)("button",{type:"button",disabled:l,onClick:()=>void am(a.name),className:"shrink-0 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50",children:"Create"}):null]})},a.name))]})]}),(0,b.jsxs)("div",{className:"ck-glass-strong p-4 lg:col-span-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Edit: ",ad]}),(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[n?(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Loading…"}):null,(0,b.jsx)("button",{disabled:l,onClick:al,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save file"})]})]}),r?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:r}):null,(0,b.jsx)("textarea",{value:af,onChange:a=>ag(a.target.value),className:"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]",spellCheck:!1})]})]}):null]}),(0,b.jsx)(f,{open:x,agentId:a,busy:z,error:B,onClose:()=>y(!1),onConfirm:()=>void an()})]}):(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:["Agent not found: ",a]})}a.s(["default",()=>g])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_app_agents_%5BagentId%5D_agent-editor_tsx_f85bbe65._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/agents/%5BagentId%5D/agent-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport { createPortal } from \"react-dom\";\nimport { useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\ntype AgentListItem = {\n id: string;\n identityName?: string;\n workspace?: string;\n model?: string;\n isDefault?: boolean;\n};\n\ntype FileListResponse = { ok?: boolean; files?: unknown[] };\n\ntype FileEntry = { name: string; missing: boolean };\n\nfunction DeleteAgentModal({\n open,\n agentId,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n agentId: string;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} />\n <div className=\"fixed inset-0 overflow-y-auto\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">Delete agent</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Delete agent <code className=\"font-mono\">{agentId}</code>? This will remove its workspace/state.\n </p>\n\n {error ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={busy}\n onClick={onConfirm}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {busy ? \"Deleting…\" : \"Delete\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport default function AgentEditor({ agentId, returnTo }: { agentId: string; returnTo?: string }) {\n const router = useRouter();\n const [agent, setAgent] = useState<AgentListItem | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [loadingFile, setLoadingFile] = useState(false);\n // Split concerns: avoid file-load errors showing up in the Skills notice area.\n const [pageMsg, setPageMsg] = useState<string>(\"\");\n const [fileError, setFileError] = useState<string>(\"\");\n const [skillMsg, setSkillMsg] = useState<string>(\"\");\n const [skillError, setSkillError] = useState<string>(\"\");\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [activeTab, setActiveTab] = useState<\"identity\" | \"config\" | \"skills\" | \"files\">(\"identity\");\n\n const [name, setName] = useState<string>(\"\");\n const [emoji, setEmoji] = useState<string>(\"\");\n const [theme, setTheme] = useState<string>(\"\");\n const [avatar, setAvatar] = useState<string>(\"\");\n\n const [model, setModel] = useState<string>(\"\");\n\n const [skillsList, setSkillsList] = useState<string[]>([]);\n const [availableSkills, setAvailableSkills] = useState<string[]>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<string>(\"\");\n const [installingSkill, setInstallingSkill] = useState(false);\n\n const [agentFiles, setAgentFiles] = useState<Array<FileEntry & { required?: boolean; rationale?: string }>>([]);\n const [agentFilesLoading, setAgentFilesLoading] = useState(false);\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"IDENTITY.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const teamId = agentId.includes(\"-\") ? agentId.split(\"-\").slice(0, -1).join(\"-\") : \"\";\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setPageMsg(\"\");\n try {\n const agentsRes = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };\n const list = Array.isArray(agentsJson.agents) ? (agentsJson.agents as AgentListItem[]) : [];\n const found = list.find((a) => a.id === agentId) ?? null;\n setAgent(found);\n setName(found?.identityName ?? \"\");\n setModel(found?.model ?? \"\");\n\n // Render ASAP; load files/skills in the background.\n setLoading(false);\n\n void (async () => {\n setAgentFilesLoading(true);\n setSkillsLoading(true);\n\n try {\n const [filesRes, skillsRes, availableSkillsRes] = await Promise.all([\n fetch(`/api/agents/files?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(\"/api/skills/available\", { cache: \"no-store\" }),\n ]);\n\n let installedSkills: string[] = [];\n\n try {\n const filesJson = (await filesRes.json()) as FileListResponse;\n if (filesRes.ok && filesJson.ok) {\n const files = Array.isArray(filesJson.files) ? filesJson.files : [];\n setAgentFiles(\n files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean((entry as { required?: unknown }).required),\n rationale:\n typeof (entry as { rationale?: unknown }).rationale === \"string\"\n ? ((entry as { rationale?: string }).rationale as string)\n : undefined,\n };\n }),\n );\n }\n } catch {\n // ignore\n }\n\n try {\n const skillsJson = (await skillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (skillsRes.ok && skillsJson.ok) {\n installedSkills = Array.isArray(skillsJson.skills) ? (skillsJson.skills as string[]) : [];\n setSkillsList(installedSkills);\n }\n } catch {\n // ignore\n }\n\n try {\n const availableSkillsJson = (await availableSkillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (availableSkillsRes.ok && availableSkillsJson.ok) {\n const list = Array.isArray(availableSkillsJson.skills) ? (availableSkillsJson.skills as string[]) : [];\n setAvailableSkills(list);\n // Default select first available skill not already installed.\n const first = list.find((s) => !installedSkills.includes(s));\n setSelectedSkill(first ?? list[0] ?? \"\");\n }\n } catch {\n // ignore\n }\n } finally {\n setAgentFilesLoading(false);\n setSkillsLoading(false);\n }\n })();\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n // If the happy-path already flipped loading=false early, this is a no-op.\n setLoading(false);\n }\n })();\n }, [agentId]);\n\n async function onSaveIdentity() {\n setSaving(true);\n setPageMsg(\"\");\n try {\n const res = await fetch(\"/api/agents/identity\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name, emoji, theme, avatar }),\n });\n const json = (await res.json()) as { message?: string; error?: string };\n if (!res.ok) throw new Error(json.message || json.error || \"Save failed\");\n setPageMsg(\"Saved identity via openclaw agents set-identity\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveConfig() {\n setSaving(true);\n setPageMsg(\"\");\n\n // Auto-clear after a moment (non-blocking).\n setTimeout(() => setPageMsg(\"\"), 6000);\n try {\n const res = await fetch(\"/api/agents/update\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, patch: { model } }),\n });\n const json = (await res.json()) as { error?: string };\n if (!res.ok) throw new Error(json.error || \"Save config failed\");\n setPageMsg(\"Saved agent config (model) and restarted gateway\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadAgentFile(nextName: string) {\n // Update selection immediately so the UI reflects what the user clicked,\n // even if the network request fails.\n setFileName(nextName);\n setFileContent(\"\");\n\n setLoadingFile(true);\n setFileError(\"\");\n try {\n const res = await fetch(\n `/api/agents/file?agentId=${encodeURIComponent(agentId)}&name=${encodeURIComponent(nextName)}`,\n { cache: \"no-store\" },\n );\n const json = (await res.json()) as { ok?: boolean; error?: string; content?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load file\");\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n setTimeout(() => setFileError(\"\"), 12000);\n } finally {\n setLoadingFile(false);\n }\n }\n\n // When entering the Files tab, load the current file immediately (default: IDENTITY.md).\n useEffect(() => {\n if (activeTab !== \"files\") return;\n if (!agentFiles.length) return;\n\n const exists = agentFiles.some((f) => f.name === fileName);\n const fallback = agentFiles[0]?.name;\n const target = exists ? fileName : fallback;\n if (!target) return;\n\n if (target !== fileName) {\n setFileName(target);\n setFileContent(\"\");\n }\n\n if (!fileContent) {\n onLoadAgentFile(target);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, agentId, agentFiles.length]);\n\n async function onSaveAgentFile() {\n setSaving(true);\n setFileError(\"\");\n try {\n const res = await fetch(\"/api/agents/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name: fileName, content: fileContent }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save file\");\n // No-op: saving a file doesn't need a global notice.\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n setTimeout(() => setFileError(\"\"), 12000);\n } finally {\n setSaving(false);\n }\n }\n\n async function onDeleteAgent() {\n setDeleteBusy(true);\n setDeleteError(null);\n setPageMsg(\"\");\n\n try {\n const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}`, { method: \"DELETE\" });\n const json = (await res.json()) as { ok?: boolean; error?: string; message?: string; stderr?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || json.message || json.stderr || \"Delete failed\");\n\n window.location.href = \"/\";\n } catch (e: unknown) {\n setDeleteError(e instanceof Error ? e.message : String(e));\n setDeleteBusy(false);\n }\n }\n\n // Initial load only gates the minimal state (agent exists). Files/skills stream in.\n if (loading) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Loading…</div>;\n if (!agent) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Agent not found: {agentId}</div>;\n\n return (\n <div className=\"ck-glass mx-auto max-w-4xl p-6 sm:p-8\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Agent editor</h1>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {agent.id}\n {agent.isDefault ? \" • default\" : \"\"}\n {agent.model ? ` • ${agent.model}` : \"\"}\n </div>\n </div>\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => {\n setDeleteError(null);\n setDeleteOpen(true);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50\"\n >\n Delete agent\n </button>\n </div>\n {agent.workspace ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Workspace: {agent.workspace}</div>\n ) : null}\n {teamId ? <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div> : null}\n\n {pageMsg ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]\">\n {pageMsg}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {(\n [\n { id: \"identity\", label: \"Identity\" },\n { id: \"config\", label: \"Config\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"files\", label: \"Files\" },\n ] as const\n ).map((t) => (\n <button\n key={t.id}\n onClick={() => setActiveTab(t.id)}\n className={\n activeTab === t.id\n ? \"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10\"\n }\n >\n {t.label}\n </button>\n ))}\n </div>\n\n <div className=\"mt-6 grid grid-cols-1 gap-4\">\n {activeTab === \"identity\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Identity</div>\n\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name</label>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Emoji</label>\n <input\n value={emoji}\n onChange={(e) => setEmoji(e.target.value)}\n placeholder=\"🦞\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Theme</label>\n <input\n value={theme}\n onChange={(e) => setTheme(e.target.value)}\n placeholder=\"warm, sharp, calm\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Avatar</label>\n <input\n value={avatar}\n onChange={(e) => setAvatar(e.target.value)}\n placeholder=\"avatars/openclaw.png\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-col gap-2 sm:flex-row\">\n <button\n disabled={saving}\n onClick={onSaveIdentity}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n {returnTo ? (\n <button\n disabled={saving}\n onClick={async () => {\n await onSaveIdentity();\n router.push(returnTo);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50\"\n >\n Save & return\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {activeTab === \"config\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Config</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Thin slice: edit the configured model id for this agent (writes to OpenClaw config).\n </p>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Model</label>\n <input\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"openai/gpt-5.2\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-3\">\n <button\n disabled={saving}\n onClick={onSaveConfig}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save config\"}\n </button>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"skills\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Skills</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Skills installed in this <strong>agent</strong> workspace (<code>skills/</code>). If you want a skill available to all agents,\n add it at the team level.\n </p>\n\n <div className=\"mt-4\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Installed</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {skillsLoading ? (\n <li>Loading…</li>\n ) : skillsList.length ? (\n skillsList.map((s) => <li key={s}>{s}</li>)\n ) : (\n <li>None installed.</li>\n )}\n </ul>\n </div>\n\n <div className=\"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Add a skill</div>\n <div className=\"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <select\n value={selectedSkill}\n onChange={(e) => setSelectedSkill(e.target.value)}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n disabled={installingSkill || !availableSkills.length}\n >\n {availableSkills.length ? (\n availableSkills.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))\n ) : (\n <option value=\"\">No skills found</option>\n )}\n </select>\n <button\n type=\"button\"\n disabled={installingSkill || !selectedSkill}\n onClick={async () => {\n setInstallingSkill(true);\n setSkillMsg(\"\");\n setSkillError(\"\");\n try {\n const res = await fetch(\"/api/agents/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, skill: selectedSkill }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to install skill\");\n setSkillMsg(`Installed skill: ${selectedSkill}`);\n setTimeout(() => setSkillMsg(\"\"), 8000);\n // Refresh installed list.\n const r = await fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok) setSkillsList(Array.isArray(j.skills) ? j.skills : []);\n } catch (e: unknown) {\n setSkillError(e instanceof Error ? e.message : String(e));\n setTimeout(() => setSkillError(\"\"), 12000);\n } finally {\n setInstallingSkill(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {installingSkill ? \"Adding…\" : \"Add\"}\n </button>\n </div>\n\n {skillError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {skillError}\n </div>\n ) : skillMsg ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n {skillMsg}\n </div>\n ) : null}\n\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This uses <code>openclaw recipes install-skill <skill> --agent-id {agentId} --yes</code>.\n </div>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"files\" ? (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent files</div>\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={showOptionalFiles} onChange={(e) => setShowOptionalFiles(e.target.checked)} />\n Show optional\n </label>\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">Default view hides optional missing files to reduce noise.</div>\n <ul className=\"mt-3 space-y-1\">\n {agentFilesLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : null}\n {agentFiles\n .filter((f) => (showOptionalFiles ? true : Boolean(f.required) || !f.missing))\n .map((f) => (\n <li key={f.name}>\n <button\n onClick={() => onLoadAgentFile(f.name)}\n className={\n fileName === f.name\n ? \"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n <span className={f.required ? \"text-[color:var(--ck-text-primary)]\" : \"text-[color:var(--ck-text-secondary)]\"}>\n {f.name}\n </span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n {f.required ? \"required\" : \"optional\"}\n </span>\n {f.missing ? <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">missing</span> : null}\n </button>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Edit: {fileName}</div>\n <div className=\"flex items-center gap-3\">\n {loadingFile ? <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Loading…</span> : null}\n <button\n disabled={saving}\n onClick={onSaveAgentFile}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save file\"}\n </button>\n </div>\n </div>\n\n {fileError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {fileError}\n </div>\n ) : null}\n\n <textarea\n value={fileContent}\n onChange={(e) => setFileContent(e.target.value)}\n className=\"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </div>\n ) : null}\n </div>\n\n <DeleteAgentModal\n open={deleteOpen}\n agentId={agentId}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={() => void onDeleteAgent()}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/agents/%5BagentId%5D/agent-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport { createPortal } from \"react-dom\";\nimport { useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\ntype AgentListItem = {\n id: string;\n identityName?: string;\n workspace?: string;\n model?: string;\n isDefault?: boolean;\n};\n\ntype FileListResponse = { ok?: boolean; files?: unknown[] };\n\ntype FileEntry = { name: string; missing: boolean };\n\nfunction DeleteAgentModal({\n open,\n agentId,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n agentId: string;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} />\n <div className=\"fixed inset-0 overflow-y-auto\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">Delete agent</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Delete agent <code className=\"font-mono\">{agentId}</code>? This will remove its workspace/state.\n </p>\n\n {error ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={busy}\n onClick={onConfirm}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {busy ? \"Deleting…\" : \"Delete\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport default function AgentEditor({ agentId, returnTo }: { agentId: string; returnTo?: string }) {\n const router = useRouter();\n const [agent, setAgent] = useState<AgentListItem | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [loadingFile, setLoadingFile] = useState(false);\n // Split concerns: avoid file-load errors showing up in the Skills notice area.\n const [pageMsg, setPageMsg] = useState<string>(\"\");\n const [fileError, setFileError] = useState<string>(\"\");\n const [skillMsg, setSkillMsg] = useState<string>(\"\");\n const [skillError, setSkillError] = useState<string>(\"\");\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [activeTab, setActiveTab] = useState<\"identity\" | \"config\" | \"skills\" | \"files\">(\"identity\");\n\n const [name, setName] = useState<string>(\"\");\n const [emoji, setEmoji] = useState<string>(\"\");\n const [theme, setTheme] = useState<string>(\"\");\n const [avatar, setAvatar] = useState<string>(\"\");\n\n const [model, setModel] = useState<string>(\"\");\n\n const [skillsList, setSkillsList] = useState<string[]>([]);\n const [availableSkills, setAvailableSkills] = useState<string[]>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<string>(\"\");\n const [installingSkill, setInstallingSkill] = useState(false);\n\n const [agentFiles, setAgentFiles] = useState<Array<FileEntry & { required?: boolean; rationale?: string }>>([]);\n const [agentFilesLoading, setAgentFilesLoading] = useState(false);\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"SOUL.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const teamId = agentId.includes(\"-\") ? agentId.split(\"-\").slice(0, -1).join(\"-\") : \"\";\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setPageMsg(\"\");\n try {\n const agentsRes = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };\n const list = Array.isArray(agentsJson.agents) ? (agentsJson.agents as AgentListItem[]) : [];\n const found = list.find((a) => a.id === agentId) ?? null;\n setAgent(found);\n setName(found?.identityName ?? \"\");\n setModel(found?.model ?? \"\");\n\n // Render ASAP; load files/skills in the background.\n setLoading(false);\n\n void (async () => {\n setAgentFilesLoading(true);\n setSkillsLoading(true);\n\n try {\n const [filesRes, skillsRes, availableSkillsRes] = await Promise.all([\n fetch(`/api/agents/files?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(\"/api/skills/available\", { cache: \"no-store\" }),\n ]);\n\n let installedSkills: string[] = [];\n\n try {\n const filesJson = (await filesRes.json()) as FileListResponse;\n if (filesRes.ok && filesJson.ok) {\n const files = Array.isArray(filesJson.files) ? filesJson.files : [];\n setAgentFiles(\n files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean((entry as { required?: unknown }).required),\n rationale:\n typeof (entry as { rationale?: unknown }).rationale === \"string\"\n ? ((entry as { rationale?: string }).rationale as string)\n : undefined,\n };\n }),\n );\n }\n } catch {\n // ignore\n }\n\n try {\n const skillsJson = (await skillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (skillsRes.ok && skillsJson.ok) {\n installedSkills = Array.isArray(skillsJson.skills) ? (skillsJson.skills as string[]) : [];\n setSkillsList(installedSkills);\n }\n } catch {\n // ignore\n }\n\n try {\n const availableSkillsJson = (await availableSkillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (availableSkillsRes.ok && availableSkillsJson.ok) {\n const list = Array.isArray(availableSkillsJson.skills) ? (availableSkillsJson.skills as string[]) : [];\n setAvailableSkills(list);\n // Default select first available skill not already installed.\n const first = list.find((s) => !installedSkills.includes(s));\n setSelectedSkill(first ?? list[0] ?? \"\");\n }\n } catch {\n // ignore\n }\n } finally {\n setAgentFilesLoading(false);\n setSkillsLoading(false);\n }\n })();\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n // If the happy-path already flipped loading=false early, this is a no-op.\n setLoading(false);\n }\n })();\n }, [agentId]);\n\n async function onSaveIdentity() {\n setSaving(true);\n setPageMsg(\"\");\n try {\n const res = await fetch(\"/api/agents/identity\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name, emoji, theme, avatar }),\n });\n const json = (await res.json()) as { message?: string; error?: string };\n if (!res.ok) throw new Error(json.message || json.error || \"Save failed\");\n setPageMsg(\"Saved identity via openclaw agents set-identity\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveConfig() {\n setSaving(true);\n setPageMsg(\"\");\n\n try {\n const res = await fetch(\"/api/agents/update\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, patch: { model } }),\n });\n const json = (await res.json()) as { error?: string };\n if (!res.ok) throw new Error(json.error || \"Save config failed\");\n setPageMsg(\"Saved agent config (model) and restarted gateway\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadAgentFile(nextName: string) {\n // Update selection immediately so the UI reflects what the user clicked,\n // even if the network request fails.\n setFileName(nextName);\n setFileContent(\"\");\n\n setLoadingFile(true);\n setFileError(\"\");\n try {\n const res = await fetch(\n `/api/agents/file?agentId=${encodeURIComponent(agentId)}&name=${encodeURIComponent(nextName)}`,\n { cache: \"no-store\" },\n );\n const json = (await res.json()) as { ok?: boolean; error?: string; content?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load file\");\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoadingFile(false);\n }\n }\n\n // When entering the Files tab, load the current file immediately (default: IDENTITY.md).\n useEffect(() => {\n if (activeTab !== \"files\") return;\n if (!agentFiles.length) return;\n\n const exists = agentFiles.some((f) => f.name === fileName);\n const fallback = agentFiles[0]?.name;\n const target = exists ? fileName : fallback;\n if (!target) return;\n\n if (target !== fileName) {\n setFileName(target);\n setFileContent(\"\");\n }\n\n if (!fileContent) {\n onLoadAgentFile(target);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, agentId, agentFiles.length]);\n\n function defaultFileContent(name: string) {\n switch (name) {\n case \"SOUL.md\":\n return \"# SOUL.md\\n\\n\";\n case \"AGENTS.md\":\n return \"# AGENTS.md\\n\\n\";\n case \"TOOLS.md\":\n return \"# TOOLS.md\\n\\n\";\n case \"STATUS.md\":\n return \"# STATUS.md\\n\\n- (empty)\\n\";\n case \"NOTES.md\":\n return \"# NOTES.md\\n\\n- (empty)\\n\";\n case \"IDENTITY.md\":\n return \"# IDENTITY.md\\n\\n- **Name:**\\n- **Creature:**\\n- **Vibe:**\\n- **Emoji:**\\n- **Avatar:**\\n\";\n case \"USER.md\":\n return \"# USER.md\\n\\n\";\n case \"HEARTBEAT.md\":\n return \"# HEARTBEAT.md\\n\\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\\n\";\n default:\n return \"\";\n }\n }\n\n async function onSaveAgentFile() {\n setSaving(true);\n setFileError(\"\");\n try {\n const res = await fetch(\"/api/agents/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name: fileName, content: fileContent }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save file\");\n\n // Refresh the file list so missing/mtime updates immediately.\n const r = await fetch(`/api/agents/files?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok && Array.isArray(j.files)) {\n setAgentFiles(j.files);\n }\n // No-op: saving a file doesn't need a global notice.\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onCreateMissingFile(name: string) {\n setFileName(name);\n setFileError(\"\");\n setFileContent(defaultFileContent(name));\n await onSaveAgentFile();\n }\n\n async function onDeleteAgent() {\n setDeleteBusy(true);\n setDeleteError(null);\n setPageMsg(\"\");\n\n try {\n const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}`, { method: \"DELETE\" });\n const json = (await res.json()) as { ok?: boolean; error?: string; message?: string; stderr?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || json.message || json.stderr || \"Delete failed\");\n\n window.location.href = \"/\";\n } catch (e: unknown) {\n setDeleteError(e instanceof Error ? e.message : String(e));\n setDeleteBusy(false);\n }\n }\n\n // Initial load only gates the minimal state (agent exists). Files/skills stream in.\n if (loading) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Loading…</div>;\n if (!agent) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Agent not found: {agentId}</div>;\n\n return (\n <div className=\"ck-glass mx-auto max-w-4xl p-6 sm:p-8\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Agent editor</h1>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {agent.id}\n {agent.isDefault ? \" • default\" : \"\"}\n {agent.model ? ` • ${agent.model}` : \"\"}\n </div>\n </div>\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => {\n setDeleteError(null);\n setDeleteOpen(true);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50\"\n >\n Delete agent\n </button>\n </div>\n {agent.workspace ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Workspace: {agent.workspace}</div>\n ) : null}\n {teamId ? <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div> : null}\n\n {pageMsg ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]\">\n {pageMsg}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {(\n [\n { id: \"identity\", label: \"Identity\" },\n { id: \"config\", label: \"Config\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"files\", label: \"Files\" },\n ] as const\n ).map((t) => (\n <button\n key={t.id}\n onClick={() => setActiveTab(t.id)}\n className={\n activeTab === t.id\n ? \"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10\"\n }\n >\n {t.label}\n </button>\n ))}\n </div>\n\n <div className=\"mt-6 grid grid-cols-1 gap-4\">\n {activeTab === \"identity\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Identity</div>\n\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name</label>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Emoji</label>\n <input\n value={emoji}\n onChange={(e) => setEmoji(e.target.value)}\n placeholder=\"🦞\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Theme</label>\n <input\n value={theme}\n onChange={(e) => setTheme(e.target.value)}\n placeholder=\"warm, sharp, calm\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Avatar</label>\n <input\n value={avatar}\n onChange={(e) => setAvatar(e.target.value)}\n placeholder=\"avatars/openclaw.png\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-col gap-2 sm:flex-row\">\n <button\n disabled={saving}\n onClick={onSaveIdentity}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n {returnTo ? (\n <button\n disabled={saving}\n onClick={async () => {\n await onSaveIdentity();\n router.push(returnTo);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50\"\n >\n Save & return\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {activeTab === \"config\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Config</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Thin slice: edit the configured model id for this agent (writes to OpenClaw config).\n </p>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Model</label>\n <input\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"openai/gpt-5.2\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-3\">\n <button\n disabled={saving}\n onClick={onSaveConfig}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save config\"}\n </button>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"skills\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Skills</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Skills installed in this <strong>agent</strong> workspace (<code>skills/</code>). If you want a skill available to all agents,\n add it at the team level.\n </p>\n\n <div className=\"mt-4\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Installed</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {skillsLoading ? (\n <li>Loading…</li>\n ) : skillsList.length ? (\n skillsList.map((s) => <li key={s}>{s}</li>)\n ) : (\n <li>None installed.</li>\n )}\n </ul>\n </div>\n\n <div className=\"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Add a skill</div>\n <div className=\"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <select\n value={selectedSkill}\n onChange={(e) => setSelectedSkill(e.target.value)}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n disabled={installingSkill || !availableSkills.length}\n >\n {availableSkills.length ? (\n availableSkills.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))\n ) : (\n <option value=\"\">No skills found</option>\n )}\n </select>\n <button\n type=\"button\"\n disabled={installingSkill || !selectedSkill}\n onClick={async () => {\n setInstallingSkill(true);\n setSkillMsg(\"\");\n setSkillError(\"\");\n try {\n const res = await fetch(\"/api/agents/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, skill: selectedSkill }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to install skill\");\n setSkillMsg(`Installed skill: ${selectedSkill}`);\n // Refresh installed list.\n const r = await fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok) setSkillsList(Array.isArray(j.skills) ? j.skills : []);\n } catch (e: unknown) {\n setSkillError(e instanceof Error ? e.message : String(e));\n } finally {\n setInstallingSkill(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {installingSkill ? \"Adding…\" : \"Add\"}\n </button>\n </div>\n\n {skillError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {skillError}\n </div>\n ) : skillMsg ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n {skillMsg}\n </div>\n ) : null}\n\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This uses <code>openclaw recipes install-skill <skill> --agent-id {agentId} --yes</code>.\n </div>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"files\" ? (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent files</div>\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={showOptionalFiles} onChange={(e) => setShowOptionalFiles(e.target.checked)} />\n Show optional\n </label>\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">Default view hides optional missing files to reduce noise.</div>\n <ul className=\"mt-3 space-y-1\">\n {agentFilesLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : null}\n {agentFiles\n .filter((f) => (showOptionalFiles ? true : Boolean(f.required) || !f.missing))\n .map((f) => (\n <li key={f.name}>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => onLoadAgentFile(f.name)}\n className={\n fileName === f.name\n ? \"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n <span className={f.required ? \"text-[color:var(--ck-text-primary)]\" : \"text-[color:var(--ck-text-secondary)]\"}>\n {f.name}\n </span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n {f.required ? \"required\" : \"optional\"}\n </span>\n {f.missing ? <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">missing</span> : null}\n </button>\n {f.missing ? (\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => void onCreateMissingFile(f.name)}\n className=\"shrink-0 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Create\n </button>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Edit: {fileName}</div>\n <div className=\"flex items-center gap-3\">\n {loadingFile ? <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Loading…</span> : null}\n <button\n disabled={saving}\n onClick={onSaveAgentFile}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save file\"}\n </button>\n </div>\n </div>\n\n {fileError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {fileError}\n </div>\n ) : null}\n\n <textarea\n value={fileContent}\n onChange={(e) => setFileContent(e.target.value)}\n className=\"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </div>\n ) : null}\n </div>\n\n <DeleteAgentModal\n open={deleteOpen}\n agentId={agentId}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={() => void onDeleteAgent()}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[55408,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(50944),e=a.i(72131),f=a.i(35112);let g={1:"Ordering team…",2:"Cooking up agents…",3:"Serving them up hot…"};function h({open:a,step:c,onDismiss:d}){return a?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none"}),d?(0,b.jsx)("button",{type:"button",onClick:a=>{a.preventDefault(),a.stopPropagation(),d()},className:"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-glass-strong)]","aria-label":"Dismiss loading overlay",title:"Dismiss",children:"Esc"}):null,(0,b.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,b.jsxs)("div",{className:"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-2xl font-semibold text-[color:var(--ck-text-primary)]",children:"Claw Kitchen"}),(0,b.jsx)("div",{className:"mt-3 text-base text-[color:var(--ck-text-secondary)]",children:"Hang tight — we’re updating your OpenClaw install."}),(0,b.jsx)("div",{className:"mt-8 space-y-4 text-base",children:[1,2,3].map(a=>{let d=a===c,e=a<c;return(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)("div",{className:"h-4 w-4 rounded-full "+(e?"bg-emerald-400":d?"bg-[var(--ck-accent-red)] animate-pulse":"bg-white/20")}),(0,b.jsx)("div",{className:e?"text-[color:var(--ck-text-secondary)] line-through":"text-[color:var(--ck-text-primary)]",children:g[a]})]},a)})})]})})]}),document.body):null}var i=a.i(61889);function j({open:a,recipeId:c,recipeName:d,teamId:g,setTeamId:h,installCron:i,setInstallCron:j,busy:k,error:l,onClose:m,onConfirm:n}){let[o,p]=(0,e.useState)(""),[q,r]=(0,e.useState)(!1),s=(0,e.useMemo)(()=>String(o??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[o]),t=q?g:s;return((0,e.useEffect)(()=>{a&&(q||h(s))},[s,a,q]),(0,e.useEffect)(()=>{a&&(r(!1),p(""),h(""))},[a]),a)?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:m}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create team"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new team from recipe ",(0,b.jsx)("code",{className:"font-mono",children:c}),d?(0,b.jsxs)(b.Fragment,{children:[" ","(",(0,b.jsx)("span",{className:"font-medium",children:d}),")"]}):null,"."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team name"}),(0,b.jsx)("input",{value:o,onChange:a=>p(a.target.value),placeholder:"e.g. Crypto Team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,b.jsx)("input",{value:t,onChange:a=>{r(!0),h(a.target.value)},placeholder:"e.g. my-team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config."})]}),(0,b.jsxs)("label",{className:"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:i,onChange:a=>j(a.target.checked)}),"Install cron jobs from this recipe"]}),l?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:l}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:m,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:k||!t.trim(),onClick:n,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:k?"Creating…":"Create team"})]})]})})})]}),document.body):null}function k({open:a,recipeId:c,recipeName:d,agentId:g,setAgentId:h,agentName:i,setAgentName:j,existingRecipeIds:k,existingAgentIds:l,busy:m,error:n,onClose:o,onConfirm:p}){let[q,r]=(0,e.useState)(!1),[s,t]=(0,e.useState)({state:"empty"}),u=(0,e.useMemo)(()=>String(i??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[i]),v=q?g:u;return((0,e.useEffect)(()=>{a&&(q||h(u))},[u,a,q]),(0,e.useEffect)(()=>{a&&(r(!1),t({state:"empty"}),j(""),h(""))},[a]),(0,e.useEffect)(()=>{if(!a)return;let b=String(v??"").trim();if(!b)return void t({state:"empty"});if(k.includes(b))return void t({state:"taken",reason:"recipe-id-collision"});if(l.includes(b))return void t({state:"taken",reason:"agent-exists"});t({state:"available"});let c=setTimeout(()=>{(async()=>{t({state:"checking"});try{let a=await fetch(`/api/ids/check?kind=agent&id=${encodeURIComponent(b)}`,{cache:"no-store"}),c=await a.json();if(!a.ok||!c.ok)throw Error(String(c.error??"Failed to check id"));c.available?t({state:"available"}):t({state:"taken",reason:c.reason})}catch{t({state:"available"})}})()},250);return()=>clearTimeout(c)},[v,a,k,l]),a)?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:o}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create agent"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new agent from recipe ",(0,b.jsx)("code",{className:"font-mono",children:c}),d?(0,b.jsxs)(b.Fragment,{children:[" ","(",(0,b.jsx)("span",{className:"font-medium",children:d}),")"]}):null,"."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent name"}),(0,b.jsx)("input",{value:i,onChange:a=>j(a.target.value),placeholder:"e.g. Crypto Onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent id"}),(0,b.jsx)("input",{value:v,onChange:a=>{r(!0),h(a.target.value)},placeholder:"e.g. crypto-onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] "+("available"===s.state?"border-emerald-400/50":"taken"===s.state?"border-red-400/60":"border-white/10")}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"taken"===s.state?"That id is already taken.":"available"===s.state?"Id is available.":"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config."})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Name (optional)"}),(0,b.jsx)("input",{value:i,onChange:a=>j(a.target.value),placeholder:"e.g. My Agent",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"})]}),n?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:n}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:o,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:m||!v.trim()||"taken"===s.state||"checking"===s.state,onClick:p,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:m?"Creating…":"Create agent"})]})]})})})]}),document.body):null}function l({open:a,recipeId:c,onClose:d,onConfirm:e,busy:g,error:h}){return a?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:d}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete recipe"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete recipe ",(0,b.jsx)("code",{className:"font-mono",children:c}),"? This removes the markdown file from your workspace."]}),h?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:h}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:d,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:g,onClick:e,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:g?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function m({title:a,items:d,onDelete:e,onCreateTeam:f,onCreateAgent:g,installedAgentIds:h}){return(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:a}),0===d.length?(0,b.jsx)("div",{className:"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]",children:"None yet."}):(0,b.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:d.map(a=>{let d="agent"===a.kind&&h.includes(a.id),i=d?`/agents/${encodeURIComponent(a.id)}`:`/recipes/${encodeURIComponent(a.id)}`,j=d?"Edit agent":"builtin"===a.source?"View recipe":"Edit recipe";return(0,b.jsxs)("div",{className:"ck-glass flex flex-col gap-3 px-4 py-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words",children:a.name}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("span",{className:"font-mono",children:a.id})," • ",a.kind," • ",a.source]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:["team"===a.kind&&f?(0,b.jsx)("button",{type:"button",onClick:()=>f(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create team"}):null,"agent"===a.kind&&g?(0,b.jsx)("button",{type:"button",onClick:()=>g(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create agent"}):null,(0,b.jsx)(c.default,{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",href:i,children:j}),e?(0,b.jsx)("button",{type:"button",onClick:()=>e(a.id),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Delete"}):null]})]},`${a.source}:${a.id}`)})})]})}function n({builtin:a,customTeamRecipes:c,customAgentRecipes:f,installedAgentIds:g}){let n=(0,i.useToast)(),[o,p]=(0,e.useState)(!1),[q,r]=(0,e.useState)(1),[s,t]=(0,e.useState)(""),u=(0,d.useRouter)(),[v,w]=(0,e.useState)(!1),[x,y]=(0,e.useState)(""),[z,A]=(0,e.useState)(!1),[B,C]=(0,e.useState)(null),[D,E]=(0,e.useState)(!1),[F,G]=(0,e.useState)(null),[H,I]=(0,e.useState)(""),[J,K]=(0,e.useState)(!0),[L,M]=(0,e.useState)(!1),[N,O]=(0,e.useState)(null),[P,Q]=(0,e.useState)(!1),[R,S]=(0,e.useState)(null),[T,U]=(0,e.useState)(""),[V,W]=(0,e.useState)(""),[X,Y]=(0,e.useState)(!1),[Z,$]=(0,e.useState)(null),_=a=>{y(a),C(null),w(!0)},aa=a=>{G(a),I(""),K(!0),O(null),E(!0)},ab=a=>{S(a),U(""),W(""),$(null),Q(!0)};async function ac(){A(!0),C(null);try{let a=await fetch("/api/recipes/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:x})}),b=await a.json();if(!a.ok||!b.ok){let c=String(b.error||"Delete failed");if(409===a.status)return void C(c);throw Error(c)}n.push({kind:"success",message:`Deleted recipe: ${x}`}),w(!1),window.location.reload()}catch(a){n.push({kind:"error",message:a instanceof Error?a.message:String(a)})}finally{A(!1)}}async function ad(a){let b=a?.timeoutMs??3e4,c=Date.now();for(;Date.now()-c<b;){try{if((await fetch("/healthz",{cache:"no-store"})).ok)return!0}catch{}await new Promise(a=>setTimeout(a,500))}return!1}async function ae(a,b){let c=b?.timeoutMs??3e4,d=Date.now();for(;Date.now()-d<c;){try{let[b,c]=await Promise.all([fetch("/api/recipes",{cache:"no-store"}),fetch(`/api/teams/meta?teamId=${encodeURIComponent(a)}`,{cache:"no-store"})]),d=await b.json(),e=(Array.isArray(d.recipes)?d.recipes:[]).some(b=>String(b.id??"")===a&&"team"===String(b.kind??"")),f=await c.json(),g=!!(c.ok&&f.ok&&!f.missing);if(e&&g)return!0}catch{}await new Promise(a=>setTimeout(a,500))}return!1}async function af(){if(!F)return;let a=H.trim();if(!a)return void O("Team id is required.");if(a===F.id)return void O(`Team id cannot be the same as the recipe id (${F.id}). Choose a new team id.`);M(!0),O(null),E(!1),p(!0),r(1),t("");let b=null;try{let c=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"team",recipeId:F.id,teamId:a,applyConfig:!0,overwrite:!1,cronInstallChoice:J?"yes":"no"})}),d=await c.json();if(!c.ok||!d.ok)throw Error(String(d.error||"Create team failed"));r(2),b=setTimeout(()=>{r(a=>a<3?3:a)},2e4);let e="string"==typeof d.stderr?d.stderr:"";if(e.trim()&&t(e.trim()),/Failed to start CLI:/i.test(e)||/\bError: /i.test(e))throw Error(e.trim()||"Scaffold failed");if(/Restart required:/i.test(e)){r(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ad({timeoutMs:6e4})}await ae(a,{timeoutMs:6e4}),b&&clearTimeout(b),n.push({kind:"success",message:`Created team: ${a}`}),E(!1),u.push(`/teams/${encodeURIComponent(a)}`),setTimeout(()=>p(!1),500)}catch(c){b&&clearTimeout(b),p(!1);let a=c instanceof Error?c.message:String(c);O(a),n.push({kind:"error",message:a})}finally{M(!1)}}async function ag(){if(!R)return;let a=T.trim();if(!a)return void $("Agent id is required.");if(a===R.id)return void $(`Agent id cannot be the same as the recipe id (${R.id}). Choose a new agent id.`);Y(!0),$(null),Q(!1),p(!0),r(1),t("");let b=null;try{let c=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"agent",recipeId:R.id,agentId:a,name:V.trim()||void 0,applyConfig:!0,overwrite:!1})}),d=await c.json();if(!c.ok||!d.ok)throw Error(String(d.error||"Create agent failed"));r(2),b=setTimeout(()=>{r(a=>a<3?3:a)},2e4);let e="string"==typeof d.stderr?d.stderr:"";if(e.trim()&&t(e.trim()),/Failed to start CLI:/i.test(e)||/\bError: /i.test(e))throw Error(e.trim()||"Scaffold failed");if(/Restart required:/i.test(e)){r(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ad({timeoutMs:6e4})}b&&clearTimeout(b),n.push({kind:"success",message:`Created agent: ${a}`}),Q(!1),u.push(`/agents/${encodeURIComponent(a)}`),setTimeout(()=>p(!1),500)}catch(c){b&&clearTimeout(b),p(!1);let a=c instanceof Error?c.message:String(c);$(a),n.push({kind:"error",message:a})}finally{Y(!1)}}return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(h,{open:o,step:q,onDismiss:()=>{p(!1)}}),(0,b.jsxs)("div",{className:"mt-8 space-y-10",children:[(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Custom recipes"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Workspace recipes (editable) — stored under ",(0,b.jsx)("code",{className:"font-mono",children:"~/.openclaw/workspace/recipes/"}),"."]}),(0,b.jsxs)("div",{className:"mt-4 space-y-8",children:[(0,b.jsx)(m,{title:`Teams (${c.length})`,items:c,onDelete:_,onCreateTeam:aa,installedAgentIds:g}),(0,b.jsx)(m,{title:`Agents (${f.length})`,items:f,onDelete:_,onCreateAgent:ab,installedAgentIds:g})]})]}),(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Builtin recipes"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"Bundled recipes shipped with the plugin."}),(0,b.jsx)("div",{className:"mt-4",children:(0,b.jsx)(m,{title:`All (${a.length})`,items:a,onCreateTeam:aa,onCreateAgent:ab,installedAgentIds:g})})]})]}),(0,b.jsx)(l,{open:v,recipeId:x,busy:z,error:B,onClose:()=>w(!1),onConfirm:ac}),(0,b.jsx)(j,{open:D,recipeId:F?.id??"",recipeName:F?.name??"",teamId:H,setTeamId:I,installCron:J,setInstallCron:K,busy:L,error:N,onClose:()=>E(!1),onConfirm:af}),(0,b.jsx)(k,{open:P,recipeId:R?.id??"",recipeName:R?.name??"",agentId:T,setAgentId:U,agentName:V,setAgentName:W,existingRecipeIds:[...a,...c,...f].map(a=>a.id),existingAgentIds:g,busy:X,error:Z,onClose:()=>Q(!1),onConfirm:ag})]})}a.s(["default",()=>n],55408)}];
|
|
1
|
+
module.exports=[55408,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(50944),e=a.i(72131),f=a.i(35112);let g={1:"Ordering team…",2:"Cooking up agents…",3:"Serving them up hot…"};function h({open:a,step:c,onDismiss:d}){return a?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none"}),d?(0,b.jsx)("button",{type:"button",onClick:a=>{a.preventDefault(),a.stopPropagation(),d()},className:"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-glass-strong)]","aria-label":"Dismiss loading overlay",title:"Dismiss",children:"Esc"}):null,(0,b.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,b.jsxs)("div",{className:"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-2xl font-semibold text-[color:var(--ck-text-primary)]",children:"Claw Kitchen"}),(0,b.jsx)("div",{className:"mt-3 text-base text-[color:var(--ck-text-secondary)]",children:"Hang tight — we’re updating your OpenClaw install."}),(0,b.jsx)("div",{className:"mt-8 space-y-4 text-base",children:[1,2,3].map(a=>{let d=a===c,e=a<c;return(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)("div",{className:"h-4 w-4 rounded-full "+(e?"bg-emerald-400":d?"bg-[var(--ck-accent-red)] animate-pulse":"bg-white/20")}),(0,b.jsx)("div",{className:e?"text-[color:var(--ck-text-secondary)] line-through":"text-[color:var(--ck-text-primary)]",children:g[a]})]},a)})})]})})]}),document.body):null}var i=a.i(61889);function j({open:a,recipeId:c,recipeName:d,teamId:g,setTeamId:h,installCron:i,setInstallCron:j,busy:k,error:l,onClose:m,onConfirm:n}){let[o,p]=(0,e.useState)(""),[q,r]=(0,e.useState)(!1),s=(0,e.useMemo)(()=>String(o??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[o]),t=q?g:s;return((0,e.useEffect)(()=>{a&&(q||h(s))},[s,a,q]),(0,e.useEffect)(()=>{a&&(r(!1),p(""),h(""))},[a]),a)?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:m}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create team"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new team from recipe ",(0,b.jsx)("code",{className:"font-mono",children:c}),d?(0,b.jsxs)(b.Fragment,{children:[" ","(",(0,b.jsx)("span",{className:"font-medium",children:d}),")"]}):null,"."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team name"}),(0,b.jsx)("input",{value:o,onChange:a=>p(a.target.value),placeholder:"e.g. Crypto Team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,b.jsx)("input",{value:t,onChange:a=>{r(!0),h(a.target.value)},placeholder:"e.g. my-team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config."})]}),(0,b.jsxs)("label",{className:"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:i,onChange:a=>j(a.target.checked)}),"Install cron jobs from this recipe"]}),l?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:l}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:m,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:k||!t.trim(),onClick:n,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:k?"Creating…":"Create team"})]})]})})})]}),document.body):null}function k({open:a,recipeId:c,recipeName:d,agentId:g,setAgentId:h,agentName:i,setAgentName:j,existingRecipeIds:k,existingAgentIds:l,busy:m,error:n,onClose:o,onConfirm:p}){let[q,r]=(0,e.useState)(!1),[s,t]=(0,e.useState)({state:"empty"}),u=(0,e.useMemo)(()=>String(i??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[i]),v=q?g:u;return((0,e.useEffect)(()=>{a&&(q||h(u))},[u,a,q]),(0,e.useEffect)(()=>{a&&(r(!1),t({state:"empty"}),j(""),h(""))},[a]),(0,e.useEffect)(()=>{if(!a)return;let b=String(v??"").trim();if(!b)return void t({state:"empty"});if(k.includes(b))return void t({state:"taken",reason:"recipe-id-collision"});if(l.includes(b))return void t({state:"taken",reason:"agent-exists"});t({state:"available"});let c=setTimeout(()=>{(async()=>{t({state:"checking"});try{let a=await fetch(`/api/ids/check?kind=agent&id=${encodeURIComponent(b)}`,{cache:"no-store"}),c=await a.json();if(!a.ok||!c.ok)throw Error(String(c.error??"Failed to check id"));c.available?t({state:"available"}):t({state:"taken",reason:c.reason})}catch{t({state:"available"})}})()},250);return()=>clearTimeout(c)},[v,a,k,l]),a)?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:o}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create agent"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new agent from recipe ",(0,b.jsx)("code",{className:"font-mono",children:c}),d?(0,b.jsxs)(b.Fragment,{children:[" ","(",(0,b.jsx)("span",{className:"font-medium",children:d}),")"]}):null,"."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent name"}),(0,b.jsx)("input",{value:i,onChange:a=>j(a.target.value),placeholder:"e.g. Crypto Onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent id"}),(0,b.jsx)("input",{value:v,onChange:a=>{r(!0),h(a.target.value)},placeholder:"e.g. crypto-onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] "+("available"===s.state?"border-emerald-400/50":"taken"===s.state?"border-red-400/60":"border-white/10")}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"taken"===s.state?"That id is already taken.":"available"===s.state?"Id is available.":"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config."})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Name (optional)"}),(0,b.jsx)("input",{value:i,onChange:a=>j(a.target.value),placeholder:"e.g. My Agent",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"})]}),n?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:n}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:o,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:m||!v.trim()||"taken"===s.state||"checking"===s.state,onClick:p,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:m?"Creating…":"Create agent"})]})]})})})]}),document.body):null}function l({open:a,recipeId:c,onClose:d,onConfirm:e,busy:g,error:h}){return a?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:d}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete recipe"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete recipe ",(0,b.jsx)("code",{className:"font-mono",children:c}),"? This removes the markdown file from your workspace."]}),h?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:h}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:d,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:g,onClick:e,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:g?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function m({title:a,items:d,onDelete:e,onCreateTeam:f,onCreateAgent:g,installedAgentIds:h}){return(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:a}),0===d.length?(0,b.jsx)("div",{className:"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]",children:"None yet."}):(0,b.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:d.map(a=>{let d="agent"===a.kind&&h.includes(a.id),i=d?`/agents/${encodeURIComponent(a.id)}`:`/recipes/${encodeURIComponent(a.id)}`,j=d?"Edit agent":"builtin"===a.source?"View recipe":"Edit recipe";return(0,b.jsxs)("div",{className:"ck-glass flex flex-col gap-3 px-4 py-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words",children:a.name}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("span",{className:"font-mono",children:a.id})," • ",a.kind," • ",a.source]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:["team"===a.kind&&f?(0,b.jsx)("button",{type:"button",onClick:()=>f(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create team"}):null,"agent"===a.kind&&g?(0,b.jsx)("button",{type:"button",onClick:()=>g(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create agent"}):null,(0,b.jsx)(c.default,{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",href:i,children:j}),e?(0,b.jsx)("button",{type:"button",onClick:()=>e(a.id),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Delete"}):null]})]},`${a.source}:${a.id}`)})})]})}function n({builtin:a,customTeamRecipes:c,customAgentRecipes:f,installedAgentIds:g}){let n=(0,i.useToast)(),[o,p]=(0,e.useState)(!1),[q,r]=(0,e.useState)(1),s=(0,d.useRouter)(),[t,u]=(0,e.useState)(!1),[v,w]=(0,e.useState)(""),[x,y]=(0,e.useState)(!1),[z,A]=(0,e.useState)(null),[B,C]=(0,e.useState)(!1),[D,E]=(0,e.useState)(null),[F,G]=(0,e.useState)(""),[H,I]=(0,e.useState)(!0),[J,K]=(0,e.useState)(!1),[L,M]=(0,e.useState)(null),[N,O]=(0,e.useState)(!1),[P,Q]=(0,e.useState)(null),[R,S]=(0,e.useState)(""),[T,U]=(0,e.useState)(""),[V,W]=(0,e.useState)(!1),[X,Y]=(0,e.useState)(null),Z=a=>{w(a),A(null),u(!0)},$=a=>{E(a),G(""),I(!0),M(null),C(!0)},_=a=>{Q(a),S(""),U(""),Y(null),O(!0)};async function aa(){y(!0),A(null);try{let a=await fetch("/api/recipes/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:v})}),b=await a.json();if(!a.ok||!b.ok){let c=String(b.error||"Delete failed");if(409===a.status)return void A(c);throw Error(c)}n.push({kind:"success",message:`Deleted recipe: ${v}`}),u(!1),window.location.reload()}catch(a){n.push({kind:"error",message:a instanceof Error?a.message:String(a)})}finally{y(!1)}}async function ab(a){let b=a?.timeoutMs??3e4,c=Date.now();for(;Date.now()-c<b;){try{if((await fetch("/healthz",{cache:"no-store"})).ok)return!0}catch{}await new Promise(a=>setTimeout(a,500))}return!1}async function ac(a,b){let c=b?.timeoutMs??3e4,d=Date.now();for(;Date.now()-d<c;){try{let[b,c]=await Promise.all([fetch("/api/recipes",{cache:"no-store"}),fetch(`/api/teams/meta?teamId=${encodeURIComponent(a)}`,{cache:"no-store"})]),d=await b.json(),e=(Array.isArray(d.recipes)?d.recipes:[]).some(b=>String(b.id??"")===a&&"team"===String(b.kind??"")),f=await c.json(),g=!!(c.ok&&f.ok&&!f.missing);if(e&&g)return!0}catch{}await new Promise(a=>setTimeout(a,500))}return!1}async function ad(){if(!D)return;let a=F.trim();if(!a)return void M("Team id is required.");if(a===D.id)return void M(`Team id cannot be the same as the recipe id (${D.id}). Choose a new team id.`);K(!0),M(null),C(!1),p(!0),r(1);let b=null;try{let c=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"team",recipeId:D.id,teamId:a,applyConfig:!0,overwrite:!1,cronInstallChoice:H?"yes":"no"})}),d=await c.json();if(!c.ok||!d.ok)throw Error(String(d.error||"Create team failed"));r(2),b=setTimeout(()=>{r(a=>a<3?3:a)},2e4);let e="string"==typeof d.stderr?d.stderr:"";if(/Failed to start CLI:/i.test(e)||/\bError: /i.test(e))throw Error(e.trim()||"Scaffold failed");if(/Restart required:/i.test(e)){r(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ab({timeoutMs:6e4})}await ac(a,{timeoutMs:6e4}),b&&clearTimeout(b),n.push({kind:"success",message:`Created team: ${a}`}),C(!1),s.push(`/teams/${encodeURIComponent(a)}`),setTimeout(()=>p(!1),500)}catch(c){b&&clearTimeout(b),p(!1);let a=c instanceof Error?c.message:String(c);M(a),n.push({kind:"error",message:a})}finally{K(!1)}}async function ae(){if(!P)return;let a=R.trim();if(!a)return void Y("Agent id is required.");if(a===P.id)return void Y(`Agent id cannot be the same as the recipe id (${P.id}). Choose a new agent id.`);W(!0),Y(null),O(!1),p(!0),r(1);let b=null;try{let c=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"agent",recipeId:P.id,agentId:a,name:T.trim()||void 0,applyConfig:!0,overwrite:!1})}),d=await c.json();if(!c.ok||!d.ok)throw Error(String(d.error||"Create agent failed"));r(2),b=setTimeout(()=>{r(a=>a<3?3:a)},2e4);let e="string"==typeof d.stderr?d.stderr:"";if(/Failed to start CLI:/i.test(e)||/\bError: /i.test(e))throw Error(e.trim()||"Scaffold failed");if(/Restart required:/i.test(e)){r(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ab({timeoutMs:6e4})}b&&clearTimeout(b),n.push({kind:"success",message:`Created agent: ${a}`}),O(!1),s.push(`/agents/${encodeURIComponent(a)}`),setTimeout(()=>p(!1),500)}catch(c){b&&clearTimeout(b),p(!1);let a=c instanceof Error?c.message:String(c);Y(a),n.push({kind:"error",message:a})}finally{W(!1)}}return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(h,{open:o,step:q,onDismiss:()=>{p(!1)}}),(0,b.jsxs)("div",{className:"mt-8 space-y-10",children:[(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Custom recipes"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Workspace recipes (editable) — stored under ",(0,b.jsx)("code",{className:"font-mono",children:"~/.openclaw/workspace/recipes/"}),"."]}),(0,b.jsxs)("div",{className:"mt-4 space-y-8",children:[(0,b.jsx)(m,{title:`Teams (${c.length})`,items:c,onDelete:Z,onCreateTeam:$,installedAgentIds:g}),(0,b.jsx)(m,{title:`Agents (${f.length})`,items:f,onDelete:Z,onCreateAgent:_,installedAgentIds:g})]})]}),(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Builtin recipes"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"Bundled recipes shipped with the plugin."}),(0,b.jsx)("div",{className:"mt-4",children:(0,b.jsx)(m,{title:`All (${a.length})`,items:a,onCreateTeam:$,onCreateAgent:_,installedAgentIds:g})})]})]}),(0,b.jsx)(l,{open:t,recipeId:v,busy:x,error:z,onClose:()=>u(!1),onConfirm:aa}),(0,b.jsx)(j,{open:B,recipeId:D?.id??"",recipeName:D?.name??"",teamId:F,setTeamId:G,installCron:H,setInstallCron:I,busy:J,error:L,onClose:()=>C(!1),onConfirm:ad}),(0,b.jsx)(k,{open:N,recipeId:P?.id??"",recipeName:P?.name??"",agentId:R,setAgentId:S,agentName:T,setAgentName:U,existingRecipeIds:[...a,...c,...f].map(a=>a.id),existingAgentIds:g,busy:V,error:X,onClose:()=>O(!1),onConfirm:ae})]})}a.s(["default",()=>n],55408)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_app_recipes_recipes-client_tsx_8ed3ca94._.js.map
|