@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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/recipes/recipes-client.tsx","../../../../src/components/ScaffoldOverlay.tsx","../../../../src/app/recipes/CreateTeamModal.tsx","../../../../src/app/recipes/CreateAgentModal.tsx","../../../../src/app/recipes/DeleteRecipeModal.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useState } from \"react\";\nimport { ScaffoldOverlay, type ScaffoldOverlayStep } from \"@/components/ScaffoldOverlay\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { CreateTeamModal } from \"./CreateTeamModal\";\nimport { CreateAgentModal } from \"./CreateAgentModal\";\nimport { DeleteRecipeModal } from \"./DeleteRecipeModal\";\n\ntype Recipe = {\n id: string;\n name: string;\n kind: \"agent\" | \"team\";\n source: \"builtin\" | \"workspace\";\n};\n\nfunction RecipesSection({\n title,\n items,\n onDelete,\n onCreateTeam,\n onCreateAgent,\n installedAgentIds,\n}: {\n title: string;\n items: Recipe[];\n onDelete?: (id: string) => void;\n onCreateTeam?: (r: Recipe) => void;\n onCreateAgent?: (r: Recipe) => void;\n installedAgentIds: string[];\n}) {\n return (\n <section>\n <h2 className=\"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">{title}</h2>\n\n {items.length === 0 ? (\n <div className=\"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]\">None yet.</div>\n ) : (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {items.map((r) => {\n const isInstalledAgent = r.kind === \"agent\" && installedAgentIds.includes(r.id);\n const editHref = isInstalledAgent\n ? `/agents/${encodeURIComponent(r.id)}`\n : `/recipes/${encodeURIComponent(r.id)}`;\n const editLabel = isInstalledAgent\n ? \"Edit agent\"\n : r.source === \"builtin\"\n ? \"View recipe\"\n : \"Edit recipe\";\n\n return (\n <div\n key={`${r.source}:${r.id}`}\n className=\"ck-glass flex flex-col gap-3 px-4 py-3\"\n >\n <div>\n <div className=\"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words\">\n {r.name}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{r.id}</span> • {r.kind} • {r.source}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {r.kind === \"team\" && onCreateTeam ? (\n <button\n type=\"button\"\n onClick={() => onCreateTeam(r)}\n 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\"\n >\n Create team\n </button>\n ) : null}\n\n {r.kind === \"agent\" && onCreateAgent ? (\n <button\n type=\"button\"\n onClick={() => onCreateAgent(r)}\n 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\"\n >\n Create agent\n </button>\n ) : null}\n\n <Link\n 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\"\n href={editHref}\n >\n {editLabel}\n </Link>\n\n {onDelete ? (\n <button\n type=\"button\"\n onClick={() => onDelete(r.id)}\n 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\"\n >\n Delete\n </button>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </section>\n );\n}\n\nexport default function RecipesClient({\n builtin,\n customTeamRecipes,\n customAgentRecipes,\n installedAgentIds,\n}: {\n builtin: Recipe[];\n customTeamRecipes: Recipe[];\n customAgentRecipes: Recipe[];\n installedAgentIds: string[];\n}) {\n const toast = useToast();\n\n const [overlayOpen, setOverlayOpen] = useState(false);\n const [overlayStep, setOverlayStep] = useState<ScaffoldOverlayStep>(1);\n const [overlayDetails, setOverlayDetails] = useState<string>(\"\");\n const router = useRouter();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [busy, setBusy] = useState(false);\n const [modalError, setModalError] = useState<string | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n const [createRecipe, setCreateRecipe] = useState<Recipe | null>(null);\n const [createTeamId, setCreateTeamId] = useState<string>(\"\");\n const [installCron, setInstallCron] = useState(true);\n const [createBusy, setCreateBusy] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const [createAgentOpen, setCreateAgentOpen] = useState(false);\n const [createAgentRecipe, setCreateAgentRecipe] = useState<Recipe | null>(null);\n const [createAgentId, setCreateAgentId] = useState<string>(\"\");\n const [createAgentName, setCreateAgentName] = useState<string>(\"\");\n const [createAgentBusy, setCreateAgentBusy] = useState(false);\n const [createAgentError, setCreateAgentError] = useState<string | null>(null);\n\n const onDelete = (id: string) => {\n setDeleteId(id);\n setModalError(null);\n setDeleteOpen(true);\n };\n\n const onCreateTeam = (r: Recipe) => {\n setCreateRecipe(r);\n setCreateTeamId(\"\");\n setInstallCron(true);\n setCreateError(null);\n setCreateOpen(true);\n };\n\n const onCreateAgent = (r: Recipe) => {\n setCreateAgentRecipe(r);\n setCreateAgentId(\"\");\n setCreateAgentName(\"\");\n setCreateAgentError(null);\n setCreateAgentOpen(true);\n };\n\n async function confirmDelete() {\n setBusy(true);\n setModalError(null);\n try {\n const res = await fetch(\"/api/recipes/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) {\n const msg = String(json.error || \"Delete failed\");\n if (res.status === 409) {\n setModalError(msg);\n return;\n }\n throw new Error(msg);\n }\n toast.push({ kind: \"success\", message: `Deleted recipe: ${deleteId}` });\n setDeleteOpen(false);\n window.location.reload();\n } catch (e: unknown) {\n toast.push({ kind: \"error\", message: e instanceof Error ? e.message : String(e) });\n } finally {\n setBusy(false);\n }\n }\n\n async function waitForKitchenHealthy(opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n try {\n const res = await fetch(\"/healthz\", { cache: \"no-store\" });\n if (res.ok) return true;\n } catch {\n // ignore\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n\n return false;\n }\n\n async function waitForTeamPageReady(teamId: string, opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n try {\n const [recipesRes, metaRes] = await Promise.all([\n fetch(\"/api/recipes\", { cache: \"no-store\" }),\n fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n\n const recipesJson = (await recipesRes.json()) as { recipes?: Array<{ id?: unknown; kind?: unknown }> };\n const list = Array.isArray(recipesJson.recipes) ? recipesJson.recipes : [];\n const hasRecipe = list.some((r) => String(r.id ?? \"\") === teamId && String(r.kind ?? \"\") === \"team\");\n\n const metaJson = (await metaRes.json()) as { ok?: boolean; missing?: boolean };\n const hasMeta = Boolean(metaRes.ok && metaJson.ok && !metaJson.missing);\n\n if (hasRecipe && hasMeta) return true;\n } catch {\n // ignore\n }\n\n await new Promise((r) => setTimeout(r, 500));\n }\n\n return false;\n }\n\n async function confirmCreateTeam() {\n const recipe = createRecipe;\n if (!recipe) return;\n\n const t = createTeamId.trim();\n if (!t) {\n setCreateError(\"Team id is required.\");\n return;\n }\n if (t === recipe.id) {\n setCreateError(`Team id cannot be the same as the recipe id (${recipe.id}). Choose a new team id.`);\n return;\n }\n\n setCreateBusy(true);\n setCreateError(null);\n\n // Hide the modal immediately so the overlay is the only visible UI during scaffold.\n setCreateOpen(false);\n\n setOverlayOpen(true);\n setOverlayStep(1);\n setOverlayDetails(\"\");\n\n let serveTimer: ReturnType<typeof setTimeout> | null = null;\n\n try {\n const res = await fetch(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: recipe.id,\n teamId: t,\n applyConfig: true,\n overwrite: false,\n cronInstallChoice: installCron ? \"yes\" : \"no\",\n }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(String(json.error || \"Create team failed\"));\n\n setOverlayStep(2);\n\n // If scaffolding takes a while, switch copy to \"Serving...\" so users know we're in the\n // apply/restart phase even if the CLI didn't print the restart hint yet.\n serveTimer = setTimeout(() => {\n setOverlayStep((prev) => (prev < 3 ? 3 : prev));\n }, 20_000);\n\n const stderr = typeof json.stderr === \"string\" ? json.stderr : \"\";\n if (stderr.trim()) setOverlayDetails(stderr.trim());\n\n // Some CLI failures currently still surface as { ok: true, stderr: \"...Error: ...\" }.\n // Treat those as hard failures so we don't navigate into a broken team page.\n if (/Failed to start CLI:/i.test(stderr) || /\\bError: /i.test(stderr)) {\n throw new Error(stderr.trim() || \"Scaffold failed\");\n }\n\n // If scaffolding changed config, the gateway may need a restart. During restart, new pages\n // will throw transient errors (RSC/markdown fetches/etc.), so keep the overlay up.\n if (/Restart required:/i.test(stderr)) {\n setOverlayStep(3);\n try {\n await fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // best-effort\n }\n await waitForKitchenHealthy({ timeoutMs: 60_000 });\n }\n\n // Also wait until the new team's recipe+provenance exist before navigating.\n // This avoids the destination page throwing \"raw markdown\" load errors.\n await waitForTeamPageReady(t, { timeoutMs: 60_000 });\n\n if (serveTimer) clearTimeout(serveTimer);\n\n toast.push({ kind: \"success\", message: `Created team: ${t}` });\n setCreateOpen(false);\n\n // Navigate only after restart/readiness to avoid the ugly error+reload UX.\n router.push(`/teams/${encodeURIComponent(t)}`);\n\n // Give the next page a beat to mount before removing the overlay.\n setTimeout(() => setOverlayOpen(false), 500);\n } catch (e: unknown) {\n if (serveTimer) clearTimeout(serveTimer);\n setOverlayOpen(false);\n const msg = e instanceof Error ? e.message : String(e);\n setCreateError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setCreateBusy(false);\n }\n }\n\n async function confirmCreateAgent() {\n const recipe = createAgentRecipe;\n if (!recipe) return;\n\n const a = createAgentId.trim();\n if (!a) {\n setCreateAgentError(\"Agent id is required.\");\n return;\n }\n if (a === recipe.id) {\n setCreateAgentError(`Agent id cannot be the same as the recipe id (${recipe.id}). Choose a new agent id.`);\n return;\n }\n\n setCreateAgentBusy(true);\n setCreateAgentError(null);\n\n setCreateAgentOpen(false);\n\n setOverlayOpen(true);\n setOverlayStep(1);\n setOverlayDetails(\"\");\n\n let serveTimer: ReturnType<typeof setTimeout> | null = null;\n\n try {\n const res = await fetch(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"agent\",\n recipeId: recipe.id,\n agentId: a,\n name: createAgentName.trim() || undefined,\n applyConfig: true,\n overwrite: false,\n }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(String(json.error || \"Create agent failed\"));\n\n setOverlayStep(2);\n\n serveTimer = setTimeout(() => {\n setOverlayStep((prev) => (prev < 3 ? 3 : prev));\n }, 20_000);\n\n const stderr = typeof json.stderr === \"string\" ? json.stderr : \"\";\n if (stderr.trim()) setOverlayDetails(stderr.trim());\n\n if (/Failed to start CLI:/i.test(stderr) || /\\bError: /i.test(stderr)) {\n throw new Error(stderr.trim() || \"Scaffold failed\");\n }\n\n if (/Restart required:/i.test(stderr)) {\n setOverlayStep(3);\n try {\n await fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // best-effort\n }\n await waitForKitchenHealthy({ timeoutMs: 60_000 });\n }\n\n if (serveTimer) clearTimeout(serveTimer);\n\n toast.push({ kind: \"success\", message: `Created agent: ${a}` });\n setCreateAgentOpen(false);\n\n router.push(`/agents/${encodeURIComponent(a)}`);\n setTimeout(() => setOverlayOpen(false), 500);\n } catch (e: unknown) {\n if (serveTimer) clearTimeout(serveTimer);\n setOverlayOpen(false);\n const msg = e instanceof Error ? e.message : String(e);\n setCreateAgentError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setCreateAgentBusy(false);\n }\n }\n\n return (\n <>\n <ScaffoldOverlay\n open={overlayOpen}\n step={overlayStep}\n onDismiss={() => {\n setOverlayOpen(false);\n }}\n />\n <div className=\"mt-8 space-y-10\">\n <section>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Custom recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n Workspace recipes (editable) — stored under <code className=\"font-mono\">~/.openclaw/workspace/recipes/</code>.\n </p>\n\n <div className=\"mt-4 space-y-8\">\n <RecipesSection\n title={`Teams (${customTeamRecipes.length})`}\n items={customTeamRecipes}\n onDelete={onDelete}\n onCreateTeam={onCreateTeam}\n installedAgentIds={installedAgentIds}\n />\n <RecipesSection\n title={`Agents (${customAgentRecipes.length})`}\n items={customAgentRecipes}\n onDelete={onDelete}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Builtin recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">Bundled recipes shipped with the plugin.</p>\n\n <div className=\"mt-4\">\n <RecipesSection\n title={`All (${builtin.length})`}\n items={builtin}\n onCreateTeam={onCreateTeam}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n </div>\n\n <DeleteRecipeModal\n open={deleteOpen}\n recipeId={deleteId}\n busy={busy}\n error={modalError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <CreateTeamModal\n open={createOpen}\n recipeId={createRecipe?.id ?? \"\"}\n recipeName={createRecipe?.name ?? \"\"}\n teamId={createTeamId}\n setTeamId={setCreateTeamId}\n installCron={installCron}\n setInstallCron={setInstallCron}\n busy={createBusy}\n error={createError}\n onClose={() => setCreateOpen(false)}\n onConfirm={confirmCreateTeam}\n />\n\n <CreateAgentModal\n open={createAgentOpen}\n recipeId={createAgentRecipe?.id ?? \"\"}\n recipeName={createAgentRecipe?.name ?? \"\"}\n agentId={createAgentId}\n setAgentId={setCreateAgentId}\n agentName={createAgentName}\n setAgentName={setCreateAgentName}\n existingRecipeIds={[...builtin, ...customTeamRecipes, ...customAgentRecipes].map((r) => r.id)}\n existingAgentIds={installedAgentIds}\n busy={createAgentBusy}\n error={createAgentError}\n onClose={() => setCreateAgentOpen(false)}\n onConfirm={confirmCreateAgent}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport type ScaffoldOverlayStep = 1 | 2 | 3;\n\nconst stepLabel: Record<ScaffoldOverlayStep, string> = {\n 1: \"Ordering team…\",\n 2: \"Cooking up agents…\",\n 3: \"Serving them up hot…\",\n};\n\nexport function ScaffoldOverlay({\n open,\n step,\n onDismiss,\n}: {\n open: boolean;\n step: ScaffoldOverlayStep;\n onDismiss?: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n {/* Slightly transparent full-screen overlay so we hide the app while still showing a hint of context. */}\n <div className=\"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none\" />\n\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onDismiss();\n }}\n 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)]\"\n aria-label=\"Dismiss loading overlay\"\n title=\"Dismiss\"\n >\n Esc\n </button>\n ) : null}\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <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)]\">\n <div className=\"text-2xl font-semibold text-[color:var(--ck-text-primary)]\">Claw Kitchen</div>\n <div className=\"mt-3 text-base text-[color:var(--ck-text-secondary)]\">Hang tight — we’re updating your OpenClaw install.</div>\n\n <div className=\"mt-8 space-y-4 text-base\">\n {[1, 2, 3].map((n) => {\n const s = n as ScaffoldOverlayStep;\n const active = s === step;\n const done = s < step;\n return (\n <div key={s} className=\"flex items-center gap-4\">\n <div\n className={\n \"h-4 w-4 rounded-full \" +\n (done\n ? \"bg-emerald-400\"\n : active\n ? \"bg-[var(--ck-accent-red)] animate-pulse\"\n : \"bg-white/20\")\n }\n />\n <div className={done ? \"text-[color:var(--ck-text-secondary)] line-through\" : \"text-[color:var(--ck-text-primary)]\"}>\n {stepLabel[s]}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Details removed — avoid noisy/scrolling stderr in the primary UX. */}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nfunction slugifyId(input: string) {\n return String(input ?? \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/--+/g, \"-\");\n}\n\nexport function CreateTeamModal({\n open,\n recipeId,\n recipeName,\n teamId,\n setTeamId,\n installCron,\n setInstallCron,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n teamId: string;\n setTeamId: (v: string) => void;\n installCron: boolean;\n setInstallCron: (v: boolean) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [teamName, setTeamName] = useState(\"\");\n const [idTouched, setIdTouched] = useState(false);\n\n const derivedId = useMemo(() => slugifyId(teamName), [teamName]);\n const effectiveId = idTouched ? teamId : derivedId;\n\n // Keep parent state in sync so the confirm handler uses the effective id.\n useEffect(() => {\n if (!open) return;\n if (!idTouched) setTeamId(derivedId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [derivedId, open, idTouched]);\n\n // Reset modal-local state when opened.\n useEffect(() => {\n if (!open) return;\n setIdTouched(false);\n setTeamName(\"\");\n setTeamId(\"\");\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\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)]\">Create team</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Create a new team from recipe <code className=\"font-mono\">{recipeId}</code>\n {recipeName ? (\n <>\n {\" \"}(<span className=\"font-medium\">{recipeName}</span>)\n </>\n ) : null}\n .\n </p>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team name</label>\n <input\n value={teamName}\n onChange={(e) => setTeamName(e.target.value)}\n placeholder=\"e.g. Crypto Team\"\n 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 autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setTeamId(e.target.value);\n }}\n placeholder=\"e.g. my-team\"\n 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 />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config.\n </div>\n </div>\n\n <label className=\"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={installCron} onChange={(e) => setInstallCron(e.target.checked)} />\n Install cron jobs from this recipe\n </label>\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 || !effectiveId.trim()}\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 ? \"Creating…\" : \"Create team\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nfunction slugifyId(input: string) {\n return String(input ?? \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/--+/g, \"-\");\n}\n\ntype Availability =\n | { state: \"empty\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string };\n\nexport function CreateAgentModal({\n open,\n recipeId,\n recipeName,\n agentId,\n setAgentId,\n agentName,\n setAgentName,\n existingRecipeIds,\n existingAgentIds,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n agentId: string;\n setAgentId: (v: string) => void;\n agentName: string;\n setAgentName: (v: string) => void;\n existingRecipeIds: string[];\n existingAgentIds: string[];\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [idTouched, setIdTouched] = useState(false);\n const [availability, setAvailability] = useState<Availability>({ state: \"empty\" });\n\n const derivedId = useMemo(() => slugifyId(agentName), [agentName]);\n const effectiveId = idTouched ? agentId : derivedId;\n\n // Keep parent state in sync so the confirm handler uses the effective id.\n useEffect(() => {\n if (!open) return;\n if (!idTouched) setAgentId(derivedId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [derivedId, open, idTouched]);\n\n // Reset modal-local state when opened.\n useEffect(() => {\n if (!open) return;\n setIdTouched(false);\n setAvailability({ state: \"empty\" });\n setAgentName(\"\");\n setAgentId(\"\");\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Check id availability.\n // Fast path: local check (recipes list + agent list already in memory).\n // Slow path: server check for any edge cases.\n useEffect(() => {\n if (!open) return;\n const v = String(effectiveId ?? \"\").trim();\n if (!v) {\n setAvailability({ state: \"empty\" });\n return;\n }\n\n // Local rules (instant)\n if (existingRecipeIds.includes(v)) {\n setAvailability({ state: \"taken\", reason: \"recipe-id-collision\" });\n return;\n }\n if (existingAgentIds.includes(v)) {\n setAvailability({ state: \"taken\", reason: \"agent-exists\" });\n return;\n }\n\n setAvailability({ state: \"available\" });\n\n // Server confirm (debounced)\n const t = setTimeout(() => {\n void (async () => {\n setAvailability({ state: \"checking\" });\n try {\n const res = await fetch(`/api/ids/check?kind=agent&id=${encodeURIComponent(v)}`, { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; available?: boolean; reason?: string };\n if (!res.ok || !json.ok) throw new Error(String((json as { error?: unknown }).error ?? \"Failed to check id\"));\n if (json.available) setAvailability({ state: \"available\" });\n else setAvailability({ state: \"taken\", reason: json.reason });\n } catch {\n setAvailability({ state: \"available\" });\n }\n })();\n }, 250);\n\n return () => clearTimeout(t);\n }, [effectiveId, open, existingRecipeIds, existingAgentIds]);\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)]\">Create agent</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Create a new agent from recipe <code className=\"font-mono\">{recipeId}</code>\n {recipeName ? (\n <>\n {\" \"}(<span className=\"font-medium\">{recipeName}</span>)\n </>\n ) : null}\n .\n </p>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent name</label>\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\n placeholder=\"e.g. Crypto Onchain\"\n 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 autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setAgentId(e.target.value);\n }}\n placeholder=\"e.g. crypto-onchain\"\n className={\n \"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)] \" +\n (availability.state === \"available\"\n ? \"border-emerald-400/50\"\n : availability.state === \"taken\"\n ? \"border-red-400/60\"\n : \"border-white/10\")\n }\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {availability.state === \"taken\"\n ? \"That id is already taken.\"\n : availability.state === \"available\"\n ? \"Id is available.\"\n : \"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config.\"}\n </div>\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Name (optional)</label>\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\n placeholder=\"e.g. My Agent\"\n 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 />\n </div>\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 || !effectiveId.trim() || availability.state === \"taken\" || availability.state === \"checking\"}\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 ? \"Creating…\" : \"Create agent\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function DeleteRecipeModal({\n open,\n recipeId,\n onClose,\n onConfirm,\n busy,\n error,\n}: {\n open: boolean;\n recipeId: 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 recipe</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Delete recipe <code className=\"font-mono\">{recipeId}</code>? This removes the markdown file from your workspace.\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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/recipes/recipes-client.tsx","../../../../src/components/ScaffoldOverlay.tsx","../../../../src/app/recipes/CreateTeamModal.tsx","../../../../src/app/recipes/CreateAgentModal.tsx","../../../../src/app/recipes/DeleteRecipeModal.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useState } from \"react\";\nimport { ScaffoldOverlay, type ScaffoldOverlayStep } from \"@/components/ScaffoldOverlay\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { CreateTeamModal } from \"./CreateTeamModal\";\nimport { CreateAgentModal } from \"./CreateAgentModal\";\nimport { DeleteRecipeModal } from \"./DeleteRecipeModal\";\n\ntype Recipe = {\n id: string;\n name: string;\n kind: \"agent\" | \"team\";\n source: \"builtin\" | \"workspace\";\n};\n\nfunction RecipesSection({\n title,\n items,\n onDelete,\n onCreateTeam,\n onCreateAgent,\n installedAgentIds,\n}: {\n title: string;\n items: Recipe[];\n onDelete?: (id: string) => void;\n onCreateTeam?: (r: Recipe) => void;\n onCreateAgent?: (r: Recipe) => void;\n installedAgentIds: string[];\n}) {\n return (\n <section>\n <h2 className=\"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">{title}</h2>\n\n {items.length === 0 ? (\n <div className=\"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]\">None yet.</div>\n ) : (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {items.map((r) => {\n const isInstalledAgent = r.kind === \"agent\" && installedAgentIds.includes(r.id);\n const editHref = isInstalledAgent\n ? `/agents/${encodeURIComponent(r.id)}`\n : `/recipes/${encodeURIComponent(r.id)}`;\n const editLabel = isInstalledAgent\n ? \"Edit agent\"\n : r.source === \"builtin\"\n ? \"View recipe\"\n : \"Edit recipe\";\n\n return (\n <div\n key={`${r.source}:${r.id}`}\n className=\"ck-glass flex flex-col gap-3 px-4 py-3\"\n >\n <div>\n <div className=\"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words\">\n {r.name}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{r.id}</span> • {r.kind} • {r.source}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {r.kind === \"team\" && onCreateTeam ? (\n <button\n type=\"button\"\n onClick={() => onCreateTeam(r)}\n 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\"\n >\n Create team\n </button>\n ) : null}\n\n {r.kind === \"agent\" && onCreateAgent ? (\n <button\n type=\"button\"\n onClick={() => onCreateAgent(r)}\n 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\"\n >\n Create agent\n </button>\n ) : null}\n\n <Link\n 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\"\n href={editHref}\n >\n {editLabel}\n </Link>\n\n {onDelete ? (\n <button\n type=\"button\"\n onClick={() => onDelete(r.id)}\n 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\"\n >\n Delete\n </button>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </section>\n );\n}\n\nexport default function RecipesClient({\n builtin,\n customTeamRecipes,\n customAgentRecipes,\n installedAgentIds,\n}: {\n builtin: Recipe[];\n customTeamRecipes: Recipe[];\n customAgentRecipes: Recipe[];\n installedAgentIds: string[];\n}) {\n const toast = useToast();\n\n const [overlayOpen, setOverlayOpen] = useState(false);\n const [overlayStep, setOverlayStep] = useState<ScaffoldOverlayStep>(1);\n const router = useRouter();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [busy, setBusy] = useState(false);\n const [modalError, setModalError] = useState<string | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n const [createRecipe, setCreateRecipe] = useState<Recipe | null>(null);\n const [createTeamId, setCreateTeamId] = useState<string>(\"\");\n const [installCron, setInstallCron] = useState(true);\n const [createBusy, setCreateBusy] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const [createAgentOpen, setCreateAgentOpen] = useState(false);\n const [createAgentRecipe, setCreateAgentRecipe] = useState<Recipe | null>(null);\n const [createAgentId, setCreateAgentId] = useState<string>(\"\");\n const [createAgentName, setCreateAgentName] = useState<string>(\"\");\n const [createAgentBusy, setCreateAgentBusy] = useState(false);\n const [createAgentError, setCreateAgentError] = useState<string | null>(null);\n\n const onDelete = (id: string) => {\n setDeleteId(id);\n setModalError(null);\n setDeleteOpen(true);\n };\n\n const onCreateTeam = (r: Recipe) => {\n setCreateRecipe(r);\n setCreateTeamId(\"\");\n setInstallCron(true);\n setCreateError(null);\n setCreateOpen(true);\n };\n\n const onCreateAgent = (r: Recipe) => {\n setCreateAgentRecipe(r);\n setCreateAgentId(\"\");\n setCreateAgentName(\"\");\n setCreateAgentError(null);\n setCreateAgentOpen(true);\n };\n\n async function confirmDelete() {\n setBusy(true);\n setModalError(null);\n try {\n const res = await fetch(\"/api/recipes/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) {\n const msg = String(json.error || \"Delete failed\");\n if (res.status === 409) {\n setModalError(msg);\n return;\n }\n throw new Error(msg);\n }\n toast.push({ kind: \"success\", message: `Deleted recipe: ${deleteId}` });\n setDeleteOpen(false);\n window.location.reload();\n } catch (e: unknown) {\n toast.push({ kind: \"error\", message: e instanceof Error ? e.message : String(e) });\n } finally {\n setBusy(false);\n }\n }\n\n async function waitForKitchenHealthy(opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n try {\n const res = await fetch(\"/healthz\", { cache: \"no-store\" });\n if (res.ok) return true;\n } catch {\n // ignore\n }\n await new Promise((r) => setTimeout(r, 500));\n }\n\n return false;\n }\n\n async function waitForTeamPageReady(teamId: string, opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const started = Date.now();\n\n while (Date.now() - started < timeoutMs) {\n try {\n const [recipesRes, metaRes] = await Promise.all([\n fetch(\"/api/recipes\", { cache: \"no-store\" }),\n fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n\n const recipesJson = (await recipesRes.json()) as { recipes?: Array<{ id?: unknown; kind?: unknown }> };\n const list = Array.isArray(recipesJson.recipes) ? recipesJson.recipes : [];\n const hasRecipe = list.some((r) => String(r.id ?? \"\") === teamId && String(r.kind ?? \"\") === \"team\");\n\n const metaJson = (await metaRes.json()) as { ok?: boolean; missing?: boolean };\n const hasMeta = Boolean(metaRes.ok && metaJson.ok && !metaJson.missing);\n\n if (hasRecipe && hasMeta) return true;\n } catch {\n // ignore\n }\n\n await new Promise((r) => setTimeout(r, 500));\n }\n\n return false;\n }\n\n async function confirmCreateTeam() {\n const recipe = createRecipe;\n if (!recipe) return;\n\n const t = createTeamId.trim();\n if (!t) {\n setCreateError(\"Team id is required.\");\n return;\n }\n if (t === recipe.id) {\n setCreateError(`Team id cannot be the same as the recipe id (${recipe.id}). Choose a new team id.`);\n return;\n }\n\n setCreateBusy(true);\n setCreateError(null);\n\n // Hide the modal immediately so the overlay is the only visible UI during scaffold.\n setCreateOpen(false);\n\n setOverlayOpen(true);\n setOverlayStep(1);\n\n let serveTimer: ReturnType<typeof setTimeout> | null = null;\n\n try {\n const res = await fetch(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: recipe.id,\n teamId: t,\n applyConfig: true,\n overwrite: false,\n cronInstallChoice: installCron ? \"yes\" : \"no\",\n }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(String(json.error || \"Create team failed\"));\n\n setOverlayStep(2);\n\n // If scaffolding takes a while, switch copy to \"Serving...\" so users know we're in the\n // apply/restart phase even if the CLI didn't print the restart hint yet.\n serveTimer = setTimeout(() => {\n setOverlayStep((prev) => (prev < 3 ? 3 : prev));\n }, 20_000);\n\n const stderr = typeof json.stderr === \"string\" ? json.stderr : \"\";\n\n // Some CLI failures currently still surface as { ok: true, stderr: \"...Error: ...\" }.\n // Treat those as hard failures so we don't navigate into a broken team page.\n if (/Failed to start CLI:/i.test(stderr) || /\\bError: /i.test(stderr)) {\n throw new Error(stderr.trim() || \"Scaffold failed\");\n }\n\n // If scaffolding changed config, the gateway may need a restart. During restart, new pages\n // will throw transient errors (RSC/markdown fetches/etc.), so keep the overlay up.\n if (/Restart required:/i.test(stderr)) {\n setOverlayStep(3);\n try {\n await fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // best-effort\n }\n await waitForKitchenHealthy({ timeoutMs: 60_000 });\n }\n\n // Also wait until the new team's recipe+provenance exist before navigating.\n // This avoids the destination page throwing \"raw markdown\" load errors.\n await waitForTeamPageReady(t, { timeoutMs: 60_000 });\n\n if (serveTimer) clearTimeout(serveTimer);\n\n toast.push({ kind: \"success\", message: `Created team: ${t}` });\n setCreateOpen(false);\n\n // Navigate only after restart/readiness to avoid the ugly error+reload UX.\n router.push(`/teams/${encodeURIComponent(t)}`);\n\n // Give the next page a beat to mount before removing the overlay.\n setTimeout(() => setOverlayOpen(false), 500);\n } catch (e: unknown) {\n if (serveTimer) clearTimeout(serveTimer);\n setOverlayOpen(false);\n const msg = e instanceof Error ? e.message : String(e);\n setCreateError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setCreateBusy(false);\n }\n }\n\n async function confirmCreateAgent() {\n const recipe = createAgentRecipe;\n if (!recipe) return;\n\n const a = createAgentId.trim();\n if (!a) {\n setCreateAgentError(\"Agent id is required.\");\n return;\n }\n if (a === recipe.id) {\n setCreateAgentError(`Agent id cannot be the same as the recipe id (${recipe.id}). Choose a new agent id.`);\n return;\n }\n\n setCreateAgentBusy(true);\n setCreateAgentError(null);\n\n setCreateAgentOpen(false);\n\n setOverlayOpen(true);\n setOverlayStep(1);\n\n let serveTimer: ReturnType<typeof setTimeout> | null = null;\n\n try {\n const res = await fetch(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"agent\",\n recipeId: recipe.id,\n agentId: a,\n name: createAgentName.trim() || undefined,\n applyConfig: true,\n overwrite: false,\n }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(String(json.error || \"Create agent failed\"));\n\n setOverlayStep(2);\n\n serveTimer = setTimeout(() => {\n setOverlayStep((prev) => (prev < 3 ? 3 : prev));\n }, 20_000);\n\n const stderr = typeof json.stderr === \"string\" ? json.stderr : \"\";\n\n if (/Failed to start CLI:/i.test(stderr) || /\\bError: /i.test(stderr)) {\n throw new Error(stderr.trim() || \"Scaffold failed\");\n }\n\n if (/Restart required:/i.test(stderr)) {\n setOverlayStep(3);\n try {\n await fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // best-effort\n }\n await waitForKitchenHealthy({ timeoutMs: 60_000 });\n }\n\n if (serveTimer) clearTimeout(serveTimer);\n\n toast.push({ kind: \"success\", message: `Created agent: ${a}` });\n setCreateAgentOpen(false);\n\n router.push(`/agents/${encodeURIComponent(a)}`);\n setTimeout(() => setOverlayOpen(false), 500);\n } catch (e: unknown) {\n if (serveTimer) clearTimeout(serveTimer);\n setOverlayOpen(false);\n const msg = e instanceof Error ? e.message : String(e);\n setCreateAgentError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setCreateAgentBusy(false);\n }\n }\n\n return (\n <>\n <ScaffoldOverlay\n open={overlayOpen}\n step={overlayStep}\n onDismiss={() => {\n setOverlayOpen(false);\n }}\n />\n <div className=\"mt-8 space-y-10\">\n <section>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Custom recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n Workspace recipes (editable) — stored under <code className=\"font-mono\">~/.openclaw/workspace/recipes/</code>.\n </p>\n\n <div className=\"mt-4 space-y-8\">\n <RecipesSection\n title={`Teams (${customTeamRecipes.length})`}\n items={customTeamRecipes}\n onDelete={onDelete}\n onCreateTeam={onCreateTeam}\n installedAgentIds={installedAgentIds}\n />\n <RecipesSection\n title={`Agents (${customAgentRecipes.length})`}\n items={customAgentRecipes}\n onDelete={onDelete}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Builtin recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">Bundled recipes shipped with the plugin.</p>\n\n <div className=\"mt-4\">\n <RecipesSection\n title={`All (${builtin.length})`}\n items={builtin}\n onCreateTeam={onCreateTeam}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n </div>\n\n <DeleteRecipeModal\n open={deleteOpen}\n recipeId={deleteId}\n busy={busy}\n error={modalError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <CreateTeamModal\n open={createOpen}\n recipeId={createRecipe?.id ?? \"\"}\n recipeName={createRecipe?.name ?? \"\"}\n teamId={createTeamId}\n setTeamId={setCreateTeamId}\n installCron={installCron}\n setInstallCron={setInstallCron}\n busy={createBusy}\n error={createError}\n onClose={() => setCreateOpen(false)}\n onConfirm={confirmCreateTeam}\n />\n\n <CreateAgentModal\n open={createAgentOpen}\n recipeId={createAgentRecipe?.id ?? \"\"}\n recipeName={createAgentRecipe?.name ?? \"\"}\n agentId={createAgentId}\n setAgentId={setCreateAgentId}\n agentName={createAgentName}\n setAgentName={setCreateAgentName}\n existingRecipeIds={[...builtin, ...customTeamRecipes, ...customAgentRecipes].map((r) => r.id)}\n existingAgentIds={installedAgentIds}\n busy={createAgentBusy}\n error={createAgentError}\n onClose={() => setCreateAgentOpen(false)}\n onConfirm={confirmCreateAgent}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport type ScaffoldOverlayStep = 1 | 2 | 3;\n\nconst stepLabel: Record<ScaffoldOverlayStep, string> = {\n 1: \"Ordering team…\",\n 2: \"Cooking up agents…\",\n 3: \"Serving them up hot…\",\n};\n\nexport function ScaffoldOverlay({\n open,\n step,\n onDismiss,\n}: {\n open: boolean;\n step: ScaffoldOverlayStep;\n onDismiss?: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n {/* Slightly transparent full-screen overlay so we hide the app while still showing a hint of context. */}\n <div className=\"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none\" />\n\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onDismiss();\n }}\n 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)]\"\n aria-label=\"Dismiss loading overlay\"\n title=\"Dismiss\"\n >\n Esc\n </button>\n ) : null}\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <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)]\">\n <div className=\"text-2xl font-semibold text-[color:var(--ck-text-primary)]\">Claw Kitchen</div>\n <div className=\"mt-3 text-base text-[color:var(--ck-text-secondary)]\">Hang tight — we’re updating your OpenClaw install.</div>\n\n <div className=\"mt-8 space-y-4 text-base\">\n {[1, 2, 3].map((n) => {\n const s = n as ScaffoldOverlayStep;\n const active = s === step;\n const done = s < step;\n return (\n <div key={s} className=\"flex items-center gap-4\">\n <div\n className={\n \"h-4 w-4 rounded-full \" +\n (done\n ? \"bg-emerald-400\"\n : active\n ? \"bg-[var(--ck-accent-red)] animate-pulse\"\n : \"bg-white/20\")\n }\n />\n <div className={done ? \"text-[color:var(--ck-text-secondary)] line-through\" : \"text-[color:var(--ck-text-primary)]\"}>\n {stepLabel[s]}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Details removed — avoid noisy/scrolling stderr in the primary UX. */}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nfunction slugifyId(input: string) {\n return String(input ?? \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/--+/g, \"-\");\n}\n\nexport function CreateTeamModal({\n open,\n recipeId,\n recipeName,\n teamId,\n setTeamId,\n installCron,\n setInstallCron,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n teamId: string;\n setTeamId: (v: string) => void;\n installCron: boolean;\n setInstallCron: (v: boolean) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [teamName, setTeamName] = useState(\"\");\n const [idTouched, setIdTouched] = useState(false);\n\n const derivedId = useMemo(() => slugifyId(teamName), [teamName]);\n const effectiveId = idTouched ? teamId : derivedId;\n\n // Keep parent state in sync so the confirm handler uses the effective id.\n useEffect(() => {\n if (!open) return;\n if (!idTouched) setTeamId(derivedId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [derivedId, open, idTouched]);\n\n // Reset modal-local state when opened.\n useEffect(() => {\n if (!open) return;\n setIdTouched(false);\n setTeamName(\"\");\n setTeamId(\"\");\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\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)]\">Create team</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Create a new team from recipe <code className=\"font-mono\">{recipeId}</code>\n {recipeName ? (\n <>\n {\" \"}(<span className=\"font-medium\">{recipeName}</span>)\n </>\n ) : null}\n .\n </p>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team name</label>\n <input\n value={teamName}\n onChange={(e) => setTeamName(e.target.value)}\n placeholder=\"e.g. Crypto Team\"\n 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 autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setTeamId(e.target.value);\n }}\n placeholder=\"e.g. my-team\"\n 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 />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config.\n </div>\n </div>\n\n <label className=\"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={installCron} onChange={(e) => setInstallCron(e.target.checked)} />\n Install cron jobs from this recipe\n </label>\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 || !effectiveId.trim()}\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 ? \"Creating…\" : \"Create team\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nfunction slugifyId(input: string) {\n return String(input ?? \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/--+/g, \"-\");\n}\n\ntype Availability =\n | { state: \"empty\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string };\n\nexport function CreateAgentModal({\n open,\n recipeId,\n recipeName,\n agentId,\n setAgentId,\n agentName,\n setAgentName,\n existingRecipeIds,\n existingAgentIds,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n agentId: string;\n setAgentId: (v: string) => void;\n agentName: string;\n setAgentName: (v: string) => void;\n existingRecipeIds: string[];\n existingAgentIds: string[];\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [idTouched, setIdTouched] = useState(false);\n const [availability, setAvailability] = useState<Availability>({ state: \"empty\" });\n\n const derivedId = useMemo(() => slugifyId(agentName), [agentName]);\n const effectiveId = idTouched ? agentId : derivedId;\n\n // Keep parent state in sync so the confirm handler uses the effective id.\n useEffect(() => {\n if (!open) return;\n if (!idTouched) setAgentId(derivedId);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [derivedId, open, idTouched]);\n\n // Reset modal-local state when opened.\n useEffect(() => {\n if (!open) return;\n setIdTouched(false);\n setAvailability({ state: \"empty\" });\n setAgentName(\"\");\n setAgentId(\"\");\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n // Check id availability.\n // Fast path: local check (recipes list + agent list already in memory).\n // Slow path: server check for any edge cases.\n useEffect(() => {\n if (!open) return;\n const v = String(effectiveId ?? \"\").trim();\n if (!v) {\n setAvailability({ state: \"empty\" });\n return;\n }\n\n // Local rules (instant)\n if (existingRecipeIds.includes(v)) {\n setAvailability({ state: \"taken\", reason: \"recipe-id-collision\" });\n return;\n }\n if (existingAgentIds.includes(v)) {\n setAvailability({ state: \"taken\", reason: \"agent-exists\" });\n return;\n }\n\n setAvailability({ state: \"available\" });\n\n // Server confirm (debounced)\n const t = setTimeout(() => {\n void (async () => {\n setAvailability({ state: \"checking\" });\n try {\n const res = await fetch(`/api/ids/check?kind=agent&id=${encodeURIComponent(v)}`, { cache: \"no-store\" });\n const json = (await res.json()) as { ok?: boolean; available?: boolean; reason?: string };\n if (!res.ok || !json.ok) throw new Error(String((json as { error?: unknown }).error ?? \"Failed to check id\"));\n if (json.available) setAvailability({ state: \"available\" });\n else setAvailability({ state: \"taken\", reason: json.reason });\n } catch {\n setAvailability({ state: \"available\" });\n }\n })();\n }, 250);\n\n return () => clearTimeout(t);\n }, [effectiveId, open, existingRecipeIds, existingAgentIds]);\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)]\">Create agent</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Create a new agent from recipe <code className=\"font-mono\">{recipeId}</code>\n {recipeName ? (\n <>\n {\" \"}(<span className=\"font-medium\">{recipeName}</span>)\n </>\n ) : null}\n .\n </p>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent name</label>\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\n placeholder=\"e.g. Crypto Onchain\"\n 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 autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setAgentId(e.target.value);\n }}\n placeholder=\"e.g. crypto-onchain\"\n className={\n \"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)] \" +\n (availability.state === \"available\"\n ? \"border-emerald-400/50\"\n : availability.state === \"taken\"\n ? \"border-red-400/60\"\n : \"border-white/10\")\n }\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {availability.state === \"taken\"\n ? \"That id is already taken.\"\n : availability.state === \"available\"\n ? \"Id is available.\"\n : \"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config.\"}\n </div>\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Name (optional)</label>\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\n placeholder=\"e.g. My Agent\"\n 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 />\n </div>\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 || !effectiveId.trim() || availability.state === \"taken\" || availability.state === \"checking\"}\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 ? \"Creating…\" : \"Create agent\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function DeleteRecipeModal({\n open,\n recipeId,\n onClose,\n onConfirm,\n busy,\n error,\n}: {\n open: boolean;\n recipeId: 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 recipe</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Delete recipe <code className=\"font-mono\">{recipeId}</code>? This removes the markdown file from your workspace.\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"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--8pxUnfVjZMQrso_jWABg7--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/a4e69b85b74277a7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/a9ed074e89b16a5e.js"/><script src="/_next/static/chunks/82abf2d65f5428ae.js" async=""></script><script src="/_next/static/chunks/10cbf02e6fc36465.js" async=""></script><script src="/_next/static/chunks/f2f58a7e93290fbb.js" async=""></script><script src="/_next/static/chunks/turbopack-ae1340e658f67df8.js" async=""></script><script src="/_next/static/chunks/40f7fde35327d214.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/d2be314c3ece3fbe.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>Claw Kitchen</title><meta name="description" content="Local-first UI for authoring ClawRecipes recipes and scaffolding agents/teams."/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script>(function(){try{var t=localStorage.getItem('ck-theme');var theme=(t==='light')?'light':'dark';document.documentElement.dataset.theme=theme;}catch(e){document.documentElement.dataset.theme='dark';}})();</script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased"><div hidden=""><!--$--><!--/$--></div><div class="min-h-screen"><header class="sticky top-0 z-50 border-b border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] backdrop-blur-[var(--ck-glass-blur)]"><div class="mx-auto flex max-w-6xl items-center justify-between gap-4 px-4 py-3"><div class="flex items-center gap-3"><a class="text-sm font-semibold tracking-tight" href="/">Claw Kitchen</a><nav class="hidden items-center gap-1 sm:flex"><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/recipes">Recipes</a><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/tickets">Tickets</a><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/goals">Goals</a><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/cron-jobs">Cron jobs</a><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/settings">Settings</a></nav></div><div class="flex items-center gap-2"><a href="https://github.com/JIGGAI/ClawRecipes/tree/main/docs" target="_blank" rel="noreferrer" class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]">Docs</a><button type="button" class="grid h-9 w-9 place-items-center rounded-full border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]" aria-label="Switch to light mode" title="Switch to light mode"><span class="sr-only">Switch to light mode</span><svg class="h-4.5 w-4.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M21 14.2A7.8 7.8 0 0 1 9.8 3a7 7 0 1 0 11.2 11.2Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"></path></svg></button></div></div></header><main class="mx-auto max-w-6xl px-4 py-8"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><div aria-live="assertive" class="pointer-events-none fixed inset-0 z-[100] flex items-end px-4 py-6 sm:p-6"><div class="flex w-full flex-col items-start space-y-4"></div></div><script src="/_next/static/chunks/a9ed074e89b16a5e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[49830,[\"/_next/static/chunks/40f7fde35327d214.js\"],\"AppShell\"]\n3:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n:HL[\"/_next/static/chunks/a4e69b85b74277a7.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"8pxUnfVjZMQrso_jWABg7\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/a4e69b85b74277a7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/40f7fde35327d214.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem('ck-theme');var theme=(t==='light')?'light':'dark';document.documentElement.dataset.theme=theme;}catch(e){document.documentElement.dataset.theme='dark';}})();\"}}]}],[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"d:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"IconMark\"]\n7:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"Claw Kitchen\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Local-first UI for authoring ClawRecipes recipes and scaffolding agents/teams.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Ld\",\"3\",{}]]\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><!--uZkSG3UgZ81MwaAQa74zD--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/a4e69b85b74277a7.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/a9ed074e89b16a5e.js"/><script src="/_next/static/chunks/82abf2d65f5428ae.js" async=""></script><script src="/_next/static/chunks/10cbf02e6fc36465.js" async=""></script><script src="/_next/static/chunks/f2f58a7e93290fbb.js" async=""></script><script src="/_next/static/chunks/turbopack-ae1340e658f67df8.js" async=""></script><script src="/_next/static/chunks/40f7fde35327d214.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/d2be314c3ece3fbe.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>Claw Kitchen</title><meta name="description" content="Local-first UI for authoring ClawRecipes recipes and scaffolding agents/teams."/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script>(function(){try{var t=localStorage.getItem('ck-theme');var theme=(t==='light')?'light':'dark';document.documentElement.dataset.theme=theme;}catch(e){document.documentElement.dataset.theme='dark';}})();</script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased"><div hidden=""><!--$--><!--/$--></div><div class="min-h-screen"><header class="sticky top-0 z-50 border-b border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] backdrop-blur-[var(--ck-glass-blur)]"><div class="mx-auto flex max-w-6xl items-center justify-between gap-4 px-4 py-3"><div class="flex items-center gap-3"><a class="text-sm font-semibold tracking-tight" href="/">Claw Kitchen</a><nav class="hidden items-center gap-1 sm:flex"><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/recipes">Recipes</a><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/tickets">Tickets</a><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/goals">Goals</a><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/cron-jobs">Cron jobs</a><a class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]" href="/settings">Settings</a></nav></div><div class="flex items-center gap-2"><a href="https://github.com/JIGGAI/ClawRecipes/tree/main/docs" target="_blank" rel="noreferrer" class="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]">Docs</a><button type="button" class="grid h-9 w-9 place-items-center rounded-full border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]" aria-label="Switch to light mode" title="Switch to light mode"><span class="sr-only">Switch to light mode</span><svg class="h-4.5 w-4.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M21 14.2A7.8 7.8 0 0 1 9.8 3a7 7 0 1 0 11.2 11.2Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"></path></svg></button></div></div></header><main class="mx-auto max-w-6xl px-4 py-8"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--></main></div><div aria-live="assertive" class="pointer-events-none fixed inset-0 z-[100] flex items-end px-4 py-6 sm:p-6"><div class="flex w-full flex-col items-start space-y-4"></div></div><script src="/_next/static/chunks/a9ed074e89b16a5e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[49830,[\"/_next/static/chunks/40f7fde35327d214.js\"],\"AppShell\"]\n3:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"MetadataBoundary\"]\nc:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n:HL[\"/_next/static/chunks/a4e69b85b74277a7.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"uZkSG3UgZ81MwaAQa74zD\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/a4e69b85b74277a7.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/40f7fde35327d214.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem('ck-theme');var theme=(t==='light')?'light':'dark';document.documentElement.dataset.theme=theme;}catch(e){document.documentElement.dataset.theme='dark';}})();\"}}]}],[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:1:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"d:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"IconMark\"]\n7:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"Claw Kitchen\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Local-first UI for authoring ClawRecipes recipes and scaffolding agents/teams.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Ld\",\"3\",{}]]\n"])</script></body></html>
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
2
|
-
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/a9ed074e89b16a5e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"
|
|
1
|
+
<!DOCTYPE html><!--uZkSG3UgZ81MwaAQa74zD--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/a9ed074e89b16a5e.js"/><script src="/_next/static/chunks/82abf2d65f5428ae.js" async=""></script><script src="/_next/static/chunks/10cbf02e6fc36465.js" async=""></script><script src="/_next/static/chunks/f2f58a7e93290fbb.js" async=""></script><script src="/_next/static/chunks/turbopack-ae1340e658f67df8.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/d2be314c3ece3fbe.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
2
|
+
@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/a9ed074e89b16a5e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"uZkSG3UgZ81MwaAQa74zD\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"c:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/d2be314c3ece3fbe.js\"],\"IconMark\"]\n6:null\na:[[\"$\",\"link\",\"0\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lc\",\"1\",{}]]\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,44321,e=>{"use strict";var t=e.i(43476),r=e.i(22016),a=e.i(18566),s=e.i(71645),i=e.i(74080);let o={1:"Ordering team…",2:"Cooking up agents…",3:"Serving them up hot…"};function n({open:e,step:r,onDismiss:a}){return e?(0,i.createPortal)((0,t.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none"}),a?(0,t.jsx)("button",{type:"button",onClick:e=>{e.preventDefault(),e.stopPropagation(),a()},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,t.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,t.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,t.jsx)("div",{className:"text-2xl font-semibold text-[color:var(--ck-text-primary)]",children:"Claw Kitchen"}),(0,t.jsx)("div",{className:"mt-3 text-base text-[color:var(--ck-text-secondary)]",children:"Hang tight — we’re updating your OpenClaw install."}),(0,t.jsx)("div",{className:"mt-8 space-y-4 text-base",children:[1,2,3].map(e=>{let a=e===r,s=e<r;return(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)("div",{className:"h-4 w-4 rounded-full "+(s?"bg-emerald-400":a?"bg-[var(--ck-accent-red)] animate-pulse":"bg-white/20")}),(0,t.jsx)("div",{className:s?"text-[color:var(--ck-text-secondary)] line-through":"text-[color:var(--ck-text-primary)]",children:o[e]})]},e)})})]})})]}),document.body):null}var c=e.i(76972);function l({open:e,recipeId:r,recipeName:a,teamId:o,setTeamId:n,installCron:c,setInstallCron:l,busy:d,error:m,onClose:x,onConfirm:u}){let[h,p]=(0,s.useState)(""),[g,v]=(0,s.useState)(!1),f=(0,s.useMemo)(()=>String(h??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[h]),b=g?o:f;return((0,s.useEffect)(()=>{e&&(g||n(f))},[f,e,g]),(0,s.useEffect)(()=>{e&&(v(!1),p(""),n(""))},[e]),e)?(0,i.createPortal)((0,t.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:x}),(0,t.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,t.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,t.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,t.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create team"}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new team from recipe ",(0,t.jsx)("code",{className:"font-mono",children:r}),a?(0,t.jsxs)(t.Fragment,{children:[" ","(",(0,t.jsx)("span",{className:"font-medium",children:a}),")"]}):null,"."]}),(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team name"}),(0,t.jsx)("input",{value:h,onChange:e=>p(e.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,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,t.jsx)("input",{value:b,onChange:e=>{v(!0),n(e.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,t.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,t.jsxs)("label",{className:"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,t.jsx)("input",{type:"checkbox",checked:c,onChange:e=>l(e.target.checked)}),"Install cron jobs from this recipe"]}),m?(0,t.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:m}):null,(0,t.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:x,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,t.jsx)("button",{type:"button",disabled:d||!b.trim(),onClick:u,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:d?"Creating…":"Create team"})]})]})})})]}),document.body):null}function d({open:e,recipeId:r,recipeName:a,agentId:o,setAgentId:n,agentName:c,setAgentName:l,existingRecipeIds:d,existingAgentIds:m,busy:x,error:u,onClose:h,onConfirm:p}){let[g,v]=(0,s.useState)(!1),[f,b]=(0,s.useState)({state:"empty"}),k=(0,s.useMemo)(()=>String(c??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[c]),y=g?o:k;return((0,s.useEffect)(()=>{e&&(g||n(k))},[k,e,g]),(0,s.useEffect)(()=>{e&&(v(!1),b({state:"empty"}),l(""),n(""))},[e]),(0,s.useEffect)(()=>{if(!e)return;let t=String(y??"").trim();if(!t)return void b({state:"empty"});if(d.includes(t))return void b({state:"taken",reason:"recipe-id-collision"});if(m.includes(t))return void b({state:"taken",reason:"agent-exists"});b({state:"available"});let r=setTimeout(()=>{(async()=>{b({state:"checking"});try{let e=await fetch(`/api/ids/check?kind=agent&id=${encodeURIComponent(t)}`,{cache:"no-store"}),r=await e.json();if(!e.ok||!r.ok)throw Error(String(r.error??"Failed to check id"));r.available?b({state:"available"}):b({state:"taken",reason:r.reason})}catch{b({state:"available"})}})()},250);return()=>clearTimeout(r)},[y,e,d,m]),e)?(0,i.createPortal)((0,t.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:h}),(0,t.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,t.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,t.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,t.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create agent"}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new agent from recipe ",(0,t.jsx)("code",{className:"font-mono",children:r}),a?(0,t.jsxs)(t.Fragment,{children:[" ","(",(0,t.jsx)("span",{className:"font-medium",children:a}),")"]}):null,"."]}),(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent name"}),(0,t.jsx)("input",{value:c,onChange:e=>l(e.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,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent id"}),(0,t.jsx)("input",{value:y,onChange:e=>{v(!0),n(e.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"===f.state?"border-emerald-400/50":"taken"===f.state?"border-red-400/60":"border-white/10")}),(0,t.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"taken"===f.state?"That id is already taken.":"available"===f.state?"Id is available.":"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config."})]}),(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Name (optional)"}),(0,t.jsx)("input",{value:c,onChange:e=>l(e.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)]"})]}),u?(0,t.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:u}):null,(0,t.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:h,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,t.jsx)("button",{type:"button",disabled:x||!y.trim()||"taken"===f.state||"checking"===f.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:x?"Creating…":"Create agent"})]})]})})})]}),document.body):null}function m({open:e,recipeId:r,onClose:a,onConfirm:s,busy:o,error:n}){return e?(0,i.createPortal)((0,t.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:a}),(0,t.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,t.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,t.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,t.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete recipe"}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete recipe ",(0,t.jsx)("code",{className:"font-mono",children:r}),"? This removes the markdown file from your workspace."]}),n?(0,t.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,t.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:a,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,t.jsx)("button",{type:"button",disabled:o,onClick:s,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:o?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function x({title:e,items:a,onDelete:s,onCreateTeam:i,onCreateAgent:o,installedAgentIds:n}){return(0,t.jsxs)("section",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:e}),0===a.length?(0,t.jsx)("div",{className:"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]",children:"None yet."}):(0,t.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:a.map(e=>{let a="agent"===e.kind&&n.includes(e.id),c=a?`/agents/${encodeURIComponent(e.id)}`:`/recipes/${encodeURIComponent(e.id)}`,l=a?"Edit agent":"builtin"===e.source?"View recipe":"Edit recipe";return(0,t.jsxs)("div",{className:"ck-glass flex flex-col gap-3 px-4 py-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words",children:e.name}),(0,t.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,t.jsx)("span",{className:"font-mono",children:e.id})," • ",e.kind," • ",e.source]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:["team"===e.kind&&i?(0,t.jsx)("button",{type:"button",onClick:()=>i(e),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"===e.kind&&o?(0,t.jsx)("button",{type:"button",onClick:()=>o(e),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,t.jsx)(r.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:c,children:l}),s?(0,t.jsx)("button",{type:"button",onClick:()=>s(e.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]})]},`${e.source}:${e.id}`)})})]})}function u({builtin:e,customTeamRecipes:r,customAgentRecipes:i,installedAgentIds:o}){let u=(0,c.useToast)(),[h,p]=(0,s.useState)(!1),[g,v]=(0,s.useState)(1),[f,b]=(0,s.useState)(""),k=(0,a.useRouter)(),[y,w]=(0,s.useState)(!1),[j,N]=(0,s.useState)(""),[C,S]=(0,s.useState)(!1),[T,I]=(0,s.useState)(null),[A,E]=(0,s.useState)(!1),[$,D]=(0,s.useState)(null),[P,O]=(0,s.useState)(""),[R,z]=(0,s.useState)(!0),[F,M]=(0,s.useState)(!1),[U,q]=(0,s.useState)(null),[B,L]=(0,s.useState)(!1),[J,K]=(0,s.useState)(null),[H,V]=(0,s.useState)(""),[W,G]=(0,s.useState)(""),[Q,X]=(0,s.useState)(!1),[Y,Z]=(0,s.useState)(null),_=e=>{N(e),I(null),w(!0)},ee=e=>{D(e),O(""),z(!0),q(null),E(!0)},et=e=>{K(e),V(""),G(""),Z(null),L(!0)};async function er(){S(!0),I(null);try{let e=await fetch("/api/recipes/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:j})}),t=await e.json();if(!e.ok||!t.ok){let r=String(t.error||"Delete failed");if(409===e.status)return void I(r);throw Error(r)}u.push({kind:"success",message:`Deleted recipe: ${j}`}),w(!1),window.location.reload()}catch(e){u.push({kind:"error",message:e instanceof Error?e.message:String(e)})}finally{S(!1)}}async function ea(e){let t=e?.timeoutMs??3e4,r=Date.now();for(;Date.now()-r<t;){try{if((await fetch("/healthz",{cache:"no-store"})).ok)return!0}catch{}await new Promise(e=>setTimeout(e,500))}return!1}async function es(e,t){let r=t?.timeoutMs??3e4,a=Date.now();for(;Date.now()-a<r;){try{let[t,r]=await Promise.all([fetch("/api/recipes",{cache:"no-store"}),fetch(`/api/teams/meta?teamId=${encodeURIComponent(e)}`,{cache:"no-store"})]),a=await t.json(),s=(Array.isArray(a.recipes)?a.recipes:[]).some(t=>String(t.id??"")===e&&"team"===String(t.kind??"")),i=await r.json(),o=!!(r.ok&&i.ok&&!i.missing);if(s&&o)return!0}catch{}await new Promise(e=>setTimeout(e,500))}return!1}async function ei(){if(!$)return;let e=P.trim();if(!e)return void q("Team id is required.");if(e===$.id)return void q(`Team id cannot be the same as the recipe id (${$.id}). Choose a new team id.`);M(!0),q(null),E(!1),p(!0),v(1),b("");let t=null;try{let r=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"team",recipeId:$.id,teamId:e,applyConfig:!0,overwrite:!1,cronInstallChoice:R?"yes":"no"})}),a=await r.json();if(!r.ok||!a.ok)throw Error(String(a.error||"Create team failed"));v(2),t=setTimeout(()=>{v(e=>e<3?3:e)},2e4);let s="string"==typeof a.stderr?a.stderr:"";if(s.trim()&&b(s.trim()),/Failed to start CLI:/i.test(s)||/\bError: /i.test(s))throw Error(s.trim()||"Scaffold failed");if(/Restart required:/i.test(s)){v(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ea({timeoutMs:6e4})}await es(e,{timeoutMs:6e4}),t&&clearTimeout(t),u.push({kind:"success",message:`Created team: ${e}`}),E(!1),k.push(`/teams/${encodeURIComponent(e)}`),setTimeout(()=>p(!1),500)}catch(r){t&&clearTimeout(t),p(!1);let e=r instanceof Error?r.message:String(r);q(e),u.push({kind:"error",message:e})}finally{M(!1)}}async function eo(){if(!J)return;let e=H.trim();if(!e)return void Z("Agent id is required.");if(e===J.id)return void Z(`Agent id cannot be the same as the recipe id (${J.id}). Choose a new agent id.`);X(!0),Z(null),L(!1),p(!0),v(1),b("");let t=null;try{let r=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"agent",recipeId:J.id,agentId:e,name:W.trim()||void 0,applyConfig:!0,overwrite:!1})}),a=await r.json();if(!r.ok||!a.ok)throw Error(String(a.error||"Create agent failed"));v(2),t=setTimeout(()=>{v(e=>e<3?3:e)},2e4);let s="string"==typeof a.stderr?a.stderr:"";if(s.trim()&&b(s.trim()),/Failed to start CLI:/i.test(s)||/\bError: /i.test(s))throw Error(s.trim()||"Scaffold failed");if(/Restart required:/i.test(s)){v(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ea({timeoutMs:6e4})}t&&clearTimeout(t),u.push({kind:"success",message:`Created agent: ${e}`}),L(!1),k.push(`/agents/${encodeURIComponent(e)}`),setTimeout(()=>p(!1),500)}catch(r){t&&clearTimeout(t),p(!1);let e=r instanceof Error?r.message:String(r);Z(e),u.push({kind:"error",message:e})}finally{X(!1)}}return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n,{open:h,step:g,onDismiss:()=>{p(!1)}}),(0,t.jsxs)("div",{className:"mt-8 space-y-10",children:[(0,t.jsxs)("section",{children:[(0,t.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Custom recipes"}),(0,t.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Workspace recipes (editable) — stored under ",(0,t.jsx)("code",{className:"font-mono",children:"~/.openclaw/workspace/recipes/"}),"."]}),(0,t.jsxs)("div",{className:"mt-4 space-y-8",children:[(0,t.jsx)(x,{title:`Teams (${r.length})`,items:r,onDelete:_,onCreateTeam:ee,installedAgentIds:o}),(0,t.jsx)(x,{title:`Agents (${i.length})`,items:i,onDelete:_,onCreateAgent:et,installedAgentIds:o})]})]}),(0,t.jsxs)("section",{children:[(0,t.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Builtin recipes"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"Bundled recipes shipped with the plugin."}),(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(x,{title:`All (${e.length})`,items:e,onCreateTeam:ee,onCreateAgent:et,installedAgentIds:o})})]})]}),(0,t.jsx)(m,{open:y,recipeId:j,busy:C,error:T,onClose:()=>w(!1),onConfirm:er}),(0,t.jsx)(l,{open:A,recipeId:$?.id??"",recipeName:$?.name??"",teamId:P,setTeamId:O,installCron:R,setInstallCron:z,busy:F,error:U,onClose:()=>E(!1),onConfirm:ei}),(0,t.jsx)(d,{open:B,recipeId:J?.id??"",recipeName:J?.name??"",agentId:H,setAgentId:V,agentName:W,setAgentName:G,existingRecipeIds:[...e,...r,...i].map(e=>e.id),existingAgentIds:o,busy:Q,error:Y,onClose:()=>L(!1),onConfirm:eo})]})}e.s(["default",()=>u],44321)}]);
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,44321,e=>{"use strict";var t=e.i(43476),r=e.i(22016),a=e.i(18566),s=e.i(71645),i=e.i(74080);let o={1:"Ordering team…",2:"Cooking up agents…",3:"Serving them up hot…"};function n({open:e,step:r,onDismiss:a}){return e?(0,i.createPortal)((0,t.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none"}),a?(0,t.jsx)("button",{type:"button",onClick:e=>{e.preventDefault(),e.stopPropagation(),a()},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,t.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,t.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,t.jsx)("div",{className:"text-2xl font-semibold text-[color:var(--ck-text-primary)]",children:"Claw Kitchen"}),(0,t.jsx)("div",{className:"mt-3 text-base text-[color:var(--ck-text-secondary)]",children:"Hang tight — we’re updating your OpenClaw install."}),(0,t.jsx)("div",{className:"mt-8 space-y-4 text-base",children:[1,2,3].map(e=>{let a=e===r,s=e<r;return(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)("div",{className:"h-4 w-4 rounded-full "+(s?"bg-emerald-400":a?"bg-[var(--ck-accent-red)] animate-pulse":"bg-white/20")}),(0,t.jsx)("div",{className:s?"text-[color:var(--ck-text-secondary)] line-through":"text-[color:var(--ck-text-primary)]",children:o[e]})]},e)})})]})})]}),document.body):null}var c=e.i(76972);function l({open:e,recipeId:r,recipeName:a,teamId:o,setTeamId:n,installCron:c,setInstallCron:l,busy:d,error:m,onClose:x,onConfirm:u}){let[h,p]=(0,s.useState)(""),[g,v]=(0,s.useState)(!1),f=(0,s.useMemo)(()=>String(h??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[h]),b=g?o:f;return((0,s.useEffect)(()=>{e&&(g||n(f))},[f,e,g]),(0,s.useEffect)(()=>{e&&(v(!1),p(""),n(""))},[e]),e)?(0,i.createPortal)((0,t.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:x}),(0,t.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,t.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,t.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,t.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create team"}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new team from recipe ",(0,t.jsx)("code",{className:"font-mono",children:r}),a?(0,t.jsxs)(t.Fragment,{children:[" ","(",(0,t.jsx)("span",{className:"font-medium",children:a}),")"]}):null,"."]}),(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team name"}),(0,t.jsx)("input",{value:h,onChange:e=>p(e.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,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,t.jsx)("input",{value:b,onChange:e=>{v(!0),n(e.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,t.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,t.jsxs)("label",{className:"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,t.jsx)("input",{type:"checkbox",checked:c,onChange:e=>l(e.target.checked)}),"Install cron jobs from this recipe"]}),m?(0,t.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:m}):null,(0,t.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:x,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,t.jsx)("button",{type:"button",disabled:d||!b.trim(),onClick:u,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:d?"Creating…":"Create team"})]})]})})})]}),document.body):null}function d({open:e,recipeId:r,recipeName:a,agentId:o,setAgentId:n,agentName:c,setAgentName:l,existingRecipeIds:d,existingAgentIds:m,busy:x,error:u,onClose:h,onConfirm:p}){let[g,v]=(0,s.useState)(!1),[f,b]=(0,s.useState)({state:"empty"}),k=(0,s.useMemo)(()=>String(c??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[c]),y=g?o:k;return((0,s.useEffect)(()=>{e&&(g||n(k))},[k,e,g]),(0,s.useEffect)(()=>{e&&(v(!1),b({state:"empty"}),l(""),n(""))},[e]),(0,s.useEffect)(()=>{if(!e)return;let t=String(y??"").trim();if(!t)return void b({state:"empty"});if(d.includes(t))return void b({state:"taken",reason:"recipe-id-collision"});if(m.includes(t))return void b({state:"taken",reason:"agent-exists"});b({state:"available"});let r=setTimeout(()=>{(async()=>{b({state:"checking"});try{let e=await fetch(`/api/ids/check?kind=agent&id=${encodeURIComponent(t)}`,{cache:"no-store"}),r=await e.json();if(!e.ok||!r.ok)throw Error(String(r.error??"Failed to check id"));r.available?b({state:"available"}):b({state:"taken",reason:r.reason})}catch{b({state:"available"})}})()},250);return()=>clearTimeout(r)},[y,e,d,m]),e)?(0,i.createPortal)((0,t.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:h}),(0,t.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,t.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,t.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,t.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create agent"}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new agent from recipe ",(0,t.jsx)("code",{className:"font-mono",children:r}),a?(0,t.jsxs)(t.Fragment,{children:[" ","(",(0,t.jsx)("span",{className:"font-medium",children:a}),")"]}):null,"."]}),(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent name"}),(0,t.jsx)("input",{value:c,onChange:e=>l(e.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,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent id"}),(0,t.jsx)("input",{value:y,onChange:e=>{v(!0),n(e.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"===f.state?"border-emerald-400/50":"taken"===f.state?"border-red-400/60":"border-white/10")}),(0,t.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"taken"===f.state?"That id is already taken.":"available"===f.state?"Id is available.":"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config."})]}),(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Name (optional)"}),(0,t.jsx)("input",{value:c,onChange:e=>l(e.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)]"})]}),u?(0,t.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:u}):null,(0,t.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:h,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,t.jsx)("button",{type:"button",disabled:x||!y.trim()||"taken"===f.state||"checking"===f.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:x?"Creating…":"Create agent"})]})]})})})]}),document.body):null}function m({open:e,recipeId:r,onClose:a,onConfirm:s,busy:o,error:n}){return e?(0,i.createPortal)((0,t.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:a}),(0,t.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,t.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,t.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,t.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete recipe"}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete recipe ",(0,t.jsx)("code",{className:"font-mono",children:r}),"? This removes the markdown file from your workspace."]}),n?(0,t.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,t.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:a,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,t.jsx)("button",{type:"button",disabled:o,onClick:s,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:o?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function x({title:e,items:a,onDelete:s,onCreateTeam:i,onCreateAgent:o,installedAgentIds:n}){return(0,t.jsxs)("section",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:e}),0===a.length?(0,t.jsx)("div",{className:"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]",children:"None yet."}):(0,t.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:a.map(e=>{let a="agent"===e.kind&&n.includes(e.id),c=a?`/agents/${encodeURIComponent(e.id)}`:`/recipes/${encodeURIComponent(e.id)}`,l=a?"Edit agent":"builtin"===e.source?"View recipe":"Edit recipe";return(0,t.jsxs)("div",{className:"ck-glass flex flex-col gap-3 px-4 py-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("div",{className:"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words",children:e.name}),(0,t.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,t.jsx)("span",{className:"font-mono",children:e.id})," • ",e.kind," • ",e.source]})]}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:["team"===e.kind&&i?(0,t.jsx)("button",{type:"button",onClick:()=>i(e),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"===e.kind&&o?(0,t.jsx)("button",{type:"button",onClick:()=>o(e),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,t.jsx)(r.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:c,children:l}),s?(0,t.jsx)("button",{type:"button",onClick:()=>s(e.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]})]},`${e.source}:${e.id}`)})})]})}function u({builtin:e,customTeamRecipes:r,customAgentRecipes:i,installedAgentIds:o}){let u=(0,c.useToast)(),[h,p]=(0,s.useState)(!1),[g,v]=(0,s.useState)(1),f=(0,a.useRouter)(),[b,k]=(0,s.useState)(!1),[y,w]=(0,s.useState)(""),[j,N]=(0,s.useState)(!1),[C,S]=(0,s.useState)(null),[T,I]=(0,s.useState)(!1),[A,E]=(0,s.useState)(null),[$,D]=(0,s.useState)(""),[P,O]=(0,s.useState)(!0),[R,z]=(0,s.useState)(!1),[F,M]=(0,s.useState)(null),[U,q]=(0,s.useState)(!1),[B,L]=(0,s.useState)(null),[J,K]=(0,s.useState)(""),[H,V]=(0,s.useState)(""),[W,G]=(0,s.useState)(!1),[Q,X]=(0,s.useState)(null),Y=e=>{w(e),S(null),k(!0)},Z=e=>{E(e),D(""),O(!0),M(null),I(!0)},_=e=>{L(e),K(""),V(""),X(null),q(!0)};async function ee(){N(!0),S(null);try{let e=await fetch("/api/recipes/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:y})}),t=await e.json();if(!e.ok||!t.ok){let r=String(t.error||"Delete failed");if(409===e.status)return void S(r);throw Error(r)}u.push({kind:"success",message:`Deleted recipe: ${y}`}),k(!1),window.location.reload()}catch(e){u.push({kind:"error",message:e instanceof Error?e.message:String(e)})}finally{N(!1)}}async function et(e){let t=e?.timeoutMs??3e4,r=Date.now();for(;Date.now()-r<t;){try{if((await fetch("/healthz",{cache:"no-store"})).ok)return!0}catch{}await new Promise(e=>setTimeout(e,500))}return!1}async function er(e,t){let r=t?.timeoutMs??3e4,a=Date.now();for(;Date.now()-a<r;){try{let[t,r]=await Promise.all([fetch("/api/recipes",{cache:"no-store"}),fetch(`/api/teams/meta?teamId=${encodeURIComponent(e)}`,{cache:"no-store"})]),a=await t.json(),s=(Array.isArray(a.recipes)?a.recipes:[]).some(t=>String(t.id??"")===e&&"team"===String(t.kind??"")),i=await r.json(),o=!!(r.ok&&i.ok&&!i.missing);if(s&&o)return!0}catch{}await new Promise(e=>setTimeout(e,500))}return!1}async function ea(){if(!A)return;let e=$.trim();if(!e)return void M("Team id is required.");if(e===A.id)return void M(`Team id cannot be the same as the recipe id (${A.id}). Choose a new team id.`);z(!0),M(null),I(!1),p(!0),v(1);let t=null;try{let r=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"team",recipeId:A.id,teamId:e,applyConfig:!0,overwrite:!1,cronInstallChoice:P?"yes":"no"})}),a=await r.json();if(!r.ok||!a.ok)throw Error(String(a.error||"Create team failed"));v(2),t=setTimeout(()=>{v(e=>e<3?3:e)},2e4);let s="string"==typeof a.stderr?a.stderr:"";if(/Failed to start CLI:/i.test(s)||/\bError: /i.test(s))throw Error(s.trim()||"Scaffold failed");if(/Restart required:/i.test(s)){v(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await et({timeoutMs:6e4})}await er(e,{timeoutMs:6e4}),t&&clearTimeout(t),u.push({kind:"success",message:`Created team: ${e}`}),I(!1),f.push(`/teams/${encodeURIComponent(e)}`),setTimeout(()=>p(!1),500)}catch(r){t&&clearTimeout(t),p(!1);let e=r instanceof Error?r.message:String(r);M(e),u.push({kind:"error",message:e})}finally{z(!1)}}async function es(){if(!B)return;let e=J.trim();if(!e)return void X("Agent id is required.");if(e===B.id)return void X(`Agent id cannot be the same as the recipe id (${B.id}). Choose a new agent id.`);G(!0),X(null),q(!1),p(!0),v(1);let t=null;try{let r=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"agent",recipeId:B.id,agentId:e,name:H.trim()||void 0,applyConfig:!0,overwrite:!1})}),a=await r.json();if(!r.ok||!a.ok)throw Error(String(a.error||"Create agent failed"));v(2),t=setTimeout(()=>{v(e=>e<3?3:e)},2e4);let s="string"==typeof a.stderr?a.stderr:"";if(/Failed to start CLI:/i.test(s)||/\bError: /i.test(s))throw Error(s.trim()||"Scaffold failed");if(/Restart required:/i.test(s)){v(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await et({timeoutMs:6e4})}t&&clearTimeout(t),u.push({kind:"success",message:`Created agent: ${e}`}),q(!1),f.push(`/agents/${encodeURIComponent(e)}`),setTimeout(()=>p(!1),500)}catch(r){t&&clearTimeout(t),p(!1);let e=r instanceof Error?r.message:String(r);X(e),u.push({kind:"error",message:e})}finally{G(!1)}}return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n,{open:h,step:g,onDismiss:()=>{p(!1)}}),(0,t.jsxs)("div",{className:"mt-8 space-y-10",children:[(0,t.jsxs)("section",{children:[(0,t.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Custom recipes"}),(0,t.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Workspace recipes (editable) — stored under ",(0,t.jsx)("code",{className:"font-mono",children:"~/.openclaw/workspace/recipes/"}),"."]}),(0,t.jsxs)("div",{className:"mt-4 space-y-8",children:[(0,t.jsx)(x,{title:`Teams (${r.length})`,items:r,onDelete:Y,onCreateTeam:Z,installedAgentIds:o}),(0,t.jsx)(x,{title:`Agents (${i.length})`,items:i,onDelete:Y,onCreateAgent:_,installedAgentIds:o})]})]}),(0,t.jsxs)("section",{children:[(0,t.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Builtin recipes"}),(0,t.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"Bundled recipes shipped with the plugin."}),(0,t.jsx)("div",{className:"mt-4",children:(0,t.jsx)(x,{title:`All (${e.length})`,items:e,onCreateTeam:Z,onCreateAgent:_,installedAgentIds:o})})]})]}),(0,t.jsx)(m,{open:b,recipeId:y,busy:j,error:C,onClose:()=>k(!1),onConfirm:ee}),(0,t.jsx)(l,{open:T,recipeId:A?.id??"",recipeName:A?.name??"",teamId:$,setTeamId:D,installCron:P,setInstallCron:O,busy:R,error:F,onClose:()=>I(!1),onConfirm:ea}),(0,t.jsx)(d,{open:U,recipeId:B?.id??"",recipeName:B?.name??"",agentId:J,setAgentId:K,agentName:H,setAgentName:V,existingRecipeIds:[...e,...r,...i].map(e=>e.id),existingAgentIds:o,busy:W,error:Q,onClose:()=>q(!1),onConfirm:es})]})}e.s(["default",()=>u],44321)}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,88810,e=>{"use strict";var t=e.i(43476),a=e.i(74080),s=e.i(71645),r=e.i(18566);function i({open:e,agentId:s,busy:r,error:i,onClose:l,onConfirm:n}){return e?(0,a.createPortal)((0,t.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,t.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:l}),(0,t.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,t.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,t.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,t.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete agent"}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete agent ",(0,t.jsx)("code",{className:"font-mono",children:s}),"? This will remove its workspace/state."]}),i?(0,t.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:i}):null,(0,t.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,t.jsx)("button",{type:"button",onClick:l,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,t.jsx)("button",{type:"button",disabled:r,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:r?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function l({agentId:e,returnTo:a}){let l=(0,r.useRouter)(),[n,c]=(0,s.useState)(null),[o,d]=(0,s.useState)(!0),[m,x]=(0,s.useState)(!1),[h,u]=(0,s.useState)(!1),[p,v]=(0,s.useState)(""),[g,k]=(0,s.useState)(""),[f,y]=(0,s.useState)(""),[b,w]=(0,s.useState)(""),[j,N]=(0,s.useState)(!1),[S,C]=(0,s.useState)(!1),[E,T]=(0,s.useState)(null),[A,I]=(0,s.useState)("identity"),[O,U]=(0,s.useState)(""),[R,D]=(0,s.useState)(""),[L,P]=(0,s.useState)(""),[$,q]=(0,s.useState)(""),[B,F]=(0,s.useState)(""),[J,K]=(0,s.useState)([]),[z,G]=(0,s.useState)([]),[H,Y]=(0,s.useState)(!1),[M,V]=(0,s.useState)(""),[W,Q]=(0,s.useState)(!1),[X,Z]=(0,s.useState)([]),[_,ee]=(0,s.useState)(!1),[et,ea]=(0,s.useState)(!1),[es,er]=(0,s.useState)("SOUL.md"),[ei,el]=(0,s.useState)(""),en=e.includes("-")?e.split("-").slice(0,-1).join("-"):"";async function ec(){x(!0),v("");try{let t=await fetch("/api/agents/identity",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:e,name:O,emoji:R,theme:L,avatar:$})}),a=await t.json();if(!t.ok)throw Error(a.message||a.error||"Save failed");v("Saved identity via openclaw agents set-identity")}catch(e){v(e instanceof Error?e.message:String(e))}finally{x(!1)}}async function eo(){x(!0),v("");try{let t=await fetch("/api/agents/update",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:e,patch:{model:B}})}),a=await t.json();if(!t.ok)throw Error(a.error||"Save config failed");v("Saved agent config (model) and restarted gateway")}catch(e){v(e instanceof Error?e.message:String(e))}finally{x(!1)}}async function ed(t){er(t),el(""),u(!0),k("");try{let a=await fetch(`/api/agents/file?agentId=${encodeURIComponent(e)}&name=${encodeURIComponent(t)}`,{cache:"no-store"}),s=await a.json();if(!a.ok||!s.ok)throw Error(s.error||"Failed to load file");el(String(s.content??""))}catch(e){k(e instanceof Error?e.message:String(e))}finally{u(!1)}}async function em(){x(!0),k("");try{let t=await fetch("/api/agents/file",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:e,name:es,content:ei})}),a=await t.json();if(!t.ok||!a.ok)throw Error(a.error||"Failed to save file");let s=await fetch(`/api/agents/files?agentId=${encodeURIComponent(e)}`,{cache:"no-store"}),r=await s.json();s.ok&&r.ok&&Array.isArray(r.files)&&Z(r.files)}catch(e){k(e instanceof Error?e.message:String(e))}finally{x(!1)}}async function ex(e){er(e),k(""),el(function(e){switch(e){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""}}(e)),await em()}async function eh(){C(!0),T(null),v("");try{let t=await fetch(`/api/agents/${encodeURIComponent(e)}`,{method:"DELETE"}),a=await t.json();if(!t.ok||!a.ok)throw Error(a.error||a.message||a.stderr||"Delete failed");window.location.href="/"}catch(e){T(e instanceof Error?e.message:String(e)),C(!1)}}return(0,s.useEffect)(()=>{(async()=>{d(!0),v("");try{let t=await fetch("/api/agents",{cache:"no-store"}),a=await t.json(),s=(Array.isArray(a.agents)?a.agents:[]).find(t=>t.id===e)??null;c(s),U(s?.identityName??""),F(s?.model??""),d(!1),(async()=>{ee(!0),Y(!0);try{let[t,a,s]=await Promise.all([fetch(`/api/agents/files?agentId=${encodeURIComponent(e)}`,{cache:"no-store"}),fetch(`/api/agents/skills?agentId=${encodeURIComponent(e)}`,{cache:"no-store"}),fetch("/api/skills/available",{cache:"no-store"})]),r=[];try{let e=await t.json();if(t.ok&&e.ok){let t=Array.isArray(e.files)?e.files:[];Z(t.map(e=>({name:String(e.name??""),missing:!!e.missing,required:!!e.required,rationale:"string"==typeof e.rationale?e.rationale:void 0})))}}catch{}try{let e=await a.json();a.ok&&e.ok&&(r=Array.isArray(e.skills)?e.skills:[],K(r))}catch{}try{let e=await s.json();if(s.ok&&e.ok){let t=Array.isArray(e.skills)?e.skills:[];G(t);let a=t.find(e=>!r.includes(e));V(a??t[0]??"")}}catch{}}finally{ee(!1),Y(!1)}})()}catch(e){v(e instanceof Error?e.message:String(e))}finally{d(!1)}})()},[e]),(0,s.useEffect)(()=>{if("files"!==A||!X.length)return;let e=X.some(e=>e.name===es),t=X[0]?.name,a=e?es:t;a&&(a!==es&&(er(a),el("")),ei||ed(a))},[A,e,X.length]),o?(0,t.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Loading…"}):n?(0,t.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6 sm:p-8",children:[(0,t.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Agent editor"}),(0,t.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[n.id,n.isDefault?" • default":"",n.model?` • ${n.model}`:""]})]}),(0,t.jsx)("button",{type:"button",disabled:m,onClick:()=>{T(null),N(!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"})]}),n.workspace?(0,t.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Workspace: ",n.workspace]}):null,en?(0,t.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Team: ",en]}):null,p?(0,t.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,t.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(e=>(0,t.jsx)("button",{onClick:()=>I(e.id),className:A===e.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:e.label},e.id))}),(0,t.jsxs)("div",{className:"mt-6 grid grid-cols-1 gap-4",children:["identity"===A?(0,t.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,t.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Identity"}),(0,t.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Name"}),(0,t.jsx)("input",{value:O,onChange:e=>U(e.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,t.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Emoji"}),(0,t.jsx)("input",{value:R,onChange:e=>D(e.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,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Theme"}),(0,t.jsx)("input",{value:L,onChange:e=>P(e.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,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Avatar"}),(0,t.jsx)("input",{value:$,onChange:e=>q(e.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,t.jsxs)("div",{className:"mt-4 flex flex-col gap-2 sm:flex-row",children:[(0,t.jsx)("button",{disabled:m,onClick:ec,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:m?"Saving…":"Save"}),a?(0,t.jsx)("button",{disabled:m,onClick:async()=>{await ec(),l.push(a)},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"===A?(0,t.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,t.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Config"}),(0,t.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,t.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Model"}),(0,t.jsx)("input",{value:B,onChange:e=>F(e.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,t.jsx)("div",{className:"mt-3",children:(0,t.jsx)("button",{disabled:m,onClick:eo,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:m?"Saving…":"Save config"})})]}):null,"skills"===A?(0,t.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,t.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Skills"}),(0,t.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Skills installed in this ",(0,t.jsx)("strong",{children:"agent"})," workspace (",(0,t.jsx)("code",{children:"skills/"}),"). If you want a skill available to all agents, add it at the team level."]}),(0,t.jsxs)("div",{className:"mt-4",children:[(0,t.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Installed"}),(0,t.jsx)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]",children:H?(0,t.jsx)("li",{children:"Loading…"}):J.length?J.map(e=>(0,t.jsx)("li",{children:e},e)):(0,t.jsx)("li",{children:"None installed."})})]}),(0,t.jsxs)("div",{className:"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,t.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Add a skill"}),(0,t.jsxs)("div",{className:"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center",children:[(0,t.jsx)("select",{value:M,onChange:e=>V(e.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:W||!z.length,children:z.length?z.map(e=>(0,t.jsx)("option",{value:e,children:e},e)):(0,t.jsx)("option",{value:"",children:"No skills found"})}),(0,t.jsx)("button",{type:"button",disabled:W||!M,onClick:async()=>{Q(!0),y(""),w("");try{let t=await fetch("/api/agents/skills/install",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:e,skill:M})}),a=await t.json();if(!t.ok||!a.ok)throw Error(a.error||"Failed to install skill");y(`Installed skill: ${M}`);let s=await fetch(`/api/agents/skills?agentId=${encodeURIComponent(e)}`,{cache:"no-store"}),r=await s.json();s.ok&&r.ok&&K(Array.isArray(r.skills)?r.skills:[])}catch(e){w(e instanceof Error?e.message:String(e))}finally{Q(!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:W?"Adding…":"Add"})]}),b?(0,t.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:b}):f?(0,t.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:f}):null,(0,t.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["This uses ",(0,t.jsxs)("code",{children:["openclaw recipes install-skill <skill> --agent-id ",e," --yes"]}),"."]})]})]}):null,"files"===A?(0,t.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,t.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent files"}),(0,t.jsxs)("label",{className:"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,t.jsx)("input",{type:"checkbox",checked:et,onChange:e=>ea(e.target.checked)}),"Show optional"]})]}),(0,t.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"Default view hides optional missing files to reduce noise."}),(0,t.jsxs)("ul",{className:"mt-3 space-y-1",children:[_?(0,t.jsx)("li",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}):null,X.filter(e=>!!et||!!e.required||!e.missing).map(e=>(0,t.jsx)("li",{children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)("button",{onClick:()=>ed(e.name),className:es===e.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,t.jsx)("span",{className:e.required?"text-[color:var(--ck-text-primary)]":"text-[color:var(--ck-text-secondary)]",children:e.name}),(0,t.jsx)("span",{className:"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:e.required?"required":"optional"}),e.missing?(0,t.jsx)("span",{className:"ml-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"missing"}):null]}),e.missing?(0,t.jsx)("button",{type:"button",disabled:m,onClick:()=>void ex(e.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]})},e.name))]})]}),(0,t.jsxs)("div",{className:"ck-glass-strong p-4 lg:col-span-2",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,t.jsxs)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Edit: ",es]}),(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[h?(0,t.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Loading…"}):null,(0,t.jsx)("button",{disabled:m,onClick:em,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:m?"Saving…":"Save file"})]})]}),g?(0,t.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:g}):null,(0,t.jsx)("textarea",{value:ei,onChange:e=>el(e.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,t.jsx)(i,{open:j,agentId:e,busy:S,error:E,onClose:()=>N(!1),onConfirm:()=>void eh()})]}):(0,t.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:["Agent not found: ",e]})}e.s(["default",()=>l])}]);
|
package/openclaw/index.ts
CHANGED
|
@@ -108,6 +108,10 @@ const kitchenPlugin = {
|
|
|
108
108
|
description: "Local UI for managing recipes, teams, agents, cron jobs, and skills.",
|
|
109
109
|
configSchema: { type: "object", additionalProperties: true, properties: {} },
|
|
110
110
|
register(api: OpenClawPluginApi) {
|
|
111
|
+
// Expose the plugin API to the Next.js server runtime (runs in-process with the gateway).
|
|
112
|
+
// This lets API routes call into OpenClaw runtime helpers without using child_process or env.
|
|
113
|
+
(globalThis as unknown as { __clawkitchen_api?: OpenClawPluginApi }).__clawkitchen_api = api;
|
|
114
|
+
|
|
111
115
|
const cfg = (api.pluginConfig || {}) as KitchenConfig;
|
|
112
116
|
|
|
113
117
|
api.registerCli(
|