@jiggai/kitchen 0.3.33 → 0.3.48
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/app-path-routes-manifest.json +4 -0
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +4 -4
- package/.next/required-server-files.json +4 -4
- package/.next/routes-manifest.json +24 -0
- package/.next/server/app/_global-error/page/build-manifest.json +3 -3
- package/.next/server/app/_global-error/page.js +2 -2
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page/build-manifest.json +3 -3
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +5 -5
- package/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- 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 +2 -2
- package/.next/server/app/agents/[agentId]/page/build-manifest.json +3 -3
- package/.next/server/app/agents/[agentId]/page.js +2 -2
- package/.next/server/app/agents/[agentId]/page.js.nft.json +1 -1
- package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/[id]/route.js +1 -1
- package/.next/server/app/api/agents/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/add/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/file/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/files/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/route.js +1 -1
- package/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/route.js.nft.json +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/bulk/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/cron/bulk/route/build-manifest.json +11 -0
- package/.next/server/app/api/cron/bulk/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/cron/bulk/route.js +6 -0
- package/.next/server/app/api/cron/bulk/route.js.map +5 -0
- package/.next/server/app/api/cron/bulk/route.js.nft.json +1 -0
- package/.next/server/app/api/cron/bulk/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/cron/delete/route.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/cron/worker/route.js +2 -1
- package/.next/server/app/api/cron/worker/route.js.nft.json +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.nft.json +1 -1
- package/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/server/app/api/ids/check/route.js.nft.json +1 -1
- package/.next/server/app/api/manifest/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/manifest/route/build-manifest.json +11 -0
- package/.next/server/app/api/manifest/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/manifest/route.js +6 -0
- package/.next/server/app/api/manifest/route.js.map +5 -0
- package/.next/server/app/api/manifest/route.js.nft.json +1 -0
- package/.next/server/app/api/manifest/route_client-reference-manifest.js +2 -0
- 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/plugins/[pluginId]/[...path]/route.js +2 -2
- package/.next/server/app/api/plugins/[pluginId]/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/[pluginId]/tabs/[tabId]/route.js +1 -1
- package/.next/server/app/api/plugins/[pluginId]/tabs/[tabId]/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/route.js +1 -1
- package/.next/server/app/api/plugins/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/test/route.js +1 -1
- package/.next/server/app/api/plugins/test/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/custom-team/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/local-agent-catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/route.js +1 -1
- package/.next/server/app/api/recipes/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/team-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/scaffold/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/cron-installation/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/model-options/route.js +1 -1
- package/.next/server/app/api/settings/model-options/route.js.nft.json +1 -1
- package/.next/server/app/api/swarms/start/route.js +1 -1
- package/.next/server/app/api/swarms/start/route.js.nft.json +1 -1
- package/.next/server/app/api/swarms/status/route.js +1 -1
- package/.next/server/app/api/swarms/status/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/media-providers/route.js +1 -1
- package/.next/server/app/api/teams/[teamId]/media-providers/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/comment/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/file/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/files/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/list/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/list/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/list/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/list/route.js +6 -0
- package/.next/server/app/api/teams/list/route.js.map +5 -0
- package/.next/server/app/api/teams/list/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/list/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/meta/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/orchestrator/route.js +1 -1
- package/.next/server/app/api/teams/orchestrator/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/remove-team/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-deliverables/file/route.js +1 -1
- package/.next/server/app/api/teams/workflow-deliverables/file/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-deliverables/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-runs/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-templates/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-triggers/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/workflow-triggers/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/workflow-triggers/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/workflow-triggers/route.js +6 -0
- package/.next/server/app/api/teams/workflow-triggers/route.js.map +5 -0
- package/.next/server/app/api/teams/workflow-triggers/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/workflow-triggers/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/workflows/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/assign/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/assignees/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/channels/page/build-manifest.json +3 -3
- package/.next/server/app/channels/page.js +2 -2
- package/.next/server/app/channels/page.js.nft.json +1 -1
- package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
- package/.next/server/app/channels.html +2 -2
- package/.next/server/app/channels.rsc +6 -6
- package/.next/server/app/channels.segments/_full.segment.rsc +6 -6
- package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_index.segment.rsc +3 -3
- package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
- package/.next/server/app/cron-jobs/page/build-manifest.json +3 -3
- package/.next/server/app/cron-jobs/page.js +2 -2
- package/.next/server/app/cron-jobs/page.js.nft.json +1 -1
- package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/[id]/page/build-manifest.json +3 -3
- package/.next/server/app/goals/[id]/page.js +2 -2
- package/.next/server/app/goals/[id]/page.js.nft.json +1 -1
- package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new/page/build-manifest.json +3 -3
- package/.next/server/app/goals/new/page.js +2 -2
- package/.next/server/app/goals/new/page.js.nft.json +1 -1
- package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new.html +2 -2
- package/.next/server/app/goals/new.rsc +6 -6
- package/.next/server/app/goals/new.segments/_full.segment.rsc +6 -6
- package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_index.segment.rsc +3 -3
- package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
- package/.next/server/app/goals/page/build-manifest.json +3 -3
- package/.next/server/app/goals/page.js +2 -2
- package/.next/server/app/goals/page.js.nft.json +1 -1
- package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals.html +1 -1
- package/.next/server/app/goals.rsc +6 -6
- package/.next/server/app/goals.segments/_full.segment.rsc +6 -6
- package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_index.segment.rsc +3 -3
- package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
- package/.next/server/app/page/build-manifest.json +3 -3
- package/.next/server/app/page.js +4 -4
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/[id]/page/build-manifest.json +3 -3
- package/.next/server/app/recipes/[id]/page.js +4 -4
- package/.next/server/app/recipes/[id]/page.js.nft.json +1 -1
- package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/page/build-manifest.json +3 -3
- package/.next/server/app/recipes/page.js +4 -4
- package/.next/server/app/recipes/page.js.nft.json +1 -1
- package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/runs/page/build-manifest.json +3 -3
- package/.next/server/app/runs/page.js +5 -7
- package/.next/server/app/runs/page.js.nft.json +1 -1
- package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page/build-manifest.json +3 -3
- package/.next/server/app/settings/page.js +2 -2
- package/.next/server/app/settings/page.js.nft.json +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 +6 -6
- package/.next/server/app/settings.segments/_full.segment.rsc +6 -6
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- 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/teams/[teamId]/deliverables/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/deliverables/page.js +5 -5
- package/.next/server/app/teams/[teamId]/deliverables/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/deliverables/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/page.js +5 -6
- package/.next/server/app/teams/[teamId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js +5 -6
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/runs/page.js +2 -2
- package/.next/server/app/teams/[teamId]/runs/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js +2 -2
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/tickets/page.js +2 -2
- package/.next/server/app/teams/[teamId]/tickets/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js +5 -5
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/workflows/page.js +5 -5
- package/.next/server/app/teams/[teamId]/workflows/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/[ticket]/page/build-manifest.json +3 -3
- package/.next/server/app/tickets/[ticket]/page.js +2 -2
- package/.next/server/app/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/page/build-manifest.json +3 -3
- package/.next/server/app/tickets/page.js +2 -2
- package/.next/server/app/tickets/page.js.nft.json +1 -1
- package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +4 -0
- package/.next/server/chunks/[externals]_node:fs_ddf6f167._.js +3 -0
- package/.next/server/chunks/[externals]_node:fs_ddf6f167._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__00a30f40._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__03c5f2a6._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__03c5f2a6._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__04f289da._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__08b4c8f2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0b2c557c._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0b2c557c._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0f55461f._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1311d7a3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1480ffda._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__be5f57b2._.js → [root-of-the-server]__17fa6089._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1873f417._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1d4f6506._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1d4f6506._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1f18c0c4._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1f18c0c4._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1f1e62ac._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__20b1f42d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__21ad9eeb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__2c207e60._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__2dd1afff._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3021a250._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__30cd38e9._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__392e585d._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__3bfad714._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3d15e850._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3f648b9b._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__482575d2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__4898071c._.js +4 -4
- package/.next/server/chunks/[root-of-the-server]__497e7a9d._.js +22 -0
- package/.next/server/chunks/[root-of-the-server]__497e7a9d._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__4ee12514._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__55defc7c._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__74b80ca4._.js → [root-of-the-server]__5792c29e._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__5aa1dc93._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__5c5990a6._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__603cb0fa._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__6131b7e2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__6131b7e2._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__636919a0._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__653d42f0._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__653d42f0._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__663e79ff._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0883634a._.js → [root-of-the-server]__68a21bb1._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0883634a._.js.map → [root-of-the-server]__68a21bb1._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__69c065ce._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__6e463e5f._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__6e463e5f._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__c1b0d50e._.js → [root-of-the-server]__7194dfe2._.js} +3 -3
- package/.next/server/chunks/{[root-of-the-server]__f45ceefb._.js → [root-of-the-server]__7347e39f._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__f45ceefb._.js.map → [root-of-the-server]__7347e39f._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__74e2a9ba._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__7bdf9f6e._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__7bdf9f6e._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__7e12b9f4._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__87875179._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__17124952._.js → [root-of-the-server]__89f2190c._.js} +3 -3
- package/.next/server/chunks/[root-of-the-server]__8f8e110f._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__91d0cce1._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__91d0cce1._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__937b40e2._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__937b40e2._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__9853b72d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__9dba20b3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__9e96d37b._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__aba68368._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__aed4e4f2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__b6cff26d._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0bea0f71._.js → [root-of-the-server]__b986660c._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0bea0f71._.js.map → [root-of-the-server]__b986660c._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__343776df._.js → [root-of-the-server]__bbed0e46._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__c15c5141._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__c50e4bc4._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__cc0860cb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__cc3ea05b._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__cc3ea05b._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__d302afb4._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__d4a8660e._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e1432bba._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__e1432bba._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__e478ef0d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e9acbabd._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e9d9d570._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__f408c708._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__f4cbadf7._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__f5cd81f1._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__f85b5a70._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__f85b5a70._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__f994dc62._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__fb22e719._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__fb22e719._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_cron_bulk_route_actions_30f8adb9.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_cron_bulk_route_actions_30f8adb9.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_manifest_route_actions_7f7622ff.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_manifest_route_actions_7f7622ff.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_list_route_actions_5aa8c937.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_list_route_actions_5aa8c937.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-triggers_route_actions_e86e3b38.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-triggers_route_actions_e86e3b38.js.map +1 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js.map +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_3a1b29e4.js +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_cb6ddb24.js +13 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_cb6ddb24.js.map +1 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_f5680d9e.js +1 -1
- package/.next/server/chunks/node_modules_yaml_dist_49c13b35._.js +1 -1
- package/.next/server/chunks/node_modules_yaml_dist_49c13b35._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__195421b7._.js +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__195421b7._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__2a657095._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__2a657095._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__3f55f975._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__3f55f975._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__471bc2e7._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__471bc2e7._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__4d24c088._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4d24c088._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__6390ce9c._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__6390ce9c._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7b8cdea5._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7b8cdea5._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7d21617d._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7d21617d._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8135c9d5._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8135c9d5._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_1038a5b9._.js → [root-of-the-server]__8e8f535b._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_next_dist_1038a5b9._.js.map → [root-of-the-server]__8e8f535b._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__92524828._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__92524828._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__997aa62c._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__997aa62c._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9db1df87._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9db1df87._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__a2e3966f._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__a2e3966f._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__af792402._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__af792402._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__becf14db._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__becf14db._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c106a298._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c106a298._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__cb91405c._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__cb91405c._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__f59c3144._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__f59c3144._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__fbe5ff69._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__fbe5ff69._.js.map +1 -1
- package/.next/server/chunks/ssr/_1ee3bd7b._.js +1 -1
- package/.next/server/chunks/ssr/_1ee3bd7b._.js.map +1 -1
- package/.next/server/chunks/ssr/{_deb7a691._.js → _2ab986a4._.js} +2 -2
- package/.next/server/chunks/ssr/_2ab986a4._.js.map +1 -0
- package/.next/server/chunks/ssr/_2d8d7232._.js +1 -1
- package/.next/server/chunks/ssr/_2d8d7232._.js.map +1 -1
- package/.next/server/chunks/ssr/_43a80c61._.js +1 -1
- package/.next/server/chunks/ssr/_43a80c61._.js.map +1 -1
- package/.next/server/chunks/ssr/_641f29bc._.js +3 -0
- package/.next/server/chunks/ssr/_641f29bc._.js.map +1 -0
- package/.next/server/chunks/ssr/_ac993243._.js +3 -0
- package/.next/server/chunks/ssr/_ac993243._.js.map +1 -0
- package/.next/server/chunks/ssr/_f636ce67._.js +3 -0
- package/.next/server/chunks/ssr/_f636ce67._.js.map +1 -0
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +7 -1
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js.map +1 -1
- package/.next/server/chunks/ssr/{_7f9e89d2._.js → node_modules_next_10fb6ad9._.js} +3 -3
- package/.next/server/chunks/ssr/node_modules_next_10fb6ad9._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_25a30daf._.js +1 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_compiled_bc6b8ddf._.js +1 -1
- package/.next/server/chunks/ssr/node_modules_yaml_dist_18db9ed7._.js +2 -2
- package/.next/server/chunks/ssr/src_13139e3d._.js +1 -1
- package/.next/server/chunks/ssr/src_13139e3d._.js.map +1 -1
- package/.next/server/chunks/ssr/src_2a73b867._.js +1 -1
- package/.next/server/chunks/ssr/src_2a73b867._.js.map +1 -1
- package/.next/server/chunks/ssr/src_2dbb3b7f._.js +1 -1
- package/.next/server/chunks/ssr/src_2dbb3b7f._.js.map +1 -1
- package/.next/server/chunks/ssr/src_417bc4a6._.js +1 -1
- package/.next/server/chunks/ssr/src_417bc4a6._.js.map +1 -1
- package/.next/server/chunks/ssr/src_59477309._.js +1 -1
- package/.next/server/chunks/ssr/src_59477309._.js.map +1 -1
- package/.next/server/chunks/ssr/src_79d55c05._.js +1 -1
- package/.next/server/chunks/ssr/src_79d55c05._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.js +1 -1
- package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.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_cron-jobs_cron-jobs-client_tsx_ec91a73d._.js +1 -1
- package/.next/server/chunks/ssr/src_app_cron-jobs_cron-jobs-client_tsx_ec91a73d._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_index_tsx_98393217._.js +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_index_tsx_98393217._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_runs_[workflowId]_[runId]_run-detail-client_tsx_56f0cbd7._.js +3 -0
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_runs_[workflowId]_[runId]_run-detail-client_tsx_56f0cbd7._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_tickets_TicketsBoardClient_tsx_5e156ef3._.js +1 -1
- package/.next/server/chunks/ssr/src_app_tickets_TicketsBoardClient_tsx_5e156ef3._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- 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/001f840e2d5598af.js +10 -0
- package/.next/static/chunks/212477db59154fa7.js +3 -0
- package/.next/static/chunks/242fee5849d79d1b.js +1 -0
- package/.next/static/chunks/26d8587a145bded7.js +1 -0
- package/.next/static/chunks/{b83c1ca03c3b8c6d.js → 372ac1d07db9969a.js} +1 -1
- package/.next/static/chunks/4a0d27f3023676a5.js +1 -0
- package/.next/static/chunks/4ad57cfc54e20abd.js +1 -0
- package/.next/static/chunks/4e8866ad8f1f6b2b.js +1 -0
- package/.next/static/chunks/7d9e7a36b92578fd.js +1 -0
- package/.next/static/chunks/87f63f654bc046a2.js +3 -0
- package/.next/static/chunks/8aac543d98940eb3.js +2 -0
- package/.next/static/chunks/8acd42df55d57556.js +1 -0
- package/.next/static/chunks/95b7564f2360e762.js +1 -0
- package/.next/static/chunks/9801fc48f532d076.js +1 -0
- package/.next/static/chunks/{d6e1b7307a9274ce.js → 9c627cb11f73ac4c.js} +1 -1
- package/.next/static/chunks/ad652e4b50e1fb17.js +1 -0
- package/.next/static/chunks/aff32612e6b9d901.js +1 -0
- package/.next/static/chunks/c6c561355e97baa8.js +7 -0
- package/.next/static/chunks/d4c855575c079ffc.js +3 -0
- package/.next/static/chunks/d593ea5e91e81b45.js +1 -0
- package/.next/static/chunks/{87879d67a1601ee0.js → e0984ec981f01c0d.js} +1 -1
- package/.next/static/chunks/f5039461b97678c7.js +1 -0
- package/.next/static/chunks/f51763a2aea0a4b6.js +1 -0
- package/.next/static/chunks/f7f157ba542e1ae5.js +1 -0
- package/.next/static/chunks/fb008837ba324b34.css +3 -0
- package/.next/static/chunks/{turbopack-dbf3078dbf5863bd.js → turbopack-bdd9478663f034d6.js} +1 -1
- package/LICENSE +192 -0
- package/README.md +19 -5
- package/openclaw/index.ts +144 -5
- package/openclaw.plugin.json +2 -8
- package/package.json +5 -2
- package/.next/server/chunks/[root-of-the-server]__18423bab._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__18423bab._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__35ec765d._.js +0 -13
- package/.next/server/chunks/[root-of-the-server]__35ec765d._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__3c92e5aa._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__3c92e5aa._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__813dd669._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__813dd669._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__b457b884._.js +0 -22
- package/.next/server/chunks/[root-of-the-server]__b457b884._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__c5e88cbb._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__c5e88cbb._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__da7df58d._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__da7df58d._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0a5cb3ca._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0a5cb3ca._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__177cec74._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__177cec74._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__4981f370._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__4981f370._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__51e26a01._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__51e26a01._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__6b6b7595._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__6b6b7595._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__8f9585b9._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__8f9585b9._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9e400864._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__9e400864._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__a6348eaa._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__a6348eaa._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ad4e8478._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__ad4e8478._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b5aa14b8._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__b5aa14b8._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b8998a21._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__b8998a21._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__e9bd9b71._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__e9bd9b71._.js.map +0 -1
- package/.next/server/chunks/ssr/_32beff4b._.js +0 -3
- package/.next/server/chunks/ssr/_32beff4b._.js.map +0 -1
- package/.next/server/chunks/ssr/_7f9e89d2._.js.map +0 -1
- package/.next/server/chunks/ssr/_8538617d._.js +0 -3
- package/.next/server/chunks/ssr/_8538617d._.js.map +0 -1
- package/.next/server/chunks/ssr/_a506fcf8._.js +0 -3
- package/.next/server/chunks/ssr/_a506fcf8._.js.map +0 -1
- package/.next/server/chunks/ssr/_deb7a691._.js.map +0 -1
- package/.next/server/chunks/ssr/d4b1c_modules_next_dist_server_route-modules_app-page_vendored_ssr_react-dom_6ef9314a.js +0 -3
- package/.next/server/chunks/ssr/d4b1c_modules_next_dist_server_route-modules_app-page_vendored_ssr_react-dom_6ef9314a.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_21685f67._.js +0 -3
- package/.next/server/chunks/ssr/src_app_21685f67._.js.map +0 -1
- package/.next/static/chunks/0edab8a24d59a626.js +0 -2
- package/.next/static/chunks/410dc851d0e3033d.js +0 -1
- package/.next/static/chunks/4e38b3f280ced64c.js +0 -1
- package/.next/static/chunks/4f2b8a07ace7e02b.js +0 -1
- package/.next/static/chunks/57ad5290f7e92ffd.css +0 -3
- package/.next/static/chunks/8a919077b73862da.js +0 -1
- package/.next/static/chunks/9906444fb1191bb4.js +0 -1
- package/.next/static/chunks/a625725b4cd85ea3.js +0 -1
- package/.next/static/chunks/ac32974713c57cb3.js +0 -1
- package/.next/static/chunks/bdb7ebd88ea13111.js +0 -1
- package/.next/static/chunks/bfcfbe145220d365.js +0 -1
- package/.next/static/chunks/c0d9f53d91cc65c5.js +0 -10
- package/.next/static/chunks/c0e2f959abc4cc13.js +0 -1
- package/.next/static/chunks/c822e53f79a492c7.js +0 -1
- package/.next/static/chunks/ce6b2024d13b4333.js +0 -1
- package/.next/static/chunks/d13249af74d111cf.js +0 -3
- package/.next/static/chunks/d16f64ca3a8ed208.js +0 -1
- package/.next/static/chunks/d7541a171116ec9c.js +0 -1
- package/.next/static/chunks/e03137fd069b1514.js +0 -1
- package/.next/static/chunks/e10faa9296c8b246.js +0 -1
- package/.next/static/chunks/ec24877f7b7f82c5.js +0 -3
- package/.next/static/chunks/ff3bbb5df40b2cc4.js +0 -1
- /package/.next/server/chunks/{[root-of-the-server]__be5f57b2._.js.map → [root-of-the-server]__17fa6089._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__74b80ca4._.js.map → [root-of-the-server]__5792c29e._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__c1b0d50e._.js.map → [root-of-the-server]__7194dfe2._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__17124952._.js.map → [root-of-the-server]__89f2190c._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__343776df._.js.map → [root-of-the-server]__bbed0e46._.js.map} +0 -0
- /package/.next/static/{F0PhVXEIb3LrF9XQem5EQ → bTCL-c1-1vqxgA-ZN8TUy}/_buildManifest.js +0 -0
- /package/.next/static/{F0PhVXEIb3LrF9XQem5EQ → bTCL-c1-1vqxgA-ZN8TUy}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{F0PhVXEIb3LrF9XQem5EQ → bTCL-c1-1vqxgA-ZN8TUy}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/errors.ts","../../../../src/components/GoalFormFields.tsx","../../../../src/lib/goals-client.ts","../../../../src/app/goals/%5Bid%5D/goal-editor.tsx"],"sourcesContent":["/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport type { GoalFormState, GoalStatus } from \"@/lib/goals-client\";\n\nexport type { GoalFormState };\n\n/** Wraps goal form content with error display and action buttons. */\nexport function GoalFormCard({\n children,\n error,\n actions,\n}: {\n children: ReactNode;\n error: string | null;\n actions: ReactNode;\n}) {\n return (\n <div className=\"ck-glass p-6 space-y-4\">\n {children}\n {error ? <div className=\"text-sm text-red-300\">{error}</div> : null}\n {actions}\n </div>\n );\n}\n\nconst inputClass =\n \"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 text-sm\";\n\ntype Props = {\n formState: GoalFormState;\n /** When provided, renders the ID field (for create flow). */\n idField?: { id: string; setId: (v: string) => void; suggestedId?: string };\n /** When provided, shows updated timestamp next to body label. */\n updatedAt?: string | null;\n /** Body textarea height override (e.g. 260 for new page). */\n bodyHeight?: string;\n};\n\nexport function GoalFormFields({\n formState,\n idField,\n updatedAt,\n bodyHeight = \"h-[320px]\",\n}: Props) {\n const { title, setTitle, status, setStatus, tagsRaw, setTagsRaw, teamsRaw, setTeamsRaw, body, setBody } = formState;\n const baseId = useId();\n const idInputId = `${baseId}-id`;\n const titleInputId = `${baseId}-title`;\n const statusSelectId = `${baseId}-status`;\n const teamsInputId = `${baseId}-teams`;\n const tagsInputId = `${baseId}-tags`;\n const bodyTextareaId = `${baseId}-body`;\n return (\n <>\n {idField ? (\n <div>\n <label htmlFor={idInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n ID\n </label>\n <input\n id={idInputId}\n className={`${inputClass} font-mono`}\n value={idField.id}\n onChange={(e) => idField.setId(e.target.value)}\n placeholder=\"increase-trial-activation\"\n aria-describedby={`${baseId}-id-hint`}\n />\n <div id={`${baseId}-id-hint`} className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Lowercase letters, numbers, hyphens. Stored as <code className=\"font-mono\">{idField.id || \"<id>\"}.md</code>\n .\n {idField.suggestedId && !idField.id.trim() ? (\n <>\n {\" \"}\n Suggested:{\" \"}\n <button type=\"button\" className=\"underline\" onClick={() => idField.setId(idField.suggestedId ?? \"\")}>\n {idField.suggestedId}\n </button>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <div>\n <label htmlFor={titleInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Title\n </label>\n <input\n id={titleInputId}\n className={inputClass}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={idField ? \"Increase trial activation\" : \"Goal title\"}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div>\n <label htmlFor={statusSelectId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Status\n </label>\n <select\n id={statusSelectId}\n className={inputClass}\n value={status}\n onChange={(e) => setStatus(e.target.value as GoalStatus)}\n aria-label=\"Goal status\"\n >\n <option value=\"planned\">Planned</option>\n <option value=\"active\">Active</option>\n <option value=\"done\">Done</option>\n </select>\n </div>\n <div>\n <label htmlFor={teamsInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Teams (comma-separated)\n </label>\n <input\n id={teamsInputId}\n className={inputClass}\n value={teamsRaw}\n onChange={(e) => setTeamsRaw(e.target.value)}\n placeholder=\"development-team, marketing-team\"\n />\n </div>\n <div>\n <label htmlFor={tagsInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Tags (comma-separated)\n </label>\n <input\n id={tagsInputId}\n className={inputClass}\n value={tagsRaw}\n onChange={(e) => setTagsRaw(e.target.value)}\n placeholder=\"onboarding, growth\"\n />\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between\">\n <label htmlFor={bodyTextareaId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Body (markdown)\n </label>\n {updatedAt != null ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {updatedAt ? `updated ${new Date(updatedAt).toLocaleString()}` : \"\"}\n </div>\n ) : null}\n </div>\n <textarea\n id={bodyTextareaId}\n className={`mt-1 ${bodyHeight} w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 font-mono text-sm`}\n value={body}\n onChange={(e) => setBody(e.target.value)}\n placeholder=\"Write the goal here…\"\n />\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\n\n/** Client-safe goal types and utils (no node deps). */\n\nexport type GoalStatus = \"planned\" | \"active\" | \"done\";\n\nexport type GoalFrontmatter = {\n id: string;\n title: string;\n status: GoalStatus;\n tags: string[];\n teams: string[];\n updatedAt: string;\n};\n\n/** Form state shape for GoalFormFields. */\nexport type GoalFormState = {\n title: string;\n setTitle: (v: string) => void;\n status: GoalStatus;\n setStatus: (v: GoalStatus) => void;\n tagsRaw: string;\n setTagsRaw: (v: string) => void;\n teamsRaw: string;\n setTeamsRaw: (v: string) => void;\n body: string;\n setBody: (v: string) => void;\n};\n\n/** Parses comma-separated string into trimmed non-empty array. */\nexport function parseCommaList(raw: string): string[] {\n return raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/** Shared form state for goal create/edit. Returns formState for GoalFormFields and parsed tags/teams. */\nexport function useGoalFormState(initial?: Partial<GoalFormState>): {\n formState: GoalFormState;\n tags: string[];\n teams: string[];\n} {\n const [title, setTitle] = useState(initial?.title ?? \"\");\n const [status, setStatus] = useState<GoalStatus>(initial?.status ?? \"planned\");\n const [tagsRaw, setTagsRaw] = useState(initial?.tagsRaw ?? \"\");\n const [teamsRaw, setTeamsRaw] = useState(initial?.teamsRaw ?? \"\");\n const [body, setBody] = useState(initial?.body ?? \"\");\n\n const formState: GoalFormState = useMemo(\n () => ({\n title,\n setTitle,\n status,\n setStatus,\n tagsRaw,\n setTagsRaw,\n teamsRaw,\n setTeamsRaw,\n body,\n setBody,\n }),\n [title, status, tagsRaw, teamsRaw, body]\n );\n\n const tags = useMemo(() => parseCommaList(tagsRaw), [tagsRaw]);\n const teams = useMemo(() => parseCommaList(teamsRaw), [teamsRaw]);\n\n return { formState, tags, teams };\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { GoalFormCard, GoalFormFields } from \"@/components/GoalFormFields\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { type GoalFrontmatter, type GoalStatus, useGoalFormState } from \"@/lib/goals-client\";\nimport { useRouter } from \"next/navigation\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport default function GoalEditor({ goalId }: { goalId: string }) {\n const router = useRouter();\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [updatedAt, setUpdatedAt] = useState<string | null>(null);\n\n const { formState, tags, teams } = useGoalFormState();\n const { setTitle, setStatus, setTagsRaw, setTeamsRaw, setBody } = formState;\n\n const loadGoal = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const data = await fetchJson<{ goal: GoalFrontmatter; body: string }>(\n `/api/goals/${encodeURIComponent(goalId)}`,\n { cache: \"no-store\" }\n );\n const g = data.goal;\n setTitle(g.title ?? \"\");\n setStatus((g.status as GoalStatus) ?? \"planned\");\n setTagsRaw((g.tags ?? []).join(\", \"));\n setTeamsRaw((g.teams ?? []).join(\", \"));\n setBody(data.body ?? \"\");\n setUpdatedAt(g.updatedAt ?? null);\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setLoading(false);\n }\n }, [goalId, setTitle, setStatus, setTagsRaw, setTeamsRaw, setBody]);\n\n useEffect(() => {\n void loadGoal();\n }, [loadGoal]);\n\n async function save() {\n setSaving(true);\n setError(null);\n try {\n const data = await fetchJson<{ goal: GoalFrontmatter }>(\n `/api/goals/${encodeURIComponent(goalId)}`,\n {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n title: formState.title,\n status: formState.status,\n tags,\n teams,\n body: formState.body,\n }),\n }\n );\n setUpdatedAt(data.goal.updatedAt ?? null);\n router.push(\"/goals\");\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function promoteToInbox() {\n setSaving(true);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goalId)}/promote`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({}),\n });\n await loadGoal();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function deleteThisGoal() {\n const ok = window.confirm(`Delete goal \\\"${goalId}\\\"? This will delete the markdown file.`);\n if (!ok) return;\n\n setSaving(true);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goalId)}`, { method: \"DELETE\" });\n router.push(\"/goals\");\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <Link href=\"/goals\" className=\"text-sm font-medium hover:underline\">\n ← Back\n </Link>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)] font-mono\">{goalId}</div>\n </div>\n\n <GoalFormCard\n error={error}\n actions={\n <div className=\"flex flex-wrap items-center gap-3\">\n <button\n onClick={() => void save()}\n disabled={saving || loading}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n <button\n onClick={() => void loadGoal()}\n disabled={saving}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm\"\n >\n Reload\n </button>\n <button\n onClick={() => void promoteToInbox()}\n disabled={saving || loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm font-medium\"\n >\n Promote to inbox\n </button>\n <button\n onClick={() => void deleteThisGoal()}\n disabled={saving || loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)]\"\n >\n Delete\n </button>\n </div>\n }\n >\n <GoalFormFields formState={formState} updatedAt={updatedAt} />\n </GoalFormCard>\n\n <div className=\"ck-glass p-6\">\n <div className=\"text-sm font-medium\">Preview</div>\n <pre className=\"mt-2 whitespace-pre-wrap break-words text-sm leading-6 text-[color:var(--ck-text-primary)]\">{formState.body}</pre>\n </div>\n\n {loading ? <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div> : null}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/errors.ts","../../../../src/components/GoalFormFields.tsx","../../../../src/lib/goals-client.ts","../../../../src/app/goals/%5Bid%5D/goal-editor.tsx"],"sourcesContent":["/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport type { GoalFormState, GoalStatus } from \"@/lib/goals-client\";\n\nexport type { GoalFormState };\n\n/** Wraps goal form content with error display and action buttons. */\nexport function GoalFormCard({\n children,\n error,\n actions,\n}: {\n children: ReactNode;\n error: string | null;\n actions: ReactNode;\n}) {\n return (\n <div className=\"ck-card p-6 space-y-4\">\n {children}\n {error ? <div className=\"text-sm text-red-300\">{error}</div> : null}\n {actions}\n </div>\n );\n}\n\nconst inputClass =\n \"mt-1 w-full rounded-lg border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 text-sm\";\n\ntype Props = {\n formState: GoalFormState;\n /** When provided, renders the ID field (for create flow). */\n idField?: { id: string; setId: (v: string) => void; suggestedId?: string };\n /** When provided, shows updated timestamp next to body label. */\n updatedAt?: string | null;\n /** Body textarea height override (e.g. 260 for new page). */\n bodyHeight?: string;\n};\n\nexport function GoalFormFields({\n formState,\n idField,\n updatedAt,\n bodyHeight = \"h-[320px]\",\n}: Props) {\n const { title, setTitle, status, setStatus, tagsRaw, setTagsRaw, teamsRaw, setTeamsRaw, body, setBody } = formState;\n const baseId = useId();\n const idInputId = `${baseId}-id`;\n const titleInputId = `${baseId}-title`;\n const statusSelectId = `${baseId}-status`;\n const teamsInputId = `${baseId}-teams`;\n const tagsInputId = `${baseId}-tags`;\n const bodyTextareaId = `${baseId}-body`;\n return (\n <>\n {idField ? (\n <div>\n <label htmlFor={idInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n ID\n </label>\n <input\n id={idInputId}\n className={`${inputClass} font-mono`}\n value={idField.id}\n onChange={(e) => idField.setId(e.target.value)}\n placeholder=\"increase-trial-activation\"\n aria-describedby={`${baseId}-id-hint`}\n />\n <div id={`${baseId}-id-hint`} className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Lowercase letters, numbers, hyphens. Stored as <code className=\"font-mono\">{idField.id || \"<id>\"}.md</code>\n .\n {idField.suggestedId && !idField.id.trim() ? (\n <>\n {\" \"}\n Suggested:{\" \"}\n <button type=\"button\" className=\"underline\" onClick={() => idField.setId(idField.suggestedId ?? \"\")}>\n {idField.suggestedId}\n </button>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <div>\n <label htmlFor={titleInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Title\n </label>\n <input\n id={titleInputId}\n className={inputClass}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={idField ? \"Increase trial activation\" : \"Goal title\"}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div>\n <label htmlFor={statusSelectId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Status\n </label>\n <select\n id={statusSelectId}\n className={inputClass}\n value={status}\n onChange={(e) => setStatus(e.target.value as GoalStatus)}\n aria-label=\"Goal status\"\n >\n <option value=\"planned\">Planned</option>\n <option value=\"active\">Active</option>\n <option value=\"done\">Done</option>\n </select>\n </div>\n <div>\n <label htmlFor={teamsInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Teams (comma-separated)\n </label>\n <input\n id={teamsInputId}\n className={inputClass}\n value={teamsRaw}\n onChange={(e) => setTeamsRaw(e.target.value)}\n placeholder=\"development-team, marketing-team\"\n />\n </div>\n <div>\n <label htmlFor={tagsInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Tags (comma-separated)\n </label>\n <input\n id={tagsInputId}\n className={inputClass}\n value={tagsRaw}\n onChange={(e) => setTagsRaw(e.target.value)}\n placeholder=\"onboarding, growth\"\n />\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between\">\n <label htmlFor={bodyTextareaId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Body (markdown)\n </label>\n {updatedAt != null ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {updatedAt ? `updated ${new Date(updatedAt).toLocaleString()}` : \"\"}\n </div>\n ) : null}\n </div>\n <textarea\n id={bodyTextareaId}\n className={`mt-1 ${bodyHeight} w-full rounded-lg border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 font-mono text-sm`}\n value={body}\n onChange={(e) => setBody(e.target.value)}\n placeholder=\"Write the goal here…\"\n />\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\n\n/** Client-safe goal types and utils (no node deps). */\n\nexport type GoalStatus = \"planned\" | \"active\" | \"done\";\n\nexport type GoalFrontmatter = {\n id: string;\n title: string;\n status: GoalStatus;\n tags: string[];\n teams: string[];\n updatedAt: string;\n};\n\n/** Form state shape for GoalFormFields. */\nexport type GoalFormState = {\n title: string;\n setTitle: (v: string) => void;\n status: GoalStatus;\n setStatus: (v: GoalStatus) => void;\n tagsRaw: string;\n setTagsRaw: (v: string) => void;\n teamsRaw: string;\n setTeamsRaw: (v: string) => void;\n body: string;\n setBody: (v: string) => void;\n};\n\n/** Parses comma-separated string into trimmed non-empty array. */\nexport function parseCommaList(raw: string): string[] {\n return raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/** Shared form state for goal create/edit. Returns formState for GoalFormFields and parsed tags/teams. */\nexport function useGoalFormState(initial?: Partial<GoalFormState>): {\n formState: GoalFormState;\n tags: string[];\n teams: string[];\n} {\n const [title, setTitle] = useState(initial?.title ?? \"\");\n const [status, setStatus] = useState<GoalStatus>(initial?.status ?? \"planned\");\n const [tagsRaw, setTagsRaw] = useState(initial?.tagsRaw ?? \"\");\n const [teamsRaw, setTeamsRaw] = useState(initial?.teamsRaw ?? \"\");\n const [body, setBody] = useState(initial?.body ?? \"\");\n\n const formState: GoalFormState = useMemo(\n () => ({\n title,\n setTitle,\n status,\n setStatus,\n tagsRaw,\n setTagsRaw,\n teamsRaw,\n setTeamsRaw,\n body,\n setBody,\n }),\n [title, status, tagsRaw, teamsRaw, body]\n );\n\n const tags = useMemo(() => parseCommaList(tagsRaw), [tagsRaw]);\n const teams = useMemo(() => parseCommaList(teamsRaw), [teamsRaw]);\n\n return { formState, tags, teams };\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { GoalFormCard, GoalFormFields } from \"@/components/GoalFormFields\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { type GoalFrontmatter, type GoalStatus, useGoalFormState } from \"@/lib/goals-client\";\nimport { useRouter } from \"next/navigation\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport default function GoalEditor({ goalId }: { goalId: string }) {\n const router = useRouter();\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [updatedAt, setUpdatedAt] = useState<string | null>(null);\n\n const { formState, tags, teams } = useGoalFormState();\n const { setTitle, setStatus, setTagsRaw, setTeamsRaw, setBody } = formState;\n\n const loadGoal = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const data = await fetchJson<{ goal: GoalFrontmatter; body: string }>(\n `/api/goals/${encodeURIComponent(goalId)}`,\n { cache: \"no-store\" }\n );\n const g = data.goal;\n setTitle(g.title ?? \"\");\n setStatus((g.status as GoalStatus) ?? \"planned\");\n setTagsRaw((g.tags ?? []).join(\", \"));\n setTeamsRaw((g.teams ?? []).join(\", \"));\n setBody(data.body ?? \"\");\n setUpdatedAt(g.updatedAt ?? null);\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setLoading(false);\n }\n }, [goalId, setTitle, setStatus, setTagsRaw, setTeamsRaw, setBody]);\n\n useEffect(() => {\n void loadGoal();\n }, [loadGoal]);\n\n async function save() {\n setSaving(true);\n setError(null);\n try {\n const data = await fetchJson<{ goal: GoalFrontmatter }>(\n `/api/goals/${encodeURIComponent(goalId)}`,\n {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n title: formState.title,\n status: formState.status,\n tags,\n teams,\n body: formState.body,\n }),\n }\n );\n setUpdatedAt(data.goal.updatedAt ?? null);\n router.push(\"/goals\");\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function promoteToInbox() {\n setSaving(true);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goalId)}/promote`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({}),\n });\n await loadGoal();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function deleteThisGoal() {\n const ok = window.confirm(`Delete goal \\\"${goalId}\\\"? This will delete the markdown file.`);\n if (!ok) return;\n\n setSaving(true);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goalId)}`, { method: \"DELETE\" });\n router.push(\"/goals\");\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <Link href=\"/goals\" className=\"text-sm font-medium hover:underline\">\n ← Back\n </Link>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)] font-mono\">{goalId}</div>\n </div>\n\n <GoalFormCard\n error={error}\n actions={\n <div className=\"flex flex-wrap items-center gap-3\">\n <button\n onClick={() => void save()}\n disabled={saving || loading}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n <button\n onClick={() => void loadGoal()}\n disabled={saving}\n className=\"rounded-lg border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm\"\n >\n Reload\n </button>\n <button\n onClick={() => void promoteToInbox()}\n disabled={saving || loading}\n className=\"rounded-lg border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm font-medium\"\n >\n Promote to inbox\n </button>\n <button\n onClick={() => void deleteThisGoal()}\n disabled={saving || loading}\n className=\"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)]\"\n >\n Delete\n </button>\n </div>\n }\n >\n <GoalFormFields formState={formState} updatedAt={updatedAt} />\n </GoalFormCard>\n\n <div className=\"ck-card p-6\">\n <div className=\"text-sm font-medium\">Preview</div>\n <pre className=\"mt-2 whitespace-pre-wrap break-words text-sm leading-6 text-[color:var(--ck-text-primary)]\">{formState.body}</pre>\n </div>\n\n {loading ? <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div> : null}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[48208,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(72131),e=a.i(20471);function f({agents:a,teamNames:f,appVersion:g}){let h=(0,e.useSelectedTeamId)()||"all",i=(0,d.useMemo)(()=>{let b=new Map;for(let c of a){let a=function(a){if(!a)return null;let b=a.split("/").filter(Boolean).find(a=>a.startsWith("workspace-"))??"";return b&&b.slice(10)||null}(c.workspace)??"personal";if("all"!==h&&a!==h)continue;let d=b.get(a)??[];d.push(c),b.set(a,d)}return Array.from(b.keys()).sort((a,b)=>"personal"===a?1:"personal"===b?-1:a.localeCompare(b)).map(a=>{let c,d,e="personal"===a?"Personal / Unassigned":(c=a.endsWith("-team")?a.slice(0,-5):a,f[a]||f[c]||((d=c.replace(/[-_]+/g," ").replace(/\s+/g," ").trim())?d.split(" ").map(a=>/^(ai|api|cli|ui|ux|sre|qa|devops)$/i.test(a)?a.toUpperCase():a.slice(0,1).toUpperCase()+a.slice(1)).join(" "):c));return{key:a,title:e,subtitle:"personal"===a?null:`workspace-${a}`,agents:(b.get(a)??[]).slice().sort((a,b)=>a.id.localeCompare(b.id)),isTeam:"personal"!==a}})},[a,h,f]);return(0,b.jsxs)("div",{className:"
|
|
1
|
+
module.exports=[48208,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(72131),e=a.i(20471);function f({agents:a,teamNames:f,appVersion:g}){let h=(0,e.useSelectedTeamId)()||"all",i=(0,d.useMemo)(()=>{let b=new Map;for(let c of a){let a=function(a){if(!a)return null;let b=a.split("/").filter(Boolean).find(a=>a.startsWith("workspace-"))??"";return b&&b.slice(10)||null}(c.workspace)??"personal";if("all"!==h&&a!==h)continue;let d=b.get(a)??[];d.push(c),b.set(a,d)}return Array.from(b.keys()).sort((a,b)=>"personal"===a?1:"personal"===b?-1:a.localeCompare(b)).map(a=>{let c,d,e="personal"===a?"Personal / Unassigned":(c=a.endsWith("-team")?a.slice(0,-5):a,f[a]||f[c]||((d=c.replace(/[-_]+/g," ").replace(/\s+/g," ").trim())?d.split(" ").map(a=>/^(ai|api|cli|ui|ux|sre|qa|devops)$/i.test(a)?a.toUpperCase():a.slice(0,1).toUpperCase()+a.slice(1)).join(" "):c));return{key:a,title:e,subtitle:"personal"===a?null:`workspace-${a}`,agents:(b.get(a)??[]).slice().sort((a,b)=>a.id.localeCompare(b.id)),isTeam:"personal"!==a}})},[a,h,f]);return(0,b.jsxs)("div",{className:"w-full",children:[(0,b.jsxs)("div",{className:"flex items-baseline justify-between gap-4",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-3xl font-bold tracking-tight",children:"Agents"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"Installed agents grouped by team workspace"})]}),(0,b.jsxs)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:[g,"-beta"]})]}),(0,b.jsx)("div",{className:"mt-6 space-y-8",children:i.map(a=>(0,b.jsxs)("section",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-4",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("h2",{className:"truncate text-lg font-semibold tracking-tight",children:a.title}),a.subtitle?(0,b.jsx)("div",{className:"mt-0.5 truncate text-xs font-mono text-[color:var(--ck-text-tertiary)]",children:a.subtitle}):null]}),a.isTeam?(0,b.jsx)(c.default,{href:`/teams/${encodeURIComponent(a.key)}`,className:"rounded-lg border border-[color:var(--ck-border-subtle)] bg-white/5 px-4 py-2 text-sm font-medium transition hover:bg-white/10",children:"Edit"}):null]}),(0,b.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",children:a.agents.map(a=>(0,b.jsxs)(c.default,{href:`/agents/${encodeURIComponent(a.id)}`,className:"ck-card block p-4 transition hover:border-[color:var(--ck-border-strong)]",children:[(0,b.jsx)("div",{className:"truncate font-medium",children:a.identityName||a.id}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[a.id,a.isDefault?" · default":""]}),a.model?(0,b.jsx)("div",{className:"mt-1 truncate text-xs text-[color:var(--ck-text-tertiary)]",children:a.model}):null]},a.id))})]},a.key))})]})}a.s(["default",()=>f])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_app_HomeClient_tsx_f9f7568d._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/HomeClient.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useMemo } from \"react\";\nimport { useSelectedTeamId } from \"@/lib/selected-team\";\nimport type { AgentListItem } from \"@/lib/agents\";\n\nfunction inferTeamIdFromWorkspace(workspace: string | undefined) {\n if (!workspace) return null;\n const parts = workspace.split(\"/\").filter(Boolean);\n // Team workspaces are typically ~/.openclaw/workspace-<teamId>/..., so the workspace- segment\n // is not always the last path component.\n const wsPart = parts.find((p) => p.startsWith(\"workspace-\")) ?? \"\";\n if (!wsPart) return null;\n const team = wsPart.slice(\"workspace-\".length);\n return team || null;\n}\n\nfunction normalizeTeamId(teamId: string) {\n // Support legacy workspaces that used a \"-team\" suffix.\n return teamId.endsWith(\"-team\") ? teamId.slice(0, -\"-team\".length) : teamId;\n}\n\nexport default function HomeClient({\n agents,\n teamNames,\n appVersion,\n}: {\n agents: AgentListItem[];\n teamNames: Record<string, string>;\n appVersion: string;\n}) {\n const selectedTeamId = useSelectedTeamId();\n const teamFilter = selectedTeamId || \"all\";\n\n const grouped = useMemo(() => {\n const groups = new Map<string, AgentListItem[]>();\n\n function titleCaseId(id: string) {\n const s = id\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!s) return id;\n return s\n .split(\" \")\n .map((w) => {\n if (/^(ai|api|cli|ui|ux|sre|qa|devops)$/i.test(w)) return w.toUpperCase();\n return w.slice(0, 1).toUpperCase() + w.slice(1);\n })\n .join(\" \");\n }\n\n function displayNameFor(teamId: string) {\n const normalized = normalizeTeamId(teamId);\n return teamNames[teamId] || teamNames[normalized] || titleCaseId(normalized);\n }\n\n for (const a of agents) {\n const teamId = inferTeamIdFromWorkspace(a.workspace) ?? \"personal\";\n if (teamFilter !== \"all\" && teamId !== teamFilter) continue;\n const key = teamId;\n const list = groups.get(key) ?? [];\n list.push(a);\n groups.set(key, list);\n }\n\n // Stable ordering: teams first (alphabetical), then personal.\n const keys = Array.from(groups.keys()).sort((a, b) => {\n if (a === \"personal\") return 1;\n if (b === \"personal\") return -1;\n return a.localeCompare(b);\n });\n\n return keys.map((k) => {\n const display = k === \"personal\" ? \"Personal / Unassigned\" : displayNameFor(k);\n return {\n key: k,\n title: display,\n // Keep the raw id visible, but deemphasize it.\n subtitle: k === \"personal\" ? null : `workspace-${k}`,\n agents: (groups.get(k) ?? []).slice().sort((a, b) => a.id.localeCompare(b.id)),\n isTeam: k !== \"personal\",\n };\n });\n }, [agents, teamFilter, teamNames]);\n\n return (\n <div className=\"ck-glass w-full p-6 sm:p-8\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h1 className=\"text-3xl font-semibold tracking-tight\">\n ClawKitchen{\" \"}\n <span className=\"text-sm align-middle text-[color:var(--ck-text-secondary)]\">({appVersion}-beta)</span>\n </h1>\n <p className=\"mt-2 max-w-prose text-[color:var(--ck-text-secondary)]\">\n Installed agents on this machine, grouped by team workspace when available.\n </p>\n </div>\n\n <div className=\"flex flex-col items-start gap-2 sm:items-end\">\n <Link\n href=\"/recipes?createCustomTeam=1\"\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]\"\n >\n Create team\n </Link>\n <Link\n href=\"/recipes\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Recipes\n </Link>\n <Link\n href=\"/tickets\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Tickets\n </Link>\n <Link\n href=\"/channels\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Channels / Bindings\n </Link>\n <Link\n href=\"/settings\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Settings\n </Link>\n </div>\n </div>\n\n\n \n\n <div className=\"mt-8 space-y-8\">\n {grouped.map((g) => (\n <section key={g.key}>\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">{g.title}</h2>\n {g.subtitle ? (\n <div className=\"mt-0.5 truncate text-xs text-[color:var(--ck-text-secondary)]\">{g.subtitle}</div>\n ) : null}\n </div>\n {g.isTeam ? (\n <Link\n href={`/teams/${encodeURIComponent(g.key)}`}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]\"\n >\n Edit\n </Link>\n ) : null}\n </div>\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {g.agents.map((a) => (\n <Link\n key={a.id}\n href={`/agents/${encodeURIComponent(a.id)}`}\n className=\"ck-glass block px-4 py-3 transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]\"\n >\n <div className=\"truncate font-medium text-[color:var(--ck-text-primary)]\">\n {a.identityName || a.id}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {a.id}\n {a.isDefault ? \" • default\" : \"\"}\n </div>\n {a.model ? (\n <div className=\"mt-1 truncate text-xs text-[color:var(--ck-text-tertiary)]\">{a.model}</div>\n ) : null}\n </Link>\n ))}\n </div>\n </section>\n ))}\n </div>\n\n <p className=\"mt-10 text-xs text-[color:var(--ck-text-tertiary)]\">\n Note: Team detection currently uses the convention <code>~/.openclaw/workspace-<teamId></code>.\n </p>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/HomeClient.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useMemo } from \"react\";\nimport { useSelectedTeamId } from \"@/lib/selected-team\";\nimport type { AgentListItem } from \"@/lib/agents\";\n\nfunction inferTeamIdFromWorkspace(workspace: string | undefined) {\n if (!workspace) return null;\n const parts = workspace.split(\"/\").filter(Boolean);\n const wsPart = parts.find((p) => p.startsWith(\"workspace-\")) ?? \"\";\n if (!wsPart) return null;\n const team = wsPart.slice(\"workspace-\".length);\n return team || null;\n}\n\nfunction normalizeTeamId(teamId: string) {\n return teamId.endsWith(\"-team\") ? teamId.slice(0, -\"-team\".length) : teamId;\n}\n\nexport default function HomeClient({\n agents,\n teamNames,\n appVersion,\n}: {\n agents: AgentListItem[];\n teamNames: Record<string, string>;\n appVersion: string;\n}) {\n const selectedTeamId = useSelectedTeamId();\n const teamFilter = selectedTeamId || \"all\";\n\n const grouped = useMemo(() => {\n const groups = new Map<string, AgentListItem[]>();\n\n function titleCaseId(id: string) {\n const s = id.replace(/[-_]+/g, \" \").replace(/\\s+/g, \" \").trim();\n if (!s) return id;\n return s\n .split(\" \")\n .map((w) => {\n if (/^(ai|api|cli|ui|ux|sre|qa|devops)$/i.test(w)) return w.toUpperCase();\n return w.slice(0, 1).toUpperCase() + w.slice(1);\n })\n .join(\" \");\n }\n\n function displayNameFor(teamId: string) {\n const normalized = normalizeTeamId(teamId);\n return teamNames[teamId] || teamNames[normalized] || titleCaseId(normalized);\n }\n\n for (const a of agents) {\n const teamId = inferTeamIdFromWorkspace(a.workspace) ?? \"personal\";\n if (teamFilter !== \"all\" && teamId !== teamFilter) continue;\n const key = teamId;\n const list = groups.get(key) ?? [];\n list.push(a);\n groups.set(key, list);\n }\n\n const keys = Array.from(groups.keys()).sort((a, b) => {\n if (a === \"personal\") return 1;\n if (b === \"personal\") return -1;\n return a.localeCompare(b);\n });\n\n return keys.map((k) => {\n const display = k === \"personal\" ? \"Personal / Unassigned\" : displayNameFor(k);\n return {\n key: k,\n title: display,\n subtitle: k === \"personal\" ? null : `workspace-${k}`,\n agents: (groups.get(k) ?? []).slice().sort((a, b) => a.id.localeCompare(b.id)),\n isTeam: k !== \"personal\",\n };\n });\n }, [agents, teamFilter, teamNames]);\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-baseline justify-between gap-4\">\n <div>\n <h1 className=\"text-3xl font-bold tracking-tight\">\n Agents\n </h1>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n Installed agents grouped by team workspace\n </p>\n </div>\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{appVersion}-beta</span>\n </div>\n\n <div className=\"mt-6 space-y-8\">\n {grouped.map((g) => (\n <section key={g.key}>\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-lg font-semibold tracking-tight\">{g.title}</h2>\n {g.subtitle ? (\n <div className=\"mt-0.5 truncate text-xs font-mono text-[color:var(--ck-text-tertiary)]\">{g.subtitle}</div>\n ) : null}\n </div>\n {g.isTeam ? (\n <Link\n href={`/teams/${encodeURIComponent(g.key)}`}\n className=\"rounded-lg border border-[color:var(--ck-border-subtle)] bg-white/5 px-4 py-2 text-sm font-medium transition hover:bg-white/10\"\n >\n Edit\n </Link>\n ) : null}\n </div>\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {g.agents.map((a) => (\n <Link\n key={a.id}\n href={`/agents/${encodeURIComponent(a.id)}`}\n className=\"ck-card block p-4 transition hover:border-[color:var(--ck-border-strong)]\"\n >\n <div className=\"truncate font-medium\">\n {a.identityName || a.id}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {a.id}\n {a.isDefault ? \" · default\" : \"\"}\n </div>\n {a.model ? (\n <div className=\"mt-1 truncate text-xs text-[color:var(--ck-text-tertiary)]\">{a.model}</div>\n ) : null}\n </Link>\n ))}\n </div>\n </section>\n ))}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[98262,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(50944),e=a.i(74621),f=a.i(51200),g=a.i(88764),h=a.i(60791);function i({name:a,emoji:c,theme:d,avatar:e,saving:f,returnTo:g,onNameChange:h,onEmojiChange:i,onThemeChange:j,onAvatarChange:k,onSave:l,router:m}){return(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:a,onChange:a=>h(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:c,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:d,onChange:a=>j(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:e,onChange:a=>k(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:f,onClick:l,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:f?"Saving…":"Save"}),g?(0,b.jsx)("button",{disabled:f,onClick:async()=>{await l(),m.push(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)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50",children:"Save & return"}):null]})]})}function j({model:a,saving:c,onModelChange:d,onSave:e}){return(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:a,onChange:a=>d(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:c,onClick:e,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:c?"Saving…":"Save config"})})]})}function k({agentId:a,skillsList:c,availableSkills:d,skillsLoading:e,selectedSkill:f,installingSkill:g,skillError:h,skillMsg:i,onSelectedSkillChange:j,onInstallSkill:k}){return(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.jsxs)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]",children:[e&&(0,b.jsx)("li",{children:"Loading…"}),!e&&c.length>0&&c.map(a=>(0,b.jsx)("li",{children:a},a)),!e&&!c.length&&(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:f,onChange:a=>j(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:g||!d.length,children:d.length?d.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:g||!f,onClick:()=>void k(),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:g?"Adding…":"Add"})]}),h&&(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:h}),!h&&i&&(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:i}),(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"]}),"."]})]})]})}function l({agentFiles:a,agentFilesLoading:c,showOptionalFiles:d,fileName:e,fileContent:f,loadingFile:g,saving:i,fileError:j,onShowOptionalChange:k,onLoadFile:l,onFileContentChange:m,onSaveFile:n,onCreateMissingFile:o}){return(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsx)(h.FileListWithOptionalToggle,{title:"Agent files",files:a,loading:c,showOptionalFiles:d,onShowOptionalChange:k,selectedFileName:e,onSelectFile:l,renderItemExtra:a=>a.missing?(0,b.jsx)("button",{type:"button",disabled:i,onClick:()=>void o(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}),(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: ",e]}),(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[g?(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Loading…"}):null,(0,b.jsx)("button",{disabled:i,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)] disabled:opacity-50",children:i?"Saving…":"Save file"})]})]}),j?(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:j}):null,(0,b.jsx)("textarea",{value:f,onChange:a=>m(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})]})]})}async function m(a,b){b.setAgentFilesLoading(!0),b.setSkillsLoading(!0);try{let[c,d,e]=await (0,f.fetchAll)([`/api/agents/files?agentId=${encodeURIComponent(a)}`,`/api/agents/skills?agentId=${encodeURIComponent(a)}`,"/api/skills/available"]),g=[];try{let a=await c.json();if(c.ok&&a.ok){let c=Array.isArray(a.files)?a.files:[];b.setAgentFiles(c.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 d.json();d.ok&&a.ok&&(g=Array.isArray(a.skills)?a.skills:[],b.setSkillsList(g))}catch{}try{let a=await e.json();if(e.ok&&a.ok){let c=Array.isArray(a.skills)?a.skills:[];b.setAvailableSkills(c);let d=c.find(a=>!g.includes(a));b.setSelectedSkill(d??c[0]??"")}}catch{}}finally{b.setAgentFilesLoading(!1),b.setSkillsLoading(!1)}}function n({agentId:a,returnTo:h}){let n=(0,d.useRouter)(),[o,p]=(0,c.useState)(null),[q,r]=(0,c.useState)(!0),[s,t]=(0,c.useState)(!1),[u,v]=(0,c.useState)(!1),[w,x]=(0,c.useState)(""),[y,z]=(0,c.useState)(""),[A,B]=(0,c.useState)(""),[C,D]=(0,c.useState)(""),[E,F]=(0,c.useState)(!1),[G,H]=(0,c.useState)(!1),[I,J]=(0,c.useState)(null),[K,L]=(0,c.useState)("identity"),[M,N]=(0,c.useState)(""),[O,P]=(0,c.useState)(""),[Q,R]=(0,c.useState)(""),[S,T]=(0,c.useState)(""),[U,V]=(0,c.useState)(""),[W,X]=(0,c.useState)([]),[Y,Z]=(0,c.useState)([]),[$,_]=(0,c.useState)(!1),[aa,ab]=(0,c.useState)(""),[ac,ad]=(0,c.useState)(!1),[ae,af]=(0,c.useState)([]),[ag,ah]=(0,c.useState)(!1),[ai,aj]=(0,c.useState)(!1),[ak,al]=(0,c.useState)("SOUL.md"),[am,an]=(0,c.useState)(""),ao=a.includes("-")?a.split("-").slice(0,-1).join("-"):"";async function ap(a){t(!0),x("");try{let b=await a();x(b)}catch(a){x((0,e.errorMessage)(a))}finally{t(!1)}}async function aq(){await ap(async()=>(await (0,f.fetchJson)("/api/agents/identity",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:M,emoji:O,theme:Q,avatar:S})}),"Saved identity via openclaw agents set-identity"))}async function ar(){await ap(async()=>(await (0,f.fetchJson)("/api/agents/update",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,patch:{model:U}})}),"Saved agent config (model) and restarted gateway"))}async function as(b){al(b),an(""),v(!0),z("");try{let c=await (0,f.fetchJson)(`/api/agents/file?agentId=${encodeURIComponent(a)}&name=${encodeURIComponent(b)}`,{cache:"no-store"});if(!c.ok)throw Error("Failed to load file");an(String(c.content??""))}catch(a){z((0,e.errorMessage)(a))}finally{v(!1)}}async function at(){t(!0),z("");try{if(!(await (0,f.fetchJson)("/api/agents/file",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:ak,content:am})})).ok)throw Error("Failed to save file");try{let b=await (0,f.fetchJson)(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"});b.ok&&Array.isArray(b.files)&&af(b.files)}catch{}}catch(a){z((0,e.errorMessage)(a))}finally{t(!1)}}async function au(a){al(a),z(""),an(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 at()}async function av(){H(!0),J(null),x("");try{await (0,f.fetchJson)(`/api/agents/${encodeURIComponent(a)}`,{method:"DELETE"}),window.location.href="/"}catch(a){J((0,e.errorMessage)(a)),H(!1)}}return(0,c.useEffect)(()=>{(async()=>{r(!0),x("");try{let b=await (0,f.fetchJson)("/api/agents",{cache:"no-store"}),c=(Array.isArray(b.agents)?b.agents:[]).find(b=>b.id===a)??null;p(c),N(c?.identityName??""),V(c?.model??""),r(!1),m(a,{setAgentFiles:af,setSkillsList:X,setAvailableSkills:Z,setSelectedSkill:ab,setAgentFilesLoading:ah,setSkillsLoading:_})}catch(a){x((0,e.errorMessage)(a))}finally{r(!1)}})()},[a]),(0,c.useEffect)(()=>{if("files"!==K||!ae.length)return;let a=ae.some(a=>a.name===ak),b=ae[0]?.name,c=a?ak:b;c&&(c!==ak&&(al(c),an("")),am||as(c))},[K,a,ae.length]),q?(0,b.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Loading…"}):o?(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:[o.id,o.isDefault?" • default":"",o.model?` • ${o.model}`:""]})]}),(0,b.jsx)("button",{type:"button",disabled:s,onClick:()=>{J(null),F(!0)},className:"rounded-[var(--ck-radius-sm)] border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-50",children:"Delete agent"})]}),o.workspace?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Workspace: ",o.workspace]}):null,ao?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Team: ",ao]}):null,w?(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:w}):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:()=>L(a.id),className:K===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"===K&&(0,b.jsx)(i,{name:M,emoji:O,theme:Q,avatar:S,saving:s,returnTo:h,onNameChange:N,onEmojiChange:P,onThemeChange:R,onAvatarChange:T,onSave:aq,router:n}),"config"===K&&(0,b.jsx)(j,{model:U,saving:s,onModelChange:V,onSave:ar}),"skills"===K&&(0,b.jsx)(k,{agentId:a,skillsList:W,availableSkills:Y,skillsLoading:$,selectedSkill:aa,installingSkill:ac,skillError:C,skillMsg:A,onSelectedSkillChange:ab,onInstallSkill:async()=>{ad(!0),B(""),D("");try{await (0,f.fetchJson)("/api/agents/skills/install",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,skill:aa})}),B(`Installed skill: ${aa}`);try{let b=await (0,f.fetchJson)(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"});b.ok&&Array.isArray(b.skills)&&X(b.skills)}catch{}}catch(a){D((0,e.errorMessage)(a))}finally{ad(!1)}}}),"files"===K&&(0,b.jsx)(l,{agentFiles:ae,agentFilesLoading:ag,showOptionalFiles:ai,fileName:ak,fileContent:am,loadingFile:u,saving:s,fileError:y,onShowOptionalChange:aj,onLoadFile:as,onFileContentChange:an,onSaveFile:at,onCreateMissingFile:au})]}),(0,b.jsx)(g.DeleteAgentModal,{open:E,agentId:a,busy:G,error:I,onClose:()=>F(!1),onConfirm:()=>void av()})]}):(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:["Agent not found: ",a]})}a.s(["default",()=>n],98262)}];
|
|
1
|
+
module.exports=[98262,60791,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(50944),e=a.i(74621),f=a.i(51200),g=a.i(88764);function h({title:a,files:c,loading:d,showOptionalFiles:e,onShowOptionalChange:f,selectedFileName:g,onSelectFile:h,renderItemExtra:i}){let j=e?c:c.filter(a=>a.required||!a.missing);return(0,b.jsxs)("div",{className:"ck-card 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:a}),(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:e,onChange:a=>f(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:[d?(0,b.jsx)("li",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}):null,j.map(a=>{var c;let d;return(0,b.jsx)("li",{children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsxs)("button",{type:"button",onClick:()=>h(a.name),className:(c=a.name,d="w-full rounded-lg px-3 py-2 text-left text-sm",g===c?`${d} bg-white/10 text-[color:var(--ck-text-primary)]`:`${d} 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]}),i?.(a)]})},a.name)})]})]})}function i({name:a,emoji:c,theme:d,avatar:e,saving:f,returnTo:g,onNameChange:h,onEmojiChange:i,onThemeChange:j,onAvatarChange:k,onSave:l,router:m}){return(0,b.jsxs)("div",{className:"ck-card 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:a,onChange:a=>h(a.target.value),className:"mt-1 w-full rounded-lg border border-white/10 bg-white/5 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:c,onChange:a=>i(a.target.value),placeholder:"🦞",className:"mt-1 w-full rounded-lg border border-white/10 bg-white/5 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:d,onChange:a=>j(a.target.value),placeholder:"warm, sharp, calm",className:"mt-1 w-full rounded-lg border border-white/10 bg-white/5 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:e,onChange:a=>k(a.target.value),placeholder:"avatars/openclaw.png",className:"mt-1 w-full rounded-lg border border-white/10 bg-white/5 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:f,onClick:l,className:"rounded-lg 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:f?"Saving…":"Save"}),g?(0,b.jsx)("button",{disabled:f,onClick:async()=>{await l(),m.push(g)},className:"rounded-lg 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]})]})}function j({model:a,saving:c,onModelChange:d,onSave:e}){return(0,b.jsxs)("div",{className:"ck-card 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:a,onChange:a=>d(a.target.value),placeholder:"openai/gpt-5.2",className:"mt-1 w-full rounded-lg border border-white/10 bg-white/5 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:c,onClick:e,className:"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:c?"Saving…":"Save config"})})]})}function k({agentId:a,skillsList:c,availableSkills:d,skillsLoading:e,selectedSkill:f,installingSkill:g,skillError:h,skillMsg:i,onSelectedSkillChange:j,onInstallSkill:k}){return(0,b.jsxs)("div",{className:"ck-card 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.jsxs)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]",children:[e&&(0,b.jsx)("li",{children:"Loading…"}),!e&&c.length>0&&c.map(a=>(0,b.jsx)("li",{children:a},a)),!e&&!c.length&&(0,b.jsx)("li",{children:"None installed."})]})]}),(0,b.jsxs)("div",{className:"mt-5 rounded-lg border border-white/10 bg-white/5 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:f,onChange:a=>j(a.target.value),className:"w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",disabled:g||!d.length,children:d.length?d.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:g||!f,onClick:()=>void k(),className:"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:g?"Adding…":"Add"})]}),h&&(0,b.jsx)("div",{className:"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:h}),!h&&i&&(0,b.jsx)("div",{className:"mt-3 rounded-lg border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100",children:i}),(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"]}),"."]})]})]})}function l({agentFiles:a,agentFilesLoading:c,showOptionalFiles:d,fileName:e,fileContent:f,loadingFile:g,saving:i,fileError:j,onShowOptionalChange:k,onLoadFile:l,onFileContentChange:m,onSaveFile:n,onCreateMissingFile:o}){return(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsx)(h,{title:"Agent files",files:a,loading:c,showOptionalFiles:d,onShowOptionalChange:k,selectedFileName:e,onSelectFile:l,renderItemExtra:a=>a.missing?(0,b.jsx)("button",{type:"button",disabled:i,onClick:()=>void o(a.name),className:"shrink-0 rounded-lg 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}),(0,b.jsxs)("div",{className:"ck-card 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: ",e]}),(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[g?(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Loading…"}):null,(0,b.jsx)("button",{disabled:i,onClick:n,className:"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:i?"Saving…":"Save file"})]})]}),j?(0,b.jsx)("div",{className:"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:j}):null,(0,b.jsx)("textarea",{value:f,onChange:a=>m(a.target.value),className:"mt-3 h-[55vh] w-full resize-none rounded-lg border border-white/10 bg-white/5 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]",spellCheck:!1})]})]})}async function m(a,b){b.setAgentFilesLoading(!0),b.setSkillsLoading(!0);try{let[c,d,e]=await (0,f.fetchAll)([`/api/agents/files?agentId=${encodeURIComponent(a)}`,`/api/agents/skills?agentId=${encodeURIComponent(a)}`,"/api/skills/available"]),g=[];try{let a=await c.json();if(c.ok&&a.ok){let c=Array.isArray(a.files)?a.files:[];b.setAgentFiles(c.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 d.json();d.ok&&a.ok&&(g=Array.isArray(a.skills)?a.skills:[],b.setSkillsList(g))}catch{}try{let a=await e.json();if(e.ok&&a.ok){let c=Array.isArray(a.skills)?a.skills:[];b.setAvailableSkills(c);let d=c.find(a=>!g.includes(a));b.setSelectedSkill(d??c[0]??"")}}catch{}}finally{b.setAgentFilesLoading(!1),b.setSkillsLoading(!1)}}function n({agentId:a,returnTo:h,onClose:n}){let o=(0,d.useRouter)(),[p,q]=(0,c.useState)(null),[r,s]=(0,c.useState)(!0),[t,u]=(0,c.useState)(!1),[v,w]=(0,c.useState)(!1),[x,y]=(0,c.useState)(""),[z,A]=(0,c.useState)(""),[B,C]=(0,c.useState)(""),[D,E]=(0,c.useState)(""),[F,G]=(0,c.useState)(!1),[H,I]=(0,c.useState)(!1),[J,K]=(0,c.useState)(null),[L,M]=(0,c.useState)("identity"),[N,O]=(0,c.useState)(""),[P,Q]=(0,c.useState)(""),[R,S]=(0,c.useState)(""),[T,U]=(0,c.useState)(""),[V,W]=(0,c.useState)(""),[X,Y]=(0,c.useState)([]),[Z,$]=(0,c.useState)([]),[_,aa]=(0,c.useState)(!1),[ab,ac]=(0,c.useState)(""),[ad,ae]=(0,c.useState)(!1),[af,ag]=(0,c.useState)([]),[ah,ai]=(0,c.useState)(!1),[aj,ak]=(0,c.useState)(!1),[al,am]=(0,c.useState)("SOUL.md"),[an,ao]=(0,c.useState)(""),ap=a.includes("-")?a.split("-").slice(0,-1).join("-"):"";async function aq(a){u(!0),y("");try{let b=await a();y(b)}catch(a){y((0,e.errorMessage)(a))}finally{u(!1)}}async function ar(){await aq(async()=>(await (0,f.fetchJson)("/api/agents/identity",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:N,emoji:P,theme:R,avatar:T})}),"Saved identity via openclaw agents set-identity"))}async function as(){await aq(async()=>(await (0,f.fetchJson)("/api/agents/update",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,patch:{model:V}})}),"Saved agent config (model) and restarted gateway"))}async function at(b){am(b),ao(""),w(!0),A("");try{let c=await (0,f.fetchJson)(`/api/agents/file?agentId=${encodeURIComponent(a)}&name=${encodeURIComponent(b)}`,{cache:"no-store"});if(!c.ok)throw Error("Failed to load file");ao(String(c.content??""))}catch(a){A((0,e.errorMessage)(a))}finally{w(!1)}}async function au(){u(!0),A("");try{if(!(await (0,f.fetchJson)("/api/agents/file",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:al,content:an})})).ok)throw Error("Failed to save file");try{let b=await (0,f.fetchJson)(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"});b.ok&&Array.isArray(b.files)&&ag(b.files)}catch{}}catch(a){A((0,e.errorMessage)(a))}finally{u(!1)}}async function av(a){am(a),A(""),ao(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 au()}async function aw(){I(!0),K(null),y("");try{await (0,f.fetchJson)(`/api/agents/${encodeURIComponent(a)}`,{method:"DELETE"}),window.location.href="/"}catch(a){K((0,e.errorMessage)(a)),I(!1)}}return(0,c.useEffect)(()=>{(async()=>{s(!0),y("");try{let b=await (0,f.fetchJson)("/api/agents",{cache:"no-store"}),c=(Array.isArray(b.agents)?b.agents:[]).find(b=>b.id===a)??null;q(c),O(c?.identityName??""),W(c?.model??""),s(!1),m(a,{setAgentFiles:ag,setSkillsList:Y,setAvailableSkills:$,setSelectedSkill:ac,setAgentFilesLoading:ai,setSkillsLoading:aa})}catch(a){y((0,e.errorMessage)(a))}finally{s(!1)}})()},[a]),(0,c.useEffect)(()=>{if("files"!==L||!af.length)return;let a=af.some(a=>a.name===al),b=af[0]?.name,c=a?al:b;c&&(c!==al&&(am(c),ao("")),an||at(c))},[L,a,af.length]),r?(0,b.jsx)("div",{className:"w-full",children:"Loading…"}):p?(0,b.jsxs)("div",{className:"w-full",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[n?(0,b.jsx)("button",{type:"button",onClick:n,className:"text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]",title:"Close",children:(0,b.jsx)("svg",{viewBox:"0 0 24 24",className:"h-5 w-5",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",children:(0,b.jsx)("path",{d:"M18 6 6 18M6 6l12 12"})})}):null,(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:p.identityName||p.id}),(0,b.jsxs)("p",{className:"mt-1 text-sm font-mono text-[color:var(--ck-text-tertiary)]",children:[p.id,p.isDefault?" · default":"",p.model?` \xb7 ${p.model}`:""]})]})]}),(0,b.jsx)("button",{type:"button",disabled:t,onClick:()=>{K(null),G(!0)},className:"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-50",children:"Delete agent"})]}),p.workspace?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Workspace: ",p.workspace]}):null,ap?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Team: ",ap]}):null,x?(0,b.jsx)("div",{className:"mt-4 rounded-lg border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]",children:x}):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:()=>M(a.id),className:L===a.id?"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]":"rounded-lg 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"===L&&(0,b.jsx)(i,{name:N,emoji:P,theme:R,avatar:T,saving:t,returnTo:h,onNameChange:O,onEmojiChange:Q,onThemeChange:S,onAvatarChange:U,onSave:ar,router:o}),"config"===L&&(0,b.jsx)(j,{model:V,saving:t,onModelChange:W,onSave:as}),"skills"===L&&(0,b.jsx)(k,{agentId:a,skillsList:X,availableSkills:Z,skillsLoading:_,selectedSkill:ab,installingSkill:ad,skillError:D,skillMsg:B,onSelectedSkillChange:ac,onInstallSkill:async()=>{ae(!0),C(""),E("");try{await (0,f.fetchJson)("/api/agents/skills/install",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,skill:ab})}),C(`Installed skill: ${ab}`);try{let b=await (0,f.fetchJson)(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"});b.ok&&Array.isArray(b.skills)&&Y(b.skills)}catch{}}catch(a){E((0,e.errorMessage)(a))}finally{ae(!1)}}}),"files"===L&&(0,b.jsx)(l,{agentFiles:af,agentFilesLoading:ah,showOptionalFiles:aj,fileName:al,fileContent:an,loadingFile:v,saving:t,fileError:z,onShowOptionalChange:ak,onLoadFile:at,onFileContentChange:ao,onSaveFile:au,onCreateMissingFile:av})]}),(0,b.jsx)(g.DeleteAgentModal,{open:F,agentId:a,busy:H,error:J,onClose:()=>G(!1),onConfirm:()=>void aw()})]}):(0,b.jsxs)("div",{className:"w-full",children:["Agent not found: ",a]})}a.s(["FileListWithOptionalToggle",()=>h],60791),a.s(["default",()=>n],98262)}];
|
|
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","../../../../src/app/agents/%5BagentId%5D/agent-editor-tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchAll, fetchJson } from \"@/lib/fetch-json\";\nimport { DeleteAgentModal } from \"@/components/delete-modals\";\nimport { IdentityTab, ConfigTab, SkillsTab, FilesTab } from \"./agent-editor-tabs\";\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\nasync function loadAgentFilesAndSkills(\n agentId: string,\n setters: {\n setAgentFiles: (f: Array<FileEntry & { required?: boolean; rationale?: string }>) => void;\n setSkillsList: (s: string[]) => void;\n setAvailableSkills: (s: string[]) => void;\n setSelectedSkill: (s: string) => void;\n setAgentFilesLoading: (v: boolean) => void;\n setSkillsLoading: (v: boolean) => void;\n }\n): Promise<void> {\n setters.setAgentFilesLoading(true);\n setters.setSkillsLoading(true);\n try {\n const [filesRes, skillsRes, availableSkillsRes] = await fetchAll([\n `/api/agents/files?agentId=${encodeURIComponent(agentId)}`,\n `/api/agents/skills?agentId=${encodeURIComponent(agentId)}`,\n \"/api/skills/available\",\n ]);\n\n let installedSkills: string[] = [];\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 setters.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 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 setters.setSkillsList(installedSkills);\n }\n } catch {\n // ignore\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 setters.setAvailableSkills(list);\n const first = list.find((s) => !installedSkills.includes(s));\n setters.setSelectedSkill(first ?? list[0] ?? \"\");\n }\n } catch {\n // ignore\n }\n } finally {\n setters.setAgentFilesLoading(false);\n setters.setSkillsLoading(false);\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 agentsJson = await fetchJson<{ agents?: unknown[] }>(\"/api/agents\", { cache: \"no-store\" });\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 setLoading(false);\n\n void loadAgentFilesAndSkills(agentId, {\n setAgentFiles,\n setSkillsList,\n setAvailableSkills,\n setSelectedSkill,\n setAgentFilesLoading,\n setSkillsLoading,\n });\n } catch (e: unknown) {\n setPageMsg(errorMessage(e));\n } finally {\n setLoading(false);\n }\n })();\n }, [agentId]);\n\n async function withSaveFeedback(\n fn: () => Promise<string>,\n ) {\n setSaving(true);\n setPageMsg(\"\");\n try {\n const msg = await fn();\n setPageMsg(msg);\n } catch (e: unknown) {\n setPageMsg(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveIdentity() {\n await withSaveFeedback(async () => {\n await fetchJson(\"/api/agents/identity\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name, emoji, theme, avatar }),\n });\n return \"Saved identity via openclaw agents set-identity\";\n });\n }\n\n async function onSaveConfig() {\n await withSaveFeedback(async () => {\n await fetchJson(\"/api/agents/update\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, patch: { model } }),\n });\n return \"Saved agent config (model) and restarted gateway\";\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 json = await fetchJson<{ ok?: boolean; content?: string }>(\n `/api/agents/file?agentId=${encodeURIComponent(agentId)}&name=${encodeURIComponent(nextName)}`,\n { cache: \"no-store\" },\n );\n if (!json.ok) throw new Error(\"Failed to load file\");\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setFileError(errorMessage(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 -- Load file when entering Files tab; onLoadAgentFile and fileContent intentionally omitted.\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 json = await fetchJson<{ ok?: boolean }>(\"/api/agents/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name: fileName, content: fileContent }),\n });\n if (!json.ok) throw new Error(\"Failed to save file\");\n\n // Refresh the file list so missing/mtime updates immediately.\n try {\n const j = await fetchJson<{ ok?: boolean; files?: Array<FileEntry & { required?: boolean; rationale?: string }> }>(\n `/api/agents/files?agentId=${encodeURIComponent(agentId)}`,\n { cache: \"no-store\" },\n );\n if (j.ok && Array.isArray(j.files)) setAgentFiles(j.files);\n } catch {\n // ignore\n }\n // No-op: saving a file doesn't need a global notice.\n } catch (e: unknown) {\n setFileError(errorMessage(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 await fetchJson(`/api/agents/${encodeURIComponent(agentId)}`, { method: \"DELETE\" });\n\n window.location.href = \"/\";\n } catch (e: unknown) {\n setDeleteError(errorMessage(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-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] 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 <IdentityTab\n name={name}\n emoji={emoji}\n theme={theme}\n avatar={avatar}\n saving={saving}\n returnTo={returnTo}\n onNameChange={setName}\n onEmojiChange={setEmoji}\n onThemeChange={setTheme}\n onAvatarChange={setAvatar}\n onSave={onSaveIdentity}\n router={router}\n />\n )}\n {activeTab === \"config\" && (\n <ConfigTab\n model={model}\n saving={saving}\n onModelChange={setModel}\n onSave={onSaveConfig}\n />\n )}\n {activeTab === \"skills\" && (\n <SkillsTab\n agentId={agentId}\n skillsList={skillsList}\n availableSkills={availableSkills}\n skillsLoading={skillsLoading}\n selectedSkill={selectedSkill}\n installingSkill={installingSkill}\n skillError={skillError}\n skillMsg={skillMsg}\n onSelectedSkillChange={setSelectedSkill}\n onInstallSkill={async () => {\n setInstallingSkill(true);\n setSkillMsg(\"\");\n setSkillError(\"\");\n try {\n await fetchJson(\"/api/agents/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, skill: selectedSkill }),\n });\n setSkillMsg(`Installed skill: ${selectedSkill}`);\n try {\n const j = await fetchJson<{ ok?: boolean; skills?: string[] }>(\n `/api/agents/skills?agentId=${encodeURIComponent(agentId)}`,\n { cache: \"no-store\" },\n );\n if (j.ok && Array.isArray(j.skills)) setSkillsList(j.skills);\n } catch {\n // ignore\n }\n } catch (e: unknown) {\n setSkillError(errorMessage(e));\n } finally {\n setInstallingSkill(false);\n }\n }}\n />\n )}\n {activeTab === \"files\" && (\n <FilesTab\n agentFiles={agentFiles}\n agentFilesLoading={agentFilesLoading}\n showOptionalFiles={showOptionalFiles}\n fileName={fileName}\n fileContent={fileContent}\n loadingFile={loadingFile}\n saving={saving}\n fileError={fileError}\n onShowOptionalChange={setShowOptionalFiles}\n onLoadFile={onLoadAgentFile}\n onFileContentChange={setFileContent}\n onSaveFile={onSaveAgentFile}\n onCreateMissingFile={onCreateMissingFile}\n />\n )}\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","\"use client\";\n\nimport { FileListWithOptionalToggle } from \"@/components/FileListWithOptionalToggle\";\n\ntype FileEntry = { name: string; missing: boolean; required?: boolean; rationale?: string };\n\nexport function IdentityTab({\n name,\n emoji,\n theme,\n avatar,\n saving,\n returnTo,\n onNameChange,\n onEmojiChange,\n onThemeChange,\n onAvatarChange,\n onSave,\n router,\n}: {\n name: string;\n emoji: string;\n theme: string;\n avatar: string;\n saving: boolean;\n returnTo?: string;\n onNameChange: (v: string) => void;\n onEmojiChange: (v: string) => void;\n onThemeChange: (v: string) => void;\n onAvatarChange: (v: string) => void;\n onSave: () => Promise<void>;\n router: { push: (href: string) => void };\n}) {\n return (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Identity</div>\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) => onNameChange(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 <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) => onEmojiChange(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) => onThemeChange(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) => onAvatarChange(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 <div className=\"mt-4 flex flex-col gap-2 sm:flex-row\">\n <button\n disabled={saving}\n onClick={onSave}\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 onSave();\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 );\n}\n\nexport function ConfigTab({\n model,\n saving,\n onModelChange,\n onSave,\n}: {\n model: string;\n saving: boolean;\n onModelChange: (v: string) => void;\n onSave: () => Promise<void>;\n}) {\n return (\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) => onModelChange(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={onSave}\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 );\n}\n\nexport function SkillsTab({\n agentId,\n skillsList,\n availableSkills,\n skillsLoading,\n selectedSkill,\n installingSkill,\n skillError,\n skillMsg,\n onSelectedSkillChange,\n onInstallSkill,\n}: {\n agentId: string;\n skillsList: string[];\n availableSkills: string[];\n skillsLoading: boolean;\n selectedSkill: string;\n installingSkill: boolean;\n skillError: string;\n skillMsg: string;\n onSelectedSkillChange: (v: string) => void;\n onInstallSkill: () => Promise<void>;\n}) {\n return (\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 <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 && <li>Loading…</li>}\n {!skillsLoading && skillsList.length > 0 && skillsList.map((s) => <li key={s}>{s}</li>)}\n {!skillsLoading && !skillsList.length && <li>None installed.</li>}\n </ul>\n </div>\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) => onSelectedSkillChange(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={() => void onInstallSkill()}\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 {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 )}\n {!skillError && 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 )}\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 );\n}\n\nexport function FilesTab({\n agentFiles,\n agentFilesLoading,\n showOptionalFiles,\n fileName,\n fileContent,\n loadingFile,\n saving,\n fileError,\n onShowOptionalChange,\n onLoadFile,\n onFileContentChange,\n onSaveFile,\n onCreateMissingFile,\n}: {\n agentFiles: FileEntry[];\n agentFilesLoading: boolean;\n showOptionalFiles: boolean;\n fileName: string;\n fileContent: string;\n loadingFile: boolean;\n saving: boolean;\n fileError: string;\n onShowOptionalChange: (v: boolean) => void;\n onLoadFile: (name: string) => void;\n onFileContentChange: (v: string) => void;\n onSaveFile: () => Promise<void>;\n onCreateMissingFile: (name: string) => Promise<void>;\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <FileListWithOptionalToggle\n title=\"Agent files\"\n files={agentFiles}\n loading={agentFilesLoading}\n showOptionalFiles={showOptionalFiles}\n onShowOptionalChange={onShowOptionalChange}\n selectedFileName={fileName}\n onSelectFile={onLoadFile}\n renderItemExtra={(f) =>\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 }\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={onSaveFile}\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 {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 <textarea\n value={fileContent}\n onChange={(e) => onFileContentChange(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 );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/agents/%5BagentId%5D/agent-editor.tsx","../../../../src/components/FileListWithOptionalToggle.tsx","../../../../src/app/agents/%5BagentId%5D/agent-editor-tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchAll, fetchJson } from \"@/lib/fetch-json\";\nimport { DeleteAgentModal } from \"@/components/delete-modals\";\nimport { IdentityTab, ConfigTab, SkillsTab, FilesTab } from \"./agent-editor-tabs\";\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\nasync function loadAgentFilesAndSkills(\n agentId: string,\n setters: {\n setAgentFiles: (f: Array<FileEntry & { required?: boolean; rationale?: string }>) => void;\n setSkillsList: (s: string[]) => void;\n setAvailableSkills: (s: string[]) => void;\n setSelectedSkill: (s: string) => void;\n setAgentFilesLoading: (v: boolean) => void;\n setSkillsLoading: (v: boolean) => void;\n }\n): Promise<void> {\n setters.setAgentFilesLoading(true);\n setters.setSkillsLoading(true);\n try {\n const [filesRes, skillsRes, availableSkillsRes] = await fetchAll([\n `/api/agents/files?agentId=${encodeURIComponent(agentId)}`,\n `/api/agents/skills?agentId=${encodeURIComponent(agentId)}`,\n \"/api/skills/available\",\n ]);\n\n let installedSkills: string[] = [];\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 setters.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 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 setters.setSkillsList(installedSkills);\n }\n } catch {\n // ignore\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 setters.setAvailableSkills(list);\n const first = list.find((s) => !installedSkills.includes(s));\n setters.setSelectedSkill(first ?? list[0] ?? \"\");\n }\n } catch {\n // ignore\n }\n } finally {\n setters.setAgentFilesLoading(false);\n setters.setSkillsLoading(false);\n }\n}\n\nexport default function AgentEditor({ agentId, returnTo, onClose }: { agentId: string; returnTo?: string; onClose?: () => void }) {\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 agentsJson = await fetchJson<{ agents?: unknown[] }>(\"/api/agents\", { cache: \"no-store\" });\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 setLoading(false);\n\n void loadAgentFilesAndSkills(agentId, {\n setAgentFiles,\n setSkillsList,\n setAvailableSkills,\n setSelectedSkill,\n setAgentFilesLoading,\n setSkillsLoading,\n });\n } catch (e: unknown) {\n setPageMsg(errorMessage(e));\n } finally {\n setLoading(false);\n }\n })();\n }, [agentId]);\n\n async function withSaveFeedback(\n fn: () => Promise<string>,\n ) {\n setSaving(true);\n setPageMsg(\"\");\n try {\n const msg = await fn();\n setPageMsg(msg);\n } catch (e: unknown) {\n setPageMsg(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveIdentity() {\n await withSaveFeedback(async () => {\n await fetchJson(\"/api/agents/identity\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name, emoji, theme, avatar }),\n });\n return \"Saved identity via openclaw agents set-identity\";\n });\n }\n\n async function onSaveConfig() {\n await withSaveFeedback(async () => {\n await fetchJson(\"/api/agents/update\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, patch: { model } }),\n });\n return \"Saved agent config (model) and restarted gateway\";\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 json = await fetchJson<{ ok?: boolean; content?: string }>(\n `/api/agents/file?agentId=${encodeURIComponent(agentId)}&name=${encodeURIComponent(nextName)}`,\n { cache: \"no-store\" },\n );\n if (!json.ok) throw new Error(\"Failed to load file\");\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setFileError(errorMessage(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 -- Load file when entering Files tab; onLoadAgentFile and fileContent intentionally omitted.\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 json = await fetchJson<{ ok?: boolean }>(\"/api/agents/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name: fileName, content: fileContent }),\n });\n if (!json.ok) throw new Error(\"Failed to save file\");\n\n // Refresh the file list so missing/mtime updates immediately.\n try {\n const j = await fetchJson<{ ok?: boolean; files?: Array<FileEntry & { required?: boolean; rationale?: string }> }>(\n `/api/agents/files?agentId=${encodeURIComponent(agentId)}`,\n { cache: \"no-store\" },\n );\n if (j.ok && Array.isArray(j.files)) setAgentFiles(j.files);\n } catch {\n // ignore\n }\n // No-op: saving a file doesn't need a global notice.\n } catch (e: unknown) {\n setFileError(errorMessage(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 await fetchJson(`/api/agents/${encodeURIComponent(agentId)}`, { method: \"DELETE\" });\n\n window.location.href = \"/\";\n } catch (e: unknown) {\n setDeleteError(errorMessage(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=\"w-full\">Loading…</div>;\n if (!agent) return <div className=\"w-full\">Agent not found: {agentId}</div>;\n\n return (\n <div className=\"w-full\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"flex items-center gap-3\">\n {onClose ? (\n <button type=\"button\" onClick={onClose} className=\"text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\" title=\"Close\">\n <svg viewBox=\"0 0 24 24\" className=\"h-5 w-5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\" /></svg>\n </button>\n ) : null}\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{agent.identityName || agent.id}</h1>\n <p className=\"mt-1 text-sm font-mono text-[color:var(--ck-text-tertiary)]\">\n {agent.id}\n {agent.isDefault ? \" · default\" : \"\"}\n {agent.model ? ` · ${agent.model}` : \"\"}\n </p>\n </div>\n </div>\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => {\n setDeleteError(null);\n setDeleteOpen(true);\n }}\n className=\"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] 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-lg 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-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]\"\n : \"rounded-lg 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 <IdentityTab\n name={name}\n emoji={emoji}\n theme={theme}\n avatar={avatar}\n saving={saving}\n returnTo={returnTo}\n onNameChange={setName}\n onEmojiChange={setEmoji}\n onThemeChange={setTheme}\n onAvatarChange={setAvatar}\n onSave={onSaveIdentity}\n router={router}\n />\n )}\n {activeTab === \"config\" && (\n <ConfigTab\n model={model}\n saving={saving}\n onModelChange={setModel}\n onSave={onSaveConfig}\n />\n )}\n {activeTab === \"skills\" && (\n <SkillsTab\n agentId={agentId}\n skillsList={skillsList}\n availableSkills={availableSkills}\n skillsLoading={skillsLoading}\n selectedSkill={selectedSkill}\n installingSkill={installingSkill}\n skillError={skillError}\n skillMsg={skillMsg}\n onSelectedSkillChange={setSelectedSkill}\n onInstallSkill={async () => {\n setInstallingSkill(true);\n setSkillMsg(\"\");\n setSkillError(\"\");\n try {\n await fetchJson(\"/api/agents/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, skill: selectedSkill }),\n });\n setSkillMsg(`Installed skill: ${selectedSkill}`);\n try {\n const j = await fetchJson<{ ok?: boolean; skills?: string[] }>(\n `/api/agents/skills?agentId=${encodeURIComponent(agentId)}`,\n { cache: \"no-store\" },\n );\n if (j.ok && Array.isArray(j.skills)) setSkillsList(j.skills);\n } catch {\n // ignore\n }\n } catch (e: unknown) {\n setSkillError(errorMessage(e));\n } finally {\n setInstallingSkill(false);\n }\n }}\n />\n )}\n {activeTab === \"files\" && (\n <FilesTab\n agentFiles={agentFiles}\n agentFilesLoading={agentFilesLoading}\n showOptionalFiles={showOptionalFiles}\n fileName={fileName}\n fileContent={fileContent}\n loadingFile={loadingFile}\n saving={saving}\n fileError={fileError}\n onShowOptionalChange={setShowOptionalFiles}\n onLoadFile={onLoadAgentFile}\n onFileContentChange={setFileContent}\n onSaveFile={onSaveAgentFile}\n onCreateMissingFile={onCreateMissingFile}\n />\n )}\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","\"use client\";\n\nexport type FileListWithOptionalToggleEntry = {\n name: string;\n missing: boolean;\n required?: boolean;\n};\n\nfunction getFileButtonClass(selectedFileName: string, fName: string): string {\n const isSelected = selectedFileName === fName;\n const base = \"w-full rounded-lg px-3 py-2 text-left text-sm\";\n if (isSelected) {\n return `${base} bg-white/10 text-[color:var(--ck-text-primary)]`;\n }\n return `${base} text-[color:var(--ck-text-secondary)] hover:bg-white/5`;\n}\n\nexport function FileListWithOptionalToggle({\n title,\n files,\n loading,\n showOptionalFiles,\n onShowOptionalChange,\n selectedFileName,\n onSelectFile,\n renderItemExtra,\n}: {\n title: string;\n files: FileListWithOptionalToggleEntry[];\n loading?: boolean;\n showOptionalFiles: boolean;\n onShowOptionalChange: (v: boolean) => void;\n selectedFileName: string;\n onSelectFile: (name: string) => void;\n renderItemExtra?: (f: FileListWithOptionalToggleEntry) => React.ReactNode;\n}) {\n const filtered = showOptionalFiles ? files : files.filter((f) => f.required || !f.missing);\n\n return (\n <div className=\"ck-card 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)]\">{title}</div>\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={showOptionalFiles}\n onChange={(e) => onShowOptionalChange(e.target.checked)}\n />\n Show optional\n </label>\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Default view hides optional missing files to reduce noise.\n </div>\n <ul className=\"mt-3 space-y-1\">\n {loading ? <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li> : null}\n {filtered.map((f) => (\n <li key={f.name}>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => onSelectFile(f.name)}\n className={getFileButtonClass(selectedFileName, f.name)}\n >\n <span\n className={\n f.required ? \"text-[color:var(--ck-text-primary)]\" : \"text-[color:var(--ck-text-secondary)]\"\n }\n >\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 ? (\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">missing</span>\n ) : null}\n </button>\n {renderItemExtra?.(f)}\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport { FileListWithOptionalToggle } from \"@/components/FileListWithOptionalToggle\";\n\ntype FileEntry = { name: string; missing: boolean; required?: boolean; rationale?: string };\n\nexport function IdentityTab({\n name,\n emoji,\n theme,\n avatar,\n saving,\n returnTo,\n onNameChange,\n onEmojiChange,\n onThemeChange,\n onAvatarChange,\n onSave,\n router,\n}: {\n name: string;\n emoji: string;\n theme: string;\n avatar: string;\n saving: boolean;\n returnTo?: string;\n onNameChange: (v: string) => void;\n onEmojiChange: (v: string) => void;\n onThemeChange: (v: string) => void;\n onAvatarChange: (v: string) => void;\n onSave: () => Promise<void>;\n router: { push: (href: string) => void };\n}) {\n return (\n <div className=\"ck-card p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Identity</div>\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) => onNameChange(e.target.value)}\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\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) => onEmojiChange(e.target.value)}\n placeholder=\"🦞\"\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 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) => onThemeChange(e.target.value)}\n placeholder=\"warm, sharp, calm\"\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 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) => onAvatarChange(e.target.value)}\n placeholder=\"avatars/openclaw.png\"\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n <div className=\"mt-4 flex flex-col gap-2 sm:flex-row\">\n <button\n disabled={saving}\n onClick={onSave}\n className=\"rounded-lg 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 onSave();\n router.push(returnTo);\n }}\n className=\"rounded-lg 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 );\n}\n\nexport function ConfigTab({\n model,\n saving,\n onModelChange,\n onSave,\n}: {\n model: string;\n saving: boolean;\n onModelChange: (v: string) => void;\n onSave: () => Promise<void>;\n}) {\n return (\n <div className=\"ck-card 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) => onModelChange(e.target.value)}\n placeholder=\"openai/gpt-5.2\"\n className=\"mt-1 w-full rounded-lg border border-white/10 bg-white/5 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={onSave}\n className=\"rounded-lg 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 );\n}\n\nexport function SkillsTab({\n agentId,\n skillsList,\n availableSkills,\n skillsLoading,\n selectedSkill,\n installingSkill,\n skillError,\n skillMsg,\n onSelectedSkillChange,\n onInstallSkill,\n}: {\n agentId: string;\n skillsList: string[];\n availableSkills: string[];\n skillsLoading: boolean;\n selectedSkill: string;\n installingSkill: boolean;\n skillError: string;\n skillMsg: string;\n onSelectedSkillChange: (v: string) => void;\n onInstallSkill: () => Promise<void>;\n}) {\n return (\n <div className=\"ck-card 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 <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 && <li>Loading…</li>}\n {!skillsLoading && skillsList.length > 0 && skillsList.map((s) => <li key={s}>{s}</li>)}\n {!skillsLoading && !skillsList.length && <li>None installed.</li>}\n </ul>\n </div>\n <div className=\"mt-5 rounded-lg border border-white/10 bg-white/5 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) => onSelectedSkillChange(e.target.value)}\n className=\"w-full rounded-lg border border-white/10 bg-white/5 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={() => void onInstallSkill()}\n className=\"rounded-lg 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 {skillError && (\n <div className=\"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {skillError}\n </div>\n )}\n {!skillError && skillMsg && (\n <div className=\"mt-3 rounded-lg border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n {skillMsg}\n </div>\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 );\n}\n\nexport function FilesTab({\n agentFiles,\n agentFilesLoading,\n showOptionalFiles,\n fileName,\n fileContent,\n loadingFile,\n saving,\n fileError,\n onShowOptionalChange,\n onLoadFile,\n onFileContentChange,\n onSaveFile,\n onCreateMissingFile,\n}: {\n agentFiles: FileEntry[];\n agentFilesLoading: boolean;\n showOptionalFiles: boolean;\n fileName: string;\n fileContent: string;\n loadingFile: boolean;\n saving: boolean;\n fileError: string;\n onShowOptionalChange: (v: boolean) => void;\n onLoadFile: (name: string) => void;\n onFileContentChange: (v: string) => void;\n onSaveFile: () => Promise<void>;\n onCreateMissingFile: (name: string) => Promise<void>;\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <FileListWithOptionalToggle\n title=\"Agent files\"\n files={agentFiles}\n loading={agentFilesLoading}\n showOptionalFiles={showOptionalFiles}\n onShowOptionalChange={onShowOptionalChange}\n selectedFileName={fileName}\n onSelectFile={onLoadFile}\n renderItemExtra={(f) =>\n f.missing ? (\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => void onCreateMissingFile(f.name)}\n className=\"shrink-0 rounded-lg 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 }\n />\n <div className=\"ck-card 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={onSaveFile}\n className=\"rounded-lg 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 {fileError ? (\n <div className=\"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {fileError}\n </div>\n ) : null}\n <textarea\n value={fileContent}\n onChange={(e) => onFileContentChange(e.target.value)}\n className=\"mt-3 h-[55vh] w-full resize-none rounded-lg border border-white/10 bg-white/5 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|