@jiggai/kitchen 0.3.33 → 0.4.0
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 +154 -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 → QPNWZUPFu-1zEy4dGcXv5}/_buildManifest.js +0 -0
- /package/.next/static/{F0PhVXEIb3LrF9XQem5EQ → QPNWZUPFu-1zEy4dGcXv5}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{F0PhVXEIb3LrF9XQem5EQ → QPNWZUPFu-1zEy4dGcXv5}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/recipes/recipes-client.tsx","../../../../src/components/ScaffoldOverlay.tsx","../../../../src/lib/poll.ts","../../../../src/lib/use-slugified-id.ts","../../../../src/app/recipes/CreateModalShell.tsx","../../../../src/app/recipes/CreateTeamModal.tsx","../../../../src/app/recipes/CreateCustomTeamModal.tsx","../../../../src/app/recipes/CreateAgentModal.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useState } from \"react\";\nimport { ScaffoldOverlay, type ScaffoldOverlayStep } from \"@/components/ScaffoldOverlay\";\nimport { fetchJsonWithStatus } from \"@/lib/fetch-json\";\nimport { pollUntil } from \"@/lib/poll\";\nimport { fetchScaffold } from \"@/lib/scaffold-client\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { CreateTeamModal } from \"./CreateTeamModal\";\nimport { CreateCustomTeamModal } from \"./CreateCustomTeamModal\";\nimport { CreateAgentModal } from \"./CreateAgentModal\";\nimport { DeleteRecipeModal } from \"@/components/delete-modals\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype Recipe = {\n id: string;\n name: string;\n kind: \"agent\" | \"team\";\n source: \"builtin\" | \"workspace\";\n};\n\nfunction getEditLabel(isInstalledAgent: boolean, source: string): string {\n if (isInstalledAgent) return \"Edit agent\";\n if (source === \"builtin\") return \"View recipe\";\n return \"Edit recipe\";\n}\n\nfunction RecipesSection({\n title,\n items,\n onDelete,\n onCreateTeam,\n onCreateAgent,\n installedAgentIds,\n}: {\n title: string;\n items: Recipe[];\n onDelete?: (id: string) => void;\n onCreateTeam?: (r: Recipe) => void;\n onCreateAgent?: (r: Recipe) => void;\n installedAgentIds: string[];\n}) {\n return (\n <section>\n <h2 className=\"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">{title}</h2>\n\n {items.length === 0 ? (\n <div className=\"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]\">None yet.</div>\n ) : (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {items.map((r) => {\n const isInstalledAgent = r.kind === \"agent\" && installedAgentIds.includes(r.id);\n const editHref = isInstalledAgent\n ? `/agents/${encodeURIComponent(r.id)}`\n : `/recipes/${encodeURIComponent(r.id)}`;\n const editLabel = getEditLabel(isInstalledAgent, r.source);\n\n return (\n <div\n key={`${r.source}:${r.id}`}\n className=\"ck-glass flex flex-col gap-3 px-4 py-3\"\n >\n <div>\n <div className=\"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words\">\n {r.name}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{r.id}</span> • {r.kind} • {r.source}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {r.kind === \"team\" && onCreateTeam ? (\n <button\n type=\"button\"\n onClick={() => onCreateTeam(r)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create team\n </button>\n ) : null}\n\n {r.kind === \"agent\" && onCreateAgent ? (\n <button\n type=\"button\"\n onClick={() => onCreateAgent(r)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create agent\n </button>\n ) : null}\n\n <Link\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n href={editHref}\n >\n {editLabel}\n </Link>\n\n {onDelete ? (\n <button\n type=\"button\"\n onClick={() => onDelete(r.id)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Delete\n </button>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </section>\n );\n}\n\nexport default function RecipesClient({\n builtin,\n customTeamRecipes,\n customAgentRecipes,\n installedAgentIds,\n initialOpenCustomTeam = false,\n}: {\n builtin: Recipe[];\n customTeamRecipes: Recipe[];\n customAgentRecipes: Recipe[];\n installedAgentIds: string[];\n initialOpenCustomTeam?: boolean;\n}) {\n const toast = useToast();\n\n const [overlayOpen, setOverlayOpen] = useState(false);\n const [overlayStep, setOverlayStep] = useState<ScaffoldOverlayStep>(1);\n const router = useRouter();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [busy, setBusy] = useState(false);\n const [modalError, setModalError] = useState<string | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n const [createRecipe, setCreateRecipe] = useState<Recipe | null>(null);\n const [createTeamId, setCreateTeamId] = useState<string>(\"\");\n const [installCron, setInstallCron] = useState(true);\n const [createBusy, setCreateBusy] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const [createAgentOpen, setCreateAgentOpen] = useState(false);\n const [createAgentRecipe, setCreateAgentRecipe] = useState<Recipe | null>(null);\n const [createAgentId, setCreateAgentId] = useState<string>(\"\");\n const [createAgentName, setCreateAgentName] = useState<string>(\"\");\n const [createAgentBusy, setCreateAgentBusy] = useState(false);\n const [createAgentError, setCreateAgentError] = useState<string | null>(null);\n\n const [createCustomTeamOpen, setCreateCustomTeamOpen] = useState(initialOpenCustomTeam);\n const [createCustomTeamId, setCreateCustomTeamId] = useState<string>(\"\");\n const [createCustomTeamBusy, setCreateCustomTeamBusy] = useState(false);\n const [createCustomTeamError, setCreateCustomTeamError] = useState<string | null>(null);\n const [customTeamRoles, setCustomTeamRoles] = useState<Array<{ agentId: string; roleId: string; displayName: string }>>(\n [],\n );\n\n const onDelete = (id: string) => {\n setDeleteId(id);\n setModalError(null);\n setDeleteOpen(true);\n };\n\n const onCreateTeam = (r: Recipe) => {\n setCreateRecipe(r);\n setCreateTeamId(\"\");\n setInstallCron(true);\n setCreateError(null);\n setCreateOpen(true);\n };\n\n const onCreateAgent = (r: Recipe) => {\n setCreateAgentRecipe(r);\n setCreateAgentId(\"\");\n setCreateAgentName(\"\");\n setCreateAgentError(null);\n setCreateAgentOpen(true);\n };\n\n const onCreateCustomTeam = () => {\n setCreateCustomTeamId(\"\");\n setCustomTeamRoles([]);\n setCreateCustomTeamError(null);\n setCreateCustomTeamOpen(true);\n };\n\n async function confirmDelete() {\n setBusy(true);\n setModalError(null);\n try {\n const result = await fetchJsonWithStatus<{ ok?: boolean; error?: string }>(\"/api/recipes/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n if (!result.ok) {\n if (result.status === 409) {\n setModalError(result.error);\n return;\n }\n throw new Error(result.error);\n }\n if (!result.data.ok) {\n setModalError(result.data.error ?? \"Delete failed\");\n return;\n }\n toast.push({ kind: \"success\", message: `Deleted recipe: ${deleteId}` });\n setDeleteOpen(false);\n window.location.reload();\n } catch (e: unknown) {\n toast.push({ kind: \"error\", message: errorMessage(e) });\n } finally {\n setBusy(false);\n }\n }\n\n async function waitForKitchenHealthy(opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const result = await pollUntil<boolean>(\n async () => {\n try {\n const res = await fetch(\"/healthz\", { cache: \"no-store\" });\n return res.ok ? true : null;\n } catch {\n return null;\n }\n },\n { timeoutMs }\n );\n return result ?? false;\n }\n\n async function waitForTeamPageReady(teamId: string, opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const result = await pollUntil<boolean>(\n async () => {\n try {\n const [recipesRes, metaRes] = await Promise.all([\n fetch(\"/api/recipes\", { cache: \"no-store\" }),\n fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n\n const recipesJson = (await recipesRes.json()) as { recipes?: Array<{ id?: unknown; kind?: unknown }> };\n const list = Array.isArray(recipesJson.recipes) ? recipesJson.recipes : [];\n const hasRecipe = list.some((r) => String(r.id ?? \"\") === teamId && String(r.kind ?? \"\") === \"team\");\n\n const metaJson = (await metaRes.json()) as { ok?: boolean; missing?: boolean };\n const hasMeta = Boolean(metaRes.ok && metaJson.ok && !metaJson.missing);\n\n return hasRecipe && hasMeta ? true : null;\n } catch {\n return null;\n }\n },\n { timeoutMs }\n );\n return result ?? false;\n }\n\n async function attachTeamMeta(teamId: string, recipeId: string, recipeName: string) {\n const res = await fetchJsonWithStatus<{ ok?: boolean; error?: string }>(\"/api/teams/meta\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, recipeId, recipeName }),\n });\n if (!res.ok) throw new Error(res.error);\n if (!res.data.ok) throw new Error(res.data.error || \"Failed to attach team meta\");\n }\n\n function validateTeamIdForCreate(recipe: { id: string } | null, teamId: string): string | null {\n if (!recipe) return null;\n const t = teamId.trim();\n if (!t) return \"Team id is required.\";\n if (!t.endsWith(\"-team\")) return \"Team id must end with -team.\";\n if (t === recipe.id) return `Team id cannot be the same as the recipe id (${recipe.id}). Choose a new team id.`;\n return null;\n }\n\n async function scaffoldWithOverlay(opts: {\n kind: \"team\" | \"agent\";\n recipeId: string;\n teamId?: string;\n agentId?: string;\n name?: string;\n cronInstallChoice?: \"yes\" | \"no\";\n setBusy: (v: boolean) => void;\n setError: (v: string | null) => void;\n setModalOpen: (v: boolean) => void;\n setOverlayOpen: (v: boolean) => void;\n setOverlayStep: React.Dispatch<React.SetStateAction<ScaffoldOverlayStep>>;\n successMessage: string;\n navigateTo: string;\n waitBeforeNavigate?: () => Promise<unknown>;\n }) {\n const {\n kind,\n recipeId,\n teamId,\n agentId,\n name,\n cronInstallChoice,\n setBusy,\n setError,\n setModalOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage,\n navigateTo,\n waitBeforeNavigate,\n } = opts;\n\n setBusy(true);\n setError(null);\n setModalOpen(false);\n setOverlayOpen(true);\n setOverlayStep(1);\n\n let serveTimer: ReturnType<typeof setTimeout> | null = null;\n\n try {\n const body =\n kind === \"team\"\n ? { kind: \"team\" as const, recipeId, teamId: teamId!, cronInstallChoice }\n : { kind: \"agent\" as const, recipeId, agentId: agentId!, name };\n const { res, json } = await fetchScaffold(body);\n if (!res.ok || !(json as { ok?: boolean }).ok)\n throw new Error(\n String((json as { error?: string }).error || (kind === \"team\" ? \"Create team failed\" : \"Create agent failed\"))\n );\n\n setOverlayStep(2);\n\n serveTimer = setTimeout(() => {\n setOverlayStep((prev) => (prev < 3 ? 3 : prev));\n }, 20_000);\n\n const stderr = typeof (json as { stderr?: unknown }).stderr === \"string\" ? (json as { stderr: string }).stderr : \"\";\n\n if (/Failed to start CLI:/i.test(stderr) || /\\bError: /i.test(stderr)) {\n throw new Error(stderr.trim() || \"Scaffold failed\");\n }\n\n if (/Restart required:/i.test(stderr)) {\n setOverlayStep(3);\n try {\n await fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // best-effort\n }\n await waitForKitchenHealthy({ timeoutMs: 60_000 });\n }\n\n if (waitBeforeNavigate) {\n await waitBeforeNavigate();\n }\n\n if (serveTimer) clearTimeout(serveTimer);\n\n toast.push({ kind: \"success\", message: successMessage });\n setModalOpen(false);\n\n router.push(navigateTo);\n\n setTimeout(() => setOverlayOpen(false), 500);\n } catch (e: unknown) {\n if (serveTimer) clearTimeout(serveTimer);\n setOverlayOpen(false);\n const msg = errorMessage(e);\n setError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setBusy(false);\n }\n }\n\n async function confirmCreateTeam() {\n const recipe = createRecipe;\n const err = validateTeamIdForCreate(recipe, createTeamId);\n if (err) {\n setCreateError(err);\n return;\n }\n if (!recipe) return;\n\n const t = createTeamId.trim();\n await scaffoldWithOverlay({\n kind: \"team\",\n recipeId: recipe.id,\n teamId: t,\n cronInstallChoice: installCron ? \"yes\" : \"no\",\n setBusy: setCreateBusy,\n setError: setCreateError,\n setModalOpen: setCreateOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created team: ${t}`,\n navigateTo: `/teams/${encodeURIComponent(t)}`,\n waitBeforeNavigate: () => waitForTeamPageReady(t, { timeoutMs: 60_000 }),\n });\n }\n\n async function confirmCreateAgent() {\n const recipe = createAgentRecipe;\n if (!recipe) return;\n\n const a = createAgentId.trim();\n if (!a) {\n setCreateAgentError(\"Agent id is required.\");\n return;\n }\n if (a === recipe.id) {\n setCreateAgentError(`Agent id cannot be the same as the recipe id (${recipe.id}). Choose a new agent id.`);\n return;\n }\n\n await scaffoldWithOverlay({\n kind: \"agent\",\n recipeId: recipe.id,\n agentId: a,\n name: createAgentName.trim() || undefined,\n setBusy: setCreateAgentBusy,\n setError: setCreateAgentError,\n setModalOpen: setCreateAgentOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created agent: ${a}`,\n navigateTo: `/agents/${encodeURIComponent(a)}`,\n });\n }\n\n async function confirmCreateCustomTeam() {\n const teamId = createCustomTeamId.trim();\n if (!teamId) {\n setCreateCustomTeamError(\"Team id is required.\");\n return;\n }\n const recipeId = teamId.endsWith(\"-team\") ? teamId.slice(0, -\"-team\".length) : teamId;\n if (!recipeId) {\n setCreateCustomTeamError(\"Team id is invalid.\");\n return;\n }\n if (customTeamRoles.length < 1) {\n setCreateCustomTeamError(\"Select at least one agent.\");\n return;\n }\n\n setCreateCustomTeamError(null);\n\n try {\n setCreateCustomTeamBusy(true);\n const createRes = await fetchJsonWithStatus<{ ok?: boolean; error?: string; recipeId?: string }>(\n \"/api/recipes/custom-team\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n recipeId,\n teamId,\n roles: customTeamRoles.map((r) => ({ roleId: r.roleId, displayName: r.displayName })),\n }),\n },\n );\n setCreateCustomTeamBusy(false);\n\n if (!createRes.ok) {\n throw new Error(createRes.error);\n }\n if (!createRes.data.ok) {\n throw new Error(createRes.data.error || \"Failed to create custom team recipe\");\n }\n\n await scaffoldWithOverlay({\n kind: \"team\",\n recipeId,\n teamId,\n cronInstallChoice: \"no\",\n setBusy: setCreateCustomTeamBusy,\n setError: setCreateCustomTeamError,\n setModalOpen: setCreateCustomTeamOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created team: ${teamId}`,\n navigateTo: `/teams/${encodeURIComponent(teamId)}`,\n waitBeforeNavigate: async () => {\n // Some scaffold paths may not persist team.json (meta) immediately.\n // Ensure it exists so the team editor loads reliably.\n await attachTeamMeta(teamId, recipeId, \"Custom Team\");\n await waitForTeamPageReady(teamId, { timeoutMs: 60_000 });\n },\n });\n } catch (e: unknown) {\n setCreateCustomTeamBusy(false);\n const msg = errorMessage(e);\n setCreateCustomTeamError(msg);\n toast.push({ kind: \"error\", message: msg });\n }\n }\n\n return (\n <>\n <ScaffoldOverlay\n open={overlayOpen}\n step={overlayStep}\n onDismiss={() => {\n setOverlayOpen(false);\n }}\n />\n <div className=\"mt-8 space-y-10\">\n <section>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n <div>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Custom recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n Workspace recipes (editable) — stored under <code className=\"font-mono\">~/.openclaw/workspace/recipes/</code>.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onCreateCustomTeam}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create custom team\n </button>\n </div>\n\n <div className=\"mt-4 space-y-8\">\n <RecipesSection\n title={`Teams (${customTeamRecipes.length})`}\n items={customTeamRecipes}\n onDelete={onDelete}\n onCreateTeam={onCreateTeam}\n installedAgentIds={installedAgentIds}\n />\n <RecipesSection\n title={`Agents (${customAgentRecipes.length})`}\n items={customAgentRecipes}\n onDelete={onDelete}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Builtin recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">Bundled recipes shipped with the plugin.</p>\n\n <div className=\"mt-4\">\n <RecipesSection\n title={`All (${builtin.length})`}\n items={builtin}\n onCreateTeam={onCreateTeam}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n </div>\n\n <DeleteRecipeModal\n open={deleteOpen}\n recipeId={deleteId}\n busy={busy}\n error={modalError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <CreateCustomTeamModal\n open={createCustomTeamOpen}\n teamId={createCustomTeamId}\n setTeamId={setCreateCustomTeamId}\n busy={createCustomTeamBusy}\n error={createCustomTeamError}\n onRolesChange={setCustomTeamRoles}\n onClose={() => setCreateCustomTeamOpen(false)}\n onConfirm={confirmCreateCustomTeam}\n />\n\n <CreateTeamModal\n open={createOpen}\n recipeId={createRecipe?.id ?? \"\"}\n recipeName={createRecipe?.name ?? \"\"}\n teamId={createTeamId}\n setTeamId={setCreateTeamId}\n installCron={installCron}\n setInstallCron={setInstallCron}\n busy={createBusy}\n error={createError}\n onClose={() => setCreateOpen(false)}\n onConfirm={confirmCreateTeam}\n />\n\n <CreateAgentModal\n open={createAgentOpen}\n recipeId={createAgentRecipe?.id ?? \"\"}\n recipeName={createAgentRecipe?.name ?? \"\"}\n agentId={createAgentId}\n setAgentId={setCreateAgentId}\n agentName={createAgentName}\n setAgentName={setCreateAgentName}\n existingRecipeIds={[...builtin, ...customTeamRecipes, ...customAgentRecipes].map((r) => r.id)}\n existingAgentIds={installedAgentIds}\n busy={createAgentBusy}\n error={createAgentError}\n onClose={() => setCreateAgentOpen(false)}\n onConfirm={confirmCreateAgent}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport type ScaffoldOverlayStep = 1 | 2 | 3;\n\nconst stepLabel: Record<ScaffoldOverlayStep, string> = {\n 1: \"Ordering team…\",\n 2: \"Cooking up agents…\",\n 3: \"Serving them up hot…\",\n};\n\nfunction getStepCircleClass(done: boolean, active: boolean): string {\n if (done) return \"bg-emerald-400\";\n if (active) return \"bg-[var(--ck-accent-red)] animate-pulse\";\n return \"bg-white/20\";\n}\n\nexport function ScaffoldOverlay({\n open,\n step,\n onDismiss,\n}: {\n open: boolean;\n step: ScaffoldOverlayStep;\n onDismiss?: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n {/* Slightly transparent full-screen overlay so we hide the app while still showing a hint of context. */}\n <div className=\"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none\" />\n\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onDismiss();\n }}\n className=\"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-glass-strong)]\"\n aria-label=\"Dismiss loading overlay\"\n title=\"Dismiss\"\n >\n Esc\n </button>\n ) : null}\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <div className=\"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-2xl font-semibold text-[color:var(--ck-text-primary)]\">Claw Kitchen</div>\n <div className=\"mt-3 text-base text-[color:var(--ck-text-secondary)]\">Hang tight — we’re updating your OpenClaw install.</div>\n\n <div className=\"mt-8 space-y-4 text-base\">\n {[1, 2, 3].map((n) => {\n const s = n as ScaffoldOverlayStep;\n const active = s === step;\n const done = s < step;\n return (\n <div key={s} className=\"flex items-center gap-4\">\n <div className={\"h-4 w-4 rounded-full \" + getStepCircleClass(done, active)} />\n <div className={done ? \"text-[color:var(--ck-text-secondary)] line-through\" : \"text-[color:var(--ck-text-primary)]\"}>\n {stepLabel[s]}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Details removed — avoid noisy/scrolling stderr in the primary UX. */}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","/**\n * Polls until check returns a non-null value or timeout. Returns the value or null on timeout.\n */\nexport async function pollUntil<T>(\n check: () => Promise<T | null>,\n opts: { timeoutMs: number; intervalMs?: number }\n): Promise<T | null> {\n const intervalMs = opts.intervalMs ?? 500;\n const started = Date.now();\n\n while (Date.now() - started < opts.timeoutMs) {\n const result = await check();\n if (result !== null) return result;\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n\n return null;\n}\n","\"use client\";\n\nimport { useEffect, useMemo } from \"react\";\nimport { slugifyId } from \"@/lib/slugify\";\n\n/** Manages name -> slugified id with touch tracking. Resets on modal close. */\nexport function useSlugifiedId(opts: {\n open: boolean;\n name: string;\n setName: (v: string) => void;\n id: string;\n setId: (v: string) => void;\n idTouched: boolean;\n setIdTouched: (v: boolean) => void;\n slugify?: (s: string, maxLen?: number) => string;\n}): { derivedId: string; effectiveId: string } {\n const { open, name, setName, id, setId, idTouched, setIdTouched, slugify = slugifyId } = opts;\n\n const derivedId = useMemo(() => slugify(name), [name, slugify]);\n const effectiveId = idTouched ? id : derivedId;\n\n useEffect(() => {\n if (!open) return;\n if (!idTouched) setId(derivedId);\n }, [derivedId, open, idTouched, setId]);\n\n useEffect(() => {\n if (open) return;\n setIdTouched(false);\n setName(\"\");\n setId(\"\");\n }, [open, setIdTouched, setName, setId]);\n\n return { derivedId, effectiveId };\n}\n","\"use client\";\n\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\n\nexport function CreateModalShell({\n open,\n title,\n recipeId,\n recipeName,\n children,\n error,\n busy,\n canConfirm,\n onClose,\n onConfirm,\n confirmLabel,\n}: {\n open: boolean;\n title: string;\n recipeId: string;\n recipeName: string;\n children: React.ReactNode;\n error?: string | null;\n busy?: boolean;\n canConfirm: boolean;\n onClose: () => void;\n onConfirm: () => void;\n confirmLabel: string;\n}) {\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title={title}\n error={error}\n confirmLabel={confirmLabel}\n confirmBusyLabel=\"Creating…\"\n confirmDisabled={!canConfirm}\n busy={busy}\n onConfirm={onConfirm}\n >\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Create a new {title.toLowerCase().replace(\"create \", \"\")} from recipe{\" \"}\n <code className=\"font-mono\">{recipeId}</code>\n {recipeName ? (\n <>\n {\" \"}(<span className=\"font-medium\">{recipeName}</span>)\n </>\n ) : null}\n .\n </p>\n {children}\n </ConfirmationModal>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSlugifiedId } from \"@/lib/use-slugified-id\";\nimport { CreateModalShell } from \"./CreateModalShell\";\n\nexport function CreateTeamModal({\n open,\n recipeId,\n recipeName,\n teamId,\n setTeamId,\n installCron,\n setInstallCron,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n teamId: string;\n setTeamId: (v: string) => void;\n installCron: boolean;\n setInstallCron: (v: boolean) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [teamName, setTeamName] = useState(\"\");\n const [idTouched, setIdTouched] = useState(false);\n\n const { effectiveId } = useSlugifiedId({\n open,\n name: teamName,\n setName: setTeamName,\n id: teamId,\n setId: setTeamId,\n idTouched,\n setIdTouched,\n });\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create team\"\n recipeId={recipeId}\n recipeName={recipeName}\n error={error}\n busy={busy}\n canConfirm={!!effectiveId.trim()}\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create team\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team name</label>\n <input\n value={teamName}\n onChange={(e) => setTeamName(e.target.value)}\n placeholder=\"e.g. Crypto Team\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setTeamId(e.target.value);\n }}\n placeholder=\"e.g. my-team\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config.\n </div>\n </div>\n\n <label className=\"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={installCron} onChange={(e) => setInstallCron(e.target.checked)} />\n Install cron jobs from this recipe\n </label>\n </CreateModalShell>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { CreateModalShell } from \"./CreateModalShell\";\nimport { fetchJsonWithStatus } from \"@/lib/fetch-json\";\n\ntype LocalAgentCatalogItem =\n | {\n kind: \"team-role\";\n recipeId: string;\n recipeName?: string;\n roleId: string;\n roleName?: string;\n }\n | {\n kind: \"single-agent\";\n recipeId: string;\n recipeName?: string;\n description?: string;\n };\n\ntype SelectedRole = { agentId: string; roleId: string; displayName: string };\n\nfunction defaultRoleIdFromAgentId(agentId: string) {\n // Strip any existing team prefix if present; keep it sluggy.\n const id = agentId.split(\"/\").pop() || agentId;\n const last = id.split(\"-\").slice(-1)[0] || id;\n return last.toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\");\n}\n\nfunction normalizeTeamIdInput(v: string) {\n // UX: when the user types spaces, turn them into dashes (live).\n // Also keep it lowercase to match id rules.\n return v.toLowerCase().replace(/\\s+/g, \"-\");\n}\n\nfunction isValidId(id: string) {\n return /^[a-z0-9][a-z0-9_-]{1,62}$/.test(id);\n}\n\nfunction isValidTeamId(id: string) {\n // OpenClaw scaffold-team constraint.\n return isValidId(id) && id.endsWith(\"-team\");\n}\n\nexport function CreateCustomTeamModal({\n open,\n teamId,\n setTeamId,\n busy,\n error,\n onClose,\n onConfirm,\n onRolesChange,\n}: {\n open: boolean;\n teamId: string;\n setTeamId: (v: string) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n onRolesChange: (roles: SelectedRole[]) => void;\n}) {\n const [catalog, setCatalog] = useState<LocalAgentCatalogItem[]>([]);\n const [catalogError, setCatalogError] = useState<string | null>(null);\n const [catalogQuery, setCatalogQuery] = useState<string>(\"\");\n const [selected, setSelected] = useState<Record<string, SelectedRole>>({});\n\n const [previewMd, setPreviewMd] = useState<string | null>(null);\n const [previewPath, setPreviewPath] = useState<string | null>(null);\n const [previewError, setPreviewError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n const res = await fetchJsonWithStatus<{ ok?: boolean; items?: LocalAgentCatalogItem[]; error?: string }>(\n \"/api/recipes/local-agent-catalog\",\n { cache: \"no-store\" },\n );\n if (cancelled) return;\n if (!res.ok) {\n setCatalogError(res.error || \"Failed to load local agent catalog\");\n return;\n }\n if (!res.data.ok) {\n setCatalogError(res.data.error || \"Failed to load local agent catalog\");\n return;\n }\n setCatalog(Array.isArray(res.data.items) ? res.data.items : []);\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n const [availability, setAvailability] = useState<\n | { state: \"unknown\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string }\n >({ state: \"unknown\" });\n\n const agentChoices = useMemo(() => {\n const needle = catalogQuery.trim().toLowerCase();\n\n const list = catalog.map((it) => {\n if (it.kind === \"team-role\") {\n const key = `team:${it.recipeId}:${it.roleId}`;\n const recipeLabel = it.recipeName || it.recipeId;\n const roleLabel = it.roleName ? `${it.roleName} (${it.roleId})` : it.roleId;\n return {\n id: key,\n label: `${recipeLabel} → ${roleLabel}`,\n roleId: it.roleId,\n displayName: it.roleName || `${recipeLabel} ${it.roleId}`,\n haystack: `${it.recipeId} ${it.recipeName || \"\"} ${it.roleId} ${it.roleName || \"\"}`.toLowerCase(),\n };\n }\n\n const key = `agent:${it.recipeId}`;\n const recipeLabel = it.recipeName || it.recipeId;\n const descriptionSuffix = it.description ? ` — ${it.description}` : \"\";\n return {\n id: key,\n label: `${recipeLabel} (agent recipe: ${it.recipeId})${descriptionSuffix}`,\n roleId: defaultRoleIdFromAgentId(it.recipeId),\n displayName: recipeLabel,\n haystack: `${it.recipeId} ${it.recipeName || \"\"} ${it.description || \"\"}`.toLowerCase(),\n };\n });\n\n const filtered = needle ? list.filter((x) => x.haystack.includes(needle)) : list;\n\n return filtered\n .slice()\n .sort((a, b) => a.label.localeCompare(b.label))\n .map(({ haystack: _unusedHaystack, ...rest }) => rest);\n }, [catalog, catalogQuery]);\n\n const roles = useMemo(() => Object.values(selected), [selected]);\n\n const teamIdTrimmed = teamId.trim();\n const teamIdError = useMemo(() => {\n if (!open) return null;\n if (!teamIdTrimmed) return \"Team id is required.\";\n if (!isValidId(teamIdTrimmed)) {\n return \"Invalid team id. Use lowercase letters/numbers with - or _ (2-63 chars).\";\n }\n if (!teamIdTrimmed.endsWith(\"-team\")) {\n return \"Team id must end with -team.\";\n }\n if (availability.state === \"taken\") {\n return `Team id is already taken: ${teamIdTrimmed}`;\n }\n return null;\n }, [open, teamIdTrimmed, availability.state]);\n\n const roleErrors = useMemo(() => {\n const errors = new Map<string, string>();\n for (const r of roles) {\n const roleId = String(r.roleId ?? \"\").trim();\n if (!roleId) {\n errors.set(r.agentId, \"Role id is required.\");\n continue;\n }\n if (!isValidId(roleId)) {\n errors.set(r.agentId, \"Invalid role id (lowercase letters/numbers with - or _).\" );\n }\n }\n return errors;\n }, [roles]);\n\n const canConfirm =\n !teamIdError &&\n availability.state !== \"checking\" &&\n availability.state !== \"unknown\" &&\n roles.length > 0 &&\n roleErrors.size === 0;\n\n useEffect(() => {\n if (!open) return;\n onRolesChange(roles);\n }, [open, roles, onRolesChange]);\n\n // Team id availability check (debounced).\n useEffect(() => {\n if (!open) return;\n\n let cancelled = false;\n const t = setTimeout(async () => {\n if (!teamIdTrimmed || !isValidTeamId(teamIdTrimmed)) {\n setAvailability({ state: \"unknown\" });\n return;\n }\n\n setAvailability({ state: \"checking\" });\n\n const res = await fetchJsonWithStatus<{ ok?: boolean; available?: boolean; reason?: string; error?: string }>(\n `/api/ids/check?kind=team&id=${encodeURIComponent(teamIdTrimmed)}`,\n { cache: \"no-store\" },\n );\n\n if (cancelled) return;\n\n if (!res.ok) {\n setAvailability({ state: \"unknown\" });\n return;\n }\n\n if (res.data.ok && res.data.available === true) {\n setAvailability({ state: \"available\" });\n return;\n }\n\n setAvailability({ state: \"taken\", reason: res.data.reason });\n }, 250);\n\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [open, teamIdTrimmed]);\n\n // Best-effort preview (debounced).\n useEffect(() => {\n if (!open) return;\n if (!canConfirm) return;\n\n let cancelled = false;\n const t = setTimeout(async () => {\n const baseRecipeId = teamIdTrimmed.endsWith(\"-team\") ? teamIdTrimmed.slice(0, -\"-team\".length) : teamIdTrimmed;\n\n const res = await fetchJsonWithStatus<{\n ok?: boolean;\n error?: string;\n md?: string;\n filePath?: string;\n }>(\"/api/recipes/custom-team\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n dryRun: true,\n recipeId: baseRecipeId,\n teamId: teamIdTrimmed,\n roles: roles.map((r) => ({ roleId: r.roleId, displayName: r.displayName })),\n }),\n });\n\n if (cancelled) return;\n\n if (!res.ok) {\n setPreviewError(res.error);\n setPreviewMd(null);\n setPreviewPath(null);\n return;\n }\n if (!res.data.ok) {\n setPreviewError(res.data.error || \"Failed to generate preview\");\n setPreviewMd(null);\n setPreviewPath(null);\n return;\n }\n\n setPreviewError(null);\n setPreviewMd(typeof res.data.md === \"string\" ? res.data.md : null);\n setPreviewPath(typeof res.data.filePath === \"string\" ? res.data.filePath : null);\n }, 250);\n\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [open, canConfirm, teamIdTrimmed, roles]);\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create custom team\"\n recipeId={\"(new recipe)\"}\n recipeName={\"Custom Team\"}\n error={error || catalogError}\n busy={busy}\n canConfirm={canConfirm}\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create team\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={teamId}\n onChange={(e) => setTeamId(normalizeTeamIdInput(e.target.value))}\n placeholder=\"e.g. my-team\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n {teamIdError ? <div className=\"mt-2 text-xs text-red-300\">{teamIdError}</div> : null}\n {!teamIdError && teamIdTrimmed ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {availability.state === \"checking\" ? \"Checking availability…\" : null}\n {availability.state === \"available\" ? \"Available.\" : null}\n </div>\n ) : null}\n </div>\n\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Select agents</div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n MVP: this creates new team roles that mirror the selected agents' names. You can edit the\n resulting team recipe later.\n </div>\n\n <div className=\"mt-3\">\n <input\n value={catalogQuery}\n onChange={(e) => setCatalogQuery(e.target.value)}\n placeholder=\"Search local roles/agents (recipe id, name, role)\"\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n />\n\n <div className=\"mt-3 max-h-[220px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3\">\n {catalogError ? <div className=\"text-sm text-red-300\">{catalogError}</div> : null}\n {!catalogError && agentChoices.length === 0 ? (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No local roles/agents found.</div>\n ) : null}\n {!catalogError && agentChoices.length ? (\n <div className=\"space-y-2\">\n {agentChoices.map((a) => {\n const checked = !!selected[a.id];\n return (\n <label key={a.id} className=\"flex items-start gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => {\n const next = { ...selected };\n if (e.target.checked) {\n next[a.id] = {\n agentId: a.id,\n roleId: a.roleId,\n displayName: a.displayName,\n };\n } else {\n delete next[a.id];\n }\n setSelected(next);\n }}\n />\n <span className=\"min-w-0 break-words\">{a.label}</span>\n </label>\n );\n })}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n\n {roles.length ? (\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Role mapping</div>\n <div className=\"mt-3 space-y-3\">\n {roles.map((r) => {\n const roleErr = roleErrors.get(r.agentId);\n return (\n <div key={r.agentId} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{r.agentId}</div>\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Role id</label>\n <input\n value={r.roleId}\n onChange={(e) => {\n setSelected((prev) => ({\n ...prev,\n [r.agentId]: { ...prev[r.agentId], roleId: e.target.value },\n }));\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n {roleErr ? <div className=\"mt-1 text-xs text-red-300\">{roleErr}</div> : null}\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Display name</label>\n <input\n value={r.displayName}\n onChange={(e) => {\n setSelected((prev) => ({\n ...prev,\n [r.agentId]: { ...prev[r.agentId], displayName: e.target.value },\n }));\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n ) : null}\n\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Preview</div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Generated recipe preview (best-effort). This is what will be written to\n <code className=\"ml-1\">~/.openclaw/workspace/recipes/<teamId>.md</code>.\n </div>\n {canConfirm && previewError ? <div className=\"mt-2 text-xs text-red-300\">{previewError}</div> : null}\n {canConfirm && previewPath ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Target path: <code>{previewPath}</code>\n </div>\n ) : null}\n <pre className=\"mt-3 max-h-[260px] overflow-auto whitespace-pre-wrap rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-3 text-xs text-[color:var(--ck-text-secondary)]\">\n {canConfirm ? previewMd || \"(Loading preview…)\" : \"(Select a valid team id and at least one agent to preview.)\"}\n </pre>\n </div>\n </CreateModalShell>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { useSlugifiedId } from \"@/lib/use-slugified-id\";\nimport { CreateModalShell } from \"./CreateModalShell\";\n\nfunction getAvailabilityBorderClass(state: string): string {\n if (state === \"available\") return \"border-emerald-400/50\";\n if (state === \"taken\") return \"border-red-400/60\";\n return \"border-white/10\";\n}\n\nfunction getAvailabilityHint(state: string): string {\n if (state === \"taken\") return \"That id is already taken.\";\n if (state === \"available\") return \"Id is available.\";\n return \"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config.\";\n}\n\ntype Availability =\n | { state: \"empty\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string };\n\n/** Sync availability from local arrays (no fetch). Returns null when API check needed. */\nfunction syncAvailability(\n v: string,\n existingRecipeIds: string[],\n existingAgentIds: string[]\n): Availability | null {\n if (!v) return { state: \"empty\" };\n if (existingRecipeIds.includes(v)) return { state: \"taken\", reason: \"recipe-id-collision\" };\n if (existingAgentIds.includes(v)) return { state: \"taken\", reason: \"agent-exists\" };\n return null;\n}\n\nexport function CreateAgentModal({\n open,\n recipeId,\n recipeName,\n agentId,\n setAgentId,\n agentName,\n setAgentName,\n existingRecipeIds,\n existingAgentIds,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n agentId: string;\n setAgentId: (v: string) => void;\n agentName: string;\n setAgentName: (v: string) => void;\n existingRecipeIds: string[];\n existingAgentIds: string[];\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [idTouched, setIdTouched] = useState(false);\n const [apiAvailability, setApiAvailability] = useState<Availability | null>(null);\n\n const { effectiveId } = useSlugifiedId({\n open,\n name: agentName,\n setName: setAgentName,\n id: agentId,\n setId: setAgentId,\n idTouched,\n setIdTouched,\n });\n\n const v = String(effectiveId ?? \"\").trim();\n const syncAvail = useMemo(\n () => (open ? syncAvailability(v, existingRecipeIds, existingAgentIds) : { state: \"empty\" as const }),\n [open, v, existingRecipeIds, existingAgentIds]\n );\n\n const availability: Availability = syncAvail ?? apiAvailability ?? { state: \"available\" };\n\n useEffect(() => {\n if (!open || syncAvail !== null) return;\n const t = setTimeout(() => {\n void (async () => {\n setApiAvailability({ state: \"checking\" });\n try {\n const json = await fetchJson<{ ok?: boolean; available?: boolean; reason?: string }>(\n `/api/ids/check?kind=agent&id=${encodeURIComponent(v)}`,\n { cache: \"no-store\" }\n );\n if (json.available) setApiAvailability({ state: \"available\" });\n else setApiAvailability({ state: \"taken\", reason: json.reason });\n } catch {\n setApiAvailability({ state: \"available\" });\n }\n })();\n }, 250);\n return () => clearTimeout(t);\n }, [open, syncAvail, v]);\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create agent\"\n recipeId={recipeId}\n recipeName={recipeName}\n error={error}\n busy={busy}\n canConfirm={\n !!effectiveId.trim() &&\n availability.state !== \"taken\" &&\n availability.state !== \"checking\"\n }\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create agent\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent name</label>\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\n placeholder=\"e.g. Crypto Onchain\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setAgentId(e.target.value);\n }}\n placeholder=\"e.g. crypto-onchain\"\n className={\n \"mt-2 w-full rounded-[var(--ck-radius-sm)] border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] \" +\n getAvailabilityBorderClass(availability.state)\n }\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {getAvailabilityHint(availability.state)}\n </div>\n </div>\n </CreateModalShell>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/recipes/recipes-client.tsx","../../../../src/components/ScaffoldOverlay.tsx","../../../../src/lib/poll.ts","../../../../src/lib/use-slugified-id.ts","../../../../src/app/recipes/CreateModalShell.tsx","../../../../src/app/recipes/CreateTeamModal.tsx","../../../../src/app/recipes/CreateCustomTeamModal.tsx","../../../../src/app/recipes/CreateAgentModal.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useState } from \"react\";\nimport { ScaffoldOverlay, type ScaffoldOverlayStep } from \"@/components/ScaffoldOverlay\";\nimport { fetchJsonWithStatus } from \"@/lib/fetch-json\";\nimport { pollUntil } from \"@/lib/poll\";\nimport { fetchScaffold } from \"@/lib/scaffold-client\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { CreateTeamModal } from \"./CreateTeamModal\";\nimport { CreateCustomTeamModal } from \"./CreateCustomTeamModal\";\nimport { CreateAgentModal } from \"./CreateAgentModal\";\nimport { DeleteRecipeModal } from \"@/components/delete-modals\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype Recipe = {\n id: string;\n name: string;\n kind: \"agent\" | \"team\";\n source: \"builtin\" | \"workspace\";\n};\n\nfunction getEditLabel(isInstalledAgent: boolean, source: string): string {\n if (isInstalledAgent) return \"Edit agent\";\n if (source === \"builtin\") return \"View recipe\";\n return \"Edit recipe\";\n}\n\nfunction RecipesSection({\n title,\n items,\n onDelete,\n onCreateTeam,\n onCreateAgent,\n installedAgentIds,\n}: {\n title: string;\n items: Recipe[];\n onDelete?: (id: string) => void;\n onCreateTeam?: (r: Recipe) => void;\n onCreateAgent?: (r: Recipe) => void;\n installedAgentIds: string[];\n}) {\n return (\n <section>\n <h2 className=\"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">{title}</h2>\n\n {items.length === 0 ? (\n <div className=\"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]\">None yet.</div>\n ) : (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {items.map((r) => {\n const isInstalledAgent = r.kind === \"agent\" && installedAgentIds.includes(r.id);\n const editHref = isInstalledAgent\n ? `/agents/${encodeURIComponent(r.id)}`\n : `/recipes/${encodeURIComponent(r.id)}`;\n const editLabel = getEditLabel(isInstalledAgent, r.source);\n\n return (\n <div\n key={`${r.source}:${r.id}`}\n className=\"ck-card flex flex-col gap-3 px-4 py-3\"\n >\n <div>\n <div className=\"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words\">\n {r.name}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{r.id}</span> • {r.kind} • {r.source}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {r.kind === \"team\" && onCreateTeam ? (\n <button\n type=\"button\"\n onClick={() => onCreateTeam(r)}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create team\n </button>\n ) : null}\n\n {r.kind === \"agent\" && onCreateAgent ? (\n <button\n type=\"button\"\n onClick={() => onCreateAgent(r)}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create agent\n </button>\n ) : null}\n\n <Link\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n href={editHref}\n >\n {editLabel}\n </Link>\n\n {onDelete ? (\n <button\n type=\"button\"\n onClick={() => onDelete(r.id)}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Delete\n </button>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </section>\n );\n}\n\nexport default function RecipesClient({\n builtin,\n customTeamRecipes,\n customAgentRecipes,\n installedAgentIds,\n initialOpenCustomTeam = false,\n}: {\n builtin: Recipe[];\n customTeamRecipes: Recipe[];\n customAgentRecipes: Recipe[];\n installedAgentIds: string[];\n initialOpenCustomTeam?: boolean;\n}) {\n const toast = useToast();\n\n const [overlayOpen, setOverlayOpen] = useState(false);\n const [overlayStep, setOverlayStep] = useState<ScaffoldOverlayStep>(1);\n const router = useRouter();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [busy, setBusy] = useState(false);\n const [modalError, setModalError] = useState<string | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n const [createRecipe, setCreateRecipe] = useState<Recipe | null>(null);\n const [createTeamId, setCreateTeamId] = useState<string>(\"\");\n const [installCron, setInstallCron] = useState(true);\n const [createBusy, setCreateBusy] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const [createAgentOpen, setCreateAgentOpen] = useState(false);\n const [createAgentRecipe, setCreateAgentRecipe] = useState<Recipe | null>(null);\n const [createAgentId, setCreateAgentId] = useState<string>(\"\");\n const [createAgentName, setCreateAgentName] = useState<string>(\"\");\n const [createAgentBusy, setCreateAgentBusy] = useState(false);\n const [createAgentError, setCreateAgentError] = useState<string | null>(null);\n\n const [createCustomTeamOpen, setCreateCustomTeamOpen] = useState(initialOpenCustomTeam);\n const [createCustomTeamId, setCreateCustomTeamId] = useState<string>(\"\");\n const [createCustomTeamBusy, setCreateCustomTeamBusy] = useState(false);\n const [createCustomTeamError, setCreateCustomTeamError] = useState<string | null>(null);\n const [customTeamRoles, setCustomTeamRoles] = useState<Array<{ agentId: string; roleId: string; displayName: string }>>(\n [],\n );\n\n const onDelete = (id: string) => {\n setDeleteId(id);\n setModalError(null);\n setDeleteOpen(true);\n };\n\n const onCreateTeam = (r: Recipe) => {\n setCreateRecipe(r);\n setCreateTeamId(\"\");\n setInstallCron(true);\n setCreateError(null);\n setCreateOpen(true);\n };\n\n const onCreateAgent = (r: Recipe) => {\n setCreateAgentRecipe(r);\n setCreateAgentId(\"\");\n setCreateAgentName(\"\");\n setCreateAgentError(null);\n setCreateAgentOpen(true);\n };\n\n const onCreateCustomTeam = () => {\n setCreateCustomTeamId(\"\");\n setCustomTeamRoles([]);\n setCreateCustomTeamError(null);\n setCreateCustomTeamOpen(true);\n };\n\n async function confirmDelete() {\n setBusy(true);\n setModalError(null);\n try {\n const result = await fetchJsonWithStatus<{ ok?: boolean; error?: string }>(\"/api/recipes/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n if (!result.ok) {\n if (result.status === 409) {\n setModalError(result.error);\n return;\n }\n throw new Error(result.error);\n }\n if (!result.data.ok) {\n setModalError(result.data.error ?? \"Delete failed\");\n return;\n }\n toast.push({ kind: \"success\", message: `Deleted recipe: ${deleteId}` });\n setDeleteOpen(false);\n window.location.reload();\n } catch (e: unknown) {\n toast.push({ kind: \"error\", message: errorMessage(e) });\n } finally {\n setBusy(false);\n }\n }\n\n async function waitForKitchenHealthy(opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const result = await pollUntil<boolean>(\n async () => {\n try {\n const res = await fetch(\"/healthz\", { cache: \"no-store\" });\n return res.ok ? true : null;\n } catch {\n return null;\n }\n },\n { timeoutMs }\n );\n return result ?? false;\n }\n\n async function waitForTeamPageReady(teamId: string, opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const result = await pollUntil<boolean>(\n async () => {\n try {\n const [recipesRes, metaRes] = await Promise.all([\n fetch(\"/api/recipes\", { cache: \"no-store\" }),\n fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n\n const recipesJson = (await recipesRes.json()) as { recipes?: Array<{ id?: unknown; kind?: unknown }> };\n const list = Array.isArray(recipesJson.recipes) ? recipesJson.recipes : [];\n const hasRecipe = list.some((r) => String(r.id ?? \"\") === teamId && String(r.kind ?? \"\") === \"team\");\n\n const metaJson = (await metaRes.json()) as { ok?: boolean; missing?: boolean };\n const hasMeta = Boolean(metaRes.ok && metaJson.ok && !metaJson.missing);\n\n return hasRecipe && hasMeta ? true : null;\n } catch {\n return null;\n }\n },\n { timeoutMs }\n );\n return result ?? false;\n }\n\n async function attachTeamMeta(teamId: string, recipeId: string, recipeName: string) {\n const res = await fetchJsonWithStatus<{ ok?: boolean; error?: string }>(\"/api/teams/meta\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, recipeId, recipeName }),\n });\n if (!res.ok) throw new Error(res.error);\n if (!res.data.ok) throw new Error(res.data.error || \"Failed to attach team meta\");\n }\n\n function validateTeamIdForCreate(recipe: { id: string } | null, teamId: string): string | null {\n if (!recipe) return null;\n const t = teamId.trim();\n if (!t) return \"Team id is required.\";\n if (!t.endsWith(\"-team\")) return \"Team id must end with -team.\";\n if (t === recipe.id) return `Team id cannot be the same as the recipe id (${recipe.id}). Choose a new team id.`;\n return null;\n }\n\n async function scaffoldWithOverlay(opts: {\n kind: \"team\" | \"agent\";\n recipeId: string;\n teamId?: string;\n agentId?: string;\n name?: string;\n cronInstallChoice?: \"yes\" | \"no\";\n setBusy: (v: boolean) => void;\n setError: (v: string | null) => void;\n setModalOpen: (v: boolean) => void;\n setOverlayOpen: (v: boolean) => void;\n setOverlayStep: React.Dispatch<React.SetStateAction<ScaffoldOverlayStep>>;\n successMessage: string;\n navigateTo: string;\n waitBeforeNavigate?: () => Promise<unknown>;\n }) {\n const {\n kind,\n recipeId,\n teamId,\n agentId,\n name,\n cronInstallChoice,\n setBusy,\n setError,\n setModalOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage,\n navigateTo,\n waitBeforeNavigate,\n } = opts;\n\n setBusy(true);\n setError(null);\n setModalOpen(false);\n setOverlayOpen(true);\n setOverlayStep(1);\n\n let serveTimer: ReturnType<typeof setTimeout> | null = null;\n\n try {\n const body =\n kind === \"team\"\n ? { kind: \"team\" as const, recipeId, teamId: teamId!, cronInstallChoice }\n : { kind: \"agent\" as const, recipeId, agentId: agentId!, name };\n const { res, json } = await fetchScaffold(body);\n if (!res.ok || !(json as { ok?: boolean }).ok)\n throw new Error(\n String((json as { error?: string }).error || (kind === \"team\" ? \"Create team failed\" : \"Create agent failed\"))\n );\n\n setOverlayStep(2);\n\n serveTimer = setTimeout(() => {\n setOverlayStep((prev) => (prev < 3 ? 3 : prev));\n }, 20_000);\n\n const stderr = typeof (json as { stderr?: unknown }).stderr === \"string\" ? (json as { stderr: string }).stderr : \"\";\n\n if (/Failed to start CLI:/i.test(stderr) || /\\bError: /i.test(stderr)) {\n throw new Error(stderr.trim() || \"Scaffold failed\");\n }\n\n if (/Restart required:/i.test(stderr)) {\n setOverlayStep(3);\n try {\n await fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // best-effort\n }\n await waitForKitchenHealthy({ timeoutMs: 60_000 });\n }\n\n if (waitBeforeNavigate) {\n await waitBeforeNavigate();\n }\n\n if (serveTimer) clearTimeout(serveTimer);\n\n toast.push({ kind: \"success\", message: successMessage });\n setModalOpen(false);\n\n router.push(navigateTo);\n\n setTimeout(() => setOverlayOpen(false), 500);\n } catch (e: unknown) {\n if (serveTimer) clearTimeout(serveTimer);\n setOverlayOpen(false);\n const msg = errorMessage(e);\n setError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setBusy(false);\n }\n }\n\n async function confirmCreateTeam() {\n const recipe = createRecipe;\n const err = validateTeamIdForCreate(recipe, createTeamId);\n if (err) {\n setCreateError(err);\n return;\n }\n if (!recipe) return;\n\n const t = createTeamId.trim();\n await scaffoldWithOverlay({\n kind: \"team\",\n recipeId: recipe.id,\n teamId: t,\n cronInstallChoice: installCron ? \"yes\" : \"no\",\n setBusy: setCreateBusy,\n setError: setCreateError,\n setModalOpen: setCreateOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created team: ${t}`,\n navigateTo: `/teams/${encodeURIComponent(t)}`,\n waitBeforeNavigate: () => waitForTeamPageReady(t, { timeoutMs: 60_000 }),\n });\n }\n\n async function confirmCreateAgent() {\n const recipe = createAgentRecipe;\n if (!recipe) return;\n\n const a = createAgentId.trim();\n if (!a) {\n setCreateAgentError(\"Agent id is required.\");\n return;\n }\n if (a === recipe.id) {\n setCreateAgentError(`Agent id cannot be the same as the recipe id (${recipe.id}). Choose a new agent id.`);\n return;\n }\n\n await scaffoldWithOverlay({\n kind: \"agent\",\n recipeId: recipe.id,\n agentId: a,\n name: createAgentName.trim() || undefined,\n setBusy: setCreateAgentBusy,\n setError: setCreateAgentError,\n setModalOpen: setCreateAgentOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created agent: ${a}`,\n navigateTo: `/agents/${encodeURIComponent(a)}`,\n });\n }\n\n async function confirmCreateCustomTeam() {\n const teamId = createCustomTeamId.trim();\n if (!teamId) {\n setCreateCustomTeamError(\"Team id is required.\");\n return;\n }\n const recipeId = teamId.endsWith(\"-team\") ? teamId.slice(0, -\"-team\".length) : teamId;\n if (!recipeId) {\n setCreateCustomTeamError(\"Team id is invalid.\");\n return;\n }\n if (customTeamRoles.length < 1) {\n setCreateCustomTeamError(\"Select at least one agent.\");\n return;\n }\n\n setCreateCustomTeamError(null);\n\n try {\n setCreateCustomTeamBusy(true);\n const createRes = await fetchJsonWithStatus<{ ok?: boolean; error?: string; recipeId?: string }>(\n \"/api/recipes/custom-team\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n recipeId,\n teamId,\n roles: customTeamRoles.map((r) => ({ roleId: r.roleId, displayName: r.displayName })),\n }),\n },\n );\n setCreateCustomTeamBusy(false);\n\n if (!createRes.ok) {\n throw new Error(createRes.error);\n }\n if (!createRes.data.ok) {\n throw new Error(createRes.data.error || \"Failed to create custom team recipe\");\n }\n\n await scaffoldWithOverlay({\n kind: \"team\",\n recipeId,\n teamId,\n cronInstallChoice: \"no\",\n setBusy: setCreateCustomTeamBusy,\n setError: setCreateCustomTeamError,\n setModalOpen: setCreateCustomTeamOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created team: ${teamId}`,\n navigateTo: `/teams/${encodeURIComponent(teamId)}`,\n waitBeforeNavigate: async () => {\n // Some scaffold paths may not persist team.json (meta) immediately.\n // Ensure it exists so the team editor loads reliably.\n await attachTeamMeta(teamId, recipeId, \"Custom Team\");\n await waitForTeamPageReady(teamId, { timeoutMs: 60_000 });\n },\n });\n } catch (e: unknown) {\n setCreateCustomTeamBusy(false);\n const msg = errorMessage(e);\n setCreateCustomTeamError(msg);\n toast.push({ kind: \"error\", message: msg });\n }\n }\n\n return (\n <>\n <ScaffoldOverlay\n open={overlayOpen}\n step={overlayStep}\n onDismiss={() => {\n setOverlayOpen(false);\n }}\n />\n <div className=\"mt-8 space-y-10\">\n <section>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n <div>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Custom recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n Workspace recipes (editable) — stored under <code className=\"font-mono\">~/.openclaw/workspace/recipes/</code>.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onCreateCustomTeam}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create custom team\n </button>\n </div>\n\n <div className=\"mt-4 space-y-8\">\n <RecipesSection\n title={`Teams (${customTeamRecipes.length})`}\n items={customTeamRecipes}\n onDelete={onDelete}\n onCreateTeam={onCreateTeam}\n installedAgentIds={installedAgentIds}\n />\n <RecipesSection\n title={`Agents (${customAgentRecipes.length})`}\n items={customAgentRecipes}\n onDelete={onDelete}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Builtin recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">Bundled recipes shipped with the plugin.</p>\n\n <div className=\"mt-4\">\n <RecipesSection\n title={`All (${builtin.length})`}\n items={builtin}\n onCreateTeam={onCreateTeam}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n </div>\n\n <DeleteRecipeModal\n open={deleteOpen}\n recipeId={deleteId}\n busy={busy}\n error={modalError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <CreateCustomTeamModal\n open={createCustomTeamOpen}\n teamId={createCustomTeamId}\n setTeamId={setCreateCustomTeamId}\n busy={createCustomTeamBusy}\n error={createCustomTeamError}\n onRolesChange={setCustomTeamRoles}\n onClose={() => setCreateCustomTeamOpen(false)}\n onConfirm={confirmCreateCustomTeam}\n />\n\n <CreateTeamModal\n open={createOpen}\n recipeId={createRecipe?.id ?? \"\"}\n recipeName={createRecipe?.name ?? \"\"}\n teamId={createTeamId}\n setTeamId={setCreateTeamId}\n installCron={installCron}\n setInstallCron={setInstallCron}\n busy={createBusy}\n error={createError}\n onClose={() => setCreateOpen(false)}\n onConfirm={confirmCreateTeam}\n />\n\n <CreateAgentModal\n open={createAgentOpen}\n recipeId={createAgentRecipe?.id ?? \"\"}\n recipeName={createAgentRecipe?.name ?? \"\"}\n agentId={createAgentId}\n setAgentId={setCreateAgentId}\n agentName={createAgentName}\n setAgentName={setCreateAgentName}\n existingRecipeIds={[...builtin, ...customTeamRecipes, ...customAgentRecipes].map((r) => r.id)}\n existingAgentIds={installedAgentIds}\n busy={createAgentBusy}\n error={createAgentError}\n onClose={() => setCreateAgentOpen(false)}\n onConfirm={confirmCreateAgent}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport type ScaffoldOverlayStep = 1 | 2 | 3;\n\nconst stepLabel: Record<ScaffoldOverlayStep, string> = {\n 1: \"Ordering team…\",\n 2: \"Cooking up agents…\",\n 3: \"Serving them up hot…\",\n};\n\nfunction getStepCircleClass(done: boolean, active: boolean): string {\n if (done) return \"bg-emerald-400\";\n if (active) return \"bg-[var(--ck-accent-red)] animate-pulse\";\n return \"bg-white/20\";\n}\n\nexport function ScaffoldOverlay({\n open,\n step,\n onDismiss,\n}: {\n open: boolean;\n step: ScaffoldOverlayStep;\n onDismiss?: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n {/* Slightly transparent full-screen overlay so we hide the app while still showing a hint of context. */}\n <div className=\"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none\" />\n\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onDismiss();\n }}\n className=\"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-soft)]\"\n aria-label=\"Dismiss loading overlay\"\n title=\"Dismiss\"\n >\n Esc\n </button>\n ) : null}\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <div className=\"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-2xl font-semibold text-[color:var(--ck-text-primary)]\">Claw Kitchen</div>\n <div className=\"mt-3 text-base text-[color:var(--ck-text-secondary)]\">Hang tight — we’re updating your OpenClaw install.</div>\n\n <div className=\"mt-8 space-y-4 text-base\">\n {[1, 2, 3].map((n) => {\n const s = n as ScaffoldOverlayStep;\n const active = s === step;\n const done = s < step;\n return (\n <div key={s} className=\"flex items-center gap-4\">\n <div className={\"h-4 w-4 rounded-full \" + getStepCircleClass(done, active)} />\n <div className={done ? \"text-[color:var(--ck-text-secondary)] line-through\" : \"text-[color:var(--ck-text-primary)]\"}>\n {stepLabel[s]}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Details removed — avoid noisy/scrolling stderr in the primary UX. */}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","/**\n * Polls until check returns a non-null value or timeout. Returns the value or null on timeout.\n */\nexport async function pollUntil<T>(\n check: () => Promise<T | null>,\n opts: { timeoutMs: number; intervalMs?: number }\n): Promise<T | null> {\n const intervalMs = opts.intervalMs ?? 500;\n const started = Date.now();\n\n while (Date.now() - started < opts.timeoutMs) {\n const result = await check();\n if (result !== null) return result;\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n\n return null;\n}\n","\"use client\";\n\nimport { useEffect, useMemo } from \"react\";\nimport { slugifyId } from \"@/lib/slugify\";\n\n/** Manages name -> slugified id with touch tracking. Resets on modal close. */\nexport function useSlugifiedId(opts: {\n open: boolean;\n name: string;\n setName: (v: string) => void;\n id: string;\n setId: (v: string) => void;\n idTouched: boolean;\n setIdTouched: (v: boolean) => void;\n slugify?: (s: string, maxLen?: number) => string;\n}): { derivedId: string; effectiveId: string } {\n const { open, name, setName, id, setId, idTouched, setIdTouched, slugify = slugifyId } = opts;\n\n const derivedId = useMemo(() => slugify(name), [name, slugify]);\n const effectiveId = idTouched ? id : derivedId;\n\n useEffect(() => {\n if (!open) return;\n if (!idTouched) setId(derivedId);\n }, [derivedId, open, idTouched, setId]);\n\n useEffect(() => {\n if (open) return;\n setIdTouched(false);\n setName(\"\");\n setId(\"\");\n }, [open, setIdTouched, setName, setId]);\n\n return { derivedId, effectiveId };\n}\n","\"use client\";\n\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\n\nexport function CreateModalShell({\n open,\n title,\n recipeId,\n recipeName,\n children,\n error,\n busy,\n canConfirm,\n onClose,\n onConfirm,\n confirmLabel,\n}: {\n open: boolean;\n title: string;\n recipeId: string;\n recipeName: string;\n children: React.ReactNode;\n error?: string | null;\n busy?: boolean;\n canConfirm: boolean;\n onClose: () => void;\n onConfirm: () => void;\n confirmLabel: string;\n}) {\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title={title}\n error={error}\n confirmLabel={confirmLabel}\n confirmBusyLabel=\"Creating…\"\n confirmDisabled={!canConfirm}\n busy={busy}\n onConfirm={onConfirm}\n >\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Create a new {title.toLowerCase().replace(\"create \", \"\")} from recipe{\" \"}\n <code className=\"font-mono\">{recipeId}</code>\n {recipeName ? (\n <>\n {\" \"}(<span className=\"font-medium\">{recipeName}</span>)\n </>\n ) : null}\n .\n </p>\n {children}\n </ConfirmationModal>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSlugifiedId } from \"@/lib/use-slugified-id\";\nimport { CreateModalShell } from \"./CreateModalShell\";\n\nexport function CreateTeamModal({\n open,\n recipeId,\n recipeName,\n teamId,\n setTeamId,\n installCron,\n setInstallCron,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n teamId: string;\n setTeamId: (v: string) => void;\n installCron: boolean;\n setInstallCron: (v: boolean) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [teamName, setTeamName] = useState(\"\");\n const [idTouched, setIdTouched] = useState(false);\n\n const { effectiveId } = useSlugifiedId({\n open,\n name: teamName,\n setName: setTeamName,\n id: teamId,\n setId: setTeamId,\n idTouched,\n setIdTouched,\n });\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create team\"\n recipeId={recipeId}\n recipeName={recipeName}\n error={error}\n busy={busy}\n canConfirm={!!effectiveId.trim()}\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create team\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team name</label>\n <input\n value={teamName}\n onChange={(e) => setTeamName(e.target.value)}\n placeholder=\"e.g. Crypto Team\"\n className=\"mt-2 w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setTeamId(e.target.value);\n }}\n placeholder=\"e.g. my-team\"\n className=\"mt-2 w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config.\n </div>\n </div>\n\n <label className=\"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={installCron} onChange={(e) => setInstallCron(e.target.checked)} />\n Install cron jobs from this recipe\n </label>\n </CreateModalShell>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { CreateModalShell } from \"./CreateModalShell\";\nimport { fetchJsonWithStatus } from \"@/lib/fetch-json\";\n\ntype LocalAgentCatalogItem =\n | {\n kind: \"team-role\";\n recipeId: string;\n recipeName?: string;\n roleId: string;\n roleName?: string;\n }\n | {\n kind: \"single-agent\";\n recipeId: string;\n recipeName?: string;\n description?: string;\n };\n\ntype SelectedRole = { agentId: string; roleId: string; displayName: string };\n\nfunction defaultRoleIdFromAgentId(agentId: string) {\n // Strip any existing team prefix if present; keep it sluggy.\n const id = agentId.split(\"/\").pop() || agentId;\n const last = id.split(\"-\").slice(-1)[0] || id;\n return last.toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\");\n}\n\nfunction normalizeTeamIdInput(v: string) {\n // UX: when the user types spaces, turn them into dashes (live).\n // Also keep it lowercase to match id rules.\n return v.toLowerCase().replace(/\\s+/g, \"-\");\n}\n\nfunction isValidId(id: string) {\n return /^[a-z0-9][a-z0-9_-]{1,62}$/.test(id);\n}\n\nfunction isValidTeamId(id: string) {\n // OpenClaw scaffold-team constraint.\n return isValidId(id) && id.endsWith(\"-team\");\n}\n\nexport function CreateCustomTeamModal({\n open,\n teamId,\n setTeamId,\n busy,\n error,\n onClose,\n onConfirm,\n onRolesChange,\n}: {\n open: boolean;\n teamId: string;\n setTeamId: (v: string) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n onRolesChange: (roles: SelectedRole[]) => void;\n}) {\n const [catalog, setCatalog] = useState<LocalAgentCatalogItem[]>([]);\n const [catalogError, setCatalogError] = useState<string | null>(null);\n const [catalogQuery, setCatalogQuery] = useState<string>(\"\");\n const [selected, setSelected] = useState<Record<string, SelectedRole>>({});\n\n const [previewMd, setPreviewMd] = useState<string | null>(null);\n const [previewPath, setPreviewPath] = useState<string | null>(null);\n const [previewError, setPreviewError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n const res = await fetchJsonWithStatus<{ ok?: boolean; items?: LocalAgentCatalogItem[]; error?: string }>(\n \"/api/recipes/local-agent-catalog\",\n { cache: \"no-store\" },\n );\n if (cancelled) return;\n if (!res.ok) {\n setCatalogError(res.error || \"Failed to load local agent catalog\");\n return;\n }\n if (!res.data.ok) {\n setCatalogError(res.data.error || \"Failed to load local agent catalog\");\n return;\n }\n setCatalog(Array.isArray(res.data.items) ? res.data.items : []);\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n const [availability, setAvailability] = useState<\n | { state: \"unknown\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string }\n >({ state: \"unknown\" });\n\n const agentChoices = useMemo(() => {\n const needle = catalogQuery.trim().toLowerCase();\n\n const list = catalog.map((it) => {\n if (it.kind === \"team-role\") {\n const key = `team:${it.recipeId}:${it.roleId}`;\n const recipeLabel = it.recipeName || it.recipeId;\n const roleLabel = it.roleName ? `${it.roleName} (${it.roleId})` : it.roleId;\n return {\n id: key,\n label: `${recipeLabel} → ${roleLabel}`,\n roleId: it.roleId,\n displayName: it.roleName || `${recipeLabel} ${it.roleId}`,\n haystack: `${it.recipeId} ${it.recipeName || \"\"} ${it.roleId} ${it.roleName || \"\"}`.toLowerCase(),\n };\n }\n\n const key = `agent:${it.recipeId}`;\n const recipeLabel = it.recipeName || it.recipeId;\n const descriptionSuffix = it.description ? ` — ${it.description}` : \"\";\n return {\n id: key,\n label: `${recipeLabel} (agent recipe: ${it.recipeId})${descriptionSuffix}`,\n roleId: defaultRoleIdFromAgentId(it.recipeId),\n displayName: recipeLabel,\n haystack: `${it.recipeId} ${it.recipeName || \"\"} ${it.description || \"\"}`.toLowerCase(),\n };\n });\n\n const filtered = needle ? list.filter((x) => x.haystack.includes(needle)) : list;\n\n return filtered\n .slice()\n .sort((a, b) => a.label.localeCompare(b.label))\n .map(({ haystack: _unusedHaystack, ...rest }) => rest);\n }, [catalog, catalogQuery]);\n\n const roles = useMemo(() => Object.values(selected), [selected]);\n\n const teamIdTrimmed = teamId.trim();\n const teamIdError = useMemo(() => {\n if (!open) return null;\n if (!teamIdTrimmed) return \"Team id is required.\";\n if (!isValidId(teamIdTrimmed)) {\n return \"Invalid team id. Use lowercase letters/numbers with - or _ (2-63 chars).\";\n }\n if (!teamIdTrimmed.endsWith(\"-team\")) {\n return \"Team id must end with -team.\";\n }\n if (availability.state === \"taken\") {\n return `Team id is already taken: ${teamIdTrimmed}`;\n }\n return null;\n }, [open, teamIdTrimmed, availability.state]);\n\n const roleErrors = useMemo(() => {\n const errors = new Map<string, string>();\n for (const r of roles) {\n const roleId = String(r.roleId ?? \"\").trim();\n if (!roleId) {\n errors.set(r.agentId, \"Role id is required.\");\n continue;\n }\n if (!isValidId(roleId)) {\n errors.set(r.agentId, \"Invalid role id (lowercase letters/numbers with - or _).\" );\n }\n }\n return errors;\n }, [roles]);\n\n const canConfirm =\n !teamIdError &&\n availability.state !== \"checking\" &&\n availability.state !== \"unknown\" &&\n roles.length > 0 &&\n roleErrors.size === 0;\n\n useEffect(() => {\n if (!open) return;\n onRolesChange(roles);\n }, [open, roles, onRolesChange]);\n\n // Team id availability check (debounced).\n useEffect(() => {\n if (!open) return;\n\n let cancelled = false;\n const t = setTimeout(async () => {\n if (!teamIdTrimmed || !isValidTeamId(teamIdTrimmed)) {\n setAvailability({ state: \"unknown\" });\n return;\n }\n\n setAvailability({ state: \"checking\" });\n\n const res = await fetchJsonWithStatus<{ ok?: boolean; available?: boolean; reason?: string; error?: string }>(\n `/api/ids/check?kind=team&id=${encodeURIComponent(teamIdTrimmed)}`,\n { cache: \"no-store\" },\n );\n\n if (cancelled) return;\n\n if (!res.ok) {\n setAvailability({ state: \"unknown\" });\n return;\n }\n\n if (res.data.ok && res.data.available === true) {\n setAvailability({ state: \"available\" });\n return;\n }\n\n setAvailability({ state: \"taken\", reason: res.data.reason });\n }, 250);\n\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [open, teamIdTrimmed]);\n\n // Best-effort preview (debounced).\n useEffect(() => {\n if (!open) return;\n if (!canConfirm) return;\n\n let cancelled = false;\n const t = setTimeout(async () => {\n const baseRecipeId = teamIdTrimmed.endsWith(\"-team\") ? teamIdTrimmed.slice(0, -\"-team\".length) : teamIdTrimmed;\n\n const res = await fetchJsonWithStatus<{\n ok?: boolean;\n error?: string;\n md?: string;\n filePath?: string;\n }>(\"/api/recipes/custom-team\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n dryRun: true,\n recipeId: baseRecipeId,\n teamId: teamIdTrimmed,\n roles: roles.map((r) => ({ roleId: r.roleId, displayName: r.displayName })),\n }),\n });\n\n if (cancelled) return;\n\n if (!res.ok) {\n setPreviewError(res.error);\n setPreviewMd(null);\n setPreviewPath(null);\n return;\n }\n if (!res.data.ok) {\n setPreviewError(res.data.error || \"Failed to generate preview\");\n setPreviewMd(null);\n setPreviewPath(null);\n return;\n }\n\n setPreviewError(null);\n setPreviewMd(typeof res.data.md === \"string\" ? res.data.md : null);\n setPreviewPath(typeof res.data.filePath === \"string\" ? res.data.filePath : null);\n }, 250);\n\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [open, canConfirm, teamIdTrimmed, roles]);\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create custom team\"\n recipeId={\"(new recipe)\"}\n recipeName={\"Custom Team\"}\n error={error || catalogError}\n busy={busy}\n canConfirm={canConfirm}\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create team\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={teamId}\n onChange={(e) => setTeamId(normalizeTeamIdInput(e.target.value))}\n placeholder=\"e.g. my-team\"\n className=\"mt-2 w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n {teamIdError ? <div className=\"mt-2 text-xs text-red-300\">{teamIdError}</div> : null}\n {!teamIdError && teamIdTrimmed ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {availability.state === \"checking\" ? \"Checking availability…\" : null}\n {availability.state === \"available\" ? \"Available.\" : null}\n </div>\n ) : null}\n </div>\n\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Select agents</div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n MVP: this creates new team roles that mirror the selected agents' names. You can edit the\n resulting team recipe later.\n </div>\n\n <div className=\"mt-3\">\n <input\n value={catalogQuery}\n onChange={(e) => setCatalogQuery(e.target.value)}\n placeholder=\"Search local roles/agents (recipe id, name, role)\"\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)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n />\n\n <div className=\"mt-3 max-h-[220px] overflow-auto rounded-lg border border-white/10 bg-white/5 p-3\">\n {catalogError ? <div className=\"text-sm text-red-300\">{catalogError}</div> : null}\n {!catalogError && agentChoices.length === 0 ? (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No local roles/agents found.</div>\n ) : null}\n {!catalogError && agentChoices.length ? (\n <div className=\"space-y-2\">\n {agentChoices.map((a) => {\n const checked = !!selected[a.id];\n return (\n <label key={a.id} className=\"flex items-start gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => {\n const next = { ...selected };\n if (e.target.checked) {\n next[a.id] = {\n agentId: a.id,\n roleId: a.roleId,\n displayName: a.displayName,\n };\n } else {\n delete next[a.id];\n }\n setSelected(next);\n }}\n />\n <span className=\"min-w-0 break-words\">{a.label}</span>\n </label>\n );\n })}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n\n {roles.length ? (\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Role mapping</div>\n <div className=\"mt-3 space-y-3\">\n {roles.map((r) => {\n const roleErr = roleErrors.get(r.agentId);\n return (\n <div key={r.agentId} className=\"rounded-lg border border-white/10 bg-white/5 p-3\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{r.agentId}</div>\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Role id</label>\n <input\n value={r.roleId}\n onChange={(e) => {\n setSelected((prev) => ({\n ...prev,\n [r.agentId]: { ...prev[r.agentId], roleId: e.target.value },\n }));\n }}\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 {roleErr ? <div className=\"mt-1 text-xs text-red-300\">{roleErr}</div> : null}\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Display name</label>\n <input\n value={r.displayName}\n onChange={(e) => {\n setSelected((prev) => ({\n ...prev,\n [r.agentId]: { ...prev[r.agentId], displayName: e.target.value },\n }));\n }}\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>\n );\n })}\n </div>\n </div>\n ) : null}\n\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Preview</div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Generated recipe preview (best-effort). This is what will be written to\n <code className=\"ml-1\">~/.openclaw/workspace/recipes/<teamId>.md</code>.\n </div>\n {canConfirm && previewError ? <div className=\"mt-2 text-xs text-red-300\">{previewError}</div> : null}\n {canConfirm && previewPath ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Target path: <code>{previewPath}</code>\n </div>\n ) : null}\n <pre className=\"mt-3 max-h-[260px] overflow-auto whitespace-pre-wrap rounded-lg border border-white/10 bg-black/30 p-3 text-xs text-[color:var(--ck-text-secondary)]\">\n {canConfirm ? previewMd || \"(Loading preview…)\" : \"(Select a valid team id and at least one agent to preview.)\"}\n </pre>\n </div>\n </CreateModalShell>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { useSlugifiedId } from \"@/lib/use-slugified-id\";\nimport { CreateModalShell } from \"./CreateModalShell\";\n\nfunction getAvailabilityBorderClass(state: string): string {\n if (state === \"available\") return \"border-emerald-400/50\";\n if (state === \"taken\") return \"border-red-400/60\";\n return \"border-white/10\";\n}\n\nfunction getAvailabilityHint(state: string): string {\n if (state === \"taken\") return \"That id is already taken.\";\n if (state === \"available\") return \"Id is available.\";\n return \"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config.\";\n}\n\ntype Availability =\n | { state: \"empty\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string };\n\n/** Sync availability from local arrays (no fetch). Returns null when API check needed. */\nfunction syncAvailability(\n v: string,\n existingRecipeIds: string[],\n existingAgentIds: string[]\n): Availability | null {\n if (!v) return { state: \"empty\" };\n if (existingRecipeIds.includes(v)) return { state: \"taken\", reason: \"recipe-id-collision\" };\n if (existingAgentIds.includes(v)) return { state: \"taken\", reason: \"agent-exists\" };\n return null;\n}\n\nexport function CreateAgentModal({\n open,\n recipeId,\n recipeName,\n agentId,\n setAgentId,\n agentName,\n setAgentName,\n existingRecipeIds,\n existingAgentIds,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n agentId: string;\n setAgentId: (v: string) => void;\n agentName: string;\n setAgentName: (v: string) => void;\n existingRecipeIds: string[];\n existingAgentIds: string[];\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [idTouched, setIdTouched] = useState(false);\n const [apiAvailability, setApiAvailability] = useState<Availability | null>(null);\n\n const { effectiveId } = useSlugifiedId({\n open,\n name: agentName,\n setName: setAgentName,\n id: agentId,\n setId: setAgentId,\n idTouched,\n setIdTouched,\n });\n\n const v = String(effectiveId ?? \"\").trim();\n const syncAvail = useMemo(\n () => (open ? syncAvailability(v, existingRecipeIds, existingAgentIds) : { state: \"empty\" as const }),\n [open, v, existingRecipeIds, existingAgentIds]\n );\n\n const availability: Availability = syncAvail ?? apiAvailability ?? { state: \"available\" };\n\n useEffect(() => {\n if (!open || syncAvail !== null) return;\n const t = setTimeout(() => {\n void (async () => {\n setApiAvailability({ state: \"checking\" });\n try {\n const json = await fetchJson<{ ok?: boolean; available?: boolean; reason?: string }>(\n `/api/ids/check?kind=agent&id=${encodeURIComponent(v)}`,\n { cache: \"no-store\" }\n );\n if (json.available) setApiAvailability({ state: \"available\" });\n else setApiAvailability({ state: \"taken\", reason: json.reason });\n } catch {\n setApiAvailability({ state: \"available\" });\n }\n })();\n }, 250);\n return () => clearTimeout(t);\n }, [open, syncAvail, v]);\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create agent\"\n recipeId={recipeId}\n recipeName={recipeName}\n error={error}\n busy={busy}\n canConfirm={\n !!effectiveId.trim() &&\n availability.state !== \"taken\" &&\n availability.state !== \"checking\"\n }\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create agent\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent name</label>\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\n placeholder=\"e.g. Crypto Onchain\"\n className=\"mt-2 w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setAgentId(e.target.value);\n }}\n placeholder=\"e.g. crypto-onchain\"\n className={\n \"mt-2 w-full rounded-lg border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] \" +\n getAvailabilityBorderClass(availability.state)\n }\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {getAvailabilityHint(availability.state)}\n </div>\n </div>\n </CreateModalShell>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[65960,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(50944),f=a.i(51200),g=a.i(66063),h=a.i(71987),i=a.i(9233),j=a.i(95625);function k(a,b){return`/api/teams/workflow-deliverables/file?teamId=${encodeURIComponent(a)}&runId=${encodeURIComponent(b.runId)}&path=${encodeURIComponent(b.relativePath)}`}function l({teamId:a,workflowId:d,runId:e,isActive:g=!1}){let[l,m]=(0,c.useState)([]),[n,o]=(0,c.useState)(!0),[p,q]=(0,c.useState)(""),[r,s]=(0,c.useState)(""),[t,u]=(0,c.useState)(null),v=(0,c.useRef)(!1),w=(0,c.useMemo)(()=>{let a=r.trim().toLowerCase();return l.filter(b=>!a||b.fileName.toLowerCase().includes(a)||b.contentPreview&&b.contentPreview.toLowerCase().includes(a))},[l,r]),x=(0,c.useCallback)(async b=>{try{b&&o(!0),q("");let c=await (0,f.fetchJson)(`/api/teams/workflow-deliverables?teamId=${encodeURIComponent(a)}&workflowId=${encodeURIComponent(d)}&runId=${encodeURIComponent(e)}`);if(!c.ok)throw Error("error"in c?String(c.error):"Failed to fetch deliverables");m(c.deliverables)}catch(a){q(String(a))}finally{o(!1)}},[a,d,e]);(0,c.useEffect)(()=>{v.current=!1,x(!0).then(()=>{v.current=!0})},[x]),(0,c.useEffect)(()=>{if(!g||!v.current)return;let a=setInterval(()=>x(!1),15e3);return()=>clearInterval(a)},[g,x]);let y=async b=>{try{if(b.isText&&b.contentPreview)await navigator.clipboard.writeText(b.contentPreview),alert("Content copied to clipboard!");else{let c=k(a,b),d=document.createElement("a");d.href=c,d.download=b.fileName,document.body.appendChild(d),d.click(),d.remove()}}catch{alert("Failed to download file")}};return n?(0,b.jsxs)("div",{className:"rounded-3xl border border-white/10 bg-black/10 p-4",children:[(0,b.jsx)("h2",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)] mb-4",children:"Run Deliverables"}),(0,b.jsx)("div",{className:"flex items-center justify-center py-8",children:(0,b.jsxs)("div",{className:"text-center text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("div",{className:"text-2xl mb-2",children:"⏳"}),(0,b.jsx)("div",{children:"Loading deliverables..."})]})})]}):p?(0,b.jsxs)("div",{className:"rounded-3xl border border-white/10 bg-black/10 p-4",children:[(0,b.jsx)("h2",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)] mb-4",children:"Run Deliverables"}),(0,b.jsxs)("div",{className:"text-center py-8 text-red-400",children:[(0,b.jsx)("div",{className:"text-2xl mb-2",children:"⚠️"}),(0,b.jsxs)("div",{className:"text-sm",children:["Failed to load deliverables: ",p]})]})]}):(0,b.jsxs)("div",{className:"rounded-3xl border border-white/10 bg-black/10 p-4",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 mb-4",children:[(0,b.jsx)("h2",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Run Deliverables"}),l.length>0&&(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("div",{className:"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:"search"}),(0,b.jsx)("input",{value:r,onChange:a=>s(a.target.value),placeholder:"filename / content",className:"mt-1 w-64 max-w-full rounded-lg border border-white/10 bg-white/5 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]}),w.length>0?(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsxs)("div",{className:"lg:col-span-2",children:[(0,b.jsx)("div",{className:"space-y-2",children:w.map((c,d)=>{let e=t?.absolutePath===c.absolutePath;return(0,b.jsx)("div",{className:`cursor-pointer rounded-lg border p-3 transition-colors ${e?"border-white/20 bg-white/10":"border-white/5 bg-black/5 hover:bg-white/5"}`,onClick:()=>u(c),children:(0,b.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,i.isImageFile)(c.fileName)&&(0,b.jsx)("div",{className:"flex-shrink-0 w-12 h-12 rounded overflow-hidden bg-white/5 border border-white/10",children:(0,b.jsx)(h.default,{src:k(a,c),alt:c.fileName,width:48,height:48,className:"w-full h-full object-cover",unoptimized:!0})}),(0,b.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"text-lg",children:function(a){switch(a.toLowerCase().split(".").pop()){case"md":return"📝";case"json":return"🔧";case"txt":default:return"📄";case"html":case"htm":return"🌐";case"css":return"🎨";case"js":case"ts":case"tsx":case"jsx":return"⚙️";case"png":case"jpg":case"jpeg":case"gif":case"webp":return"🖼️";case"pdf":return"📋";case"zip":case"tar":case"gz":return"📦"}}(c.fileName)}),(0,b.jsx)("span",{className:"font-medium text-[color:var(--ck-text-primary)] truncate",children:c.fileName}),c.isText&&(0,b.jsx)("span",{className:"text-xs bg-green-500/20 text-green-400 px-1.5 py-0.5 rounded",children:"TEXT"})]}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:[c.relativePath!==c.fileName&&(0,b.jsxs)("span",{children:[c.relativePath," · "]}),function(a){if(0===a)return"0 B";let b=Math.floor(Math.log(a)/Math.log(1024));return parseFloat((a/Math.pow(1024,b)).toFixed(1))+" "+["B","KB","MB","GB"][b]}(c.size)," · ",function(a){try{return new Date(a).toLocaleString()}catch{return a}}(c.mtime)]})]}),(0,b.jsx)("div",{className:"flex items-center gap-2",children:(0,b.jsx)("button",{onClick:a=>{a.stopPropagation(),y(c)},className:"text-xs px-2 py-1 border border-white/10 rounded hover:bg-white/5 text-[color:var(--ck-text-secondary)]",children:c.isText?"Copy":"Download"})})]})},`${c.runId}-${c.relativePath}`)})}),w.length>0&&l.length!==w.length&&(0,b.jsxs)("div",{className:"mt-4 text-xs text-[color:var(--ck-text-tertiary)]",children:["Showing ",w.length," of ",l.length," deliverables."]})]}),(0,b.jsx)("div",{className:"lg:col-span-1",children:(0,b.jsxs)("div",{className:"rounded-lg border border-white/10 bg-black/10 p-4",children:[(0,b.jsx)("h3",{className:"text-sm font-semibold text-[color:var(--ck-text-primary)] mb-3",children:"Preview"}),(0,b.jsx)(j.DeliverablePreviewPanel,{deliverable:t,fileUrl:t?k(a,t):"",maxMediaHeight:"300px",onDownload:()=>t&&y(t)})]})})]}):(0,b.jsxs)("div",{className:"text-center py-8 text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("div",{className:"text-4xl mb-2",children:"📋"}),(0,b.jsx)("div",{className:"text-lg mb-1",children:"No deliverables found"}),(0,b.jsx)("div",{className:"text-sm",children:"This workflow run has not generated any deliverable files yet."})]})]})}function m(a){try{return JSON.stringify(a,null,2)}catch{return String(a)}}function n(a){return"success"===a?"border-emerald-400/30 bg-emerald-500/10 text-emerald-50":"error"===a?"border-red-400/30 bg-red-500/10 text-red-50":"running"===a?"border-sky-400/30 bg-sky-500/10 text-sky-50":"waiting_for_approval"===a?"border-amber-400/30 bg-amber-500/10 text-amber-50":"canceled"===a?"border-gray-400/30 bg-gray-500/10 text-gray-50":"border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)]"}function o({run:a,teamId:h,workflowId:i}){let j=(0,e.useRouter)(),k=Array.isArray(a.nodes)?a.nodes:[],[o,p]=(0,c.useState)(0),[q,r]=(0,c.useState)(!1),[s,t]=(0,c.useState)(!1),[u,v]=(0,c.useState)(!1),[w,x]=(0,c.useState)(""),[y,z]=(0,c.useState)(""),A=(0,c.useMemo)(()=>k.length?k[Math.min(Math.max(0,o),k.length-1)]:void 0,[k,o]),B=["running","waiting_for_approval"].includes(a.status),C=["queued","running","waiting_for_approval","waiting_workers","waiting_handoff","awaiting_approval"].includes(a.status);(0,c.useEffect)(()=>{if(!C)return;let a=setInterval(()=>j.refresh(),15e3);return()=>clearInterval(a)},[C,j]);let D=async()=>{try{v(!0),x("");let b=await (0,f.fetchJson)("/api/teams/workflow-runs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({teamId:h,workflowId:i,runId:a.id,action:"stop"})});if(!b.ok)throw Error(b.error||"Failed to stop run");j.refresh()}catch(a){x(String(a))}finally{v(!1),t(!1)}},E=async()=>{try{v(!0),x("");let b=await (0,f.fetchJson)("/api/teams/workflow-runs",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({teamId:h,workflowId:i,runId:a.id,action:"delete"})});if(!b.ok)throw Error(b.error||"Failed to delete run");j.push(`/teams/${encodeURIComponent(h)}/runs`)}catch(a){x(String(a))}finally{v(!1),r(!1)}};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsxs)("div",{className:"lg:col-span-1 rounded-3xl border border-white/10 bg-black/10 p-4",children:[(0,b.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-xs uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:"run status"}),(0,b.jsx)("div",{className:`mt-2 inline-flex items-center rounded-full border px-2 py-1 text-xs ${n(a.status)}`,children:a.status}),(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-medium",children:"started:"})," ",a.startedAt]}),a.endedAt?(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-medium",children:"ended:"})," ",a.endedAt]}):null]})]}),(0,b.jsxs)("div",{className:"flex flex-col gap-2",children:[B&&(0,b.jsx)("button",{type:"button",onClick:()=>t(!0),disabled:u,className:"rounded-lg border border-amber-500/50 bg-amber-500/10 px-3 py-1.5 text-xs font-medium text-amber-100 hover:bg-amber-500/20 disabled:opacity-50",children:"Stop Run"}),(0,b.jsx)("button",{type:"button",onClick:()=>r(!0),disabled:u,className:"rounded-lg border border-red-500/50 bg-red-500/10 px-3 py-1.5 text-xs font-medium text-red-100 hover:bg-red-500/20 disabled:opacity-50",children:"Delete Run"})]})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("div",{className:"text-xs uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:"timeline"}),(0,b.jsx)("div",{className:"mt-2 space-y-1",children:k.length?k.map((a,c)=>{let d=c===o;return(0,b.jsxs)("button",{type:"button",onClick:()=>p(c),className:d?"w-full rounded-lg border border-white/10 bg-white/10 px-2 py-2 text-left":"w-full rounded-lg px-2 py-2 text-left hover:bg-white/5",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)("div",{className:"font-mono text-xs text-[color:var(--ck-text-primary)]",children:a.nodeId}),(0,b.jsx)("div",{className:"text-[10px] text-[color:var(--ck-text-tertiary)]",children:a.status})]}),a.startedAt||a.endedAt?(0,b.jsxs)("div",{className:"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]",children:[a.startedAt?`start: ${a.startedAt}`:"",a.startedAt&&a.endedAt?" · ":"",a.endedAt?`end: ${a.endedAt}`:""]}):null]},`${c}:${a.nodeId}`)}):(0,b.jsx)("div",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"No node results recorded yet."})})]}),a.approval||"waiting_for_approval"===a.status||k.some(a=>"waiting"===a.status)?(0,b.jsxs)("div",{className:"mt-4 rounded-lg border border-white/10 bg-black/10 p-3",children:[(0,b.jsx)("div",{className:"text-xs uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:"approval"}),a.approval?(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-medium",children:"node:"})," ",(0,b.jsx)("span",{className:"font-mono",children:a.approval.nodeId})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-medium",children:"state:"})," ",a.approval.state]}),a.approval.note?(0,b.jsx)("div",{className:"mt-2 rounded border border-white/10 bg-white/5 p-2 text-[11px]",children:a.approval.note}):null]}):null,y?(0,b.jsx)("div",{className:`mt-3 rounded-lg px-4 py-2 text-sm font-medium ${"approved"===y?"border border-emerald-400/30 bg-emerald-500/10 text-emerald-200":"border border-amber-400/30 bg-amber-500/10 text-amber-200"}`,children:"approved"===y?"Approved — the runner will resume this workflow shortly.":"Rejected — revision requested."}):a.approval&&"pending"!==a.approval.state||y?null:(0,b.jsxs)("div",{className:"mt-3 flex gap-2",children:[(0,b.jsx)("button",{type:"button",disabled:u,onClick:async()=>{v(!0),x("");try{await (0,f.fetchJson)("/api/teams/workflow-runs",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({teamId:h,workflowId:i,runId:a.id,action:"approve"})}),z("approved")}catch(a){x(String(a))}finally{v(!1)}},className:"rounded-lg bg-emerald-600 px-4 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition hover:bg-emerald-500 disabled:opacity-50",children:u?"Approving…":"Approve"}),(0,b.jsx)("button",{type:"button",disabled:u,onClick:async()=>{v(!0),x("");try{let b=prompt("Reason for rejection (optional):");await (0,f.fetchJson)("/api/teams/workflow-runs",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({teamId:h,workflowId:i,runId:a.id,action:"request_changes",...b?{note:b}:{}})}),z("rejected")}catch(a){x(String(a))}finally{v(!1)}},className:"rounded-lg border border-amber-400/30 bg-amber-500/10 px-4 py-2 text-sm font-medium text-amber-200 shadow-[var(--ck-shadow-1)] transition hover:bg-amber-500/20 disabled:opacity-50",children:u?"…":"Reject"})]}),w?(0,b.jsx)("div",{className:"mt-2 text-xs text-red-300",children:w}):null]}):null]}),(0,b.jsxs)("div",{className:"lg:col-span-2 rounded-3xl border border-white/10 bg-black/10 p-4",children:[(0,b.jsx)("div",{className:"text-xs uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:"node output / error"}),A?(0,b.jsxs)("div",{className:"mt-3",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,b.jsx)("div",{className:"font-mono text-sm text-[color:var(--ck-text-primary)]",children:A.nodeId}),(0,b.jsx)("div",{className:`rounded-full border px-2 py-1 text-xs ${n(A.status)}`,children:A.status})]}),A.error?(0,b.jsxs)("div",{className:"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3",children:[(0,b.jsx)("div",{className:"text-xs font-semibold text-red-50",children:"Error"}),(0,b.jsx)("pre",{className:"mt-2 overflow-auto text-xs text-red-50",children:m(A.error)})]}):null,A.handoff?(0,b.jsxs)("div",{className:"mt-3 rounded-lg border border-sky-400/30 bg-sky-500/10 p-3",children:[(0,b.jsx)("div",{className:"text-xs font-semibold text-sky-50",children:"Handed off to"}),(0,b.jsxs)(d.default,{href:`/teams/${encodeURIComponent(A.handoff.targetTeamId)}/runs/${encodeURIComponent(A.handoff.targetWorkflowId)}/${encodeURIComponent(A.handoff.targetRunId)}`,className:"mt-2 inline-flex items-center gap-2 text-sm font-medium text-sky-300 hover:text-sky-200 hover:underline",children:[(0,b.jsx)("span",{className:"font-mono",children:A.handoff.targetTeamId}),(0,b.jsx)("span",{className:"text-sky-400/60",children:"/"}),(0,b.jsx)("span",{className:"font-mono",children:A.handoff.targetWorkflowId}),(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"→"})]})]}):null,(0,b.jsxs)("div",{className:"mt-3 rounded-lg border border-white/10 bg-white/5 p-3",children:[(0,b.jsx)("div",{className:"text-xs font-semibold text-[color:var(--ck-text-secondary)]",children:"Output"}),void 0===A.output||null===A.output?(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"(no output)"}):(0,b.jsx)("pre",{className:"mt-2 max-h-[60vh] overflow-auto text-xs text-[color:var(--ck-text-primary)]",children:m(A.output)})]})]}):(0,b.jsx)("div",{className:"mt-3 text-sm text-[color:var(--ck-text-secondary)]",children:"Select a node to view its output."}),(0,b.jsxs)("details",{className:"mt-4 rounded-lg border border-white/10 bg-black/10 p-3",children:[(0,b.jsx)("summary",{className:"cursor-pointer text-sm font-medium text-[color:var(--ck-text-secondary)]",children:"Raw run file"}),(0,b.jsx)("pre",{className:"mt-3 overflow-auto text-xs text-[color:var(--ck-text-primary)]",children:m(a)})]})]}),(0,b.jsx)(g.ConfirmationModal,{open:s,onClose:()=>{t(!1),x("")},title:"Stop Workflow Run",confirmLabel:"Stop Run",confirmBusyLabel:"Stopping...",onConfirm:D,busy:u,error:w,confirmButtonClassName:"rounded-lg bg-amber-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-amber-700 disabled:opacity-50",children:(0,b.jsxs)("div",{className:"mt-3 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsxs)("p",{children:["This will cancel the workflow run and set its status to ",(0,b.jsx)("code",{className:"bg-white/10 px-1 rounded",children:"canceled"}),"."]}),(0,b.jsx)("p",{className:"mt-2",children:"The run data will be preserved but execution will stop."})]})}),(0,b.jsx)(g.ConfirmationModal,{open:q,onClose:()=>{r(!1),x("")},title:"Delete Workflow Run",confirmLabel:"Delete Run",confirmBusyLabel:"Deleting...",onConfirm:E,busy:u,error:w,children:(0,b.jsxs)("div",{className:"mt-3 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("p",{children:"This will permanently delete the workflow run and all its data."}),(0,b.jsx)("p",{className:"mt-2 font-medium text-[color:var(--ck-text-primary)]",children:"This action cannot be undone."}),(0,b.jsx)("div",{className:"mt-3 rounded border border-white/10 bg-white/5 p-2 text-xs",children:(0,b.jsx)("span",{className:"font-mono",children:a.id})})]})})]}),(0,b.jsx)("div",{className:"mt-8",children:(0,b.jsx)(l,{teamId:h,workflowId:i,runId:a.id,isActive:C})})]})}a.s(["default",()=>o],65960)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_app_teams_%5BteamId%5D_runs_%5BworkflowId%5D_%5BrunId%5D_run-detail-client_tsx_56f0cbd7._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/runs/%5BworkflowId%5D/%5BrunId%5D/run-detail-client.tsx","../../../../src/components/RunDeliverables.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport RunDeliverables from \"@/components/RunDeliverables\";\nimport type { WorkflowRunFileV1, WorkflowRunNodeResultV1 } from \"@/lib/workflows/runs-types\";\n\nfunction asPrettyJson(v: unknown) {\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n}\n\nfunction statusColor(status?: string) {\n if (status === \"success\") return \"border-emerald-400/30 bg-emerald-500/10 text-emerald-50\";\n if (status === \"error\") return \"border-red-400/30 bg-red-500/10 text-red-50\";\n if (status === \"running\") return \"border-sky-400/30 bg-sky-500/10 text-sky-50\";\n if (status === \"waiting_for_approval\") return \"border-amber-400/30 bg-amber-500/10 text-amber-50\";\n if (status === \"canceled\") return \"border-gray-400/30 bg-gray-500/10 text-gray-50\";\n return \"border-white/10 bg-white/5 text-[color:var(--ck-text-secondary)]\";\n}\n\nexport default function RunDetailClient({ \n run, \n teamId, \n workflowId \n}: { \n run: WorkflowRunFileV1; \n teamId: string; \n workflowId: string; \n}) {\n const router = useRouter();\n const nodes = Array.isArray(run.nodes) ? run.nodes : [];\n\n // nodeId is not unique (a workflow can execute the same node multiple times).\n // Use timeline index for stable selection.\n const [selectedIdx, setSelectedIdx] = useState<number>(0);\n const [showDeleteModal, setShowDeleteModal] = useState(false);\n const [showStopModal, setShowStopModal] = useState(false);\n const [actionBusy, setActionBusy] = useState(false);\n const [actionError, setActionError] = useState<string>(\"\");\n const [actionDone, setActionDone] = useState<string>(\"\");\n\n const selectedNode: WorkflowRunNodeResultV1 | undefined = useMemo(\n () => (nodes.length ? nodes[Math.min(Math.max(0, selectedIdx), nodes.length - 1)] : undefined),\n [nodes, selectedIdx]\n );\n\n // Determine if actions are available\n const canStop = [\"running\", \"waiting_for_approval\"].includes(run.status);\n const canDelete = true; // Always allow delete\n\n // Auto-refresh while the run is in an active state\n const isActive = [\"queued\", \"running\", \"waiting_for_approval\", \"waiting_workers\", \"waiting_handoff\", \"awaiting_approval\"].includes(run.status);\n useEffect(() => {\n if (!isActive) return;\n const id = setInterval(() => router.refresh(), 15_000);\n return () => clearInterval(id);\n }, [isActive, router]);\n\n const handleStop = async () => {\n try {\n setActionBusy(true);\n setActionError(\"\");\n\n const response = await fetchJson<{ ok: boolean; error?: string }>(`/api/teams/workflow-runs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n teamId,\n workflowId,\n runId: run.id,\n action: \"stop\",\n }),\n });\n\n if (!response.ok) {\n throw new Error(response.error || \"Failed to stop run\");\n }\n\n // Refresh the page to show updated state\n router.refresh();\n } catch (err) {\n setActionError(String(err));\n } finally {\n setActionBusy(false);\n setShowStopModal(false);\n }\n };\n\n const handleDelete = async () => {\n try {\n setActionBusy(true);\n setActionError(\"\");\n\n const response = await fetchJson<{ ok: boolean; error?: string }>(`/api/teams/workflow-runs`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n teamId,\n workflowId,\n runId: run.id,\n action: \"delete\",\n }),\n });\n\n if (!response.ok) {\n throw new Error(response.error || \"Failed to delete run\");\n }\n\n // Navigate back to runs list\n router.push(`/teams/${encodeURIComponent(teamId)}/runs`);\n } catch (err) {\n setActionError(String(err));\n } finally {\n setActionBusy(false);\n setShowDeleteModal(false);\n }\n };\n\n return (\n <>\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className=\"lg:col-span-1 rounded-3xl border border-white/10 bg-black/10 p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-xs uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">run status</div>\n <div className={`mt-2 inline-flex items-center rounded-full border px-2 py-1 text-xs ${statusColor(run.status)}`}>\n {run.status}\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n <div>\n <span className=\"font-medium\">started:</span> {run.startedAt}\n </div>\n {run.endedAt ? (\n <div>\n <span className=\"font-medium\">ended:</span> {run.endedAt}\n </div>\n ) : null}\n </div>\n </div>\n <div className=\"flex flex-col gap-2\">\n {canStop && (\n <button\n type=\"button\"\n onClick={() => setShowStopModal(true)}\n disabled={actionBusy}\n className=\"rounded-lg border border-amber-500/50 bg-amber-500/10 px-3 py-1.5 text-xs font-medium text-amber-100 hover:bg-amber-500/20 disabled:opacity-50\"\n >\n Stop Run\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n onClick={() => setShowDeleteModal(true)}\n disabled={actionBusy}\n className=\"rounded-lg border border-red-500/50 bg-red-500/10 px-3 py-1.5 text-xs font-medium text-red-100 hover:bg-red-500/20 disabled:opacity-50\"\n >\n Delete Run\n </button>\n )}\n </div>\n </div>\n\n <div className=\"mt-4\">\n <div className=\"text-xs uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timeline</div>\n <div className=\"mt-2 space-y-1\">\n {nodes.length ? (\n nodes.map((n, idx) => {\n const active = idx === selectedIdx;\n return (\n <button\n key={`${idx}:${n.nodeId}`}\n type=\"button\"\n onClick={() => setSelectedIdx(idx)}\n className={\n active\n ? \"w-full rounded-lg border border-white/10 bg-white/10 px-2 py-2 text-left\"\n : \"w-full rounded-lg px-2 py-2 text-left hover:bg-white/5\"\n }\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"font-mono text-xs text-[color:var(--ck-text-primary)]\">{n.nodeId}</div>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">{n.status}</div>\n </div>\n {(n.startedAt || n.endedAt) ? (\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n {n.startedAt ? `start: ${n.startedAt}` : \"\"}\n {n.startedAt && n.endedAt ? \" · \" : \"\"}\n {n.endedAt ? `end: ${n.endedAt}` : \"\"}\n </div>\n ) : null}\n </button>\n );\n })\n ) : (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No node results recorded yet.</div>\n )}\n </div>\n </div>\n\n {(run.approval || run.status === \"waiting_for_approval\" || nodes.some((n) => n.status === \"waiting\")) ? (\n <div className=\"mt-4 rounded-lg border border-white/10 bg-black/10 p-3\">\n <div className=\"text-xs uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">approval</div>\n {run.approval ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <div>\n <span className=\"font-medium\">node:</span> <span className=\"font-mono\">{run.approval.nodeId}</span>\n </div>\n <div>\n <span className=\"font-medium\">state:</span> {run.approval.state}\n </div>\n {run.approval.note ? (\n <div className=\"mt-2 rounded border border-white/10 bg-white/5 p-2 text-[11px]\">{run.approval.note}</div>\n ) : null}\n </div>\n ) : null}\n {actionDone ? (\n <div className={`mt-3 rounded-lg px-4 py-2 text-sm font-medium ${actionDone === \"approved\" ? \"border border-emerald-400/30 bg-emerald-500/10 text-emerald-200\" : \"border border-amber-400/30 bg-amber-500/10 text-amber-200\"}`}>\n {actionDone === \"approved\" ? \"Approved — the runner will resume this workflow shortly.\" : \"Rejected — revision requested.\"}\n </div>\n ) : (!run.approval || run.approval.state === \"pending\") && !actionDone ? (\n <div className=\"mt-3 flex gap-2\">\n <button\n type=\"button\"\n disabled={actionBusy}\n onClick={async () => {\n setActionBusy(true);\n setActionError(\"\");\n try {\n await fetchJson(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId, runId: run.id, action: \"approve\" }),\n });\n setActionDone(\"approved\");\n } catch (err) {\n setActionError(String(err));\n } finally {\n setActionBusy(false);\n }\n }}\n className=\"rounded-lg bg-emerald-600 px-4 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition hover:bg-emerald-500 disabled:opacity-50\"\n >\n {actionBusy ? \"Approving…\" : \"Approve\"}\n </button>\n <button\n type=\"button\"\n disabled={actionBusy}\n onClick={async () => {\n setActionBusy(true);\n setActionError(\"\");\n try {\n const note = prompt(\"Reason for rejection (optional):\");\n await fetchJson(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId, runId: run.id, action: \"request_changes\", ...(note ? { note } : {}) }),\n });\n setActionDone(\"rejected\");\n } catch (err) {\n setActionError(String(err));\n } finally {\n setActionBusy(false);\n }\n }}\n className=\"rounded-lg border border-amber-400/30 bg-amber-500/10 px-4 py-2 text-sm font-medium text-amber-200 shadow-[var(--ck-shadow-1)] transition hover:bg-amber-500/20 disabled:opacity-50\"\n >\n {actionBusy ? \"…\" : \"Reject\"}\n </button>\n </div>\n ) : null}\n {actionError ? (\n <div className=\"mt-2 text-xs text-red-300\">{actionError}</div>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <div className=\"lg:col-span-2 rounded-3xl border border-white/10 bg-black/10 p-4\">\n <div className=\"text-xs uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">node output / error</div>\n\n {selectedNode ? (\n <div className=\"mt-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"font-mono text-sm text-[color:var(--ck-text-primary)]\">{selectedNode.nodeId}</div>\n <div className={`rounded-full border px-2 py-1 text-xs ${statusColor(selectedNode.status)}`}>{selectedNode.status}</div>\n </div>\n\n {selectedNode.error ? (\n <div className=\"mt-3 rounded-lg border border-red-400/30 bg-red-500/10 p-3\">\n <div className=\"text-xs font-semibold text-red-50\">Error</div>\n <pre className=\"mt-2 overflow-auto text-xs text-red-50\">{asPrettyJson(selectedNode.error)}</pre>\n </div>\n ) : null}\n\n {selectedNode.handoff ? (\n <div className=\"mt-3 rounded-lg border border-sky-400/30 bg-sky-500/10 p-3\">\n <div className=\"text-xs font-semibold text-sky-50\">Handed off to</div>\n <Link\n href={`/teams/${encodeURIComponent(selectedNode.handoff.targetTeamId)}/runs/${encodeURIComponent(selectedNode.handoff.targetWorkflowId)}/${encodeURIComponent(selectedNode.handoff.targetRunId)}`}\n className=\"mt-2 inline-flex items-center gap-2 text-sm font-medium text-sky-300 hover:text-sky-200 hover:underline\"\n >\n <span className=\"font-mono\">{selectedNode.handoff.targetTeamId}</span>\n <span className=\"text-sky-400/60\">/</span>\n <span className=\"font-mono\">{selectedNode.handoff.targetWorkflowId}</span>\n <span className=\"text-[color:var(--ck-text-tertiary)]\">→</span>\n </Link>\n </div>\n ) : null}\n\n <div className=\"mt-3 rounded-lg border border-white/10 bg-white/5 p-3\">\n <div className=\"text-xs font-semibold text-[color:var(--ck-text-secondary)]\">Output</div>\n {typeof selectedNode.output === \"undefined\" || selectedNode.output === null ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">(no output)</div>\n ) : (\n <pre className=\"mt-2 max-h-[60vh] overflow-auto text-xs text-[color:var(--ck-text-primary)]\">{asPrettyJson(selectedNode.output)}</pre>\n )}\n </div>\n </div>\n ) : (\n <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">Select a node to view its output.</div>\n )}\n\n <details className=\"mt-4 rounded-lg border border-white/10 bg-black/10 p-3\">\n <summary className=\"cursor-pointer text-sm font-medium text-[color:var(--ck-text-secondary)]\">Raw run file</summary>\n <pre className=\"mt-3 overflow-auto text-xs text-[color:var(--ck-text-primary)]\">{asPrettyJson(run)}</pre>\n </details>\n </div>\n\n {/* Stop Run Confirmation Modal */}\n <ConfirmationModal\n open={showStopModal}\n onClose={() => {\n setShowStopModal(false);\n setActionError(\"\");\n }}\n title=\"Stop Workflow Run\"\n confirmLabel=\"Stop Run\"\n confirmBusyLabel=\"Stopping...\"\n onConfirm={handleStop}\n busy={actionBusy}\n error={actionError}\n confirmButtonClassName=\"rounded-lg bg-amber-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-amber-700 disabled:opacity-50\"\n >\n <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <p>This will cancel the workflow run and set its status to <code className=\"bg-white/10 px-1 rounded\">canceled</code>.</p>\n <p className=\"mt-2\">The run data will be preserved but execution will stop.</p>\n </div>\n </ConfirmationModal>\n\n {/* Delete Run Confirmation Modal */}\n <ConfirmationModal\n open={showDeleteModal}\n onClose={() => {\n setShowDeleteModal(false);\n setActionError(\"\");\n }}\n title=\"Delete Workflow Run\"\n confirmLabel=\"Delete Run\"\n confirmBusyLabel=\"Deleting...\"\n onConfirm={handleDelete}\n busy={actionBusy}\n error={actionError}\n >\n <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <p>This will permanently delete the workflow run and all its data.</p>\n <p className=\"mt-2 font-medium text-[color:var(--ck-text-primary)]\">This action cannot be undone.</p>\n <div className=\"mt-3 rounded border border-white/10 bg-white/5 p-2 text-xs\">\n <span className=\"font-mono\">{run.id}</span>\n </div>\n </div>\n </ConfirmationModal>\n </div>\n\n {/* Run Deliverables Section */}\n <div className=\"mt-8\">\n <RunDeliverables teamId={teamId} workflowId={workflowId} runId={run.id} isActive={isActive} />\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport Image from \"next/image\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { fetchJson } from \"@/lib/fetch-json\";\n\nimport type { WorkflowDeliverable, WorkflowDeliverablesResponse } from \"@/app/api/teams/workflow-deliverables/route\";\nimport { isImageFile } from \"@/lib/media-file-utils\";\nimport { DeliverablePreviewPanel } from \"@/components/DeliverablePreviewPanel\";\n\nfunction deliverableFileUrl(teamId: string, d: WorkflowDeliverable): string {\n return `/api/teams/workflow-deliverables/file?teamId=${encodeURIComponent(teamId)}&runId=${encodeURIComponent(d.runId)}&path=${encodeURIComponent(d.relativePath)}`;\n}\n\nfunction formatBytes(bytes: number) {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + \" \" + sizes[i];\n}\n\nfunction formatDate(dateString: string) {\n try {\n return new Date(dateString).toLocaleString();\n } catch {\n return dateString;\n }\n}\n\nfunction getFileIcon(fileName: string) {\n const ext = fileName.toLowerCase().split(\".\").pop();\n switch (ext) {\n case \"md\":\n return \"📝\";\n case \"json\":\n return \"🔧\";\n case \"txt\":\n return \"📄\";\n case \"html\":\n case \"htm\":\n return \"🌐\";\n case \"css\":\n return \"🎨\";\n case \"js\":\n case \"ts\":\n case \"tsx\":\n case \"jsx\":\n return \"⚙️\";\n case \"png\":\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"webp\":\n return \"🖼️\";\n case \"pdf\":\n return \"📋\";\n case \"zip\":\n case \"tar\":\n case \"gz\":\n return \"📦\";\n default:\n return \"📄\";\n }\n}\n\nexport default function RunDeliverables({\n teamId,\n workflowId,\n runId,\n isActive = false,\n}: {\n teamId: string;\n workflowId: string;\n runId: string;\n isActive?: boolean;\n}) {\n const [deliverables, setDeliverables] = useState<WorkflowDeliverable[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string>(\"\");\n const [searchQuery, setSearchQuery] = useState<string>(\"\");\n const [selectedDeliverable, setSelectedDeliverable] = useState<WorkflowDeliverable | null>(null);\n const initialLoadDone = useRef(false);\n\n const filteredDeliverables = useMemo(() => {\n const needle = searchQuery.trim().toLowerCase();\n return deliverables.filter((d) => {\n if (!needle) return true;\n\n return (\n d.fileName.toLowerCase().includes(needle) ||\n (d.contentPreview && d.contentPreview.toLowerCase().includes(needle))\n );\n });\n }, [deliverables, searchQuery]);\n\n const fetchDeliverables = useCallback(async (showLoading: boolean) => {\n try {\n if (showLoading) setLoading(true);\n setError(\"\");\n\n const response = await fetchJson<WorkflowDeliverablesResponse>(\n `/api/teams/workflow-deliverables?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(workflowId)}&runId=${encodeURIComponent(runId)}`\n );\n\n if (!response.ok) {\n throw new Error(\"error\" in response ? String(response.error) : \"Failed to fetch deliverables\");\n }\n\n setDeliverables(response.deliverables);\n } catch (err) {\n setError(String(err));\n } finally {\n setLoading(false);\n }\n }, [teamId, workflowId, runId]);\n\n // Initial fetch\n useEffect(() => {\n initialLoadDone.current = false;\n fetchDeliverables(true).then(() => { initialLoadDone.current = true; });\n }, [fetchDeliverables]);\n\n // Poll while the run is active\n useEffect(() => {\n if (!isActive || !initialLoadDone.current) return;\n const id = setInterval(() => fetchDeliverables(false), 15_000);\n return () => clearInterval(id);\n }, [isActive, fetchDeliverables]);\n\n const downloadDeliverable = async (deliverable: WorkflowDeliverable) => {\n try {\n if (deliverable.isText && deliverable.contentPreview) {\n await navigator.clipboard.writeText(deliverable.contentPreview);\n alert(\"Content copied to clipboard!\");\n } else {\n // Download binary files via the file API\n const url = deliverableFileUrl(teamId, deliverable);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = deliverable.fileName;\n document.body.appendChild(a);\n a.click();\n a.remove();\n }\n } catch {\n alert(\"Failed to download file\");\n }\n };\n\n if (loading) {\n return (\n <div className=\"rounded-3xl border border-white/10 bg-black/10 p-4\">\n <h2 className=\"text-lg font-semibold text-[color:var(--ck-text-primary)] mb-4\">\n Run Deliverables\n </h2>\n <div className=\"flex items-center justify-center py-8\">\n <div className=\"text-center text-[color:var(--ck-text-secondary)]\">\n <div className=\"text-2xl mb-2\">⏳</div>\n <div>Loading deliverables...</div>\n </div>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"rounded-3xl border border-white/10 bg-black/10 p-4\">\n <h2 className=\"text-lg font-semibold text-[color:var(--ck-text-primary)] mb-4\">\n Run Deliverables\n </h2>\n <div className=\"text-center py-8 text-red-400\">\n <div className=\"text-2xl mb-2\">⚠️</div>\n <div className=\"text-sm\">Failed to load deliverables: {error}</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rounded-3xl border border-white/10 bg-black/10 p-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3 mb-4\">\n <h2 className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">\n Run Deliverables\n </h2>\n \n {deliverables.length > 0 && (\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">search</div>\n <input\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"filename / content\"\n className=\"mt-1 w-64 max-w-full rounded-lg border border-white/10 bg-white/5 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </label>\n )}\n </div>\n\n {filteredDeliverables.length > 0 ? (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n {/* Deliverables List */}\n <div className=\"lg:col-span-2\">\n <div className=\"space-y-2\">\n {filteredDeliverables.map((deliverable, idx) => {\n const isSelected = selectedDeliverable?.absolutePath === deliverable.absolutePath;\n \n return (\n <div\n key={`${deliverable.runId}-${deliverable.relativePath}`}\n className={`cursor-pointer rounded-lg border p-3 transition-colors ${\n isSelected\n ? \"border-white/20 bg-white/10\"\n : \"border-white/5 bg-black/5 hover:bg-white/5\"\n }`}\n onClick={() => setSelectedDeliverable(deliverable)}\n >\n <div className=\"flex items-start justify-between gap-3\">\n {isImageFile(deliverable.fileName) && (\n <div className=\"flex-shrink-0 w-12 h-12 rounded overflow-hidden bg-white/5 border border-white/10\">\n <Image\n src={deliverableFileUrl(teamId, deliverable)}\n alt={deliverable.fileName}\n width={48}\n height={48}\n className=\"w-full h-full object-cover\"\n unoptimized\n />\n </div>\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg\">{getFileIcon(deliverable.fileName)}</span>\n <span className=\"font-medium text-[color:var(--ck-text-primary)] truncate\">\n {deliverable.fileName}\n </span>\n {deliverable.isText && (\n <span className=\"text-xs bg-green-500/20 text-green-400 px-1.5 py-0.5 rounded\">\n TEXT\n </span>\n )}\n </div>\n \n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n {deliverable.relativePath !== deliverable.fileName && (\n <span>{deliverable.relativePath} · </span>\n )}\n {formatBytes(deliverable.size)} · {formatDate(deliverable.mtime)}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n downloadDeliverable(deliverable);\n }}\n className=\"text-xs px-2 py-1 border border-white/10 rounded hover:bg-white/5 text-[color:var(--ck-text-secondary)]\"\n >\n {deliverable.isText ? \"Copy\" : \"Download\"}\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n \n {filteredDeliverables.length > 0 && deliverables.length !== filteredDeliverables.length && (\n <div className=\"mt-4 text-xs text-[color:var(--ck-text-tertiary)]\">\n Showing {filteredDeliverables.length} of {deliverables.length} deliverables.\n </div>\n )}\n </div>\n\n {/* Preview Panel */}\n <div className=\"lg:col-span-1\">\n <div className=\"rounded-lg border border-white/10 bg-black/10 p-4\">\n <h3 className=\"text-sm font-semibold text-[color:var(--ck-text-primary)] mb-3\">\n Preview\n </h3>\n\n <DeliverablePreviewPanel\n deliverable={selectedDeliverable}\n fileUrl={selectedDeliverable ? deliverableFileUrl(teamId, selectedDeliverable) : \"\"}\n maxMediaHeight=\"300px\"\n onDownload={() => selectedDeliverable && downloadDeliverable(selectedDeliverable)}\n />\n </div>\n </div>\n </div>\n ) : (\n <div className=\"text-center py-8 text-[color:var(--ck-text-secondary)]\">\n <div className=\"text-4xl mb-2\">📋</div>\n <div className=\"text-lg mb-1\">No deliverables found</div>\n <div className=\"text-sm\">\n This workflow run has not generated any deliverable files yet.\n </div>\n </div>\n )}\n </div>\n );\n}"],"names":[],"mappings":"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"}
|