@jiggai/kitchen 0.1.12 → 0.2.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 +21 -0
- package/.next/build-manifest.json +6 -6
- package/.next/prerender-manifest.json +11 -6
- package/.next/routes-manifest.json +146 -0
- package/.next/server/app/_global-error/page/build-manifest.json +4 -4
- package/.next/server/app/_global-error/page.js +3 -3
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +2 -2
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- 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 +4 -4
- package/.next/server/app/_not-found/page.js +10 -9
- 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 +4 -4
- package/.next/server/app/agents/[agentId]/page.js +8 -8
- package/.next/server/app/agents/[agentId]/page.js.nft.json +1 -1
- package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/[id]/route.js +1 -1
- package/.next/server/app/api/agents/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/add/route.js +1 -1
- package/.next/server/app/api/agents/add/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/file/route.js +1 -1
- package/.next/server/app/api/agents/file/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/files/route.js +1 -1
- package/.next/server/app/api/agents/files/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/identity/route.js +1 -1
- package/.next/server/app/api/agents/identity/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/route.js +1 -1
- package/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/install/route.js +1 -1
- package/.next/server/app/api/agents/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/route.js +1 -1
- package/.next/server/app/api/agents/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route.js +1 -1
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
- package/.next/server/app/api/channels/bindings/route.js +1 -1
- package/.next/server/app/api/channels/bindings/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/delete/route.js +1 -1
- package/.next/server/app/api/cron/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/job/route.js +1 -1
- package/.next/server/app/api/cron/job/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/jobs/route.js +1 -1
- package/.next/server/app/api/cron/jobs/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/recipe-installed/route.js +1 -1
- package/.next/server/app/api/cron/recipe-installed/route.js.nft.json +1 -1
- package/.next/server/app/api/gateway/restart/route.js +1 -1
- package/.next/server/app/api/gateway/restart/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/promote/route.js +1 -1
- package/.next/server/app/api/goals/[id]/promote/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/route.js +1 -1
- package/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/route.js +1 -1
- package/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/server/app/api/ids/check/route.js +1 -1
- package/.next/server/app/api/ids/check/route.js.nft.json +1 -1
- package/.next/server/app/api/marketplace/recipes/[slug]/route.js +1 -1
- package/.next/server/app/api/marketplace/recipes/[slug]/route.js.nft.json +1 -1
- package/.next/server/app/api/marketplace/recipes/route.js +1 -1
- package/.next/server/app/api/marketplace/recipes/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/[id]/route.js +1 -1
- package/.next/server/app/api/recipes/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/clone/route.js +1 -1
- package/.next/server/app/api/recipes/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/custom-team/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/recipes/custom-team/route/build-manifest.json +11 -0
- package/.next/server/app/api/recipes/custom-team/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/recipes/custom-team/route.js +6 -0
- package/.next/server/app/api/recipes/custom-team/route.js.map +5 -0
- package/.next/server/app/api/recipes/custom-team/route.js.nft.json +1 -0
- package/.next/server/app/api/recipes/custom-team/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/recipes/delete/route.js +1 -1
- package/.next/server/app/api/recipes/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/route.js +1 -1
- package/.next/server/app/api/recipes/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/team-agents/route.js +1 -1
- package/.next/server/app/api/recipes/team-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/scaffold/route.js +1 -2
- package/.next/server/app/api/scaffold/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/cron-installation/route.js +1 -1
- package/.next/server/app/api/settings/cron-installation/route.js.nft.json +1 -1
- package/.next/server/app/api/skills/available/route.js +1 -1
- package/.next/server/app/api/skills/available/route.js.nft.json +1 -1
- package/.next/server/app/api/swarms/start/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/swarms/start/route/build-manifest.json +11 -0
- package/.next/server/app/api/swarms/start/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/swarms/start/route.js +6 -0
- package/.next/server/app/api/swarms/start/route.js.map +5 -0
- package/.next/server/app/api/swarms/start/route.js.nft.json +1 -0
- package/.next/server/app/api/swarms/start/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/swarms/status/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/swarms/status/route/build-manifest.json +11 -0
- package/.next/server/app/api/swarms/status/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/swarms/status/route.js +6 -0
- package/.next/server/app/api/swarms/status/route.js.map +5 -0
- package/.next/server/app/api/swarms/status/route.js.nft.json +1 -0
- package/.next/server/app/api/swarms/status/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js +6 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js.map +5 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js +6 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js.map +5 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js +6 -0
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js.map +5 -0
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move/route.js +6 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move/route.js.map +5 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js +6 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js.map +5 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/file/route.js +1 -1
- package/.next/server/app/api/teams/file/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/files/route.js +1 -1
- package/.next/server/app/api/teams/files/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/memory/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/memory/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/memory/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/memory/route.js +6 -0
- package/.next/server/app/api/teams/memory/route.js.map +5 -0
- package/.next/server/app/api/teams/memory/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/memory/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/meta/route.js +1 -1
- package/.next/server/app/api/teams/meta/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/orchestrator/install/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/orchestrator/install/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/orchestrator/install/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/orchestrator/install/route.js +6 -0
- package/.next/server/app/api/teams/orchestrator/install/route.js.map +5 -0
- package/.next/server/app/api/teams/orchestrator/install/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/orchestrator/install/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/orchestrator/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/orchestrator/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/orchestrator/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/orchestrator/route.js +6 -0
- package/.next/server/app/api/teams/orchestrator/route.js.map +5 -0
- package/.next/server/app/api/teams/orchestrator/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/orchestrator/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/remove-team/route.js +2 -1
- package/.next/server/app/api/teams/remove-team/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/install/route.js +1 -1
- package/.next/server/app/api/teams/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/route.js +1 -1
- package/.next/server/app/api/teams/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-runs/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/workflow-runs/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/workflow-runs/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/workflow-runs/route.js +7 -0
- package/.next/server/app/api/teams/workflow-runs/route.js.map +5 -0
- package/.next/server/app/api/teams/workflow-runs/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/workflow-runs/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/workflow-templates/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/workflow-templates/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/workflow-templates/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/workflow-templates/route.js +6 -0
- package/.next/server/app/api/teams/workflow-templates/route.js.map +5 -0
- package/.next/server/app/api/teams/workflow-templates/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/workflow-templates/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/workflows/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/workflows/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/workflows/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/workflows/route.js +6 -0
- package/.next/server/app/api/teams/workflows/route.js.map +5 -0
- package/.next/server/app/api/teams/workflows/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/workflows/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/tickets/assign/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tickets/assign/route/build-manifest.json +11 -0
- package/.next/server/app/api/tickets/assign/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tickets/assign/route.js +6 -0
- package/.next/server/app/api/tickets/assign/route.js.map +5 -0
- package/.next/server/app/api/tickets/assign/route.js.nft.json +1 -0
- package/.next/server/app/api/tickets/assign/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/tickets/assignees/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tickets/assignees/route/build-manifest.json +11 -0
- package/.next/server/app/api/tickets/assignees/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tickets/assignees/route.js +6 -0
- package/.next/server/app/api/tickets/assignees/route.js.map +5 -0
- package/.next/server/app/api/tickets/assignees/route.js.nft.json +1 -0
- package/.next/server/app/api/tickets/assignees/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/tickets/move/route.js +1 -1
- package/.next/server/app/api/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/channels/page/build-manifest.json +4 -4
- package/.next/server/app/channels/page.js +8 -8
- 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 +4 -4
- package/.next/server/app/cron-jobs/page.js +8 -8
- 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/cron-jobs.html +1 -1
- package/.next/server/app/cron-jobs.rsc +7 -7
- package/.next/server/app/cron-jobs.segments/_full.segment.rsc +7 -7
- package/.next/server/app/cron-jobs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/cron-jobs.segments/_index.segment.rsc +3 -3
- package/.next/server/app/cron-jobs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/cron-jobs.segments/cron-jobs/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/cron-jobs.segments/cron-jobs.segment.rsc +1 -1
- package/.next/server/app/goals/[id]/page/build-manifest.json +4 -4
- package/.next/server/app/goals/[id]/page.js +8 -8
- 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 +4 -4
- package/.next/server/app/goals/new/page.js +8 -8
- 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 +4 -4
- package/.next/server/app/goals/page.js +8 -8
- 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/manifest.webmanifest/route/app-paths-manifest.json +3 -0
- package/.next/server/app/manifest.webmanifest/route/build-manifest.json +11 -0
- package/.next/server/app/manifest.webmanifest/route/server-reference-manifest.json +4 -0
- package/.next/server/app/manifest.webmanifest/route.js +6 -0
- package/.next/server/app/manifest.webmanifest/route.js.map +5 -0
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +2 -0
- package/.next/server/app/manifest.webmanifest.body +1 -0
- package/.next/server/app/manifest.webmanifest.meta +1 -0
- package/.next/server/app/page/build-manifest.json +4 -4
- package/.next/server/app/page.js +10 -9
- 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 +4 -4
- package/.next/server/app/recipes/[id]/page.js +10 -9
- 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 +4 -4
- package/.next/server/app/recipes/page.js +9 -9
- package/.next/server/app/recipes/page.js.nft.json +1 -1
- package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page/build-manifest.json +4 -4
- package/.next/server/app/settings/page.js +8 -8
- 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]/page/build-manifest.json +4 -4
- package/.next/server/app/teams/[teamId]/page.js +10 -9
- 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]/tickets/[ticket]/page/app-paths-manifest.json +3 -0
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/build-manifest.json +17 -0
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/next-font-manifest.json +11 -0
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/server-reference-manifest.json +4 -0
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js +18 -0
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js.map +5 -0
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js.nft.json +1 -0
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +2 -0
- package/.next/server/app/teams/[teamId]/tickets/page/app-paths-manifest.json +3 -0
- package/.next/server/app/teams/[teamId]/tickets/page/build-manifest.json +17 -0
- package/.next/server/app/teams/[teamId]/tickets/page/next-font-manifest.json +11 -0
- package/.next/server/app/teams/[teamId]/tickets/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/teams/[teamId]/tickets/page/server-reference-manifest.json +4 -0
- package/.next/server/app/teams/[teamId]/tickets/page.js +18 -0
- package/.next/server/app/teams/[teamId]/tickets/page.js.map +5 -0
- package/.next/server/app/teams/[teamId]/tickets/page.js.nft.json +1 -0
- package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +2 -0
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/app-paths-manifest.json +3 -0
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/build-manifest.json +17 -0
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/next-font-manifest.json +11 -0
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/server-reference-manifest.json +4 -0
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js +19 -0
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.map +5 -0
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.nft.json +1 -0
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +2 -0
- package/.next/server/app/teams/[teamId]/workflows/page/app-paths-manifest.json +3 -0
- package/.next/server/app/teams/[teamId]/workflows/page/build-manifest.json +17 -0
- package/.next/server/app/teams/[teamId]/workflows/page/next-font-manifest.json +11 -0
- package/.next/server/app/teams/[teamId]/workflows/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/teams/[teamId]/workflows/page/server-reference-manifest.json +4 -0
- package/.next/server/app/teams/[teamId]/workflows/page.js +20 -0
- package/.next/server/app/teams/[teamId]/workflows/page.js.map +5 -0
- package/.next/server/app/teams/[teamId]/workflows/page.js.nft.json +1 -0
- package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +2 -0
- package/.next/server/app/tickets/[ticket]/page/build-manifest.json +4 -4
- package/.next/server/app/tickets/[ticket]/page.js +8 -8
- 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 +4 -4
- package/.next/server/app/tickets/page.js +8 -8
- 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 +21 -0
- package/.next/server/chunks/[root-of-the-server]__04d535a1._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__04d535a1._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0554d494._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0554d494._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__05f5e243._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__05f5e243._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0e5f94e2._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0e5f94e2._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__107d374d._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__107d374d._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1106aaf7._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__1106aaf7._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1805932c._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1805932c._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__26c618a3._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__26c618a3._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__2fa553db._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__2fa553db._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__392e585d._.js +18 -0
- package/.next/server/chunks/[root-of-the-server]__392e585d._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__3cddf0a5._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__3cddf0a5._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__3f7058b4._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__3f7058b4._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__477c3d5b._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__477c3d5b._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__47eb3111._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__47eb3111._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__4898071c._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__59a6cf09._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__59a6cf09._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__5ea38a67._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__5ea38a67._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__6629e914._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__6629e914._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__667c3a2d._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__667c3a2d._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__691a8e5d._.js +6 -0
- package/.next/server/chunks/[root-of-the-server]__691a8e5d._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__698cf062._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__698cf062._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__69be1758._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__69be1758._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__6d8e7b75._.js +6 -0
- package/.next/server/chunks/[root-of-the-server]__6d8e7b75._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__6e5826c5._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__6e5826c5._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__795578f0._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__795578f0._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__7a331e51._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__7a331e51._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__7e46fb06._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__7e46fb06._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__864a08dd._.js +10 -0
- package/.next/server/chunks/[root-of-the-server]__864a08dd._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__8a811a30._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__8a811a30._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__8e27e9f7._.js +8 -0
- package/.next/server/chunks/[root-of-the-server]__8e27e9f7._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__8ea22d0a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__8ea22d0a._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__904a6d9f._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__904a6d9f._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__a12dc320._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__a12dc320._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__a6ade549._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__a6ade549._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__abcda400._.js +6 -0
- package/.next/server/chunks/[root-of-the-server]__abcda400._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__b002764e._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__b002764e._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__bc3630f4._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__bc3630f4._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__befb8c19._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__befb8c19._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__bf608f29._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__be5f57b2._.js.map → [root-of-the-server]__bf608f29._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__74b80ca4._.js → [root-of-the-server]__c63a9f28._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__c86c0469._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__c86c0469._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__c9e4c772._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__c9e4c772._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__cbe01b74._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__cbe01b74._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__ce9cfa39._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__ce9cfa39._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__d924e5ac._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__d924e5ac._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__e40409a2._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__e40409a2._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__e6fa5823._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__e6fa5823._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__e8bfeaba._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__e8bfeaba._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__e8f8017b._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__e8f8017b._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__ee5cefd8._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__ee5cefd8._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__ef60acef._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__ef60acef._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__fdda9176._.js +3 -0
- package/.next/server/chunks/{[root-of-the-server]__a6ac3ddf._.js.map → [root-of-the-server]__fdda9176._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__fec14c75._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__fec14c75._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__fef7183d._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__fef7183d._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_recipes_custom-team_route_actions_861b1489.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_swarms_start_route_actions_b79e9029.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_swarms_start_route_actions_b79e9029.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_swarms_status_route_actions_54826df0.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_swarms_status_route_actions_54826df0.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_[teamId]_tickets_move_route_actions_b47d8708.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_[teamId]_tickets_move_route_actions_b47d8708.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_memory_route_actions_5b7dc699.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_memory_route_actions_5b7dc699.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_install_route_actions_49b6602b.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_install_route_actions_49b6602b.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_route_actions_1949c463.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_route_actions_1949c463.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-runs_route_actions_8327ac7d.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-runs_route_actions_8327ac7d.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-templates_route_actions_87b51d57.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-templates_route_actions_87b51d57.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflows_route_actions_43dd6e07.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflows_route_actions_43dd6e07.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tickets_assign_route_actions_629cc773.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tickets_assign_route_actions_629cc773.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_tickets_assignees_route_actions_64d3d63e.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tickets_assignees_route_actions_64d3d63e.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_manifest_webmanifest_route_actions_1bff3fca.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_manifest_webmanifest_route_actions_1bff3fca.js.map +1 -0
- package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_assign_route_actions_50521c46.js +3 -0
- package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_assign_route_actions_50521c46.js.map +1 -0
- package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_assignees_route_actions_75675d78.js +3 -0
- package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_assignees_route_actions_75675d78.js.map +1 -0
- package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_delete_route_actions_9d6ca9f4.js +3 -0
- package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_delete_route_actions_9d6ca9f4.js.map +1 -0
- package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_move-to-goals_route_actions_760612ca.js +3 -0
- package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_move-to-goals_route_actions_760612ca.js.map +1 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js +16 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0d4cb2ba._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__285ae6b7._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__46e08d44._.js.map → [root-of-the-server]__285ae6b7._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__28f5d174._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__28f5d174._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__2bef6884._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__15600e29._.js.map → [root-of-the-server]__2bef6884._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__37c705d4._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__37c705d4._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__3ec61b25._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__3ec61b25._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__3efd25c4._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__2a6f1e3e._.js.map → [root-of-the-server]__3efd25c4._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__44d2d5fa._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__44d2d5fa._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__49281b4c._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__49281b4c._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4c4391c1._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4c4391c1._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4c6592ca._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4c6592ca._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__682758bd._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__682758bd._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__6bd48d33._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__6bd48d33._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__78972f52._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__78972f52._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__e2e52c6e._.js → [root-of-the-server]__78cdd31e._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__92524828._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__247198dc._.js.map → [root-of-the-server]__92524828._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9a7d79aa._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9a7d79aa._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__ad654f09._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__ad654f09._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__b2617fbf._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__fd669584._.js.map → [root-of-the-server]__b2617fbf._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__4c6cc96d._.js → [root-of-the-server]__de18d058._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__4c6cc96d._.js.map → [root-of-the-server]__de18d058._.js.map} +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__7180d770._.js → [root-of-the-server]__e364449b._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__e364449b._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__e5d416d5._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__3ad3e5b1._.js.map → [root-of-the-server]__e5d416d5._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__e94ab521._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__e94ab521._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__b9356576._.js → [root-of-the-server]__f62d412e._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__b9356576._.js.map → [root-of-the-server]__f62d412e._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__f8a2f82d._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__f8a2f82d._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__fbe5ff69._.js +3 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__3575e6da._.js.map → [root-of-the-server]__fbe5ff69._.js.map} +1 -1
- package/.next/server/chunks/ssr/_018dfe6b._.js +27 -0
- package/.next/server/chunks/ssr/_018dfe6b._.js.map +1 -0
- package/.next/server/chunks/ssr/{_8c45edba._.js → _0bdae23a._.js} +3 -3
- package/.next/server/chunks/ssr/_0bdae23a._.js.map +1 -0
- package/.next/server/chunks/ssr/{_d27483a1._.js → _19aa68d3._.js} +3 -3
- package/.next/server/chunks/ssr/_19aa68d3._.js.map +1 -0
- package/.next/server/chunks/ssr/{_25e6aab8._.js → _347e2d56._.js} +3 -3
- package/.next/server/chunks/ssr/_347e2d56._.js.map +1 -0
- package/.next/server/chunks/ssr/_3c9015dc._.js +4 -0
- package/.next/server/chunks/ssr/_3c9015dc._.js.map +1 -0
- package/.next/server/chunks/ssr/_41ca4e70._.js +3 -0
- package/.next/server/chunks/ssr/_41ca4e70._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_12287b3d._.js → _49fb12c2._.js} +3 -3
- package/.next/server/chunks/ssr/_49fb12c2._.js.map +1 -0
- package/.next/server/chunks/ssr/{_3c8b2df6._.js → _536983a4._.js} +3 -3
- package/.next/server/chunks/ssr/_536983a4._.js.map +1 -0
- package/.next/server/chunks/ssr/_5443093b._.js +3 -0
- package/.next/server/chunks/ssr/_5443093b._.js.map +1 -0
- package/.next/server/chunks/ssr/{_cd23c5af._.js → _5b282394._.js} +3 -3
- package/.next/server/chunks/ssr/_5b282394._.js.map +1 -0
- package/.next/server/chunks/ssr/{_6e70b5a4._.js → _5cc24343._.js} +3 -3
- package/.next/server/chunks/ssr/_5cc24343._.js.map +1 -0
- package/.next/server/chunks/ssr/_67830ad6._.js +3 -0
- package/.next/server/chunks/ssr/_67830ad6._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_68c68167.js → _7eac37fb._.js} +3 -3
- package/.next/server/chunks/ssr/_7eac37fb._.js.map +1 -0
- package/.next/server/chunks/ssr/{_92140ca3._.js → _802ee40f._.js} +3 -3
- package/.next/server/chunks/ssr/{_25e6aab8._.js.map → _802ee40f._.js.map} +1 -1
- package/.next/server/chunks/ssr/{_8c8207c1._.js → _8062e992._.js} +3 -3
- package/.next/server/chunks/ssr/_8062e992._.js.map +1 -0
- package/.next/server/chunks/ssr/{_0808c2b9._.js → _99994c05._.js} +3 -3
- package/.next/server/chunks/ssr/_99994c05._.js.map +1 -0
- package/.next/server/chunks/ssr/{_b5e9afcc._.js → _aafc99aa._.js} +3 -3
- package/.next/server/chunks/ssr/_aafc99aa._.js.map +1 -0
- package/.next/server/chunks/ssr/{_39e6e769._.js → _b7f3caf7._.js} +3 -3
- package/.next/server/chunks/ssr/_b7f3caf7._.js.map +1 -0
- package/.next/server/chunks/ssr/_c2041f88._.js +4 -0
- package/.next/server/chunks/ssr/_c2041f88._.js.map +1 -0
- package/.next/server/chunks/ssr/_d2e9dda9._.js +4 -0
- package/.next/server/chunks/ssr/_d2e9dda9._.js.map +1 -0
- package/.next/server/chunks/ssr/{_3158c108._.js → _f4d8af3b._.js} +3 -3
- package/.next/server/chunks/ssr/_f4d8af3b._.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_tickets_[ticket]_page_actions_25ad633d.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_tickets_[ticket]_page_actions_25ad633d.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_tickets_page_actions_dffb2525.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_tickets_page_actions_dffb2525.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_workflows_page_actions_3defde35.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_workflows_page_actions_3defde35.js.map +1 -0
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +3 -0
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js.map +1 -0
- package/.next/server/chunks/ssr/ce889_server_app_teams_[teamId]_workflows_[workflowId]_page_actions_880cbbc3.js +3 -0
- package/.next/server/chunks/ssr/ce889_server_app_teams_[teamId]_workflows_[workflowId]_page_actions_880cbbc3.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_ea845e5f._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_ea845e5f._.js.map +1 -0
- package/.next/server/chunks/ssr/{_da6f800e._.js → node_modules_next_aefa2538._.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_next_aefa2538._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_8a37abed._.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_8a37abed._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_9774470f._.js → node_modules_next_dist_client_components_2fffaa3a._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_9774470f._.js.map → node_modules_next_dist_client_components_2fffaa3a._.js.map} +1 -1
- package/.next/server/chunks/ssr/{_68793c1f._.js → node_modules_next_dist_esm_build_templates_app-page_b5ef32b4.js} +3 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_b5ef32b4.js.map +1 -0
- package/.next/server/chunks/ssr/src_13139e3d._.js +3 -0
- package/.next/server/chunks/ssr/src_13139e3d._.js.map +1 -0
- package/.next/server/chunks/ssr/src_2a73b867._.js +3 -0
- package/.next/server/chunks/ssr/src_2a73b867._.js.map +1 -0
- package/.next/server/chunks/ssr/src_2dbb3b7f._.js +3 -0
- package/.next/server/chunks/ssr/src_2dbb3b7f._.js.map +1 -0
- package/.next/server/chunks/ssr/src_417bc4a6._.js +3 -0
- package/.next/server/chunks/ssr/src_417bc4a6._.js.map +1 -0
- package/.next/server/chunks/ssr/src_59477309._.js +3 -0
- package/.next/server/chunks/ssr/src_59477309._.js.map +1 -0
- package/.next/server/chunks/ssr/src_79d55c05._.js +3 -0
- package/.next/server/chunks/ssr/src_79d55c05._.js.map +1 -0
- 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_global-error_tsx_aa661ba4._.js +3 -0
- package/.next/server/chunks/ssr/src_app_global-error_tsx_aa661ba4._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_not-found_tsx_3f23d179._.js +3 -0
- package/.next/server/chunks/ssr/src_app_not-found_tsx_3f23d179._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_index_tsx_98393217._.js +3 -0
- package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_index_tsx_98393217._.js.map +1 -0
- 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]_team-editor_index_tsx_e68e9cbc._.js +12 -0
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_index_tsx_e68e9cbc._.js.map +1 -0
- 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/chunks/ssr/src_e54f24fb._.js +3 -0
- package/.next/server/chunks/ssr/src_e54f24fb._.js.map +1 -0
- package/.next/server/middleware-build-manifest.js +4 -4
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +16 -0
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/static/chunks/0edab8a24d59a626.js +2 -0
- package/.next/static/chunks/11da0a52793b005a.js +1 -0
- package/.next/static/chunks/150338287c7dae30.js +1 -0
- package/.next/static/chunks/236ef28eb649c432.js +1 -0
- package/.next/static/chunks/3e1fe6be993c61fb.js +1 -0
- package/.next/static/chunks/55a88f2071ebe766.js +1 -0
- package/.next/static/chunks/5cf42ef49ad071af.js +10 -0
- package/.next/static/chunks/62e0c437eb8fc2da.js +1 -0
- package/.next/static/chunks/{82abf2d65f5428ae.js → 68a088aa49e6124a.js} +3 -3
- package/.next/static/chunks/7bb0aafbf73524bf.js +1 -0
- package/.next/static/chunks/8d359fbce4ebb835.js +1 -0
- package/.next/static/chunks/9197ecb9606557f3.js +1 -0
- package/.next/static/chunks/93719e85369dd453.js +1 -0
- package/.next/static/chunks/b244476ded155cf9.css +3 -0
- package/.next/static/chunks/c75e00652e6b7d85.js +1 -0
- package/.next/static/chunks/c84580993f22c17a.js +1 -0
- package/.next/static/chunks/d73a47fc8def319c.js +1 -0
- package/.next/static/chunks/daa78a9d669e23f5.js +1 -0
- package/.next/static/chunks/db4da5ee45033817.js +1 -0
- package/.next/static/chunks/e8021fea9aee6b63.js +1 -0
- package/.next/static/chunks/e854e56ea8cb6236.js +1 -0
- package/.next/static/chunks/ffff6b5105288d2c.js +1 -0
- package/.next/static/chunks/{turbopack-ae1340e658f67df8.js → turbopack-0236a74c4f471967.js} +1 -1
- package/README.md +22 -1
- package/openclaw/index.ts +133 -26
- package/openclaw.plugin.json +9 -1
- package/package.json +24 -3
- package/public/android-chrome-192x192.png +0 -0
- package/public/android-chrome-512x512.png +0 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/chef.jpg +0 -0
- package/public/favicon-16x16.png +0 -0
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/src/app/HomeClient.tsx +8 -9
- package/src/app/agents/[agentId]/agent-editor-tabs.tsx +298 -0
- package/src/app/agents/[agentId]/agent-editor.tsx +200 -428
- package/src/app/api/__tests__/agents-add-route.test.ts +143 -0
- package/src/app/api/__tests__/agents-file-route.test.ts +117 -0
- package/src/app/api/__tests__/agents-files-route.test.ts +61 -0
- package/src/app/api/__tests__/agents-id-route.test.ts +104 -0
- package/src/app/api/__tests__/agents-identity-route.test.ts +92 -0
- package/src/app/api/__tests__/agents-route.test.ts +54 -0
- package/src/app/api/__tests__/agents-skills-install-route.test.ts +131 -0
- package/src/app/api/__tests__/agents-skills-route.test.ts +64 -0
- package/src/app/api/__tests__/agents-update-route.test.ts +95 -0
- package/src/app/api/__tests__/channels-bindings-route.test.ts +143 -0
- package/src/app/api/__tests__/cron-delete-route.test.ts +93 -0
- package/src/app/api/__tests__/cron-job-route.test.ts +78 -0
- package/src/app/api/__tests__/cron-jobs-route.test.ts +116 -0
- package/src/app/api/__tests__/cron-recipe-installed-route.test.ts +114 -0
- package/src/app/api/__tests__/gateway-restart-route.test.ts +36 -0
- package/src/app/api/__tests__/goals-promote-route.test.ts +200 -0
- package/src/app/api/__tests__/goals-route.test.ts +184 -0
- package/src/app/api/__tests__/ids-check-route.test.ts +188 -0
- package/src/app/api/__tests__/marketplace-recipes-route.test.ts +123 -0
- package/src/app/api/__tests__/recipes-clone-route.test.ts +221 -0
- package/src/app/api/__tests__/recipes-delete-route.test.ts +248 -0
- package/src/app/api/__tests__/recipes-id-route.test.ts +166 -0
- package/src/app/api/__tests__/recipes-route.test.ts +57 -0
- package/src/app/api/__tests__/recipes-team-agents-route.test.ts +135 -0
- package/src/app/api/__tests__/scaffold-route.test.ts +173 -0
- package/src/app/api/__tests__/settings-cron-installation-route.test.ts +82 -0
- package/src/app/api/__tests__/skills-available-route.test.ts +47 -0
- package/src/app/api/__tests__/swarms-start-route.test.ts +79 -0
- package/src/app/api/__tests__/swarms-status-route.test.ts +42 -0
- package/src/app/api/__tests__/teams-file-route.test.ts +129 -0
- package/src/app/api/__tests__/teams-files-route.test.ts +57 -0
- package/src/app/api/__tests__/teams-meta-route.test.ts +113 -0
- package/src/app/api/__tests__/teams-orchestrator-install-route.test.ts +66 -0
- package/src/app/api/__tests__/teams-orchestrator-route.test.ts +59 -0
- package/src/app/api/__tests__/teams-remove-team-route.test.ts +122 -0
- package/src/app/api/__tests__/teams-skills-install-route.test.ts +78 -0
- package/src/app/api/__tests__/teams-skills-route.test.ts +73 -0
- package/src/app/api/__tests__/teams-workflow-runs-route.test.ts +85 -0
- package/src/app/api/__tests__/teams-workflows-route.test.ts +110 -0
- package/src/app/api/__tests__/tickets-move-route.test.ts +60 -0
- package/src/app/api/agents/[id]/route.ts +33 -29
- package/src/app/api/agents/add/route.ts +38 -33
- package/src/app/api/agents/file/route.ts +14 -27
- package/src/app/api/agents/files/route.ts +7 -62
- package/src/app/api/agents/route.ts +3 -10
- package/src/app/api/agents/skills/install/route.ts +2 -14
- package/src/app/api/agents/skills/route.ts +6 -18
- package/src/app/api/channels/bindings/route.ts +6 -15
- package/src/app/api/cron/__tests__/helpers.test.ts +164 -0
- package/src/app/api/cron/delete/route.ts +4 -63
- package/src/app/api/cron/helpers.ts +172 -0
- package/src/app/api/cron/jobs/route.ts +24 -113
- package/src/app/api/cron/recipe-installed/route.ts +6 -4
- package/src/app/api/gateway/restart/route.ts +2 -1
- package/src/app/api/goals/[id]/promote/route.ts +10 -43
- package/src/app/api/goals/[id]/route.ts +10 -16
- package/src/app/api/goals/route.ts +3 -6
- package/src/app/api/ids/check/route.ts +18 -26
- package/src/app/api/marketplace/recipes/[slug]/route.ts +2 -2
- package/src/app/api/recipes/[id]/route.ts +3 -9
- package/src/app/api/recipes/clone/route.ts +3 -38
- package/src/app/api/recipes/custom-team/route.ts +193 -0
- package/src/app/api/recipes/delete/helpers.ts +65 -0
- package/src/app/api/recipes/delete/route.ts +11 -78
- package/src/app/api/recipes/team-agents/__tests__/helpers.test.ts +156 -0
- package/src/app/api/recipes/team-agents/helpers.ts +151 -0
- package/src/app/api/recipes/team-agents/route.ts +27 -125
- package/src/app/api/scaffold/__tests__/helpers.test.ts +186 -0
- package/src/app/api/scaffold/helpers.ts +214 -0
- package/src/app/api/scaffold/route.ts +40 -274
- package/src/app/api/settings/cron-installation/route.ts +3 -2
- package/src/app/api/skills/available/route.ts +2 -1
- package/src/app/api/swarms/start/route.ts +100 -0
- package/src/app/api/swarms/status/route.ts +31 -0
- package/src/app/api/teams/[teamId]/tickets/assign/route.ts +105 -0
- package/src/app/api/teams/[teamId]/tickets/assignees/route.ts +27 -0
- package/src/app/api/teams/[teamId]/tickets/delete/route.ts +55 -0
- package/src/app/api/teams/[teamId]/tickets/move/route.ts +70 -0
- package/src/app/api/teams/[teamId]/tickets/move-to-goals/route.ts +56 -0
- package/src/app/api/teams/file/route.ts +26 -47
- package/src/app/api/teams/files/route.ts +13 -45
- package/src/app/api/teams/memory/route.ts +250 -0
- package/src/app/api/teams/meta/route.ts +16 -35
- package/src/app/api/teams/orchestrator/install/route.ts +129 -0
- package/src/app/api/teams/orchestrator/route.ts +216 -0
- package/src/app/api/teams/remove-team/route.ts +7 -15
- package/src/app/api/teams/skills/install/route.ts +2 -13
- package/src/app/api/teams/skills/route.ts +6 -17
- package/src/app/api/teams/workflow-runs/route.ts +534 -0
- package/src/app/api/teams/workflow-templates/route.ts +71 -0
- package/src/app/api/teams/workflows/route.ts +55 -0
- package/src/app/api/tickets/assign/route.ts +94 -0
- package/src/app/api/tickets/assignees/route.ts +24 -0
- package/src/app/api/tickets/move/route.ts +31 -0
- package/src/app/channels/channels-client.tsx +48 -47
- package/src/app/cron-jobs/cron-jobs-client.tsx +11 -14
- package/src/app/cron-jobs/page.tsx +1 -1
- package/src/app/global-error.tsx +50 -0
- package/src/app/goals/[id]/goal-editor.tsx +74 -179
- package/src/app/goals/goals-client.tsx +30 -39
- package/src/app/goals/new/page.tsx +45 -124
- package/src/app/layout.tsx +8 -0
- package/src/app/manifest.ts +15 -0
- package/src/app/not-found.tsx +8 -0
- package/src/app/page.tsx +4 -31
- package/src/app/recipes/CreateAgentModal.tsx +98 -153
- package/src/app/recipes/CreateCustomTeamModal.tsx +375 -0
- package/src/app/recipes/CreateModalShell.tsx +55 -0
- package/src/app/recipes/CreateTeamModal.tsx +54 -105
- package/src/app/recipes/[id]/RecipeEditor/RecipeEditorCreateModal.tsx +72 -0
- package/src/app/recipes/[id]/RecipeEditor/RecipeEditorPanel.tsx +216 -0
- package/src/app/recipes/[id]/RecipeEditor/index.tsx +271 -0
- package/src/app/recipes/[id]/RecipeEditor/recipe-editor-utils.ts +46 -0
- package/src/app/recipes/[id]/RecipeEditor/types.ts +52 -0
- package/src/app/recipes/[id]/page.tsx +4 -18
- package/src/app/recipes/page.tsx +9 -2
- package/src/app/recipes/recipes-client.tsx +266 -156
- package/src/app/settings/page.tsx +1 -1
- package/src/app/settings/settings-client.tsx +11 -10
- package/src/app/teams/[teamId]/CloneTeamModal.tsx +77 -111
- package/src/app/teams/[teamId]/OrchestratorPanel.tsx +255 -0
- package/src/app/teams/[teamId]/OrchestratorSetupModal.tsx +184 -0
- package/src/app/teams/[teamId]/PublishChangesModal.tsx +21 -42
- package/src/app/teams/[teamId]/page.tsx +27 -49
- package/src/app/teams/[teamId]/team-editor/TeamAgentsTab.tsx +145 -0
- package/src/app/teams/[teamId]/team-editor/TeamCronTab.tsx +72 -0
- package/src/app/teams/[teamId]/team-editor/TeamFilesTab.tsx +74 -0
- package/src/app/teams/[teamId]/team-editor/TeamMemoryTab.tsx +349 -0
- package/src/app/teams/[teamId]/team-editor/TeamRecipeTab.tsx +151 -0
- package/src/app/teams/[teamId]/team-editor/TeamSkillsTab.tsx +68 -0
- package/src/app/teams/[teamId]/team-editor/index.tsx +558 -0
- package/src/app/teams/[teamId]/team-editor/team-editor-data.ts +255 -0
- package/src/app/teams/[teamId]/team-editor/team-editor-utils.ts +78 -0
- package/src/app/teams/[teamId]/team-editor/types.ts +34 -0
- package/src/app/teams/[teamId]/tickets/[ticket]/page.tsx +35 -0
- package/src/app/teams/[teamId]/tickets/page.tsx +15 -0
- package/src/app/teams/[teamId]/workflows/[workflowId]/WorkflowCanvas.tsx +111 -0
- package/src/app/teams/[teamId]/workflows/[workflowId]/page.tsx +27 -0
- package/src/app/teams/[teamId]/workflows/[workflowId]/workflows-editor-client.tsx +1608 -0
- package/src/app/teams/[teamId]/workflows/page.tsx +40 -0
- package/src/app/teams/[teamId]/workflows/workflows-client.tsx +494 -0
- package/src/app/tickets/TicketDetailClient.tsx +147 -0
- package/src/app/tickets/TicketsBoardClient.tsx +11 -57
- package/src/app/tickets/[ticket]/TicketAssignControl.tsx +112 -0
- package/src/app/tickets/[ticket]/page.tsx +13 -21
- package/src/app/tickets/page.tsx +5 -2
- package/src/components/AppShell.tsx +252 -31
- package/src/{app/cron-jobs/DeleteCronJobModal.tsx → components/ConfirmationModal.tsx} +35 -17
- package/src/components/DeleteEntityModal.tsx +41 -0
- package/src/components/ErrorBoundary.tsx +70 -0
- package/src/components/FileListWithOptionalToggle.tsx +86 -0
- package/src/components/GoalFormFields.tsx +163 -0
- package/src/components/ScaffoldOverlay.tsx +7 -10
- package/src/components/ToastProvider.tsx +22 -18
- package/src/components/__tests__/ConfirmationModal.test.tsx +109 -0
- package/src/components/__tests__/ErrorBoundary.test.tsx +39 -0
- package/src/components/__tests__/FileListWithOptionalToggle.test.tsx +109 -0
- package/src/components/__tests__/GoalFormFields.test.tsx +117 -0
- package/src/components/delete-modals.tsx +59 -0
- package/src/components/icons.tsx +12 -10
- package/src/lib/__tests__/agent-workspace.test.ts +44 -0
- package/src/lib/__tests__/agents.test.ts +36 -0
- package/src/lib/__tests__/api-route-helpers.test.ts +188 -0
- package/src/lib/__tests__/cron.test.ts +45 -0
- package/src/lib/__tests__/editor-utils.test.ts +38 -0
- package/src/lib/__tests__/errors.test.ts +15 -0
- package/src/lib/__tests__/exec.test.ts +13 -0
- package/src/lib/__tests__/fetch-json.test.ts +118 -0
- package/src/lib/__tests__/gateway.test.ts +234 -0
- package/src/lib/__tests__/goal-promote.test.ts +39 -0
- package/src/lib/__tests__/goals-client.test.ts +26 -0
- package/src/lib/__tests__/goals.test.ts +275 -0
- package/src/lib/__tests__/json.test.ts +15 -0
- package/src/lib/__tests__/kitchen-api.test.ts +32 -0
- package/src/lib/__tests__/marketplace.test.ts +116 -0
- package/src/lib/__tests__/openclaw.test.ts +129 -0
- package/src/lib/__tests__/paths.test.ts +136 -0
- package/src/lib/__tests__/poll.test.ts +26 -0
- package/src/lib/__tests__/recipe-clone.test.ts +85 -0
- package/src/lib/__tests__/recipe-team-agents.test.ts +70 -0
- package/src/lib/__tests__/recipes.test.ts +199 -0
- package/src/lib/__tests__/scaffold-client.test.ts +106 -0
- package/src/lib/__tests__/scaffold.test.ts +64 -0
- package/src/lib/__tests__/slugify.test.ts +23 -0
- package/src/lib/__tests__/tickets.test.ts +158 -0
- package/src/lib/__tests__/type-guards.test.ts +18 -0
- package/src/lib/__tests__/use-slugified-id.test.tsx +120 -0
- package/src/lib/agents.ts +17 -0
- package/src/lib/api-route-helpers.ts +157 -0
- package/src/lib/cron.ts +40 -0
- package/src/lib/editor-utils.ts +18 -0
- package/src/lib/errors.ts +7 -0
- package/src/lib/exec.ts +4 -0
- package/src/lib/fetch-json.ts +29 -0
- package/src/lib/gateway.ts +5 -1
- package/src/lib/goal-promote.ts +27 -0
- package/src/lib/goals-client.ts +69 -0
- package/src/lib/goals.ts +22 -3
- package/src/lib/json.ts +10 -0
- package/src/lib/openclaw.ts +28 -13
- package/src/lib/paths.ts +12 -0
- package/src/lib/poll.ts +18 -0
- package/src/lib/recipe-clone.ts +42 -0
- package/src/lib/recipe-team-agents.ts +30 -0
- package/src/lib/recipes.ts +47 -0
- package/src/lib/scaffold-client.ts +31 -0
- package/src/lib/scaffold.ts +37 -0
- package/src/lib/slugify.ts +25 -0
- package/src/lib/swarms.ts +25 -0
- package/src/lib/tickets.ts +81 -25
- package/src/lib/type-guards.ts +3 -0
- package/src/lib/use-slugified-id.ts +35 -0
- package/src/lib/workflows/README.md +11 -0
- package/src/lib/workflows/__tests__/storage.test.ts +129 -0
- package/src/lib/workflows/__tests__/validate.test.ts +92 -0
- package/src/lib/workflows/api-handlers.ts +35 -0
- package/src/lib/workflows/readdir.ts +23 -0
- package/src/lib/workflows/runs-storage.ts +59 -0
- package/src/lib/workflows/runs-types.ts +42 -0
- package/src/lib/workflows/storage.ts +70 -0
- package/src/lib/workflows/templates/index.ts +1 -0
- package/src/lib/workflows/templates/marketing-cadence-v1.ts +142 -0
- package/src/lib/workflows/types.ts +48 -0
- package/src/lib/workflows/validate.ts +92 -0
- package/.next/server/app/tickets.html +0 -1
- package/.next/server/app/tickets.meta +0 -15
- package/.next/server/app/tickets.rsc +0 -19
- package/.next/server/app/tickets.segments/_full.segment.rsc +0 -19
- package/.next/server/app/tickets.segments/_head.segment.rsc +0 -6
- package/.next/server/app/tickets.segments/_index.segment.rsc +0 -6
- package/.next/server/app/tickets.segments/_tree.segment.rsc +0 -4
- package/.next/server/app/tickets.segments/tickets/__PAGE__.segment.rsc +0 -8
- package/.next/server/app/tickets.segments/tickets.segment.rsc +0 -4
- package/.next/server/chunks/[root-of-the-server]__055885ce._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__055885ce._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__0c01c5c7._.js +0 -10
- package/.next/server/chunks/[root-of-the-server]__0c01c5c7._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__1398a33a._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1398a33a._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__159c002b._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__159c002b._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__20c60fb7._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__20c60fb7._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__2588560d._.js +0 -6
- package/.next/server/chunks/[root-of-the-server]__2588560d._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__27293e91._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__27293e91._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__29c85a51._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__29c85a51._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__29fa8108._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__29fa8108._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__2bd44067._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__2bd44067._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__2dd1afff._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__2dd1afff._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__401ab759._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__401ab759._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__422c7160._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__422c7160._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__4670294e._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__4670294e._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__4eda99a9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__4eda99a9._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__54478298._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__54478298._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__6dbdb384._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__6dbdb384._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__94d68aa3._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__94d68aa3._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__9ecbb339._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__9ecbb339._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__a27f8405._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__a27f8405._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__a6ac3ddf._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__b11231a9._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__b11231a9._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__b59b3cdd._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__b59b3cdd._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__b5c2b370._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__b5c2b370._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__b955e35a._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__b955e35a._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__be5f57b2._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__c4ff0427._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__c4ff0427._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__c4ffbb03._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__c4ffbb03._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__d737ca42._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__d737ca42._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__df7df3ac._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__df7df3ac._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__dfca6557._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__dfca6557._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__e6184ba3._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__e6184ba3._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__ed0323e9._.js +0 -8
- package/.next/server/chunks/[root-of-the-server]__ed0323e9._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__f585823b._.js +0 -6
- package/.next/server/chunks/[root-of-the-server]__f585823b._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__ff940674._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__ff940674._.js.map +0 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_5a9305ea.js +0 -6
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_5a9305ea.js.map +0 -1
- package/.next/server/chunks/src_lib_d2210cbf._.js +0 -3
- package/.next/server/chunks/src_lib_d2210cbf._.js.map +0 -1
- package/.next/server/chunks/ssr/[externals]__c37e9f91._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__15600e29._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__247198dc._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__2a6f1e3e._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__346f79e5._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__346f79e5._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__3575e6da._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__3ad3e5b1._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__3bc7ad0a._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__4393e897._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__4393e897._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__46e08d44._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__491e06fa._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__491e06fa._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__507d2fc9._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__507d2fc9._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__5d24d429._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__5d24d429._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__7180d770._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__82ce3aee._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__82ce3aee._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__8d24c9c3._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__8d24c9c3._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__a457c799._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__a457c799._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__bc3b27b0._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__bc3b27b0._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__f75a61bf._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__f75a61bf._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__fd669584._.js +0 -3
- package/.next/server/chunks/ssr/_0808c2b9._.js.map +0 -1
- package/.next/server/chunks/ssr/_1aad1d9b._.js +0 -24
- package/.next/server/chunks/ssr/_1aad1d9b._.js.map +0 -1
- package/.next/server/chunks/ssr/_3158c108._.js.map +0 -1
- package/.next/server/chunks/ssr/_39e6e769._.js.map +0 -1
- package/.next/server/chunks/ssr/_3c8b2df6._.js.map +0 -1
- package/.next/server/chunks/ssr/_5070929e._.js +0 -3
- package/.next/server/chunks/ssr/_5070929e._.js.map +0 -1
- package/.next/server/chunks/ssr/_68793c1f._.js.map +0 -1
- package/.next/server/chunks/ssr/_6e70b5a4._.js.map +0 -1
- package/.next/server/chunks/ssr/_8c45edba._.js.map +0 -1
- package/.next/server/chunks/ssr/_8c8207c1._.js.map +0 -1
- package/.next/server/chunks/ssr/_92140ca3._.js.map +0 -1
- package/.next/server/chunks/ssr/_b5e9afcc._.js.map +0 -1
- package/.next/server/chunks/ssr/_cd23c5af._.js.map +0 -1
- package/.next/server/chunks/ssr/_d27483a1._.js.map +0 -1
- package/.next/server/chunks/ssr/_da6f800e._.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/node_modules_next_dist_12287b3d._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_852965c2._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_852965c2._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_45780354.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_45780354.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_68c68167.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_channels_channels-client_tsx_8c8be116._.js +0 -3
- package/.next/server/chunks/ssr/src_app_channels_channels-client_tsx_8c8be116._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_goals_[id]_goal-editor_tsx_7df8193f._.js +0 -3
- package/.next/server/chunks/ssr/src_app_goals_[id]_goal-editor_tsx_7df8193f._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_goals_goals-client_tsx_a45eeff4._.js +0 -3
- package/.next/server/chunks/ssr/src_app_goals_goals-client_tsx_a45eeff4._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_goals_new_page_tsx_8f749229._.js +0 -3
- package/.next/server/chunks/ssr/src_app_goals_new_page_tsx_8f749229._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_tsx_c6d38350._.js +0 -3
- package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_tsx_c6d38350._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_settings_settings-client_tsx_279084f8._.js +0 -3
- package/.next/server/chunks/ssr/src_app_settings_settings-client_tsx_279084f8._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_tsx_2900b91d._.js +0 -12
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_tsx_2900b91d._.js.map +0 -1
- package/.next/static/chunks/10cbf02e6fc36465.js +0 -2
- package/.next/static/chunks/1ce21af6dfb18ee3.js +0 -1
- package/.next/static/chunks/40f7fde35327d214.js +0 -1
- package/.next/static/chunks/54beb791bcc086ae.js +0 -1
- package/.next/static/chunks/55866d57aa2c7a9c.js +0 -1
- package/.next/static/chunks/6a7862e37c616cc3.js +0 -1
- package/.next/static/chunks/817ae077ec8c6255.js +0 -1
- package/.next/static/chunks/8484c54dc9a377e8.js +0 -10
- package/.next/static/chunks/8662fcc3cdff66f3.js +0 -1
- package/.next/static/chunks/99208ebf7e47471d.js +0 -1
- package/.next/static/chunks/a4e69b85b74277a7.css +0 -3
- package/.next/static/chunks/a9ed074e89b16a5e.js +0 -1
- package/.next/static/chunks/c6dfa918cafb6c0c.js +0 -1
- package/.next/static/chunks/d1c5f764e5fd615a.js +0 -1
- package/.next/static/chunks/d4ce2f908d8c4dea.js +0 -1
- package/.next/static/chunks/de9e30e86ef31e72.js +0 -1
- package/src/app/recipes/DeleteRecipeModal.tsx +0 -62
- package/src/app/recipes/[id]/RecipeEditor.tsx +0 -697
- package/src/app/teams/[teamId]/DeleteTeamModal.tsx +0 -54
- package/src/app/teams/[teamId]/team-editor.tsx +0 -1195
- /package/.next/server/chunks/{[root-of-the-server]__74b80ca4._.js.map → [root-of-the-server]__c63a9f28._.js.map} +0 -0
- /package/.next/server/chunks/{ssr/[externals]__c37e9f91._.js.map → _next-internal_server_app_api_recipes_custom-team_route_actions_861b1489.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__3bc7ad0a._.js.map → [root-of-the-server]__0d4cb2ba._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{[root-of-the-server]__e2e52c6e._.js.map → [root-of-the-server]__78cdd31e._.js.map} +0 -0
- /package/.next/static/{QOy0ilqTW1kHfmpls_oWp → z9yFlFZ5f_hw9mm0nfMJl}/_buildManifest.js +0 -0
- /package/.next/static/{QOy0ilqTW1kHfmpls_oWp → z9yFlFZ5f_hw9mm0nfMJl}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{QOy0ilqTW1kHfmpls_oWp → z9yFlFZ5f_hw9mm0nfMJl}/_ssgManifest.js +0 -0
package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_index_tsx_e68e9cbc._.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/team-editor/index.tsx","../../../../src/app/teams/%5BteamId%5D/PublishChangesModal.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/team-editor-utils.ts","../../../../src/app/teams/%5BteamId%5D/team-editor/team-editor-data.ts","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamRecipeTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamAgentsTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamSkillsTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamCronTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamFilesTab.tsx","../../../../src/app/teams/%5BteamId%5D/team-editor/TeamMemoryTab.tsx","../../../../src/app/teams/%5BteamId%5D/OrchestratorSetupModal.tsx","../../../../src/app/teams/%5BteamId%5D/OrchestratorPanel.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { parse as parseYaml } from \"yaml\";\nimport { useRouter } from \"next/navigation\";\nimport { DeleteTeamModal } from \"@/components/delete-modals\";\nimport { PublishChangesModal } from \"../PublishChangesModal\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport {\n loadTeamEditorInitial,\n handleAddAgentToTeam,\n} from \"./team-editor-data\";\nimport { forceFrontmatterId, forceFrontmatterTeamTeamId } from \"./team-editor-utils\";\nimport type { RecipeDetail, RecipeListItem, TeamAgentEntry } from \"./types\";\nimport { TeamRecipeTab } from \"./TeamRecipeTab\";\nimport { TeamAgentsTab } from \"./TeamAgentsTab\";\nimport { TeamSkillsTab } from \"./TeamSkillsTab\";\nimport { TeamCronTab } from \"./TeamCronTab\";\nimport { TeamFilesTab } from \"./TeamFilesTab\";\nimport { TeamMemoryTab } from \"./TeamMemoryTab\";\nimport { OrchestratorPanel } from \"../OrchestratorPanel\";\nimport WorkflowsClient from \"../workflows/workflows-client\";\n\nconst TABS = [\n { id: \"recipe\" as const, label: \"Recipe\" },\n { id: \"agents\" as const, label: \"Agents\" },\n { id: \"skills\" as const, label: \"Skills\" },\n { id: \"cron\" as const, label: \"Cron\" },\n { id: \"files\" as const, label: \"Files\" },\n { id: \"memory\" as const, label: \"Memory\" },\n { id: \"orchestrator\" as const, label: \"Orchestrator\" },\n { id: \"workflows\" as const, label: \"Workflows\" },\n];\n\ntype TabId = (typeof TABS)[number][\"id\"];\n\nexport default function TeamEditor({ teamId, initialTab }: { teamId: string; initialTab?: string }) {\n const router = useRouter();\n const [recipes, setRecipes] = useState<RecipeListItem[]>([]);\n const [fromId, setFromId] = useState<string>(\"\");\n const [lockedFromId, setLockedFromId] = useState<string | null>(null);\n const [lockedFromName, setLockedFromName] = useState<string | null>(null);\n const [provenanceMissing, setProvenanceMissing] = useState(false);\n const [toId, setToId] = useState<string>(teamId);\n const [toName, setToName] = useState<string>(teamId);\n const [content, setContent] = useState<string>(\"\");\n const [loadedRecipeHash, setLoadedRecipeHash] = useState<string | null>(null);\n const [activeTab, setActiveTab] = useState<TabId>(() => {\n const valid: TabId[] = [\"recipe\", \"agents\", \"skills\", \"cron\", \"files\", \"memory\", \"orchestrator\", \"workflows\"];\n return valid.includes(initialTab as TabId) ? (initialTab as TabId) : \"recipe\";\n });\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [publishing, setPublishing] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [loadingSource, setLoadingSource] = useState(false);\n const [recipeLoadError, setRecipeLoadError] = useState<string>(\"\");\n const toast = useToast();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [publishOpen, setPublishOpen] = useState(false);\n const [teamMetaRecipeHash, setTeamMetaRecipeHash] = useState<string | null>(null);\n\n function flashMessage(next: string, kind: \"success\" | \"error\" | \"info\" = \"info\") {\n const msg = String(next ?? \"\").trim();\n if (!msg) return;\n toast.push({ kind, message: msg });\n }\n\n const [teamFiles, setTeamFiles] = useState<{ name: string; missing: boolean; required?: boolean; rationale?: string }[]>([]);\n const [teamFilesLoading, setTeamFilesLoading] = useState(false);\n const [teamFileError, setTeamFileError] = useState<string>(\"\");\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"SOUL.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const [cronJobs, setCronJobs] = useState<unknown[]>([]);\n const [cronLoading, setCronLoading] = useState(false);\n\n const [teamAgents, setTeamAgents] = useState<TeamAgentEntry[]>([]);\n const [teamAgentsLoading, setTeamAgentsLoading] = useState(false);\n\n const recipeAgents = useMemo(() => {\n const md = String(content ?? \"\");\n if (!md.startsWith(\"---\\n\")) return [] as Array<{ role: string; name?: string }>;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return [] as Array<{ role: string; name?: string }>;\n const fmText = md.slice(4, end + 1);\n try {\n const fm = (parseYaml(fmText) ?? {}) as { agents?: unknown };\n const agents = Array.isArray(fm.agents) ? fm.agents : [];\n return agents\n .map((a) => a as { role?: unknown; name?: unknown })\n .map((a) => ({ role: String(a.role ?? \"\").trim(), name: typeof a.name === \"string\" ? a.name : undefined }))\n .filter((a) => Boolean(a.role));\n } catch {\n return [] as Array<{ role: string; name?: string }>;\n }\n }, [content]);\n\n const [newRole, setNewRole] = useState<string>(\"\");\n const [customRole, setCustomRole] = useState<string>(\"\");\n const [newRoleName, setNewRoleName] = useState<string>(\"\");\n\n const derivedRole = useMemo(() => {\n const v = (newRole === \"__custom__\" ? customRole : newRole).trim();\n return v || \"\";\n }, [newRole, customRole]);\n\n const [skillsList, setSkillsList] = useState<string[]>([]);\n const [availableSkills, setAvailableSkills] = useState<string[]>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<string>(\"\");\n const [installingSkill, setInstallingSkill] = useState(false);\n const [teamSkillMsg, setTeamSkillMsg] = useState<string>(\"\");\n const [teamSkillError, setTeamSkillError] = useState<string>(\"\");\n\n const teamRecipes = useMemo(() => recipes.filter((r) => r.kind === \"team\"), [recipes]);\n\n const toRecipe = useMemo(() => {\n const ws = recipes.find((r) => r.id === toId && r.source === \"workspace\");\n return ws ?? recipes.find((r) => r.id === toId) ?? null;\n }, [recipes, toId]);\n\n const teamIdValid = Boolean(teamId.trim());\n const targetIdValid = Boolean(toId.trim());\n const hasWorkspaceOverride = recipes.some((r) => r.id === toId && r.source === \"workspace\");\n const targetIsBuiltin = Boolean(toRecipe?.source === \"builtin\" && !hasWorkspaceOverride);\n const canEditTargetId = true;\n\n useEffect(() => {\n setToId(teamId);\n setToName(teamId);\n setContent(\"\");\n setLoadedRecipeHash(null);\n setTeamMetaRecipeHash(null);\n setPublishOpen(false);\n setDeleteOpen(false);\n const valid: TabId[] = [\"recipe\", \"agents\", \"skills\", \"cron\", \"files\", \"memory\", \"orchestrator\", \"workflows\"];\n if (initialTab && valid.includes(initialTab as TabId)) {\n setActiveTab(initialTab as TabId);\n }\n }, [teamId, initialTab]);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n loadTeamEditorInitial(teamId, {\n setRecipes,\n setLockedFromId,\n setLockedFromName,\n setProvenanceMissing,\n setFromId,\n setTeamMetaRecipeHash,\n setTeamFiles,\n setCronJobs,\n setTeamAgents,\n setSkillsList,\n setAvailableSkills,\n setSelectedSkill,\n setTeamFilesLoading,\n setCronLoading,\n setTeamAgentsLoading,\n setSkillsLoading,\n })\n .then(() => {\n if (!cancelled) setLoading(false);\n })\n .catch((e: unknown) => {\n flashMessage(errorMessage(e), \"error\");\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Initial load only; flashMessage and setters are stable.\n }, [teamId]);\n\n async function onLoadTeamRecipeMarkdown() {\n const id = toId.trim();\n if (!id) return;\n setLoadingSource(true);\n setRecipeLoadError(\"\");\n try {\n const json = await fetchJson<{ recipe?: RecipeDetail; recipeHash?: string }>(`/api/recipes/${encodeURIComponent(id)}`, {\n cache: \"no-store\",\n });\n const r = json.recipe as RecipeDetail;\n setContent(r.content);\n setLoadedRecipeHash(typeof json.recipeHash === \"string\" ? json.recipeHash : null);\n } catch (e: unknown) {\n setRecipeLoadError(errorMessage(e));\n } finally {\n setLoadingSource(false);\n }\n }\n\n useEffect(() => {\n const id = toId.trim();\n if (!id) return;\n if (content.trim()) return;\n if (loadingSource) return;\n void onLoadTeamRecipeMarkdown();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Sync toId to load; onLoadTeamRecipeMarkdown and content are intentionally omitted.\n }, [toId]);\n\n async function ensureCustomRecipeExists(args: { overwrite: boolean; toId?: string; toName?: string; scaffold?: boolean }) {\n const f = fromId.trim();\n const id = String(args.toId ?? toId).trim();\n const name = String(args.toName ?? toName).trim();\n const overwrite = Boolean(args.overwrite);\n const scaffold = Boolean(args.scaffold);\n if (!f) throw new Error(\"Source recipe id is required\");\n if (!id) throw new Error(\"Custom recipe id is required\");\n const json = await fetchJson<{ filePath: string; content: string; scaffold?: { ok: boolean; error?: string } | null }>(\n \"/api/recipes/clone\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ fromId: f, toId: id, toName: name || undefined, overwrite, scaffold }),\n }\n );\n return json;\n }\n\n async function onSaveCustom(overwrite: boolean, overrides?: { toId?: string; toName?: string; scaffold?: boolean }) {\n setSaving(true);\n flashMessage(\"\");\n try {\n const json = await ensureCustomRecipeExists({ overwrite, ...overrides });\n if (json.scaffold && !json.scaffold.ok) {\n flashMessage(`Scaffold failed (recipe was still cloned): ${json.scaffold.error || \"Unknown error\"}`, \"error\");\n }\n const hasEdits = Boolean(content.trim()) && content.trim() !== json.content.trim();\n if (hasEdits) {\n const nextContent = forceFrontmatterTeamTeamId(forceFrontmatterId(content, toId.trim()), toId.trim());\n await fetchJson(`/api/recipes/${encodeURIComponent(toId.trim())}`, {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ content: nextContent }),\n });\n setContent(nextContent);\n } else {\n setContent(json.content);\n }\n try {\n const next = await fetchJson<{ recipeHash?: string }>(`/api/recipes/${encodeURIComponent(toId.trim())}`, {\n cache: \"no-store\",\n });\n if (typeof next.recipeHash === \"string\") setLoadedRecipeHash(next.recipeHash);\n } catch {\n setLoadedRecipeHash(null);\n }\n flashMessage(`Saved team recipe: ${json.filePath}`, \"success\");\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadTeamFile(name: string) {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean; content?: string }>(\n `/api/teams/file?teamId=${encodeURIComponent(teamId)}&name=${encodeURIComponent(name)}`,\n { cache: \"no-store\" }\n );\n if (!json.ok) throw new Error(\"Failed to load file\");\n setFileName(name);\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setTeamFileError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveTeamFile() {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean }>(\"/api/teams/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, name: fileName, content: fileContent }),\n });\n if (!json.ok) throw new Error(\"Failed to save file\");\n } catch (e: unknown) {\n setTeamFileError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onAddAgent() {\n setSaving(true);\n try {\n await handleAddAgentToTeam({\n teamId,\n toId,\n newRole,\n derivedRole,\n newRoleName,\n content,\n setContent,\n setTeamAgents,\n flashMessage,\n ensureCustomRecipeExists,\n });\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onCronAction(id: string, label: string, action: \"enable\" | \"disable\" | \"run\") {\n setSaving(true);\n try {\n await fetchJson(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action }),\n });\n flashMessage(`Cron ${action}: ${label}`, \"success\");\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onInstallSkill() {\n setInstallingSkill(true);\n setTeamSkillMsg(\"\");\n setTeamSkillError(\"\");\n try {\n await fetchJson(\"/api/teams/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, skill: selectedSkill }),\n });\n setTeamSkillMsg(`Installed skill: ${selectedSkill}`);\n try {\n const j = await fetchJson<{ ok?: boolean; skills?: string[] }>(\n `/api/teams/skills?teamId=${encodeURIComponent(teamId)}`,\n { cache: \"no-store\" }\n );\n if (j.ok && Array.isArray(j.skills)) setSkillsList(j.skills);\n } catch {\n // ignore\n }\n } catch (e: unknown) {\n setTeamSkillError(errorMessage(e));\n } finally {\n setInstallingSkill(false);\n }\n }\n\n return (\n <div className=\"ck-glass w-full p-6 sm:p-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team editor</h1>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Bootstrap a <strong>custom team recipe</strong> for this installed team, without modifying builtin recipes.\n </p>\n\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {TABS.map((t) => (\n <button\n key={t.id}\n onClick={() => setActiveTab(t.id as TabId)}\n className={\n activeTab === t.id\n ? \"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]\"\n : \"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10\"\n }\n >\n {t.label}\n </button>\n ))}\n </div>\n\n {activeTab === \"recipe\" && (\n <TeamRecipeTab\n loading={loading}\n fromId={fromId}\n setFromId={setFromId}\n toId={toId}\n setToId={setToId}\n toName={toName}\n setToName={setToName}\n canEditTargetId={canEditTargetId}\n teamRecipes={teamRecipes}\n lockedFromId={lockedFromId}\n lockedFromName={lockedFromName}\n provenanceMissing={provenanceMissing}\n saving={saving}\n teamIdValid={teamIdValid}\n targetIdValid={targetIdValid}\n targetIsBuiltin={targetIsBuiltin}\n loadedRecipeHash={loadedRecipeHash}\n teamMetaRecipeHash={teamMetaRecipeHash}\n publishing={publishing}\n content={content}\n setContent={setContent}\n setLoadedRecipeHash={setLoadedRecipeHash}\n recipeLoadError={recipeLoadError}\n onSaveCustom={onSaveCustom}\n onPublishOpen={() => setPublishOpen(true)}\n onDeleteOpen={() => setDeleteOpen(true)}\n />\n )}\n\n {activeTab === \"agents\" && (\n <TeamAgentsTab\n teamId={teamId}\n toId={toId}\n recipeAgents={recipeAgents}\n newRole={newRole}\n setNewRole={setNewRole}\n customRole={customRole}\n setCustomRole={setCustomRole}\n newRoleName={newRoleName}\n setNewRoleName={setNewRoleName}\n derivedRole={derivedRole}\n saving={saving}\n teamAgents={teamAgents}\n teamAgentsLoading={teamAgentsLoading}\n onAddAgent={onAddAgent}\n />\n )}\n\n {activeTab === \"skills\" && (\n <TeamSkillsTab\n teamId={teamId}\n skillsList={skillsList}\n availableSkills={availableSkills}\n skillsLoading={skillsLoading}\n selectedSkill={selectedSkill}\n setSelectedSkill={setSelectedSkill}\n installingSkill={installingSkill}\n teamSkillMsg={teamSkillMsg}\n teamSkillError={teamSkillError}\n onInstallSkill={onInstallSkill}\n />\n )}\n\n {activeTab === \"cron\" && (\n <TeamCronTab\n cronJobs={cronJobs}\n cronLoading={cronLoading}\n saving={saving}\n onCronAction={onCronAction}\n />\n )}\n\n {activeTab === \"workflows\" && (\n <div className=\"mt-6\">\n <WorkflowsClient teamId={teamId} />\n </div>\n )}\n\n {activeTab === \"orchestrator\" && <OrchestratorPanel teamId={teamId} />}\n\n {activeTab === \"memory\" && (\n <div className=\"mt-6\">\n <TeamMemoryTab teamId={teamId} />\n </div>\n )}\n\n {activeTab === \"files\" && (\n <TeamFilesTab\n teamFiles={teamFiles}\n teamFilesLoading={teamFilesLoading}\n showOptionalFiles={showOptionalFiles}\n setShowOptionalFiles={setShowOptionalFiles}\n fileName={fileName}\n fileContent={fileContent}\n setFileContent={setFileContent}\n teamFileError={teamFileError}\n saving={saving}\n onLoadTeamFile={onLoadTeamFile}\n onSaveTeamFile={onSaveTeamFile}\n />\n )}\n\n <PublishChangesModal\n open={publishOpen}\n teamId={teamId}\n recipeId={toId}\n busy={publishing}\n onClose={() => setPublishOpen(false)}\n onConfirm={async () => {\n setPublishing(true);\n try {\n await fetchJson(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n overwrite: true,\n applyConfig: true,\n }),\n });\n try {\n const metaJson = await fetchJson<{ ok?: boolean; meta?: { recipeHash?: string } }>(\n `/api/teams/meta?teamId=${encodeURIComponent(teamId)}`,\n { cache: \"no-store\" }\n );\n if (metaJson.ok && metaJson.meta && typeof metaJson.meta.recipeHash === \"string\") {\n setTeamMetaRecipeHash(metaJson.meta.recipeHash);\n }\n } catch {\n // ignore\n }\n setPublishOpen(false);\n flashMessage(\"Published changes to active team\", \"success\");\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setPublishing(false);\n }\n }}\n />\n\n <DeleteTeamModal\n open={deleteOpen}\n teamId={teamId}\n busy={deleting}\n onClose={() => setDeleteOpen(false)}\n onConfirm={async () => {\n setDeleting(true);\n try {\n await fetchJson(\"/api/teams/remove-team\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId }),\n });\n flashMessage(\"Deleted team successfully\", \"success\");\n setDeleteOpen(false);\n setTimeout(() => router.push(\"/\"), 250);\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n } finally {\n setDeleting(false);\n }\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\n\nexport function PublishChangesModal({\n open,\n teamId,\n recipeId,\n onClose,\n onConfirm,\n busy,\n}: {\n open: boolean;\n teamId: string;\n recipeId: string;\n busy?: boolean;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title=\"Publish changes\"\n confirmLabel=\"Publish changes\"\n confirmBusyLabel=\"Publishing…\"\n busy={busy}\n onConfirm={onConfirm}\n confirmButtonClassName=\"rounded-[var(--ck-radius-sm)] bg-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-emerald-500 disabled:opacity-50\"\n >\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n This will re-scaffold team <code className=\"font-mono\">{teamId}</code> from recipe <code className=\"font-mono\">{recipeId}</code>.\n </p>\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-amber-400/30 bg-amber-500/10 p-3 text-sm text-amber-100\">\n <div className=\"font-medium\">Complete overwrite</div>\n <div className=\"mt-1\">\n All existing team workspace files managed by the recipe will be overwritten (for example: <code className=\"font-mono\">AGENTS.md</code>,{\" \"}\n <code className=\"font-mono\">SOUL.md</code>, role templates, and other scaffolded files). Any manual edits in those files will be lost.\n </div>\n </div>\n </ConfirmationModal>\n );\n}\n","export function safeParseJson<T>(text: string, def: T): T {\n try {\n return JSON.parse(text) as T;\n } catch {\n return def;\n }\n}\n\nfunction replaceOrAddIdInLines(lines: string[], id: string): string[] {\n let found = false;\n const next = lines.map((line) => {\n if (/^id\\s*:/i.test(line)) {\n found = true;\n return `id: ${id}`;\n }\n return line;\n });\n if (!found) next.unshift(`id: ${id}`);\n return next;\n}\n\nexport function forceFrontmatterId(md: string, id: string): string {\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n const nextLines = replaceOrAddIdInLines(fm.split(\"\\n\"), id);\n return `---\\n${nextLines.join(\"\\n\")}\\n---\\n${body}`;\n}\n\nfunction patchTeamIdInLines(\n lines: string[],\n teamId: string\n): { next: string[]; sawTeamBlock: boolean; patched: boolean } {\n const next: string[] = [];\n let inTeam = false;\n let sawTeamBlock = false;\n let patched = false;\n\n for (const line of lines) {\n if (/^team\\s*:\\s*$/i.test(line)) {\n inTeam = true;\n sawTeamBlock = true;\n next.push(line);\n continue;\n }\n if (inTeam && /^\\S/.test(line)) inTeam = false;\n if (inTeam && /^\\s+teamId\\s*:/i.test(line)) {\n next.push(` teamId: ${teamId}`);\n patched = true;\n continue;\n }\n next.push(line);\n }\n return { next, sawTeamBlock, patched };\n}\n\nexport function forceFrontmatterTeamTeamId(md: string, teamId: string): string {\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n const lines = fm.split(\"\\n\");\n const { next, sawTeamBlock, patched } = patchTeamIdInLines(lines, teamId);\n\n if (sawTeamBlock && !patched) {\n const out: string[] = [];\n for (const line of next) {\n out.push(line);\n if (/^team\\s*:\\s*$/i.test(line)) out.push(` teamId: ${teamId}`);\n }\n return `---\\n${out.join(\"\\n\")}\\n---\\n${body}`;\n }\n return `---\\n${next.join(\"\\n\")}\\n---\\n${body}`;\n}\n","import { errorMessage } from \"@/lib/errors\";\nimport { fetchAll, fetchJson } from \"@/lib/fetch-json\";\nimport type { RecipeListItem, TeamAgentEntry, TeamTabSetters } from \"./types\";\nimport { safeParseJson } from \"./team-editor-utils\";\n\nasync function fetchRecipesAndMeta(teamId: string) {\n const [recipesData, metaRes] = await Promise.all([\n fetchJson<{ recipes?: RecipeListItem[] }>(\"/api/recipes\", { cache: \"no-store\" }),\n fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n return { recipesData, metaRes };\n}\n\nconst TEAM_TAB_URLS = (teamId: string) => [\n `/api/teams/files?teamId=${encodeURIComponent(teamId)}`,\n `/api/cron/jobs?teamId=${encodeURIComponent(teamId)}`,\n \"/api/agents\",\n `/api/teams/skills?teamId=${encodeURIComponent(teamId)}`,\n \"/api/skills/available\",\n];\n\nasync function fetchTeamTabResponses(teamId: string) {\n const responses = await fetchAll(TEAM_TAB_URLS(teamId));\n const texts = await Promise.all(responses.map((r) => r.text()));\n return { responses, texts };\n}\n\nexport async function loadTeamTabData(teamId: string, setters: TeamTabSetters): Promise<void> {\n setters.setTeamFilesLoading(true);\n setters.setCronLoading(true);\n setters.setTeamAgentsLoading(true);\n setters.setSkillsLoading(true);\n try {\n const { responses, texts } = await fetchTeamTabResponses(teamId);\n const [filesRes, cronRes, agentsRes, skillsRes, availableSkillsRes] = responses;\n const [filesText, cronText, agentsText, skillsText, availableText] = texts;\n\n const filesJson = safeParseJson<{ ok?: boolean; files?: unknown[] }>(filesText, {});\n if (filesRes.ok && filesJson.ok && Array.isArray(filesJson.files)) {\n setters.setTeamFiles(\n filesJson.files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown; required?: unknown; rationale?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean(entry.required),\n rationale: typeof entry.rationale === \"string\" ? entry.rationale : undefined,\n };\n }),\n );\n }\n\n const cronJson = safeParseJson<{ ok?: boolean; jobs?: unknown[] }>(cronText, {});\n if (cronRes.ok && cronJson.ok && Array.isArray(cronJson.jobs)) setters.setCronJobs(cronJson.jobs);\n\n const agentsJson = safeParseJson<{ agents?: unknown[] }>(agentsText, {});\n if (agentsRes.ok && Array.isArray(agentsJson.agents)) {\n const filtered = agentsJson.agents.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n setters.setTeamAgents(\n filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return { id: String(agent.id ?? \"\"), identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined };\n }),\n );\n }\n\n const skillsJson = safeParseJson<{ ok?: boolean; skills?: unknown[] }>(skillsText, {});\n if (skillsRes.ok && skillsJson.ok && Array.isArray(skillsJson.skills)) setters.setSkillsList(skillsJson.skills as string[]);\n\n const availableJson = safeParseJson<{ ok?: boolean; skills?: unknown[] }>(availableText, {});\n if (availableSkillsRes.ok && availableJson.ok && Array.isArray(availableJson.skills)) {\n const list = availableJson.skills as string[];\n setters.setAvailableSkills(list);\n setters.setSelectedSkill((prev) => {\n const p = String(prev ?? \"\").trim();\n if (p && list.includes(p)) return p;\n return list[0] ?? \"\";\n });\n }\n } finally {\n setters.setTeamFilesLoading(false);\n setters.setCronLoading(false);\n setters.setTeamAgentsLoading(false);\n setters.setSkillsLoading(false);\n }\n}\n\nexport type LoadTeamEditorInitialSetters = TeamTabSetters & {\n setRecipes: (r: RecipeListItem[]) => void;\n setLockedFromId: (v: string | null) => void;\n setLockedFromName: (v: string | null) => void;\n setProvenanceMissing: (v: boolean) => void;\n setFromId: (v: string) => void;\n setTeamMetaRecipeHash: (v: string | null) => void;\n};\n\nexport async function loadTeamEditorInitial(teamId: string, setters: LoadTeamEditorInitialSetters): Promise<void> {\n const initialData = await fetchRecipesAndMeta(teamId);\n setters.setRecipes((initialData.recipesData.recipes ?? []) as RecipeListItem[]);\n\n let locked: { recipeId: string; recipeName?: string } | null = null;\n try {\n const metaJson = await initialData.metaRes.json();\n const meta = metaJson.meta as { recipeId?: unknown; recipeName?: unknown; recipeHash?: unknown } | undefined;\n if (initialData.metaRes.ok && metaJson.ok && meta?.recipeId) {\n locked = {\n recipeId: String(meta.recipeId),\n recipeName: typeof meta.recipeName === \"string\" ? meta.recipeName : undefined,\n };\n setters.setTeamMetaRecipeHash(typeof meta.recipeHash === \"string\" ? meta.recipeHash : null);\n } else {\n setters.setTeamMetaRecipeHash(null);\n }\n } catch {\n setters.setTeamMetaRecipeHash(null);\n }\n\n if (locked) {\n setters.setLockedFromId(locked.recipeId);\n setters.setLockedFromName(locked.recipeName ?? null);\n setters.setProvenanceMissing(false);\n setters.setFromId(locked.recipeId);\n } else {\n setters.setLockedFromId(null);\n setters.setLockedFromName(null);\n setters.setProvenanceMissing(true);\n const list = (initialData.recipesData.recipes ?? []) as RecipeListItem[];\n const preferred = list.find((r) => r.kind === \"team\" && r.id === teamId);\n const fallback = list.find((r) => r.kind === \"team\");\n const pick = preferred ?? fallback;\n if (pick) setters.setFromId(pick.id);\n }\n\n await loadTeamTabData(teamId, {\n setTeamFiles: setters.setTeamFiles,\n setCronJobs: setters.setCronJobs,\n setTeamAgents: setters.setTeamAgents,\n setSkillsList: setters.setSkillsList,\n setAvailableSkills: setters.setAvailableSkills,\n setSelectedSkill: setters.setSelectedSkill,\n setTeamFilesLoading: setters.setTeamFilesLoading,\n setCronLoading: setters.setCronLoading,\n setTeamAgentsLoading: setters.setTeamAgentsLoading,\n setSkillsLoading: setters.setSkillsLoading,\n });\n}\n\nexport async function fetchTeamAgentsOnce(teamId: string): Promise<{ ok: boolean; agents: TeamAgentEntry[] }> {\n try {\n const agentsJson = await fetchJson<{ agents?: unknown[] }>(\"/api/agents\", { cache: \"no-store\" });\n const all = Array.isArray(agentsJson.agents) ? agentsJson.agents : [];\n const filtered = all.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n const mapped = filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return { id: String(agent.id ?? \"\"), identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined };\n });\n return { ok: true, agents: mapped };\n } catch {\n return { ok: false, agents: [] };\n }\n}\n\nasync function applyScaffoldAfterTeamAgentsChange(\n teamId: string,\n toId: string,\n flashMessage: (msg: string, kind: \"success\" | \"error\") => void\n): Promise<void> {\n try {\n await fetchJson(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n applyConfig: true,\n overwrite: false,\n allowExisting: true,\n cronInstallChoice: \"no\",\n }),\n });\n } catch (e: unknown) {\n flashMessage(errorMessage(e), \"error\");\n }\n}\n\nasync function pollTeamAgentsUntil(\n teamId: string,\n expectedAgentId: string,\n setTeamAgents: (a: TeamAgentEntry[]) => void,\n maxMs: number\n): Promise<boolean> {\n const start = Date.now();\n while (Date.now() - start < maxMs) {\n try {\n const r = await fetchTeamAgentsOnce(teamId);\n if (r.ok) {\n setTeamAgents(r.agents);\n const hasExpected = expectedAgentId ? r.agents.some((a) => a.id === expectedAgentId) : false;\n if (!expectedAgentId || hasExpected) return true;\n }\n } catch {\n // ignore\n }\n await new Promise((res) => setTimeout(res, 500));\n }\n return false;\n}\n\nexport async function handleAddAgentToTeam(opts: {\n teamId: string;\n toId: string;\n newRole: string;\n derivedRole: string;\n newRoleName: string;\n content: string;\n setContent: (c: string) => void;\n setTeamAgents: (a: TeamAgentEntry[]) => void;\n flashMessage: (msg: string, kind: \"success\" | \"error\") => void;\n ensureCustomRecipeExists: (args: { overwrite: boolean }) => Promise<unknown>;\n}): Promise<void> {\n const { teamId, toId, newRole, derivedRole, newRoleName, content, setContent, setTeamAgents, flashMessage, ensureCustomRecipeExists } =\n opts;\n try {\n await ensureCustomRecipeExists({ overwrite: false });\n } catch (e: unknown) {\n const msg = errorMessage(e);\n if (!/Recipe id already exists:/i.test(msg)) throw e;\n }\n const json = await fetchJson<{ ok?: boolean; content?: string; addedAgentId?: string }>(\"/api/recipes/team-agents\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(\n newRole === \"__custom__\"\n ? { recipeId: toId.trim(), op: \"add\", role: derivedRole, name: newRoleName }\n : { recipeId: toId.trim(), op: \"addLike\", baseRole: derivedRole, teamId, name: newRoleName },\n ),\n });\n if (!json.ok) throw new Error(\"Failed updating agents list\");\n setContent(String(json.content ?? content));\n\n await applyScaffoldAfterTeamAgentsChange(teamId, toId, flashMessage);\n\n const expectedAgentId = typeof json.addedAgentId === \"string\" ? json.addedAgentId : \"\";\n const appeared = await pollTeamAgentsUntil(teamId, expectedAgentId, setTeamAgents, 5000);\n if (!appeared && expectedAgentId) {\n try {\n void fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // ignore\n }\n await pollTeamAgentsUntil(teamId, expectedAgentId, setTeamAgents, 10000);\n }\n flashMessage(`Updated agents list in ${toId}`, \"success\");\n}\n","\"use client\";\n\nimport type { RecipeListItem } from \"./types\";\n\ntype TeamRecipeTabProps = {\n loading?: boolean;\n fromId: string;\n setFromId: (v: string) => void;\n toId: string;\n setToId: (v: string) => void;\n toName: string;\n setToName: (v: string) => void;\n canEditTargetId: boolean;\n teamRecipes: RecipeListItem[];\n lockedFromId: string | null;\n lockedFromName: string | null;\n provenanceMissing: boolean;\n saving: boolean;\n teamIdValid: boolean;\n targetIdValid: boolean;\n targetIsBuiltin: boolean;\n loadedRecipeHash: string | null;\n teamMetaRecipeHash: string | null;\n publishing: boolean;\n content: string;\n setContent: (v: string) => void;\n setLoadedRecipeHash: (v: string | null) => void;\n recipeLoadError: string;\n onSaveCustom: (overwrite: boolean) => void;\n onPublishOpen: () => void;\n onDeleteOpen: () => void;\n};\n\nexport function TeamRecipeTab(props: TeamRecipeTabProps) {\n const p = props;\n return (\n <>\n <div className=\"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Custom recipe target</div>\n {p.loading ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Loading team…</div>\n ) : null}\n </div>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team id</label>\n <input\n value={p.toId}\n onChange={(e) => p.setToId(e.target.value)}\n disabled={!p.canEditTargetId}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] disabled:opacity-70\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This is the custom recipe id that will be created when you save.\n </div>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team name</label>\n <input\n value={p.toName}\n onChange={(e) => p.setToName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-4 grid grid-cols-1 gap-2\">\n <button\n type=\"button\"\n disabled={p.saving || !p.teamIdValid || !p.targetIdValid || p.targetIsBuiltin}\n onClick={() => p.onSaveCustom(true)}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {p.saving ? \"Saving\" : \"Save\"}\n </button>\n <button\n type=\"button\"\n disabled={\n p.saving ||\n !p.teamIdValid ||\n !p.targetIdValid ||\n p.targetIsBuiltin ||\n !p.loadedRecipeHash ||\n !p.teamMetaRecipeHash ||\n p.loadedRecipeHash === p.teamMetaRecipeHash\n }\n onClick={p.onPublishOpen}\n className=\"rounded-[var(--ck-radius-sm)] bg-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {p.publishing ? \"Publishing\" : \"Publish changes\"}\n </button>\n <button\n type=\"button\"\n disabled={p.saving}\n onClick={p.onDeleteOpen}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] disabled:opacity-50\"\n >\n Delete Team\n </button>\n </div>\n </div>\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Notes</div>\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Parent recipe (locked)</div>\n <select\n disabled\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] disabled:opacity-70\"\n value={p.fromId}\n onChange={(e) => p.setFromId(e.target.value)}\n >\n {p.teamRecipes.map((r) => (\n <option key={`${r.source}:${r.id}`} value={r.id}>\n {r.id} ({r.source})\n </option>\n ))}\n </select>\n {p.lockedFromId && (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n <code>{p.lockedFromId}</code>\n {p.lockedFromName ? ` (${p.lockedFromName})` : \"\"}\n </div>\n )}\n {!p.lockedFromId && p.provenanceMissing && (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Provenance not found for this team.\n </div>\n )}\n </div>\n <ul className=\"mt-4 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>Save writes the custom recipe file identified by Team id.</li>\n <li>Publish changes re-scaffolds this team from your custom recipe.</li>\n <li>Delete Team runs openclaw recipes remove-team.</li>\n </ul>\n </div>\n </div>\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Recipe markdown</div>\n {p.recipeLoadError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {p.recipeLoadError}\n </div>\n ) : null}\n <textarea\n value={p.content}\n onChange={(e) => {\n p.setContent(e.target.value);\n p.setLoadedRecipeHash(null);\n }}\n className=\"mt-2 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport type { TeamAgentEntry } from \"./types\";\n\ntype RecipeAgent = { role: string; name?: string };\n\ntype TeamAgentsTabProps = {\n teamId: string;\n toId: string;\n recipeAgents: RecipeAgent[];\n newRole: string;\n setNewRole: (v: string) => void;\n customRole: string;\n setCustomRole: (v: string) => void;\n newRoleName: string;\n setNewRoleName: (v: string) => void;\n derivedRole: string;\n saving: boolean;\n teamAgents: TeamAgentEntry[];\n teamAgentsLoading: boolean;\n onAddAgent: () => Promise<void>;\n};\n\nexport function TeamAgentsTab(props: TeamAgentsTabProps) {\n const {\n teamId,\n toId,\n recipeAgents,\n newRole,\n setNewRole,\n customRole,\n setCustomRole,\n newRoleName,\n setNewRoleName,\n derivedRole,\n saving,\n teamAgents,\n teamAgentsLoading,\n onAddAgent,\n } = props;\n\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agents in this team</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Add/remove agents by updating the <code>agents:</code> list in your custom team recipe (<code>{toId}</code>).\n </p>\n\n <div className=\"mt-4 grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Role</label>\n <select\n value={newRole}\n onChange={(e) => {\n const v = e.target.value;\n setNewRole(v);\n if (v === \"__custom__\") {\n setCustomRole(\"\");\n setNewRoleName(\"\");\n return;\n }\n setCustomRole(\"\");\n const match = recipeAgents.find((a) => a.role === v);\n setNewRoleName(match?.name || \"\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">Select…</option>\n {recipeAgents.map((a) => (\n <option key={a.role} value={a.role}>\n {a.name || a.role}\n </option>\n ))}\n <option value=\"__custom__\">Other…</option>\n </select>\n\n {newRole === \"__custom__\" ? (\n <input\n value={customRole}\n onChange={(e) => setCustomRole(e.target.value)}\n placeholder=\"role (e.g. researcher)\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n ) : null}\n\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This writes to the recipe's <code>agents:</code> list.\n </div>\n </div>\n\n <div className=\"sm:col-span-2\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name (optional)</label>\n <input\n value={newRoleName}\n onChange={(e) => setNewRoleName(e.target.value)}\n placeholder=\"Onchain Researcher\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <button\n disabled={saving || !derivedRole}\n onClick={onAddAgent}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n Add agent\n </button>\n </div>\n\n <div className=\"mt-6\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Detected installed team agents (read-only)</div>\n <ul className=\"mt-2 space-y-2\">\n {teamAgents.length ? (\n teamAgents.map((a) => (\n <li key={a.id} className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-[color:var(--ck-text-primary)]\">\n {a.identityName || a.id}\n </div>\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">{a.id}</div>\n </div>\n <a\n className=\"text-sm font-medium text-[var(--ck-accent-red)] hover:text-[color:var(--ck-accent-red-hover)]\"\n href={\"/agents/\" + encodeURIComponent(a.id) + \"?returnTo=\" + encodeURIComponent(\"/teams/\" + teamId + \"?tab=agents\")}\n >\n Edit\n </a>\n </li>\n ))\n ) : null}\n {teamAgents.length === 0 && !teamAgentsLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No team agents detected.</li>\n )}\n {teamAgents.length === 0 && teamAgentsLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n )}\n </ul>\n </div>\n </div>\n );\n}\n","\"use client\";\n\ntype TeamSkillsTabProps = {\n teamId: string;\n skillsList: string[];\n availableSkills: string[];\n skillsLoading: boolean;\n selectedSkill: string;\n setSelectedSkill: (v: string) => void;\n installingSkill: boolean;\n teamSkillMsg: string;\n teamSkillError: string;\n onInstallSkill: () => Promise<void>;\n};\n\nexport function TeamSkillsTab(props: TeamSkillsTabProps) {\n const p = props;\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Skills</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Skills installed in this team workspace. For agent-specific skills, open the agent from the Agents tab.\n </p>\n <div className=\"mt-4\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Installed</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {p.skillsList.length ? p.skillsList.map((s) => <li key={s}>{s}</li>) : <li>None installed.</li>}\n </ul>\n </div>\n <div className=\"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Add a skill</div>\n <div className=\"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <select\n value={p.selectedSkill}\n onChange={(e) => p.setSelectedSkill(e.target.value)}\n disabled={p.installingSkill || p.skillsLoading || !p.availableSkills.length}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n {p.availableSkills.length\n ? p.availableSkills.map((s) => <option key={s} value={s}>{s}</option>)\n : <option value=\"\">No skills found</option>}\n </select>\n <button\n type=\"button\"\n disabled={p.installingSkill || p.skillsLoading || !p.selectedSkill}\n onClick={p.onInstallSkill}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {p.installingSkill ? \"Adding\" : \"Add\"}\n </button>\n </div>\n {p.teamSkillError && (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {p.teamSkillError}\n </div>\n )}\n {p.teamSkillMsg && (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n {p.teamSkillMsg}\n </div>\n )}\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Uses openclaw recipes install-skill with team-id {p.teamId}.\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\ntype CronJob = {\n id?: unknown;\n jobId?: unknown;\n name?: unknown;\n enabled?: unknown;\n state?: { enabled?: unknown };\n};\n\ntype TeamCronTabProps = {\n cronJobs: unknown[];\n cronLoading: boolean;\n saving: boolean;\n onCronAction: (id: string, label: string, action: \"enable\" | \"disable\" | \"run\") => Promise<void>;\n};\n\nexport function TeamCronTab(props: TeamCronTabProps) {\n const { cronJobs, cronLoading, saving, onCronAction } = props;\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Cron jobs (filtered by team name)</div>\n <ul className=\"mt-3 space-y-3\">\n {cronJobs.length ? (\n cronJobs.map((j) => {\n const job = j as CronJob;\n const id = String(job.id ?? job.jobId ?? \"\").trim();\n const key = id || String(job.name ?? \"job\");\n const label = String(job.name ?? job.id ?? job.jobId ?? \"(unnamed)\");\n const enabled = job.enabled ?? job.state?.enabled;\n return (\n <li key={key} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{label}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Enabled: {String(enabled ?? \"?\")}</div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <button\n disabled={saving || !id}\n onClick={() => onCronAction(id, label, \"run\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Run\n </button>\n <button\n disabled={saving || !id}\n onClick={() => onCronAction(id, label, \"enable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Enable\n </button>\n <button\n disabled={saving || !id}\n onClick={() => onCronAction(id, label, \"disable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Disable\n </button>\n {!id ? <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">(missing id)</div> : null}\n </div>\n </li>\n );\n })\n ) : null}\n {cronJobs.length === 0 && cronLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading</li>\n )}\n {cronJobs.length === 0 && !cronLoading && (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No cron jobs detected for this team.</li>\n )}\n </ul>\n </div>\n );\n}\n","\"use client\";\n\nimport { FileListWithOptionalToggle } from \"@/components/FileListWithOptionalToggle\";\nimport type { TeamFileEntry } from \"./types\";\n\ntype TeamFilesTabProps = {\n teamFiles: TeamFileEntry[];\n teamFilesLoading: boolean;\n showOptionalFiles: boolean;\n setShowOptionalFiles: (v: boolean) => void;\n fileName: string;\n fileContent: string;\n setFileContent: (v: string) => void;\n teamFileError: string;\n saving: boolean;\n onLoadTeamFile: (name: string) => void;\n onSaveTeamFile: () => void;\n};\n\nexport function TeamFilesTab(props: TeamFilesTabProps) {\n const {\n teamFiles,\n teamFilesLoading,\n showOptionalFiles,\n setShowOptionalFiles,\n fileName,\n fileContent,\n setFileContent,\n teamFileError,\n saving,\n onLoadTeamFile,\n onSaveTeamFile,\n } = props;\n\n return (\n <div className=\"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <FileListWithOptionalToggle\n title=\"Team files\"\n files={teamFiles}\n loading={teamFilesLoading}\n showOptionalFiles={showOptionalFiles}\n onShowOptionalChange={setShowOptionalFiles}\n selectedFileName={fileName}\n onSelectFile={onLoadTeamFile}\n />\n\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Edit: {fileName}</div>\n <button\n disabled={saving}\n onClick={onSaveTeamFile}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save file\"}\n </button>\n </div>\n\n {teamFileError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {teamFileError}\n </div>\n ) : null}\n\n <textarea\n value={fileContent}\n onChange={(e) => setFileContent(e.target.value)}\n className=\"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype MemoryItem = {\n ts: string;\n author: string;\n type: string;\n content: string;\n source?: unknown;\n _file?: string;\n _line?: number;\n};\n\ntype PinnedItem = MemoryItem & {\n pinnedAt: string;\n pinnedBy: string;\n _key: string;\n};\n\nfunction memoryKey(it: { _file?: string; _line?: number }): string {\n return `${it._file ?? \"\"}:${it._line ?? 0}`;\n}\n\nexport function TeamMemoryTab({ teamId }: { teamId: string }) {\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const [files, setFiles] = useState<string[]>([]);\n const [pinnedItems, setPinnedItems] = useState<PinnedItem[]>([]);\n const [items, setItems] = useState<MemoryItem[]>([]);\n\n const [newType, setNewType] = useState(\"learning\");\n const [newContent, setNewContent] = useState(\"\");\n const [newSource, setNewSource] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [pinningKey, setPinningKey] = useState<string | null>(null);\n\n async function refresh() {\n setLoading(true);\n setError(\"\");\n try {\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const json = (await res.json()) as {\n ok?: boolean;\n error?: string;\n files?: string[];\n pinnedItems?: PinnedItem[];\n items?: MemoryItem[];\n };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load memory\");\n setFiles(Array.isArray(json.files) ? json.files : []);\n setPinnedItems(Array.isArray(json.pinnedItems) ? json.pinnedItems : []);\n setItems(Array.isArray(json.items) ? json.items : []);\n } catch (e: unknown) {\n setError(errorMessage(e));\n setFiles([]);\n setPinnedItems([]);\n setItems([]);\n } finally {\n setLoading(false);\n }\n }\n\n useEffect(() => {\n void refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refresh is defined inline; teamId is the only intended trigger.\n }, [teamId]);\n\n const examples = useMemo(\n () => [\n { label: \"decision\", value: \"decision\" },\n { label: \"learning\", value: \"learning\" },\n { label: \"bug\", value: \"bug\" },\n { label: \"customer\", value: \"customer\" },\n { label: \"release\", value: \"release\" },\n ],\n []\n );\n\n const pinnedKeySet = useMemo(() => new Set(pinnedItems.map((x) => x._key)), [pinnedItems]);\n\n async function pin(it: MemoryItem) {\n const key = memoryKey(it);\n if (!it._file || !it._line) return;\n\n setPinningKey(key);\n setError(\"\");\n try {\n const payload = {\n op: \"pin\",\n ts: new Date().toISOString(),\n actor: `${teamId}-lead`,\n key: { file: \"team.jsonl\", line: it._line },\n item: { ts: it.ts, author: it.author, type: it.type, content: it.content, source: it.source },\n };\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to pin\");\n await refresh();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setPinningKey(null);\n }\n }\n\n async function unpin(it: { _file?: string; _line?: number }) {\n const key = memoryKey(it);\n if (!it._file || !it._line) return;\n\n setPinningKey(key);\n setError(\"\");\n try {\n const payload = {\n op: \"unpin\",\n ts: new Date().toISOString(),\n actor: `${teamId}-lead`,\n key: { file: \"team.jsonl\", line: it._line },\n };\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to unpin\");\n await refresh();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setPinningKey(null);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"ck-glass p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team memory (file-first)</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Stored in <span className=\"font-mono\">shared-context/memory/*.jsonl</span>. Items must be attributable.\n </div>\n </div>\n <button\n type=\"button\"\n onClick={refresh}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Refresh\n </button>\n </div>\n\n {error ? (\n <div className=\"mt-3 rounded border border-red-400/30 bg-red-500/10 p-2 text-sm text-red-100\">{error}</div>\n ) : null}\n\n <div className=\"mt-3 text-xs text-[color:var(--ck-text-secondary)]\">Files: {files.length ? files.join(\", \") : \"(none)\"}</div>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Add memory item</div>\n <div className=\"mt-3 grid grid-cols-1 gap-3 md:grid-cols-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={newType}\n onChange={(e) => setNewType(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n {examples.map((x) => (\n <option key={x.value} value={x.value}>\n {x.label}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">source (ticket/pr/path)</div>\n <input\n value={newSource}\n onChange={(e) => setNewSource(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. ticket 0088, PR https://..., shared-context/DECISIONS.md\"\n />\n </label>\n\n <label className=\"block md:col-span-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">content</div>\n <textarea\n value={newContent}\n onChange={(e) => setNewContent(e.target.value)}\n className=\"mt-1 h-[110px] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Write a small, specific memory item…\"\n />\n </label>\n\n <div className=\"md:col-span-2\">\n <button\n type=\"button\"\n disabled={saving || !newContent.trim()}\n onClick={async () => {\n setSaving(true);\n setError(\"\");\n try {\n const payload = {\n op: \"append\",\n ts: new Date().toISOString(),\n author: `${teamId}-lead`,\n type: newType,\n content: newContent.trim(),\n source: newSource.trim() ? { text: newSource.trim() } : undefined,\n file: \"team.jsonl\",\n };\n const res = await fetch(`/api/teams/memory?teamId=${encodeURIComponent(teamId)}`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(payload),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to append memory\");\n setNewContent(\"\");\n setNewSource(\"\");\n await refresh();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Append to team.jsonl\"}\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Pinned memory</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{pinnedItems.length} pinned</div>\n </div>\n\n {loading ? <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div> : null}\n\n <div className=\"mt-3 space-y-3\">\n {pinnedItems.length ? (\n pinnedItems.map((it) => (\n <div key={it._key} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n <span className=\"font-mono\">{it.ts}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"rounded bg-white/5 px-2 py-0.5 font-mono\">{it.type}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"font-mono\">{it.author}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"font-mono\">pinned {it.pinnedAt}</span>\n </div>\n <button\n type=\"button\"\n onClick={() => void unpin(it)}\n disabled={pinningKey === it._key}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n {pinningKey === it._key ? \"Unpinning…\" : \"Unpin\"}\n </button>\n </div>\n\n <div className=\"mt-2 whitespace-pre-wrap text-sm text-[color:var(--ck-text-primary)]\">{it.content}</div>\n\n {it.source ? (\n <pre className=\"mt-2 overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(it.source, null, 2)}\n </pre>\n ) : null}\n </div>\n ))\n ) : (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No pinned items yet.</div>\n )}\n </div>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Recent memory</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Showing {items.length} (max 200)</div>\n </div>\n\n {loading ? <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div> : null}\n\n <div className=\"mt-3 space-y-3\">\n {items.length ? (\n items.map((it) => {\n const k = memoryKey(it);\n const isPinned = pinnedKeySet.has(k);\n return (\n <div key={`${it._file ?? \"?\"}:${it._line ?? 0}`} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n <span className=\"font-mono\">{it.ts}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"rounded bg-white/5 px-2 py-0.5 font-mono\">{it.type}</span>\n <span className=\"mx-2\">•</span>\n <span className=\"font-mono\">{it.author}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n {it._file ? (\n <span className=\"text-[10px] text-[color:var(--ck-text-tertiary)] font-mono\">\n {it._file}:{it._line}\n </span>\n ) : null}\n <button\n type=\"button\"\n onClick={() => void pin(it)}\n disabled={isPinned || pinningKey === k || !it._file || !it._line}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n {isPinned ? \"Pinned\" : pinningKey === k ? \"Pinning…\" : \"Pin\"}\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 whitespace-pre-wrap text-sm text-[color:var(--ck-text-primary)]\">{it.content}</div>\n\n {it.source ? (\n <pre className=\"mt-2 overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(it.source, null, 2)}\n </pre>\n ) : null}\n </div>\n );\n })\n ) : (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No memory items yet.</div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { fetchJson } from \"@/lib/fetch-json\";\n\nfunction slugifyId(input: string) {\n return String(input ?? \"\")\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/--+/g, \"-\");\n}\n\nexport function OrchestratorSetupModal({\n open,\n onClose,\n teamId,\n onInstalled,\n}: {\n open: boolean;\n onClose: () => void;\n teamId: string;\n onInstalled: () => void;\n}) {\n const defaultAgentId = useMemo(() => `${teamId}-swarm-orchestrator`, [teamId]);\n const [agentId, setAgentId] = useState(defaultAgentId);\n const [repoDir, setRepoDir] = useState(\"\");\n const [worktreeRoot, setWorktreeRoot] = useState(\"/home/control/swarm-worktrees\");\n const [baseRef, setBaseRef] = useState(\"origin/main\");\n const [applyConfig, setApplyConfig] = useState(true);\n const [makeExecutable, setMakeExecutable] = useState(true);\n\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<{ orchestratorAgentId: string; workspace: string } | null>(null);\n\n const normalized = useMemo(() => {\n const effectiveAgentId = slugifyId(agentId);\n return { effectiveAgentId };\n }, [agentId]);\n\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[210]\">\n <div\n className=\"fixed inset-0 bg-black/60\"\n onClick={() => {\n if (!submitting) onClose();\n }}\n />\n <div className=\"fixed inset-0 overflow-y-auto\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">Add Orchestrator</div>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n This will scaffold a new <span className=\"font-mono text-xs\">swarm-orchestrator</span> agent workspace for this team and\n prefill its config.\n </p>\n\n <label className=\"mt-4 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Orchestrator agent id</label>\n <input\n value={agentId}\n onChange={(e) => setAgentId(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Default: <span className=\"font-mono\">{defaultAgentId}</span> (normalized: <span className=\"font-mono\">{normalized.effectiveAgentId}</span>)\n </div>\n\n <label className=\"mt-4 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Repo directory (SWARM_REPO_DIR)</label>\n <input\n value={repoDir}\n onChange={(e) => setRepoDir(e.target.value)}\n placeholder=\"/home/control/clawkitchen\"\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n\n <div className=\"mt-4 grid grid-cols-1 gap-3 md:grid-cols-2\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Worktree root (SWARM_WORKTREE_ROOT)</label>\n <input\n value={worktreeRoot}\n onChange={(e) => setWorktreeRoot(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Recommend a dedicated folder outside the repo.</div>\n </div>\n\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Base ref (SWARM_BASE_REF)</label>\n <input\n value={baseRef}\n onChange={(e) => setBaseRef(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n\n <label className=\"mt-5 flex items-start gap-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={applyConfig} onChange={(e) => setApplyConfig(e.target.checked)} className=\"mt-1\" />\n <span>\n Add this agent to OpenClaw config (recommended).<br />\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n This will modify <span className=\"font-mono\">~/.openclaw/openclaw.json</span> to add <span className=\"font-mono\">{normalized.effectiveAgentId}</span>.\n </span>\n </span>\n </label>\n\n <label className=\"mt-3 flex items-start gap-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={makeExecutable} onChange={(e) => setMakeExecutable(e.target.checked)} className=\"mt-1\" />\n <span>\n Make scripts executable (developer convenience).<br />\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Runs <span className=\"font-mono\">chmod +x .clawdbot/*.sh</span> in the orchestrator workspace.\n </span>\n </span>\n </label>\n\n {error ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">{error}</div>\n ) : null}\n\n {result ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100\">\n Installed <span className=\"font-mono\">{result.orchestratorAgentId}</span> → <span className=\"font-mono\">{result.workspace}</span>\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={submitting}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={submitting || !normalized.effectiveAgentId || !repoDir.trim()}\n onClick={async () => {\n setSubmitting(true);\n setError(null);\n setResult(null);\n try {\n const json = await fetchJson<\n | { ok: true; orchestratorAgentId: string; workspace: string }\n | { ok: false; error: string }\n >(\"/api/teams/orchestrator/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n teamId,\n orchestratorAgentId: normalized.effectiveAgentId,\n repoDir: repoDir.trim(),\n worktreeRoot: worktreeRoot.trim(),\n baseRef: baseRef.trim(),\n applyConfig,\n makeExecutable,\n }),\n });\n if (!json.ok) throw new Error(json.error);\n setResult({ orchestratorAgentId: json.orchestratorAgentId, workspace: json.workspace });\n onInstalled();\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setSubmitting(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {submitting ? \"Installing…\" : \"Install\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n , document.body);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { OrchestratorSetupModal } from \"./OrchestratorSetupModal\";\n\ntype OrchestratorState =\n | {\n ok: true;\n teamId: string;\n present: false;\n reason?: string;\n }\n | {\n ok: true;\n teamId: string;\n present: true;\n agent: { id: string; identityName?: string; workspace: string };\n tmuxSessions: Array<{ name: string; attached: boolean; windows?: number; created?: string }>;\n worktrees: Array<{ path: string; branch?: string; sha?: string }>;\n activeTasksSummary: null | { path: string; taskCount?: number; rawType?: string };\n settingsPaths: string[];\n }\n | {\n ok: false;\n error: string;\n };\n\nexport function OrchestratorPanel({ teamId }: { teamId: string }) {\n const [loading, setLoading] = useState(true);\n const [state, setState] = useState<OrchestratorState | null>(null);\n const [lastLoadedAt, setLastLoadedAt] = useState<string | null>(null);\n const [setupOpen, setSetupOpen] = useState(false);\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const json = await fetchJson<OrchestratorState>(\n `/api/teams/orchestrator?teamId=${encodeURIComponent(teamId)}`,\n { cache: \"no-store\" }\n );\n setState(json);\n setLastLoadedAt(new Date().toISOString());\n } catch (e: unknown) {\n setState({ ok: false, error: e instanceof Error ? e.message : String(e) });\n setLastLoadedAt(new Date().toISOString());\n } finally {\n setLoading(false);\n }\n }, [teamId]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n if (loading) {\n return <div className=\"mt-6 ck-glass-strong p-4\">Loading orchestrator state…</div>;\n }\n\n if (!state) {\n return <div className=\"mt-6 ck-glass-strong p-4\">No orchestrator state available.</div>;\n }\n\n if (!state.ok) {\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {state.error}\n </div>\n </div>\n );\n }\n\n if (!state.present) {\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No swarm/orchestrator detected for this team.</p>\n </div>\n <button\n type=\"button\"\n onClick={() => setSetupOpen(true)}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)]\"\n >\n Add Orchestrator\n </button>\n </div>\n\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-tertiary)]\">Detection</div>\n <div className=\"mt-1 font-mono text-xs\">{state.reason || \"(no reason provided)\"}</div>\n </div>\n\n <p className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">\n Default convention is <code><teamId>-swarm-orchestrator</code>. Once installed, this tab will show: tmux sessions,\n git worktrees/branches, and active task state.\n </p>\n\n <OrchestratorSetupModal\n open={setupOpen}\n onClose={() => setSetupOpen(false)}\n teamId={teamId}\n onInstalled={() => {\n setSetupOpen(false);\n void load();\n }}\n />\n </div>\n );\n }\n\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n Agent: <span className=\"font-mono\">{state.agent.id}</span>\n {state.agent.identityName ? ` (${state.agent.identityName})` : \"\"}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n Workspace: <span className=\"font-mono\">{state.agent.workspace}</span>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {lastLoadedAt ? (\n <span>\n Last updated: <span className=\"font-mono\">{lastLoadedAt}</span>\n </span>\n ) : null}\n </div>\n <button\n type=\"button\"\n onClick={() => void load()}\n disabled={loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50\"\n >\n {loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n </div>\n\n <div className=\"mt-5 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <section className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">tmux sessions</div>\n {state.tmuxSessions.length ? (\n <ul className=\"mt-2 space-y-2\">\n {state.tmuxSessions.map((s) => (\n <li key={s.name} className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{s.name}</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n attached={String(s.attached)}\n {typeof s.windows === \"number\" ? ` windows=${s.windows}` : \"\"}\n </span>\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No sessions detected (or tmux not running).</div>\n )}\n </section>\n\n <section className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">git worktrees</div>\n {state.worktrees.length ? (\n <ul className=\"mt-2 space-y-2\">\n {state.worktrees.map((w) => (\n <li key={w.path} className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"font-mono text-xs\">{w.path}</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {w.branch ? w.branch : \"(no branch)\"}\n {w.sha ? ` @ ${w.sha.slice(0, 7)}` : \"\"}\n </div>\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No worktrees detected.</div>\n )}\n </section>\n </div>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Active tasks</div>\n {state.activeTasksSummary ? (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"font-mono text-xs\">{state.activeTasksSummary.path}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n {typeof state.activeTasksSummary.taskCount === \"number\" ? `tasks=${state.activeTasksSummary.taskCount}` : \"tasks=?\"}\n {state.activeTasksSummary.rawType ? ` type=${state.activeTasksSummary.rawType}` : \"\"}\n </div>\n </div>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No active-tasks.json found.</div>\n )}\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">CLI quick actions</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n The orchestrator is designed to be driven from the CLI (and usually tmux). Common commands:\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>\n <span className=\"font-mono text-xs\">tmux ls</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(list sessions)</span>\n </li>\n <li>\n <span className=\"font-mono text-xs\">tmux attach -t <session></span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(jump into a running swarm)</span>\n </li>\n <li>\n <span className=\"font-mono text-xs\">git -C {state.agent.workspace} worktree list</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(inspect worktrees)</span>\n </li>\n </ul>\n <p className=\"mt-3 text-xs text-[color:var(--ck-text-tertiary)]\">\n Note: ClawKitchen is read-only here; it surfaces status and pointers, but does not run or attach to tmux.\n </p>\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Human approval gate (recommended)</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n For workflows that publish, deploy, or send outbound messages, keep a <strong>human approval step</strong>.\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>Generate a proposed change/post as a draft.</li>\n <li>Send the draft to a bound messaging channel (e.g. Telegram) for approval.</li>\n <li>Only execute the final action after explicit approve/deny.</li>\n </ul>\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Where to change settings</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n These are the common knobs for a swarm/orchestrator scaffold (read-only references):\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {state.settingsPaths.map((p) => (\n <li key={p} className=\"font-mono text-xs\">\n {p}\n </li>\n ))}\n </ul>\n </section>\n </div>\n );\n}\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCHA,EAAA,EAAA,CAAA,CAAA,OAEO,SAAS,EAAoB,MAClC,CAAI,QACJ,CAAM,UACN,CAAQ,SACR,CAAO,WACP,CAAS,MACT,CAAI,CAQL,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,iBAAiB,CAAA,CAChB,KAAM,EACN,QAAS,EACT,MAAM,kBACN,aAAa,kBACb,iBAAiB,cACjB,KAAM,EACN,UAAW,EACX,uBAAuB,uKAEvB,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,8BACrC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,IAAc,gBAAa,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,IAAgB,OAElI,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qHACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBAAc,uBAC7B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBAAO,6FACsE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,cAAgB,IAAE,IACxI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,YAAc,uGAKpD,CDnCA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OETO,SAAS,EAAiB,CAAY,CAAE,CAAM,EACnD,GAAI,CACF,OAAO,KAAK,KAAK,CAAC,EACpB,CAAE,KAAM,CACN,OAAO,CACT,CACF,CCDA,eAAe,EAAoB,CAAc,EAC/C,GAAM,CAAC,EAAa,EAAQ,CAAG,MAAM,QAAQ,GAAG,CAAC,CAC/C,CAAA,EAAA,EAAA,SAAA,AAAS,EAAiC,eAAgB,CAAE,MAAO,UAAW,GAC9E,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,GAAA,CAAS,CAAE,CAAE,MAAO,UAAW,GACnF,EACD,MAAO,aAAE,UAAa,CAAQ,CAChC,CAUA,eAAe,EAAsB,CAAc,EACjD,IAAM,EAAY,MAAM,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,AATO,CACxC,CAAC,wBAAwB,EAAE,mBAAmB,GAAA,CAAS,CACvD,CAAC,sBAAsB,EAAE,mBAAmB,GAAA,CAAS,CACrD,cACA,CAAC,yBAAyB,EAAE,mBAKmB,AALA,GAAA,CAAS,CACxD,wBACD,EAIO,EAAQ,MAAM,QAAQ,GAAG,CAAC,EAAU,GAAG,CAAC,AAAC,GAAM,EAAE,IAAI,KAC3D,MAAO,WAAE,QAAW,CAAM,CAC5B,CAEO,eAAe,EAAgB,CAAc,CAAE,CAAuB,EAC3E,EAAQ,mBAAmB,EAAC,GAC5B,EAAQ,cAAc,EAAC,GACvB,EAAQ,oBAAoB,EAAC,GAC7B,EAAQ,gBAAgB,EAAC,GACzB,GAAI,CACF,GAAM,WAAE,CAAS,OAAE,CAAK,CAAE,CAAG,MAAM,EAAsB,GACnD,CAAC,EAAU,EAAS,EAAW,EAAW,EAAmB,CAAG,EAChE,CAAC,EAAW,EAAU,EAAY,EAAY,EAAc,CAAG,EAE/D,EAAY,EAAmD,EAAW,CAAC,GAC7E,EAAS,EAAE,EAAI,EAAU,EAAE,EAAI,MAAM,OAAO,CAAC,EAAU,KAAK,GAAG,AACjE,EAAQ,YAAY,CAClB,EAAU,KAAK,CAAC,GAAG,CAAC,AAAC,IAEZ,CACL,KAAM,OAAO,EAAM,IAAI,EAAI,IAC3B,SAAS,CAAQ,EAAM,OAAO,CAC9B,UAAU,CAAQ,EAAM,QAAQ,CAChC,UAAW,AAA2B,iBAApB,EAAM,SAAS,CAAgB,AALrC,EAK2C,SAAS,MAAG,EACrE,IAKN,IAAM,EAAW,EAAkD,EAAU,CAAC,GAC1E,EAAQ,EAAE,EAAI,EAAS,EAAE,EAAI,MAAM,OAAO,CAAC,EAAS,IAAI,GAAG,EAAQ,WAAW,CAAC,EAAS,IAAI,EAEhG,IAAM,EAAa,EAAsC,EAAY,CAAC,GACtE,GAAI,EAAU,EAAE,EAAI,MAAM,OAAO,CAAC,EAAW,MAAM,EAAG,CACpD,IAAM,EAAW,EAAW,MAAM,CAAC,MAAM,CAAC,AAAC,GAAM,OAAQ,EAAuB,EAAE,EAAI,IAAI,UAAU,CAAC,CAAA,EAAG,EAAO,CAAC,CAAC,GACjH,EAAQ,aAAa,CACnB,EAAS,GAAG,CAAC,AAAC,GAEL,EAAE,GAAI,OAAO,EAAM,EAAE,EAAI,IAAK,aAA4C,UAA9B,OADrC,AAC4C,EAAM,YAAY,CAAgB,EAAM,YAAY,MAAG,EAAU,GAGjI,CAEA,IAAM,EAAa,EAAoD,EAAY,CAAC,GAChF,EAAU,EAAE,EAAI,EAAW,EAAE,EAAI,MAAM,OAAO,CAAC,EAAW,MAAM,GAAG,EAAQ,aAAa,CAAC,EAAW,MAAM,EAE9G,IAAM,EAAgB,EAAoD,EAAe,CAAC,GAC1F,GAAI,EAAmB,EAAE,EAAI,EAAc,EAAE,EAAI,MAAM,OAAO,CAAC,EAAc,MAAM,EAAG,CACpF,IAAM,EAAO,EAAc,MAAM,CACjC,EAAQ,kBAAkB,CAAC,GAC3B,EAAQ,gBAAgB,CAAE,AAAD,IACvB,IAAM,EAAI,OAAO,GAAQ,IAAI,IAAI,UACjC,AAAI,GAAK,EAAK,QAAQ,CAAC,GAAW,CAAP,CACpB,CAAI,CAAC,EAAE,EAAI,EACpB,EACF,CACF,QAAU,CACR,EAAQ,mBAAmB,CAAC,IAC5B,EAAQ,cAAc,EAAC,GACvB,EAAQ,oBAAoB,EAAC,GAC7B,EAAQ,gBAAgB,EAAC,EAC3B,CACF,CAWO,eAAe,EAAsB,CAAc,CAAE,CAAqC,EAC/F,IAAM,EAAc,MAAM,EAAoB,GAC9C,EAAQ,UAAU,CAAE,EAAY,WAAW,CAAC,OAAO,EAAI,EAAE,EAEzD,IAAI,EAA2D,KAC/D,GAAI,CACF,IAAM,EAAW,MAAM,EAAY,OAAO,CAAC,IAAI,GACzC,EAAO,EAAS,IAAI,CACtB,EAAY,OAAO,CAAC,EAAE,EAAI,EAAS,EAAE,EAAI,GAAM,UAAU,AAC3D,EAAS,CACP,SAAU,OAAO,EAAK,QAAQ,EAC9B,WAAuC,UAA3B,OAAO,EAAK,UAAU,CAAgB,EAAK,UAAU,MAAG,CACtE,EACA,EAAQ,qBAAqB,CAA4B,UAA3B,OAAO,EAAK,UAAU,CAAgB,EAAK,UAAU,CAAG,OAEtF,EAAQ,qBAAqB,CAAC,KAElC,CAAE,KAAM,CACN,EAAQ,qBAAqB,CAAC,KAChC,CAEA,GAAI,EACF,EAAQ,IADE,WACa,CAAC,EAAO,QAAQ,EACvC,EAAQ,iBAAiB,CAAC,EAAO,UAAU,EAAI,MAC/C,EAAQ,oBAAoB,EAAC,GAC7B,EAAQ,SAAS,CAAC,EAAO,QAAQ,MAC5B,CACL,EAAQ,eAAe,CAAC,MACxB,EAAQ,iBAAiB,CAAC,MAC1B,EAAQ,oBAAoB,EAAC,GAC7B,IAAM,EAAQ,EAAY,WAAW,CAAC,OAAO,EAAI,EAAE,CAC7C,EAAY,EAAK,IAAI,CAAC,AAAC,GAAM,AAAW,WAAT,IAAI,EAAe,EAAE,EAAE,GAAK,GAC3D,EAAW,EAAK,IAAI,CAAE,AAAD,GAAkB,SAAX,EAAE,IAAI,EAClC,EAAO,GAAa,EACtB,GAAM,EAAQ,SAAS,CAAC,EAAK,EAAE,CACrC,CAEA,MAAM,EAAgB,EAAQ,CAC5B,aAAc,EAAQ,YAAY,CAClC,YAAa,EAAQ,WAAW,CAChC,cAAe,EAAQ,aAAa,CACpC,cAAe,EAAQ,aAAa,CACpC,mBAAoB,EAAQ,kBAAkB,CAC9C,iBAAkB,EAAQ,gBAAgB,CAC1C,oBAAqB,EAAQ,mBAAmB,CAChD,eAAgB,EAAQ,cAAc,CACtC,qBAAsB,EAAQ,oBAAoB,CAClD,iBAAkB,EAAQ,gBAAgB,AAC5C,EACF,CAEO,eAAe,EAAoB,CAAc,EACtD,GAAI,CACF,IAAM,EAAa,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAyB,cAAe,CAAE,MAAO,UAAW,GAGxF,EADW,AACF,CAFH,MAAM,OAAO,CAAC,EAAW,MAAM,EAAI,EAAW,MAAM,CAAG,EAAA,AAAE,EAChD,MAAM,CAAC,AAAC,GAAM,OAAQ,EAAuB,EAAE,EAAI,IAAI,UAAU,CAAC,CAAA,EAAG,EAAO,CAAC,CAAC,GAC3E,GAAG,CAAC,AAAC,IAEpB,CAAE,GAAI,OAAO,EAAM,EAAE,EAAI,IAAK,aAA4C,UAA9B,OAAO,EAAM,YAAY,CAAgB,AAD9E,EACoF,YAAY,MAAG,EAAU,GAE7H,MAAO,CAAE,IAAI,EAAM,OAAQ,CAAO,CACpC,CAAE,KAAM,CACN,MAAO,CAAE,IAAI,EAAO,OAAQ,EAAE,AAAC,CACjC,CACF,CAEA,eAAe,EACb,CAAc,CACd,CAAY,CACZ,CAA8D,EAE9D,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,gBAAiB,CAC/B,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CACnB,KAAM,OACN,SAAU,EAAK,IAAI,UACnB,EACA,aAAa,EACb,WAAW,EACX,eAAe,EACf,kBAAmB,IACrB,EACF,EACF,CAAE,MAAO,EAAY,CACnB,EAAa,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAAI,QAChC,CACF,CAEA,eAAe,EACb,CAAc,CACd,CAAuB,CACvB,CAA4C,CAC5C,CAAa,EAEb,IAAM,EAAQ,KAAK,GAAG,GACtB,KAAO,KAAK,GAAG,GAAK,EAAQ,GAAO,CACjC,GAAI,CACF,IAAM,EAAI,MAAM,EAAoB,GACpC,GAAI,EAAE,EAAE,CAAE,CACR,EAAc,EAAE,MAAM,EACtB,IAAM,IAAc,GAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GACpE,GAAI,CAAC,GAAmB,EAAa,OADkD,AAC3C,CAC9C,CACF,CAAE,KAAM,CAER,CACA,MAAM,IAAI,QAAQ,AAAC,GAAQ,WAAW,EAAK,KAC7C,CACA,OAAO,CACT,CAEO,eAAe,EAAqB,CAW1C,EACC,GAAM,QAAE,CAAM,CAAE,MAAI,SAAE,CAAO,CAAE,aAAW,aAAE,CAAW,SAAE,CAAO,YAAE,CAAU,eAAE,CAAa,cAAE,CAAY,CAAE,0BAAwB,CAAE,CACnI,EACF,GAAI,CACF,MAAM,EAAyB,CAAE,WAAW,CAAM,EACpD,CAAE,MAAO,EAAY,CACnB,IAAM,EAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACzB,GAAI,CAAC,6BAA6B,IAAI,CAAC,GAAM,MAAM,CACrD,CACA,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAA4D,2BAA4B,CAClH,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CACN,eAAZ,EACI,CAAE,SAAU,EAAK,IAAI,GAAI,GAAI,MAAO,KAAM,EAAa,KAAM,CAAY,EACzE,CAAE,SAAU,EAAK,IAAI,GAAI,GAAI,UAAW,SAAU,SAAa,EAAQ,KAAM,CAAY,EAEjG,GACA,GAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,+BAC9B,EAAW,OAAO,EAAK,OAAO,EAAI,IAElC,MAAM,EAAmC,EAAQ,EAAM,GAEvD,IAAM,EAAkB,AAA6B,iBAAtB,EAAK,YAAY,CAAgB,EAAK,YAAY,CAAG,GAEpF,GAAI,CAAC,AADY,MAAM,EAAoB,EAAQ,EAAiB,EAAe,MAClE,EAAiB,CAChC,GAAI,CACG,MAAM,uBAAwB,CAAE,OAAQ,MAAO,EACtD,CAAE,KAAM,CAER,CACA,MAAM,EAAoB,EAAQ,EAAiB,EAAe,IACpE,CACA,EAAa,CAAC,uBAAuB,EAAE,EAAA,CAAM,CAAE,UACjD,CC7NO,SAAS,EAAc,CAAyB,EAErD,MACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,yBACxE,EAAE,OAAO,CACR,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDAA+C,kBAC5D,QAEN,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,gFAAuE,YACxF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EAAE,IAAI,CACb,SAAU,AAAC,GAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,EACzC,SAAU,CAAC,EAAE,eAAe,CAC5B,UAAU,2JAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6DAAoD,qEAGnE,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,gFAAuE,cACxF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EAAE,MAAM,CACf,SAAU,AAAC,GAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,EAC3C,UAAU,uIAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wCACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EAAE,MAAM,EAAI,CAAC,EAAE,WAAW,EAAI,CAAC,EAAE,aAAa,EAAI,EAAE,eAAe,CAC7E,QAAS,IAAM,EAAE,YAAY,EAAC,GAC9B,UAAU,4JAET,EAAE,MAAM,CAAG,SAAW,SAEzB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SACE,EAAE,MAAM,EACR,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,aAAa,EAChB,EAAE,eAAe,EACjB,CAAC,EAAE,gBAAgB,EACnB,CAAC,EAAE,kBAAkB,EACrB,EAAE,gBAAgB,GAAK,EAAE,kBAAkB,CAE7C,QAAS,EAAE,aAAa,CACxB,UAAU,iJAET,AAlDH,EAkDK,UAAU,CAAG,aAAe,oBAEjC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EAAE,MAAM,CAClB,QAAS,EAAE,YAAY,CACvB,UAAU,iKACX,sBAKL,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,UACzE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sFACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,2BAC3E,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,QAAQ,CAAA,CAAA,EACR,UAAU,yJACV,MAAO,EAAE,MAAM,CACf,SAAU,AAAC,GAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,WAE1C,EAAE,WAAW,CAAC,GAAG,CAAE,AAAD,GACjB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAmC,MAAO,EAAE,EAAE,WAC5C,EAAE,EAAE,CAAC,KAAG,EAAE,MAAM,CAAC,MADP,CAAA,EAAG,EAAE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAA,CAAE,KAKrC,EAAE,YAAY,EACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAM,EAAE,YAAY,GACpB,EAAE,cAAc,CAAG,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,CAAG,MAGlD,CAAC,EAAE,YAAY,EAAI,EAAE,iBAAiB,EACrC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6DAAoD,2CAKvE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,wFACZ,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,8DACJ,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,oEACJ,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,4DAIV,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,oBACxE,EAAE,eAAe,CAChB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8GACZ,EAAE,eAAe,GAElB,KACJ,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EAAE,OAAO,CAChB,SAAU,AAAC,IACT,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,KAAK,EAC3B,EAAE,mBAAmB,CAAC,KACxB,EACA,UAAU,8JACV,YAAY,SAKtB,CC/HO,SAAS,EAAc,CAAyB,EACrD,GAAM,QACJ,CAAM,MACN,CAAI,cACJ,CAAY,CACZ,SAAO,YACP,CAAU,YACV,CAAU,eACV,CAAa,aACb,CAAW,gBACX,CAAc,aACd,CAAW,QACX,CAAM,CACN,YAAU,mBACV,CAAiB,YACjB,CAAU,CACX,CAAG,EAEJ,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,wBACzE,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,qCAC9B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,YAAc,qCAAkC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAM,IAAY,QAG7G,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,2EAAkE,SACnF,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAU,AAAC,IACT,IAAM,EAAI,EAAE,MAAM,CAAC,KAAK,CAExB,GADA,EAAW,GACD,eAAN,EAAoB,CACtB,EAAc,IACd,EAAe,IACf,MACF,CACA,EAAc,IACd,IAAM,EAAQ,EAAa,IAAI,CAAC,AAAC,GAAM,EAAE,IAAI,GAAK,GAClD,EAAe,GAAO,MAAQ,GAChC,EACA,UAAU,+IAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,YAChB,EAAa,GAAG,CAAE,AAAD,GAChB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAoB,MAAO,EAAE,IAAI,UAC/B,EAAE,IAAI,EAAI,EAAE,IAAI,EADN,EAAE,IAAI,GAIrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,sBAAa,cAGhB,eAAZ,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,YAAY,yBACZ,UAAU,uIAEV,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,+BAChC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,YAAc,eAIzD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,2EAAkE,oBACnF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAe,EAAE,MAAM,CAAC,KAAK,EAC9C,YAAY,qBACZ,UAAU,+IAMlB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qCACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,GAAU,CAAC,EACrB,QAAS,EACT,UAAU,4JACX,gBAKH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,+CAC3E,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,2BACX,EAAW,MAAM,CAChB,EAAW,GAAG,CAAC,AAAC,GACd,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAc,UAAU,oDACvB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4EACZ,EAAE,YAAY,EAAI,EAAE,EAAE,GAEzB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDAAiD,EAAE,EAAE,MAEtE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CACC,UAAU,gGACV,KAAM,WAAa,mBAAmB,EAAE,EAAE,EAAI,aAAe,mBAAmB,UAAY,EAAS,wBACtG,WAVM,EAAE,EAAE,GAeb,KACmB,IAAtB,EAAW,MAAM,EAAU,CAAC,GAC3B,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,yDAAgD,6BAEzC,IAAtB,EAAW,MAAM,EAAU,GAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,yDAAgD,qBAM1E,CCjIO,SAAS,EAAc,CAAyB,EAErD,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,WACzE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8DAAqD,4GAGlE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,cAC3E,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,uFACX,EAAE,UAAU,CAAC,MAAM,CAAG,EAAE,UAAU,CAAC,GAAG,CAAE,AAAD,GAAO,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAY,GAAJ,IAAe,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,yBAG/E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sFACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,gBAC3E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iEACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,MAAO,EAAE,aAAa,CACtB,SAAU,AAAC,GAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,KAAK,EAClD,SAAU,EAAE,eAAe,EAAI,EAAE,aAAa,EAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAC3E,UAAU,yIAET,EAAE,eAAe,CAAC,MAAM,CACrB,EAAE,eAAe,CAAC,GAAG,CAAC,AAAC,GAAM,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAe,MAAO,WAAI,GAAd,IAC1C,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,sBAEvB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EAAE,eAAe,EAAI,EAAE,aAAa,EAAI,CAAC,EAAE,aAAa,CAClE,QAAS,AA7BT,EA6BW,cAAc,CACzB,UAAU,4JAET,EAAE,eAAe,CAAG,SAAW,WAGnC,EAAE,cAAc,EACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8GACZ,EAAE,cAAc,GAGpB,EAAE,YAAY,EACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0HACZ,EAAE,YAAY,GAGnB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,oDACf,EAAE,MAAM,CAAC,YAKrE,CClDO,SAAS,EAAY,CAAuB,EACjD,GAAM,UAAE,CAAQ,aAAE,CAAW,QAAE,CAAM,CAAE,cAAY,CAAE,CAAG,EACxD,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,sCACzE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,2BACX,EAAS,MAAM,CACd,EAAS,GAAG,CAAC,AAAC,IAEZ,IAAM,EAAK,OAAO,EAAI,EAAE,EAAI,EAAI,KAAK,EAAI,IAAI,IAAI,GAC3C,EAAM,GAAM,OAAO,EAAI,IAAI,EAAI,OAC/B,EAAQ,OAAO,EAAI,IAAI,EAAI,EAAI,EAAE,EAAI,EAAI,KAAK,EAAI,aAClD,EAAU,EAAI,OAAO,EAAI,AAJnB,EAIuB,KAAK,EAAE,QAC1C,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAa,UAAU,iFACtB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2DAAmD,IAClE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DAAqD,YAAU,OAAO,GAAW,QAChG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sCACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,GAAU,CAAC,EACrB,QAAS,IAAM,EAAa,EAAI,EAAO,OACvC,UAAU,uLACX,QAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,GAAU,CAAC,EACrB,QAAS,IAAM,EAAa,EAAI,EAAO,UACvC,UAAU,uLACX,WAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,GAAU,CAAC,EACrB,QAAS,IAAM,EAAa,EAAI,EAAO,WACvC,UAAU,uLACX,YAGC,AAAD,EAAyF,KAAnF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDAA+C,sBAzBhE,EA6Bb,GACE,KACiB,IAApB,EAAS,MAAM,EAAU,GACxB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,yDAAgD,YAE3C,IAApB,EAAS,MAAM,EAAU,CAAC,GACzB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,yDAAgD,8CAKxE,CCrEA,IAAA,EAAA,EAAA,CAAA,CAAA,OAiBO,SAAS,EAAa,CAAwB,EACnD,GAAM,WACJ,CAAS,kBACT,CAAgB,mBAChB,CAAiB,sBACjB,CAAoB,UACpB,CAAQ,aACR,CAAW,gBACX,CAAc,eACd,CAAa,QACb,CAAM,gBACN,CAAc,gBACd,CAAc,CACf,CAAG,EAEJ,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,0BAA0B,CAAA,CACzB,MAAM,aACN,MAAO,EACP,QAAS,EACT,kBAAmB,EACnB,qBAAsB,EACtB,iBAAkB,EAClB,aAAc,IAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oEAA0D,SAAO,KAChF,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,EACV,QAAS,EACT,UAAU,4JAET,EAAS,UAAY,iBAIzB,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8GACZ,IAED,KAEJ,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAe,EAAE,MAAM,CAAC,KAAK,EAC9C,UAAU,8JACV,YAAY,SAKtB,CCpDA,SAAS,EAAU,CAAsC,EACvD,MAAO,CAAA,EAAG,EAAG,KAAK,EAAI,GAAG,CAAC,EAAE,EAAG,KAAK,EAAI,EAAA,CAC1C,AAD6C,CAGtC,SAAS,EAAc,QAAE,CAAM,CAAsB,EAC1D,GAAM,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAC7B,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAW,EAAE,EACzC,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAe,EAAE,EACzD,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAe,EAAE,EAE7C,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,YACjC,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACvC,CAAC,EAAW,EAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACrC,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC/B,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAE5D,eAAe,IACb,GAAW,GACX,EAAS,IACT,GAAI,CACF,IAAM,EAAM,MAAM,MAAM,CAAC,yBAAyB,EAAE,mBAAmB,GAAA,CAAS,CAAE,CAAE,MAAO,UAAW,GAChG,EAAQ,MAAM,EAAI,IAAI,GAO5B,GAAI,CAAC,EAAI,EAAE,EAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,yBACvD,EAAS,MAAM,OAAO,CAAC,EAAK,KAAK,EAAI,EAAK,KAAK,CAAG,EAAE,EACpD,EAAe,MAAM,OAAO,CAAC,EAAK,WAAW,EAAI,EAAK,WAAW,CAAG,EAAE,EACtE,EAAS,MAAM,OAAO,CAAC,EAAK,KAAK,EAAI,EAAK,KAAK,CAAG,EAAE,CACtD,CAAE,MAAO,EAAY,CACnB,EAAS,CAAA,EAAA,EAAA,YAAY,AAAZ,EAAa,IACtB,EAAS,EAAE,EACX,EAAe,EAAE,EACjB,EAAS,EAAE,CACb,QAAU,CACR,GAAW,EACb,CACF,CAEA,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,KACH,GAEP,EAAG,CAAC,EAAO,EAEX,IAAM,EAAW,CAAA,EAAA,EAAA,OAAA,AAAO,EACtB,IAAM,CACJ,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,MAAO,MAAO,KAAM,EAC7B,CAAE,MAAO,WAAY,MAAO,UAAW,EACvC,CAAE,MAAO,UAAW,MAAO,SAAU,EACtC,CACD,EAAE,EAGE,EAAe,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,IAAI,IAAI,EAAY,GAAG,CAAC,AAAC,GAAM,EAAE,IAAI,GAAI,CAAC,EAAY,EAEzF,eAAe,EAAI,CAAc,EAC/B,IAAM,EAAM,EAAU,GACtB,GAAI,AAAC,EAAG,KAAK,EAAK,EAAD,AAAI,KAAK,EAAE,AAE5B,EAAc,GACd,EAAS,IACT,GAAI,CACF,IAAM,EAAU,CACd,GAAI,MACJ,GAAI,IAAI,OAAO,WAAW,GAC1B,MAAO,CAAA,EAAG,EAAO,KAAK,CAAC,CACvB,IAAK,CAAE,KAAM,aAAc,KAAM,EAAG,KAAK,AAAC,EAC1C,KAAM,CAAE,GAAI,EAAG,EAAE,CAAE,OAAQ,EAAG,MAAM,CAAE,KAAM,EAAG,IAAI,CAAE,QAAS,EAAG,OAAO,CAAE,OAAQ,EAAG,MAAM,AAAC,CAC9F,EACM,EAAM,MAAM,MAAM,CAAC,yBAAyB,EAAE,mBAAmB,GAAA,CAAS,CAAE,CAChF,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,EACvB,GACM,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,EAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,gBACvD,OAAM,GACR,CAAE,MAAO,EAAY,CACnB,EAAS,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACxB,QAAU,CACR,EAAc,KAChB,EACF,CAEA,eAAe,EAAM,CAAsC,EACzD,IAAM,EAAM,EAAU,GACtB,GAAI,AAAC,EAAG,KAAK,EAAK,EAAD,AAAI,KAAK,EAAE,AAE5B,EAAc,GACd,EAAS,IACT,GAAI,CACF,IAAM,EAAU,CACd,GAAI,QACJ,GAAI,IAAI,OAAO,WAAW,GAC1B,MAAO,CAAA,EAAG,EAAO,KAAK,CAAC,CACvB,IAAK,CAAE,KAAM,aAAc,KAAM,EAAG,KAAK,AAAC,CAC5C,EACM,EAAM,MAAM,MAAM,CAAC,yBAAyB,EAAE,mBAAmB,GAAA,CAAS,CAAE,CAChF,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,EACvB,GACM,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,EAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,kBACvD,OAAM,GACR,CAAE,MAAO,EAAY,CACnB,EAAS,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACxB,QAAU,CACR,EAAc,KAChB,EACF,CAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,6BACzE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,aACvD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,kCAAoC,sCAG9E,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,UAAU,+JACX,eAKF,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wFAAgF,IAC7F,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DAAqD,UAAQ,EAAM,MAAM,CAAG,EAAM,IAAI,CAAC,MAAQ,eAGhH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,oBACzE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,SAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAW,EAAE,MAAM,CAAC,KAAK,EAC1C,UAAU,8IAET,EAAS,GAAG,CAAC,AAAC,GACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAqB,MAAO,EAAE,KAAK,UACjC,EAAE,KAAK,EADG,EAAE,KAAK,QAO1B,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,4BAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAa,EAAE,MAAM,CAAC,KAAK,EAC5C,UAAU,qIACV,YAAY,qEAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,gCACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oFAA2E,YAC1F,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,UAAU,qJACV,YAAY,4CAIhB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yBACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,GAAU,CAAC,EAAW,IAAI,GACpC,QAAS,UACP,GAAU,GACV,EAAS,IACT,GAAI,CACF,IAAM,EAAU,CACd,GAAI,SACJ,GAAI,IAAI,OAAO,WAAW,GAC1B,OAAQ,CAAA,EAAG,EAAO,KAAK,CAAC,CACxB,KAAM,EACN,QAAS,EAAW,IAAI,GACxB,OAAQ,EAAU,IAAI,GAAK,CAAE,KAAM,EAAU,IAAI,EAAG,OAAI,EACxD,KAAM,YACR,EACM,EAAM,MAAM,MAAM,CAAC,yBAAyB,EAAE,mBAAmB,GAAA,CAAS,CAAE,CAChF,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,EACvB,GACM,EAAQ,MAAM,EAAI,IAAI,GAC5B,GAAI,CAAC,EAAI,EAAE,EAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,2BACvD,EAAc,IACd,EAAa,IACb,MAAM,GACR,CAAE,MAAO,EAAY,CACnB,EAAS,CAAA,EAAA,EAAA,YAAY,AAAZ,EAAa,GACxB,QAAU,CACR,GAAU,EACZ,CACF,EACA,UAAU,4JAET,EAAS,UAAY,iCAM9B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,kBACzE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yDAAgD,EAAY,MAAM,CAAC,gBAGnF,EAAU,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,aAAiB,KAEhG,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,EAAY,MAAM,CACjB,EAAY,GAAG,CAAE,AAAD,GACd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAkB,UAAU,iFAC3B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yDACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAG,EAAE,GAClC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gBAAO,MACvB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oDAA4C,EAAG,IAAI,GACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gBAAO,MACvB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAG,MAAM,GACtC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gBAAO,MACvB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,sBAAY,UAAQ,EAAG,QAAQ,OAEjD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,KAAK,EAAM,GAC1B,SAAU,IAAe,EAAG,IAAI,CAChC,UAAU,mLAET,IAAe,EAAG,IAAI,CAAG,aAAe,aAI7C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gFAAwE,EAAG,OAAO,GAEhG,EAAG,MAAM,CACR,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qJACZ,KAAK,SAAS,CAAC,EAAG,MAAM,CAAE,KAAM,KAEjC,OA3BI,EAAG,IAAI,GA+BnB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDAAgD,8BAKrE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,kBACzE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yDAA+C,WAAS,EAAM,MAAM,CAAC,mBAGrF,EAAU,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,aAAiB,KAEhG,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,EAAM,MAAM,CACX,EAAM,GAAG,CAAC,AAAC,IACT,IAAM,EAAI,EAAU,GACd,EAAW,EAAa,GAAG,CAAC,GAClC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAgD,UAAU,iFACzD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yDACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAG,EAAE,GAClC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gBAAO,MACvB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,oDAA4C,EAAG,IAAI,GACnE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gBAAO,MACvB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAG,MAAM,MAExC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACZ,EAAG,KAAK,CACP,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,uEACb,EAAG,KAAK,CAAC,IAAE,EAAG,KAAK,IAEpB,KACJ,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,KAAK,EAAI,GACxB,SAAU,GAAY,IAAe,GAAK,CAAC,EAAG,KAAK,EAAI,CAAC,EAAG,KAAK,CAChE,UAAU,mLAET,EAAW,SAAW,IAAe,EAAI,WAAa,cAK7D,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gFAAwE,EAAG,OAAO,GAEhG,EAAG,MAAM,CACR,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qJACZ,KAAK,SAAS,CAAC,EAAG,MAAM,CAAE,KAAM,KAEjC,OAhCI,CAAA,EAAG,EAAG,KAAK,EAAI,IAAI,CAAC,EAAE,EAAG,KAAK,EAAI,EAAA,CAAG,CAmCnD,GAEA,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDAAgD,gCAM3E,CCzVA,IAAA,EAAA,EAAA,CAAA,CAAA,OAYO,SAAS,EAAuB,MACrC,CAAI,SACJ,CAAO,CACP,QAAM,CACN,aAAW,CAMZ,EACC,IAAM,EAAiB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,CAAA,EAAG,EAAO,mBAAmB,CAAC,CAAE,CAAC,EAAO,EACvE,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GACjC,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACjC,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,iCAC3C,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,eACjC,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACzC,CAAC,EAAgB,EAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAE/C,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC5C,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA4D,MAE1F,EAAa,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAElB,CAAE,iBAjCJ,OAAO,AAgCuB,GAhCd,IACpB,WAAW,GACX,IAAI,GACJ,OAAO,CAAC,cAAe,KACvB,OAAO,CAAC,WAAY,IACpB,OAAO,CAAC,OAAQ,KA4BS,EACzB,CAAC,EAAQ,SAEZ,AAAK,EAEE,CAAA,CAFH,CAEG,CAFI,CAEJ,YAAA,AAAY,EACjB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACC,UAAU,4BACV,QAAS,KACH,AAAC,GAAY,GACnB,IAEF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oIACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,qBAC3E,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,4BACvC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6BAAoB,uBAAyB,4DAIxF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,gFAAuE,0BACxF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAW,EAAE,MAAM,CAAC,KAAK,EAC1C,UAAU,uIAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,YACxD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,IAAsB,iBAAc,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAW,gBAAgB,GAAQ,OAG5I,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,gFAAuE,oCACxF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAW,EAAE,MAAM,CAAC,KAAK,EAC1C,YAAY,4BACZ,UAAU,uIAGZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,2EAAkE,wCACnF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAgB,EAAE,MAAM,CAAC,KAAK,EAC/C,UAAU,uIAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6DAAoD,sDAGrE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,2EAAkE,8BACnF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAW,EAAE,MAAM,CAAC,KAAK,EAC1C,UAAU,6IAKhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,2JACf,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,WAAW,QAAS,EAAa,SAAU,AAAC,GAAM,EAAe,EAAE,MAAM,CAAC,OAAO,EAAG,UAAU,SAC1G,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,mDAC4C,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAA,GACjD,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,yDAA+C,oBAC5C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,8BAAgC,WAAQ,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAW,gBAAgB,GAAQ,aAK3J,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,2JACf,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,KAAK,WAAW,QAAS,EAAgB,SAAU,AAAC,GAAM,EAAkB,EAAE,MAAM,CAAC,OAAO,EAAG,UAAU,SAChH,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,mDAC4C,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAA,GACjD,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,yDAA+C,QACxD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,4BAA8B,2CAKpE,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8GAAsG,IACnH,KAEH,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2HAAiH,aACpH,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAO,mBAAmB,GAAQ,MAAG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAO,SAAS,MAEzH,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qDACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,SAAU,EACV,UAAU,mLACX,WAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,GAAc,CAAC,EAAW,gBAAgB,EAAI,CAAC,EAAQ,IAAI,GACrE,QAAS,UACP,GAAc,GACd,EAAS,MACT,EAAU,MACV,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAG1B,kCAAmC,CACnC,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,QACnB,EACA,oBAAqB,EAAW,gBAAgB,CAChD,QAAS,EAAQ,IAAI,GACrB,aAAc,EAAa,IAAI,GAC/B,QAAS,EAAQ,IAAI,eACrB,iBACA,CACF,EACF,GACA,GAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EACxC,EAAU,CAAE,oBAAqB,EAAK,mBAAmB,CAAE,UAAW,EAAK,SAAS,AAAC,GACrF,GACF,CAAE,MAAO,EAAY,CACnB,EAAS,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,GACnD,QAAU,CACR,EAAc,GAChB,CACF,EACA,UAAU,kMAET,EAAa,cAAgB,yBAO1C,SAAS,IAAI,EA3IG,IA4IpB,CC1JO,SAAS,EAAkB,QAAE,CAAM,CAAsB,EAC9D,GAAM,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA2B,MACvD,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC1D,CAAC,EAAW,EAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAErC,EAAO,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,UACvB,EAAW,IACX,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAS,AAAT,EACjB,CAAC,+BAA+B,EAAE,mBAAmB,GAAA,CAAS,CAC9D,CAAE,MAAO,UAAW,GAEtB,EAAS,GACT,EAAgB,IAAI,OAAO,WAAW,GACxC,CAAE,MAAO,EAAY,CACnB,EAAS,CAAE,IAAI,EAAO,MAAO,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,EAAG,GACxE,EAAgB,IAAI,OAAO,WAAW,GACxC,QAAU,CACR,GAAW,EACb,CACF,EAAG,CAAC,EAAO,QAMX,CAJA,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,KACH,GACP,EAAG,CAAC,EAAK,EAEL,GACK,CAAA,EAAA,EAAA,CADI,EACJ,EAAC,MAAA,CAAI,UAAU,oCAA2B,gCAG9C,EAIA,EAAM,EAAE,CAJD,AAeP,CAXU,CAWJ,OAAO,CAyChB,CAzCkB,AAyClB,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,iBACzE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DAAqD,UAC3D,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAM,KAAK,CAAC,EAAE,GACjD,EAAM,KAAK,CAAC,YAAY,CAAG,CAAC,EAAE,EAAE,EAAM,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAG,MAEjE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DAAqD,cACvD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAM,KAAK,CAAC,SAAS,SAIjE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDACZ,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,iBACU,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,OAE3C,OAEN,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,KAAK,IACpB,SAAU,EACV,UAAU,oPAET,EAAU,cAAgB,kBAKjC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDACb,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,iFACjB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,kBACxE,EAAM,YAAY,CAAC,MAAM,CACxB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,0BACX,EAAM,YAAY,CAAC,GAAG,CAAC,AAAC,GACvB,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAgB,UAAU,0DACzB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAE,IAAI,GACnC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,8DAAoD,YACxD,OAAO,EAAE,QAAQ,EACL,UAArB,OAAO,EAAE,OAAO,CAAgB,CAAC,SAAS,EAAE,EAAE,OAAO,CAAA,CAAE,CAAG,QAJtD,EAAE,IAAI,KAUnB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,mDAIxE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,iFACjB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,kBACxE,EAAM,SAAS,CAAC,MAAM,CACrB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,0BACX,EAAM,SAAS,CAAC,GAAG,CAAC,AAAC,GACpB,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAgB,UAAU,0DACzB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6BAAqB,EAAE,IAAI,GAC1C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yDACZ,EAAE,MAAM,CAAG,EAAE,MAAM,CAAG,cACtB,EAAE,GAAG,CAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,EAAG,GAAA,CAAI,CAAG,QAJhC,EAAE,IAAI,KAUnB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,iCAK1E,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,sFACjB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,iBACxE,EAAM,kBAAkB,CACvB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6BAAqB,EAAM,kBAAkB,CAAC,IAAI,GACjE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACkC,UAA9C,OAAO,EAAM,kBAAkB,CAAC,SAAS,CAAgB,CAAC,MAAM,EAAE,EAAM,kBAAkB,CAAC,SAAS,CAAA,CAAE,CAAG,UACzG,EAAM,kBAAkB,CAAC,OAAO,CAAG,CAAC,MAAM,EAAE,EAAM,kBAAkB,CAAC,OAAO,CAAA,CAAE,CAAG,SAItF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,mCAIxE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,sFACjB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,sBACzE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8DAAqD,gGAGlE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,wFACZ,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6BAAoB,YACpC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6DAAoD,uBAEtE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6BAAoB,6BACpC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6DAAoD,mCAEtE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,8BAAoB,UAAQ,EAAM,KAAK,CAAC,SAAS,CAAC,oBAClE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,6DAAoD,8BAGxE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,6DAAoD,iHAKnE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,sFACjB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,sCACzE,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,yEACM,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,UAAO,wBAA4B,OAE5G,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,wFACZ,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,gDACJ,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,8EACJ,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,qEAIR,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,sFACjB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,6BACzE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8DAAqD,yFAGlE,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,uFACX,EAAM,aAAa,CAAC,GAAG,CAAE,AAAD,GACvB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAW,UAAU,6BACnB,GADM,YAzKf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,iBACzE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8DAAqD,qDAEpE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAa,GAC5B,UAAU,8KACX,wBAKH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oIACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oEAA2D,cAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,kCAA0B,EAAM,MAAM,EAAI,4BAG3D,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,yBAC1C,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,gCAAwC,yGAItE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,KAAM,EACN,QAAS,IAAM,GAAa,GAC5B,OAAQ,EACR,YAAa,KACX,GAAa,GACR,GACP,OA3CJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,qCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,iBACzE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8GACZ,EAAM,KAAK,MARX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oCAA2B,oCAiMrD,CXvOA,IAAA,EAAA,EAAA,CAAA,CAAA,OAEA,IAAM,EAAO,CACX,CAAE,GAAI,SAAmB,MAAO,QAAS,EACzC,CAAE,GAAI,SAAmB,MAAO,QAAS,EACzC,CAAE,GAAI,SAAmB,MAAO,QAAS,EACzC,CAAE,GAAI,OAAiB,MAAO,MAAO,EACrC,CAAE,GAAI,QAAkB,MAAO,OAAQ,EACvC,CAAE,GAAI,SAAmB,MAAO,QAAS,EACzC,CAAE,GAAI,eAAyB,MAAO,cAAe,EACrD,CAAE,GAAI,YAAsB,MAAO,WAAY,EAChD,CAIc,SAAS,EAAW,CAAE,QAAM,YAAE,CAAU,CAA2C,EAChG,IAAM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAClB,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAmB,EAAE,EACrD,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACvC,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC1D,CAAC,EAAgB,EAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC9D,CAAC,EAAmB,EAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACrD,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,GACnC,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,GACvC,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACzC,CAAC,EAAkB,EAAoB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAwB,MAClE,CAAC,EAAW,EAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAQ,IACzB,AAChB,CADiB,SAAU,SAAU,SAAU,OAAQ,QAAS,SAAU,eAAgB,YAAY,CAChG,QAAQ,CAAC,GAAwB,EAAuB,UAEjE,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACjC,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC/B,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACnC,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GAC7C,CAAC,EAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACzD,GAAQ,CAAA,EAAA,EAAA,QAAA,AAAQ,IAEhB,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACzC,CAAC,GAAoB,GAAsB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAE5E,SAAS,GAAa,CAAY,CAAE,EAAqC,MAAM,EAC7E,IAAM,EAAM,OAAO,GAAQ,IAAI,IAAI,GAC9B,GACL,EADU,CACJ,IAAI,CAAC,MAAE,EAAM,QAAS,CAAI,EAClC,CAEA,GAAM,CAAC,GAAW,GAAa,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAuF,EAAE,EACrH,CAAC,GAAkB,GAAoB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACnD,CAAC,GAAe,GAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACrD,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACrD,CAAC,GAAU,GAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,WAC3C,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAiB,IAEjD,CAAC,GAAU,GAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAY,EAAE,EAChD,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAEzC,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAmB,EAAE,EAC3D,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GAErD,GAAe,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAC3B,IAAM,EAAK,OAAO,GAAW,IAC7B,GAAI,CAAC,EAAG,UAAU,CAAC,SAAU,MAAO,EAAE,CACtC,IAAM,EAAM,EAAG,OAAO,CAAC,UAAW,GAClC,GAAY,CAAC,IAAT,EAAY,MAAO,EAAE,CACzB,IAAM,EAAS,EAAG,KAAK,CAAC,EAAG,EAAM,GACjC,GAAI,CACF,IAAM,EAAM,CAAA,EAAA,EAAA,KAAA,AAAS,EAAC,IAAW,CAAC,EAElC,MAAO,CADQ,MAAM,OAAO,CAAC,EAAG,MAAM,EAAI,EAAG,MAAM,CAAG,EAAA,AAAE,EAErD,GAAG,CAAC,AAAC,GAAM,GACX,GAAG,CAAC,AAAC,IAAO,AAAD,CAAG,KAAM,OAAO,EAAE,IAAI,EAAI,IAAI,IAAI,GAAI,KAAwB,UAAlB,OAAO,EAAE,IAAI,CAAgB,EAAE,IAAI,MAAG,EAAU,CAAC,EACxG,MAAM,CAAC,AAAC,IAAM,CAAQ,EAAE,IAAI,CACjC,CAAE,KAAM,CACN,MAAO,EAAE,AACX,CACF,EAAG,CAAC,EAAQ,EAEN,CAAC,GAAS,GAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACzC,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAiB,IAC/C,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAEjD,GAAc,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAEnB,AADG,CAAa,eAAZ,GAA2B,GAAa,EAAA,CAAO,CAAE,IAAI,IACpD,GACX,CAAC,GAAS,GAAW,EAElB,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAW,EAAE,EACnD,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAW,EAAE,EAC7D,CAAC,GAAe,GAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC7C,CAAC,GAAe,GAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACrD,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjD,CAAC,GAAc,GAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACnD,CAAC,GAAgB,GAAkB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAEvD,GAAc,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,EAAQ,MAAM,CAAC,AAAC,GAAiB,SAAX,EAAE,IAAI,EAAc,CAAC,EAAQ,EAE/E,GAAW,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IACZ,AACJ,EADY,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GAAqB,cAAb,EAAE,MAAM,GAC3C,EAAQ,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,IAAS,KAClD,CAAC,EAAS,EAAK,EAEZ,GAAc,EAAQ,EAAO,IAAI,GACjC,IAAgB,CAAQ,EAAK,IAAI,GACjC,GAAuB,EAAQ,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GAAqB,cAAb,EAAE,MAAM,EACpE,GAAkB,GAAQ,IAAU,SAAW,WAAa,CAAC,EAAA,EAmDnE,eAAe,KACb,IAAM,EAAK,EAAK,IAAI,GACpB,GAAK,CAAD,EACJ,CADS,EACQ,GACjB,GAAmB,IACnB,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAiD,CAAC,aAAa,EAAE,mBAAmB,GAAA,CAAK,CAAE,CACrH,MAAO,UACT,GACM,EAAI,EAAK,MAAM,CACrB,EAAW,EAAE,OAAO,EACpB,EAA+C,UAA3B,OAAO,EAAK,UAAU,CAAgB,EAAK,UAAU,CAAG,KAC9E,CAAE,MAAO,EAAY,CACnB,GAAmB,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAClC,QAAU,CACR,EAAiB,GACnB,EACF,CAWA,eAAe,GAAyB,CAAgF,EACtH,IAAM,EAAI,EAAO,IAAI,GACf,EAAK,OAAO,EAAK,IAAI,EAAI,GAAM,IAAI,GACnC,EAAO,OAAO,EAAK,MAAM,EAAI,GAAQ,IAAI,GACzC,GAAY,CAAQ,EAAK,SAAS,CAClC,EAAW,EAAQ,EAAK,QAAQ,CACtC,GAAI,CAAC,EAAG,MAAM,AAAI,MAAM,gCACxB,GAAI,CAAC,EAAI,MAAM,AAAI,MAAM,gCASzB,OARa,AAQN,MARY,CAAA,EAAA,EAAA,SAAS,AAAT,EACjB,qBACA,CACE,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,OAAQ,EAAG,KAAM,EAAI,OAAQ,QAAQ,YAAW,WAAW,CAAS,EAC7F,EAGJ,CAEA,eAAe,GAAa,CAAkB,CAAE,CAAkE,EAChH,GAAU,GACV,GAAa,IACb,GAAI,CACF,IAAM,EAAO,MAAM,GAAyB,CAAE,YAAW,GAAG,CAAS,AAAC,GAKtE,GAJI,CAIA,CAJK,QAAQ,EAAI,CAAC,EAAK,QAAQ,CAAC,EAAE,EAAE,AACtC,GAAa,CAAC,2CAA2C,EAAE,EAAK,QAAQ,CAAC,KAAK,EAAI,gBAAA,CAAiB,CAAE,SAEtF,AAAQ,EAAQ,IAAI,IAAO,EAAQ,IAAI,KAAO,EAAK,OAAO,CAAC,IAAI,GAClE,CACZ,IAAM,EEnLP,AFmLqB,SEnLZ,AAA2B,CAAU,CAAE,CAAc,EACnE,GAAI,CAAC,EAAG,UAAU,CAAC,SAAU,OAAO,EACpC,IAAM,EAAM,EAAG,OAAO,CAAC,UAAW,GAClC,GAAY,CAAC,IAAT,EAAY,OAAO,EAEvB,IAAM,EAAK,EAAG,KAAK,CAAC,EAAG,GACjB,EAAO,EAAG,KAAK,CAAC,EAAM,GAEtB,MAAE,CAAI,cAAE,CAAY,SAAE,CAAO,CAAE,CAnCvC,AAmC0C,SAnCjC,AACP,CAAe,CACf,CAAc,EAEd,IAAM,CA+BqD,CA/BpC,EAAE,CACrB,GAAS,EACT,GAAe,EACf,GAAU,EAEd,IAAK,IAAM,KAAQ,EAAO,CACxB,GAAI,iBAAiB,IAAI,CAAC,GAAO,CAC/B,GAAS,EACT,GAAe,EACf,EAAK,IAAI,CAAC,GACV,QACF,CAEA,GADI,GAAU,MAAM,IAAI,CAAC,KAAO,GAAS,CAAA,EACrC,GAAU,kBAAkB,IAAI,CAAC,GAAO,CAC1C,EAAK,IAAI,CAAC,CAAC,UAAU,EAAE,EAAA,CAAQ,EAC/B,GAAU,EACV,QACF,CACA,EAAK,IAAI,CAAC,EACZ,CACA,MAAO,MAAE,eAAM,UAAc,CAAQ,CACvC,EASgB,EAAG,KAAK,CAAC,MAC2C,GAElE,GAAI,GAAgB,CAAC,EAAS,CAC5B,IAAM,EAAgB,EAAE,CACxB,IAAK,IAAM,KAAQ,EACjB,EAAI,CADmB,GACf,CAAC,GACL,iBAAiB,IAAI,CAAC,IAAO,EAAI,IAAI,CAAC,CAAC,UAAU,EAAE,EAAA,CAAQ,EAEjE,MAAO,CAAC;AAAK,EAAE,EAAI,IAAI,CAAC,MAAM;AAAA;AAAO,EAAE,EAAA,CAAM,AAC/C,CACA,MAAO,CAAC;AAAK,EAAE,EAAK,IAAI,CAAC,MAAM;AAAA;AAAO,EAAE,EAAA,CAAM,AAChD,EFgKuD,AExNhD,SAA4B,AAAnB,CAA6B,CAAE,CAAU,gBACvD,GAAI,CAAC,EAAG,UAAU,CAAC,SAAU,OAAO,EACpC,IAAM,EAAM,EAAG,OAAO,CAAC,UAAW,GAClC,GAAY,CAAC,IAAT,EAAY,OAAO,EACvB,IAAM,EAAK,EAAG,KAAK,CAAC,EAAG,GACjB,EAAO,EAAG,KAAK,CAAC,EAAM,GACtB,GAnBuB,EAmBW,EAAG,CAnBC,EAAE,EAAU,AAmBtC,AAA8B,CAAC,MAlB7C,GAAQ,EACN,EAAO,EAAM,GAAG,CAAC,AAAC,GAClB,AAAJ,WAAe,IAAI,CAAC,IAClB,GADyB,AACjB,EACD,CAAC,IAAI,EAAE,EAAA,CAAI,EAEb,GAEJ,AAAD,GAAQ,EAAK,OAAO,CAAC,CAAC,IAAI,EAAE,AAUwB,EAVxB,CAAI,EAC7B,GAUP,MAAO,CAAC;AAAK,EAAE,EAAU,IAAI,CAAC,MAAM;AAAA;AAAO,EAAE,EAAA,CAAM,AACrD,EFgN0E,EAAS,EAAK,IAAI,IAAK,EAAK,IAAI,GAClG,OAAM,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,CAAC,aAAa,EAAE,mBAAmB,EAAK,IAAI,IAAA,CAAK,CAAE,CACjE,OAAQ,MACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,QAAS,CAAY,EAC9C,GACA,EAAW,EACb,MACE,CADK,CACM,EAAK,OAAO,EAEzB,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAA0B,CAAC,aAAa,EAAE,mBAAmB,EAAK,IAAI,IAAA,CAAK,CAAE,CACvG,MAAO,UACT,GAC+B,UAA3B,OAAO,EAAK,UAAU,EAAe,EAAoB,EAAK,UAAU,CAC9E,CAAE,KAAM,CACN,EAAoB,KACtB,CACA,GAAa,CAAC,mBAAmB,EAAE,EAAK,QAAQ,CAAA,CAAE,CAAE,UACtD,CAAE,MAAO,EAAY,CACnB,GAAa,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAAI,QAChC,QAAU,CACR,GAAU,EACZ,CACF,CAEA,eAAe,GAAe,CAAY,EACxC,GAAU,GACV,GAAiB,IACjB,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAC1B,CAAC,uBAAuB,EAAE,mBAAmB,GAAQ,MAAM,EAAE,mBAAmB,GAAA,CAAO,CACvF,CAAE,MAAO,UAAW,GAEtB,GAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,uBAC9B,GAAY,GACZ,GAAe,OAAO,EAAK,OAAO,EAAI,IACxC,CAAE,MAAO,EAAY,CACnB,GAAiB,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAChC,QAAU,CACR,GAAU,EACZ,CACF,CAEA,eAAe,KACb,GAAU,GACV,GAAiB,IACjB,GAAI,CAMF,GAAI,CAAC,CALQ,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAmB,kBAAmB,CAChE,OAAQ,MACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,QAAE,EAAQ,KAAM,GAAU,QAAS,EAAY,EACtE,EAAA,EACU,EAAE,CAAE,MAAM,AAAI,MAAM,sBAChC,CAAE,MAAO,EAAY,CACnB,GAAiB,CAAA,EAAA,EAAA,YAAY,AAAZ,EAAa,GAChC,QAAU,CACR,GAAU,EACZ,CACF,CAEA,eAAe,KACb,EAAU,IACV,GAAI,CACF,MAAM,EAAqB,QACzB,OACA,EACA,WACA,2BACA,WACA,aACA,gBACA,gBACA,4BACA,EACF,EACF,CAAE,MAAO,EAAY,CACnB,GAAa,CAAA,EAAA,EAAA,YAAY,AAAZ,EAAa,GAAI,QAChC,QAAU,CACR,GAAU,EACZ,CACF,CAEA,eAAe,GAAa,CAAU,CAAE,CAAa,CAAE,CAAoC,EACzF,GAAU,GACV,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,gBAAiB,CAC/B,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,IAAE,SAAI,CAAO,EACpC,GACA,GAAa,CAAC,KAAK,EAAE,EAAO,EAAE,EAAE,EAAA,CAAO,CAAE,UAC3C,CAAE,MAAO,EAAY,CACnB,GAAa,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAAI,QAChC,QAAU,CACR,GAAU,EACZ,CACF,CAEA,eAAe,KACb,IAAmB,GACnB,GAAgB,IAChB,GAAkB,IAClB,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,4BAA6B,CAC3C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,QAAE,EAAQ,MAAO,EAAc,EACtD,GACA,GAAgB,CAAC,iBAAiB,EAAE,GAAA,CAAe,EACnD,GAAI,CACF,IAAM,EAAI,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EACvB,CAAC,yBAAyB,EAAE,mBAAmB,GAAA,CAAS,CACxD,CAAE,MAAO,UAAW,GAElB,EAAE,EAAE,EAAI,MAAM,OAAO,CAAC,EAAE,MAAM,GAAG,GAAc,EAAE,MAAM,CAC7D,CAAE,KAAM,CAER,CACF,CAAE,MAAO,EAAY,CACnB,GAAkB,CAAA,EAAA,EAAA,YAAY,AAAZ,EAAa,GACjC,QAAU,CACR,GAAmB,GACrB,CACF,CAEA,MAvOA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,EAAQ,GACR,EAAU,GACV,EAAW,IACX,EAAoB,MACpB,GAAsB,MACtB,IAAe,GACf,IAAc,GAEV,GADmB,AACL,CADM,SAAU,SAAU,SAAU,OAAQ,QAAS,SAAU,eAAgB,YAAY,CACrF,QAAQ,CAAC,IAC/B,EAAa,EAEjB,EAAG,CAAC,EAHqD,AAG7C,EAAW,EAEvB,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,IAAI,GAAY,EA2BhB,OA1BA,GAAW,GACX,EAAsB,EAAQ,YAC5B,kBACA,oBACA,uBACA,YACA,wBACA,gBACA,eACA,iBACA,iBACA,sBACA,oBACA,uBACA,kBACA,wBACA,oBACA,EACF,GACG,IAAI,CAAC,KACA,AAAC,GAAW,GAAW,EAC7B,GACC,KAAK,CAAE,AAAD,IACL,GAAa,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAAI,SAC1B,AAAC,GAAW,GAAW,EAC7B,GACK,KACL,GAAY,CACd,CAEF,EAAG,CAAC,EAAO,EAqBX,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KAER,AAAI,CADO,AACN,EADW,EACP,EADW,IAEhB,EAAQ,IAAI,IACZ,AADgB,GAEf,IAEP,EAAG,CAAC,EAAK,EA8JP,CAjKmB,AAiKnB,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uCACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iDAAwC,gBACtD,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,eACpD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,UAAO,uBAA2B,kEAIjD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qCACZ,EAAK,GAAG,CAAC,AAAC,GACT,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAEC,QAAS,IAAM,EAAa,EAAE,EAAE,EAChC,UACE,IAAc,EAAE,EAAE,CACd,+HACA,2LAGL,EAAE,KAAK,EARH,EAAE,EAAE,KAaA,WAAd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,QAAS,EACT,OAAQ,EACR,UAAW,EACX,KAAM,EACN,QAAS,EACT,OAAQ,EACR,UAAW,EACX,gBA1QgB,CA0QC,EACjB,YAAa,GACb,aAAc,EACd,eAAgB,EAChB,kBAAmB,EACnB,OAAQ,EACR,YAAa,GACb,cAAe,GACf,gBAAiB,GACjB,iBAAkB,EAClB,mBAAoB,GACpB,WAAY,EACZ,QAAS,EACT,WAAY,EACZ,oBAAqB,EACrB,gBAAiB,EACjB,aAAc,GACd,cAAe,IAAM,IAAe,GACpC,aAAc,IAAM,IAAc,KAIvB,WAAd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,OAAQ,EACR,KAAM,EACN,aAAc,GACd,QAAS,GACT,WAAY,GACZ,WAAY,GACZ,cAAe,GACf,YAAa,GACb,eAAgB,GAChB,YAAa,GACb,OAAQ,EACR,WAAY,GACZ,kBAAmB,GACnB,WAAY,KAID,WAAd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,OAAQ,EACR,WAAY,GACZ,gBAAiB,GACjB,cAAe,GACf,cAAe,GACf,iBAAkB,GAClB,gBAAiB,GACjB,aAAc,GACd,eAAgB,GAChB,eAAgB,KAIL,SAAd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,SAAU,GACV,YAAa,GACb,OAAQ,EACR,aAAc,KAIH,cAAd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAe,CAAA,CAAC,OAAQ,MAI5B,AAAc,oBAAkB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAkB,OAAQ,IAE7C,WAAd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAc,OAAQ,MAIZ,UAAd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,UAAW,GACX,iBAAkB,GAClB,kBAAmB,GACnB,qBAAsB,GACtB,SAAU,GACV,YAAa,GACb,eAAgB,GAChB,cAAe,GACf,OAAQ,EACR,eAAgB,GAChB,eAAgB,KAIpB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,KAAM,GACN,OAAQ,EACR,SAAU,EACV,KAAM,EACN,QAAS,IAAM,IAAe,GAC9B,UAAW,UACT,GAAc,GACd,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,gBAAiB,CAC/B,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CACnB,KAAM,OACN,SAAU,EAAK,IAAI,UACnB,EACA,WAAW,EACX,aAAa,CACf,EACF,GACA,GAAI,CACF,IAAM,EAAW,MAAM,CAAA,EAAA,EAAA,SAAS,AAAT,EACrB,CAAC,uBAAuB,EAAE,mBAAmB,GAAA,CAAS,CACtD,CAAE,MAAO,UAAW,GAElB,EAAS,EAAE,EAAI,EAAS,IAAI,EAAwC,UAApC,AAA8C,OAAvC,EAAS,IAAI,CAAC,UAAU,EACjE,GAAsB,EAAS,IAAI,CAAC,UAAU,CAElD,CAAE,KAAM,CAER,CACA,IAAe,GACf,GAAa,mCAAoC,UACnD,CAAE,MAAO,EAAY,CACnB,GAAa,CAAA,EAAA,EAAA,YAAY,AAAZ,EAAa,GAAI,QAChC,QAAU,CACR,GAAc,EAChB,CACF,IAGF,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,eAAe,CAAA,CACd,KAAM,GACN,OAAQ,EACR,KAAM,EACN,QAAS,IAAM,IAAc,GAC7B,UAAW,UACT,GAAY,GACZ,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,yBAA0B,CACxC,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,QAAE,CAAO,EAChC,GACA,GAAa,4BAA6B,WAC1C,IAAc,GACd,WAAW,IAAM,EAAO,IAAI,CAAC,KAAM,IACrC,CAAE,MAAO,EAAY,CACnB,GAAa,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAAI,QAChC,QAAU,CACR,GAAY,EACd,CACF,MAIR"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[31105,a=>{"use strict";var b=a.i(87924),c=a.i(72131)
|
|
1
|
+
module.exports=[31105,a=>{"use strict";var b=a.i(87924),c=a.i(72131);let d=[{key:"backlog",label:"Backlog"},{key:"in-progress",label:"In progress"},{key:"testing",label:"Testing"},{key:"done",label:"Done"}],e=[{key:"all",label:"All"},{key:"today",label:"Today"},{key:"yesterday",label:"Yesterday"},{key:"7d",label:"Last 7 days"},{key:"30d",label:"Last 30 days"},{key:"custom",label:"Custom range"}];function f(a){if(!a)return null;let b=a.match(/^(\d{4})-(\d{2})-(\d{2})$/);if(!b)return null;let c=new Date(Number(b[1]),Number(b[2])-1,Number(b[3]),0,0,0,0);return Number.isFinite(c.getTime())?c:null}function g({tickets:a,basePath:g}){let[h,i]=(0,c.useState)("30d"),[j,k]=(0,c.useState)(""),[l,m]=(0,c.useState)(""),n=(0,c.useMemo)(()=>{var b;if("all"===h)return a;let c=new Date((b=new Date).getFullYear(),b.getMonth(),b.getDate(),0,0,0,0),d=new Date(c);d.setDate(d.getDate()-1);let e=null,g=null;if("today"===h)e=c,(g=new Date(c)).setDate(g.getDate()+1);else if("yesterday"===h)e=d,g=c;else if("7d"===h)(e=new Date(c)).setDate(e.getDate()-6);else if("30d"===h)(e=new Date(c)).setDate(e.getDate()-29);else if("custom"===h){e=f(j);let a=f(l);a&&(g=new Date(a)).setDate(g.getDate()+1)}return a.filter(a=>{let b=new Date(a.updatedAt);return!!Number.isFinite(b.getTime())&&(!e||!(b<e))&&(!g||!(b>=g))})},[a,h,j,l]),o=(0,c.useMemo)(()=>{let a={backlog:[],"in-progress":[],testing:[],done:[]};for(let b of n)a[b.stage].push(b);for(let b of Object.keys(a))a[b].sort((a,b)=>a.number-b.number);return a},[n]);return(0,b.jsxs)("div",{className:"space-y-4",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Tickets"}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,b.jsxs)("label",{className:"text-xs text-[color:var(--ck-text-secondary)]",children:["Time",(0,b.jsx)("select",{className:"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs",value:h,onChange:a=>i(a.target.value),children:e.map(a=>(0,b.jsx)("option",{value:a.key,children:a.label},a.key))})]}),"custom"===h?(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsxs)("label",{className:"text-xs text-[color:var(--ck-text-secondary)]",children:["From",(0,b.jsx)("input",{type:"date",value:j,onChange:a=>k(a.target.value),className:"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs"})]}),(0,b.jsxs)("label",{className:"text-xs text-[color:var(--ck-text-secondary)]",children:["To",(0,b.jsx)("input",{type:"date",value:l,onChange:a=>m(a.target.value),className:"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs"})]})]}):null]})]}),(0,b.jsx)("div",{className:"grid gap-4 lg:grid-cols-4",children:d.map(({key:a,label:c})=>(0,b.jsxs)("section",{className:"ck-glass p-3",children:[(0,b.jsxs)("div",{className:"mb-3 flex items-center justify-between",children:[(0,b.jsx)("h2",{className:"text-sm font-semibold tracking-tight",children:c}),(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:o[a].length})]}),(0,b.jsxs)("div",{className:"space-y-2",children:[0===o[a].length?(0,b.jsx)("div",{className:"rounded-[var(--ck-radius-sm)] border border-dashed border-[color:var(--ck-border-subtle)] p-3 text-xs text-[color:var(--ck-text-tertiary)]",children:"Empty"}):null,o[a].map(a=>{var c;return(0,b.jsxs)("div",{className:"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass-strong)] p-3",children:[(0,b.jsxs)("a",{href:`${g}/${encodeURIComponent(a.id)}`,className:"block text-sm font-medium text-[color:var(--ck-text-primary)] hover:underline",children:[String(a.number).padStart(4,"0")," — ",a.title]}),(0,b.jsxs)("div",{className:"mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("span",{children:a.owner?`Owner: ${a.owner}`:"Owner: —"}),(0,b.jsx)("span",{children:"·"}),(0,b.jsxs)("span",{children:["Age: ",(c=a.ageHours)<1?`${Math.max(1,Math.round(60*c))}m`:c<48?`${Math.round(c)}h`:`${Math.round(c/24)}d`]})]})]},a.id)})]})]},a))}),(0,b.jsx)("p",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Source of truth: ticket markdown files in the team workspace."})]})}a.s(["TicketsBoardClient",()=>g])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_app_tickets_TicketsBoardClient_tsx_5e156ef3._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/tickets/TicketsBoardClient.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState, useTransition } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport type { TicketStage, TicketSummary } from \"@/lib/tickets\";\n\nconst STAGES: { key: TicketStage; label: string }[] = [\n { key: \"backlog\", label: \"Backlog\" },\n { key: \"in-progress\", label: \"In progress\" },\n { key: \"testing\", label: \"Testing\" },\n { key: \"done\", label: \"Done\" },\n];\n\ntype DateFilter = \"all\" | \"today\" | \"yesterday\" | \"7d\" | \"30d\" | \"custom\";\nconst DATE_FILTERS: { key: DateFilter; label: string }[] = [\n { key: \"all\", label: \"All\" },\n { key: \"today\", label: \"Today\" },\n { key: \"yesterday\", label: \"Yesterday\" },\n { key: \"7d\", label: \"Last 7 days\" },\n { key: \"30d\", label: \"Last 30 days\" },\n { key: \"custom\", label: \"Custom range\" },\n];\n\nfunction startOfLocalDay(d: Date) {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0);\n}\n\nfunction parseDateInput(value: string): Date | null {\n if (!value) return null;\n const m = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!m) return null;\n const y = Number(m[1]);\n const mo = Number(m[2]) - 1;\n const day = Number(m[3]);\n const d = new Date(y, mo, day, 0, 0, 0, 0);\n return Number.isFinite(d.getTime()) ? d : null;\n}\n\nfunction formatAge(hours: number) {\n if (hours < 1) return `${Math.max(1, Math.round(hours * 60))}m`;\n if (hours < 48) return `${Math.round(hours)}h`;\n return `${Math.round(hours / 24)}d`;\n}\n\nexport function TicketsBoardClient({ tickets }: { tickets: TicketSummary[] }) {\n const router = useRouter();\n const [isPending, startTransition] = useTransition();\n const [error, setError] = useState<string | null>(null);\n const [dateFilter, setDateFilter] = useState<DateFilter>(\"30d\");\n const [customFrom, setCustomFrom] = useState<string>(\"\");\n const [customTo, setCustomTo] = useState<string>(\"\");\n\n const filteredTickets = useMemo(() => {\n if (dateFilter === \"all\") return tickets;\n\n const now = new Date();\n const todayStart = startOfLocalDay(now);\n const yesterdayStart = new Date(todayStart);\n yesterdayStart.setDate(yesterdayStart.getDate() - 1);\n\n let from: Date | null = null;\n let toExclusive: Date | null = null;\n\n if (dateFilter === \"today\") {\n from = todayStart;\n toExclusive = new Date(todayStart);\n toExclusive.setDate(toExclusive.getDate() + 1);\n } else if (dateFilter === \"yesterday\") {\n from = yesterdayStart;\n toExclusive = todayStart;\n } else if (dateFilter === \"7d\") {\n from = new Date(todayStart);\n from.setDate(from.getDate() - 6); // include today\n } else if (dateFilter === \"30d\") {\n from = new Date(todayStart);\n from.setDate(from.getDate() - 29); // include today\n } else if (dateFilter === \"custom\") {\n from = parseDateInput(customFrom);\n const to = parseDateInput(customTo);\n if (to) {\n toExclusive = new Date(to);\n toExclusive.setDate(toExclusive.getDate() + 1);\n }\n }\n\n return tickets.filter((t) => {\n const updated = new Date(t.updatedAt);\n if (!Number.isFinite(updated.getTime())) return false;\n if (from && updated < from) return false;\n if (toExclusive && updated >= toExclusive) return false;\n return true;\n });\n }, [tickets, dateFilter, customFrom, customTo]);\n\n const byStage = useMemo(() => {\n const map: Record<TicketStage, TicketSummary[]> = {\n backlog: [],\n \"in-progress\": [],\n testing: [],\n done: [],\n };\n for (const t of filteredTickets) map[t.stage].push(t);\n for (const s of Object.keys(map) as TicketStage[]) {\n map[s].sort((a, b) => a.number - b.number);\n }\n return map;\n }, [filteredTickets]);\n\n async function move(ticket: TicketSummary, to: TicketStage) {\n setError(null);\n const res = await fetch(\"/api/tickets/move\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ ticket: ticket.id, to }),\n });\n\n if (!res.ok) {\n const data = await res.json().catch(() => ({}));\n throw new Error(data?.error ?? `Move failed (${res.status})`);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Tickets</h1>\n\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"text-xs text-[color:var(--ck-text-secondary)]\">\n Time\n <select\n className=\"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs\"\n value={dateFilter}\n onChange={(e) => setDateFilter(e.target.value as DateFilter)}\n >\n {DATE_FILTERS.map((f) => (\n <option key={f.key} value={f.key}>\n {f.label}\n </option>\n ))}\n </select>\n </label>\n\n {dateFilter === \"custom\" ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"text-xs text-[color:var(--ck-text-secondary)]\">\n From\n <input\n type=\"date\"\n value={customFrom}\n onChange={(e) => setCustomFrom(e.target.value)}\n className=\"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs\"\n />\n </label>\n <label className=\"text-xs text-[color:var(--ck-text-secondary)]\">\n To\n <input\n type=\"date\"\n value={customTo}\n onChange={(e) => setCustomTo(e.target.value)}\n className=\"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs\"\n />\n </label>\n </div>\n ) : null}\n\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">{isPending ? \"Updating…\" : \"\"}</div>\n </div>\n </div>\n\n {error ? (\n <div className=\"ck-glass border border-[color:var(--ck-border-strong)] p-3 text-sm text-[color:var(--ck-text-primary)]\">\n {error}\n </div>\n ) : null}\n\n <div className=\"grid gap-4 lg:grid-cols-4\">\n {STAGES.map(({ key, label }) => (\n <section key={key} className=\"ck-glass p-3\">\n <div className=\"mb-3 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold tracking-tight\">{label}</h2>\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {byStage[key].length}\n </span>\n </div>\n\n <div className=\"space-y-2\">\n {byStage[key].length === 0 ? (\n <div className=\"rounded-[var(--ck-radius-sm)] border border-dashed border-[color:var(--ck-border-subtle)] p-3 text-xs text-[color:var(--ck-text-tertiary)]\">\n Empty\n </div>\n ) : null}\n\n {byStage[key].map((t) => (\n <div\n key={t.id}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass-strong)] p-3\"\n >\n <a\n href={`/tickets/${encodeURIComponent(t.id)}`}\n className=\"block text-sm font-medium text-[color:var(--ck-text-primary)] hover:underline\"\n >\n {String(t.number).padStart(4, \"0\")} — {t.title}\n </a>\n <div className=\"mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <span>{t.owner ? `Owner: ${t.owner}` : \"Owner: —\"}</span>\n <span>·</span>\n <span>Age: {formatAge(t.ageHours)}</span>\n </div>\n\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n <label className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Move\n <select\n className=\"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs\"\n defaultValue={t.stage}\n onChange={(e) => {\n const to = e.target.value as TicketStage;\n startTransition(() => {\n move(t, to)\n .then(() => router.refresh())\n .catch((err) => setError(err.message));\n });\n }}\n >\n {STAGES.map((s) => (\n <option key={s.key} value={s.key}>\n {s.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n </div>\n ))}\n </div>\n </section>\n ))}\n </div>\n\n <p className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Source of truth: development-team markdown tickets (via openclaw recipes move-ticket).\n </p>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/tickets/TicketsBoardClient.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState } from \"react\";\nimport type { TicketStage, TicketSummary } from \"@/lib/tickets\";\n\nconst STAGES: { key: TicketStage; label: string }[] = [\n { key: \"backlog\", label: \"Backlog\" },\n { key: \"in-progress\", label: \"In progress\" },\n { key: \"testing\", label: \"Testing\" },\n { key: \"done\", label: \"Done\" },\n];\n\ntype DateFilter = \"all\" | \"today\" | \"yesterday\" | \"7d\" | \"30d\" | \"custom\";\nconst DATE_FILTERS: { key: DateFilter; label: string }[] = [\n { key: \"all\", label: \"All\" },\n { key: \"today\", label: \"Today\" },\n { key: \"yesterday\", label: \"Yesterday\" },\n { key: \"7d\", label: \"Last 7 days\" },\n { key: \"30d\", label: \"Last 30 days\" },\n { key: \"custom\", label: \"Custom range\" },\n];\n\nfunction startOfLocalDay(d: Date) {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0, 0, 0);\n}\n\nfunction parseDateInput(value: string): Date | null {\n if (!value) return null;\n const m = value.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n if (!m) return null;\n const y = Number(m[1]);\n const mo = Number(m[2]) - 1;\n const day = Number(m[3]);\n const d = new Date(y, mo, day, 0, 0, 0, 0);\n return Number.isFinite(d.getTime()) ? d : null;\n}\n\nfunction formatAge(hours: number) {\n if (hours < 1) return `${Math.max(1, Math.round(hours * 60))}m`;\n if (hours < 48) return `${Math.round(hours)}h`;\n return `${Math.round(hours / 24)}d`;\n}\n\nexport function TicketsBoardClient({\n tickets,\n basePath,\n}: {\n tickets: TicketSummary[];\n basePath: string;\n}) {\n const [dateFilter, setDateFilter] = useState<DateFilter>(\"30d\");\n const [customFrom, setCustomFrom] = useState<string>(\"\");\n const [customTo, setCustomTo] = useState<string>(\"\");\n\n const filteredTickets = useMemo(() => {\n if (dateFilter === \"all\") return tickets;\n\n const now = new Date();\n const todayStart = startOfLocalDay(now);\n const yesterdayStart = new Date(todayStart);\n yesterdayStart.setDate(yesterdayStart.getDate() - 1);\n\n let from: Date | null = null;\n let toExclusive: Date | null = null;\n\n if (dateFilter === \"today\") {\n from = todayStart;\n toExclusive = new Date(todayStart);\n toExclusive.setDate(toExclusive.getDate() + 1);\n } else if (dateFilter === \"yesterday\") {\n from = yesterdayStart;\n toExclusive = todayStart;\n } else if (dateFilter === \"7d\") {\n from = new Date(todayStart);\n from.setDate(from.getDate() - 6); // include today\n } else if (dateFilter === \"30d\") {\n from = new Date(todayStart);\n from.setDate(from.getDate() - 29); // include today\n } else if (dateFilter === \"custom\") {\n from = parseDateInput(customFrom);\n const to = parseDateInput(customTo);\n if (to) {\n toExclusive = new Date(to);\n toExclusive.setDate(toExclusive.getDate() + 1);\n }\n }\n\n return tickets.filter((t) => {\n const updated = new Date(t.updatedAt);\n if (!Number.isFinite(updated.getTime())) return false;\n if (from && updated < from) return false;\n if (toExclusive && updated >= toExclusive) return false;\n return true;\n });\n }, [tickets, dateFilter, customFrom, customTo]);\n\n const byStage = useMemo(() => {\n const map: Record<TicketStage, TicketSummary[]> = {\n backlog: [],\n \"in-progress\": [],\n testing: [],\n done: [],\n };\n for (const t of filteredTickets) map[t.stage].push(t);\n for (const s of Object.keys(map) as TicketStage[]) {\n map[s].sort((a, b) => a.number - b.number);\n }\n return map;\n }, [filteredTickets]);\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Tickets</h1>\n\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"text-xs text-[color:var(--ck-text-secondary)]\">\n Time\n <select\n className=\"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs\"\n value={dateFilter}\n onChange={(e) => setDateFilter(e.target.value as DateFilter)}\n >\n {DATE_FILTERS.map((f) => (\n <option key={f.key} value={f.key}>\n {f.label}\n </option>\n ))}\n </select>\n </label>\n\n {dateFilter === \"custom\" ? (\n <div className=\"flex flex-wrap items-center gap-2\">\n <label className=\"text-xs text-[color:var(--ck-text-secondary)]\">\n From\n <input\n type=\"date\"\n value={customFrom}\n onChange={(e) => setCustomFrom(e.target.value)}\n className=\"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs\"\n />\n </label>\n <label className=\"text-xs text-[color:var(--ck-text-secondary)]\">\n To\n <input\n type=\"date\"\n value={customTo}\n onChange={(e) => setCustomTo(e.target.value)}\n className=\"ml-2 rounded border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-xs\"\n />\n </label>\n </div>\n ) : null}\n </div>\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-4\">\n {STAGES.map(({ key, label }) => (\n <section key={key} className=\"ck-glass p-3\">\n <div className=\"mb-3 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold tracking-tight\">{label}</h2>\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{byStage[key].length}</span>\n </div>\n\n <div className=\"space-y-2\">\n {byStage[key].length === 0 ? (\n <div className=\"rounded-[var(--ck-radius-sm)] border border-dashed border-[color:var(--ck-border-subtle)] p-3 text-xs text-[color:var(--ck-text-tertiary)]\">\n Empty\n </div>\n ) : null}\n\n {byStage[key].map((t) => (\n <div\n key={t.id}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass-strong)] p-3\"\n >\n <a\n href={`${basePath}/${encodeURIComponent(t.id)}`}\n className=\"block text-sm font-medium text-[color:var(--ck-text-primary)] hover:underline\"\n >\n {String(t.number).padStart(4, \"0\")} — {t.title}\n </a>\n <div className=\"mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <span>{t.owner ? `Owner: ${t.owner}` : \"Owner: —\"}</span>\n <span>·</span>\n <span>Age: {formatAge(t.ageHours)}</span>\n </div>\n </div>\n ))}\n </div>\n </section>\n ))}\n </div>\n\n <p className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Source of truth: ticket markdown files in the team workspace.\n </p>\n </div>\n );\n}\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OAGA,IAAM,EAAgD,CACpD,CAAE,IAAK,UAAW,MAAO,SAAU,EACnC,CAAE,IAAK,cAAe,MAAO,aAAc,EAC3C,CAAE,IAAK,UAAW,MAAO,SAAU,EACnC,CAAE,IAAK,OAAQ,MAAO,MAAO,EAC9B,CAGK,EAAqD,CACzD,CAAE,IAAK,MAAO,MAAO,KAAM,EAC3B,CAAE,IAAK,QAAS,MAAO,OAAQ,EAC/B,CAAE,IAAK,YAAa,MAAO,WAAY,EACvC,CAAE,IAAK,KAAM,MAAO,aAAc,EAClC,CAAE,IAAK,MAAO,MAAO,cAAe,EACpC,CAAE,IAAK,SAAU,MAAO,cAAe,EACxC,CAMD,SAAS,EAAe,CAAa,EACnC,GAAI,CAAC,EAAO,OAAO,KACnB,IAAM,EAAI,EAAM,KAAK,CAAC,6BACtB,GAAI,CAAC,EAAG,OAAO,KACf,IAGM,EAHA,AAGI,IAAI,KAHJ,AAGS,GAAG,IAAI,AAHT,CAAC,CAAC,EAAE,EACV,OAAO,CAAC,CAAC,EAAE,EAAI,EACd,OAAO,CAAC,CAAC,EAAE,EACQ,EAAG,EAAG,EAAG,GACxC,OAAO,OAAO,QAAQ,CAAC,EAAE,OAAO,IAAM,EAAI,IAC5C,CAQO,SAAS,EAAmB,SACjC,CAAO,UACP,CAAQ,CAIT,EACC,GAAM,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAa,OACnD,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAC/C,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAE3C,EAAkB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,WAC9B,GAAmB,QAAf,EAAsB,OAAO,EAGjC,IAAM,EAnCD,IAAI,KAAK,CADO,CAAO,AAoCT,CADP,IAAI,MAlCA,KAmCmB,MAnCR,GAAI,EAAE,QAAQ,GAAI,EAAE,OAAO,GAAI,EAAG,EAAG,EAAG,GAoC7D,EAAiB,IAAI,KAAK,GAChC,EAAe,OAAO,CAAC,EAAe,OAAO,GAAK,GAElD,IAAI,EAAoB,KACpB,EAA2B,KAE/B,GAAmB,SAAS,CAAxB,EACF,EAAO,EAEP,CADA,EAAc,IAAI,KAAK,EAAA,EACX,OAAO,CAAC,EAAY,OAAO,GAAK,QACvC,GAAmB,aAAa,CAA5B,EACT,EAAO,EACP,EAAc,OACT,GAAmB,MAAM,CAArB,EAET,CADA,EAAO,IAAI,KAAK,EAAA,EACX,OAAO,CAAC,EAAK,OAAO,GAAK,IAAI,IAC7B,GAAmB,OAAO,CAAtB,CADyC,CAGlD,CADA,EAAO,IAAI,KAAK,EAAA,EACX,OAAO,CAAC,EAAK,OAAO,GAAK,KAAK,IAC9B,GAAmB,AAAf,SAD0C,IACjB,CAClC,EAAO,EAAe,GACtB,IAAM,EAAK,EAAe,GACtB,GAEF,CAFM,AACN,EAAc,IAAI,KAAK,EAAA,EACX,OAAO,CAAC,EAAY,OAAO,GAAK,EAEhD,CAEA,OAAO,EAAQ,MAAM,CAAC,AAAC,IACrB,IAAM,EAAU,IAAI,KAAK,EAAE,SAAS,SAChC,CAAC,OAAO,QAAQ,CAAC,EAAQ,OAAO,KAAK,EACrC,KAD4C,AACpC,EAAU,CAAA,CAAA,GAAM,CACxB,KAAe,CADgB,GACL,CAAA,CAAA,CAEhC,EAF6C,AAG/C,EAAG,CAAC,EAAS,EAHyC,AAG7B,EAAY,EAAS,EAExC,EAAU,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACtB,IAAM,EAA4C,CAChD,QAAS,EAAE,CACX,cAAe,EAAE,CACjB,QAAS,EAAE,CACX,KAAM,EAAE,AACV,EACA,IAAK,IAAM,KAAK,EAAiB,CAAG,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GACnD,IAAK,IAAM,KAAK,OAAO,IAAI,CAAC,GAC1B,CAAG,CAD8C,AAC7C,EAAE,CAAC,IAAI,CAAC,CAAC,EAAG,IAAM,EAAE,MAAM,CAAG,EAAE,MAAM,EAE3C,OAAO,CACT,EAAG,CAAC,EAAgB,EAEpB,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iDAAwC,YAEtD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,0DAAgD,OAE/D,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,UAAU,8FACV,MAAO,EACP,SAAW,AAAD,GAAO,EAAc,EAAE,MAAM,CAAC,KAAK,WAE5C,EAAa,GAAG,CAAC,AAAC,GACjB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAmB,MAAO,EAAE,GAAG,UAC7B,EAAE,KAAK,EADG,EAAE,GAAG,QAOR,WAAf,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,0DAAgD,OAE/D,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,UAAU,mGAGd,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,0DAAgD,KAE/D,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EACP,SAAU,AAAC,GAAM,EAAY,EAAE,MAAM,CAAC,KAAK,EAC3C,UAAU,sGAId,WAIR,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qCACZ,EAAO,GAAG,CAAC,CAAC,KAAE,CAAG,OAAE,CAAK,CAAE,GACzB,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAkB,UAAU,yBAC3B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mDACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,gDAAwC,IACtD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,wDAAgD,CAAO,CAAC,EAAI,CAAC,MAAM,MAGrF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACY,IAAxB,CAAO,CAAC,EAAI,CAAC,MAAM,CAClB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sJAA6I,UAG1J,KAEH,CAAO,CAAC,EAAI,CAAC,GAAG,CAAE,AAAD,QAtIb,KAAa,GAuIhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAEC,UAAU,iIAEV,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CACC,KAAM,CAAA,EAAG,EAAS,CAAC,EAAE,mBAAmB,EAAE,EAAE,EAAA,CAAG,CAC/C,UAAU,0FAET,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAG,KAAK,MAAI,EAAE,KAAK,IAEhD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2GACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAM,EAAE,KAAK,CAAG,CAAC,OAAO,EAAE,EAAE,KAAK,CAAA,CAAE,CAAG,aACvC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,MACN,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,QAnJpB,AAAJ,GAmJwC,EAAE,QAAQ,EAnJtC,EAAU,CAAP,AAAO,EAAG,KAAK,GAAG,CAAC,EAAG,KAAK,KAAK,CAAS,GAAR,IAAa,CAAC,CAAC,CAC3D,EAAQ,GAAW,CAAP,AAAO,EAAG,KAAK,KAAK,CAAC,GAAO,CAAC,CAAC,CACvC,CAAA,EAAG,KAAK,KAAK,CAAC,EAAQ,IAAI,CAAC,CAAC,SAqId,EAAE,EAAE,SAfH,MAoClB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,wDAA+C,oEAKlE"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
module.exports=[74621,a=>{"use strict";function b(a){return a instanceof Error?a.message:String(a)}a.s(["errorMessage",()=>b])},83856,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(74621);function h(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function i({teamId:a}){let i=(0,e.useRouter)(),[j,k]=(0,c.useState)([]),[l,m]=(0,c.useState)(!0),[n,o]=(0,c.useState)(!1),[p,q]=(0,c.useState)(""),[r,s]=(0,c.useState)(""),[t,u]=(0,c.useState)({}),[v,w]=(0,c.useState)({}),[x,y]=(0,c.useState)(""),[z,A]=(0,c.useState)(""),[B,C]=(0,c.useState)(null),[D,E]=(0,c.useState)(""),[F,G]=(0,c.useState)(""),[H,I]=(0,c.useState)(!1),J=(0,c.useCallback)(async b=>{let c=!!b?.quiet;q(""),c||m(!0);try{let b=await (0,f.fetchJson)(`/api/teams/workflows?teamId=${encodeURIComponent(a)}`,{cache:"no-store"});if(!b.ok)throw Error("Failed to load workflows");let c=(Array.isArray(b.files)?b.files:[]).map(a=>a.endsWith(".workflow.json")?a.slice(0,-14):null).filter(a=>!!a);k(c.map(a=>({id:a,name:a})))}catch(a){q((0,g.errorMessage)(a))}finally{c||m(!1)}},[a]);async function K(){o(!0);try{await J({quiet:!0})}finally{o(!1)}}async function L(b){if(confirm(`Delete workflow “${b}”? This removes the .workflow.json file from the team workspace.`)){q("");try{let c=await (0,f.fetchJson)(`/api/teams/workflows?teamId=${encodeURIComponent(a)}&id=${encodeURIComponent(b)}`,{method:"DELETE"});if(!c.ok)throw Error(c.error||"Failed to delete workflow");await J({quiet:!0}),r===b&&(s(""),y(""),C(null))}catch(a){q((0,g.errorMessage)(a))}}}async function M(b){w(a=>({...a,[b]:!0})),E("");try{let c=await (0,f.fetchJson)(`/api/teams/workflow-runs?teamId=${encodeURIComponent(a)}&workflowId=${encodeURIComponent(b)}`,{cache:"no-store"});if(!c.ok)throw Error(c.error||"Failed to load runs");let d=(Array.isArray(c.files)?c.files:[]).map(a=>"string"==typeof a&&a.endsWith(".run.json")?a.slice(0,-9):null).filter(a=>!!a);u(a=>({...a,[b]:d}))}catch(a){E((0,g.errorMessage)(a)),u(a=>({...a,[b]:[]}))}finally{w(a=>({...a,[b]:!1}))}}async function N(b,c){A(b),y(c),C(null),E(""),G("");try{let d=await (0,f.fetchJson)(`/api/teams/workflow-runs?teamId=${encodeURIComponent(a)}&workflowId=${encodeURIComponent(b)}&runId=${encodeURIComponent(c)}`,{cache:"no-store"});if(!d.ok)throw Error(d.error||"Failed to load run");let e=h(d.run)?d.run:null;if(!e)throw Error("Invalid run format");C({id:String(e.id??c),status:"string"==typeof e.status?e.status:void 0,startedAt:"string"==typeof e.startedAt?e.startedAt:void 0,finishedAt:"string"==typeof e.finishedAt?String(e.finishedAt):void 0,meta:e.meta,memoryUsed:e.memoryUsed,approval:e.approval,raw:e})}catch(a){E((0,g.errorMessage)(a)),C(null)}}async function O(b){if(confirm(`Add workflow from template “${b}”?`)){q("");try{let c=await (0,f.fetchJson)("/api/teams/workflow-templates",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({teamId:a,templateId:b})});if(!c.ok)throw Error(c.error||"Failed to apply template");let d=String(c.workflowId??"").trim();if(!d)throw Error("Template applied but workflowId missing");await J({quiet:!0}),i.push(`/teams/${encodeURIComponent(a)}/workflows/${encodeURIComponent(d)}`)}catch(a){q((0,g.errorMessage)(a))}}}(0,c.useEffect)(()=>{J()},[J]);let P=(0,c.useMemo)(()=>{if(!B)return[];let a=B.memoryUsed??(h(B.meta)?B.meta.memoryUsed:void 0);return Array.isArray(a)?a.map(a=>h(a)?a:null).filter(Boolean).map(a=>({ts:String(a.ts??"").trim(),author:String(a.author??"").trim(),type:String(a.type??"").trim(),content:String(a.content??"").trim(),source:a.source})).filter(a=>a.ts&&a.author&&a.type&&a.content):[]},[B]);return l?(0,b.jsx)("div",{className:"ck-glass p-4",children:"Loading workflows…"}):(0,b.jsxs)("div",{className:"ck-glass p-6",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold",children:"Workflows (file-first)"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Stored in ",(0,b.jsx)("code",{children:"shared-context/workflows/<id>.workflow.json"})," inside the team workspace."]}),(0,b.jsxs)("div",{className:"mt-3 flex flex-wrap items-center justify-start gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:()=>{let b=`new-${Date.now()}`;i.push(`/teams/${encodeURIComponent(a)}/workflows/${encodeURIComponent(b)}?draft=1`)},className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]",children:"Add workflow"}),(0,b.jsx)("button",{type:"button",onClick:()=>void O("marketing-cadence-v1"),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Add Marketing Cadence template"}),(0,b.jsx)("button",{type:"button",onClick:K,disabled:n,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-60",children:n?"Refreshing…":"Refresh"})]})]}),p?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-4 text-sm text-red-100",children:p}):null,0===j.length?(0,b.jsx)("p",{className:"mt-4 text-sm text-[color:var(--ck-text-secondary)]",children:"No workflows yet."}):(0,b.jsx)("ul",{className:"mt-4 divide-y divide-white/10 overflow-hidden rounded-[var(--ck-radius-sm)] border border-white/10",children:j.map(c=>{let e=r===c.id,f=t[c.id]??[],i=!!v[c.id];return(0,b.jsxs)("li",{className:"bg-white/5",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3 px-4 py-3",children:[(0,b.jsxs)("button",{type:"button",onClick:async()=>{let a=e?"":c.id;s(a),y(""),C(null),E(""),a&&await M(a)},className:"min-w-0 flex-1 text-left",children:[(0,b.jsx)("div",{className:"truncate text-sm font-medium text-[color:var(--ck-text-primary)]",children:c.name||c.id}),(0,b.jsx)("div",{className:"truncate text-xs text-[color:var(--ck-text-tertiary)]",children:c.id}),(0,b.jsxs)("div",{className:"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]",children:["Click to ",e?"collapse":"expand"," run details"]})]}),(0,b.jsxs)("div",{className:"flex shrink-0 items-center gap-2",children:[(0,b.jsx)(d.default,{href:`/teams/${encodeURIComponent(a)}/workflows/${encodeURIComponent(c.id)}`,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Edit"}),(0,b.jsx)("button",{type:"button",onClick:()=>void L(c.id),className:"rounded-[var(--ck-radius-sm)] border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)]",children:"Delete"})]})]}),e?(0,b.jsxs)("div",{className:"border-t border-white/10 bg-black/20 px-4 py-3",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Runs"}),(0,b.jsx)("button",{type:"button",disabled:i,onClick:()=>void M(c.id),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-60",children:i?"Loading…":"Refresh runs"})]}),D?(0,b.jsx)("div",{className:"mt-2 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100",children:D}):null,(0,b.jsxs)("div",{className:"mt-2 grid grid-cols-1 gap-3 lg:grid-cols-2",children:[(0,b.jsx)("div",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-2",children:f.length?(0,b.jsx)("div",{className:"space-y-1",children:f.slice(0,8).map(a=>{let d=x===a;return(0,b.jsx)("button",{type:"button",onClick:()=>void N(c.id,a),className:d?"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-primary)]":"w-full rounded-[var(--ck-radius-sm)] px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-secondary)] hover:bg-white/5",children:(0,b.jsx)("span",{className:"font-mono",children:a})},a)})}):(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"No runs yet."})}),(0,b.jsx)("div",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3",children:B?(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Run detail"}),(0,b.jsxs)("div",{className:"mt-1 text-[11px] text-[color:var(--ck-text-tertiary)]",children:[(0,b.jsx)("span",{className:"font-mono",children:B.id}),B.status?(0,b.jsxs)("span",{children:[" • ",B.status]}):null]})]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-3",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Approval"}),(()=>{let c=B.approval;if(!h(c))return(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"(No approval info recorded.)"});let d=String(c.state??"").trim(),e="string"==typeof c.requestedAt?c.requestedAt:"",f="string"==typeof c.decidedAt?c.decidedAt:"",i="string"==typeof c.decidedBy?c.decidedBy:"",j="string"==typeof c.note?c.note:"",k=h(c.outbound)?c.outbound:null,l="pending"===d||"waiting_for_approval"===B.status;return(0,b.jsxs)("div",{className:"mt-2 space-y-2",children:[(0,b.jsxs)("div",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-[11px] text-[color:var(--ck-text-secondary)]",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-mono",children:"state"}),": ",(0,b.jsx)("span",{className:"font-mono text-[color:var(--ck-text-primary)]",children:d||"(unknown)"})]}),e?(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-mono",children:"requestedAt"}),": ",(0,b.jsx)("span",{className:"font-mono",children:e})]}):null,f?(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-mono",children:"decidedAt"}),": ",(0,b.jsx)("span",{className:"font-mono",children:f})]}):null,i?(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"font-mono",children:"decidedBy"}),": ",(0,b.jsx)("span",{className:"font-mono",children:i})]}):null,j?(0,b.jsx)("div",{className:"mt-1 whitespace-pre-wrap text-xs text-[color:var(--ck-text-primary)]",children:j}):null,k?(0,b.jsxs)("div",{className:"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 text-[10px]",children:[(0,b.jsx)("div",{className:"text-[color:var(--ck-text-tertiary)]",children:"Outbound"}),(0,b.jsx)("pre",{className:"mt-1 overflow-auto whitespace-pre-wrap",children:JSON.stringify(k,null,2)})]}):null]}),l?(0,b.jsxs)("div",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-2",children:[(0,b.jsx)("div",{className:"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:"approval note (optional)"}),(0,b.jsx)("textarea",{value:F,onChange:a=>G(a.target.value),rows:3,className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]",placeholder:"e.g. Ship it / please tweak hook"}),(0,b.jsx)("div",{className:"mt-2 flex flex-wrap gap-2",children:[{action:"approve",label:"Approve"},{action:"request_changes",label:"Request changes"},{action:"cancel",label:"Cancel"}].map(c=>(0,b.jsx)("button",{type:"button",disabled:H,onClick:async()=>{if(z&&x&&confirm(`${c.label} run ${x}?`)){I(!0),E("");try{let b=await fetch("/api/teams/workflow-runs",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({teamId:a,workflowId:z,runId:x,action:c.action,note:F||void 0,decidedBy:"ClawKitchen UI"})}),d=await b.json();if(!b.ok||!d.ok)throw Error(d.error||"Failed to apply approval action");await N(z,x)}catch(a){E((0,g.errorMessage)(a))}finally{I(!1)}}},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-60",children:c.label},c.action))})]}):null]})})()]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-3",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Memory used in this run"}),P.length?(0,b.jsx)("div",{className:"mt-2 space-y-2",children:P.slice(0,20).map((a,c)=>(0,b.jsxs)("div",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2",children:[(0,b.jsxs)("div",{className:"text-[10px] text-[color:var(--ck-text-tertiary)]",children:[(0,b.jsx)("span",{className:"font-mono",children:a.ts})," • ",(0,b.jsx)("span",{className:"font-mono",children:a.type})," • ",(0,b.jsx)("span",{className:"font-mono",children:a.author})]}),(0,b.jsx)("div",{className:"mt-1 whitespace-pre-wrap text-xs text-[color:var(--ck-text-primary)]",children:a.content}),void 0!==a.source?(0,b.jsx)("pre",{className:"mt-2 overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-2 text-[10px] text-[color:var(--ck-text-secondary)]",children:JSON.stringify(a.source,null,2)}):null]},`${a.ts}-${c}`))}):(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["(None recorded yet.)",(0,b.jsxs)("div",{className:"mt-1",children:["Next step: have the workflow runner write an explicit ",(0,b.jsx)("span",{className:"font-mono",children:"memoryUsed[]"})," list into the run file."]})]})]})]}):x?(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-secondary)]",children:"Loading run…"}):(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Select a run to see details."})})]})]}):null]},c.id)})})]})}a.s(["default",()=>i])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_e54f24fb._.js.map
|