@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
|
@@ -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])},3182,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(74621),e=a.i(51200);function f(a){return!!a&&"object"==typeof a&&!Array.isArray(a)}function g({children:a,onClick:c,kind:d,disabled:e}){let f="rounded-[var(--ck-radius-sm)] px-3 py-2 text-sm font-medium transition disabled:opacity-50 ";return"primary"===d?f+="bg-[var(--ck-accent-red)] text-white":"danger"===d?f+="border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] text-[color:var(--ck-accent-red)] hover:bg-[color:rgba(255,59,48,0.12)]":f+="border border-[color:var(--ck-border-subtle)] hover:bg-[color:var(--ck-bg-glass)]",(0,b.jsx)("button",{className:f,onClick:c,disabled:e,children:a})}function h(){let[a,h]=(0,c.useState)({}),[i,j]=(0,c.useState)(!0),[k,l]=(0,c.useState)(null),[m,n]=(0,c.useState)("telegram"),[o,p]=(0,c.useState)('{\n "enabled": true\n}\n'),[q,r]=(0,c.useState)(!1);async function s(){try{let a=await (0,e.fetchJson)("/api/channels/bindings",{cache:"no-store"}),b=f(a.channels)?a.channels:{};return{ok:!0,channels:b}}catch(a){return{ok:!1,error:(0,d.errorMessage)(a)}}}let t=(0,c.useCallback)(async()=>{j(!0),l(null);try{let a=await s();if(!a.ok){l(a.error),h({}),j(!1);return}h(a.channels),j(!1)}catch(a){l((0,d.errorMessage)(a)),h({}),j(!1)}},[]);(0,c.useEffect)(()=>{let a=!1;return(async()=>{if(await t(),a)return})(),()=>{a=!0}},[t]);let u=(0,c.useMemo)(()=>{let b=Object.keys(a);return b.sort(),b.filter(b=>null!=a[b])},[a]);async function v(a,b){try{let c=await (0,e.fetchJson)("/api/channels/bindings",{method:a,headers:{"content-type":"application/json"},body:JSON.stringify(b)});if(!c?.ok)return{ok:!1,error:String(c?.error??`Failed to ${"PUT"===a?"save":"delete"}`)};return{ok:!0}}catch(a){return{ok:!1,error:(0,d.errorMessage)(a)}}}async function w(){let a;r(!0),l(null);try{a=JSON.parse(o)}catch{l("Config must be valid JSON"),r(!1);return}if(!f(a)){l("Config must be a JSON object"),r(!1);return}let b=await v("PUT",{provider:m.trim(),config:a});if(!b.ok){l(b.error),r(!1);return}await t(),r(!1)}async function x(a){if(!window.confirm(`Delete channel binding "${a}"?`))return;r(!0),l(null);let b=await v("DELETE",{provider:a});if(!b.ok){l(b.error),r(!1);return}await t(),r(!1)}let y=(0,c.useMemo)(()=>{let b=a[m];return f(b)?b:null},[a,m]);return(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Channels"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Source of truth: OpenClaw gateway config (patched via ",(0,b.jsx)("code",{className:"font-mono",children:"gateway config.patch"}),"). Some changes may require a gateway restart depending on provider."]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(g,{onClick:()=>void t(),disabled:q,children:"Refresh"}),(0,b.jsx)(g,{kind:"primary",onClick:function(){let a=String(window.prompt("Provider id (e.g. telegram)","telegram")??"").trim();a&&(n(a),p('{\n "enabled": true\n}\n'))},disabled:q,children:"Add binding"})]})]}),k?(0,b.jsx)("div",{className:"ck-glass p-4 text-sm text-red-300",children:k}):null,(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsxs)("div",{className:"ck-glass p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium",children:"Bindings"}),i&&(0,b.jsx)("div",{className:"mt-3 text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}),!i&&0===u.length&&(0,b.jsx)("div",{className:"mt-3 text-sm text-[color:var(--ck-text-secondary)]",children:"No bindings configured."}),!i&&u.length>0&&(0,b.jsx)("div",{className:"mt-3 space-y-2",children:u.map(c=>(0,b.jsxs)("button",{className:"flex w-full items-center justify-between rounded-[var(--ck-radius-sm)] border px-3 py-2 text-left text-sm "+(c===m?"border-[var(--ck-accent-red)] bg-[color:var(--ck-bg-glass)]":"border-[color:var(--ck-border-subtle)] hover:bg-[color:var(--ck-bg-glass)]"),onClick:()=>{n(c),p(JSON.stringify(a[c]??{},null,2)+"\n")},children:[(0,b.jsx)("span",{className:"font-mono",children:c}),(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"edit"})]},c))})]}),(0,b.jsxs)("div",{className:"ck-glass p-4 lg:col-span-2",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-sm font-medium",children:"Edit"}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Provider: ",(0,b.jsx)("code",{className:"font-mono",children:m})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)(g,{kind:"danger",onClick:()=>void x(m),disabled:q,children:"Delete"}),(0,b.jsx)(g,{kind:"primary",onClick:()=>void w(),disabled:q,children:q?"Saving…":"Save"})]})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Config (JSON)"}),(0,b.jsx)("textarea",{value:o,onChange:a=>p(a.target.value),className:"mt-2 h-[420px] w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 font-mono text-sm",placeholder:'{\n "enabled": true\n}'}),(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["Validation:",(0,b.jsxs)("ul",{className:"list-disc pl-5",children:[(0,b.jsxs)("li",{children:["Telegram requires ",(0,b.jsx)("code",{className:"font-mono",children:"botToken"}),"."]}),(0,b.jsx)("li",{children:"Other providers can be edited as raw JSON in v1."})]})]}),y?(0,b.jsxs)("div",{className:"mt-3 text-xs text-[color:var(--ck-text-tertiary)]",children:["Current keys: ",(0,b.jsx)("code",{className:"font-mono",children:Object.keys(y).join(", ")||"(none)"})]}):null]})]})]})]})}a.s(["default",()=>h],3182)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_13139e3d._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/errors.ts","../../../../src/app/channels/channels-client.tsx","../../../../src/lib/type-guards.ts"],"sourcesContent":["/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { isRecord } from \"@/lib/type-guards\";\n\ntype ChannelConfig = Record<string, unknown>;\n\ntype ChannelsResponse = {\n ok: boolean;\n channels?: Record<string, unknown>;\n error?: string;\n};\n\nfunction Button({\n children,\n onClick,\n kind,\n disabled,\n}: {\n children: React.ReactNode;\n onClick: () => void;\n kind?: \"primary\" | \"danger\";\n disabled?: boolean;\n}) {\n let base = \"rounded-[var(--ck-radius-sm)] px-3 py-2 text-sm font-medium transition disabled:opacity-50 \";\n if (kind === \"primary\") base += \"bg-[var(--ck-accent-red)] text-white\";\n else if (kind === \"danger\")\n base +=\n \"border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] text-[color:var(--ck-accent-red)] hover:bg-[color:rgba(255,59,48,0.12)]\";\n else base += \"border border-[color:var(--ck-border-subtle)] hover:bg-[color:var(--ck-bg-glass)]\";\n return (\n <button className={base} onClick={onClick} disabled={disabled}>\n {children}\n </button>\n );\n}\n\nexport default function ChannelsClient() {\n const [channels, setChannels] = useState<Record<string, unknown>>({});\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const [provider, setProvider] = useState<string>(\"telegram\");\n const [configJson, setConfigJson] = useState<string>(\"{\\n \\\"enabled\\\": true\\n}\\n\");\n const [saving, setSaving] = useState(false);\n\n async function fetchBindings(): Promise<{ ok: true; channels: Record<string, unknown> } | { ok: false; error: string }> {\n try {\n const data = await fetchJson<ChannelsResponse>(\"/api/channels/bindings\", { cache: \"no-store\" });\n const ch = isRecord(data.channels) ? data.channels : {};\n return { ok: true, channels: ch };\n } catch (e: unknown) {\n return { ok: false, error: errorMessage(e) };\n }\n }\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await fetchBindings();\n if (!result.ok) {\n setError(result.error);\n setChannels({});\n setLoading(false);\n return;\n }\n setChannels(result.channels);\n setLoading(false);\n } catch (e: unknown) {\n const msg = errorMessage(e);\n setError(msg);\n setChannels({});\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n await refresh();\n if (cancelled) return;\n })();\n return () => {\n cancelled = true;\n };\n }, [refresh]);\n\n const providers = useMemo(() => {\n const keys = Object.keys(channels);\n keys.sort();\n return keys.filter((k) => channels[k] != null);\n }, [channels]);\n\n function selectProvider(p: string) {\n setProvider(p);\n const cfg = channels[p];\n setConfigJson(JSON.stringify(cfg ?? {}, null, 2) + \"\\n\");\n }\n\n async function mutate(\n method: \"PUT\" | \"DELETE\",\n body: { provider: string; config?: Record<string, unknown> }\n ): Promise<{ ok: true } | { ok: false; error: string }> {\n try {\n const data = await fetchJson<ChannelsResponse>(\"/api/channels/bindings\", {\n method,\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n if (!data?.ok) return { ok: false, error: String(data?.error ?? `Failed to ${method === \"PUT\" ? \"save\" : \"delete\"}`) };\n return { ok: true };\n } catch (e: unknown) {\n return { ok: false, error: errorMessage(e) };\n }\n }\n\n async function upsert() {\n setSaving(true);\n setError(null);\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(configJson);\n } catch {\n setError(\"Config must be valid JSON\");\n setSaving(false);\n return;\n }\n if (!isRecord(parsed)) {\n setError(\"Config must be a JSON object\");\n setSaving(false);\n return;\n }\n\n const result = await mutate(\"PUT\", { provider: provider.trim(), config: parsed });\n if (!result.ok) {\n setError(result.error);\n setSaving(false);\n return;\n }\n await refresh();\n setSaving(false);\n }\n\n async function remove(p: string) {\n if (!window.confirm(`Delete channel binding \"${p}\"?`)) return;\n\n setSaving(true);\n setError(null);\n\n const result = await mutate(\"DELETE\", { provider: p });\n if (!result.ok) {\n setError(result.error);\n setSaving(false);\n return;\n }\n await refresh();\n setSaving(false);\n }\n\n function addBinding() {\n const p = window.prompt(\"Provider id (e.g. telegram)\", \"telegram\");\n const next = String(p ?? \"\").trim();\n if (!next) return;\n setProvider(next);\n setConfigJson(\"{\\n \\\"enabled\\\": true\\n}\\n\");\n }\n\n const selectedConfig = useMemo(() => {\n const v = channels[provider];\n return isRecord(v) ? (v as ChannelConfig) : null;\n }, [channels, provider]);\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Channels</h1>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n Source of truth: OpenClaw gateway config (patched via <code className=\"font-mono\">gateway config.patch</code>).\n Some changes may require a gateway restart depending on provider.\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button onClick={() => void refresh()} disabled={saving}>\n Refresh\n </Button>\n <Button kind=\"primary\" onClick={addBinding} disabled={saving}>\n Add binding\n </Button>\n </div>\n </div>\n\n {error ? <div className=\"ck-glass p-4 text-sm text-red-300\">{error}</div> : null}\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className=\"ck-glass p-4\">\n <div className=\"text-sm font-medium\">Bindings</div>\n {loading && <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div>}\n {!loading && providers.length === 0 && (\n <div className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">No bindings configured.</div>\n )}\n {!loading && providers.length > 0 && (\n <div className=\"mt-3 space-y-2\">\n {providers.map((p) => (\n <button\n key={p}\n className={\n \"flex w-full items-center justify-between rounded-[var(--ck-radius-sm)] border px-3 py-2 text-left text-sm \" +\n (p === provider\n ? \"border-[var(--ck-accent-red)] bg-[color:var(--ck-bg-glass)]\"\n : \"border-[color:var(--ck-border-subtle)] hover:bg-[color:var(--ck-bg-glass)]\")\n }\n onClick={() => selectProvider(p)}\n >\n <span className=\"font-mono\">{p}</span>\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">edit</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"ck-glass p-4 lg:col-span-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div>\n <div className=\"text-sm font-medium\">Edit</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Provider: <code className=\"font-mono\">{provider}</code>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button kind=\"danger\" onClick={() => void remove(provider)} disabled={saving}>\n Delete\n </Button>\n <Button kind=\"primary\" onClick={() => void upsert()} disabled={saving}>\n {saving ? \"Saving…\" : \"Save\"}\n </Button>\n </div>\n </div>\n\n <div className=\"mt-4\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Config (JSON)</div>\n <textarea\n value={configJson}\n onChange={(e) => setConfigJson(e.target.value)}\n className=\"mt-2 h-[420px] w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 font-mono text-sm\"\n placeholder={\"{\\n \\\"enabled\\\": true\\n}\"}\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Validation:\n <ul className=\"list-disc pl-5\">\n <li>Telegram requires <code className=\"font-mono\">botToken</code>.</li>\n <li>Other providers can be edited as raw JSON in v1.</li>\n </ul>\n </div>\n\n {selectedConfig ? (\n <div className=\"mt-3 text-xs text-[color:var(--ck-text-tertiary)]\">\n Current keys: <code className=\"font-mono\">{Object.keys(selectedConfig).join(\", \") || \"(none)\"}</code>\n </div>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n );\n}\n","export function isRecord(v: unknown): v is Record<string, unknown> {\n return Boolean(v) && typeof v === \"object\" && !Array.isArray(v);\n}\n"],"names":[],"mappings":"uCAIO,SAAS,EAAa,CAAU,EACrC,OAAO,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,EACjD,qECJA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCJO,SAAS,EAAS,CAAU,EACjC,OAAO,CAAQ,GAAmB,UAAb,OAAO,GAAkB,CAAC,MAAM,OAAO,CAAC,EAC/D,CDaA,SAAS,EAAO,UACd,CAAQ,CACR,SAAO,MACP,CAAI,UACJ,CAAQ,CAMT,EACC,IAAI,EAAO,8FAMX,MALa,YAAT,EAAoB,GAAQ,uCACd,WAAT,EACP,GACE,qJACC,GAAQ,oFAEX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,UAAW,EAAM,QAAS,EAAS,SAAU,WAClD,GAGP,CAEe,SAAS,IACtB,GAAM,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA0B,CAAC,GAC7D,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAE5C,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,YAC3C,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,6BAC/C,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAErC,eAAe,IACb,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAmB,yBAA0B,CAAE,MAAO,UAAW,GACvF,EAAK,EAAS,EAAK,QAAQ,EAAI,EAAK,QAAQ,CAAG,CAAC,EACtD,MAAO,CAAE,GAAI,GAAM,SAAU,CAAG,CAClC,CAAE,MAAO,EAAY,CACnB,MAAO,CAAE,IAAI,EAAO,MAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAG,CAC7C,CACF,CAEA,IAAM,EAAU,CAAA,EAAA,EAAA,WAAA,AAAW,EAAC,UAC1B,GAAW,GACX,EAAS,MACT,GAAI,CACF,IAAM,EAAS,MAAM,IACrB,GAAI,CAAC,EAAO,EAAE,CAAE,CACd,EAAS,EAAO,KAAK,EACrB,EAAY,CAAC,GACb,GAAW,GACX,MACF,CACA,EAAY,EAAO,QAAQ,EAC3B,GAAW,EACb,CAAE,MAAO,EAAY,CAEnB,EADY,CAAA,EAAA,EAAA,EACH,UADG,AAAY,EAAC,IAEzB,EAAY,CAAC,GACb,GAAW,EACb,CACF,EAAG,EAAE,EAEL,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,IAAI,GAAY,EAKhB,MAJA,CAAC,UAEC,GADA,MAAM,IACF,EAAW,OACjB,CAAC,GACM,KACL,GAAY,CACd,CACF,EAAG,CAAC,EAAQ,EAEZ,IAAM,EAAY,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACxB,IAAM,EAAO,OAAO,IAAI,CAAC,GAEzB,OADA,EAAK,IAAI,GACF,EAAK,MAAM,CAAC,AAAC,GAAqB,MAAf,CAAQ,CAAC,EAAE,CACvC,EAAG,CAAC,EAAS,EAQb,eAAe,EACb,CAAwB,CACxB,CAA4D,EAE5D,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAS,AAAT,EAA4B,yBAA0B,QACvE,EACA,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,EACvB,GACA,GAAI,CAAC,GAAM,GAAI,MAAO,CAAE,GAAI,GAAO,MAAO,OAAO,GAAM,OAAS,CAAC,UAAU,EAAa,QAAX,EAAmB,OAAS,SAAA,CAAU,CAAE,EACrH,MAAO,CAAE,IAAI,CAAK,CACpB,CAAE,MAAO,EAAY,CACnB,MAAO,CAAE,IAAI,EAAO,MAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAG,CAC7C,CACF,CAEA,eAAe,QAIT,EAHJ,GAAU,GACV,EAAS,MAGT,GAAI,CACF,EAAS,KAAK,KAAK,CAAC,EACtB,CAAE,KAAM,CACN,EAAS,6BACT,EAAU,IACV,MACF,CACA,GAAI,CAAC,EAAS,GAAS,CACrB,EAAS,gCACT,GAAU,GACV,MACF,CAEA,IAAM,EAAS,MAAM,EAAO,MAAO,CAAE,SAAU,EAAS,IAAI,GAAI,OAAQ,CAAO,GAC/E,GAAI,CAAC,EAAO,EAAE,CAAE,CACd,EAAS,EAAO,KAAK,EACrB,GAAU,GACV,MACF,CACA,MAAM,IACN,EAAU,GACZ,CAEA,eAAe,EAAO,CAAS,EAC7B,GAAI,CAAC,OAAO,OAAO,CAAC,CAAC,wBAAwB,EAAE,EAAE,EAAE,CAAC,EAAG,OAEvD,GAAU,GACV,EAAS,MAET,IAAM,EAAS,MAAM,EAAO,SAAU,CAAE,SAAU,CAAE,GACpD,GAAI,CAAC,EAAO,EAAE,CAAE,CACd,EAAS,EAAO,KAAK,EACrB,GAAU,GACV,MACF,CACA,MAAM,IACN,GAAU,EACZ,CAUA,IAAM,EAAiB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAC7B,IAAM,EAAI,CAAQ,CAAC,EAAS,CAC5B,OAAO,EAAS,GAAM,EAAsB,IAC9C,EAAG,CAAC,EAAU,EAAS,EAEvB,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iDAAwC,aACtD,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,yDACV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,yBAA2B,6EAIjH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,QAAS,IAAM,KAAK,IAAW,SAAU,WAAQ,YAGzD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,KAAK,UAAU,QA3B/B,CA2BwC,QA3B/B,EAEP,IAAM,EAAO,OAAO,AADV,OAAO,MAAM,CAAC,8BAA+B,aAC9B,IAAI,IAAI,GAC5B,IACL,EAAY,AADD,GAEX,EAAc,6BAChB,EAqBoD,SAAU,WAAQ,sBAMjE,EAAQ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6CAAqC,IAAe,KAE5E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+BAAsB,aACpC,GAAW,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,aAC/E,CAAC,GAAW,AAAqB,MAAX,MAAM,EAC3B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAqD,4BAErE,CAAC,GAAW,EAAU,MAAM,CAAG,GAC9B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,EAAU,GAAG,CAAC,AAAC,GACd,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAEC,UACE,8GACC,CAAD,GAAO,EACH,8DACA,4EAAA,CAA4E,CAElF,QAAS,IAAM,CAvH7B,KAEA,EAAc,KAFF,AAEO,SAAS,CAAC,AADjB,CAAQ,CAAC,AAsHuB,EAtHrB,EACa,CAAC,EAAG,KAAM,GAAK,iBAuHrC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,IAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,wDAA+C,WAV1D,SAiBf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+BAAsB,SACrC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,aACvD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,UAG3C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,KAAK,SAAS,QAAS,IAAM,KAAK,EAAO,GAAW,SAAU,WAAQ,WAG9E,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,KAAK,UAAU,QAAS,IAAM,KAAK,IAAU,SAAU,WAC5D,EAAS,UAAY,eAK5B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDAA+C,kBAC9D,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,UAAU,+IACV,YAAa,4BAEf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,cAEjE,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,2BACZ,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,WAAG,qBAAkB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,aAAe,OACjE,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,2DAIP,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,iBACnD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,OAAO,IAAI,CAAC,GAAgB,IAAI,CAAC,OAAS,cAErF,gBAMhB"}
|
|
@@ -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])},40211,a=>{"use strict";function b(a,c=80){let d=String(a??"").toLowerCase().trim(),e=Math.min(d.length,2*c),f="",g=!1;for(let a=0;a<e;a++){let b=d[a];b>="a"&&b<="z"||b>="0"&&b<="9"?(f+=b,g=!1):" "!==b&&"-"!==b&&"_"!==b||g||(f+="-",g=!0)}for(;f.startsWith("-");)f=f.slice(1);for(;f.endsWith("-");)f=f.slice(0,-1);return f.slice(0,c)}a.s(["slugifyId",()=>b])},2561,14878,a=>{"use strict";var b=a.i(87924),c=a.i(72131);function d({children:a,error:c,actions:d}){return(0,b.jsxs)("div",{className:"ck-glass p-6 space-y-4",children:[a,c?(0,b.jsx)("div",{className:"text-sm text-red-300",children:c}):null,d]})}let e="mt-1 w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 text-sm";function f({formState:a,idField:d,updatedAt:f,bodyHeight:g="h-[320px]"}){let{title:h,setTitle:i,status:j,setStatus:k,tagsRaw:l,setTagsRaw:m,teamsRaw:n,setTeamsRaw:o,body:p,setBody:q}=a,r=(0,c.useId)(),s=`${r}-id`,t=`${r}-title`,u=`${r}-status`,v=`${r}-teams`,w=`${r}-tags`,x=`${r}-body`;return(0,b.jsxs)(b.Fragment,{children:[d?(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:s,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"ID"}),(0,b.jsx)("input",{id:s,className:`${e} font-mono`,value:d.id,onChange:a=>d.setId(a.target.value),placeholder:"increase-trial-activation","aria-describedby":`${r}-id-hint`}),(0,b.jsxs)("div",{id:`${r}-id-hint`,className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Lowercase letters, numbers, hyphens. Stored as ",(0,b.jsxs)("code",{className:"font-mono",children:[d.id||"<id>",".md"]}),".",d.suggestedId&&!d.id.trim()?(0,b.jsxs)(b.Fragment,{children:[" ","Suggested:"," ",(0,b.jsx)("button",{type:"button",className:"underline",onClick:()=>d.setId(d.suggestedId??""),children:d.suggestedId})]}):null]})]}):null,(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:t,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Title"}),(0,b.jsx)("input",{id:t,className:e,value:h,onChange:a=>i(a.target.value),placeholder:d?"Increase trial activation":"Goal title"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:u,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Status"}),(0,b.jsxs)("select",{id:u,className:e,value:j,onChange:a=>k(a.target.value),"aria-label":"Goal status",children:[(0,b.jsx)("option",{value:"planned",children:"Planned"}),(0,b.jsx)("option",{value:"active",children:"Active"}),(0,b.jsx)("option",{value:"done",children:"Done"})]})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:v,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Teams (comma-separated)"}),(0,b.jsx)("input",{id:v,className:e,value:n,onChange:a=>o(a.target.value),placeholder:"development-team, marketing-team"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:w,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Tags (comma-separated)"}),(0,b.jsx)("input",{id:w,className:e,value:l,onChange:a=>m(a.target.value),placeholder:"onboarding, growth"})]})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("label",{htmlFor:x,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Body (markdown)"}),null!=f?(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:f?`updated ${new Date(f).toLocaleString()}`:""}):null]}),(0,b.jsx)("textarea",{id:x,className:`mt-1 ${g} w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 font-mono text-sm`,value:p,onChange:a=>q(a.target.value),placeholder:"Write the goal here…"})]})]})}function g(a){return a.split(",").map(a=>a.trim()).filter(Boolean)}function h(a){let[b,d]=(0,c.useState)(a?.title??""),[e,f]=(0,c.useState)(a?.status??"planned"),[h,i]=(0,c.useState)(a?.tagsRaw??""),[j,k]=(0,c.useState)(a?.teamsRaw??""),[l,m]=(0,c.useState)(a?.body??""),n=(0,c.useMemo)(()=>({title:b,setTitle:d,status:e,setStatus:f,tagsRaw:h,setTagsRaw:i,teamsRaw:j,setTeamsRaw:k,body:l,setBody:m}),[b,e,h,j,l]);return{formState:n,tags:(0,c.useMemo)(()=>g(h),[h]),teams:(0,c.useMemo)(()=>g(j),[j])}}a.s(["GoalFormCard",()=>d,"GoalFormFields",()=>f],2561),a.s(["useGoalFormState",()=>h],14878)},37760,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(2561),e=a.i(50944),f=a.i(72131),g=a.i(40211),h=a.i(74621),i=a.i(51200),j=a.i(14878);function k(){let a=(0,e.useRouter)(),[k,l]=(0,f.useState)(""),[m,n]=(0,f.useState)(null),[o,p]=(0,f.useState)(!1),{formState:q,tags:r,teams:s}=(0,j.useGoalFormState)({body:"## Workflow\n<!-- goal-workflow -->\n- Use **Promote to inbox** to send this goal to the development-team inbox for scoping.\n- When promoted, set goal status to **active**.\n- Track implementation work via tickets (add links/IDs under a **Tickets** section in this goal).\n- When development is complete (all associated tickets marked done), set goal status to **done**.\n\n## Tickets\n- (add ticket links/ids)\n"}),{title:t}=q,u=(0,f.useMemo)(()=>{let a=(0,g.slugifyId)(t,64);return a.length>=2?a:""},[t]);async function v(){p(!0),n(null);let b=k.trim();try{await (0,i.fetchJson)("/api/goals",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:b,title:q.title,status:q.status,tags:r,teams:s,body:q.body})}),a.push(`/goals/${encodeURIComponent(b)}`)}catch(a){n((0,h.errorMessage)(a))}finally{p(!1)}}return(0,b.jsxs)("div",{className:"space-y-4",children:[(0,b.jsx)(c.default,{href:"/goals",className:"text-sm font-medium hover:underline",children:"← Back"}),(0,b.jsxs)(d.GoalFormCard,{error:m,actions:(0,b.jsx)("button",{onClick:()=>void v(),disabled:o,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white disabled:opacity-50",children:o?"Creating…":"Create"}),children:[(0,b.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Create goal"}),(0,b.jsx)(d.GoalFormFields,{formState:q,idField:{id:k,setId:l,suggestedId:u||void 0},bodyHeight:"h-[260px]"})]})]})}a.s(["default",()=>k])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_2a73b867._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/errors.ts","../../../../src/lib/slugify.ts","../../../../src/components/GoalFormFields.tsx","../../../../src/lib/goals-client.ts","../../../../src/app/goals/new/page.tsx"],"sourcesContent":["/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","/**\n * Slugify a string for use in ids, file names, or URLs.\n * Normalizes to lowercase, replaces non-alphanumeric sequences with hyphens, trims edges.\n * Uses character-by-character processing to avoid regex ReDoS.\n * @param maxLength - optional max length (default 80). Use 64 for goal ids.\n */\nexport function slugifyId(input: string, maxLength = 80): string {\n const s = String(input ?? \"\").toLowerCase().trim();\n const cap = Math.min(s.length, maxLength * 2);\n let result = \"\";\n let prevHyphen = false;\n for (let i = 0; i < cap; i++) {\n const c = s[i];\n if ((c >= \"a\" && c <= \"z\") || (c >= \"0\" && c <= \"9\")) {\n result += c;\n prevHyphen = false;\n } else if ((c === \" \" || c === \"-\" || c === \"_\") && !prevHyphen) {\n result += \"-\";\n prevHyphen = true;\n }\n }\n while (result.startsWith(\"-\")) result = result.slice(1);\n while (result.endsWith(\"-\")) result = result.slice(0, -1);\n return result.slice(0, maxLength);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport type { GoalFormState, GoalStatus } from \"@/lib/goals-client\";\n\nexport type { GoalFormState };\n\n/** Wraps goal form content with error display and action buttons. */\nexport function GoalFormCard({\n children,\n error,\n actions,\n}: {\n children: ReactNode;\n error: string | null;\n actions: ReactNode;\n}) {\n return (\n <div className=\"ck-glass p-6 space-y-4\">\n {children}\n {error ? <div className=\"text-sm text-red-300\">{error}</div> : null}\n {actions}\n </div>\n );\n}\n\nconst inputClass =\n \"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 text-sm\";\n\ntype Props = {\n formState: GoalFormState;\n /** When provided, renders the ID field (for create flow). */\n idField?: { id: string; setId: (v: string) => void; suggestedId?: string };\n /** When provided, shows updated timestamp next to body label. */\n updatedAt?: string | null;\n /** Body textarea height override (e.g. 260 for new page). */\n bodyHeight?: string;\n};\n\nexport function GoalFormFields({\n formState,\n idField,\n updatedAt,\n bodyHeight = \"h-[320px]\",\n}: Props) {\n const { title, setTitle, status, setStatus, tagsRaw, setTagsRaw, teamsRaw, setTeamsRaw, body, setBody } = formState;\n const baseId = useId();\n const idInputId = `${baseId}-id`;\n const titleInputId = `${baseId}-title`;\n const statusSelectId = `${baseId}-status`;\n const teamsInputId = `${baseId}-teams`;\n const tagsInputId = `${baseId}-tags`;\n const bodyTextareaId = `${baseId}-body`;\n return (\n <>\n {idField ? (\n <div>\n <label htmlFor={idInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n ID\n </label>\n <input\n id={idInputId}\n className={`${inputClass} font-mono`}\n value={idField.id}\n onChange={(e) => idField.setId(e.target.value)}\n placeholder=\"increase-trial-activation\"\n aria-describedby={`${baseId}-id-hint`}\n />\n <div id={`${baseId}-id-hint`} className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Lowercase letters, numbers, hyphens. Stored as <code className=\"font-mono\">{idField.id || \"<id>\"}.md</code>\n .\n {idField.suggestedId && !idField.id.trim() ? (\n <>\n {\" \"}\n Suggested:{\" \"}\n <button type=\"button\" className=\"underline\" onClick={() => idField.setId(idField.suggestedId ?? \"\")}>\n {idField.suggestedId}\n </button>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <div>\n <label htmlFor={titleInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Title\n </label>\n <input\n id={titleInputId}\n className={inputClass}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={idField ? \"Increase trial activation\" : \"Goal title\"}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div>\n <label htmlFor={statusSelectId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Status\n </label>\n <select\n id={statusSelectId}\n className={inputClass}\n value={status}\n onChange={(e) => setStatus(e.target.value as GoalStatus)}\n aria-label=\"Goal status\"\n >\n <option value=\"planned\">Planned</option>\n <option value=\"active\">Active</option>\n <option value=\"done\">Done</option>\n </select>\n </div>\n <div>\n <label htmlFor={teamsInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Teams (comma-separated)\n </label>\n <input\n id={teamsInputId}\n className={inputClass}\n value={teamsRaw}\n onChange={(e) => setTeamsRaw(e.target.value)}\n placeholder=\"development-team, marketing-team\"\n />\n </div>\n <div>\n <label htmlFor={tagsInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Tags (comma-separated)\n </label>\n <input\n id={tagsInputId}\n className={inputClass}\n value={tagsRaw}\n onChange={(e) => setTagsRaw(e.target.value)}\n placeholder=\"onboarding, growth\"\n />\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between\">\n <label htmlFor={bodyTextareaId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Body (markdown)\n </label>\n {updatedAt != null ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {updatedAt ? `updated ${new Date(updatedAt).toLocaleString()}` : \"\"}\n </div>\n ) : null}\n </div>\n <textarea\n id={bodyTextareaId}\n className={`mt-1 ${bodyHeight} w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 font-mono text-sm`}\n value={body}\n onChange={(e) => setBody(e.target.value)}\n placeholder=\"Write the goal here…\"\n />\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\n\n/** Client-safe goal types and utils (no node deps). */\n\nexport type GoalStatus = \"planned\" | \"active\" | \"done\";\n\nexport type GoalFrontmatter = {\n id: string;\n title: string;\n status: GoalStatus;\n tags: string[];\n teams: string[];\n updatedAt: string;\n};\n\n/** Form state shape for GoalFormFields. */\nexport type GoalFormState = {\n title: string;\n setTitle: (v: string) => void;\n status: GoalStatus;\n setStatus: (v: GoalStatus) => void;\n tagsRaw: string;\n setTagsRaw: (v: string) => void;\n teamsRaw: string;\n setTeamsRaw: (v: string) => void;\n body: string;\n setBody: (v: string) => void;\n};\n\n/** Parses comma-separated string into trimmed non-empty array. */\nexport function parseCommaList(raw: string): string[] {\n return raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/** Shared form state for goal create/edit. Returns formState for GoalFormFields and parsed tags/teams. */\nexport function useGoalFormState(initial?: Partial<GoalFormState>): {\n formState: GoalFormState;\n tags: string[];\n teams: string[];\n} {\n const [title, setTitle] = useState(initial?.title ?? \"\");\n const [status, setStatus] = useState<GoalStatus>(initial?.status ?? \"planned\");\n const [tagsRaw, setTagsRaw] = useState(initial?.tagsRaw ?? \"\");\n const [teamsRaw, setTeamsRaw] = useState(initial?.teamsRaw ?? \"\");\n const [body, setBody] = useState(initial?.body ?? \"\");\n\n const formState: GoalFormState = useMemo(\n () => ({\n title,\n setTitle,\n status,\n setStatus,\n tagsRaw,\n setTagsRaw,\n teamsRaw,\n setTeamsRaw,\n body,\n setBody,\n }),\n [title, status, tagsRaw, teamsRaw, body]\n );\n\n const tags = useMemo(() => parseCommaList(tagsRaw), [tagsRaw]);\n const teams = useMemo(() => parseCommaList(teamsRaw), [teamsRaw]);\n\n return { formState, tags, teams };\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { GoalFormCard, GoalFormFields } from \"@/components/GoalFormFields\";\nimport { useRouter } from \"next/navigation\";\nimport { useMemo, useState } from \"react\";\nimport { slugifyId } from \"@/lib/slugify\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { useGoalFormState } from \"@/lib/goals-client\";\n\nexport default function NewGoalPage() {\n const router = useRouter();\n\n const [id, setId] = useState(\"\");\n const [error, setError] = useState<string | null>(null);\n const [saving, setSaving] = useState(false);\n\n const defaultBody =\n \"## Workflow\\n<!-- goal-workflow -->\\n- Use **Promote to inbox** to send this goal to the development-team inbox for scoping.\\n- When promoted, set goal status to **active**.\\n- Track implementation work via tickets (add links/IDs under a **Tickets** section in this goal).\\n- When development is complete (all associated tickets marked done), set goal status to **done**.\\n\\n## Tickets\\n- (add ticket links/ids)\\n\";\n const { formState, tags, teams } = useGoalFormState({ body: defaultBody });\n const { title } = formState;\n\n const suggestedId = useMemo(() => {\n const s = slugifyId(title, 64);\n return s.length >= 2 ? s : \"\";\n }, [title]);\n\n async function create() {\n setSaving(true);\n setError(null);\n const finalId = id.trim();\n try {\n await fetchJson(\"/api/goals\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n id: finalId,\n title: formState.title,\n status: formState.status,\n tags,\n teams,\n body: formState.body,\n }),\n });\n router.push(`/goals/${encodeURIComponent(finalId)}`);\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <Link href=\"/goals\" className=\"text-sm font-medium hover:underline\">\n ← Back\n </Link>\n\n <GoalFormCard\n error={error}\n actions={\n <button\n onClick={() => void create()}\n disabled={saving}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white disabled:opacity-50\"\n >\n {saving ? \"Creating…\" : \"Create\"}\n </button>\n }\n >\n <h1 className=\"text-xl font-semibold tracking-tight\">Create goal</h1>\n <GoalFormFields\n formState={formState}\n idField={{ id, setId, suggestedId: suggestedId || undefined }}\n bodyHeight=\"h-[260px]\"\n />\n </GoalFormCard>\n </div>\n );\n}\n"],"names":[],"mappings":"uCAIO,SAAS,EAAa,CAAU,EACrC,OAAO,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,EACjD,qDCAO,SAAS,EAAU,CAAa,CAAE,EAAY,EAAE,EACrD,IAAM,EAAI,OAAO,GAAS,IAAI,WAAW,GAAG,IAAI,GAC1C,EAAM,KAAK,GAAG,CAAC,EAAE,MAAM,CAAc,EAAZ,GAC3B,EAAS,GACT,GAAa,EACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC5B,IAAM,EAAI,CAAC,CAAC,EAAE,CACT,GAAK,KAAO,GAAK,KAAS,GAAK,KAAO,GAAK,KAAM,AACpD,GAAU,EACV,GAAa,GACG,MAAN,GAAmB,MAAN,GAAmB,GAAG,GAAT,EAAc,CAAC,IACnD,GAAU,IACV,CAF+D,EAElD,EAEjB,CACA,KAAO,EAAO,UAAU,CAAC,MAAM,EAAS,EAAO,KAAK,CAAC,GACrD,KAAO,EAAO,QAAQ,CAAC,MAAM,EAAS,EAAO,KAAK,CAAC,EAAG,CAAC,GACvD,OAAO,EAAO,KAAK,CAAC,EAAG,EACzB,wECrBA,EAAA,EAAA,CAAA,CAAA,OAMO,SAAS,EAAa,UAC3B,CAAQ,OACR,CAAK,SACL,CAAO,CAKR,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACZ,EACA,EAAQ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gCAAwB,IAAe,KAC9D,IAGP,CAEA,IAAM,EACJ,2HAYK,SAAS,EAAe,CAC7B,WAAS,SACT,CAAO,WACP,CAAS,YACT,EAAa,WAAW,CAClB,EACN,GAAM,OAAE,CAAK,UAAE,CAAQ,QAAE,CAAM,WAAE,CAAS,SAAE,CAAO,YAAE,CAAU,UAAE,CAAQ,aAAE,CAAW,MAAE,CAAI,SAAE,CAAO,CAAE,CAAG,EACpG,EAAS,CAAA,EAAA,EAAA,KAAA,AAAK,IACd,EAAY,CAAA,EAAG,EAAO,GAAG,CAAC,CAC1B,EAAe,CAAA,EAAG,EAAO,MAAM,CAAC,CAChC,EAAiB,CAAA,EAAG,EAAO,OAAO,CAAC,CACnC,EAAe,CAAA,EAAG,EAAO,MAAM,CAAC,CAChC,EAAc,CAAA,EAAG,EAAO,KAAK,CAAC,CAC9B,EAAiB,CAAA,EAAG,EAAO,KAAK,CAAC,CACvC,MACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACG,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,QAAS,EAAW,UAAU,wDAA+C,OAGpF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,GAAI,EACJ,UAAW,CAAA,EAAG,EAAW,UAAU,CAAC,CACpC,MAAO,EAAQ,EAAE,CACjB,SAAU,AAAC,GAAM,EAAQ,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,EAC7C,YAAY,4BACZ,mBAAkB,CAAA,EAAG,EAAO,QAAQ,CAAC,GAEvC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,GAAI,CAAA,EAAG,EAAO,QAAQ,CAAC,CAAE,UAAU,8DAAoD,kDAC3C,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,sBAAa,EAAQ,EAAE,EAAI,OAAO,SAAU,IAE1G,EAAQ,WAAW,EAAI,CAAC,EAAQ,EAAE,CAAC,IAAI,GACtC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACG,IAAI,aACM,IACX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,KAAK,SAAS,UAAU,YAAY,QAAS,IAAM,EAAQ,KAAK,CAAC,EAAQ,WAAW,EAAI,aAC7F,EAAQ,WAAW,MAGtB,WAGN,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,QAAS,EAAc,UAAU,wDAA+C,UAGvF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,GAAI,EACJ,UAAW,EACX,MAAO,EACP,SAAU,AAAC,GAAM,EAAS,EAAE,MAAM,CAAC,KAAK,EACxC,YAAa,EAAU,4BAA8B,kBAIzD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,QAAS,EAAgB,UAAU,wDAA+C,WAGzF,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,GAAI,EACJ,UAAW,EACX,MAAO,EACP,SAAU,AAAC,GAAM,EAAU,EAAE,MAAM,CAAC,KAAK,EACzC,aAAW,wBAEX,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,mBAAU,YACxB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,kBAAS,WACvB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,eAGzB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,QAAS,EAAc,UAAU,wDAA+C,4BAGvF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,GAAI,EACJ,UAAW,EACX,MAAO,EACP,SAAU,AAAC,GAAM,EAAY,EAAE,MAAM,CAAC,KAAK,EAC3C,YAAY,wCAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,QAAS,EAAa,UAAU,wDAA+C,2BAGtF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,GAAI,EACJ,UAAW,EACX,MAAO,EACP,SAAU,AAAC,GAAM,EAAW,EAAE,MAAM,CAAC,KAAK,EAC1C,YAAY,6BAKlB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,QAAS,EAAgB,UAAU,wDAA+C,oBAGxF,AAAa,QACZ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDACZ,EAAY,CAAC,QAAQ,EAAE,IAAI,KAAK,GAAW,cAAc,GAAA,CAAI,CAAG,KAEjE,QAEN,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,GAAI,EACJ,UAAW,CAAC,KAAK,EAAE,EAAW,8HAA8H,CAAC,CAC7J,MAAO,EACP,SAAU,AAAC,GAAM,EAAQ,EAAE,MAAM,CAAC,KAAK,EACvC,YAAY,8BAKtB,CClIO,SAAS,EAAe,CAAW,EACxC,OAAO,EAAI,KAAK,CAAC,KAAK,GAAG,CAAC,AAAC,GAAM,EAAE,IAAI,IAAI,MAAM,CAAC,QACpD,CAGO,SAAS,EAAiB,CAAgC,EAK/D,GAAM,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAAS,OAAS,IAC/C,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAa,GAAS,QAAU,WAC9D,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAAS,SAAW,IACrD,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAAS,UAAY,IACxD,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,GAAS,MAAQ,IAE5C,EAA2B,CAAA,EAAA,EAAA,OAAA,AAAO,EACtC,IAAM,CAAC,OACL,WACA,SACA,YACA,UACA,aACA,WACA,EACA,mBACA,UACA,EACF,CAAC,CACD,CAAC,EAAO,EAAQ,EAAS,EAAU,EAAK,EAM1C,MAAO,WAAE,EAAW,KAHP,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,EAAe,GAAU,CAAC,EAAQ,EAGnC,MAFZ,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,EAAe,GAAW,CAAC,EAAS,CAEhC,CAClC,wIClEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEe,SAAS,IACtB,IAAM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAElB,CAAC,EAAI,EAAM,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAS,IACvB,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC5C,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAI/B,WAAE,CAAS,MAAE,CAAI,OAAE,CAAK,CAAE,CAAG,CAAA,EAAA,EAAA,gBAAA,AAAgB,EAAC,CAAE,KADpD,CAC0D,8ZAAY,GAClE,OAAE,CAAK,CAAE,CAAG,EAEZ,EAAc,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KAC1B,IAAM,EAAI,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,EAAO,IAC3B,OAAO,EAAE,MAAM,EAAI,EAAI,EAAI,EAC7B,EAAG,CAAC,EAAM,EAEV,eAAe,IACb,GAAU,GACV,EAAS,MACT,IAAM,EAAU,EAAG,IAAI,GACvB,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,aAAc,CAC5B,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CACnB,GAAI,EACJ,MAAO,EAAU,KAAK,CACtB,OAAQ,EAAU,MAAM,MACxB,QACA,EACA,KAAM,EAAU,IAAI,AACtB,EACF,GACA,EAAO,IAAI,CAAC,CAAC,OAAO,EAAE,mBAAmB,GAAA,CAAU,CACrD,CAAE,MAAO,EAAY,CACnB,EAAS,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACxB,QAAU,CACR,GAAU,EACZ,CACF,CAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAAC,KAAK,SAAS,UAAU,+CAAsC,WAIpE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,YAAY,CAAA,CACX,MAAO,EACP,QACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,QAAS,IAAM,KAAK,IACpB,SAAU,EACV,UAAU,gIAET,EAAS,YAAc,qBAI5B,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,gDAAuC,gBACrD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CACb,UAAW,EACX,QAAS,IAAE,QAAI,EAAO,YAAa,QAAe,CAAU,EAC5D,WAAW,mBAKrB"}
|
|
@@ -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])},81004,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(74621),e=a.i(51200),f=a.i(50944),g=a.i(72131);async function h(){try{return{goals:(await (0,e.fetchJson)("/api/goals",{cache:"no-store"})).goals??[],error:null}}catch(a){return{goals:[],error:(0,d.errorMessage)(a)}}}function i({children:a}){return(0,b.jsx)("span",{className:"rounded-full bg-[color:var(--ck-bg-glass)] px-2 py-0.5 text-xs text-[color:var(--ck-text-secondary)]",children:a})}function j(){let[a,e]=(0,g.useState)(null),[j,k]=(0,g.useState)(null),l=((0,f.useSearchParams)().get("team")??"").trim(),[m,n]=(0,g.useState)("all");async function o(){e(null),k(null);try{let{goals:a,error:b}=await h();k(b),e(b?[]:a)}catch(a){k((0,d.errorMessage)(a)),e([])}}(0,g.useEffect)(()=>{let a=!1;return(async()=>{try{let{goals:b,error:c}=await h();if(a)return;k(c),e(c?[]:b)}catch(b){if(a)return;k((0,d.errorMessage)(b)),e([])}})(),()=>{a=!0}},[]);let p=(0,g.useMemo)(()=>{let b=a??[];return(l&&(b=b.filter(a=>Array.isArray(a.teams)&&a.teams.includes(l))),"all"===m)?b:b.filter(a=>a.status===m)},[a,m,l]),q=(0,g.useMemo)(()=>{let b=a??[],c={all:b.length,active:0,planned:0,done:0};for(let a of b)"active"===a.status?c.active+=1:"done"===a.status?c.done+=1:c.planned+=1;return c},[a]);function r(a){return(0,b.jsx)(c.default,{href:`/goals/${encodeURIComponent(a.id)}`,className:"block ck-glass p-5 transition hover:bg-[color:var(--ck-bg-glass)]",children:(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-base font-semibold text-[color:var(--ck-text-primary)]",children:a.title}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:[(0,b.jsx)("span",{className:"font-mono",children:a.id}),a.updatedAt?` • updated ${new Date(a.updatedAt).toLocaleString()}`:""]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,b.jsx)(i,{children:a.status}),a.teams?.slice(0,3).map(a=>(0,b.jsx)(i,{children:a},a)),a.tags?.slice(0,3).map(a=>(0,b.jsxs)(i,{children:["#",a]},a))]})]})},a.id)}return(0,b.jsxs)("div",{className:"space-y-6",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Goals"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Stored in ",(0,b.jsx)("code",{className:"font-mono",children:"~/.openclaw/workspace/notes/goals/"}),l?(0,b.jsxs)(b.Fragment,{children:[" ","• filtered by team ",(0,b.jsx)("code",{className:"font-mono",children:l})]}):null]})]}),(0,b.jsx)(c.default,{href:"/goals/new",className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white",children:"Create goal"})]}),(0,b.jsx)("div",{className:"ck-glass p-4",children:(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,b.jsx)("label",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"Status"}),(0,b.jsxs)("select",{className:"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-sm",value:m,onChange:a=>n(a.target.value),children:[(0,b.jsxs)("option",{value:"all",children:["All (",q.all,")"]}),(0,b.jsxs)("option",{value:"active",children:["Active (",q.active,")"]}),(0,b.jsxs)("option",{value:"planned",children:["Planned (",q.planned,")"]}),(0,b.jsxs)("option",{value:"done",children:["Done (",q.done,")"]})]}),(0,b.jsx)("button",{className:"ml-auto text-sm font-medium hover:underline",onClick:()=>void o(),children:"Refresh"})]})}),j?(0,b.jsx)("div",{className:"ck-glass p-4 text-sm text-red-300",children:j}):null,null==a&&(0,b.jsx)("div",{className:"ck-glass p-6 text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}),null!=a&&0===p.length&&(0,b.jsxs)("div",{className:"ck-glass p-6",children:[(0,b.jsx)("div",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"No goals yet."}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsx)(c.default,{href:"/goals/new",className:"text-sm font-medium hover:underline",children:"Create your first goal →"})})]}),null!=a&&p.length>0&&"all"!==m&&(0,b.jsx)("div",{className:"space-y-3",children:p.map(r)}),null!=a&&p.length>0&&"all"===m&&(0,b.jsx)("div",{className:"space-y-8",children:["active","planned","done"].map(a=>{let c=p.filter(b=>b.status===a);return c.length?(0,b.jsxs)("section",{children:[(0,b.jsx)("div",{className:"mb-2 flex items-end justify-between",children:(0,b.jsxs)("h2",{className:"text-sm font-semibold tracking-wide text-[color:var(--ck-text-secondary)] uppercase",children:[a," (",c.length,")"]})}),(0,b.jsx)("div",{className:"space-y-3",children:c.map(r)})]},a):null})})]})}a.s(["default",()=>j])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_2dbb3b7f._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/errors.ts","../../../../src/app/goals/goals-client.tsx"],"sourcesContent":["/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { type GoalFrontmatter } from \"@/lib/goals-client\";\nimport { useSearchParams } from \"next/navigation\";\nimport { useEffect, useMemo, useState } from \"react\";\n\nasync function fetchGoals(): Promise<{ goals: GoalFrontmatter[]; error: string | null }> {\n try {\n const data = await fetchJson<{ goals?: GoalFrontmatter[] }>(\"/api/goals\", { cache: \"no-store\" });\n return { goals: data.goals ?? [], error: null };\n } catch (e: unknown) {\n return { goals: [], error: errorMessage(e) };\n }\n}\n\nfunction Badge({ children }: { children: React.ReactNode }) {\n return (\n <span className=\"rounded-full bg-[color:var(--ck-bg-glass)] px-2 py-0.5 text-xs text-[color:var(--ck-text-secondary)]\">\n {children}\n </span>\n );\n}\n\nexport default function GoalsClient() {\n const [goals, setGoals] = useState<GoalFrontmatter[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const searchParams = useSearchParams();\n const teamFilter = (searchParams.get(\"team\") ?? \"\").trim();\n\n const [filterStatus, setFilterStatus] = useState<string>(\"all\");\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const { goals: g, error: err } = await fetchGoals();\n if (cancelled) return;\n setError(err);\n setGoals(err ? [] : g);\n } catch (e: unknown) {\n if (cancelled) return;\n setError(errorMessage(e));\n setGoals([]);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n async function reload() {\n setGoals(null);\n setError(null);\n try {\n const { goals: g, error: err } = await fetchGoals();\n setError(err);\n setGoals(err ? [] : g);\n } catch (e: unknown) {\n setError(errorMessage(e));\n setGoals([]);\n }\n }\n\n const filtered = useMemo(() => {\n let list = goals ?? [];\n if (teamFilter) list = list.filter((g) => Array.isArray(g.teams) && g.teams.includes(teamFilter));\n if (filterStatus === \"all\") return list;\n return list.filter((g) => g.status === filterStatus);\n }, [goals, filterStatus, teamFilter]);\n\n const counts = useMemo(() => {\n const list = goals ?? [];\n const c = { all: list.length, active: 0, planned: 0, done: 0 };\n for (const g of list) {\n if (g.status === \"active\") c.active += 1;\n else if (g.status === \"done\") c.done += 1;\n else c.planned += 1;\n }\n return c;\n }, [goals]);\n\n function renderGoal(g: GoalFrontmatter) {\n return (\n <Link\n key={g.id}\n href={`/goals/${encodeURIComponent(g.id)}`}\n className=\"block ck-glass p-5 transition hover:bg-[color:var(--ck-bg-glass)]\"\n >\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-base font-semibold text-[color:var(--ck-text-primary)]\">{g.title}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n <span className=\"font-mono\">{g.id}</span>\n {g.updatedAt ? ` • updated ${new Date(g.updatedAt).toLocaleString()}` : \"\"}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <Badge>{g.status}</Badge>\n {g.teams?.slice(0, 3).map((t) => (\n <Badge key={t}>{t}</Badge>\n ))}\n {g.tags?.slice(0, 3).map((t) => (\n <Badge key={t}>#{t}</Badge>\n ))}\n </div>\n </div>\n </Link>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Goals</h1>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n Stored in <code className=\"font-mono\">~/.openclaw/workspace/notes/goals/</code>\n {teamFilter ? (\n <>\n {\" \"}• filtered by team <code className=\"font-mono\">{teamFilter}</code>\n </>\n ) : null}\n </p>\n </div>\n <Link\n href=\"/goals/new\"\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white\"\n >\n Create goal\n </Link>\n </div>\n\n <div className=\"ck-glass p-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"text-sm text-[color:var(--ck-text-secondary)]\">Status</label>\n <select\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-2 py-1 text-sm\"\n value={filterStatus}\n onChange={(e) => setFilterStatus(e.target.value)}\n >\n <option value=\"all\">All ({counts.all})</option>\n <option value=\"active\">Active ({counts.active})</option>\n <option value=\"planned\">Planned ({counts.planned})</option>\n <option value=\"done\">Done ({counts.done})</option>\n </select>\n\n <button\n className=\"ml-auto text-sm font-medium hover:underline\"\n onClick={() => void reload()}\n >\n Refresh\n </button>\n </div>\n </div>\n\n {error ? (\n <div className=\"ck-glass p-4 text-sm text-red-300\">{error}</div>\n ) : null}\n\n {goals == null && (\n <div className=\"ck-glass p-6 text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div>\n )}\n {goals != null && filtered.length === 0 && (\n <div className=\"ck-glass p-6\">\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No goals yet.</div>\n <div className=\"mt-3\">\n <Link href=\"/goals/new\" className=\"text-sm font-medium hover:underline\">\n Create your first goal →\n </Link>\n </div>\n </div>\n )}\n {goals != null && filtered.length > 0 && filterStatus !== \"all\" && (\n <div className=\"space-y-3\">{filtered.map(renderGoal)}</div>\n )}\n {goals != null && filtered.length > 0 && filterStatus === \"all\" && (\n <div className=\"space-y-8\">\n {([\"active\", \"planned\", \"done\"] as const).map((status) => {\n const section = filtered.filter((g) => g.status === status);\n if (!section.length) return null;\n return (\n <section key={status}>\n <div className=\"mb-2 flex items-end justify-between\">\n <h2 className=\"text-sm font-semibold tracking-wide text-[color:var(--ck-text-secondary)] uppercase\">\n {status} ({section.length})\n </h2>\n </div>\n <div className=\"space-y-3\">{section.map(renderGoal)}</div>\n </section>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"uCAIO,SAAS,EAAa,CAAU,EACrC,OAAO,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,EACjD,sECJA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEA,eAAe,IACb,GAAI,CAEF,MAAO,CAAE,MAAO,CADH,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAgC,aAAc,CAAE,MAAO,UAAW,EAAA,EACzE,KAAK,EAAI,EAAE,CAAE,MAAO,IAAK,CAChD,CAAE,MAAO,EAAY,CACnB,MAAO,CAAE,MAAO,EAAE,CAAE,MAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAG,CAC7C,CACF,CAEA,SAAS,EAAM,UAAE,CAAQ,CAAiC,EACxD,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gHACb,GAGP,CAEe,SAAS,IACtB,GAAM,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA2B,MACvD,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAwB,MAG5C,EAAa,CADE,AACD,CADC,EAAA,EAAA,eAAA,AAAe,IACH,GAAG,CAAC,SAAW,EAAA,CAAE,CAAE,IAAI,GAElD,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,OAsBzD,eAAe,IACb,EAAS,MACT,EAAS,MACT,GAAI,CACF,GAAM,CAAE,MAAO,CAAC,CAAE,MAAO,CAAG,CAAE,CAAG,MAAM,IACvC,EAAS,GACT,EAAS,EAAM,EAAE,CAAG,EACtB,CAAE,MAAO,EAAY,CACnB,EAAS,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,IACtB,EAAS,EAAE,CACb,CACF,CA/BA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,IAAI,GAAY,EAchB,MAbA,AAAC,WACC,GAAI,CACF,GAAM,CAAE,MAAO,CAAC,CAAE,MAAO,CAAG,CAAE,CAAG,MAAM,IACvC,GAAI,EAAW,OACf,EAAS,GACT,EAAS,EAAM,EAAE,CAAG,EACtB,CAAE,MAAO,EAAY,CACnB,GAAI,EAAW,OACf,EAAS,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,IACtB,EAAS,EAAE,CACb,EACF,CAAC,GAEM,KACL,GAAY,CACd,CACF,EAAG,EAAE,EAeL,IAAM,EAAW,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACvB,IAAI,EAAO,GAAS,EAAE,OAEtB,CADI,IAAY,EAAO,EAAK,MAAM,CAAC,AAAC,GAAM,MAAM,OAAO,CAAC,EAAE,KAAK,GAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAA,EAChE,OAAO,CAAxB,GAA+B,EAC5B,EAAK,MAAM,CAAC,AAAC,GAAM,EAAE,MAAM,GAAK,EACzC,EAAG,CAAC,EAAO,EAAc,EAAW,EAE9B,EAAS,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACrB,IAAM,EAAO,GAAS,EAAE,CAClB,EAAI,CAAE,IAAK,EAAK,MAAM,CAAE,OAAQ,EAAG,QAAS,EAAG,KAAM,CAAE,EAC7D,IAAK,IAAM,KAAK,EACG,GADG,QAChB,EAAE,MAAM,CAAe,EAAE,MAAM,EAAI,EACjB,SAAb,EAAE,MAAM,CAAa,EAAE,IAAI,EAAI,EACnC,EAAE,OAAO,EAAI,EAEpB,OAAO,CACT,EAAG,CAAC,EAAM,EAEV,SAAS,EAAW,CAAkB,EACpC,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAEH,KAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAA,CAAG,CAC1C,UAAU,6EAEV,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gFAAwE,EAAE,KAAK,GAC9F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,EAAE,EAAE,GAChC,EAAE,SAAS,CAAG,CAAC,WAAW,EAAE,IAAI,KAAK,EAAE,SAAS,EAAE,cAAc,GAAA,CAAI,CAAG,SAG5E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAO,EAAE,MAAM,GACf,EAAE,KAAK,EAAE,MAAM,EAAG,GAAG,IAAI,AAAC,GACzB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,UAAe,GAAJ,IAEb,EAAE,IAAI,EAAE,MAAM,EAAG,GAAG,IAAI,AAAC,GACxB,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,WAAc,IAAE,IAAL,WAlBb,EAAE,EAAE,CAwBf,CAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iDAAwC,UACtD,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,aACtD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAY,uCACrC,EACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACG,IAAI,sBAAmB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,qBAAa,OAErD,WAGR,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CACH,KAAK,aACL,UAAU,4GACX,mBAKH,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,yDAAgD,WACjE,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,UAAU,+GACV,MAAO,EACP,SAAU,AAAC,GAAM,EAAgB,EAAE,MAAM,CAAC,KAAK,YAE/C,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,MAAM,gBAAM,QAAM,EAAO,GAAG,CAAC,OACrC,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,MAAM,mBAAS,WAAS,EAAO,MAAM,CAAC,OAC9C,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,MAAM,oBAAU,YAAU,EAAO,OAAO,CAAC,OACjD,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,MAAM,iBAAO,SAAO,EAAO,IAAI,CAAC,UAG1C,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,UAAU,8CACV,QAAS,IAAM,KAAK,aACrB,iBAMJ,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6CAAqC,IAClD,KAEM,MAAT,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEAA6D,aAE7E,AAAS,SAAQ,AAAoB,MAAX,MAAM,EAC/B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDAAgD,kBAC/D,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CAAC,KAAK,aAAa,UAAU,+CAAsC,kCAM7E,AAAS,SAAQ,EAAS,MAAM,CAAG,GAAsB,QAAjB,GACvC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qBAAa,EAAS,GAAG,CAAC,KAEjC,MAAT,GAAiB,EAAS,MAAM,CAAG,GAAsB,QAAjB,GACvC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qBACX,CAAC,SAAU,UAAW,OAAO,CAAW,GAAG,CAAC,AAAC,IAC7C,IAAM,EAAU,EAAS,MAAM,CAAC,AAAC,GAAM,EAAE,MAAM,GAAK,UACpD,AAAK,EAAQ,EAAT,IAAe,CAEjB,CAFmB,AAEnB,EAAA,EAAA,IAAA,EAAC,UAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+CACb,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,gGACX,EAAO,KAAG,EAAQ,MAAM,CAAC,SAG9B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qBAAa,EAAQ,GAAG,CAAC,OAN5B,GAFY,IAW9B,OAKV"}
|
|
@@ -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])},90198,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(74621),e=a.i(51200);function f(){let[a,f]=(0,c.useState)(!0),[g,h]=(0,c.useState)(!1),[i,j]=(0,c.useState)("prompt"),[k,l]=(0,c.useState)("");async function m(a){h(!0),l("");try{let b=await (0,e.fetchJson)("/api/settings/cron-installation",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({value:a})});if(!b.ok)throw Error(b.error||"Save failed");j(a),l("Saved.")}catch(a){l((0,d.errorMessage)(a))}finally{h(!1)}}(0,c.useEffect)(()=>{(async()=>{f(!0),l("");try{let a=await (0,e.fetchJson)("/api/settings/cron-installation",{cache:"no-store"});if(!a.ok)throw Error(a.error||"Failed to load config");let b=String(a.value||"").trim();"off"===b||"prompt"===b||"on"===b?j(b):j("prompt")}catch(a){l((0,d.errorMessage)(a))}finally{f(!1)}})()},[]);let n=({value:c,title:d,help:e})=>(0,b.jsxs)("button",{type:"button",onClick:()=>m(c),disabled:a||g,className:`ck-glass w-full text-left px-4 py-3 transition-colors hover:bg-white/10 ${i===c?"border-[color:var(--ck-accent-red)]":""}`,children:[(0,b.jsxs)("div",{className:"flex items-baseline justify-between gap-3",children:[(0,b.jsx)("div",{className:"font-medium",children:d}),i===c?(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-accent-red)]",children:"Selected"}):null]}),(0,b.jsx)("div",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:e})]});return(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsx)(n,{value:"off",title:"Off",help:"Never install or reconcile recipe-defined cron jobs."}),(0,b.jsx)(n,{value:"prompt",title:"Prompt (default)",help:"Ask at scaffold time. Default answer should be No; jobs are installed disabled unless you opt in."}),(0,b.jsx)(n,{value:"on",title:"On",help:"Install/reconcile jobs during scaffold (enabledByDefault controls new jobs)."}),k?(0,b.jsx)("div",{className:"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm",children:k}):null]})}a.s(["default",()=>f])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_417bc4a6._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/errors.ts","../../../../src/app/settings/settings-client.tsx"],"sourcesContent":["/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\n\ntype Mode = \"off\" | \"prompt\" | \"on\";\n\nexport default function SettingsClient() {\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [mode, setMode] = useState<Mode>(\"prompt\");\n const [msg, setMsg] = useState<string>(\"\");\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setMsg(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean; value?: string; error?: string }>(\n \"/api/settings/cron-installation\",\n { cache: \"no-store\" }\n );\n if (!json.ok) throw new Error(json.error || \"Failed to load config\");\n const v = String(json.value || \"\").trim();\n if (v === \"off\" || v === \"prompt\" || v === \"on\") setMode(v);\n else setMode(\"prompt\");\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n } finally {\n setLoading(false);\n }\n })();\n }, []);\n\n async function save(next: Mode) {\n setSaving(true);\n setMsg(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/settings/cron-installation\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ value: next }),\n });\n if (!json.ok) throw new Error(json.error || \"Save failed\");\n setMode(next);\n setMsg(\"Saved.\");\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n const Option = ({ value, title, help }: { value: Mode; title: string; help: string }) => (\n <button\n type=\"button\"\n onClick={() => save(value)}\n disabled={loading || saving}\n className={`ck-glass w-full text-left px-4 py-3 transition-colors hover:bg-white/10 ${\n mode === value ? \"border-[color:var(--ck-accent-red)]\" : \"\"\n }`}\n >\n <div className=\"flex items-baseline justify-between gap-3\">\n <div className=\"font-medium\">{title}</div>\n {mode === value ? (\n <div className=\"text-xs font-medium text-[color:var(--ck-accent-red)]\">Selected</div>\n ) : null}\n </div>\n <div className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">{help}</div>\n </button>\n );\n\n return (\n <div className=\"space-y-3\">\n <Option value=\"off\" title=\"Off\" help=\"Never install or reconcile recipe-defined cron jobs.\" />\n <Option\n value=\"prompt\"\n title=\"Prompt (default)\"\n help=\"Ask at scaffold time. Default answer should be No; jobs are installed disabled unless you opt in.\"\n />\n <Option value=\"on\" title=\"On\" help=\"Install/reconcile jobs during scaffold (enabledByDefault controls new jobs).\" />\n\n {msg ? (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm\">\n {msg}\n </div>\n ) : null}\n </div>\n );\n}\n"],"names":[],"mappings":"uCAIO,SAAS,EAAa,CAAU,EACrC,OAAO,aAAa,MAAQ,EAAE,OAAO,CAAG,OAAO,EACjD,sECJA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAIe,SAAS,IACtB,GAAM,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC/B,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAO,UACjC,CAAC,EAAK,EAAO,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAuBvC,eAAe,EAAK,CAAU,EAC5B,GAAU,GACV,EAAO,IACP,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAmC,kCAAmC,CAChG,OAAQ,MACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,MAAO,CAAK,EACrC,GACA,GAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,eAC5C,EAAQ,GACR,EAAO,SACT,CAAE,MAAO,EAAY,CACnB,EAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACtB,QAAU,CACR,GAAU,EACZ,CACF,CAtCA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,CAAC,UACC,GAAW,GACX,EAAO,IACP,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAS,AAAT,EACjB,kCACA,CAAE,MAAO,UAAW,GAEtB,GAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,yBAC5C,IAAM,EAAI,OAAO,EAAK,KAAK,EAAI,IAAI,IAAI,GAC7B,QAAN,GAAqB,WAAN,GAAwB,OAAN,EAAY,EAAQ,GACpD,EAAQ,SACf,CAAE,MAAO,EAAY,CACnB,EAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACtB,QAAU,CACR,GAAW,EACb,EACF,CAAC,EACH,EAAG,EAAE,EAqBL,IAAM,EAAS,CAAC,OAAE,CAAK,OAAE,CAAK,MAAE,CAAI,CAAgD,GAClF,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,EAAK,GACpB,SAAU,GAAW,EACrB,UAAW,CAAC,wEAAwE,EAClF,IAAS,EAAQ,sCAAwC,GAAA,CACzD,WAEF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sDACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBAAe,IAC7B,IAAS,EACR,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iEAAwD,aACrE,QAEN,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8DAAsD,OAIzE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,MAAM,MAAM,MAAM,MAAM,KAAK,yDACrC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,MAAM,SACN,MAAM,mBACN,KAAK,sGAEP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAO,MAAM,KAAK,MAAM,KAAK,KAAK,iFAElC,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6FACZ,IAED,OAGV"}
|
|
@@ -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])},16627,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(50944),e=a.i(72131),f=a.i(61889),g=a.i(74621),h=a.i(51200);function i({teamId:a,ticket:c,currentOwner:f}){let g=(0,d.useRouter)(),[h,i]=(0,e.useState)([]),[j,k]=(0,e.useState)(f??""),[l,m]=(0,e.useState)(!1),[n,o]=(0,e.useState)(null);(0,e.useEffect)(()=>{let b=!1;return(async()=>{try{let c=a?`/api/teams/${encodeURIComponent(a)}/tickets/assignees`:"/api/tickets/assignees",d=await fetch(c,{cache:"no-store"}),e=await d.json();if(b)return;i(Array.isArray(e.assignees)?e.assignees:[])}catch{if(b)return;i([])}})(),()=>{b=!0}},[]);let p=(0,e.useMemo)(()=>{let a=new Set(h);return f&&a.add(f),Array.from(a).sort()},[h,f]);async function q(){m(!0),o(null);try{let b=a?`/api/teams/${encodeURIComponent(a)}/tickets/assign`:"/api/tickets/assign",d=await fetch(b,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({ticket:c,assignee:j})}),e=await d.json();if(!d.ok)return void o(e.error||"Assign failed");g.refresh()}catch{o("Assign failed")}finally{m(!1)}}return(0,b.jsxs)("div",{className:"ck-glass p-4",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-tertiary)]",children:"Assignee"}),(0,b.jsxs)("select",{className:"rounded-md border border-white/10 bg-black/20 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",value:j,onChange:a=>k(a.target.value),children:[(0,b.jsx)("option",{value:"",disabled:!0,children:"Select…"}),p.map(a=>(0,b.jsx)("option",{value:a,children:a},a))]}),(0,b.jsx)("button",{type:"button",onClick:q,disabled:l||!j||j===(f??""),className:"rounded-md bg-emerald-600 px-3 py-2 text-sm font-semibold text-white hover:bg-emerald-500 disabled:cursor-not-allowed disabled:opacity-50",children:l?"Assigning…":"Assign"}),f?(0,b.jsxs)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:["Currently: ",f]}):null]}),n?(0,b.jsx)("div",{className:"mt-2 text-xs text-red-300",children:n}):null]})}function j(a){let j=(0,d.useRouter)(),k=(0,f.useToast)(),[l,m]=(0,e.useTransition)(),[n,o]=(0,e.useState)(null),[p,q]=(0,e.useState)(null);async function r(){o(null),await (0,h.fetchJson)(`/api/teams/${encodeURIComponent(a.teamId)}/tickets/move-to-goals`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({ticket:a.ticketId})})}async function s(){o(null),await (0,h.fetchJson)(`/api/teams/${encodeURIComponent(a.teamId)}/tickets/delete`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({ticket:a.ticketId})})}return(0,b.jsxs)("div",{className:"space-y-4",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)(c.default,{href:a.backHref??"/tickets",className:"text-sm font-medium hover:underline",children:"← Back"}),(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:a.file})]}),n?(0,b.jsx)("div",{className:"ck-glass border border-[color:var(--ck-border-strong)] p-3 text-sm text-[color:var(--ck-text-primary)]",children:n}):null,void 0!==a.currentOwner?(0,b.jsx)(i,{teamId:a.teamId,ticket:a.ticketId,currentOwner:a.currentOwner??null}):null,(0,b.jsx)("div",{className:"ck-glass p-4",children:(0,b.jsxs)("div",{className:"flex flex-wrap items-center justify-end gap-2",children:[(0,b.jsx)("button",{className:"rounded border border-[color:var(--ck-border-subtle)] px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:border-[color:var(--ck-border-strong)]",onClick:()=>q({kind:"goals"}),disabled:l,children:"Move to Goals"}),(0,b.jsx)("button",{className:"rounded border border-[color:var(--ck-accent-red)] bg-[color:var(--ck-accent-red-soft)] px-3 py-1.5 text-xs font-medium text-[color:var(--ck-accent-red)] hover:bg-[color:var(--ck-accent-red-soft-strong)]",onClick:()=>q({kind:"delete"}),disabled:l,children:"Delete Ticket"})]})}),(0,b.jsx)("div",{className:"ck-glass p-6",children:(0,b.jsx)("pre",{className:"whitespace-pre-wrap break-words text-sm leading-6 text-[color:var(--ck-text-primary)]",children:a.markdown})}),p?(0,b.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4",children:(0,b.jsxs)("div",{className:"ck-glass w-full max-w-lg rounded-[var(--ck-radius-md)] border border-[color:var(--ck-border-strong)] p-4",children:[(0,b.jsx)("div",{className:"text-sm font-semibold text-[color:var(--ck-text-primary)]",children:"goals"===p.kind?"Move to Goals":"Delete ticket"}),(0,b.jsx)("div",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:"goals"===p.kind?(0,b.jsxs)(b.Fragment,{children:["This will move the ticket out of the work lanes into ",(0,b.jsx)("code",{children:"work/goals/"})," so it won’t be picked up by automation."]}):(0,b.jsx)(b.Fragment,{children:"This will permanently remove the ticket markdown file. Assignment stubs (if any) will be archived."})}),(0,b.jsxs)("div",{className:"mt-4 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{className:"rounded border border-[color:var(--ck-border-subtle)] px-3 py-1.5 text-xs text-[color:var(--ck-text-secondary)]",onClick:()=>q(null),disabled:l,children:"Cancel"}),(0,b.jsx)("button",{className:"delete"===p.kind?"rounded bg-[color:var(--ck-accent-red)] px-3 py-1.5 text-xs font-medium text-white":"rounded bg-[color:var(--ck-accent)] px-3 py-1.5 text-xs font-medium text-black",onClick:()=>{let b=p.kind;q(null),m(()=>{("goals"===b?r():s()).then(()=>{k.push({kind:"success",message:"delete"===b?"Ticket deleted.":"Moved to Goals."}),"delete"===b?j.push(a.backHref??"/tickets"):j.refresh()}).catch(a=>o((0,g.errorMessage)(a)))})},disabled:l,children:"Confirm"})]})]})}):null]})}a.s(["TicketDetailClient",()=>j],16627)}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_59477309._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/errors.ts","../../../../src/app/tickets/TicketDetailClient.tsx","../../../../src/app/tickets/%5Bticket%5D/TicketAssignControl.tsx"],"sourcesContent":["/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useState, useTransition } from \"react\";\n\nimport { useToast } from \"@/components/ToastProvider\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { TicketAssignControl } from \"@/app/tickets/[ticket]/TicketAssignControl\";\n\nexport function TicketDetailClient(props: {\n teamId: string;\n ticketId: string;\n file: string;\n markdown: string;\n backHref?: string;\n currentOwner?: string | null;\n}) {\n const router = useRouter();\n const toast = useToast();\n const [isPending, startTransition] = useTransition();\n const [error, setError] = useState<string | null>(null);\n const [confirm, setConfirm] = useState<null | { kind: \"goals\" | \"delete\" }>(null);\n\n async function moveToGoals() {\n setError(null);\n await fetchJson(`/api/teams/${encodeURIComponent(props.teamId)}/tickets/move-to-goals`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ ticket: props.ticketId }),\n });\n }\n\n async function deleteTicket() {\n setError(null);\n await fetchJson(`/api/teams/${encodeURIComponent(props.teamId)}/tickets/delete`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ ticket: props.ticketId }),\n });\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <Link href={props.backHref ?? \"/tickets\"} className=\"text-sm font-medium hover:underline\">\n ← Back\n </Link>\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{props.file}</span>\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 {props.currentOwner !== undefined ? (\n <TicketAssignControl teamId={props.teamId} ticket={props.ticketId} currentOwner={props.currentOwner ?? null} />\n ) : null}\n\n <div className=\"ck-glass p-4\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <button\n className=\"rounded border border-[color:var(--ck-border-subtle)] px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:border-[color:var(--ck-border-strong)]\"\n onClick={() => setConfirm({ kind: \"goals\" })}\n disabled={isPending}\n >\n Move to Goals\n </button>\n <button\n className=\"rounded border border-[color:var(--ck-accent-red)] bg-[color:var(--ck-accent-red-soft)] px-3 py-1.5 text-xs font-medium text-[color:var(--ck-accent-red)] hover:bg-[color:var(--ck-accent-red-soft-strong)]\"\n onClick={() => setConfirm({ kind: \"delete\" })}\n disabled={isPending}\n >\n Delete Ticket\n </button>\n </div>\n </div>\n\n <div className=\"ck-glass p-6\">\n <pre className=\"whitespace-pre-wrap break-words text-sm leading-6 text-[color:var(--ck-text-primary)]\">\n {props.markdown}\n </pre>\n </div>\n\n {confirm ? (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4\">\n <div className=\"ck-glass w-full max-w-lg rounded-[var(--ck-radius-md)] border border-[color:var(--ck-border-strong)] p-4\">\n <div className=\"text-sm font-semibold text-[color:var(--ck-text-primary)]\">\n {confirm.kind === \"goals\" ? \"Move to Goals\" : \"Delete ticket\"}\n </div>\n\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n {confirm.kind === \"goals\" ? (\n <>This will move the ticket out of the work lanes into <code>work/goals/</code> so it won’t be picked up by automation.</>\n ) : (\n <>This will permanently remove the ticket markdown file. Assignment stubs (if any) will be archived.</>\n )}\n </div>\n\n <div className=\"mt-4 flex items-center justify-end gap-2\">\n <button\n className=\"rounded border border-[color:var(--ck-border-subtle)] px-3 py-1.5 text-xs text-[color:var(--ck-text-secondary)]\"\n onClick={() => setConfirm(null)}\n disabled={isPending}\n >\n Cancel\n </button>\n <button\n className={\n confirm.kind === \"delete\"\n ? \"rounded bg-[color:var(--ck-accent-red)] px-3 py-1.5 text-xs font-medium text-white\"\n : \"rounded bg-[color:var(--ck-accent)] px-3 py-1.5 text-xs font-medium text-black\"\n }\n onClick={() => {\n const kind = confirm.kind;\n setConfirm(null);\n startTransition(() => {\n const op = kind === \"goals\" ? moveToGoals() : deleteTicket();\n op\n .then(() => {\n toast.push({\n kind: \"success\",\n message: kind === \"delete\" ? \"Ticket deleted.\" : \"Moved to Goals.\",\n });\n if (kind === \"delete\") {\n router.push(props.backHref ?? \"/tickets\");\n } else {\n router.refresh();\n }\n })\n .catch((e: unknown) => setError(errorMessage(e)));\n });\n }}\n disabled={isPending}\n >\n Confirm\n </button>\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\nexport function TicketAssignControl({\n teamId,\n ticket,\n currentOwner,\n}: {\n teamId?: string | null;\n ticket: string;\n currentOwner: string | null;\n}) {\n const router = useRouter();\n const [assignees, setAssignees] = useState<string[]>([]);\n const [selected, setSelected] = useState<string>(currentOwner ?? \"\");\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const url = teamId\n ? `/api/teams/${encodeURIComponent(teamId)}/tickets/assignees`\n : \"/api/tickets/assignees\";\n const res = await fetch(url, { cache: \"no-store\" });\n const json = (await res.json()) as { assignees?: string[] };\n if (cancelled) return;\n setAssignees(Array.isArray(json.assignees) ? json.assignees : []);\n } catch {\n if (cancelled) return;\n setAssignees([]);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, []);\n\n const options = useMemo(() => {\n const base = new Set(assignees);\n if (currentOwner) base.add(currentOwner);\n return Array.from(base).sort();\n }, [assignees, currentOwner]);\n\n async function onAssign() {\n setLoading(true);\n setError(null);\n try {\n const url = teamId\n ? `/api/teams/${encodeURIComponent(teamId)}/tickets/assign`\n : \"/api/tickets/assign\";\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ ticket, assignee: selected }),\n });\n\n const json = (await res.json()) as { error?: string };\n if (!res.ok) {\n setError(json.error || \"Assign failed\");\n return;\n }\n\n router.refresh();\n } catch {\n setError(\"Assign failed\");\n } finally {\n setLoading(false);\n }\n }\n\n return (\n <div className=\"ck-glass p-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-tertiary)]\">Assignee</div>\n <select\n className=\"rounded-md border border-white/10 bg-black/20 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n value={selected}\n onChange={(e) => setSelected(e.target.value)}\n >\n <option value=\"\" disabled>\n Select…\n </option>\n {options.map((a) => (\n <option key={a} value={a}>\n {a}\n </option>\n ))}\n </select>\n\n <button\n type=\"button\"\n onClick={onAssign}\n disabled={loading || !selected || selected === (currentOwner ?? \"\")}\n className=\"rounded-md bg-emerald-600 px-3 py-2 text-sm font-semibold text-white hover:bg-emerald-500 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {loading ? \"Assigning…\" : \"Assign\"}\n </button>\n\n {currentOwner ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Currently: {currentOwner}</div>\n ) : null}\n </div>\n\n {error ? <div className=\"mt-2 text-xs text-red-300\">{error}</div> : null}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -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])},2561,14878,a=>{"use strict";var b=a.i(87924),c=a.i(72131);function d({children:a,error:c,actions:d}){return(0,b.jsxs)("div",{className:"ck-glass p-6 space-y-4",children:[a,c?(0,b.jsx)("div",{className:"text-sm text-red-300",children:c}):null,d]})}let e="mt-1 w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 text-sm";function f({formState:a,idField:d,updatedAt:f,bodyHeight:g="h-[320px]"}){let{title:h,setTitle:i,status:j,setStatus:k,tagsRaw:l,setTagsRaw:m,teamsRaw:n,setTeamsRaw:o,body:p,setBody:q}=a,r=(0,c.useId)(),s=`${r}-id`,t=`${r}-title`,u=`${r}-status`,v=`${r}-teams`,w=`${r}-tags`,x=`${r}-body`;return(0,b.jsxs)(b.Fragment,{children:[d?(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:s,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"ID"}),(0,b.jsx)("input",{id:s,className:`${e} font-mono`,value:d.id,onChange:a=>d.setId(a.target.value),placeholder:"increase-trial-activation","aria-describedby":`${r}-id-hint`}),(0,b.jsxs)("div",{id:`${r}-id-hint`,className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Lowercase letters, numbers, hyphens. Stored as ",(0,b.jsxs)("code",{className:"font-mono",children:[d.id||"<id>",".md"]}),".",d.suggestedId&&!d.id.trim()?(0,b.jsxs)(b.Fragment,{children:[" ","Suggested:"," ",(0,b.jsx)("button",{type:"button",className:"underline",onClick:()=>d.setId(d.suggestedId??""),children:d.suggestedId})]}):null]})]}):null,(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:t,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Title"}),(0,b.jsx)("input",{id:t,className:e,value:h,onChange:a=>i(a.target.value),placeholder:d?"Increase trial activation":"Goal title"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 sm:grid-cols-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:u,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Status"}),(0,b.jsxs)("select",{id:u,className:e,value:j,onChange:a=>k(a.target.value),"aria-label":"Goal status",children:[(0,b.jsx)("option",{value:"planned",children:"Planned"}),(0,b.jsx)("option",{value:"active",children:"Active"}),(0,b.jsx)("option",{value:"done",children:"Done"})]})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:v,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Teams (comma-separated)"}),(0,b.jsx)("input",{id:v,className:e,value:n,onChange:a=>o(a.target.value),placeholder:"development-team, marketing-team"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{htmlFor:w,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Tags (comma-separated)"}),(0,b.jsx)("input",{id:w,className:e,value:l,onChange:a=>m(a.target.value),placeholder:"onboarding, growth"})]})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsx)("label",{htmlFor:x,className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Body (markdown)"}),null!=f?(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:f?`updated ${new Date(f).toLocaleString()}`:""}):null]}),(0,b.jsx)("textarea",{id:x,className:`mt-1 ${g} w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 font-mono text-sm`,value:p,onChange:a=>q(a.target.value),placeholder:"Write the goal here…"})]})]})}function g(a){return a.split(",").map(a=>a.trim()).filter(Boolean)}function h(a){let[b,d]=(0,c.useState)(a?.title??""),[e,f]=(0,c.useState)(a?.status??"planned"),[h,i]=(0,c.useState)(a?.tagsRaw??""),[j,k]=(0,c.useState)(a?.teamsRaw??""),[l,m]=(0,c.useState)(a?.body??""),n=(0,c.useMemo)(()=>({title:b,setTitle:d,status:e,setStatus:f,tagsRaw:h,setTagsRaw:i,teamsRaw:j,setTeamsRaw:k,body:l,setBody:m}),[b,e,h,j,l]);return{formState:n,tags:(0,c.useMemo)(()=>g(h),[h]),teams:(0,c.useMemo)(()=>g(j),[j])}}a.s(["GoalFormCard",()=>d,"GoalFormFields",()=>f],2561),a.s(["useGoalFormState",()=>h],14878)},96325,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(2561),e=a.i(74621),f=a.i(51200),g=a.i(14878),h=a.i(50944),i=a.i(72131);function j({goalId:a}){let j=(0,h.useRouter)(),[k,l]=(0,i.useState)(!0),[m,n]=(0,i.useState)(!1),[o,p]=(0,i.useState)(null),[q,r]=(0,i.useState)(null),{formState:s,tags:t,teams:u}=(0,g.useGoalFormState)(),{setTitle:v,setStatus:w,setTagsRaw:x,setTeamsRaw:y,setBody:z}=s,A=(0,i.useCallback)(async()=>{l(!0),p(null);try{let b=await (0,f.fetchJson)(`/api/goals/${encodeURIComponent(a)}`,{cache:"no-store"}),c=b.goal;v(c.title??""),w(c.status??"planned"),x((c.tags??[]).join(", ")),y((c.teams??[]).join(", ")),z(b.body??""),r(c.updatedAt??null)}catch(a){p((0,e.errorMessage)(a))}finally{l(!1)}},[a,v,w,x,y,z]);async function B(){n(!0),p(null);try{let b=await (0,f.fetchJson)(`/api/goals/${encodeURIComponent(a)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({title:s.title,status:s.status,tags:t,teams:u,body:s.body})});r(b.goal.updatedAt??null),j.push("/goals")}catch(a){p((0,e.errorMessage)(a))}finally{n(!1)}}async function C(){n(!0),p(null);try{await (0,f.fetchJson)(`/api/goals/${encodeURIComponent(a)}/promote`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),await A()}catch(a){p((0,e.errorMessage)(a))}finally{n(!1)}}async function D(){if(window.confirm(`Delete goal "${a}"? This will delete the markdown file.`)){n(!0),p(null);try{await (0,f.fetchJson)(`/api/goals/${encodeURIComponent(a)}`,{method:"DELETE"}),j.push("/goals")}catch(a){p((0,e.errorMessage)(a))}finally{n(!1)}}}return(0,i.useEffect)(()=>{A()},[A]),(0,b.jsxs)("div",{className:"space-y-4",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)(c.default,{href:"/goals",className:"text-sm font-medium hover:underline",children:"← Back"}),(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)] font-mono",children:a})]}),(0,b.jsx)(d.GoalFormCard,{error:o,actions:(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-3",children:[(0,b.jsx)("button",{onClick:()=>void B(),disabled:m||k,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white disabled:opacity-50",children:m?"Saving…":"Save"}),(0,b.jsx)("button",{onClick:()=>void A(),disabled:m,className:"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm",children:"Reload"}),(0,b.jsx)("button",{onClick:()=>void C(),disabled:m||k,className:"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm font-medium",children:"Promote to inbox"}),(0,b.jsx)("button",{onClick:()=>void D(),disabled:m||k,className:"rounded-[var(--ck-radius-sm)] border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)]",children:"Delete"})]}),children:(0,b.jsx)(d.GoalFormFields,{formState:s,updatedAt:q})}),(0,b.jsxs)("div",{className:"ck-glass p-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium",children:"Preview"}),(0,b.jsx)("pre",{className:"mt-2 whitespace-pre-wrap break-words text-sm leading-6 text-[color:var(--ck-text-primary)]",children:s.body})]}),k?(0,b.jsx)("div",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}):null]})}a.s(["default",()=>j])}];
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=src_79d55c05._.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/errors.ts","../../../../src/components/GoalFormFields.tsx","../../../../src/lib/goals-client.ts","../../../../src/app/goals/%5Bid%5D/goal-editor.tsx"],"sourcesContent":["/**\n * Extracts a string message from an unknown error value.\n * Used consistently across API routes and client components.\n */\nexport function errorMessage(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport type { GoalFormState, GoalStatus } from \"@/lib/goals-client\";\n\nexport type { GoalFormState };\n\n/** Wraps goal form content with error display and action buttons. */\nexport function GoalFormCard({\n children,\n error,\n actions,\n}: {\n children: ReactNode;\n error: string | null;\n actions: ReactNode;\n}) {\n return (\n <div className=\"ck-glass p-6 space-y-4\">\n {children}\n {error ? <div className=\"text-sm text-red-300\">{error}</div> : null}\n {actions}\n </div>\n );\n}\n\nconst inputClass =\n \"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 text-sm\";\n\ntype Props = {\n formState: GoalFormState;\n /** When provided, renders the ID field (for create flow). */\n idField?: { id: string; setId: (v: string) => void; suggestedId?: string };\n /** When provided, shows updated timestamp next to body label. */\n updatedAt?: string | null;\n /** Body textarea height override (e.g. 260 for new page). */\n bodyHeight?: string;\n};\n\nexport function GoalFormFields({\n formState,\n idField,\n updatedAt,\n bodyHeight = \"h-[320px]\",\n}: Props) {\n const { title, setTitle, status, setStatus, tagsRaw, setTagsRaw, teamsRaw, setTeamsRaw, body, setBody } = formState;\n const baseId = useId();\n const idInputId = `${baseId}-id`;\n const titleInputId = `${baseId}-title`;\n const statusSelectId = `${baseId}-status`;\n const teamsInputId = `${baseId}-teams`;\n const tagsInputId = `${baseId}-tags`;\n const bodyTextareaId = `${baseId}-body`;\n return (\n <>\n {idField ? (\n <div>\n <label htmlFor={idInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n ID\n </label>\n <input\n id={idInputId}\n className={`${inputClass} font-mono`}\n value={idField.id}\n onChange={(e) => idField.setId(e.target.value)}\n placeholder=\"increase-trial-activation\"\n aria-describedby={`${baseId}-id-hint`}\n />\n <div id={`${baseId}-id-hint`} className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Lowercase letters, numbers, hyphens. Stored as <code className=\"font-mono\">{idField.id || \"<id>\"}.md</code>\n .\n {idField.suggestedId && !idField.id.trim() ? (\n <>\n {\" \"}\n Suggested:{\" \"}\n <button type=\"button\" className=\"underline\" onClick={() => idField.setId(idField.suggestedId ?? \"\")}>\n {idField.suggestedId}\n </button>\n </>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <div>\n <label htmlFor={titleInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Title\n </label>\n <input\n id={titleInputId}\n className={inputClass}\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder={idField ? \"Increase trial activation\" : \"Goal title\"}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div>\n <label htmlFor={statusSelectId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Status\n </label>\n <select\n id={statusSelectId}\n className={inputClass}\n value={status}\n onChange={(e) => setStatus(e.target.value as GoalStatus)}\n aria-label=\"Goal status\"\n >\n <option value=\"planned\">Planned</option>\n <option value=\"active\">Active</option>\n <option value=\"done\">Done</option>\n </select>\n </div>\n <div>\n <label htmlFor={teamsInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Teams (comma-separated)\n </label>\n <input\n id={teamsInputId}\n className={inputClass}\n value={teamsRaw}\n onChange={(e) => setTeamsRaw(e.target.value)}\n placeholder=\"development-team, marketing-team\"\n />\n </div>\n <div>\n <label htmlFor={tagsInputId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Tags (comma-separated)\n </label>\n <input\n id={tagsInputId}\n className={inputClass}\n value={tagsRaw}\n onChange={(e) => setTagsRaw(e.target.value)}\n placeholder=\"onboarding, growth\"\n />\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between\">\n <label htmlFor={bodyTextareaId} className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n Body (markdown)\n </label>\n {updatedAt != null ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {updatedAt ? `updated ${new Date(updatedAt).toLocaleString()}` : \"\"}\n </div>\n ) : null}\n </div>\n <textarea\n id={bodyTextareaId}\n className={`mt-1 ${bodyHeight} w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-transparent px-3 py-2 font-mono text-sm`}\n value={body}\n onChange={(e) => setBody(e.target.value)}\n placeholder=\"Write the goal here…\"\n />\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport { useMemo, useState } from \"react\";\n\n/** Client-safe goal types and utils (no node deps). */\n\nexport type GoalStatus = \"planned\" | \"active\" | \"done\";\n\nexport type GoalFrontmatter = {\n id: string;\n title: string;\n status: GoalStatus;\n tags: string[];\n teams: string[];\n updatedAt: string;\n};\n\n/** Form state shape for GoalFormFields. */\nexport type GoalFormState = {\n title: string;\n setTitle: (v: string) => void;\n status: GoalStatus;\n setStatus: (v: GoalStatus) => void;\n tagsRaw: string;\n setTagsRaw: (v: string) => void;\n teamsRaw: string;\n setTeamsRaw: (v: string) => void;\n body: string;\n setBody: (v: string) => void;\n};\n\n/** Parses comma-separated string into trimmed non-empty array. */\nexport function parseCommaList(raw: string): string[] {\n return raw.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/** Shared form state for goal create/edit. Returns formState for GoalFormFields and parsed tags/teams. */\nexport function useGoalFormState(initial?: Partial<GoalFormState>): {\n formState: GoalFormState;\n tags: string[];\n teams: string[];\n} {\n const [title, setTitle] = useState(initial?.title ?? \"\");\n const [status, setStatus] = useState<GoalStatus>(initial?.status ?? \"planned\");\n const [tagsRaw, setTagsRaw] = useState(initial?.tagsRaw ?? \"\");\n const [teamsRaw, setTeamsRaw] = useState(initial?.teamsRaw ?? \"\");\n const [body, setBody] = useState(initial?.body ?? \"\");\n\n const formState: GoalFormState = useMemo(\n () => ({\n title,\n setTitle,\n status,\n setStatus,\n tagsRaw,\n setTagsRaw,\n teamsRaw,\n setTeamsRaw,\n body,\n setBody,\n }),\n [title, status, tagsRaw, teamsRaw, body]\n );\n\n const tags = useMemo(() => parseCommaList(tagsRaw), [tagsRaw]);\n const teams = useMemo(() => parseCommaList(teamsRaw), [teamsRaw]);\n\n return { formState, tags, teams };\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { GoalFormCard, GoalFormFields } from \"@/components/GoalFormFields\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { type GoalFrontmatter, type GoalStatus, useGoalFormState } from \"@/lib/goals-client\";\nimport { useRouter } from \"next/navigation\";\nimport { useCallback, useEffect, useState } from \"react\";\n\nexport default function GoalEditor({ goalId }: { goalId: string }) {\n const router = useRouter();\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [updatedAt, setUpdatedAt] = useState<string | null>(null);\n\n const { formState, tags, teams } = useGoalFormState();\n const { setTitle, setStatus, setTagsRaw, setTeamsRaw, setBody } = formState;\n\n const loadGoal = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const data = await fetchJson<{ goal: GoalFrontmatter; body: string }>(\n `/api/goals/${encodeURIComponent(goalId)}`,\n { cache: \"no-store\" }\n );\n const g = data.goal;\n setTitle(g.title ?? \"\");\n setStatus((g.status as GoalStatus) ?? \"planned\");\n setTagsRaw((g.tags ?? []).join(\", \"));\n setTeamsRaw((g.teams ?? []).join(\", \"));\n setBody(data.body ?? \"\");\n setUpdatedAt(g.updatedAt ?? null);\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setLoading(false);\n }\n }, [goalId, setTitle, setStatus, setTagsRaw, setTeamsRaw, setBody]);\n\n useEffect(() => {\n void loadGoal();\n }, [loadGoal]);\n\n async function save() {\n setSaving(true);\n setError(null);\n try {\n const data = await fetchJson<{ goal: GoalFrontmatter }>(\n `/api/goals/${encodeURIComponent(goalId)}`,\n {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n title: formState.title,\n status: formState.status,\n tags,\n teams,\n body: formState.body,\n }),\n }\n );\n setUpdatedAt(data.goal.updatedAt ?? null);\n router.push(\"/goals\");\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function promoteToInbox() {\n setSaving(true);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goalId)}/promote`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({}),\n });\n await loadGoal();\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function deleteThisGoal() {\n const ok = window.confirm(`Delete goal \\\"${goalId}\\\"? This will delete the markdown file.`);\n if (!ok) return;\n\n setSaving(true);\n setError(null);\n try {\n await fetchJson(`/api/goals/${encodeURIComponent(goalId)}`, { method: \"DELETE\" });\n router.push(\"/goals\");\n } catch (e: unknown) {\n setError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <Link href=\"/goals\" className=\"text-sm font-medium hover:underline\">\n ← Back\n </Link>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)] font-mono\">{goalId}</div>\n </div>\n\n <GoalFormCard\n error={error}\n actions={\n <div className=\"flex flex-wrap items-center gap-3\">\n <button\n onClick={() => void save()}\n disabled={saving || loading}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white disabled:opacity-50\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n <button\n onClick={() => void loadGoal()}\n disabled={saving}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm\"\n >\n Reload\n </button>\n <button\n onClick={() => void promoteToInbox()}\n disabled={saving || loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm font-medium\"\n >\n Promote to inbox\n </button>\n <button\n onClick={() => void deleteThisGoal()}\n disabled={saving || loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)]\"\n >\n Delete\n </button>\n </div>\n }\n >\n <GoalFormFields formState={formState} updatedAt={updatedAt} />\n </GoalFormCard>\n\n <div className=\"ck-glass p-6\">\n <div className=\"text-sm font-medium\">Preview</div>\n <pre className=\"mt-2 whitespace-pre-wrap break-words text-sm leading-6 text-[color:var(--ck-text-primary)]\">{formState.body}</pre>\n </div>\n\n {loading ? <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</div> : null}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[48208,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(72131);function e(a){if(!a)return null;let b=a.split("/").filter(Boolean).find(a=>a.startsWith("workspace-"))??"";return b&&b.slice(10)||null}function f(a){return a.endsWith("-team")?a.slice(0,-5):a}function g({agents:a,teamNames:g}){let h=(0,d.useMemo)(()=>{let b=new Set;for(let c of a){let a=e(c.workspace);a&&b.add(a)}return Array.from(b).sort()},[a]),[i,j]=(0,d.useState)("all"),k=(0,d.useMemo)(()=>{let b=new Map;for(let c of a){let a=e(c.workspace)??"personal";if("all"!==i&&a!==i)continue;let d=b.get(a)??[];d.push(c),b.set(a,d)}return Array.from(b.keys()).sort((a,b)=>"personal"===a?1:"personal"===b?-1:a.localeCompare(b)).map(a=>{let c,d,e="personal"===a?"Personal / Unassigned":(c=f(a),g[a]||g[c]||((d=c.replace(/[-_]+/g," ").replace(/\s+/g," ").trim())?d.split(" ").map(a=>/^(ai|api|cli|ui|ux|sre|qa|devops)$/i.test(a)?a.toUpperCase():a.slice(0,1).toUpperCase()+a.slice(1)).join(" "):c));return{key:a,title:e,subtitle:"personal"===a?null:`workspace-${a}`,agents:(b.get(a)??[]).slice().sort((a,b)=>a.id.localeCompare(b.id)),isTeam:"personal"!==a}})},[a,i,g]);return(0,b.jsxs)("div",{className:"ck-glass
|
|
1
|
+
module.exports=[48208,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(72131);function e(a){if(!a)return null;let b=a.split("/").filter(Boolean).find(a=>a.startsWith("workspace-"))??"";return b&&b.slice(10)||null}function f(a){return a.endsWith("-team")?a.slice(0,-5):a}function g({agents:a,teamNames:g}){let h=(0,d.useMemo)(()=>{let b=new Set;for(let c of a){let a=e(c.workspace);a&&b.add(a)}return Array.from(b).sort()},[a]),[i,j]=(0,d.useState)("all"),k=(0,d.useMemo)(()=>{let b=new Map;for(let c of a){let a=e(c.workspace)??"personal";if("all"!==i&&a!==i)continue;let d=b.get(a)??[];d.push(c),b.set(a,d)}return Array.from(b.keys()).sort((a,b)=>"personal"===a?1:"personal"===b?-1:a.localeCompare(b)).map(a=>{let c,d,e="personal"===a?"Personal / Unassigned":(c=f(a),g[a]||g[c]||((d=c.replace(/[-_]+/g," ").replace(/\s+/g," ").trim())?d.split(" ").map(a=>/^(ai|api|cli|ui|ux|sre|qa|devops)$/i.test(a)?a.toUpperCase():a.slice(0,1).toUpperCase()+a.slice(1)).join(" "):c));return{key:a,title:e,subtitle:"personal"===a?null:`workspace-${a}`,agents:(b.get(a)??[]).slice().sort((a,b)=>a.id.localeCompare(b.id)),isTeam:"personal"!==a}})},[a,i,g]);return(0,b.jsxs)("div",{className:"ck-glass w-full p-6 sm:p-8",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("h1",{className:"text-3xl font-semibold tracking-tight",children:["Claw Kitchen"," ",(0,b.jsx)("span",{className:"text-sm align-middle text-[color:var(--ck-text-secondary)]",children:"(v2)"})]}),(0,b.jsx)("p",{className:"mt-2 max-w-prose text-[color:var(--ck-text-secondary)]",children:"Installed agents on this machine, grouped by team workspace when available."})]}),(0,b.jsxs)("div",{className:"flex flex-col items-start gap-2 sm:items-end",children:[(0,b.jsx)(c.default,{href:"/recipes?createCustomTeam=1",className:"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]",children:"Create team"}),(0,b.jsx)(c.default,{href:"/recipes",className:"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]",children:"Recipes"}),(0,b.jsx)(c.default,{href:"/tickets",className:"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]",children:"Tickets"}),(0,b.jsx)(c.default,{href:"/settings",className:"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]",children:"Settings"})]})]}),h.length?(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Team filter"}),(0,b.jsxs)("select",{className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] sm:w-[280px]",value:i,onChange:a=>j(a.target.value),children:[(0,b.jsx)("option",{value:"all",children:"All teams"}),h.map(a=>{let c=g[a]||g[f(a)]||a;return(0,b.jsx)("option",{value:a,children:c},a)}),(0,b.jsx)("option",{value:"personal",children:"Personal / Unassigned"})]})]}):null,(0,b.jsx)("div",{className:"mt-8 space-y-8",children:k.map(a=>(0,b.jsxs)("section",{children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-4",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("h2",{className:"truncate text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:a.title}),a.subtitle?(0,b.jsx)("div",{className:"mt-0.5 truncate text-xs text-[color:var(--ck-text-secondary)]",children:a.subtitle}):null]}),a.isTeam?(0,b.jsx)(c.default,{href:`/teams/${encodeURIComponent(a.key)}`,className:"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]",children:"Edit"}):null]}),(0,b.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3",children:a.agents.map(a=>(0,b.jsxs)(c.default,{href:`/agents/${encodeURIComponent(a.id)}`,className:"ck-glass block px-4 py-3 transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]",children:[(0,b.jsx)("div",{className:"truncate font-medium text-[color:var(--ck-text-primary)]",children:a.identityName||a.id}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[a.id,a.isDefault?" • default":""]}),a.model?(0,b.jsx)("div",{className:"mt-1 truncate text-xs text-[color:var(--ck-text-tertiary)]",children:a.model}):null]},a.id))})]},a.key))}),(0,b.jsxs)("p",{className:"mt-10 text-xs text-[color:var(--ck-text-tertiary)]",children:["Note: Team detection currently uses the convention ",(0,b.jsx)("code",{children:"~/.openclaw/workspace-<teamId>"}),"."]})]})}a.s(["default",()=>g])}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_app_HomeClient_tsx_f9f7568d._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/HomeClient.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useMemo, useState } from \"react\";\n\ntype AgentListItem = {\n id: string;\n identityName?: string;\n workspace?: string;\n model?: string;\n isDefault?: boolean;\n};\n\nfunction inferTeamIdFromWorkspace(workspace: string | undefined) {\n if (!workspace) return null;\n const parts = workspace.split(\"/\").filter(Boolean);\n // Team workspaces are typically ~/.openclaw/workspace-<teamId>/..., so the workspace- segment\n // is not always the last path component.\n const wsPart = parts.find((p) => p.startsWith(\"workspace-\")) ?? \"\";\n if (!wsPart) return null;\n const team = wsPart.slice(\"workspace-\".length);\n return team || null;\n}\n\nfunction normalizeTeamId(teamId: string) {\n // Support legacy workspaces that used a \"-team\" suffix.\n return teamId.endsWith(\"-team\") ? teamId.slice(0, -\"-team\".length) : teamId;\n}\n\nexport default function HomeClient({\n agents,\n teamNames,\n}: {\n agents: AgentListItem[];\n teamNames: Record<string, string>;\n}) {\n const teamIds = useMemo(() => {\n const s = new Set<string>();\n for (const a of agents) {\n const t = inferTeamIdFromWorkspace(a.workspace);\n if (t) s.add(t);\n }\n return Array.from(s).sort();\n }, [agents]);\n\n const [teamFilter, setTeamFilter] = useState<string>(\"all\");\n\n const grouped = useMemo(() => {\n const groups = new Map<string, AgentListItem[]>();\n\n function titleCaseId(id: string) {\n const s = id\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!s) return id;\n return s\n .split(\" \")\n .map((w) => {\n if (/^(ai|api|cli|ui|ux|sre|qa|devops)$/i.test(w)) return w.toUpperCase();\n return w.slice(0, 1).toUpperCase() + w.slice(1);\n })\n .join(\" \");\n }\n\n function displayNameFor(teamId: string) {\n const normalized = normalizeTeamId(teamId);\n return teamNames[teamId] || teamNames[normalized] || titleCaseId(normalized);\n }\n\n for (const a of agents) {\n const teamId = inferTeamIdFromWorkspace(a.workspace) ?? \"personal\";\n if (teamFilter !== \"all\" && teamId !== teamFilter) continue;\n const key = teamId;\n const list = groups.get(key) ?? [];\n list.push(a);\n groups.set(key, list);\n }\n\n // Stable ordering: teams first (alphabetical), then personal.\n const keys = Array.from(groups.keys()).sort((a, b) => {\n if (a === \"personal\") return 1;\n if (b === \"personal\") return -1;\n return a.localeCompare(b);\n });\n\n return keys.map((k) => {\n const display = k === \"personal\" ? \"Personal / Unassigned\" : displayNameFor(k);\n return {\n key: k,\n title: display,\n // Keep the raw id visible, but deemphasize it.\n subtitle: k === \"personal\" ? null : `workspace-${k}`,\n agents: (groups.get(k) ?? []).slice().sort((a, b) => a.id.localeCompare(b.id)),\n isTeam: k !== \"personal\",\n };\n });\n }, [agents, teamFilter, teamNames]);\n\n return (\n <div className=\"ck-glass mx-auto max-w-5xl p-6 sm:p-8\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h1 className=\"text-3xl font-semibold tracking-tight\">\n Claw Kitchen{\" \"}\n <span className=\"text-sm align-middle text-[color:var(--ck-text-secondary)]\">(v2)</span>\n </h1>\n <p className=\"mt-2 max-w-prose text-[color:var(--ck-text-secondary)]\">\n Installed agents on this machine, grouped by team workspace when available.\n </p>\n </div>\n\n <div className=\"flex flex-col items-start gap-2 sm:items-end\">\n <Link\n href=\"/recipes\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Recipes\n </Link>\n <Link\n href=\"/tickets\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Tickets\n </Link>\n <Link\n href=\"/settings\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Settings\n </Link>\n </div>\n </div>\n\n {teamIds.length ? (\n <div className=\"mt-6\">\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team filter</label>\n <select\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] sm:w-[280px]\"\n value={teamFilter}\n onChange={(e) => setTeamFilter(e.target.value)}\n >\n <option value=\"all\">All teams</option>\n {teamIds.map((t) => {\n const label = teamNames[t] || teamNames[normalizeTeamId(t)] || t;\n return (\n <option key={t} value={t}>\n {label}\n </option>\n );\n })}\n <option value=\"personal\">Personal / Unassigned</option>\n </select>\n </div>\n ) : null}\n\n \n\n <div className=\"mt-8 space-y-8\">\n {grouped.map((g) => (\n <section key={g.key}>\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">{g.title}</h2>\n {g.subtitle ? (\n <div className=\"mt-0.5 truncate text-xs text-[color:var(--ck-text-secondary)]\">{g.subtitle}</div>\n ) : null}\n </div>\n {g.isTeam ? (\n <Link\n href={`/teams/${encodeURIComponent(g.key)}`}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]\"\n >\n Edit\n </Link>\n ) : null}\n </div>\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {g.agents.map((a) => (\n <Link\n key={a.id}\n href={`/agents/${encodeURIComponent(a.id)}`}\n className=\"ck-glass block px-4 py-3 transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]\"\n >\n <div className=\"truncate font-medium text-[color:var(--ck-text-primary)]\">\n {a.identityName || a.id}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {a.id}\n {a.isDefault ? \" • default\" : \"\"}\n </div>\n {a.model ? (\n <div className=\"mt-1 truncate text-xs text-[color:var(--ck-text-tertiary)]\">{a.model}</div>\n ) : null}\n </Link>\n ))}\n </div>\n </section>\n ))}\n </div>\n\n <p className=\"mt-10 text-xs text-[color:var(--ck-text-tertiary)]\">\n Note: Team detection currently uses the convention <code>~/.openclaw/workspace-<teamId></code>.\n </p>\n </div>\n );\n}\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAUA,SAAS,EAAyB,CAA6B,EAC7D,GAAI,CAAC,EAAW,OAAO,KAIvB,IAAM,EAAS,AAHD,EAAU,KAAK,CAAC,KAAK,MAAM,CAAC,SAGrB,IAAI,CAAC,AAAC,GAAM,EAAE,UAAU,CAAC,gBAAkB,UAChE,AAAK,GACQ,CADT,CACgB,GADP,EACY,CAAC,IADN,CAEL,IACjB,CAEA,GAJyC,MAIhC,AAJsC,EAItB,CAAc,EAErC,OAAO,EAAO,QAAQ,CAAC,SAAW,EAAO,KAAK,CAAC,EAAG,CAAC,GAAkB,CACvE,CAEe,GAH8C,MAAM,AAG3C,EAAW,QACjC,CAAM,WACN,CAAS,CAIV,EACC,IAAM,EAAU,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACtB,IAAM,EAAI,IAAI,IACd,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAI,EAAyB,EAAE,SAAS,EAC1C,GAAG,EAAE,GAAG,CAAC,EACf,CACA,OAAO,MAAM,IAAI,CAAC,GAAG,IAAI,EAC3B,EAAG,CAAC,EAAO,EAEL,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,OAE/C,EAAU,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACtB,IAAM,EAAS,IAAI,IAsBnB,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAS,EAAyB,EAAE,SAAS,GAAK,WACxD,GAAmB,QAAf,GAAwB,IAAW,EAAY,SAEnD,IAAM,EAAO,EAAO,GAAG,CAAC,AADZ,IACoB,EAAE,CAClC,EAAK,IAAI,CAAC,GACV,EAAO,GAAG,CAAC,EAAK,EAClB,CASA,OAAO,AANM,MAAM,IAAI,CAAC,EAAO,IAAI,IAAI,IAAI,CAAC,CAAC,EAAG,IAC9C,AAAU,YAAY,CAAlB,EAAyB,EACnB,YAAY,CAAlB,EAAyB,CAAC,EACvB,EAAE,aAAa,CAAC,IAGb,GAAG,CAAC,AAAC,YACT,EAAgB,aAAN,EAAmB,yBArB7B,CAqBuD,CArB1C,KACZ,CAAS,CAAC,AAoB2D,EApBpD,EAAI,CAAS,CAAC,EAAW,CADd,GACkB,AAhB/C,EAgB2D,AAhBvD,EACP,OAAO,CAAC,SAAU,KAClB,OAAO,CAAC,OAAQ,KAChB,IAAI,IAEA,EACJ,KAAK,CAAC,KACN,GAAG,CAAC,AAAC,GACJ,AAAI,sCAAsC,IAAI,CAAC,GAAW,CAAP,CAAS,WAAW,GAChE,EAAE,KAAK,CAAC,EAAG,GAAG,WAAW,GAAK,EAAE,KAAK,CAAC,IAE9C,IAAI,CAAC,SA0BR,MAAO,CACL,IAAK,EACL,MAAO,EAEP,SAAgB,aAAN,EAAmB,KAAO,CAAC,UAAU,EAAE,EAAA,CAAG,CACpD,OAAQ,CAAC,EAAO,GAAG,CAAC,IAAM,EAAA,AAAE,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,EAAG,IAAM,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,GAC5E,OAAc,aAAN,CACV,CACF,EACF,EAAG,CAAC,EAAQ,EAAY,EAAU,EAElC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8EACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,kDAAwC,eACvC,IACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,sEAA6D,YAE/E,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,kEAAyD,mFAKxE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CACH,KAAK,WACL,UAAU,iIACX,YAGD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CACH,KAAK,WACL,UAAU,iIACX,YAGD,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CACH,KAAK,YACL,UAAU,iIACX,mBAMJ,EAAQ,MAAM,CACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBACb,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,2EAAkE,gBACnF,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,UAAU,uNACV,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,YAE7C,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,cACnB,EAAQ,GAAG,CAAC,AAAC,IACZ,IAAM,EAAQ,CAAS,CAAC,EAAE,EAAI,CAAS,CAAC,EAAgB,GAAG,EAAI,EAC/D,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAe,MAAO,WACpB,GADU,EAIjB,GACA,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,oBAAW,gCAG3B,KAIJ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,EAAQ,GAAG,CAAC,AAAC,GACZ,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,WACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oBACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,6FAAqF,EAAE,KAAK,GACzG,EAAE,QAAQ,CACT,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yEAAiE,EAAE,QAAQ,GACxF,QAEL,EAAE,MAAM,CACP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAI,CAAA,CACH,KAAM,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,EAAA,CAAG,CAC3C,UAAU,kRACX,SAGC,QAGN,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEACZ,EAAE,MAAM,CAAC,GAAG,CAAC,AAAC,GACb,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAI,CAAA,CAEH,KAAM,CAAC,QAAQ,EAAE,mBAAmB,EAAE,EAAE,EAAA,CAAG,CAC3C,UAAU,kGAEV,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,oEACZ,EAAE,YAAY,EAAI,EAAE,EAAE,GAEzB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DACZ,EAAE,EAAE,CACJ,EAAE,SAAS,CAAG,aAAe,MAE/B,EAAE,KAAK,CACN,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sEAA8D,EAAE,KAAK,GAClF,OAbC,EAAE,EAAE,OArBH,EAAE,GAAG,KA0CvB,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,sDACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,mCAA2C,SAI5G"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/HomeClient.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useMemo, useState } from \"react\";\nimport type { AgentListItem } from \"@/lib/agents\";\n\nfunction inferTeamIdFromWorkspace(workspace: string | undefined) {\n if (!workspace) return null;\n const parts = workspace.split(\"/\").filter(Boolean);\n // Team workspaces are typically ~/.openclaw/workspace-<teamId>/..., so the workspace- segment\n // is not always the last path component.\n const wsPart = parts.find((p) => p.startsWith(\"workspace-\")) ?? \"\";\n if (!wsPart) return null;\n const team = wsPart.slice(\"workspace-\".length);\n return team || null;\n}\n\nfunction normalizeTeamId(teamId: string) {\n // Support legacy workspaces that used a \"-team\" suffix.\n return teamId.endsWith(\"-team\") ? teamId.slice(0, -\"-team\".length) : teamId;\n}\n\nexport default function HomeClient({\n agents,\n teamNames,\n}: {\n agents: AgentListItem[];\n teamNames: Record<string, string>;\n}) {\n const teamIds = useMemo(() => {\n const s = new Set<string>();\n for (const a of agents) {\n const t = inferTeamIdFromWorkspace(a.workspace);\n if (t) s.add(t);\n }\n return Array.from(s).sort();\n }, [agents]);\n\n const [teamFilter, setTeamFilter] = useState<string>(\"all\");\n\n const grouped = useMemo(() => {\n const groups = new Map<string, AgentListItem[]>();\n\n function titleCaseId(id: string) {\n const s = id\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (!s) return id;\n return s\n .split(\" \")\n .map((w) => {\n if (/^(ai|api|cli|ui|ux|sre|qa|devops)$/i.test(w)) return w.toUpperCase();\n return w.slice(0, 1).toUpperCase() + w.slice(1);\n })\n .join(\" \");\n }\n\n function displayNameFor(teamId: string) {\n const normalized = normalizeTeamId(teamId);\n return teamNames[teamId] || teamNames[normalized] || titleCaseId(normalized);\n }\n\n for (const a of agents) {\n const teamId = inferTeamIdFromWorkspace(a.workspace) ?? \"personal\";\n if (teamFilter !== \"all\" && teamId !== teamFilter) continue;\n const key = teamId;\n const list = groups.get(key) ?? [];\n list.push(a);\n groups.set(key, list);\n }\n\n // Stable ordering: teams first (alphabetical), then personal.\n const keys = Array.from(groups.keys()).sort((a, b) => {\n if (a === \"personal\") return 1;\n if (b === \"personal\") return -1;\n return a.localeCompare(b);\n });\n\n return keys.map((k) => {\n const display = k === \"personal\" ? \"Personal / Unassigned\" : displayNameFor(k);\n return {\n key: k,\n title: display,\n // Keep the raw id visible, but deemphasize it.\n subtitle: k === \"personal\" ? null : `workspace-${k}`,\n agents: (groups.get(k) ?? []).slice().sort((a, b) => a.id.localeCompare(b.id)),\n isTeam: k !== \"personal\",\n };\n });\n }, [agents, teamFilter, teamNames]);\n\n return (\n <div className=\"ck-glass w-full p-6 sm:p-8\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h1 className=\"text-3xl font-semibold tracking-tight\">\n Claw Kitchen{\" \"}\n <span className=\"text-sm align-middle text-[color:var(--ck-text-secondary)]\">(v2)</span>\n </h1>\n <p className=\"mt-2 max-w-prose text-[color:var(--ck-text-secondary)]\">\n Installed agents on this machine, grouped by team workspace when available.\n </p>\n </div>\n\n <div className=\"flex flex-col items-start gap-2 sm:items-end\">\n <Link\n href=\"/recipes?createCustomTeam=1\"\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]\"\n >\n Create team\n </Link>\n <Link\n href=\"/recipes\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Recipes\n </Link>\n <Link\n href=\"/tickets\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Tickets\n </Link>\n <Link\n href=\"/settings\"\n className=\"text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]\"\n >\n Settings\n </Link>\n </div>\n </div>\n\n {teamIds.length ? (\n <div className=\"mt-6\">\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team filter</label>\n <select\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] sm:w-[280px]\"\n value={teamFilter}\n onChange={(e) => setTeamFilter(e.target.value)}\n >\n <option value=\"all\">All teams</option>\n {teamIds.map((t) => {\n const label = teamNames[t] || teamNames[normalizeTeamId(t)] || t;\n return (\n <option key={t} value={t}>\n {label}\n </option>\n );\n })}\n <option value=\"personal\">Personal / Unassigned</option>\n </select>\n </div>\n ) : null}\n\n \n\n <div className=\"mt-8 space-y-8\">\n {grouped.map((g) => (\n <section key={g.key}>\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"min-w-0\">\n <h2 className=\"truncate text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">{g.title}</h2>\n {g.subtitle ? (\n <div className=\"mt-0.5 truncate text-xs text-[color:var(--ck-text-secondary)]\">{g.subtitle}</div>\n ) : null}\n </div>\n {g.isTeam ? (\n <Link\n href={`/teams/${encodeURIComponent(g.key)}`}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]\"\n >\n Edit\n </Link>\n ) : null}\n </div>\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {g.agents.map((a) => (\n <Link\n key={a.id}\n href={`/agents/${encodeURIComponent(a.id)}`}\n className=\"ck-glass block px-4 py-3 transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]\"\n >\n <div className=\"truncate font-medium text-[color:var(--ck-text-primary)]\">\n {a.identityName || a.id}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {a.id}\n {a.isDefault ? \" • default\" : \"\"}\n </div>\n {a.model ? (\n <div className=\"mt-1 truncate text-xs text-[color:var(--ck-text-tertiary)]\">{a.model}</div>\n ) : null}\n </Link>\n ))}\n </div>\n </section>\n ))}\n </div>\n\n <p className=\"mt-10 text-xs text-[color:var(--ck-text-tertiary)]\">\n Note: Team detection currently uses the convention <code>~/.openclaw/workspace-<teamId></code>.\n </p>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[98262,a=>{"use strict";var b=a.i(87924),c=a.i(35112),d=a.i(72131),e=a.i(50944);function f({open:a,agentId:d,busy:e,error:f,onClose:g,onConfirm:h}){return a?(0,c.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:g}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete agent"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete agent ",(0,b.jsx)("code",{className:"font-mono",children:d}),"? This will remove its workspace/state."]}),f?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:f}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:g,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:e,onClick:h,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:e?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function g({agentId:a,returnTo:c}){let g=(0,e.useRouter)(),[h,i]=(0,d.useState)(null),[j,k]=(0,d.useState)(!0),[l,m]=(0,d.useState)(!1),[n,o]=(0,d.useState)(!1),[p,q]=(0,d.useState)(""),[r,s]=(0,d.useState)(""),[t,u]=(0,d.useState)(""),[v,w]=(0,d.useState)(""),[x,y]=(0,d.useState)(!1),[z,A]=(0,d.useState)(!1),[B,C]=(0,d.useState)(null),[D,E]=(0,d.useState)("identity"),[F,G]=(0,d.useState)(""),[H,I]=(0,d.useState)(""),[J,K]=(0,d.useState)(""),[L,M]=(0,d.useState)(""),[N,O]=(0,d.useState)(""),[P,Q]=(0,d.useState)([]),[R,S]=(0,d.useState)([]),[T,U]=(0,d.useState)(!1),[V,W]=(0,d.useState)(""),[X,Y]=(0,d.useState)(!1),[Z,$]=(0,d.useState)([]),[_,aa]=(0,d.useState)(!1),[ab,ac]=(0,d.useState)(!1),[ad,ae]=(0,d.useState)("SOUL.md"),[af,ag]=(0,d.useState)(""),ah=a.includes("-")?a.split("-").slice(0,-1).join("-"):"";async function ai(){m(!0),q("");try{let b=await fetch("/api/agents/identity",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:F,emoji:H,theme:J,avatar:L})}),c=await b.json();if(!b.ok)throw Error(c.message||c.error||"Save failed");q("Saved identity via openclaw agents set-identity")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function aj(){m(!0),q("");try{let b=await fetch("/api/agents/update",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,patch:{model:N}})}),c=await b.json();if(!b.ok)throw Error(c.error||"Save config failed");q("Saved agent config (model) and restarted gateway")}catch(a){q(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function ak(b){ae(b),ag(""),o(!0),s("");try{let c=await fetch(`/api/agents/file?agentId=${encodeURIComponent(a)}&name=${encodeURIComponent(b)}`,{cache:"no-store"}),d=await c.json();if(!c.ok||!d.ok)throw Error(d.error||"Failed to load file");ag(String(d.content??""))}catch(a){s(a instanceof Error?a.message:String(a))}finally{o(!1)}}async function al(){m(!0),s("");try{let b=await fetch("/api/agents/file",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:ad,content:af})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to save file");let d=await fetch(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await d.json();d.ok&&e.ok&&Array.isArray(e.files)&&$(e.files)}catch(a){s(a instanceof Error?a.message:String(a))}finally{m(!1)}}async function am(a){ae(a),s(""),ag(function(a){switch(a){case"SOUL.md":return"# SOUL.md\n\n";case"AGENTS.md":return"# AGENTS.md\n\n";case"TOOLS.md":return"# TOOLS.md\n\n";case"STATUS.md":return"# STATUS.md\n\n- (empty)\n";case"NOTES.md":return"# NOTES.md\n\n- (empty)\n";case"IDENTITY.md":return"# IDENTITY.md\n\n- **Name:**\n- **Creature:**\n- **Vibe:**\n- **Emoji:**\n- **Avatar:**\n";case"USER.md":return"# USER.md\n\n";case"HEARTBEAT.md":return"# HEARTBEAT.md\n\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\n";default:return""}}(a)),await al()}async function an(){A(!0),C(null),q("");try{let b=await fetch(`/api/agents/${encodeURIComponent(a)}`,{method:"DELETE"}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||c.message||c.stderr||"Delete failed");window.location.href="/"}catch(a){C(a instanceof Error?a.message:String(a)),A(!1)}}return(0,d.useEffect)(()=>{(async()=>{k(!0),q("");try{let b=await fetch("/api/agents",{cache:"no-store"}),c=await b.json(),d=(Array.isArray(c.agents)?c.agents:[]).find(b=>b.id===a)??null;i(d),G(d?.identityName??""),O(d?.model??""),k(!1),(async()=>{aa(!0),U(!0);try{let[b,c,d]=await Promise.all([fetch(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),fetch("/api/skills/available",{cache:"no-store"})]),e=[];try{let a=await b.json();if(b.ok&&a.ok){let b=Array.isArray(a.files)?a.files:[];$(b.map(a=>({name:String(a.name??""),missing:!!a.missing,required:!!a.required,rationale:"string"==typeof a.rationale?a.rationale:void 0})))}}catch{}try{let a=await c.json();c.ok&&a.ok&&(e=Array.isArray(a.skills)?a.skills:[],Q(e))}catch{}try{let a=await d.json();if(d.ok&&a.ok){let b=Array.isArray(a.skills)?a.skills:[];S(b);let c=b.find(a=>!e.includes(a));W(c??b[0]??"")}}catch{}}finally{aa(!1),U(!1)}})()}catch(a){q(a instanceof Error?a.message:String(a))}finally{k(!1)}})()},[a]),(0,d.useEffect)(()=>{if("files"!==D||!Z.length)return;let a=Z.some(a=>a.name===ad),b=Z[0]?.name,c=a?ad:b;c&&(c!==ad&&(ae(c),ag("")),af||ak(c))},[D,a,Z.length]),j?(0,b.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Loading…"}):h?(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6 sm:p-8",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Agent editor"}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[h.id,h.isDefault?" • default":"",h.model?` • ${h.model}`:""]})]}),(0,b.jsx)("button",{type:"button",disabled:l,onClick:()=>{C(null),y(!0)},className:"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50",children:"Delete agent"})]}),h.workspace?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Workspace: ",h.workspace]}):null,ah?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Team: ",ah]}):null,p?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]",children:p}):null,(0,b.jsx)("div",{className:"mt-6 flex flex-wrap gap-2",children:[{id:"identity",label:"Identity"},{id:"config",label:"Config"},{id:"skills",label:"Skills"},{id:"files",label:"Files"}].map(a=>(0,b.jsx)("button",{onClick:()=>E(a.id),className:D===a.id?"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]":"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10",children:a.label},a.id))}),(0,b.jsxs)("div",{className:"mt-6 grid grid-cols-1 gap-4",children:["identity"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Identity"}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Name"}),(0,b.jsx)("input",{value:F,onChange:a=>G(a.target.value),className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Emoji"}),(0,b.jsx)("input",{value:H,onChange:a=>I(a.target.value),placeholder:"🦞",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Theme"}),(0,b.jsx)("input",{value:J,onChange:a=>K(a.target.value),placeholder:"warm, sharp, calm",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Avatar"}),(0,b.jsx)("input",{value:L,onChange:a=>M(a.target.value),placeholder:"avatars/openclaw.png",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col gap-2 sm:flex-row",children:[(0,b.jsx)("button",{disabled:l,onClick:ai,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50",children:l?"Saving…":"Save"}),c?(0,b.jsx)("button",{disabled:l,onClick:async()=>{await ai(),g.push(c)},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50",children:"Save & return"}):null]})]}):null,"config"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Config"}),(0,b.jsx)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:"Thin slice: edit the configured model id for this agent (writes to OpenClaw config)."}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Model"}),(0,b.jsx)("input",{value:N,onChange:a=>O(a.target.value),placeholder:"openai/gpt-5.2",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsx)("button",{disabled:l,onClick:aj,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save config"})})]}):null,"skills"===D?(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Skills"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Skills installed in this ",(0,b.jsx)("strong",{children:"agent"})," workspace (",(0,b.jsx)("code",{children:"skills/"}),"). If you want a skill available to all agents, add it at the team level."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Installed"}),(0,b.jsx)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]",children:T?(0,b.jsx)("li",{children:"Loading…"}):P.length?P.map(a=>(0,b.jsx)("li",{children:a},a)):(0,b.jsx)("li",{children:"None installed."})})]}),(0,b.jsxs)("div",{className:"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Add a skill"}),(0,b.jsxs)("div",{className:"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center",children:[(0,b.jsx)("select",{value:V,onChange:a=>W(a.target.value),className:"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",disabled:X||!R.length,children:R.length?R.map(a=>(0,b.jsx)("option",{value:a,children:a},a)):(0,b.jsx)("option",{value:"",children:"No skills found"})}),(0,b.jsx)("button",{type:"button",disabled:X||!V,onClick:async()=>{Y(!0),u(""),w("");try{let b=await fetch("/api/agents/skills/install",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,skill:V})}),c=await b.json();if(!b.ok||!c.ok)throw Error(c.error||"Failed to install skill");u(`Installed skill: ${V}`);let d=await fetch(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"}),e=await d.json();d.ok&&e.ok&&Q(Array.isArray(e.skills)?e.skills:[])}catch(a){w(a instanceof Error?a.message:String(a))}finally{Y(!1)}},className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:X?"Adding…":"Add"})]}),v?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:v}):t?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100",children:t}):null,(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["This uses ",(0,b.jsxs)("code",{children:["openclaw recipes install-skill <skill> --agent-id ",a," --yes"]}),"."]})]})]}):null,"files"===D?(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent files"}),(0,b.jsxs)("label",{className:"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:ab,onChange:a=>ac(a.target.checked)}),"Show optional"]})]}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"Default view hides optional missing files to reduce noise."}),(0,b.jsxs)("ul",{className:"mt-3 space-y-1",children:[_?(0,b.jsx)("li",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"Loading…"}):null,Z.filter(a=>!!ab||!!a.required||!a.missing).map(a=>(0,b.jsx)("li",{children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsxs)("button",{onClick:()=>ak(a.name),className:ad===a.name?"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]":"w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5",children:[(0,b.jsx)("span",{className:a.required?"text-[color:var(--ck-text-primary)]":"text-[color:var(--ck-text-secondary)]",children:a.name}),(0,b.jsx)("span",{className:"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]",children:a.required?"required":"optional"}),a.missing?(0,b.jsx)("span",{className:"ml-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"missing"}):null]}),a.missing?(0,b.jsx)("button",{type:"button",disabled:l,onClick:()=>void am(a.name),className:"shrink-0 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50",children:"Create"}):null]})},a.name))]})]}),(0,b.jsxs)("div",{className:"ck-glass-strong p-4 lg:col-span-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Edit: ",ad]}),(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[n?(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Loading…"}):null,(0,b.jsx)("button",{disabled:l,onClick:al,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:l?"Saving…":"Save file"})]})]}),r?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:r}):null,(0,b.jsx)("textarea",{value:af,onChange:a=>ag(a.target.value),className:"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]",spellCheck:!1})]})]}):null]}),(0,b.jsx)(f,{open:x,agentId:a,busy:z,error:B,onClose:()=>y(!1),onConfirm:()=>void an()})]}):(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:["Agent not found: ",a]})}a.s(["default",()=>g])}];
|
|
1
|
+
module.exports=[98262,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(50944),e=a.i(74621),f=a.i(51200),g=a.i(88764),h=a.i(60791);function i({name:a,emoji:c,theme:d,avatar:e,saving:f,returnTo:g,onNameChange:h,onEmojiChange:i,onThemeChange:j,onAvatarChange:k,onSave:l,router:m}){return(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Identity"}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Name"}),(0,b.jsx)("input",{value:a,onChange:a=>h(a.target.value),className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Emoji"}),(0,b.jsx)("input",{value:c,onChange:a=>i(a.target.value),placeholder:"🦞",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Theme"}),(0,b.jsx)("input",{value:d,onChange:a=>j(a.target.value),placeholder:"warm, sharp, calm",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Avatar"}),(0,b.jsx)("input",{value:e,onChange:a=>k(a.target.value),placeholder:"avatars/openclaw.png",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]}),(0,b.jsxs)("div",{className:"mt-4 flex flex-col gap-2 sm:flex-row",children:[(0,b.jsx)("button",{disabled:f,onClick:l,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50",children:f?"Saving…":"Save"}),g?(0,b.jsx)("button",{disabled:f,onClick:async()=>{await l(),m.push(g)},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50",children:"Save & return"}):null]})]})}function j({model:a,saving:c,onModelChange:d,onSave:e}){return(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Config"}),(0,b.jsx)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:"Thin slice: edit the configured model id for this agent (writes to OpenClaw config)."}),(0,b.jsx)("label",{className:"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Model"}),(0,b.jsx)("input",{value:a,onChange:a=>d(a.target.value),placeholder:"openai/gpt-5.2",className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),(0,b.jsx)("div",{className:"mt-3",children:(0,b.jsx)("button",{disabled:c,onClick:e,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:c?"Saving…":"Save config"})})]})}function k({agentId:a,skillsList:c,availableSkills:d,skillsLoading:e,selectedSkill:f,installingSkill:g,skillError:h,skillMsg:i,onSelectedSkillChange:j,onInstallSkill:k}){return(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Skills"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Skills installed in this ",(0,b.jsx)("strong",{children:"agent"})," workspace (",(0,b.jsx)("code",{children:"skills/"}),"). If you want a skill available to all agents, add it at the team level."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Installed"}),(0,b.jsxs)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]",children:[e&&(0,b.jsx)("li",{children:"Loading…"}),!e&&c.length>0&&c.map(a=>(0,b.jsx)("li",{children:a},a)),!e&&!c.length&&(0,b.jsx)("li",{children:"None installed."})]})]}),(0,b.jsxs)("div",{className:"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Add a skill"}),(0,b.jsxs)("div",{className:"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center",children:[(0,b.jsx)("select",{value:f,onChange:a=>j(a.target.value),className:"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",disabled:g||!d.length,children:d.length?d.map(a=>(0,b.jsx)("option",{value:a,children:a},a)):(0,b.jsx)("option",{value:"",children:"No skills found"})}),(0,b.jsx)("button",{type:"button",disabled:g||!f,onClick:()=>void k(),className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:g?"Adding…":"Add"})]}),h&&(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:h}),!h&&i&&(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100",children:i}),(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["This uses ",(0,b.jsxs)("code",{children:["openclaw recipes install-skill <skill> --agent-id ",a," --yes"]}),"."]})]})]})}function l({agentFiles:a,agentFilesLoading:c,showOptionalFiles:d,fileName:e,fileContent:f,loadingFile:g,saving:i,fileError:j,onShowOptionalChange:k,onLoadFile:l,onFileContentChange:m,onSaveFile:n,onCreateMissingFile:o}){return(0,b.jsxs)("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-3",children:[(0,b.jsx)(h.FileListWithOptionalToggle,{title:"Agent files",files:a,loading:c,showOptionalFiles:d,onShowOptionalChange:k,selectedFileName:e,onSelectFile:l,renderItemExtra:a=>a.missing?(0,b.jsx)("button",{type:"button",disabled:i,onClick:()=>void o(a.name),className:"shrink-0 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50",children:"Create"}):null}),(0,b.jsxs)("div",{className:"ck-glass-strong p-4 lg:col-span-2",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,b.jsxs)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Edit: ",e]}),(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[g?(0,b.jsx)("span",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Loading…"}):null,(0,b.jsx)("button",{disabled:i,onClick:n,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50",children:i?"Saving…":"Save file"})]})]}),j?(0,b.jsx)("div",{className:"mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:j}):null,(0,b.jsx)("textarea",{value:f,onChange:a=>m(a.target.value),className:"mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]",spellCheck:!1})]})]})}async function m(a,b){b.setAgentFilesLoading(!0),b.setSkillsLoading(!0);try{let[c,d,e]=await (0,f.fetchAll)([`/api/agents/files?agentId=${encodeURIComponent(a)}`,`/api/agents/skills?agentId=${encodeURIComponent(a)}`,"/api/skills/available"]),g=[];try{let a=await c.json();if(c.ok&&a.ok){let c=Array.isArray(a.files)?a.files:[];b.setAgentFiles(c.map(a=>({name:String(a.name??""),missing:!!a.missing,required:!!a.required,rationale:"string"==typeof a.rationale?a.rationale:void 0})))}}catch{}try{let a=await d.json();d.ok&&a.ok&&(g=Array.isArray(a.skills)?a.skills:[],b.setSkillsList(g))}catch{}try{let a=await e.json();if(e.ok&&a.ok){let c=Array.isArray(a.skills)?a.skills:[];b.setAvailableSkills(c);let d=c.find(a=>!g.includes(a));b.setSelectedSkill(d??c[0]??"")}}catch{}}finally{b.setAgentFilesLoading(!1),b.setSkillsLoading(!1)}}function n({agentId:a,returnTo:h}){let n=(0,d.useRouter)(),[o,p]=(0,c.useState)(null),[q,r]=(0,c.useState)(!0),[s,t]=(0,c.useState)(!1),[u,v]=(0,c.useState)(!1),[w,x]=(0,c.useState)(""),[y,z]=(0,c.useState)(""),[A,B]=(0,c.useState)(""),[C,D]=(0,c.useState)(""),[E,F]=(0,c.useState)(!1),[G,H]=(0,c.useState)(!1),[I,J]=(0,c.useState)(null),[K,L]=(0,c.useState)("identity"),[M,N]=(0,c.useState)(""),[O,P]=(0,c.useState)(""),[Q,R]=(0,c.useState)(""),[S,T]=(0,c.useState)(""),[U,V]=(0,c.useState)(""),[W,X]=(0,c.useState)([]),[Y,Z]=(0,c.useState)([]),[$,_]=(0,c.useState)(!1),[aa,ab]=(0,c.useState)(""),[ac,ad]=(0,c.useState)(!1),[ae,af]=(0,c.useState)([]),[ag,ah]=(0,c.useState)(!1),[ai,aj]=(0,c.useState)(!1),[ak,al]=(0,c.useState)("SOUL.md"),[am,an]=(0,c.useState)(""),ao=a.includes("-")?a.split("-").slice(0,-1).join("-"):"";async function ap(a){t(!0),x("");try{let b=await a();x(b)}catch(a){x((0,e.errorMessage)(a))}finally{t(!1)}}async function aq(){await ap(async()=>(await (0,f.fetchJson)("/api/agents/identity",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:M,emoji:O,theme:Q,avatar:S})}),"Saved identity via openclaw agents set-identity"))}async function ar(){await ap(async()=>(await (0,f.fetchJson)("/api/agents/update",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,patch:{model:U}})}),"Saved agent config (model) and restarted gateway"))}async function as(b){al(b),an(""),v(!0),z("");try{let c=await (0,f.fetchJson)(`/api/agents/file?agentId=${encodeURIComponent(a)}&name=${encodeURIComponent(b)}`,{cache:"no-store"});if(!c.ok)throw Error("Failed to load file");an(String(c.content??""))}catch(a){z((0,e.errorMessage)(a))}finally{v(!1)}}async function at(){t(!0),z("");try{if(!(await (0,f.fetchJson)("/api/agents/file",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,name:ak,content:am})})).ok)throw Error("Failed to save file");try{let b=await (0,f.fetchJson)(`/api/agents/files?agentId=${encodeURIComponent(a)}`,{cache:"no-store"});b.ok&&Array.isArray(b.files)&&af(b.files)}catch{}}catch(a){z((0,e.errorMessage)(a))}finally{t(!1)}}async function au(a){al(a),z(""),an(function(a){switch(a){case"SOUL.md":return"# SOUL.md\n\n";case"AGENTS.md":return"# AGENTS.md\n\n";case"TOOLS.md":return"# TOOLS.md\n\n";case"STATUS.md":return"# STATUS.md\n\n- (empty)\n";case"NOTES.md":return"# NOTES.md\n\n- (empty)\n";case"IDENTITY.md":return"# IDENTITY.md\n\n- **Name:**\n- **Creature:**\n- **Vibe:**\n- **Emoji:**\n- **Avatar:**\n";case"USER.md":return"# USER.md\n\n";case"HEARTBEAT.md":return"# HEARTBEAT.md\n\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\n";default:return""}}(a)),await at()}async function av(){H(!0),J(null),x("");try{await (0,f.fetchJson)(`/api/agents/${encodeURIComponent(a)}`,{method:"DELETE"}),window.location.href="/"}catch(a){J((0,e.errorMessage)(a)),H(!1)}}return(0,c.useEffect)(()=>{(async()=>{r(!0),x("");try{let b=await (0,f.fetchJson)("/api/agents",{cache:"no-store"}),c=(Array.isArray(b.agents)?b.agents:[]).find(b=>b.id===a)??null;p(c),N(c?.identityName??""),V(c?.model??""),r(!1),m(a,{setAgentFiles:af,setSkillsList:X,setAvailableSkills:Z,setSelectedSkill:ab,setAgentFilesLoading:ah,setSkillsLoading:_})}catch(a){x((0,e.errorMessage)(a))}finally{r(!1)}})()},[a]),(0,c.useEffect)(()=>{if("files"!==K||!ae.length)return;let a=ae.some(a=>a.name===ak),b=ae[0]?.name,c=a?ak:b;c&&(c!==ak&&(al(c),an("")),am||as(c))},[K,a,ae.length]),q?(0,b.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Loading…"}):o?(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6 sm:p-8",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"Agent editor"}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[o.id,o.isDefault?" • default":"",o.model?` • ${o.model}`:""]})]}),(0,b.jsx)("button",{type:"button",disabled:s,onClick:()=>{J(null),F(!0)},className:"rounded-[var(--ck-radius-sm)] border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-50",children:"Delete agent"})]}),o.workspace?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Workspace: ",o.workspace]}):null,ao?(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Team: ",ao]}):null,w?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]",children:w}):null,(0,b.jsx)("div",{className:"mt-6 flex flex-wrap gap-2",children:[{id:"identity",label:"Identity"},{id:"config",label:"Config"},{id:"skills",label:"Skills"},{id:"files",label:"Files"}].map(a=>(0,b.jsx)("button",{onClick:()=>L(a.id),className:K===a.id?"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]":"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10",children:a.label},a.id))}),(0,b.jsxs)("div",{className:"mt-6 grid grid-cols-1 gap-4",children:["identity"===K&&(0,b.jsx)(i,{name:M,emoji:O,theme:Q,avatar:S,saving:s,returnTo:h,onNameChange:N,onEmojiChange:P,onThemeChange:R,onAvatarChange:T,onSave:aq,router:n}),"config"===K&&(0,b.jsx)(j,{model:U,saving:s,onModelChange:V,onSave:ar}),"skills"===K&&(0,b.jsx)(k,{agentId:a,skillsList:W,availableSkills:Y,skillsLoading:$,selectedSkill:aa,installingSkill:ac,skillError:C,skillMsg:A,onSelectedSkillChange:ab,onInstallSkill:async()=>{ad(!0),B(""),D("");try{await (0,f.fetchJson)("/api/agents/skills/install",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({agentId:a,skill:aa})}),B(`Installed skill: ${aa}`);try{let b=await (0,f.fetchJson)(`/api/agents/skills?agentId=${encodeURIComponent(a)}`,{cache:"no-store"});b.ok&&Array.isArray(b.skills)&&X(b.skills)}catch{}}catch(a){D((0,e.errorMessage)(a))}finally{ad(!1)}}}),"files"===K&&(0,b.jsx)(l,{agentFiles:ae,agentFilesLoading:ag,showOptionalFiles:ai,fileName:ak,fileContent:am,loadingFile:u,saving:s,fileError:y,onShowOptionalChange:aj,onLoadFile:as,onFileContentChange:an,onSaveFile:at,onCreateMissingFile:au})]}),(0,b.jsx)(g.DeleteAgentModal,{open:E,agentId:a,busy:G,error:I,onClose:()=>F(!1),onConfirm:()=>void av()})]}):(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:["Agent not found: ",a]})}a.s(["default",()=>n],98262)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_app_agents_%5BagentId%5D_agent-editor_tsx_f85bbe65._.js.map
|