@jiggai/kitchen 0.1.5 → 0.1.8
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 +3 -3
- 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.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_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/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/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/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/skills/route.js +1 -1
- package/.next/server/app/api/teams/skills/route.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.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/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.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/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +2 -2
- package/.next/server/app/settings.segments/_full.segment.rsc +2 -2
- 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 +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/tickets/[ticket]/page.js +1 -1
- package/.next/server/app/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/tickets/page.js +1 -1
- 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]__931fa945._.js → [root-of-the-server]__055885ce._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__86aa3d16._.js → [root-of-the-server]__0c01c5c7._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__71d7f4ae._.js → [root-of-the-server]__1398a33a._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__b51afda1._.js → [root-of-the-server]__159c002b._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__23c7d83c._.js → [root-of-the-server]__20c60fb7._.js} +2 -2
- 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]__26de3d48._.js → [root-of-the-server]__29fa8108._.js} +2 -2
- 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]__69be1758._.js → [root-of-the-server]__2dd1afff._.js} +2 -2
- 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]__0554d494._.js → [root-of-the-server]__422c7160._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__04d535a1._.js → [root-of-the-server]__4670294e._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__4eda99a9._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__4eda99a9._.js.map +1 -1
- package/.next/server/chunks/{[root-of-the-server]__149c6b90._.js → [root-of-the-server]__54478298._.js} +3 -3
- 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 +1 -1
- package/.next/server/chunks/[root-of-the-server]__94d68aa3._.js.map +1 -1
- 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]__786b2d5c._.js → [root-of-the-server]__a6ac3ddf._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__b11231a9._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__b11231a9._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__b59b3cdd._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__b59b3cdd._.js.map +1 -1
- 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]__36e14ea6._.js → [root-of-the-server]__b955e35a._.js} +2 -2
- 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 +1 -1
- package/.next/server/chunks/[root-of-the-server]__c4ffbb03._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__d737ca42._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__d737ca42._.js.map +1 -1
- 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 +1 -1
- package/.next/server/chunks/[root-of-the-server]__e6184ba3._.js.map +1 -1
- package/.next/server/chunks/{[root-of-the-server]__6fb173c8._.js → [root-of-the-server]__ed0323e9._.js} +2 -2
- 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 +1 -1
- package/.next/server/chunks/src_lib_d2210cbf._.js.map +1 -1
- 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]__72721a7e._.js → [root-of-the-server]__f75a61bf._.js} +2 -2
- package/.next/server/chunks/ssr/_1aad1d9b._.js +1 -1
- package/.next/server/chunks/ssr/_1aad1d9b._.js.map +1 -1
- package/.next/server/chunks/ssr/_da6f800e._.js +1 -1
- package/.next/server/chunks/ssr/_da6f800e._.js.map +1 -1
- 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_settings_settings-client_tsx_279084f8._.js +1 -1
- package/.next/server/chunks/ssr/src_app_settings_settings-client_tsx_279084f8._.js.map +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/1ce21af6dfb18ee3.js +1 -0
- package/.next/static/chunks/55866d57aa2c7a9c.js +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -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/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/recipes/clone/route.ts +2 -2
- package/src/app/api/settings/cron-installation/route.ts +34 -20
- package/src/app/api/teams/skills/install/route.ts +3 -1
- package/src/app/settings/settings-client.tsx +4 -2
- package/src/lib/agent-workspace.ts +14 -0
- package/src/lib/openclaw.ts +21 -2
- package/.next/server/chunks/[root-of-the-server]__149c6b90._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__191c2791._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__191c2791._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__1ba9b3f1._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1ba9b3f1._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__1e295acc._.js +0 -6
- package/.next/server/chunks/[root-of-the-server]__1e295acc._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__226cf7eb._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__226cf7eb._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__2c08c2ff._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__2c08c2ff._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__30d68375._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__30d68375._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__4f241d56._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__4f241d56._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__6fac1c43._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__6fac1c43._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__7b948232._.js +0 -6
- package/.next/server/chunks/[root-of-the-server]__7b948232._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__92a5b56a._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__92a5b56a._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__97a9f492._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__97a9f492._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__a1497707._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__a1497707._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__d907380c._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__d907380c._.js.map +0 -1
- package/.next/static/chunks/1faff0d40127675e.js +0 -1
- package/.next/static/chunks/4fb7740933125c6a.js +0 -1
- /package/.next/server/chunks/{[root-of-the-server]__931fa945._.js.map → [root-of-the-server]__055885ce._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__86aa3d16._.js.map → [root-of-the-server]__0c01c5c7._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__71d7f4ae._.js.map → [root-of-the-server]__1398a33a._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__b51afda1._.js.map → [root-of-the-server]__159c002b._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__23c7d83c._.js.map → [root-of-the-server]__20c60fb7._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__26de3d48._.js.map → [root-of-the-server]__29fa8108._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__69be1758._.js.map → [root-of-the-server]__2dd1afff._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__0554d494._.js.map → [root-of-the-server]__422c7160._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__04d535a1._.js.map → [root-of-the-server]__4670294e._.js.map} +0 -0
- /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]__786b2d5c._.js.map → [root-of-the-server]__a6ac3ddf._.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]__36e14ea6._.js.map → [root-of-the-server]__b955e35a._.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/{[root-of-the-server]__6fb173c8._.js.map → [root-of-the-server]__ed0323e9._.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/{-CtCgA0I7AqrxE21uMGGj → 2hgbnJUmLMe9COlc5rJd3}/_buildManifest.js +0 -0
- /package/.next/static/{-CtCgA0I7AqrxE21uMGGj → 2hgbnJUmLMe9COlc5rJd3}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{-CtCgA0I7AqrxE21uMGGj → 2hgbnJUmLMe9COlc5rJd3}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[98262,a=>{"use strict";var b=a.i(87924),c=a.i(35112),d=a.i(72131),e=a.i(50944);function f({open:a,agentId:d,busy:e,error:f,onClose:g,onConfirm:h}){return a?(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:g}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete agent"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete agent ",(0,b.jsx)("code",{className:"font-mono",children:d}),"? This will remove its workspace/state."]}),f?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:f}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:g,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:e,onClick:h,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:e?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function g({agentId:a,returnTo:c}){let g=(0,e.useRouter)(),[h,i]=(0,d.useState)(null),[j,k]=(0,d.useState)(!0),[l,m]=(0,d.useState)(!1),[n,o]=(0,d.useState)(!1),[p,q]=(0,d.useState)(""),[r,s]=(0,d.useState)(""),[t,u]=(0,d.useState)(""),[v,w]=(0,d.useState)(""),[x,y]=(0,d.useState)(!1),[z,A]=(0,d.useState)(!1),[B,C]=(0,d.useState)(null),[D,E]=(0,d.useState)("identity"),[F,G]=(0,d.useState)(""),[H,I]=(0,d.useState)(""),[J,K]=(0,d.useState)(""),[L,M]=(0,d.useState)(""),[N,O]=(0,d.useState)(""),[P,Q]=(0,d.useState)([]),[R,S]=(0,d.useState)([]),[T,U]=(0,d.useState)(!1),[V,W]=(0,d.useState)(""),[X,Y]=(0,d.useState)(!1),[Z,$]=(0,d.useState)([]),[_,aa]=(0,d.useState)(!1),[ab,ac]=(0,d.useState)(!1),[ad,ae]=(0,d.useState)("IDENTITY.md"),[af,ag]=(0,d.useState)(""),ah=a.includes("-")?a.split("-").slice(0,-1).join("-"):"";async function ai(){m(!0),q("");try{let b=await fetch("/api/agents/identity",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:F,emoji:H,theme:J,avatar:L})}),c=await b.json();if(!b.ok)throw Error(c.message||c.error||"Save failed");q("Saved identity via openclaw agents set-identity")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function aj(){m(!0),q(""),setTimeout(()=>q(""),6e3);try{let b=await fetch("/api/agents/update",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,patch:{model:N}})}),c=await b.json();if(!b.ok)throw Error(c.error||"Save config failed");q("Saved agent config (model) and restarted gateway")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function ak(b){ae(b),ag(""),o(!0),s("");try{let c=await fetch(`/api/agents/file?agentId=${encodeURIComponent(a)}&name=${encodeURIComponent(b)}`,{cache:"no-store"}),d=await c.json();if(!c.ok||!d.ok)throw Error(d.error||"Failed to load file");ag(String(d.content??""))}catch(a){s(a instanceof Error?a.message:String(a)),setTimeout(()=>s(""),12e3)}finally{o(!1)}}async function al(){m(!0),s("");try{let b=await fetch("/api/agents/file",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:ad,content:af})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to save file")}catch(a){s(a instanceof Error?a.message:String(a)),setTimeout(()=>s(""),12e3)}finally{m(!1)}}async function am(){A(!0),C(null),q("");try{let b=await fetch(`/api/agents/${encodeURIComponent(a)}`,{method:"DELETE"}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||c.message||c.stderr||"Delete failed");window.location.href="/"}catch(a){C(a instanceof Error?a.message:String(a)),A(!1)}}return((0,d.useEffect)(()=>{(async()=>{k(!0),q("");try{let b=await fetch("/api/agents",{cache:"no-store"}),c=await b.json(),d=(Array.isArray(c.agents)?c.agents:[]).find(b=>b.id===a)??null;i(d),G(d?.identityName??""),O(d?.model??""),k(!1),(async()=>{aa(!0),U(!0);try{let[b,c,d]=await Promise.all([fetch(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch("/api/skills/available",{cache:"no-store"})]),e=[];try{let a=await b.json();if(b.ok&&a.ok){let b=Array.isArray(a.files)?a.files:[];$(b.map(a=>({name:String(a.name??""),missing:!!a.missing,required:!!a.required,rationale:"string"==typeof a.rationale?a.rationale:void 0})))}}catch{}try{let a=await c.json();c.ok&&a.ok&&(e=Array.isArray(a.skills)?a.skills:[],Q(e))}catch{}try{let a=await d.json();if(d.ok&&a.ok){let b=Array.isArray(a.skills)?a.skills:[];S(b);let c=b.find(a=>!e.includes(a));W(c??b[0]??"")}}catch{}}finally{aa(!1),U(!1)}})()}catch(a){q(a instanceof Error?a.message:String(a))}finally{k(!1)}})()},[a]),(0,d.useEffect)(()=>{if("files"!==D||!Z.length)return;let a=Z.some(a=>a.name===ad),b=Z[0]?.name,c=a?ad:b;c&&(c!==ad&&(ae(c),ag("")),af||ak(c))},[D,a,Z.length]),j)?(0,b.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Loading…"}):h?(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6 sm:p-8",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Agent editor"}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[h.id,h.isDefault?" • default":"",h.model?` • ${h.model}`:""]})]}),(0,b.jsx)("button",{type:"button",disabled:l,onClick:()=>{C(null),y(!0)},className:"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50",children:"Delete agent"})]}),h.workspace?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Workspace: ",h.workspace]}):null,ah?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Team: ",ah]}):null,p?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]",children:p}):null,(0,b.jsx)("div",{className:"mt-6 flex flex-wrap gap-2",children:[{id:"identity",label:"Identity"},{id:"config",label:"Config"},{id:"skills",label:"Skills"},{id:"files",label:"Files"}].map(a=>(0,b.jsx)("button",{onClick:()=>E(a.id),className:D===a.id?"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]":"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10",children:a.label},a.id))}),(0,b.jsxs)("div",{className:"mt-6 grid grid-cols-1 gap-4",children:["identity"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Identity"}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Name"}),(0,b.jsx)("input",{value:F,onChange:a=>G(a.target.value),className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Emoji"}),(0,b.jsx)("input",{value:H,onChange:a=>I(a.target.value),placeholder:"🦞",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Theme"}),(0,b.jsx)("input",{value:J,onChange:a=>K(a.target.value),placeholder:"warm, sharp, calm",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Avatar"}),(0,b.jsx)("input",{value:L,onChange:a=>M(a.target.value),placeholder:"avatars/openclaw.png",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col gap-2 sm:flex-row",children:[(0,b.jsx)("button",{disabled:l,onClick:ai,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50",children:l?"Saving…":"Save"}),c?(0,b.jsx)("button",{disabled:l,onClick:async()=>{await ai(),g.push(c)},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50",children:"Save & return"}):null]})]}):null,"config"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Config"}),(0,b.jsx)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:"Thin slice: edit the configured model id for this agent (writes to OpenClaw config)."}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Model"}),(0,b.jsx)("input",{value:N,onChange:a=>O(a.target.value),placeholder:"openai/gpt-5.2",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsx)("button",{disabled:l,onClick:aj,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save config"})})]}):null,"skills"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Skills"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Skills installed in this ",(0,b.jsx)("strong",{children:"agent"})," workspace (",(0,b.jsx)("code",{children:"skills/"}),"). If you want a skill available to all agents, add it at the team level."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Installed"}),(0,b.jsx)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]",children:T?(0,b.jsx)("li",{children:"Loading…"}):P.length?P.map(a=>(0,b.jsx)("li",{children:a},a)):(0,b.jsx)("li",{children:"None installed."})})]}),(0,b.jsxs)("div",{className:"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Add a skill"}),(0,b.jsxs)("div",{className:"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center",children:[(0,b.jsx)("select",{value:V,onChange:a=>W(a.target.value),className:"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",disabled:X||!R.length,children:R.length?R.map(a=>(0,b.jsx)("option",{value:a,children:a},a)):(0,b.jsx)("option",{value:"",children:"No skills found"})}),(0,b.jsx)("button",{type:"button",disabled:X||!V,onClick:async()=>{Y(!0),u(""),w("");try{let b=await fetch("/api/agents/skills/install",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,skill:V})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to install skill");u(`Installed skill: ${V}`),setTimeout(()=>u(""),8e3);let d=await fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await d.json();d.ok&&e.ok&&Q(Array.isArray(e.skills)?e.skills:[])}catch(a){w(a instanceof Error?a.message:String(a)),setTimeout(()=>w(""),12e3)}finally{Y(!1)}},className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:X?"Adding…":"Add"})]}),v?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:v}):t?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100",children:t}):null,(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["This uses ",(0,b.jsxs)("code",{children:["openclaw recipes install-skill <skill> --agent-id ",a," --yes"]}),"."]})]})]}):null,"files"===D?(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent files"}),(0,b.jsxs)("label",{className:"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:ab,onChange:a=>ac(a.target.checked)}),"Show optional"]})]}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"Default view hides optional missing files to reduce noise."}),(0,b.jsxs)("ul",{className:"mt-3 space-y-1",children:[_?(0,b.jsx)("li",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}):null,Z.filter(a=>!!ab||!!a.required||!a.missing).map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("button",{onClick:()=>ak(a.name),className:ad===a.name?"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]":"w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5",children:[(0,b.jsx)("span",{className:a.required?"text-[color:var(--ck-text-primary)]":"text-[color:var(--ck-text-secondary)]",children:a.name}),(0,b.jsx)("span",{className:"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:a.required?"required":"optional"}),a.missing?(0,b.jsx)("span",{className:"ml-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"missing"}):null]})},a.name))]})]}),(0,b.jsxs)("div",{className:"ck-glass-strong p-4 lg:col-span-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Edit: ",ad]}),(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[n?(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Loading…"}):null,(0,b.jsx)("button",{disabled:l,onClick:al,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save file"})]})]}),r?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:r}):null,(0,b.jsx)("textarea",{value:af,onChange:a=>ag(a.target.value),className:"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]",spellCheck:!1})]})]}):null]}),(0,b.jsx)(f,{open:x,agentId:a,busy:z,error:B,onClose:()=>y(!1),onConfirm:()=>void am()})]}):(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:["Agent not found: ",a]})}a.s(["default",()=>g])}];
|
|
1
|
+
module.exports=[98262,a=>{"use strict";var b=a.i(87924),c=a.i(35112),d=a.i(72131),e=a.i(50944);function f({open:a,agentId:d,busy:e,error:f,onClose:g,onConfirm:h}){return a?(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:g}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete agent"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete agent ",(0,b.jsx)("code",{className:"font-mono",children:d}),"? This will remove its workspace/state."]}),f?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:f}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:g,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:e,onClick:h,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:e?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function g({agentId:a,returnTo:c}){let g=(0,e.useRouter)(),[h,i]=(0,d.useState)(null),[j,k]=(0,d.useState)(!0),[l,m]=(0,d.useState)(!1),[n,o]=(0,d.useState)(!1),[p,q]=(0,d.useState)(""),[r,s]=(0,d.useState)(""),[t,u]=(0,d.useState)(""),[v,w]=(0,d.useState)(""),[x,y]=(0,d.useState)(!1),[z,A]=(0,d.useState)(!1),[B,C]=(0,d.useState)(null),[D,E]=(0,d.useState)("identity"),[F,G]=(0,d.useState)(""),[H,I]=(0,d.useState)(""),[J,K]=(0,d.useState)(""),[L,M]=(0,d.useState)(""),[N,O]=(0,d.useState)(""),[P,Q]=(0,d.useState)([]),[R,S]=(0,d.useState)([]),[T,U]=(0,d.useState)(!1),[V,W]=(0,d.useState)(""),[X,Y]=(0,d.useState)(!1),[Z,$]=(0,d.useState)([]),[_,aa]=(0,d.useState)(!1),[ab,ac]=(0,d.useState)(!1),[ad,ae]=(0,d.useState)("SOUL.md"),[af,ag]=(0,d.useState)(""),ah=a.includes("-")?a.split("-").slice(0,-1).join("-"):"";async function ai(){m(!0),q("");try{let b=await fetch("/api/agents/identity",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:F,emoji:H,theme:J,avatar:L})}),c=await b.json();if(!b.ok)throw Error(c.message||c.error||"Save failed");q("Saved identity via openclaw agents set-identity")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function aj(){m(!0),q("");try{let b=await fetch("/api/agents/update",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,patch:{model:N}})}),c=await b.json();if(!b.ok)throw Error(c.error||"Save config failed");q("Saved agent config (model) and restarted gateway")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function ak(b){ae(b),ag(""),o(!0),s("");try{let c=await fetch(`/api/agents/file?agentId=${encodeURIComponent(a)}&name=${encodeURIComponent(b)}`,{cache:"no-store"}),d=await c.json();if(!c.ok||!d.ok)throw Error(d.error||"Failed to load file");ag(String(d.content??""))}catch(a){s(a instanceof Error?a.message:String(a))}finally{o(!1)}}async function al(){m(!0),s("");try{let b=await fetch("/api/agents/file",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:ad,content:af})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to save file");let d=await fetch(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await d.json();d.ok&&e.ok&&Array.isArray(e.files)&&$(e.files)}catch(a){s(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function am(a){ae(a),s(""),ag(function(a){switch(a){case"SOUL.md":return"# SOUL.md\n\n";case"AGENTS.md":return"# AGENTS.md\n\n";case"TOOLS.md":return"# TOOLS.md\n\n";case"STATUS.md":return"# STATUS.md\n\n- (empty)\n";case"NOTES.md":return"# NOTES.md\n\n- (empty)\n";case"IDENTITY.md":return"# IDENTITY.md\n\n- **Name:**\n- **Creature:**\n- **Vibe:**\n- **Emoji:**\n- **Avatar:**\n";case"USER.md":return"# USER.md\n\n";case"HEARTBEAT.md":return"# HEARTBEAT.md\n\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\n";default:return""}}(a)),await al()}async function an(){A(!0),C(null),q("");try{let b=await fetch(`/api/agents/${encodeURIComponent(a)}`,{method:"DELETE"}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||c.message||c.stderr||"Delete failed");window.location.href="/"}catch(a){C(a instanceof Error?a.message:String(a)),A(!1)}}return(0,d.useEffect)(()=>{(async()=>{k(!0),q("");try{let b=await fetch("/api/agents",{cache:"no-store"}),c=await b.json(),d=(Array.isArray(c.agents)?c.agents:[]).find(b=>b.id===a)??null;i(d),G(d?.identityName??""),O(d?.model??""),k(!1),(async()=>{aa(!0),U(!0);try{let[b,c,d]=await Promise.all([fetch(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch("/api/skills/available",{cache:"no-store"})]),e=[];try{let a=await b.json();if(b.ok&&a.ok){let b=Array.isArray(a.files)?a.files:[];$(b.map(a=>({name:String(a.name??""),missing:!!a.missing,required:!!a.required,rationale:"string"==typeof a.rationale?a.rationale:void 0})))}}catch{}try{let a=await c.json();c.ok&&a.ok&&(e=Array.isArray(a.skills)?a.skills:[],Q(e))}catch{}try{let a=await d.json();if(d.ok&&a.ok){let b=Array.isArray(a.skills)?a.skills:[];S(b);let c=b.find(a=>!e.includes(a));W(c??b[0]??"")}}catch{}}finally{aa(!1),U(!1)}})()}catch(a){q(a instanceof Error?a.message:String(a))}finally{k(!1)}})()},[a]),(0,d.useEffect)(()=>{if("files"!==D||!Z.length)return;let a=Z.some(a=>a.name===ad),b=Z[0]?.name,c=a?ad:b;c&&(c!==ad&&(ae(c),ag("")),af||ak(c))},[D,a,Z.length]),j?(0,b.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Loading…"}):h?(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6 sm:p-8",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Agent editor"}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[h.id,h.isDefault?" • default":"",h.model?` • ${h.model}`:""]})]}),(0,b.jsx)("button",{type:"button",disabled:l,onClick:()=>{C(null),y(!0)},className:"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50",children:"Delete agent"})]}),h.workspace?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Workspace: ",h.workspace]}):null,ah?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Team: ",ah]}):null,p?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]",children:p}):null,(0,b.jsx)("div",{className:"mt-6 flex flex-wrap gap-2",children:[{id:"identity",label:"Identity"},{id:"config",label:"Config"},{id:"skills",label:"Skills"},{id:"files",label:"Files"}].map(a=>(0,b.jsx)("button",{onClick:()=>E(a.id),className:D===a.id?"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]":"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10",children:a.label},a.id))}),(0,b.jsxs)("div",{className:"mt-6 grid grid-cols-1 gap-4",children:["identity"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Identity"}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Name"}),(0,b.jsx)("input",{value:F,onChange:a=>G(a.target.value),className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Emoji"}),(0,b.jsx)("input",{value:H,onChange:a=>I(a.target.value),placeholder:"🦞",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Theme"}),(0,b.jsx)("input",{value:J,onChange:a=>K(a.target.value),placeholder:"warm, sharp, calm",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Avatar"}),(0,b.jsx)("input",{value:L,onChange:a=>M(a.target.value),placeholder:"avatars/openclaw.png",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col gap-2 sm:flex-row",children:[(0,b.jsx)("button",{disabled:l,onClick:ai,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50",children:l?"Saving…":"Save"}),c?(0,b.jsx)("button",{disabled:l,onClick:async()=>{await ai(),g.push(c)},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50",children:"Save & return"}):null]})]}):null,"config"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Config"}),(0,b.jsx)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:"Thin slice: edit the configured model id for this agent (writes to OpenClaw config)."}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Model"}),(0,b.jsx)("input",{value:N,onChange:a=>O(a.target.value),placeholder:"openai/gpt-5.2",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsx)("button",{disabled:l,onClick:aj,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save config"})})]}):null,"skills"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Skills"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Skills installed in this ",(0,b.jsx)("strong",{children:"agent"})," workspace (",(0,b.jsx)("code",{children:"skills/"}),"). If you want a skill available to all agents, add it at the team level."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Installed"}),(0,b.jsx)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]",children:T?(0,b.jsx)("li",{children:"Loading…"}):P.length?P.map(a=>(0,b.jsx)("li",{children:a},a)):(0,b.jsx)("li",{children:"None installed."})})]}),(0,b.jsxs)("div",{className:"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Add a skill"}),(0,b.jsxs)("div",{className:"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center",children:[(0,b.jsx)("select",{value:V,onChange:a=>W(a.target.value),className:"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",disabled:X||!R.length,children:R.length?R.map(a=>(0,b.jsx)("option",{value:a,children:a},a)):(0,b.jsx)("option",{value:"",children:"No skills found"})}),(0,b.jsx)("button",{type:"button",disabled:X||!V,onClick:async()=>{Y(!0),u(""),w("");try{let b=await fetch("/api/agents/skills/install",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,skill:V})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to install skill");u(`Installed skill: ${V}`);let d=await fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await d.json();d.ok&&e.ok&&Q(Array.isArray(e.skills)?e.skills:[])}catch(a){w(a instanceof Error?a.message:String(a))}finally{Y(!1)}},className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:X?"Adding…":"Add"})]}),v?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:v}):t?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100",children:t}):null,(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["This uses ",(0,b.jsxs)("code",{children:["openclaw recipes install-skill <skill> --agent-id ",a," --yes"]}),"."]})]})]}):null,"files"===D?(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent files"}),(0,b.jsxs)("label",{className:"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:ab,onChange:a=>ac(a.target.checked)}),"Show optional"]})]}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"Default view hides optional missing files to reduce noise."}),(0,b.jsxs)("ul",{className:"mt-3 space-y-1",children:[_?(0,b.jsx)("li",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}):null,Z.filter(a=>!!ab||!!a.required||!a.missing).map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsxs)("button",{onClick:()=>ak(a.name),className:ad===a.name?"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]":"w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5",children:[(0,b.jsx)("span",{className:a.required?"text-[color:var(--ck-text-primary)]":"text-[color:var(--ck-text-secondary)]",children:a.name}),(0,b.jsx)("span",{className:"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:a.required?"required":"optional"}),a.missing?(0,b.jsx)("span",{className:"ml-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"missing"}):null]}),a.missing?(0,b.jsx)("button",{type:"button",disabled:l,onClick:()=>void am(a.name),className:"shrink-0 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50",children:"Create"}):null]})},a.name))]})]}),(0,b.jsxs)("div",{className:"ck-glass-strong p-4 lg:col-span-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Edit: ",ad]}),(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[n?(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Loading…"}):null,(0,b.jsx)("button",{disabled:l,onClick:al,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save file"})]})]}),r?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:r}):null,(0,b.jsx)("textarea",{value:af,onChange:a=>ag(a.target.value),className:"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]",spellCheck:!1})]})]}):null]}),(0,b.jsx)(f,{open:x,agentId:a,busy:z,error:B,onClose:()=>y(!1),onConfirm:()=>void an()})]}):(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:["Agent not found: ",a]})}a.s(["default",()=>g])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_app_agents_%5BagentId%5D_agent-editor_tsx_f85bbe65._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/agents/%5BagentId%5D/agent-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport { createPortal } from \"react-dom\";\nimport { useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\ntype AgentListItem = {\n id: string;\n identityName?: string;\n workspace?: string;\n model?: string;\n isDefault?: boolean;\n};\n\ntype FileListResponse = { ok?: boolean; files?: unknown[] };\n\ntype FileEntry = { name: string; missing: boolean };\n\nfunction DeleteAgentModal({\n open,\n agentId,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n agentId: string;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} />\n <div className=\"fixed inset-0 overflow-y-auto\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">Delete agent</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Delete agent <code className=\"font-mono\">{agentId}</code>? This will remove its workspace/state.\n </p>\n\n {error ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={busy}\n onClick={onConfirm}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {busy ? \"Deleting…\" : \"Delete\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport default function AgentEditor({ agentId, returnTo }: { agentId: string; returnTo?: string }) {\n const router = useRouter();\n const [agent, setAgent] = useState<AgentListItem | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [loadingFile, setLoadingFile] = useState(false);\n // Split concerns: avoid file-load errors showing up in the Skills notice area.\n const [pageMsg, setPageMsg] = useState<string>(\"\");\n const [fileError, setFileError] = useState<string>(\"\");\n const [skillMsg, setSkillMsg] = useState<string>(\"\");\n const [skillError, setSkillError] = useState<string>(\"\");\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [activeTab, setActiveTab] = useState<\"identity\" | \"config\" | \"skills\" | \"files\">(\"identity\");\n\n const [name, setName] = useState<string>(\"\");\n const [emoji, setEmoji] = useState<string>(\"\");\n const [theme, setTheme] = useState<string>(\"\");\n const [avatar, setAvatar] = useState<string>(\"\");\n\n const [model, setModel] = useState<string>(\"\");\n\n const [skillsList, setSkillsList] = useState<string[]>([]);\n const [availableSkills, setAvailableSkills] = useState<string[]>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<string>(\"\");\n const [installingSkill, setInstallingSkill] = useState(false);\n\n const [agentFiles, setAgentFiles] = useState<Array<FileEntry & { required?: boolean; rationale?: string }>>([]);\n const [agentFilesLoading, setAgentFilesLoading] = useState(false);\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"IDENTITY.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const teamId = agentId.includes(\"-\") ? agentId.split(\"-\").slice(0, -1).join(\"-\") : \"\";\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setPageMsg(\"\");\n try {\n const agentsRes = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };\n const list = Array.isArray(agentsJson.agents) ? (agentsJson.agents as AgentListItem[]) : [];\n const found = list.find((a) => a.id === agentId) ?? null;\n setAgent(found);\n setName(found?.identityName ?? \"\");\n setModel(found?.model ?? \"\");\n\n // Render ASAP; load files/skills in the background.\n setLoading(false);\n\n void (async () => {\n setAgentFilesLoading(true);\n setSkillsLoading(true);\n\n try {\n const [filesRes, skillsRes, availableSkillsRes] = await Promise.all([\n fetch(`/api/agents/files?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(\"/api/skills/available\", { cache: \"no-store\" }),\n ]);\n\n let installedSkills: string[] = [];\n\n try {\n const filesJson = (await filesRes.json()) as FileListResponse;\n if (filesRes.ok && filesJson.ok) {\n const files = Array.isArray(filesJson.files) ? filesJson.files : [];\n setAgentFiles(\n files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean((entry as { required?: unknown }).required),\n rationale:\n typeof (entry as { rationale?: unknown }).rationale === \"string\"\n ? ((entry as { rationale?: string }).rationale as string)\n : undefined,\n };\n }),\n );\n }\n } catch {\n // ignore\n }\n\n try {\n const skillsJson = (await skillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (skillsRes.ok && skillsJson.ok) {\n installedSkills = Array.isArray(skillsJson.skills) ? (skillsJson.skills as string[]) : [];\n setSkillsList(installedSkills);\n }\n } catch {\n // ignore\n }\n\n try {\n const availableSkillsJson = (await availableSkillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (availableSkillsRes.ok && availableSkillsJson.ok) {\n const list = Array.isArray(availableSkillsJson.skills) ? (availableSkillsJson.skills as string[]) : [];\n setAvailableSkills(list);\n // Default select first available skill not already installed.\n const first = list.find((s) => !installedSkills.includes(s));\n setSelectedSkill(first ?? list[0] ?? \"\");\n }\n } catch {\n // ignore\n }\n } finally {\n setAgentFilesLoading(false);\n setSkillsLoading(false);\n }\n })();\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n // If the happy-path already flipped loading=false early, this is a no-op.\n setLoading(false);\n }\n })();\n }, [agentId]);\n\n async function onSaveIdentity() {\n setSaving(true);\n setPageMsg(\"\");\n try {\n const res = await fetch(\"/api/agents/identity\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name, emoji, theme, avatar }),\n });\n const json = (await res.json()) as { message?: string; error?: string };\n if (!res.ok) throw new Error(json.message || json.error || \"Save failed\");\n setPageMsg(\"Saved identity via openclaw agents set-identity\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveConfig() {\n setSaving(true);\n setPageMsg(\"\");\n\n // Auto-clear after a moment (non-blocking).\n setTimeout(() => setPageMsg(\"\"), 6000);\n try {\n const res = await fetch(\"/api/agents/update\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, patch: { model } }),\n });\n const json = (await res.json()) as { error?: string };\n if (!res.ok) throw new Error(json.error || \"Save config failed\");\n setPageMsg(\"Saved agent config (model) and restarted gateway\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadAgentFile(nextName: string) {\n // Update selection immediately so the UI reflects what the user clicked,\n // even if the network request fails.\n setFileName(nextName);\n setFileContent(\"\");\n\n setLoadingFile(true);\n setFileError(\"\");\n try {\n const res = await fetch(\n `/api/agents/file?agentId=${encodeURIComponent(agentId)}&name=${encodeURIComponent(nextName)}`,\n { cache: \"no-store\" },\n );\n const json = (await res.json()) as { ok?: boolean; error?: string; content?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load file\");\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n setTimeout(() => setFileError(\"\"), 12000);\n } finally {\n setLoadingFile(false);\n }\n }\n\n // When entering the Files tab, load the current file immediately (default: IDENTITY.md).\n useEffect(() => {\n if (activeTab !== \"files\") return;\n if (!agentFiles.length) return;\n\n const exists = agentFiles.some((f) => f.name === fileName);\n const fallback = agentFiles[0]?.name;\n const target = exists ? fileName : fallback;\n if (!target) return;\n\n if (target !== fileName) {\n setFileName(target);\n setFileContent(\"\");\n }\n\n if (!fileContent) {\n onLoadAgentFile(target);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, agentId, agentFiles.length]);\n\n async function onSaveAgentFile() {\n setSaving(true);\n setFileError(\"\");\n try {\n const res = await fetch(\"/api/agents/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name: fileName, content: fileContent }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save file\");\n // No-op: saving a file doesn't need a global notice.\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n setTimeout(() => setFileError(\"\"), 12000);\n } finally {\n setSaving(false);\n }\n }\n\n async function onDeleteAgent() {\n setDeleteBusy(true);\n setDeleteError(null);\n setPageMsg(\"\");\n\n try {\n const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}`, { method: \"DELETE\" });\n const json = (await res.json()) as { ok?: boolean; error?: string; message?: string; stderr?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || json.message || json.stderr || \"Delete failed\");\n\n window.location.href = \"/\";\n } catch (e: unknown) {\n setDeleteError(e instanceof Error ? e.message : String(e));\n setDeleteBusy(false);\n }\n }\n\n // Initial load only gates the minimal state (agent exists). Files/skills stream in.\n if (loading) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Loading…</div>;\n if (!agent) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Agent not found: {agentId}</div>;\n\n return (\n <div className=\"ck-glass mx-auto max-w-4xl p-6 sm:p-8\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Agent editor</h1>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {agent.id}\n {agent.isDefault ? \" • default\" : \"\"}\n {agent.model ? ` • ${agent.model}` : \"\"}\n </div>\n </div>\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => {\n setDeleteError(null);\n setDeleteOpen(true);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50\"\n >\n Delete agent\n </button>\n </div>\n {agent.workspace ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Workspace: {agent.workspace}</div>\n ) : null}\n {teamId ? <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div> : null}\n\n {pageMsg ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]\">\n {pageMsg}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {(\n [\n { id: \"identity\", label: \"Identity\" },\n { id: \"config\", label: \"Config\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"files\", label: \"Files\" },\n ] as const\n ).map((t) => (\n <button\n key={t.id}\n onClick={() => setActiveTab(t.id)}\n className={\n activeTab === t.id\n ? \"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10\"\n }\n >\n {t.label}\n </button>\n ))}\n </div>\n\n <div className=\"mt-6 grid grid-cols-1 gap-4\">\n {activeTab === \"identity\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Identity</div>\n\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name</label>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Emoji</label>\n <input\n value={emoji}\n onChange={(e) => setEmoji(e.target.value)}\n placeholder=\"🦞\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Theme</label>\n <input\n value={theme}\n onChange={(e) => setTheme(e.target.value)}\n placeholder=\"warm, sharp, calm\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Avatar</label>\n <input\n value={avatar}\n onChange={(e) => setAvatar(e.target.value)}\n placeholder=\"avatars/openclaw.png\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-col gap-2 sm:flex-row\">\n <button\n disabled={saving}\n onClick={onSaveIdentity}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n {returnTo ? (\n <button\n disabled={saving}\n onClick={async () => {\n await onSaveIdentity();\n router.push(returnTo);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50\"\n >\n Save & return\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {activeTab === \"config\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Config</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Thin slice: edit the configured model id for this agent (writes to OpenClaw config).\n </p>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Model</label>\n <input\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"openai/gpt-5.2\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-3\">\n <button\n disabled={saving}\n onClick={onSaveConfig}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save config\"}\n </button>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"skills\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Skills</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Skills installed in this <strong>agent</strong> workspace (<code>skills/</code>). If you want a skill available to all agents,\n add it at the team level.\n </p>\n\n <div className=\"mt-4\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Installed</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {skillsLoading ? (\n <li>Loading…</li>\n ) : skillsList.length ? (\n skillsList.map((s) => <li key={s}>{s}</li>)\n ) : (\n <li>None installed.</li>\n )}\n </ul>\n </div>\n\n <div className=\"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Add a skill</div>\n <div className=\"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <select\n value={selectedSkill}\n onChange={(e) => setSelectedSkill(e.target.value)}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n disabled={installingSkill || !availableSkills.length}\n >\n {availableSkills.length ? (\n availableSkills.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))\n ) : (\n <option value=\"\">No skills found</option>\n )}\n </select>\n <button\n type=\"button\"\n disabled={installingSkill || !selectedSkill}\n onClick={async () => {\n setInstallingSkill(true);\n setSkillMsg(\"\");\n setSkillError(\"\");\n try {\n const res = await fetch(\"/api/agents/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, skill: selectedSkill }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to install skill\");\n setSkillMsg(`Installed skill: ${selectedSkill}`);\n setTimeout(() => setSkillMsg(\"\"), 8000);\n // Refresh installed list.\n const r = await fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok) setSkillsList(Array.isArray(j.skills) ? j.skills : []);\n } catch (e: unknown) {\n setSkillError(e instanceof Error ? e.message : String(e));\n setTimeout(() => setSkillError(\"\"), 12000);\n } finally {\n setInstallingSkill(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {installingSkill ? \"Adding…\" : \"Add\"}\n </button>\n </div>\n\n {skillError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {skillError}\n </div>\n ) : skillMsg ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n {skillMsg}\n </div>\n ) : null}\n\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This uses <code>openclaw recipes install-skill <skill> --agent-id {agentId} --yes</code>.\n </div>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"files\" ? (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent files</div>\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={showOptionalFiles} onChange={(e) => setShowOptionalFiles(e.target.checked)} />\n Show optional\n </label>\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">Default view hides optional missing files to reduce noise.</div>\n <ul className=\"mt-3 space-y-1\">\n {agentFilesLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : null}\n {agentFiles\n .filter((f) => (showOptionalFiles ? true : Boolean(f.required) || !f.missing))\n .map((f) => (\n <li key={f.name}>\n <button\n onClick={() => onLoadAgentFile(f.name)}\n className={\n fileName === f.name\n ? \"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n <span className={f.required ? \"text-[color:var(--ck-text-primary)]\" : \"text-[color:var(--ck-text-secondary)]\"}>\n {f.name}\n </span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n {f.required ? \"required\" : \"optional\"}\n </span>\n {f.missing ? <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">missing</span> : null}\n </button>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Edit: {fileName}</div>\n <div className=\"flex items-center gap-3\">\n {loadingFile ? <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Loading…</span> : null}\n <button\n disabled={saving}\n onClick={onSaveAgentFile}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save file\"}\n </button>\n </div>\n </div>\n\n {fileError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {fileError}\n </div>\n ) : null}\n\n <textarea\n value={fileContent}\n onChange={(e) => setFileContent(e.target.value)}\n className=\"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </div>\n ) : null}\n </div>\n\n <DeleteAgentModal\n open={deleteOpen}\n agentId={agentId}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={() => void onDeleteAgent()}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/agents/%5BagentId%5D/agent-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport { createPortal } from \"react-dom\";\nimport { useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\ntype AgentListItem = {\n id: string;\n identityName?: string;\n workspace?: string;\n model?: string;\n isDefault?: boolean;\n};\n\ntype FileListResponse = { ok?: boolean; files?: unknown[] };\n\ntype FileEntry = { name: string; missing: boolean };\n\nfunction DeleteAgentModal({\n open,\n agentId,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n agentId: string;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} />\n <div className=\"fixed inset-0 overflow-y-auto\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">Delete agent</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Delete agent <code className=\"font-mono\">{agentId}</code>? This will remove its workspace/state.\n </p>\n\n {error ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={busy}\n onClick={onConfirm}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {busy ? \"Deleting…\" : \"Delete\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport default function AgentEditor({ agentId, returnTo }: { agentId: string; returnTo?: string }) {\n const router = useRouter();\n const [agent, setAgent] = useState<AgentListItem | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [loadingFile, setLoadingFile] = useState(false);\n // Split concerns: avoid file-load errors showing up in the Skills notice area.\n const [pageMsg, setPageMsg] = useState<string>(\"\");\n const [fileError, setFileError] = useState<string>(\"\");\n const [skillMsg, setSkillMsg] = useState<string>(\"\");\n const [skillError, setSkillError] = useState<string>(\"\");\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [activeTab, setActiveTab] = useState<\"identity\" | \"config\" | \"skills\" | \"files\">(\"identity\");\n\n const [name, setName] = useState<string>(\"\");\n const [emoji, setEmoji] = useState<string>(\"\");\n const [theme, setTheme] = useState<string>(\"\");\n const [avatar, setAvatar] = useState<string>(\"\");\n\n const [model, setModel] = useState<string>(\"\");\n\n const [skillsList, setSkillsList] = useState<string[]>([]);\n const [availableSkills, setAvailableSkills] = useState<string[]>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<string>(\"\");\n const [installingSkill, setInstallingSkill] = useState(false);\n\n const [agentFiles, setAgentFiles] = useState<Array<FileEntry & { required?: boolean; rationale?: string }>>([]);\n const [agentFilesLoading, setAgentFilesLoading] = useState(false);\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"SOUL.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const teamId = agentId.includes(\"-\") ? agentId.split(\"-\").slice(0, -1).join(\"-\") : \"\";\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setPageMsg(\"\");\n try {\n const agentsRes = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };\n const list = Array.isArray(agentsJson.agents) ? (agentsJson.agents as AgentListItem[]) : [];\n const found = list.find((a) => a.id === agentId) ?? null;\n setAgent(found);\n setName(found?.identityName ?? \"\");\n setModel(found?.model ?? \"\");\n\n // Render ASAP; load files/skills in the background.\n setLoading(false);\n\n void (async () => {\n setAgentFilesLoading(true);\n setSkillsLoading(true);\n\n try {\n const [filesRes, skillsRes, availableSkillsRes] = await Promise.all([\n fetch(`/api/agents/files?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(\"/api/skills/available\", { cache: \"no-store\" }),\n ]);\n\n let installedSkills: string[] = [];\n\n try {\n const filesJson = (await filesRes.json()) as FileListResponse;\n if (filesRes.ok && filesJson.ok) {\n const files = Array.isArray(filesJson.files) ? filesJson.files : [];\n setAgentFiles(\n files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean((entry as { required?: unknown }).required),\n rationale:\n typeof (entry as { rationale?: unknown }).rationale === \"string\"\n ? ((entry as { rationale?: string }).rationale as string)\n : undefined,\n };\n }),\n );\n }\n } catch {\n // ignore\n }\n\n try {\n const skillsJson = (await skillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (skillsRes.ok && skillsJson.ok) {\n installedSkills = Array.isArray(skillsJson.skills) ? (skillsJson.skills as string[]) : [];\n setSkillsList(installedSkills);\n }\n } catch {\n // ignore\n }\n\n try {\n const availableSkillsJson = (await availableSkillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (availableSkillsRes.ok && availableSkillsJson.ok) {\n const list = Array.isArray(availableSkillsJson.skills) ? (availableSkillsJson.skills as string[]) : [];\n setAvailableSkills(list);\n // Default select first available skill not already installed.\n const first = list.find((s) => !installedSkills.includes(s));\n setSelectedSkill(first ?? list[0] ?? \"\");\n }\n } catch {\n // ignore\n }\n } finally {\n setAgentFilesLoading(false);\n setSkillsLoading(false);\n }\n })();\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n // If the happy-path already flipped loading=false early, this is a no-op.\n setLoading(false);\n }\n })();\n }, [agentId]);\n\n async function onSaveIdentity() {\n setSaving(true);\n setPageMsg(\"\");\n try {\n const res = await fetch(\"/api/agents/identity\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name, emoji, theme, avatar }),\n });\n const json = (await res.json()) as { message?: string; error?: string };\n if (!res.ok) throw new Error(json.message || json.error || \"Save failed\");\n setPageMsg(\"Saved identity via openclaw agents set-identity\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveConfig() {\n setSaving(true);\n setPageMsg(\"\");\n\n try {\n const res = await fetch(\"/api/agents/update\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, patch: { model } }),\n });\n const json = (await res.json()) as { error?: string };\n if (!res.ok) throw new Error(json.error || \"Save config failed\");\n setPageMsg(\"Saved agent config (model) and restarted gateway\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadAgentFile(nextName: string) {\n // Update selection immediately so the UI reflects what the user clicked,\n // even if the network request fails.\n setFileName(nextName);\n setFileContent(\"\");\n\n setLoadingFile(true);\n setFileError(\"\");\n try {\n const res = await fetch(\n `/api/agents/file?agentId=${encodeURIComponent(agentId)}&name=${encodeURIComponent(nextName)}`,\n { cache: \"no-store\" },\n );\n const json = (await res.json()) as { ok?: boolean; error?: string; content?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load file\");\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoadingFile(false);\n }\n }\n\n // When entering the Files tab, load the current file immediately (default: IDENTITY.md).\n useEffect(() => {\n if (activeTab !== \"files\") return;\n if (!agentFiles.length) return;\n\n const exists = agentFiles.some((f) => f.name === fileName);\n const fallback = agentFiles[0]?.name;\n const target = exists ? fileName : fallback;\n if (!target) return;\n\n if (target !== fileName) {\n setFileName(target);\n setFileContent(\"\");\n }\n\n if (!fileContent) {\n onLoadAgentFile(target);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, agentId, agentFiles.length]);\n\n function defaultFileContent(name: string) {\n switch (name) {\n case \"SOUL.md\":\n return \"# SOUL.md\\n\\n\";\n case \"AGENTS.md\":\n return \"# AGENTS.md\\n\\n\";\n case \"TOOLS.md\":\n return \"# TOOLS.md\\n\\n\";\n case \"STATUS.md\":\n return \"# STATUS.md\\n\\n- (empty)\\n\";\n case \"NOTES.md\":\n return \"# NOTES.md\\n\\n- (empty)\\n\";\n case \"IDENTITY.md\":\n return \"# IDENTITY.md\\n\\n- **Name:**\\n- **Creature:**\\n- **Vibe:**\\n- **Emoji:**\\n- **Avatar:**\\n\";\n case \"USER.md\":\n return \"# USER.md\\n\\n\";\n case \"HEARTBEAT.md\":\n return \"# HEARTBEAT.md\\n\\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\\n\";\n default:\n return \"\";\n }\n }\n\n async function onSaveAgentFile() {\n setSaving(true);\n setFileError(\"\");\n try {\n const res = await fetch(\"/api/agents/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name: fileName, content: fileContent }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save file\");\n\n // Refresh the file list so missing/mtime updates immediately.\n const r = await fetch(`/api/agents/files?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok && Array.isArray(j.files)) {\n setAgentFiles(j.files);\n }\n // No-op: saving a file doesn't need a global notice.\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onCreateMissingFile(name: string) {\n setFileName(name);\n setFileError(\"\");\n setFileContent(defaultFileContent(name));\n await onSaveAgentFile();\n }\n\n async function onDeleteAgent() {\n setDeleteBusy(true);\n setDeleteError(null);\n setPageMsg(\"\");\n\n try {\n const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}`, { method: \"DELETE\" });\n const json = (await res.json()) as { ok?: boolean; error?: string; message?: string; stderr?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || json.message || json.stderr || \"Delete failed\");\n\n window.location.href = \"/\";\n } catch (e: unknown) {\n setDeleteError(e instanceof Error ? e.message : String(e));\n setDeleteBusy(false);\n }\n }\n\n // Initial load only gates the minimal state (agent exists). Files/skills stream in.\n if (loading) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Loading…</div>;\n if (!agent) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Agent not found: {agentId}</div>;\n\n return (\n <div className=\"ck-glass mx-auto max-w-4xl p-6 sm:p-8\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Agent editor</h1>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {agent.id}\n {agent.isDefault ? \" • default\" : \"\"}\n {agent.model ? ` • ${agent.model}` : \"\"}\n </div>\n </div>\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => {\n setDeleteError(null);\n setDeleteOpen(true);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50\"\n >\n Delete agent\n </button>\n </div>\n {agent.workspace ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Workspace: {agent.workspace}</div>\n ) : null}\n {teamId ? <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div> : null}\n\n {pageMsg ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]\">\n {pageMsg}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {(\n [\n { id: \"identity\", label: \"Identity\" },\n { id: \"config\", label: \"Config\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"files\", label: \"Files\" },\n ] as const\n ).map((t) => (\n <button\n key={t.id}\n onClick={() => setActiveTab(t.id)}\n className={\n activeTab === t.id\n ? \"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10\"\n }\n >\n {t.label}\n </button>\n ))}\n </div>\n\n <div className=\"mt-6 grid grid-cols-1 gap-4\">\n {activeTab === \"identity\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Identity</div>\n\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name</label>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Emoji</label>\n <input\n value={emoji}\n onChange={(e) => setEmoji(e.target.value)}\n placeholder=\"🦞\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Theme</label>\n <input\n value={theme}\n onChange={(e) => setTheme(e.target.value)}\n placeholder=\"warm, sharp, calm\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Avatar</label>\n <input\n value={avatar}\n onChange={(e) => setAvatar(e.target.value)}\n placeholder=\"avatars/openclaw.png\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-col gap-2 sm:flex-row\">\n <button\n disabled={saving}\n onClick={onSaveIdentity}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n {returnTo ? (\n <button\n disabled={saving}\n onClick={async () => {\n await onSaveIdentity();\n router.push(returnTo);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50\"\n >\n Save & return\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {activeTab === \"config\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Config</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Thin slice: edit the configured model id for this agent (writes to OpenClaw config).\n </p>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Model</label>\n <input\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"openai/gpt-5.2\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-3\">\n <button\n disabled={saving}\n onClick={onSaveConfig}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save config\"}\n </button>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"skills\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Skills</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Skills installed in this <strong>agent</strong> workspace (<code>skills/</code>). If you want a skill available to all agents,\n add it at the team level.\n </p>\n\n <div className=\"mt-4\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Installed</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {skillsLoading ? (\n <li>Loading…</li>\n ) : skillsList.length ? (\n skillsList.map((s) => <li key={s}>{s}</li>)\n ) : (\n <li>None installed.</li>\n )}\n </ul>\n </div>\n\n <div className=\"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Add a skill</div>\n <div className=\"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <select\n value={selectedSkill}\n onChange={(e) => setSelectedSkill(e.target.value)}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n disabled={installingSkill || !availableSkills.length}\n >\n {availableSkills.length ? (\n availableSkills.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))\n ) : (\n <option value=\"\">No skills found</option>\n )}\n </select>\n <button\n type=\"button\"\n disabled={installingSkill || !selectedSkill}\n onClick={async () => {\n setInstallingSkill(true);\n setSkillMsg(\"\");\n setSkillError(\"\");\n try {\n const res = await fetch(\"/api/agents/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, skill: selectedSkill }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to install skill\");\n setSkillMsg(`Installed skill: ${selectedSkill}`);\n // Refresh installed list.\n const r = await fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok) setSkillsList(Array.isArray(j.skills) ? j.skills : []);\n } catch (e: unknown) {\n setSkillError(e instanceof Error ? e.message : String(e));\n } finally {\n setInstallingSkill(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {installingSkill ? \"Adding…\" : \"Add\"}\n </button>\n </div>\n\n {skillError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {skillError}\n </div>\n ) : skillMsg ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n {skillMsg}\n </div>\n ) : null}\n\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This uses <code>openclaw recipes install-skill <skill> --agent-id {agentId} --yes</code>.\n </div>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"files\" ? (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent files</div>\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={showOptionalFiles} onChange={(e) => setShowOptionalFiles(e.target.checked)} />\n Show optional\n </label>\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">Default view hides optional missing files to reduce noise.</div>\n <ul className=\"mt-3 space-y-1\">\n {agentFilesLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : null}\n {agentFiles\n .filter((f) => (showOptionalFiles ? true : Boolean(f.required) || !f.missing))\n .map((f) => (\n <li key={f.name}>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => onLoadAgentFile(f.name)}\n className={\n fileName === f.name\n ? \"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n <span className={f.required ? \"text-[color:var(--ck-text-primary)]\" : \"text-[color:var(--ck-text-secondary)]\"}>\n {f.name}\n </span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n {f.required ? \"required\" : \"optional\"}\n </span>\n {f.missing ? <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">missing</span> : null}\n </button>\n {f.missing ? (\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => void onCreateMissingFile(f.name)}\n className=\"shrink-0 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Create\n </button>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Edit: {fileName}</div>\n <div className=\"flex items-center gap-3\">\n {loadingFile ? <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Loading…</span> : null}\n <button\n disabled={saving}\n onClick={onSaveAgentFile}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save file\"}\n </button>\n </div>\n </div>\n\n {fileError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {fileError}\n </div>\n ) : null}\n\n <textarea\n value={fileContent}\n onChange={(e) => setFileContent(e.target.value)}\n className=\"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </div>\n ) : null}\n </div>\n\n <DeleteAgentModal\n open={deleteOpen}\n agentId={agentId}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={() => void onDeleteAgent()}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[90198,a=>{"use strict";var b=a.i(87924),c=a.i(72131);function d(){let[a,d]=(0,c.useState)(!0),[e,f]=(0,c.useState)(!1),[g,h]=(0,c.useState)("prompt"),[i,j]=(0,c.useState)("");async function k(a){f(!0),j("");try{let b=await fetch("/api/settings/cron-installation",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({value:a})}),c=await b.
|
|
1
|
+
module.exports=[90198,a=>{"use strict";var b=a.i(87924),c=a.i(72131);function d(){let[a,d]=(0,c.useState)(!0),[e,f]=(0,c.useState)(!1),[g,h]=(0,c.useState)("prompt"),[i,j]=(0,c.useState)("");async function k(a){f(!0),j("");try{let b=await fetch("/api/settings/cron-installation",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({value:a})}),c=await b.text(),d=c?JSON.parse(c):{};if(!b.ok)throw Error(d.error||"Save failed");h(a),j("Saved.")}catch(a){j(a instanceof Error?a.message:String(a))}finally{f(!1)}}(0,c.useEffect)(()=>{(async()=>{d(!0),j("");try{let a=await fetch("/api/settings/cron-installation",{cache:"no-store"}),b=await a.text(),c=b?JSON.parse(b):{};if(!a.ok)throw Error(c.error||"Failed to load config");let d=String(c.value||"").trim();"off"===d||"prompt"===d||"on"===d?h(d):h("prompt")}catch(a){j(a instanceof Error?a.message:String(a))}finally{d(!1)}})()},[]);let l=({value:c,title:d,help:f})=>(0,b.jsxs)("button",{type:"button",onClick:()=>k(c),disabled:a||e,className:`ck-glass w-full text-left px-4 py-3 transition-colors hover:bg-white/10 ${g===c?"border-[color:var(--ck-accent-red)]":""}`,children:[(0,b.jsxs)("div",{className:"flex items-baseline justify-between gap-3",children:[(0,b.jsx)("div",{className:"font-medium",children:d}),g===c?(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-accent-red)]",children:"Selected"}):null]}),(0,b.jsx)("div",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:f})]});return(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)(l,{value:"off",title:"Off",help:"Never install or reconcile recipe-defined cron jobs."}),(0,b.jsx)(l,{value:"prompt",title:"Prompt (default)",help:"Ask at scaffold time. Default answer should be No; jobs are installed disabled unless you opt in."}),(0,b.jsx)(l,{value:"on",title:"On",help:"Install/reconcile jobs during scaffold (enabledByDefault controls new jobs)."}),i?(0,b.jsx)("div",{className:"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm",children:i}):null]})}a.s(["default",()=>d])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_app_settings_settings-client_tsx_279084f8._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/settings/settings-client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\ntype Mode = \"off\" | \"prompt\" | \"on\";\n\nexport default function SettingsClient() {\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [mode, setMode] = useState<Mode>(\"prompt\");\n const [msg, setMsg] = useState<string>(\"\");\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setMsg(\"\");\n try {\n const res = await fetch(\"/api/settings/cron-installation\", { cache: \"no-store\" });\n const
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/settings/settings-client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\ntype Mode = \"off\" | \"prompt\" | \"on\";\n\nexport default function SettingsClient() {\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [mode, setMode] = useState<Mode>(\"prompt\");\n const [msg, setMsg] = useState<string>(\"\");\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setMsg(\"\");\n try {\n const res = await fetch(\"/api/settings/cron-installation\", { cache: \"no-store\" });\n const text = await res.text();\n const json = text ? (JSON.parse(text) as { ok?: boolean; value?: string; error?: string }) : {};\n if (!res.ok) throw new Error(json.error || \"Failed to load config\");\n const v = String(json.value || \"\").trim();\n if (v === \"off\" || v === \"prompt\" || v === \"on\") setMode(v);\n else setMode(\"prompt\");\n } catch (e: unknown) {\n setMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setLoading(false);\n }\n })();\n }, []);\n\n async function save(next: Mode) {\n setSaving(true);\n setMsg(\"\");\n try {\n const res = await fetch(\"/api/settings/cron-installation\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ value: next }),\n });\n const text = await res.text();\n const json = text ? (JSON.parse(text) as { ok?: boolean; error?: string }) : {};\n if (!res.ok) throw new Error(json.error || \"Save failed\");\n setMode(next);\n setMsg(\"Saved.\");\n } catch (e: unknown) {\n setMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n const Option = ({ value, title, help }: { value: Mode; title: string; help: string }) => (\n <button\n type=\"button\"\n onClick={() => save(value)}\n disabled={loading || saving}\n className={`ck-glass w-full text-left px-4 py-3 transition-colors hover:bg-white/10 ${\n mode === value ? \"border-[color:var(--ck-accent-red)]\" : \"\"\n }`}\n >\n <div className=\"flex items-baseline justify-between gap-3\">\n <div className=\"font-medium\">{title}</div>\n {mode === value ? (\n <div className=\"text-xs font-medium text-[color:var(--ck-accent-red)]\">Selected</div>\n ) : null}\n </div>\n <div className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">{help}</div>\n </button>\n );\n\n return (\n <div className=\"space-y-3\">\n <Option value=\"off\" title=\"Off\" help=\"Never install or reconcile recipe-defined cron jobs.\" />\n <Option\n value=\"prompt\"\n title=\"Prompt (default)\"\n help=\"Ask at scaffold time. Default answer should be No; jobs are installed disabled unless you opt in.\"\n />\n <Option value=\"on\" title=\"On\" help=\"Install/reconcile jobs during scaffold (enabledByDefault controls new jobs).\" />\n\n {msg ? (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm\">\n {msg}\n </div>\n ) : null}\n </div>\n );\n}\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OAIe,SAAS,IACtB,GAAM,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC/B,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAO,UACjC,CAAC,EAAK,EAAO,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAsBvC,eAAe,EAAK,CAAU,EAC5B,GAAU,GACV,EAAO,IACP,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,kCAAmC,CACzD,OAAQ,MACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,MAAO,CAAK,EACrC,GACM,EAAO,MAAM,EAAI,IAAI,GACrB,EAAO,EAAQ,KAAK,KAAK,CAAC,GAA6C,CAAC,EAC9E,GAAI,CAAC,EAAI,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,eAC3C,EAAQ,GACR,EAAO,SACT,CAAE,MAAO,EAAY,CACnB,EAAO,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,GACjD,QAAU,CACR,GAAU,EACZ,CACF,CAvCA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,AAAC,WACC,EAAW,IACX,EAAO,IACP,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,kCAAmC,CAAE,MAAO,UAAW,GACzE,EAAO,MAAM,EAAI,IAAI,GACrB,EAAO,EAAQ,KAAK,KAAK,CAAC,GAA6D,CAAC,EAC9F,GAAI,CAAC,EAAI,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,yBAC3C,IAAM,EAAI,OAAO,EAAK,KAAK,EAAI,IAAI,IAAI,GAC7B,QAAN,GAAqB,WAAN,GAAwB,OAAN,EAAY,EAAQ,GACpD,EAAQ,SACf,CAAE,MAAO,EAAY,CACnB,EAAO,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,GACjD,QAAU,CACR,GAAW,EACb,EACF,CAAC,EACH,EAAG,EAAE,EAuBL,IAAM,EAAS,CAAC,CAAE,OAAK,OAAE,CAAK,MAAE,CAAI,CAAgD,GAClF,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,EAAK,GACpB,SAAU,GAAW,EACrB,UAAW,CAAC,wEAAwE,EAClF,IAAS,EAAQ,sCAAwC,GAAA,CACzD,WAEF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBAAe,IAC7B,IAAS,EACR,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,aACrE,QAEN,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAsD,OAIzE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,MAAM,MAAM,MAAM,MAAM,KAAK,yDACrC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,MAAM,SACN,MAAM,mBACN,KAAK,sGAEP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,MAAM,KAAK,MAAM,KAAK,KAAK,iFAElC,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6FACZ,IAED,OAGV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--_CtCgA0I7AqrxE21uMGGj--><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\":\"-CtCgA0I7AqrxE21uMGGj\",\"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><!--2hgbnJUmLMe9COlc5rJd3--><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\":\"2hgbnJUmLMe9COlc5rJd3\",\"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><!--2hgbnJUmLMe9COlc5rJd3--><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\":\"2hgbnJUmLMe9COlc5rJd3\",\"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
|
-
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"F93QrcRCZuhcndAuD8UAm6F2+Ev4zoox0STSdvhW4sU=\"\n}"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,39905,e=>{"use strict";var t=e.i(43476),a=e.i(71645);function s(){let[e,s]=(0,a.useState)(!0),[l,r]=(0,a.useState)(!1),[o,i]=(0,a.useState)("prompt"),[n,c]=(0,a.useState)("");async function d(e){r(!0),c("");try{let t=await fetch("/api/settings/cron-installation",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({value:e})}),a=await t.text(),s=a?JSON.parse(a):{};if(!t.ok)throw Error(s.error||"Save failed");i(e),c("Saved.")}catch(e){c(e instanceof Error?e.message:String(e))}finally{r(!1)}}(0,a.useEffect)(()=>{(async()=>{s(!0),c("");try{let e=await fetch("/api/settings/cron-installation",{cache:"no-store"}),t=await e.text(),a=t?JSON.parse(t):{};if(!e.ok)throw Error(a.error||"Failed to load config");let s=String(a.value||"").trim();"off"===s||"prompt"===s||"on"===s?i(s):i("prompt")}catch(e){c(e instanceof Error?e.message:String(e))}finally{s(!1)}})()},[]);let f=({value:a,title:s,help:r})=>(0,t.jsxs)("button",{type:"button",onClick:()=>d(a),disabled:e||l,className:`ck-glass w-full text-left px-4 py-3 transition-colors hover:bg-white/10 ${o===a?"border-[color:var(--ck-accent-red)]":""}`,children:[(0,t.jsxs)("div",{className:"flex items-baseline justify-between gap-3",children:[(0,t.jsx)("div",{className:"font-medium",children:s}),o===a?(0,t.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-accent-red)]",children:"Selected"}):null]}),(0,t.jsx)("div",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:r})]});return(0,t.jsxs)("div",{className:"space-y-3",children:[(0,t.jsx)(f,{value:"off",title:"Off",help:"Never install or reconcile recipe-defined cron jobs."}),(0,t.jsx)(f,{value:"prompt",title:"Prompt (default)",help:"Ask at scaffold time. Default answer should be No; jobs are installed disabled unless you opt in."}),(0,t.jsx)(f,{value:"on",title:"On",help:"Install/reconcile jobs during scaffold (enabledByDefault controls new jobs)."}),n?(0,t.jsx)("div",{className:"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm",children:n}):null]})}e.s(["default",()=>s])}]);
|
|
@@ -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])}]);
|