@jiggai/kitchen 0.3.33 → 0.3.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +4 -0
- package/.next/build-manifest.json +5 -5
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +4 -4
- package/.next/required-server-files.json +4 -4
- package/.next/routes-manifest.json +24 -0
- package/.next/server/app/_global-error/page/build-manifest.json +3 -3
- package/.next/server/app/_global-error/page.js +2 -2
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page/build-manifest.json +3 -3
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +5 -5
- package/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/agents/[agentId]/page/build-manifest.json +3 -3
- package/.next/server/app/agents/[agentId]/page.js +2 -2
- package/.next/server/app/agents/[agentId]/page.js.nft.json +1 -1
- package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/api/agents/[id]/route.js +1 -1
- package/.next/server/app/api/agents/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/add/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/file/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/files/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/route.js +1 -1
- package/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
- package/.next/server/app/api/channels/bindings/route.js +1 -1
- package/.next/server/app/api/channels/bindings/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/bulk/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/cron/bulk/route/build-manifest.json +11 -0
- package/.next/server/app/api/cron/bulk/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/cron/bulk/route.js +6 -0
- package/.next/server/app/api/cron/bulk/route.js.map +5 -0
- package/.next/server/app/api/cron/bulk/route.js.nft.json +1 -0
- package/.next/server/app/api/cron/bulk/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/cron/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/jobs/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/recipe-installed/route.js.nft.json +1 -1
- package/.next/server/app/api/cron/worker/route.js +2 -1
- package/.next/server/app/api/cron/worker/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/promote/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/goals/route.js.nft.json +1 -1
- package/.next/server/app/api/ids/check/route.js.nft.json +1 -1
- package/.next/server/app/api/manifest/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/manifest/route/build-manifest.json +11 -0
- package/.next/server/app/api/manifest/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/manifest/route.js +6 -0
- package/.next/server/app/api/manifest/route.js.map +5 -0
- package/.next/server/app/api/manifest/route.js.nft.json +1 -0
- package/.next/server/app/api/manifest/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/marketplace/recipes/[slug]/route.js +1 -1
- package/.next/server/app/api/marketplace/recipes/[slug]/route.js.nft.json +1 -1
- package/.next/server/app/api/marketplace/recipes/route.js +1 -1
- package/.next/server/app/api/marketplace/recipes/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/[pluginId]/[...path]/route.js +2 -2
- package/.next/server/app/api/plugins/[pluginId]/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/[pluginId]/tabs/[tabId]/route.js +1 -1
- package/.next/server/app/api/plugins/[pluginId]/tabs/[tabId]/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/route.js +1 -1
- package/.next/server/app/api/plugins/route.js.nft.json +1 -1
- package/.next/server/app/api/plugins/test/route.js +1 -1
- package/.next/server/app/api/plugins/test/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/clone/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/custom-team/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/local-agent-catalog/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/route.js +1 -1
- package/.next/server/app/api/recipes/route.js.nft.json +1 -1
- package/.next/server/app/api/recipes/team-agents/route.js.nft.json +1 -1
- package/.next/server/app/api/scaffold/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/cron-installation/route.js.nft.json +1 -1
- package/.next/server/app/api/settings/model-options/route.js +1 -1
- package/.next/server/app/api/settings/model-options/route.js.nft.json +1 -1
- package/.next/server/app/api/swarms/start/route.js +1 -1
- package/.next/server/app/api/swarms/start/route.js.nft.json +1 -1
- package/.next/server/app/api/swarms/status/route.js +1 -1
- package/.next/server/app/api/swarms/status/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/media-providers/route.js +1 -1
- package/.next/server/app/api/teams/[teamId]/media-providers/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/comment/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/file/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/files/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/list/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/list/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/list/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/list/route.js +6 -0
- package/.next/server/app/api/teams/list/route.js.map +5 -0
- package/.next/server/app/api/teams/list/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/list/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/memory/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/meta/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/orchestrator/route.js +1 -1
- package/.next/server/app/api/teams/orchestrator/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/remove-team/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/install/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/skills/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-deliverables/file/route.js +1 -1
- package/.next/server/app/api/teams/workflow-deliverables/file/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-deliverables/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-runs/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-templates/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-triggers/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/teams/workflow-triggers/route/build-manifest.json +11 -0
- package/.next/server/app/api/teams/workflow-triggers/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/teams/workflow-triggers/route.js +6 -0
- package/.next/server/app/api/teams/workflow-triggers/route.js.map +5 -0
- package/.next/server/app/api/teams/workflow-triggers/route.js.nft.json +1 -0
- package/.next/server/app/api/teams/workflow-triggers/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/workflows/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/assign/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/assignees/route.js.nft.json +1 -1
- package/.next/server/app/api/tickets/move/route.js.nft.json +1 -1
- package/.next/server/app/channels/page/build-manifest.json +3 -3
- package/.next/server/app/channels/page.js +2 -2
- package/.next/server/app/channels/page.js.nft.json +1 -1
- package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
- package/.next/server/app/channels.html +2 -2
- package/.next/server/app/channels.rsc +6 -6
- package/.next/server/app/channels.segments/_full.segment.rsc +6 -6
- package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_index.segment.rsc +3 -3
- package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
- package/.next/server/app/cron-jobs/page/build-manifest.json +3 -3
- package/.next/server/app/cron-jobs/page.js +2 -2
- package/.next/server/app/cron-jobs/page.js.nft.json +1 -1
- package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/[id]/page/build-manifest.json +3 -3
- package/.next/server/app/goals/[id]/page.js +2 -2
- package/.next/server/app/goals/[id]/page.js.nft.json +1 -1
- package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new/page/build-manifest.json +3 -3
- package/.next/server/app/goals/new/page.js +2 -2
- package/.next/server/app/goals/new/page.js.nft.json +1 -1
- package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/new.html +2 -2
- package/.next/server/app/goals/new.rsc +6 -6
- package/.next/server/app/goals/new.segments/_full.segment.rsc +6 -6
- package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_index.segment.rsc +3 -3
- package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
- package/.next/server/app/goals/page/build-manifest.json +3 -3
- package/.next/server/app/goals/page.js +2 -2
- package/.next/server/app/goals/page.js.nft.json +1 -1
- package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals.html +1 -1
- package/.next/server/app/goals.rsc +6 -6
- package/.next/server/app/goals.segments/_full.segment.rsc +6 -6
- package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_index.segment.rsc +3 -3
- package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
- package/.next/server/app/page/build-manifest.json +3 -3
- package/.next/server/app/page.js +4 -4
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/[id]/page/build-manifest.json +3 -3
- package/.next/server/app/recipes/[id]/page.js +4 -4
- package/.next/server/app/recipes/[id]/page.js.nft.json +1 -1
- package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/page/build-manifest.json +3 -3
- package/.next/server/app/recipes/page.js +4 -4
- package/.next/server/app/recipes/page.js.nft.json +1 -1
- package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/runs/page/build-manifest.json +3 -3
- package/.next/server/app/runs/page.js +5 -7
- package/.next/server/app/runs/page.js.nft.json +1 -1
- package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page/build-manifest.json +3 -3
- package/.next/server/app/settings/page.js +2 -2
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +6 -6
- package/.next/server/app/settings.segments/_full.segment.rsc +6 -6
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/teams/[teamId]/deliverables/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/deliverables/page.js +5 -5
- package/.next/server/app/teams/[teamId]/deliverables/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/deliverables/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/page.js +5 -6
- package/.next/server/app/teams/[teamId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js +5 -6
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/runs/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/runs/page.js +2 -2
- package/.next/server/app/teams/[teamId]/runs/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js +2 -2
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/tickets/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/tickets/page.js +2 -2
- package/.next/server/app/teams/[teamId]/tickets/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js +5 -5
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page/build-manifest.json +3 -3
- package/.next/server/app/teams/[teamId]/workflows/page.js +5 -5
- package/.next/server/app/teams/[teamId]/workflows/page.js.nft.json +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/[ticket]/page/build-manifest.json +3 -3
- package/.next/server/app/tickets/[ticket]/page.js +2 -2
- package/.next/server/app/tickets/[ticket]/page.js.nft.json +1 -1
- package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/tickets/page/build-manifest.json +3 -3
- package/.next/server/app/tickets/page.js +2 -2
- package/.next/server/app/tickets/page.js.nft.json +1 -1
- package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +4 -0
- package/.next/server/chunks/[externals]_node:fs_ddf6f167._.js +3 -0
- package/.next/server/chunks/[externals]_node:fs_ddf6f167._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__00a30f40._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__03c5f2a6._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__03c5f2a6._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__04f289da._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__08b4c8f2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__0b2c557c._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0b2c557c._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0f55461f._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1311d7a3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1480ffda._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__be5f57b2._.js → [root-of-the-server]__17fa6089._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__1873f417._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1d4f6506._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1d4f6506._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1f18c0c4._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__1f18c0c4._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1f1e62ac._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__20b1f42d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__21ad9eeb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__2c207e60._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__2dd1afff._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3021a250._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__30cd38e9._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__392e585d._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__3bfad714._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3d15e850._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3f648b9b._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__482575d2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__4898071c._.js +4 -4
- package/.next/server/chunks/[root-of-the-server]__497e7a9d._.js +22 -0
- package/.next/server/chunks/[root-of-the-server]__497e7a9d._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__4ee12514._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__55defc7c._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__74b80ca4._.js → [root-of-the-server]__5792c29e._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__5aa1dc93._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__5c5990a6._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__603cb0fa._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__6131b7e2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__6131b7e2._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__636919a0._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__653d42f0._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__653d42f0._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__663e79ff._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0883634a._.js → [root-of-the-server]__68a21bb1._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0883634a._.js.map → [root-of-the-server]__68a21bb1._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__69c065ce._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__6e463e5f._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__6e463e5f._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__c1b0d50e._.js → [root-of-the-server]__7194dfe2._.js} +3 -3
- package/.next/server/chunks/{[root-of-the-server]__f45ceefb._.js → [root-of-the-server]__7347e39f._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__f45ceefb._.js.map → [root-of-the-server]__7347e39f._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__74e2a9ba._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__7bdf9f6e._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__7bdf9f6e._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__7e12b9f4._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__87875179._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__17124952._.js → [root-of-the-server]__89f2190c._.js} +3 -3
- package/.next/server/chunks/[root-of-the-server]__8f8e110f._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__91d0cce1._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__91d0cce1._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__937b40e2._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__937b40e2._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__9853b72d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__9dba20b3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__9e96d37b._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__aba68368._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__aed4e4f2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__b6cff26d._.js +1 -1
- package/.next/server/chunks/{[root-of-the-server]__0bea0f71._.js → [root-of-the-server]__b986660c._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__0bea0f71._.js.map → [root-of-the-server]__b986660c._.js.map} +1 -1
- package/.next/server/chunks/{[root-of-the-server]__343776df._.js → [root-of-the-server]__bbed0e46._.js} +2 -2
- package/.next/server/chunks/[root-of-the-server]__c15c5141._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__c50e4bc4._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__cc0860cb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__cc3ea05b._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__cc3ea05b._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__d302afb4._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__d4a8660e._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e1432bba._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__e1432bba._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__e478ef0d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e9acbabd._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e9d9d570._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__f408c708._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__f4cbadf7._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__f5cd81f1._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__f85b5a70._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__f85b5a70._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__f994dc62._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__fb22e719._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__fb22e719._.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_cron_bulk_route_actions_30f8adb9.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_cron_bulk_route_actions_30f8adb9.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_manifest_route_actions_7f7622ff.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_manifest_route_actions_7f7622ff.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_list_route_actions_5aa8c937.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_list_route_actions_5aa8c937.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-triggers_route_actions_e86e3b38.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-triggers_route_actions_e86e3b38.js.map +1 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js.map +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_3a1b29e4.js +1 -1
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_cb6ddb24.js +13 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_cb6ddb24.js.map +1 -0
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_f5680d9e.js +1 -1
- package/.next/server/chunks/node_modules_yaml_dist_49c13b35._.js +1 -1
- package/.next/server/chunks/node_modules_yaml_dist_49c13b35._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__195421b7._.js +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__195421b7._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__2a657095._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__2a657095._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__3f55f975._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__3f55f975._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__471bc2e7._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__471bc2e7._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__4d24c088._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__4d24c088._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__6390ce9c._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__6390ce9c._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7b8cdea5._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7b8cdea5._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7d21617d._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__7d21617d._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8135c9d5._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__8135c9d5._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_1038a5b9._.js → [root-of-the-server]__8e8f535b._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_next_dist_1038a5b9._.js.map → [root-of-the-server]__8e8f535b._.js.map} +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__92524828._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__92524828._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__997aa62c._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__997aa62c._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9db1df87._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9db1df87._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__a2e3966f._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__a2e3966f._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__af792402._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__af792402._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js.map +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__becf14db._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__becf14db._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c106a298._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__c106a298._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__cb91405c._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__cb91405c._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__f59c3144._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__f59c3144._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__fbe5ff69._.js +1 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__fbe5ff69._.js.map +1 -1
- package/.next/server/chunks/ssr/_1ee3bd7b._.js +1 -1
- package/.next/server/chunks/ssr/_1ee3bd7b._.js.map +1 -1
- package/.next/server/chunks/ssr/{_deb7a691._.js → _2ab986a4._.js} +2 -2
- package/.next/server/chunks/ssr/_2ab986a4._.js.map +1 -0
- package/.next/server/chunks/ssr/_2d8d7232._.js +1 -1
- package/.next/server/chunks/ssr/_2d8d7232._.js.map +1 -1
- package/.next/server/chunks/ssr/_43a80c61._.js +1 -1
- package/.next/server/chunks/ssr/_43a80c61._.js.map +1 -1
- package/.next/server/chunks/ssr/_641f29bc._.js +3 -0
- package/.next/server/chunks/ssr/_641f29bc._.js.map +1 -0
- package/.next/server/chunks/ssr/_ac993243._.js +3 -0
- package/.next/server/chunks/ssr/_ac993243._.js.map +1 -0
- package/.next/server/chunks/ssr/_f636ce67._.js +3 -0
- package/.next/server/chunks/ssr/_f636ce67._.js.map +1 -0
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +7 -1
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js.map +1 -1
- package/.next/server/chunks/ssr/{_7f9e89d2._.js → node_modules_next_10fb6ad9._.js} +3 -3
- package/.next/server/chunks/ssr/node_modules_next_10fb6ad9._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_25a30daf._.js +1 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_compiled_bc6b8ddf._.js +1 -1
- package/.next/server/chunks/ssr/node_modules_yaml_dist_18db9ed7._.js +2 -2
- package/.next/server/chunks/ssr/src_13139e3d._.js +1 -1
- package/.next/server/chunks/ssr/src_13139e3d._.js.map +1 -1
- package/.next/server/chunks/ssr/src_2a73b867._.js +1 -1
- package/.next/server/chunks/ssr/src_2a73b867._.js.map +1 -1
- package/.next/server/chunks/ssr/src_2dbb3b7f._.js +1 -1
- package/.next/server/chunks/ssr/src_2dbb3b7f._.js.map +1 -1
- package/.next/server/chunks/ssr/src_417bc4a6._.js +1 -1
- package/.next/server/chunks/ssr/src_417bc4a6._.js.map +1 -1
- package/.next/server/chunks/ssr/src_59477309._.js +1 -1
- package/.next/server/chunks/ssr/src_59477309._.js.map +1 -1
- package/.next/server/chunks/ssr/src_79d55c05._.js +1 -1
- package/.next/server/chunks/ssr/src_79d55c05._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.js +1 -1
- package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_agents_[agentId]_agent-editor_tsx_f85bbe65._.js +1 -1
- package/.next/server/chunks/ssr/src_app_agents_[agentId]_agent-editor_tsx_f85bbe65._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_cron-jobs_cron-jobs-client_tsx_ec91a73d._.js +1 -1
- package/.next/server/chunks/ssr/src_app_cron-jobs_cron-jobs-client_tsx_ec91a73d._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_index_tsx_98393217._.js +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_index_tsx_98393217._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js +1 -1
- package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_runs_[workflowId]_[runId]_run-detail-client_tsx_56f0cbd7._.js +3 -0
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_runs_[workflowId]_[runId]_run-detail-client_tsx_56f0cbd7._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js +1 -1
- package/.next/server/chunks/ssr/src_app_teams_[teamId]_workflows_workflows-client_tsx_12742cc9._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_tickets_TicketsBoardClient_tsx_5e156ef3._.js +1 -1
- package/.next/server/chunks/ssr/src_app_tickets_TicketsBoardClient_tsx_5e156ef3._.js.map +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/001f840e2d5598af.js +10 -0
- package/.next/static/chunks/212477db59154fa7.js +3 -0
- package/.next/static/chunks/242fee5849d79d1b.js +1 -0
- package/.next/static/chunks/26d8587a145bded7.js +1 -0
- package/.next/static/chunks/{b83c1ca03c3b8c6d.js → 372ac1d07db9969a.js} +1 -1
- package/.next/static/chunks/4a0d27f3023676a5.js +1 -0
- package/.next/static/chunks/4ad57cfc54e20abd.js +1 -0
- package/.next/static/chunks/4e8866ad8f1f6b2b.js +1 -0
- package/.next/static/chunks/7d9e7a36b92578fd.js +1 -0
- package/.next/static/chunks/87f63f654bc046a2.js +3 -0
- package/.next/static/chunks/8aac543d98940eb3.js +2 -0
- package/.next/static/chunks/8acd42df55d57556.js +1 -0
- package/.next/static/chunks/95b7564f2360e762.js +1 -0
- package/.next/static/chunks/9801fc48f532d076.js +1 -0
- package/.next/static/chunks/{d6e1b7307a9274ce.js → 9c627cb11f73ac4c.js} +1 -1
- package/.next/static/chunks/ad652e4b50e1fb17.js +1 -0
- package/.next/static/chunks/aff32612e6b9d901.js +1 -0
- package/.next/static/chunks/c6c561355e97baa8.js +7 -0
- package/.next/static/chunks/d4c855575c079ffc.js +3 -0
- package/.next/static/chunks/d593ea5e91e81b45.js +1 -0
- package/.next/static/chunks/{87879d67a1601ee0.js → e0984ec981f01c0d.js} +1 -1
- package/.next/static/chunks/f5039461b97678c7.js +1 -0
- package/.next/static/chunks/f51763a2aea0a4b6.js +1 -0
- package/.next/static/chunks/f7f157ba542e1ae5.js +1 -0
- package/.next/static/chunks/fb008837ba324b34.css +3 -0
- package/.next/static/chunks/{turbopack-dbf3078dbf5863bd.js → turbopack-bdd9478663f034d6.js} +1 -1
- package/LICENSE +192 -0
- package/README.md +19 -5
- package/openclaw/index.ts +144 -5
- package/openclaw.plugin.json +2 -8
- package/package.json +5 -2
- package/.next/server/chunks/[root-of-the-server]__18423bab._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__18423bab._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__35ec765d._.js +0 -13
- package/.next/server/chunks/[root-of-the-server]__35ec765d._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__3c92e5aa._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__3c92e5aa._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__813dd669._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__813dd669._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__b457b884._.js +0 -22
- package/.next/server/chunks/[root-of-the-server]__b457b884._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__c5e88cbb._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__c5e88cbb._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__da7df58d._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__da7df58d._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__0a5cb3ca._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__0a5cb3ca._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__177cec74._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__177cec74._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__4981f370._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__4981f370._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__51e26a01._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__51e26a01._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__6b6b7595._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__6b6b7595._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__8f9585b9._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__8f9585b9._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__9e400864._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__9e400864._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__a6348eaa._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__a6348eaa._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ad4e8478._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__ad4e8478._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b5aa14b8._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__b5aa14b8._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b8998a21._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__b8998a21._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__e9bd9b71._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__e9bd9b71._.js.map +0 -1
- package/.next/server/chunks/ssr/_32beff4b._.js +0 -3
- package/.next/server/chunks/ssr/_32beff4b._.js.map +0 -1
- package/.next/server/chunks/ssr/_7f9e89d2._.js.map +0 -1
- package/.next/server/chunks/ssr/_8538617d._.js +0 -3
- package/.next/server/chunks/ssr/_8538617d._.js.map +0 -1
- package/.next/server/chunks/ssr/_a506fcf8._.js +0 -3
- package/.next/server/chunks/ssr/_a506fcf8._.js.map +0 -1
- package/.next/server/chunks/ssr/_deb7a691._.js.map +0 -1
- package/.next/server/chunks/ssr/d4b1c_modules_next_dist_server_route-modules_app-page_vendored_ssr_react-dom_6ef9314a.js +0 -3
- package/.next/server/chunks/ssr/d4b1c_modules_next_dist_server_route-modules_app-page_vendored_ssr_react-dom_6ef9314a.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_21685f67._.js +0 -3
- package/.next/server/chunks/ssr/src_app_21685f67._.js.map +0 -1
- package/.next/static/chunks/0edab8a24d59a626.js +0 -2
- package/.next/static/chunks/410dc851d0e3033d.js +0 -1
- package/.next/static/chunks/4e38b3f280ced64c.js +0 -1
- package/.next/static/chunks/4f2b8a07ace7e02b.js +0 -1
- package/.next/static/chunks/57ad5290f7e92ffd.css +0 -3
- package/.next/static/chunks/8a919077b73862da.js +0 -1
- package/.next/static/chunks/9906444fb1191bb4.js +0 -1
- package/.next/static/chunks/a625725b4cd85ea3.js +0 -1
- package/.next/static/chunks/ac32974713c57cb3.js +0 -1
- package/.next/static/chunks/bdb7ebd88ea13111.js +0 -1
- package/.next/static/chunks/bfcfbe145220d365.js +0 -1
- package/.next/static/chunks/c0d9f53d91cc65c5.js +0 -10
- package/.next/static/chunks/c0e2f959abc4cc13.js +0 -1
- package/.next/static/chunks/c822e53f79a492c7.js +0 -1
- package/.next/static/chunks/ce6b2024d13b4333.js +0 -1
- package/.next/static/chunks/d13249af74d111cf.js +0 -3
- package/.next/static/chunks/d16f64ca3a8ed208.js +0 -1
- package/.next/static/chunks/d7541a171116ec9c.js +0 -1
- package/.next/static/chunks/e03137fd069b1514.js +0 -1
- package/.next/static/chunks/e10faa9296c8b246.js +0 -1
- package/.next/static/chunks/ec24877f7b7f82c5.js +0 -3
- package/.next/static/chunks/ff3bbb5df40b2cc4.js +0 -1
- /package/.next/server/chunks/{[root-of-the-server]__be5f57b2._.js.map → [root-of-the-server]__17fa6089._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__74b80ca4._.js.map → [root-of-the-server]__5792c29e._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__c1b0d50e._.js.map → [root-of-the-server]__7194dfe2._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__17124952._.js.map → [root-of-the-server]__89f2190c._.js.map} +0 -0
- /package/.next/server/chunks/{[root-of-the-server]__343776df._.js.map → [root-of-the-server]__bbed0e46._.js.map} +0 -0
- /package/.next/static/{F0PhVXEIb3LrF9XQem5EQ → bTCL-c1-1vqxgA-ZN8TUy}/_buildManifest.js +0 -0
- /package/.next/static/{F0PhVXEIb3LrF9XQem5EQ → bTCL-c1-1vqxgA-ZN8TUy}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{F0PhVXEIb3LrF9XQem5EQ → bTCL-c1-1vqxgA-ZN8TUy}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[44924,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(61889),e=a.i(88764),f=a.i(66063);function g({formData:a,updateField:c}){return(0,b.jsxs)("div",{className:"space-y-4",children:[(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Name"}),(0,b.jsx)("input",{type:"text",value:a.name,onChange:a=>c("name",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",placeholder:"Job name"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent ID"}),(0,b.jsx)("input",{type:"text",value:a.agentId,onChange:a=>c("agentId",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",placeholder:"Agent ID"})]})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Description"}),(0,b.jsx)("textarea",{value:a.description,onChange:a=>c("description",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",rows:2,placeholder:"Optional description"})]}),(0,b.jsxs)("div",{className:"flex items-center",children:[(0,b.jsx)("input",{type:"checkbox",id:"enabled",checked:a.enabled,onChange:a=>c("enabled",a.target.checked),className:"h-4 w-4 rounded border-white/20 bg-white/5"}),(0,b.jsx)("label",{htmlFor:"enabled",className:"ml-2 text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Enabled"})]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-4",children:[(0,b.jsx)("h4",{className:"font-medium text-[color:var(--ck-text-primary)] mb-3",children:"Schedule"}),(0,b.jsxs)("label",{className:"block mb-3",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Schedule Type"}),(0,b.jsxs)("select",{value:a.scheduleKind,onChange:a=>c("scheduleKind",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("option",{value:"every",children:"Every (interval)"}),(0,b.jsx)("option",{value:"cron",children:"Cron expression"}),(0,b.jsx)("option",{value:"at",children:"At specific time"})]})]}),"every"===a.scheduleKind&&(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Every"}),(0,b.jsx)("input",{type:"number",value:a.everyValue,onChange:a=>c("everyValue",Number(a.target.value)),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",min:"1"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Unit"}),(0,b.jsxs)("select",{value:a.everyUnit,onChange:a=>c("everyUnit",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("option",{value:"s",children:"Seconds"}),(0,b.jsx)("option",{value:"m",children:"Minutes"}),(0,b.jsx)("option",{value:"h",children:"Hours"}),(0,b.jsx)("option",{value:"d",children:"Days"})]})]})]}),"cron"===a.scheduleKind&&(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Cron Expression"}),(0,b.jsx)("input",{type:"text",value:a.cronExpr,onChange:a=>c("cronExpr",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"0 * * * *"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Timezone (optional)"}),(0,b.jsx)("input",{type:"text",value:a.timezone,onChange:a=>c("timezone",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"UTC"})]})]}),"at"===a.scheduleKind&&(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"At Time (ISO 8601)"}),(0,b.jsx)("input",{type:"text",value:a.atValue,onChange:a=>c("atValue",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"2024-01-01T00:00:00Z"})]})]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-4",children:[(0,b.jsx)("h4",{className:"font-medium text-[color:var(--ck-text-primary)] mb-3",children:"Payload"}),(0,b.jsxs)("label",{className:"block mb-3",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Payload Type"}),(0,b.jsxs)("select",{value:a.payloadKind,onChange:a=>c("payloadKind",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("option",{value:"agentTurn",children:"Agent Turn"}),(0,b.jsx)("option",{value:"systemEvent",children:"System Event"})]})]}),"systemEvent"===a.payloadKind?(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Event Text"}),(0,b.jsx)("textarea",{value:a.payloadText,onChange:a=>c("payloadText",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",rows:3,placeholder:"System event message"})]}):(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Message"}),(0,b.jsx)("textarea",{value:a.payloadMessage,onChange:a=>c("payloadMessage",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",rows:3,placeholder:"Agent message"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Model (optional)"}),(0,b.jsx)("input",{type:"text",value:a.payloadModel,onChange:a=>c("payloadModel",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Model ID"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Thinking (optional)"}),(0,b.jsx)("input",{type:"text",value:a.payloadThinking,onChange:a=>c("payloadThinking",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Thinking level"})]})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Timeout (seconds)"}),(0,b.jsx)("input",{type:"number",value:a.payloadTimeout,onChange:a=>c("payloadTimeout",Number(a.target.value)),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",min:"1"})]})]})]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-4",children:[(0,b.jsx)("h4",{className:"font-medium text-[color:var(--ck-text-primary)] mb-3",children:"Delivery"}),(0,b.jsxs)("label",{className:"block mb-3",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Delivery Mode"}),(0,b.jsxs)("select",{value:a.deliveryMode,onChange:a=>c("deliveryMode",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("option",{value:"none",children:"None"}),(0,b.jsx)("option",{value:"announce",children:"Announce"})]})]}),"announce"===a.deliveryMode&&(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Channel (optional)"}),(0,b.jsx)("input",{type:"text",value:a.deliveryChannel,onChange:a=>c("deliveryChannel",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Channel ID"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"To (optional)"}),(0,b.jsx)("input",{type:"text",value:a.deliveryTo,onChange:a=>c("deliveryTo",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Target"})]})]}),(0,b.jsxs)("div",{className:"flex items-center",children:[(0,b.jsx)("input",{type:"checkbox",id:"bestEffort",checked:a.deliveryBestEffort,onChange:a=>c("deliveryBestEffort",a.target.checked),className:"h-4 w-4 rounded border-white/20 bg-white/5"}),(0,b.jsx)("label",{htmlFor:"bestEffort",className:"ml-2 text-sm text-[color:var(--ck-text-primary)]",children:"Best effort delivery"})]})]})]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-4",children:[(0,b.jsx)("h4",{className:"font-medium text-[color:var(--ck-text-primary)] mb-3",children:"Advanced"}),(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Session Target (optional)"}),(0,b.jsx)("input",{type:"text",value:a.sessionTarget,onChange:a=>c("sessionTarget",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Session target"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Session Key (optional)"}),(0,b.jsx)("input",{type:"text",value:a.sessionKey,onChange:a=>c("sessionKey",a.target.value),className:"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Session key"})]})]})]})]})}function h(a={}){let[b,d]=(0,c.useState)({name:"",description:"",enabled:!0,scheduleKind:"every",cronExpr:"0 * * * *",everyValue:60,everyUnit:"m",atValue:"",timezone:"",deliveryMode:"none",deliveryChannel:"",deliveryTo:"",deliveryBestEffort:!0,payloadKind:"agentTurn",payloadText:"",payloadMessage:"",payloadModel:"",payloadThinking:"",payloadTimeout:30,agentId:"",sessionTarget:"",sessionKey:"",...a.initialData}),[e,f]=(0,c.useState)(!1),[g,i]=(0,c.useState)(null);return{formData:b,loading:e,error:g,setLoading:f,setError:i,updateField:(0,c.useCallback)((a,b)=>{d(c=>({...c,[a]:b}))},[]),reset:()=>{d({name:"",description:"",enabled:!0,scheduleKind:"every",cronExpr:"0 * * * *",everyValue:60,everyUnit:"m",atValue:"",timezone:"",deliveryMode:"none",deliveryChannel:"",deliveryTo:"",deliveryBestEffort:!0,payloadKind:"agentTurn",payloadText:"",payloadMessage:"",payloadModel:"",payloadThinking:"",payloadTimeout:30,agentId:"",sessionTarget:"",sessionKey:"",...a.initialData})},buildPayload:()=>{let a="every"===b.scheduleKind?b.everyValue*("s"===b.everyUnit?1e3:"m"===b.everyUnit?6e4:"h"===b.everyUnit?36e5:864e5):void 0,c="cron"===b.scheduleKind?{kind:"cron",expr:b.cronExpr,...b.timezone?{tz:b.timezone}:{}}:"every"===b.scheduleKind?{kind:"every",everyMs:a}:{kind:"at",at:b.atValue},d="none"===b.deliveryMode?{mode:"none"}:{mode:"announce",...b.deliveryChannel?{channel:b.deliveryChannel}:{},...b.deliveryTo?{to:b.deliveryTo}:{},bestEffort:b.deliveryBestEffort},e="systemEvent"===b.payloadKind?{kind:"systemEvent",text:b.payloadText}:{kind:"agentTurn",message:b.payloadMessage,...b.payloadModel?{model:b.payloadModel}:{},...b.payloadThinking?{thinking:b.payloadThinking}:{},timeoutSeconds:b.payloadTimeout};return{name:b.name,description:b.description,enabled:b.enabled,schedule:c,delivery:d,payload:e,agentId:b.agentId,sessionTarget:b.sessionTarget,sessionKey:b.sessionKey}}}}var i=a.i(51200),j=a.i(74621);function k({job:a,open:d,onClose:e,onSaved:k}){let{formData:l,loading:m,error:n,setLoading:o,setError:p,updateField:q,buildPayload:r}=h();(0,c.useEffect)(()=>{if(a){let b,c=a.schedule?.everyMs,d=60;c?c%864e5==0?(d=c/864e5,b="d"):c%36e5==0?(d=c/36e5,b="h"):c%6e4==0?(d=c/6e4,b="m"):(d=c/1e3,b="s"):b="m",q("name",a.name||""),q("description",a.description||""),q("enabled",a.enabled??!0),q("scheduleKind",a.schedule?.kind||"every"),q("cronExpr",a.schedule?.expr||"0 * * * *"),q("everyValue",d),q("everyUnit",b),q("timezone",a.schedule?.tz||""),q("deliveryMode",a.delivery?.mode||"none"),q("deliveryChannel",a.delivery?.channel||""),q("deliveryTo",a.delivery?.to||""),q("deliveryBestEffort",a.delivery?.bestEffort??!0),q("payloadKind",a.payload?.kind||"agentTurn"),q("payloadText",a.payload?.text||""),q("payloadMessage",a.payload?.message||""),q("payloadModel",a.payload?.model||""),q("payloadThinking",a.payload?.thinking||""),q("payloadTimeout",a.payload?.timeoutSeconds||30),q("agentId",a.agentId||""),q("sessionTarget",a.sessionTarget||""),q("sessionKey",a.sessionKey||"")}},[a,q]);let s=async()=>{if(a){o(!0),p(null);try{await (0,i.fetchJson)("/api/cron/edit",{method:"POST",body:JSON.stringify({id:a.id,...r()})}),k(),e()}catch(a){p((0,j.errorMessage)(a))}finally{o(!1)}}},t=async()=>{if(a&&confirm("Are you sure you want to delete this cron job?")){o(!0),p(null);try{await (0,i.fetchJson)("/api/cron/delete",{method:"POST",body:JSON.stringify({id:a.id})}),k(),e()}catch(a){p((0,j.errorMessage)(a))}finally{o(!1)}}};return a?(0,b.jsxs)(f.ConfirmationModal,{open:d,onClose:e,title:"Edit Cron Job",error:n,confirmLabel:"Save changes",confirmBusyLabel:"Saving…",confirmDisabled:!l.name,busy:m,onConfirm:s,children:[(0,b.jsx)("div",{className:"mt-4 max-h-[70vh] overflow-y-auto",children:(0,b.jsx)(g,{formData:l,updateField:q})}),(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-between gap-2 border-t border-white/10 pt-4",children:[(0,b.jsx)("button",{type:"button",onClick:t,disabled:m,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)] disabled:opacity-50",children:"Delete job"}),(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Tip: use dryRun=true to test safely."})]})]}):null}var l=a.i(35112);function m({open:a,onClose:c,title:d,children:e,size:f="md"}){if(!a)return null;let g="modal-title";return(0,l.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:c,"aria-hidden":"true"}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",role:"dialog","aria-modal":"true","aria-labelledby":g,children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:`w-full ${{sm:"max-w-md",md:"max-w-lg",lg:"max-w-2xl",xl:"max-w-4xl"}[f]} rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-6 shadow-[var(--ck-shadow-2)]`,children:[(0,b.jsx)("h2",{id:g,className:"text-lg font-semibold text-[color:var(--ck-text-primary)] mb-4",children:d}),e]})})})]}),document.body)}function n({open:a,onClose:c,onCreated:d}){let{formData:e,loading:f,error:k,setLoading:l,setError:n,updateField:o,reset:p,buildPayload:q}=h(),r=async()=>{l(!0),n(null);try{await (0,i.fetchJson)("/api/cron/add",{method:"POST",body:JSON.stringify(q())}),d(),c(),p()}catch(a){n((0,j.errorMessage)(a))}finally{l(!1)}};return(0,b.jsxs)(m,{open:a,onClose:c,title:"Create Cron Job",size:"lg",children:[(0,b.jsxs)("div",{className:"max-h-[70vh] overflow-y-auto",children:[(0,b.jsx)(g,{formData:e,updateField:o}),k&&(0,b.jsx)("div",{className:"mt-4 p-3 bg-red-50 border border-red-200 rounded text-red-700 text-sm",children:k})]}),(0,b.jsxs)("div",{className:"flex justify-end gap-2 mt-6 pt-4 border-t",children:[(0,b.jsx)("button",{type:"button",onClick:c,className:"px-4 py-2 text-gray-600 hover:text-gray-800",disabled:f,children:"Cancel"}),(0,b.jsx)("button",{type:"button",onClick:r,disabled:f||!e.name,className:"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed",children:f?"Creating...":"Create Job"})]})]})}function o(a){return!!(a.enabled??a.state?.enabled)}function p({teamId:a}){let f=(0,d.useToast)(),g=(a??"").trim(),[h,l]=(0,c.useState)(!1),[m,p]=(0,c.useState)([]),[q,r]=(0,c.useState)(""),[s,t]=(0,c.useState)(null),[u,v]=(0,c.useState)(!1),[w,x]=(0,c.useState)(""),[y,z]=(0,c.useState)(""),[A,B]=(0,c.useState)(!1),[C,D]=(0,c.useState)(null),[E,F]=(0,c.useState)(!1),[G,H]=(0,c.useState)(null),[I,J]=(0,c.useState)(!1),K=(0,c.useMemo)(()=>[...m].sort((a,b)=>{let c=o(a);return c!==o(b)?c?-1:1:String(a.name??"").localeCompare(String(b.name??""))}),[m]),L=(0,c.useMemo)(()=>G?m.find(a=>a.id===G.id)??G:null,[m,G]);async function M(){l(!0),r("");try{let a=g?`/api/cron/jobs?teamId=${encodeURIComponent(g)}`:"/api/cron/jobs",b=await (0,i.fetchJson)(a,{cache:"no-store"});p(b.jobs??[]),0===(b.jobs??[]).length&&r("No cron jobs found.")}catch(a){r((0,j.errorMessage)(a)),p([])}finally{l(!1)}}async function N(a,b){l(!0),r("");try{await (0,i.fetchJson)("/api/cron/job",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:a,action:b})}),r("run"===b?"Triggered run.":"Updated."),await M()}catch(a){r((0,j.errorMessage)(a))}finally{l(!1)}}async function O(){B(!0),D(null);try{let a=await (0,i.fetchJson)("/api/cron/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:w})});if(!a.ok)throw Error(a.error||"Delete failed");f.push({kind:"success",message:`Removed cron job: ${y}`}),v(!1),await M()}catch(b){let a=(0,j.errorMessage)(b);D(a),f.push({kind:"error",message:a})}finally{B(!1)}}return(0,c.useEffect)(()=>{M()},[g]),(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"ck-glass-strong p-4",children:(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold",children:"All Cron Jobs"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:[m.length," job",1!==m.length?"s":""," total · ",m.filter(a=>o(a)).length," enabled"]})]}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:()=>J(!0),className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]",children:"Create Job"}),(0,b.jsx)("button",{type:"button",onClick:M,disabled:h,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Refresh"})]})]})}),q?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm",children:q}):null,(0,b.jsx)("div",{className:"mt-6 space-y-3",children:K.map(a=>(0,b.jsxs)("div",{className:"ck-glass px-4 py-3",children:[(0,b.jsx)("div",{role:"button",tabIndex:0,onClick:()=>t(b=>b===a.id?null:a.id),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),t(b=>b===a.id?null:a.id))},className:"w-full cursor-pointer text-left",children:(0,b.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate font-medium",children:a.name??a.id}),(0,b.jsxs)("div",{className:"mt-1 flex flex-wrap gap-x-3 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("span",{children:function(a){if(!a)return"";if("cron"===a.kind&&a.expr)return a.expr;if("every"===a.kind&&a.everyMs){let b=Math.round(a.everyMs/6e4);return b>=60?`every ${Math.round(b/60)}h`:`every ${b}m`}return a.kind??""}(a.schedule)}),(0,b.jsx)("span",{children:o(a)?"✅ enabled":"⏸ disabled"}),a.agentId?(0,b.jsxs)("span",{children:["agent: ",a.agentId]}):null,a.scope?(0,b.jsxs)("span",{children:[a.scope.kind,": "," ",(0,b.jsx)("a",{className:"underline hover:no-underline",href:a.scope.href,onClick:a=>a.stopPropagation(),children:a.scope.label})]}):null,a.sessionTarget?(0,b.jsxs)("span",{children:["target: ",a.sessionTarget]}):null,a.state?.nextRunAtMs?(0,b.jsxs)("span",{children:["next: ",new Date(a.state.nextRunAtMs).toLocaleString()]}):null]})]}),(0,b.jsxs)("div",{className:"flex gap-2",onClick:a=>a.stopPropagation(),children:[(0,b.jsx)("button",{type:"button",onClick:()=>{H(a),F(!0)},disabled:h,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10",children:"Edit"}),(0,b.jsx)("button",{type:"button",onClick:()=>N(a.id,o(a)?"disable":"enable"),disabled:h,className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10",children:o(a)?"Disable":"Enable"}),(0,b.jsx)("button",{type:"button",onClick:()=>N(a.id,"run"),disabled:h,className:"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]",children:"Run now"}),(0,b.jsx)("button",{type:"button",title:o(a)?"Disable this job before deleting.":"Delete cron job",onClick:()=>{x(a.id),z(a.name??a.id),D(null),v(!0)},disabled:h||o(a),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)] disabled:opacity-40",children:"Delete"})]})]})}),s===a.id?(0,b.jsx)("pre",{className:"mt-3 overflow-x-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 text-xs text-[color:var(--ck-text-primary)]",children:JSON.stringify(a,null,2)}):null]},a.id))})]}),(0,b.jsx)(e.DeleteCronJobModal,{open:u,jobLabel:y,busy:A,error:C,onClose:()=>v(!1),onConfirm:O}),(0,b.jsx)(k,{job:L,open:E,onClose:()=>F(!1),onSaved:M}),(0,b.jsx)(n,{open:I,onClose:()=>J(!1),onCreated:M})]})}a.s(["default",()=>p],44924)}];
|
|
1
|
+
module.exports=[44924,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(61889),e=a.i(88764),f=a.i(66063);function g({formData:a,updateField:c}){return(0,b.jsxs)("div",{className:"space-y-4",children:[(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Name"}),(0,b.jsx)("input",{type:"text",value:a.name,onChange:a=>c("name",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",placeholder:"Job name"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent ID"}),(0,b.jsx)("input",{type:"text",value:a.agentId,onChange:a=>c("agentId",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",placeholder:"Agent ID"})]})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Description"}),(0,b.jsx)("textarea",{value:a.description,onChange:a=>c("description",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",rows:2,placeholder:"Optional description"})]}),(0,b.jsxs)("div",{className:"flex items-center",children:[(0,b.jsx)("input",{type:"checkbox",id:"enabled",checked:a.enabled,onChange:a=>c("enabled",a.target.checked),className:"h-4 w-4 rounded border-white/20 bg-white/5"}),(0,b.jsx)("label",{htmlFor:"enabled",className:"ml-2 text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Enabled"})]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-4",children:[(0,b.jsx)("h4",{className:"font-medium text-[color:var(--ck-text-primary)] mb-3",children:"Schedule"}),(0,b.jsxs)("label",{className:"block mb-3",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Schedule Type"}),(0,b.jsxs)("select",{value:a.scheduleKind,onChange:a=>c("scheduleKind",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("option",{value:"every",children:"Every (interval)"}),(0,b.jsx)("option",{value:"cron",children:"Cron expression"}),(0,b.jsx)("option",{value:"at",children:"At specific time"})]})]}),"every"===a.scheduleKind&&(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Every"}),(0,b.jsx)("input",{type:"number",value:a.everyValue,onChange:a=>c("everyValue",Number(a.target.value)),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",min:"1"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Unit"}),(0,b.jsxs)("select",{value:a.everyUnit,onChange:a=>c("everyUnit",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("option",{value:"s",children:"Seconds"}),(0,b.jsx)("option",{value:"m",children:"Minutes"}),(0,b.jsx)("option",{value:"h",children:"Hours"}),(0,b.jsx)("option",{value:"d",children:"Days"})]})]})]}),"cron"===a.scheduleKind&&(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Cron Expression"}),(0,b.jsx)("input",{type:"text",value:a.cronExpr,onChange:a=>c("cronExpr",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"0 * * * *"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Timezone (optional)"}),(0,b.jsx)("input",{type:"text",value:a.timezone,onChange:a=>c("timezone",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"UTC"})]})]}),"at"===a.scheduleKind&&(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"At Time (ISO 8601)"}),(0,b.jsx)("input",{type:"text",value:a.atValue,onChange:a=>c("atValue",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"2024-01-01T00:00:00Z"})]})]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-4",children:[(0,b.jsx)("h4",{className:"font-medium text-[color:var(--ck-text-primary)] mb-3",children:"Payload"}),(0,b.jsxs)("label",{className:"block mb-3",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Payload Type"}),(0,b.jsxs)("select",{value:a.payloadKind,onChange:a=>c("payloadKind",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("option",{value:"agentTurn",children:"Agent Turn"}),(0,b.jsx)("option",{value:"systemEvent",children:"System Event"})]})]}),"systemEvent"===a.payloadKind?(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Event Text"}),(0,b.jsx)("textarea",{value:a.payloadText,onChange:a=>c("payloadText",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",rows:3,placeholder:"System event message"})]}):(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Message"}),(0,b.jsx)("textarea",{value:a.payloadMessage,onChange:a=>c("payloadMessage",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",rows:3,placeholder:"Agent message"})]}),(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Model (optional)"}),(0,b.jsx)("input",{type:"text",value:a.payloadModel,onChange:a=>c("payloadModel",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Model ID"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Thinking (optional)"}),(0,b.jsx)("input",{type:"text",value:a.payloadThinking,onChange:a=>c("payloadThinking",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Thinking level"})]})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Timeout (seconds)"}),(0,b.jsx)("input",{type:"number",value:a.payloadTimeout,onChange:a=>c("payloadTimeout",Number(a.target.value)),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",min:"1"})]})]})]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-4",children:[(0,b.jsx)("h4",{className:"font-medium text-[color:var(--ck-text-primary)] mb-3",children:"Delivery"}),(0,b.jsxs)("label",{className:"block mb-3",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Delivery Mode"}),(0,b.jsxs)("select",{value:a.deliveryMode,onChange:a=>c("deliveryMode",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("option",{value:"none",children:"None"}),(0,b.jsx)("option",{value:"announce",children:"Announce"})]})]}),"announce"===a.deliveryMode&&(0,b.jsxs)("div",{className:"space-y-3",children:[(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Channel (optional)"}),(0,b.jsx)("input",{type:"text",value:a.deliveryChannel,onChange:a=>c("deliveryChannel",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Channel ID"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"To (optional)"}),(0,b.jsx)("input",{type:"text",value:a.deliveryTo,onChange:a=>c("deliveryTo",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Target"})]})]}),(0,b.jsxs)("div",{className:"flex items-center",children:[(0,b.jsx)("input",{type:"checkbox",id:"bestEffort",checked:a.deliveryBestEffort,onChange:a=>c("deliveryBestEffort",a.target.checked),className:"h-4 w-4 rounded border-white/20 bg-white/5"}),(0,b.jsx)("label",{htmlFor:"bestEffort",className:"ml-2 text-sm text-[color:var(--ck-text-primary)]",children:"Best effort delivery"})]})]})]}),(0,b.jsxs)("div",{className:"border-t border-white/10 pt-4",children:[(0,b.jsx)("h4",{className:"font-medium text-[color:var(--ck-text-primary)] mb-3",children:"Advanced"}),(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-4",children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Session Target (optional)"}),(0,b.jsx)("input",{type:"text",value:a.sessionTarget,onChange:a=>c("sessionTarget",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Session target"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Session Key (optional)"}),(0,b.jsx)("input",{type:"text",value:a.sessionKey,onChange:a=>c("sessionKey",a.target.value),className:"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]",placeholder:"Session key"})]})]})]})]})}function h(a={}){let[b,d]=(0,c.useState)({name:"",description:"",enabled:!0,scheduleKind:"every",cronExpr:"0 * * * *",everyValue:60,everyUnit:"m",atValue:"",timezone:"",deliveryMode:"none",deliveryChannel:"",deliveryTo:"",deliveryBestEffort:!0,payloadKind:"agentTurn",payloadText:"",payloadMessage:"",payloadModel:"",payloadThinking:"",payloadTimeout:30,agentId:"",sessionTarget:"",sessionKey:"",...a.initialData}),[e,f]=(0,c.useState)(!1),[g,i]=(0,c.useState)(null);return{formData:b,loading:e,error:g,setLoading:f,setError:i,updateField:(0,c.useCallback)((a,b)=>{d(c=>({...c,[a]:b}))},[]),reset:()=>{d({name:"",description:"",enabled:!0,scheduleKind:"every",cronExpr:"0 * * * *",everyValue:60,everyUnit:"m",atValue:"",timezone:"",deliveryMode:"none",deliveryChannel:"",deliveryTo:"",deliveryBestEffort:!0,payloadKind:"agentTurn",payloadText:"",payloadMessage:"",payloadModel:"",payloadThinking:"",payloadTimeout:30,agentId:"",sessionTarget:"",sessionKey:"",...a.initialData})},buildPayload:()=>{let a="every"===b.scheduleKind?b.everyValue*("s"===b.everyUnit?1e3:"m"===b.everyUnit?6e4:"h"===b.everyUnit?36e5:864e5):void 0,c="cron"===b.scheduleKind?{kind:"cron",expr:b.cronExpr,...b.timezone?{tz:b.timezone}:{}}:"every"===b.scheduleKind?{kind:"every",everyMs:a}:{kind:"at",at:b.atValue},d="none"===b.deliveryMode?{mode:"none"}:{mode:"announce",...b.deliveryChannel?{channel:b.deliveryChannel}:{},...b.deliveryTo?{to:b.deliveryTo}:{},bestEffort:b.deliveryBestEffort},e="systemEvent"===b.payloadKind?{kind:"systemEvent",text:b.payloadText}:{kind:"agentTurn",message:b.payloadMessage,...b.payloadModel?{model:b.payloadModel}:{},...b.payloadThinking?{thinking:b.payloadThinking}:{},timeoutSeconds:b.payloadTimeout};return{name:b.name,description:b.description,enabled:b.enabled,schedule:c,delivery:d,payload:e,agentId:b.agentId,sessionTarget:b.sessionTarget,sessionKey:b.sessionKey}}}}var i=a.i(51200),j=a.i(74621);function k({job:a,open:d,onClose:e,onSaved:k}){let{formData:l,loading:m,error:n,setLoading:o,setError:p,updateField:q,buildPayload:r}=h();(0,c.useEffect)(()=>{if(a){let b,c=a.schedule?.everyMs,d=60;c?c%864e5==0?(d=c/864e5,b="d"):c%36e5==0?(d=c/36e5,b="h"):c%6e4==0?(d=c/6e4,b="m"):(d=c/1e3,b="s"):b="m",q("name",a.name||""),q("description",a.description||""),q("enabled",a.enabled??!0),q("scheduleKind",a.schedule?.kind||"every"),q("cronExpr",a.schedule?.expr||"0 * * * *"),q("everyValue",d),q("everyUnit",b),q("timezone",a.schedule?.tz||""),q("deliveryMode",a.delivery?.mode||"none"),q("deliveryChannel",a.delivery?.channel||""),q("deliveryTo",a.delivery?.to||""),q("deliveryBestEffort",a.delivery?.bestEffort??!0),q("payloadKind",a.payload?.kind||"agentTurn"),q("payloadText",a.payload?.text||""),q("payloadMessage",a.payload?.message||""),q("payloadModel",a.payload?.model||""),q("payloadThinking",a.payload?.thinking||""),q("payloadTimeout",a.payload?.timeoutSeconds||30),q("agentId",a.agentId||""),q("sessionTarget",a.sessionTarget||""),q("sessionKey",a.sessionKey||"")}},[a,q]);let s=async()=>{if(a){o(!0),p(null);try{await (0,i.fetchJson)("/api/cron/edit",{method:"POST",body:JSON.stringify({id:a.id,...r()})}),k(),e()}catch(a){p((0,j.errorMessage)(a))}finally{o(!1)}}},t=async()=>{if(a&&confirm("Are you sure you want to delete this cron job?")){o(!0),p(null);try{await (0,i.fetchJson)("/api/cron/delete",{method:"POST",body:JSON.stringify({id:a.id})}),k(),e()}catch(a){p((0,j.errorMessage)(a))}finally{o(!1)}}};return a?(0,b.jsxs)(f.ConfirmationModal,{open:d,onClose:e,title:"Edit Cron Job",error:n,confirmLabel:"Save changes",confirmBusyLabel:"Saving…",confirmDisabled:!l.name,busy:m,onConfirm:s,children:[(0,b.jsx)("div",{className:"mt-4 max-h-[70vh] overflow-y-auto",children:(0,b.jsx)(g,{formData:l,updateField:q})}),(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-between gap-2 border-t border-white/10 pt-4",children:[(0,b.jsx)("button",{type:"button",onClick:t,disabled:m,className:"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-50",children:"Delete job"}),(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"Tip: use dryRun=true to test safely."})]})]}):null}var l=a.i(28268);function m({open:a,onClose:c,onCreated:d}){let{formData:e,loading:f,error:k,setLoading:m,setError:n,updateField:o,reset:p,buildPayload:q}=h(),r=async()=>{m(!0),n(null);try{await (0,i.fetchJson)("/api/cron/add",{method:"POST",body:JSON.stringify(q())}),d(),c(),p()}catch(a){n((0,j.errorMessage)(a))}finally{m(!1)}};return(0,b.jsxs)(l.Modal,{open:a,onClose:c,title:"Create Cron Job",size:"lg",children:[(0,b.jsxs)("div",{className:"max-h-[70vh] overflow-y-auto",children:[(0,b.jsx)(g,{formData:e,updateField:o}),k&&(0,b.jsx)("div",{className:"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:k})]}),(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2 border-t border-white/10 pt-4",children:[(0,b.jsx)("button",{type:"button",onClick:c,disabled:f,className:"rounded-lg 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",onClick:r,disabled:f||!e.name,className:"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:f?"Creating...":"Create Job"})]})]})}var n=a.i(32553);function o(a){return!!(a.enabled??a.state?.enabled)}function p({teamId:a}){let g=(0,d.useToast)(),h=(a??"").trim(),[l,p]=(0,c.useState)(!1),[q,r]=(0,c.useState)([]),[s,t]=(0,c.useState)(""),[u,v]=(0,c.useState)(null),[w,x]=(0,c.useState)("all"),[y,z]=(0,c.useState)(!1),[A,B]=(0,c.useState)(""),[C,D]=(0,c.useState)(""),[E,F]=(0,c.useState)(!1),[G,H]=(0,c.useState)(null),[I,J]=(0,c.useState)(!1),[K,L]=(0,c.useState)(null),[M,N]=(0,c.useState)(!1),[O,P]=(0,c.useState)(null),[Q,R]=(0,c.useState)(!1),[S,T]=(0,c.useState)(new Map),[U,V]=(0,c.useState)(!1),W=(0,c.useMemo)(()=>[...q].sort((a,b)=>{let c=o(a);return c!==o(b)?c?-1:1:String(a.name??"").localeCompare(String(b.name??""))}),[q]),X=(0,c.useMemo)(()=>{if("all"===w)return W;let a="enabled"===w;return W.filter(b=>o(b)===a)},[W,w]),Y=(0,c.useMemo)(()=>X.map(a=>a.id),[X]),{selected:Z,toggle:$,allSelected:_,toggleAll:aa,clear:ab,count:ac}=(0,n.useRunSelection)(Y),ad=(0,c.useMemo)(()=>X.filter(a=>Z.has(a.id)&&o(a)).length,[X,Z]),ae=(0,c.useMemo)(()=>X.filter(a=>Z.has(a.id)&&!o(a)).length,[X,Z]);function af(a){R(!1),T(new Map),V(!1),P(a)}function ag(){U||(P(null),R(!1),T(new Map))}async function ah(){if(!O)return;R(!0),V(!0);let{actionable:a,skipped:b}=function(){let a=Array.from(Z);if(!O||"delete"===O)return{actionable:a,skipped:[]};let b="enable"===O,c=[],d=[];for(let e of a){let a=q.find(a=>a.id===e);a&&o(a)===b?d.push(e):c.push(e)}return{actionable:c,skipped:d}}(),c=new Map;for(let b of a)c.set(b,{status:"pending"});for(let a of b)c.set(a,{status:"skipped"});T(new Map(c));let d=0,e=0;for(let b of a){T(a=>{let c=new Map(a);return c.set(b,{status:"in-progress"}),c});try{if("delete"===O){let a=await (0,i.fetchJson)("/api/cron/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:b})});if(!a.ok)throw Error(a.error||"Delete failed")}else{let a=await (0,i.fetchJson)("/api/cron/job",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:b,action:O})});if(!a.ok)throw Error(a.error||`${O} failed`)}d++,T(a=>{let c=new Map(a);return c.set(b,{status:"done"}),c})}catch(a){e++,T(c=>{let d=new Map(c);return d.set(b,{status:"error",error:(0,j.errorMessage)(a)}),d})}}V(!1);let f="delete"===O?"Deleted":"enable"===O?"Enabled":"Disabled";0===e?g.push({kind:"success",message:`${f} ${d} cron job${1!==d?"s":""}.`}):g.push({kind:"error",message:`${f} ${d}, ${e} failed.`}),ab(),await aj()}let ai=(0,c.useMemo)(()=>K?q.find(a=>a.id===K.id)??K:null,[q,K]);async function aj(){p(!0),t("");try{let a=h?`/api/cron/jobs?teamId=${encodeURIComponent(h)}`:"/api/cron/jobs",b=await (0,i.fetchJson)(a,{cache:"no-store"});r(b.jobs??[]),0===(b.jobs??[]).length&&t("No cron jobs found.")}catch(a){t((0,j.errorMessage)(a)),r([])}finally{p(!1)}}async function ak(a,b){p(!0),t("");try{await (0,i.fetchJson)("/api/cron/job",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:a,action:b})}),t("run"===b?"Triggered run.":"Updated."),await aj()}catch(a){t((0,j.errorMessage)(a))}finally{p(!1)}}async function al(){F(!0),H(null);try{let a=await (0,i.fetchJson)("/api/cron/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:A})});if(!a.ok)throw Error(a.error||"Delete failed");g.push({kind:"success",message:`Removed cron job: ${C}`}),z(!1),await aj()}catch(b){let a=(0,j.errorMessage)(b);H(a),g.push({kind:"error",message:a})}finally{F(!1)}}return(0,c.useEffect)(()=>{aj()},[h]),(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"ck-card p-4",children:(0,b.jsxs)("div",{className:"flex items-center justify-between",children:[(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[X.length>0&&(0,b.jsx)("input",{type:"checkbox",checked:_&&X.length>0,onChange:aa,className:"accent-[var(--ck-accent-red)]","aria-label":"Select all cron jobs"}),(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold",children:"All Cron Jobs"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"all"!==w?`${X.length} of ${q.length} job${1!==q.length?"s":""} (${w})`:`${q.length} job${1!==q.length?"s":""} total \xb7 ${q.filter(a=>o(a)).length} enabled`})]})]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsxs)("select",{value:w,onChange:a=>x(a.target.value),className:"rounded-lg border border-white/10 bg-white/5 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("option",{value:"all",children:"All"}),(0,b.jsx)("option",{value:"enabled",children:"Enabled"}),(0,b.jsx)("option",{value:"disabled",children:"Disabled"})]}),(0,b.jsx)("button",{type:"button",onClick:()=>N(!0),className:"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]",children:"Create Job"}),(0,b.jsx)("button",{type:"button",onClick:aj,disabled:l,className:"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Refresh"})]})]})}),s?(0,b.jsx)("div",{className:"mt-4 rounded-lg border border-white/10 bg-white/5 p-3 text-sm",children:s}):null,(0,b.jsx)("div",{className:"mt-6 space-y-3",children:X.map(a=>(0,b.jsxs)("div",{className:"ck-card px-4 py-3",children:[(0,b.jsxs)("div",{className:"flex items-start gap-3",children:[(0,b.jsx)("input",{type:"checkbox",checked:Z.has(a.id),onChange:()=>$(a.id),className:"mt-1.5 shrink-0 accent-[var(--ck-accent-red)]","aria-label":`Select ${a.name??a.id}`}),(0,b.jsx)("div",{role:"button",tabIndex:0,onClick:()=>v(b=>b===a.id?null:a.id),onKeyDown:b=>{("Enter"===b.key||" "===b.key)&&(b.preventDefault(),v(b=>b===a.id?null:a.id))},className:"min-w-0 flex-1 cursor-pointer text-left",children:(0,b.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate font-medium",children:a.name??a.id}),(0,b.jsxs)("div",{className:"mt-1 flex flex-wrap gap-x-3 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("span",{children:function(a){if(!a)return"";if("cron"===a.kind&&a.expr)return a.expr;if("every"===a.kind&&a.everyMs){let b=Math.round(a.everyMs/6e4);return b>=60?`every ${Math.round(b/60)}h`:`every ${b}m`}return a.kind??""}(a.schedule)}),(0,b.jsx)("span",{children:o(a)?"✅ enabled":"⏸ disabled"}),a.agentId?(0,b.jsxs)("span",{children:["agent: ",a.agentId]}):null,a.scope?(0,b.jsxs)("span",{children:[a.scope.kind,": "," ",(0,b.jsx)("a",{className:"underline hover:no-underline",href:a.scope.href,onClick:a=>a.stopPropagation(),children:a.scope.label})]}):null,a.sessionTarget?(0,b.jsxs)("span",{children:["target: ",a.sessionTarget]}):null,a.state?.nextRunAtMs?(0,b.jsxs)("span",{children:["next: ",new Date(a.state.nextRunAtMs).toLocaleString()]}):null]})]}),(0,b.jsxs)("div",{className:"flex gap-2",onClick:a=>a.stopPropagation(),children:[(0,b.jsx)("button",{type:"button",onClick:()=>{L(a),J(!0)},disabled:l,className:"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10",children:"Edit"}),(0,b.jsx)("button",{type:"button",onClick:()=>ak(a.id,o(a)?"disable":"enable"),disabled:l,className:"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10",children:o(a)?"Disable":"Enable"}),(0,b.jsx)("button",{type:"button",onClick:()=>ak(a.id,"run"),disabled:l,className:"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]",children:"Run now"}),(0,b.jsx)("button",{type:"button",title:o(a)?"Disable this job before deleting.":"Delete cron job",onClick:()=>{B(a.id),D(a.name??a.id),H(null),z(!0)},disabled:l||o(a),className:"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-40",children:"Delete"})]})]})})]}),u===a.id?(0,b.jsx)("pre",{className:"mt-3 overflow-x-auto rounded-lg border border-white/10 bg-white/5 p-3 text-xs text-[color:var(--ck-text-primary)]",children:JSON.stringify(a,null,2)}):null]},a.id))})]}),ac>0&&(0,b.jsxs)("div",{className:"sticky bottom-4 mt-4 flex items-center justify-between rounded-xl border border-white/10 bg-black/80 backdrop-blur-md px-4 py-3 shadow-lg",children:[(0,b.jsxs)("span",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:[ac," job",1!==ac?"s":""," selected"]}),(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:ab,className:"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Clear"}),ae>0&&(0,b.jsxs)("button",{type:"button",onClick:()=>af("enable"),className:"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:["Enable",ae<ac?` (${ae})`:""]}),ad>0&&(0,b.jsxs)("button",{type:"button",onClick:()=>af("disable"),className:"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:["Disable",ad<ac?` (${ad})`:""]}),(0,b.jsx)("button",{type:"button",onClick:()=>af("delete"),className:"rounded-lg bg-[var(--ck-accent-red)] px-3 py-1.5 text-xs font-medium text-white hover:bg-[var(--ck-accent-red-hover)]",children:"Delete selected"})]})]}),(0,b.jsx)(f.ConfirmationModal,{open:null!==O&&!Q,onClose:ag,title:"delete"===O?"Delete Cron Jobs":"enable"===O?"Enable Cron Jobs":"Disable Cron Jobs",confirmLabel:"delete"===O?"Delete":"enable"===O?"Enable":"Disable",onConfirm:ah,confirmButtonClassName:"delete"===O?void 0:"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:(0,b.jsx)("p",{className:"mt-3 text-sm text-[color:var(--ck-text-secondary)]",children:"delete"===O?(0,b.jsxs)(b.Fragment,{children:["Are you sure you want to permanently delete"," ",(0,b.jsxs)("strong",{className:"text-[color:var(--ck-text-primary)]",children:[ac," cron job",1!==ac?"s":""]}),"? This action cannot be undone."]}):"enable"===O?(0,b.jsxs)(b.Fragment,{children:["Enable"," ",(0,b.jsxs)("strong",{className:"text-[color:var(--ck-text-primary)]",children:[ae," cron job",1!==ae?"s":""]}),"?",ad>0&&(0,b.jsxs)("span",{children:[" (",ad," already enabled will be skipped.)"]})]}):(0,b.jsxs)(b.Fragment,{children:["Disable"," ",(0,b.jsxs)("strong",{className:"text-[color:var(--ck-text-primary)]",children:[ad," cron job",1!==ad?"s":""]}),"?",ae>0&&(0,b.jsxs)("span",{children:[" (",ae," already disabled will be skipped.)"]})]})})}),null!==O&&Q&&(0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60","aria-hidden":"true"}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",role:"dialog","aria-modal":"true",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-soft)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsxs)("h2",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:["delete"===O?"Deleting":"enable"===O?"Enabling":"Disabling"," Cron Jobs"]}),(0,b.jsx)("div",{className:"mt-4 max-h-80 space-y-1 overflow-y-auto rounded-lg border border-white/10 bg-black/30 p-3 font-mono text-xs",children:Array.from(S.entries()).map(([a,{status:c,error:d}])=>{let e;return(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsxs)("span",{className:"shrink-0 w-4 text-center",children:["pending"===c&&(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"·"}),"in-progress"===c&&(0,b.jsx)("span",{className:"text-yellow-400 animate-pulse",children:"▸"}),"done"===c&&(0,b.jsx)("span",{className:"text-green-400",children:"✓"}),"skipped"===c&&(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"–"}),"error"===c&&(0,b.jsx)("span",{className:"text-red-400",children:"✗"})]}),(0,b.jsx)("span",{className:"done"===c?"text-green-400":"in-progress"===c?"text-yellow-400":"error"===c?"text-red-400":"text-[color:var(--ck-text-tertiary)]",children:(e=q.find(b=>b.id===a),e?.name??a)}),(0,b.jsxs)("span",{className:"ml-auto shrink-0 text-[10px]",children:["pending"===c&&"","in-progress"===c&&(0,b.jsx)("span",{className:"text-yellow-400",children:"delete"===O?"deleting...":"enable"===O?"enabling...":"disabling..."}),"done"===c&&(0,b.jsx)("span",{className:"text-green-400",children:"delete"===O?"deleted":"enable"===O?"enabled":"disabled"}),"skipped"===c&&(0,b.jsxs)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:["already ","enable"===O?"enabled":"disabled"]}),"error"===c&&(0,b.jsx)("span",{className:"text-red-400",title:d,children:d??"failed"})]})]},a)})}),(0,b.jsx)("div",{className:"mt-4 flex items-center justify-end",children:(0,b.jsx)("button",{type:"button",disabled:U,onClick:ag,className:"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-40",children:U?"Processing...":"Close"})})]})})})]}),(0,b.jsx)(e.DeleteCronJobModal,{open:y,jobLabel:C,busy:E,error:G,onClose:()=>z(!1),onConfirm:al}),(0,b.jsx)(k,{job:ai,open:I,onClose:()=>J(!1),onSaved:aj}),(0,b.jsx)(m,{open:M,onClose:()=>N(!1),onCreated:aj})]})}a.s(["default",()=>p],44924)}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_app_cron-jobs_cron-jobs-client_tsx_ec91a73d._.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/cron-jobs/cron-jobs-client.tsx","../../../../src/components/EditCronJobModal.tsx","../../../../src/components/CronJobForm.tsx","../../../../src/hooks/useCronJobForm.ts","../../../../src/components/Modal.tsx","../../../../src/components/CreateCronJobModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { DeleteCronJobModal } from \"@/components/delete-modals\";\nimport { EditCronJobModal } from \"@/components/EditCronJobModal\";\nimport { CreateCronJobModal } from \"@/components/CreateCronJobModal\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\n\ntype CronJob = {\n id: string;\n name?: string;\n enabled?: boolean;\n schedule?: { kind?: string; expr?: string; everyMs?: number; tz?: string };\n state?: { nextRunAtMs?: number };\n agentId?: string;\n sessionTarget?: string;\n sessionKey?: string;\n // Optional enrichment from the API (which team/agent it belongs to)\n scope?: { kind: \"team\" | \"agent\"; id: string; label: string; href: string };\n};\n\nfunction fmtSchedule(s?: CronJob[\"schedule\"]): string {\n if (!s) return \"\";\n if (s.kind === \"cron\" && s.expr) return s.expr;\n if (s.kind === \"every\" && s.everyMs) {\n const mins = Math.round(s.everyMs / 60000);\n return mins >= 60 ? `every ${Math.round(mins / 60)}h` : `every ${mins}m`;\n }\n return s.kind ?? \"\";\n}\n\nfunction isEnabled(j: CronJob): boolean {\n // Some responses put enabled under state.enabled.\n return Boolean(j.enabled ?? (j as { state?: { enabled?: unknown } }).state?.enabled);\n}\n\nexport default function CronJobsClient({ teamId }: { teamId: string | null }) {\n const toast = useToast();\n const teamFilter = (teamId ?? \"\").trim();\n const [loading, setLoading] = useState(false);\n const [jobs, setJobs] = useState<CronJob[]>([]);\n const [msg, setMsg] = useState<string>(\"\");\n const [expandedId, setExpandedId] = useState<string | null>(null);\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [deleteLabel, setDeleteLabel] = useState<string>(\"\");\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [editOpen, setEditOpen] = useState(false);\n const [editJob, setEditJob] = useState<CronJob | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n\n const sorted = useMemo(() => {\n return [...jobs].sort((a, b) => {\n const ae = isEnabled(a);\n const be = isEnabled(b);\n if (ae !== be) return ae ? -1 : 1; // enabled first\n return String(a.name ?? \"\").localeCompare(String(b.name ?? \"\"));\n });\n }, [jobs]);\n\n const liveEditJob = useMemo(() => {\n if (!editJob) return null;\n return jobs.find((job) => job.id === editJob.id) ?? editJob;\n }, [jobs, editJob]);\n\n async function refresh() {\n setLoading(true);\n setMsg(\"\");\n try {\n const url = teamFilter ? `/api/cron/jobs?teamId=${encodeURIComponent(teamFilter)}` : \"/api/cron/jobs\";\n const json = await fetchJson<{ jobs?: CronJob[] }>(url, { cache: \"no-store\" });\n setJobs(json.jobs ?? []);\n if ((json.jobs ?? []).length === 0) {\n setMsg(\"No cron jobs found.\");\n }\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n setJobs([]);\n } finally {\n setLoading(false);\n }\n }\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refresh closes over teamFilter\n }, [teamFilter]);\n\n async function act(id: string, action: \"enable\" | \"disable\" | \"run\") {\n setLoading(true);\n setMsg(\"\");\n try {\n await fetchJson(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action }),\n });\n setMsg(action === \"run\" ? \"Triggered run.\" : \"Updated.\");\n await refresh();\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n } finally {\n setLoading(false);\n }\n }\n\n function openDelete(job: CronJob) {\n setDeleteId(job.id);\n setDeleteLabel(job.name ?? job.id);\n setDeleteError(null);\n setDeleteOpen(true);\n }\n\n function openEdit(job: CronJob) {\n setEditJob(job);\n setEditOpen(true);\n }\n\n async function confirmDelete() {\n setDeleteBusy(true);\n setDeleteError(null);\n try {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n if (!json.ok) throw new Error(json.error || \"Delete failed\");\n toast.push({ kind: \"success\", message: `Removed cron job: ${deleteLabel}` });\n setDeleteOpen(false);\n await refresh();\n } catch (e: unknown) {\n const msg = errorMessage(e);\n setDeleteError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setDeleteBusy(false);\n }\n }\n\n return (\n <>\n <div>\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-lg font-semibold\">All Cron Jobs</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n {jobs.length} job{jobs.length !== 1 ? \"s\" : \"\"} total · {jobs.filter((j) => isEnabled(j)).length} enabled\n </p>\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => setCreateOpen(true)}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]\"\n >\n Create Job\n </button>\n <button\n type=\"button\"\n onClick={refresh}\n disabled={loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Refresh\n </button>\n </div>\n </div>\n </div>\n\n {msg ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm\">\n {msg}\n </div>\n ) : null}\n\n <div className=\"mt-6 space-y-3\">\n {sorted.map((j) => (\n <div key={j.id} className=\"ck-glass px-4 py-3\">\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setExpandedId((cur) => (cur === j.id ? null : j.id))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setExpandedId((cur) => (cur === j.id ? null : j.id));\n }\n }}\n className=\"w-full cursor-pointer text-left\"\n >\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium\">{j.name ?? j.id}</div>\n <div className=\"mt-1 flex flex-wrap gap-x-3 text-xs text-[color:var(--ck-text-secondary)]\">\n <span>{fmtSchedule(j.schedule)}</span>\n <span>{isEnabled(j) ? \"✅ enabled\" : \"⏸ disabled\"}</span>\n {j.agentId ? <span>agent: {j.agentId}</span> : null}\n {j.scope ? (\n <span>\n {j.scope.kind}: {\" \"}\n <a\n className=\"underline hover:no-underline\"\n href={j.scope.href}\n onClick={(e) => e.stopPropagation()}\n >\n {j.scope.label}\n </a>\n </span>\n ) : null}\n {j.sessionTarget ? <span>target: {j.sessionTarget}</span> : null}\n {j.state?.nextRunAtMs ? <span>next: {new Date(j.state.nextRunAtMs).toLocaleString()}</span> : null}\n </div>\n </div>\n\n <div className=\"flex gap-2\" onClick={(e) => e.stopPropagation()}>\n <button\n type=\"button\"\n onClick={() => openEdit(j)}\n disabled={loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10\"\n >\n Edit\n </button>\n <button\n type=\"button\"\n onClick={() => act(j.id, isEnabled(j) ? \"disable\" : \"enable\")}\n disabled={loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10\"\n >\n {isEnabled(j) ? \"Disable\" : \"Enable\"}\n </button>\n <button\n type=\"button\"\n onClick={() => act(j.id, \"run\")}\n disabled={loading}\n className=\"rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]\"\n >\n Run now\n </button>\n <button\n type=\"button\"\n title={isEnabled(j) ? \"Disable this job before deleting.\" : \"Delete cron job\"}\n onClick={() => openDelete(j)}\n disabled={loading || isEnabled(j)}\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)] disabled:opacity-40\"\n >\n Delete\n </button>\n </div>\n </div>\n </div>\n\n {expandedId === j.id ? (\n <pre className=\"mt-3 overflow-x-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 text-xs text-[color:var(--ck-text-primary)]\">\n {JSON.stringify(j, null, 2)}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n </div>\n\n <DeleteCronJobModal\n open={deleteOpen}\n jobLabel={deleteLabel}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <EditCronJobModal\n job={liveEditJob}\n open={editOpen}\n onClose={() => setEditOpen(false)}\n onSaved={refresh}\n />\n\n <CreateCronJobModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n onCreated={refresh}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport { CronJobForm } from \"@/components/CronJobForm\";\nimport { useCronJobForm } from \"@/hooks/useCronJobForm\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype CronJob = {\n id: string;\n name?: string;\n description?: string;\n enabled?: boolean;\n schedule?: {\n kind?: string;\n expr?: string;\n everyMs?: number;\n tz?: string;\n };\n delivery?: {\n mode?: string;\n channel?: string;\n to?: string;\n bestEffort?: boolean;\n };\n payload?: {\n kind?: string;\n text?: string;\n message?: string;\n model?: string;\n thinking?: string;\n timeoutSeconds?: number;\n };\n agentId?: string;\n sessionTarget?: string;\n sessionKey?: string;\n};\n\ninterface EditCronJobModalProps {\n job: CronJob | null;\n open: boolean;\n onClose: () => void;\n onSaved: () => void;\n}\n\nexport function EditCronJobModal({ job, open, onClose, onSaved }: EditCronJobModalProps) {\n const {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n buildPayload,\n } = useCronJobForm();\n\n // Populate form when job changes\n useEffect(() => {\n if (job) {\n const everyMs = job.schedule?.everyMs;\n let everyValue = 60;\n let everyUnit: \"s\" | \"m\" | \"h\" | \"d\";\n \n if (everyMs) {\n if (everyMs % 86400000 === 0) {\n everyValue = everyMs / 86400000;\n everyUnit = \"d\";\n } else if (everyMs % 3600000 === 0) {\n everyValue = everyMs / 3600000;\n everyUnit = \"h\";\n } else if (everyMs % 60000 === 0) {\n everyValue = everyMs / 60000;\n everyUnit = \"m\";\n } else {\n everyValue = everyMs / 1000;\n everyUnit = \"s\";\n }\n } else {\n everyUnit = \"m\";\n }\n\n // Update all form fields with job data\n updateField(\"name\", job.name || \"\");\n updateField(\"description\", job.description || \"\");\n updateField(\"enabled\", job.enabled ?? true);\n updateField(\"scheduleKind\", (job.schedule?.kind as \"cron\" | \"every\" | \"at\") || \"every\");\n updateField(\"cronExpr\", job.schedule?.expr || \"0 * * * *\");\n updateField(\"everyValue\", everyValue);\n updateField(\"everyUnit\", everyUnit);\n updateField(\"timezone\", job.schedule?.tz || \"\");\n updateField(\"deliveryMode\", (job.delivery?.mode as \"none\" | \"announce\") || \"none\");\n updateField(\"deliveryChannel\", job.delivery?.channel || \"\");\n updateField(\"deliveryTo\", job.delivery?.to || \"\");\n updateField(\"deliveryBestEffort\", job.delivery?.bestEffort ?? true);\n updateField(\"payloadKind\", (job.payload?.kind as \"systemEvent\" | \"agentTurn\") || \"agentTurn\");\n updateField(\"payloadText\", job.payload?.text || \"\");\n updateField(\"payloadMessage\", job.payload?.message || \"\");\n updateField(\"payloadModel\", job.payload?.model || \"\");\n updateField(\"payloadThinking\", job.payload?.thinking || \"\");\n updateField(\"payloadTimeout\", job.payload?.timeoutSeconds || 30);\n updateField(\"agentId\", job.agentId || \"\");\n updateField(\"sessionTarget\", job.sessionTarget || \"\");\n updateField(\"sessionKey\", job.sessionKey || \"\");\n }\n }, [job, updateField]);\n\n const handleSave = async () => {\n if (!job) return;\n \n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/edit\", {\n method: \"POST\",\n body: JSON.stringify({\n id: job.id,\n ...buildPayload(),\n }),\n });\n\n onSaved();\n onClose();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n const handleDelete = async () => {\n if (!job || !confirm(\"Are you sure you want to delete this cron job?\")) return;\n \n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/delete\", {\n method: \"POST\",\n body: JSON.stringify({ id: job.id }),\n });\n\n onSaved();\n onClose();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n if (!job) return null;\n\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title=\"Edit Cron Job\"\n error={error}\n confirmLabel=\"Save changes\"\n confirmBusyLabel=\"Saving…\"\n confirmDisabled={!formData.name}\n busy={loading}\n onConfirm={handleSave}\n >\n <div className=\"mt-4 max-h-[70vh] overflow-y-auto\">\n <CronJobForm formData={formData} updateField={updateField} />\n </div>\n\n <div className=\"mt-6 flex items-center justify-between gap-2 border-t border-white/10 pt-4\">\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={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)] disabled:opacity-50\"\n >\n Delete job\n </button>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Tip: use dryRun=true to test safely.</div>\n </div>\n </ConfirmationModal>\n );\n}\n","import React from \"react\";\nimport { CronJobFormData } from \"@/hooks/useCronJobForm\";\n\ninterface CronJobFormProps {\n formData: CronJobFormData;\n updateField: <K extends keyof CronJobFormData>(field: K, value: CronJobFormData[K]) => void;\n}\n\nexport function CronJobForm({ formData, updateField }: CronJobFormProps) {\n return (\n <div className=\"space-y-4\">\n {/* Basic Info */}\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Name</span>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => updateField(\"name\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n placeholder=\"Job name\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent ID</span>\n <input\n type=\"text\"\n value={formData.agentId}\n onChange={(e) => updateField(\"agentId\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n placeholder=\"Agent ID\"\n />\n </label>\n </div>\n\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Description</span>\n <textarea\n value={formData.description}\n onChange={(e) => updateField(\"description\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n rows={2}\n placeholder=\"Optional description\"\n />\n </label>\n\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"enabled\"\n checked={formData.enabled}\n onChange={(e) => updateField(\"enabled\", e.target.checked)}\n className=\"h-4 w-4 rounded border-white/20 bg-white/5\"\n />\n <label htmlFor=\"enabled\" className=\"ml-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">\n Enabled\n </label>\n </div>\n\n {/* Schedule */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Schedule</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Schedule Type</span>\n <select\n value={formData.scheduleKind}\n onChange={(e) => updateField(\"scheduleKind\", e.target.value as \"cron\" | \"every\" | \"at\")}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"every\">Every (interval)</option>\n <option value=\"cron\">Cron expression</option>\n <option value=\"at\">At specific time</option>\n </select>\n </label>\n\n {formData.scheduleKind === \"every\" && (\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Every</span>\n <input\n type=\"number\"\n value={formData.everyValue}\n onChange={(e) => updateField(\"everyValue\", Number(e.target.value))}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n min=\"1\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Unit</span>\n <select\n value={formData.everyUnit}\n onChange={(e) => updateField(\"everyUnit\", e.target.value as \"s\" | \"m\" | \"h\" | \"d\")}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"s\">Seconds</option>\n <option value=\"m\">Minutes</option>\n <option value=\"h\">Hours</option>\n <option value=\"d\">Days</option>\n </select>\n </label>\n </div>\n )}\n\n {formData.scheduleKind === \"cron\" && (\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Cron Expression</span>\n <input\n type=\"text\"\n value={formData.cronExpr}\n onChange={(e) => updateField(\"cronExpr\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"0 * * * *\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Timezone (optional)</span>\n <input\n type=\"text\"\n value={formData.timezone}\n onChange={(e) => updateField(\"timezone\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"UTC\"\n />\n </label>\n </div>\n )}\n\n {formData.scheduleKind === \"at\" && (\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">At Time (ISO 8601)</span>\n <input\n type=\"text\"\n value={formData.atValue}\n onChange={(e) => updateField(\"atValue\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"2024-01-01T00:00:00Z\"\n />\n </label>\n )}\n </div>\n\n {/* Payload */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Payload</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Payload Type</span>\n <select\n value={formData.payloadKind}\n onChange={(e) => updateField(\"payloadKind\", e.target.value as \"systemEvent\" | \"agentTurn\")}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"agentTurn\">Agent Turn</option>\n <option value=\"systemEvent\">System Event</option>\n </select>\n </label>\n\n {formData.payloadKind === \"systemEvent\" ? (\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Event Text</span>\n <textarea\n value={formData.payloadText}\n onChange={(e) => updateField(\"payloadText\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n rows={3}\n placeholder=\"System event message\"\n />\n </label>\n ) : (\n <div className=\"space-y-3\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Message</span>\n <textarea\n value={formData.payloadMessage}\n onChange={(e) => updateField(\"payloadMessage\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n rows={3}\n placeholder=\"Agent message\"\n />\n </label>\n \n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Model (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadModel}\n onChange={(e) => updateField(\"payloadModel\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Model ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Thinking (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadThinking}\n onChange={(e) => updateField(\"payloadThinking\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Thinking level\"\n />\n </label>\n </div>\n \n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Timeout (seconds)</span>\n <input\n type=\"number\"\n value={formData.payloadTimeout}\n onChange={(e) => updateField(\"payloadTimeout\", Number(e.target.value))}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n min=\"1\"\n />\n </label>\n </div>\n )}\n </div>\n\n {/* Delivery */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Delivery</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Delivery Mode</span>\n <select\n value={formData.deliveryMode}\n onChange={(e) => updateField(\"deliveryMode\", e.target.value as \"none\" | \"announce\")}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"none\">None</option>\n <option value=\"announce\">Announce</option>\n </select>\n </label>\n\n {formData.deliveryMode === \"announce\" && (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Channel (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryChannel}\n onChange={(e) => updateField(\"deliveryChannel\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Channel ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">To (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryTo}\n onChange={(e) => updateField(\"deliveryTo\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Target\"\n />\n </label>\n </div>\n \n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"bestEffort\"\n checked={formData.deliveryBestEffort}\n onChange={(e) => updateField(\"deliveryBestEffort\", e.target.checked)}\n className=\"h-4 w-4 rounded border-white/20 bg-white/5\"\n />\n <label htmlFor=\"bestEffort\" className=\"ml-2 text-sm text-[color:var(--ck-text-primary)]\">\n Best effort delivery\n </label>\n </div>\n </div>\n )}\n </div>\n\n {/* Advanced */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Advanced</h4>\n \n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Session Target (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionTarget}\n onChange={(e) => updateField(\"sessionTarget\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Session target\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Session Key (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionKey}\n onChange={(e) => updateField(\"sessionKey\", e.target.value)}\n className=\"mt-2 block w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Session key\"\n />\n </label>\n </div>\n </div>\n </div>\n );\n}","import { useCallback, useState } from \"react\";\n\nexport interface CronJobFormData {\n name: string;\n description: string;\n enabled: boolean;\n scheduleKind: \"cron\" | \"every\" | \"at\";\n cronExpr: string;\n everyValue: number;\n everyUnit: \"s\" | \"m\" | \"h\" | \"d\";\n atValue: string;\n timezone: string;\n deliveryMode: \"none\" | \"announce\";\n deliveryChannel: string;\n deliveryTo: string;\n deliveryBestEffort: boolean;\n payloadKind: \"systemEvent\" | \"agentTurn\";\n payloadText: string;\n payloadMessage: string;\n payloadModel: string;\n payloadThinking: string;\n payloadTimeout: number;\n agentId: string;\n sessionTarget: string;\n sessionKey: string;\n}\n\nexport interface UseCronJobFormOptions {\n initialData?: Partial<CronJobFormData>;\n}\n\nexport function useCronJobForm(options: UseCronJobFormOptions = {}) {\n const [formData, setFormData] = useState<CronJobFormData>({\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n cronExpr: \"0 * * * *\",\n everyValue: 60,\n everyUnit: \"m\",\n atValue: \"\",\n timezone: \"\",\n deliveryMode: \"none\",\n deliveryChannel: \"\",\n deliveryTo: \"\",\n deliveryBestEffort: true,\n payloadKind: \"agentTurn\",\n payloadText: \"\",\n payloadMessage: \"\",\n payloadModel: \"\",\n payloadThinking: \"\",\n payloadTimeout: 30,\n agentId: \"\",\n sessionTarget: \"\",\n sessionKey: \"\",\n ...options.initialData,\n });\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const updateField = useCallback(\n <K extends keyof CronJobFormData>(field: K, value: CronJobFormData[K]) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n },\n [],\n );\n\n const reset = () => {\n setFormData({\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n cronExpr: \"0 * * * *\",\n everyValue: 60,\n everyUnit: \"m\",\n atValue: \"\",\n timezone: \"\",\n deliveryMode: \"none\",\n deliveryChannel: \"\",\n deliveryTo: \"\",\n deliveryBestEffort: true,\n payloadKind: \"agentTurn\",\n payloadText: \"\",\n payloadMessage: \"\",\n payloadModel: \"\",\n payloadThinking: \"\",\n payloadTimeout: 30,\n agentId: \"\",\n sessionTarget: \"\",\n sessionKey: \"\",\n ...options.initialData,\n });\n };\n\n const buildPayload = () => {\n const everyMs = formData.scheduleKind === \"every\" ? \n formData.everyValue * (\n formData.everyUnit === \"s\" ? 1000 : \n formData.everyUnit === \"m\" ? 60000 : \n formData.everyUnit === \"h\" ? 3600000 : \n 86400000\n ) : undefined;\n\n const schedule = formData.scheduleKind === \"cron\" \n ? { kind: \"cron\" as const, expr: formData.cronExpr, ...(formData.timezone ? { tz: formData.timezone } : {}) }\n : formData.scheduleKind === \"every\"\n ? { kind: \"every\" as const, everyMs: everyMs! }\n : { kind: \"at\" as const, at: formData.atValue };\n\n const delivery = formData.deliveryMode === \"none\" \n ? { mode: \"none\" as const }\n : { \n mode: \"announce\" as const, \n ...(formData.deliveryChannel ? { channel: formData.deliveryChannel } : {}),\n ...(formData.deliveryTo ? { to: formData.deliveryTo } : {}),\n bestEffort: formData.deliveryBestEffort \n };\n\n const payload = formData.payloadKind === \"systemEvent\"\n ? { kind: \"systemEvent\" as const, text: formData.payloadText }\n : { \n kind: \"agentTurn\" as const, \n message: formData.payloadMessage,\n ...(formData.payloadModel ? { model: formData.payloadModel } : {}),\n ...(formData.payloadThinking ? { thinking: formData.payloadThinking } : {}),\n timeoutSeconds: formData.payloadTimeout \n };\n\n return {\n name: formData.name,\n description: formData.description,\n enabled: formData.enabled,\n schedule,\n delivery,\n payload,\n agentId: formData.agentId,\n sessionTarget: formData.sessionTarget,\n sessionKey: formData.sessionKey,\n };\n };\n\n return {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n reset,\n buildPayload,\n };\n}","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function Modal({\n open,\n onClose,\n title,\n children,\n size = \"md\"\n}: {\n open: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n}) {\n if (!open) return null;\n\n const sizeClasses = {\n sm: \"max-w-md\",\n md: \"max-w-lg\", \n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\"\n };\n\n const titleId = \"modal-title\";\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} aria-hidden=\"true\" />\n <div className=\"fixed inset-0 overflow-y-auto\" role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId}>\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className={`w-full ${sizeClasses[size]} rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-6 shadow-[var(--ck-shadow-2)]`}>\n <h2 id={titleId} className=\"text-lg font-semibold text-[color:var(--ck-text-primary)] mb-4\">{title}</h2>\n {children}\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n}","\"use client\";\n\nimport { Modal } from \"@/components/Modal\";\nimport { CronJobForm } from \"@/components/CronJobForm\";\nimport { useCronJobForm } from \"@/hooks/useCronJobForm\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { errorMessage } from \"@/lib/errors\";\n\ninterface CreateCronJobModalProps {\n open: boolean;\n onClose: () => void;\n onCreated: () => void;\n}\n\nexport function CreateCronJobModal({ open, onClose, onCreated }: CreateCronJobModalProps) {\n const {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n reset,\n buildPayload,\n } = useCronJobForm();\n\n const handleCreate = async () => {\n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/add\", {\n method: \"POST\",\n body: JSON.stringify(buildPayload()),\n });\n\n onCreated();\n onClose();\n reset();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Cron Job\" size=\"lg\">\n <div className=\"max-h-[70vh] overflow-y-auto\">\n <CronJobForm formData={formData} updateField={updateField} />\n \n {error && (\n <div className=\"mt-4 p-3 bg-red-50 border border-red-200 rounded text-red-700 text-sm\">\n {error}\n </div>\n )}\n </div>\n \n <div className=\"flex justify-end gap-2 mt-6 pt-4 border-t\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2 text-gray-600 hover:text-gray-800\"\n disabled={loading}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleCreate}\n disabled={loading || !formData.name}\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {loading ? \"Creating...\" : \"Create Job\"}\n </button>\n </div>\n </Modal>\n );\n}"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/cron-jobs/cron-jobs-client.tsx","../../../../src/components/EditCronJobModal.tsx","../../../../src/components/CronJobForm.tsx","../../../../src/hooks/useCronJobForm.ts","../../../../src/components/CreateCronJobModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { DeleteCronJobModal } from \"@/components/delete-modals\";\nimport { EditCronJobModal } from \"@/components/EditCronJobModal\";\nimport { CreateCronJobModal } from \"@/components/CreateCronJobModal\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport { useRunSelection } from \"@/hooks/useRunSelection\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\n\ntype CronJob = {\n id: string;\n name?: string;\n enabled?: boolean;\n schedule?: { kind?: string; expr?: string; everyMs?: number; tz?: string };\n state?: { nextRunAtMs?: number };\n agentId?: string;\n sessionTarget?: string;\n sessionKey?: string;\n // Optional enrichment from the API (which team/agent it belongs to)\n scope?: { kind: \"team\" | \"agent\"; id: string; label: string; href: string };\n};\n\nfunction fmtSchedule(s?: CronJob[\"schedule\"]): string {\n if (!s) return \"\";\n if (s.kind === \"cron\" && s.expr) return s.expr;\n if (s.kind === \"every\" && s.everyMs) {\n const mins = Math.round(s.everyMs / 60000);\n return mins >= 60 ? `every ${Math.round(mins / 60)}h` : `every ${mins}m`;\n }\n return s.kind ?? \"\";\n}\n\nfunction isEnabled(j: CronJob): boolean {\n // Some responses put enabled under state.enabled.\n return Boolean(j.enabled ?? (j as { state?: { enabled?: unknown } }).state?.enabled);\n}\n\nexport default function CronJobsClient({ teamId }: { teamId: string | null }) {\n const toast = useToast();\n const teamFilter = (teamId ?? \"\").trim();\n const [loading, setLoading] = useState(false);\n const [jobs, setJobs] = useState<CronJob[]>([]);\n const [msg, setMsg] = useState<string>(\"\");\n const [expandedId, setExpandedId] = useState<string | null>(null);\n const [statusFilter, setStatusFilter] = useState<\"all\" | \"enabled\" | \"disabled\">(\"all\");\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [deleteLabel, setDeleteLabel] = useState<string>(\"\");\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [editOpen, setEditOpen] = useState(false);\n const [editJob, setEditJob] = useState<CronJob | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n\n // Bulk action state\n type BulkAction = \"enable\" | \"disable\" | \"delete\";\n const [bulkModalAction, setBulkModalAction] = useState<BulkAction | null>(null);\n const [bulkConfirmed, setBulkConfirmed] = useState(false);\n type JobStatus = \"pending\" | \"in-progress\" | \"done\" | \"skipped\" | \"error\";\n const [bulkJobStatuses, setBulkJobStatuses] = useState<Map<string, { status: JobStatus; error?: string }>>(new Map());\n const [bulkRunning, setBulkRunning] = useState(false);\n\n const sorted = useMemo(() => {\n return [...jobs].sort((a, b) => {\n const ae = isEnabled(a);\n const be = isEnabled(b);\n if (ae !== be) return ae ? -1 : 1; // enabled first\n return String(a.name ?? \"\").localeCompare(String(b.name ?? \"\"));\n });\n }, [jobs]);\n\n const filtered = useMemo(() => {\n if (statusFilter === \"all\") return sorted;\n const wantEnabled = statusFilter === \"enabled\";\n return sorted.filter((j) => isEnabled(j) === wantEnabled);\n }, [sorted, statusFilter]);\n\n const visibleIds = useMemo(() => filtered.map((j) => j.id), [filtered]);\n const { selected, toggle, allSelected, toggleAll, clear, count } = useRunSelection(visibleIds);\n\n const selectedEnabledCount = useMemo(\n () => filtered.filter((j) => selected.has(j.id) && isEnabled(j)).length,\n [filtered, selected],\n );\n const selectedDisabledCount = useMemo(\n () => filtered.filter((j) => selected.has(j.id) && !isEnabled(j)).length,\n [filtered, selected],\n );\n\n function openBulkModal(action: BulkAction) {\n setBulkConfirmed(false);\n setBulkJobStatuses(new Map());\n setBulkRunning(false);\n setBulkModalAction(action);\n }\n\n function closeBulkModal() {\n if (bulkRunning) return; // don't close while processing\n setBulkModalAction(null);\n setBulkConfirmed(false);\n setBulkJobStatuses(new Map());\n }\n\n /** Return the label shown for a job in the progress list. */\n function jobLabel(id: string): string {\n const j = jobs.find((x) => x.id === id);\n return j?.name ?? id;\n }\n\n /** Which jobs to actually act on (skip already-in-desired-state). */\n function bulkTargetIds(): { actionable: string[]; skipped: string[] } {\n const ids = Array.from(selected);\n if (!bulkModalAction || bulkModalAction === \"delete\") return { actionable: ids, skipped: [] };\n const wantEnabled = bulkModalAction === \"enable\";\n const actionable: string[] = [];\n const skipped: string[] = [];\n for (const id of ids) {\n const j = jobs.find((x) => x.id === id);\n if (j && isEnabled(j) === wantEnabled) skipped.push(id);\n else actionable.push(id);\n }\n return { actionable, skipped };\n }\n\n async function confirmBulkAction() {\n if (!bulkModalAction) return;\n setBulkConfirmed(true);\n setBulkRunning(true);\n\n const { actionable, skipped } = bulkTargetIds();\n\n // Initialize statuses\n const initial = new Map<string, { status: JobStatus; error?: string }>();\n for (const id of actionable) initial.set(id, { status: \"pending\" });\n for (const id of skipped) initial.set(id, { status: \"skipped\" });\n setBulkJobStatuses(new Map(initial));\n\n const actionLabel = bulkModalAction;\n let doneCount = 0;\n let errCount = 0;\n\n for (const id of actionable) {\n // Mark in-progress\n setBulkJobStatuses((prev) => {\n const next = new Map(prev);\n next.set(id, { status: \"in-progress\" });\n return next;\n });\n\n try {\n if (actionLabel === \"delete\") {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id }),\n });\n if (!json.ok) throw new Error(json.error || \"Delete failed\");\n } else {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action: actionLabel }),\n });\n if (!json.ok) throw new Error(json.error || `${actionLabel} failed`);\n }\n doneCount++;\n setBulkJobStatuses((prev) => {\n const next = new Map(prev);\n next.set(id, { status: \"done\" });\n return next;\n });\n } catch (e: unknown) {\n errCount++;\n setBulkJobStatuses((prev) => {\n const next = new Map(prev);\n next.set(id, { status: \"error\", error: errorMessage(e) });\n return next;\n });\n }\n }\n\n setBulkRunning(false);\n\n const verb = actionLabel === \"delete\" ? \"Deleted\" : actionLabel === \"enable\" ? \"Enabled\" : \"Disabled\";\n if (errCount === 0) {\n toast.push({ kind: \"success\", message: `${verb} ${doneCount} cron job${doneCount !== 1 ? \"s\" : \"\"}.` });\n } else {\n toast.push({ kind: \"error\", message: `${verb} ${doneCount}, ${errCount} failed.` });\n }\n clear();\n await refresh();\n }\n\n const liveEditJob = useMemo(() => {\n if (!editJob) return null;\n return jobs.find((job) => job.id === editJob.id) ?? editJob;\n }, [jobs, editJob]);\n\n async function refresh() {\n setLoading(true);\n setMsg(\"\");\n try {\n const url = teamFilter ? `/api/cron/jobs?teamId=${encodeURIComponent(teamFilter)}` : \"/api/cron/jobs\";\n const json = await fetchJson<{ jobs?: CronJob[] }>(url, { cache: \"no-store\" });\n setJobs(json.jobs ?? []);\n if ((json.jobs ?? []).length === 0) {\n setMsg(\"No cron jobs found.\");\n }\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n setJobs([]);\n } finally {\n setLoading(false);\n }\n }\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refresh closes over teamFilter\n }, [teamFilter]);\n\n async function act(id: string, action: \"enable\" | \"disable\" | \"run\") {\n setLoading(true);\n setMsg(\"\");\n try {\n await fetchJson(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action }),\n });\n setMsg(action === \"run\" ? \"Triggered run.\" : \"Updated.\");\n await refresh();\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n } finally {\n setLoading(false);\n }\n }\n\n function openDelete(job: CronJob) {\n setDeleteId(job.id);\n setDeleteLabel(job.name ?? job.id);\n setDeleteError(null);\n setDeleteOpen(true);\n }\n\n function openEdit(job: CronJob) {\n setEditJob(job);\n setEditOpen(true);\n }\n\n async function confirmDelete() {\n setDeleteBusy(true);\n setDeleteError(null);\n try {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n if (!json.ok) throw new Error(json.error || \"Delete failed\");\n toast.push({ kind: \"success\", message: `Removed cron job: ${deleteLabel}` });\n setDeleteOpen(false);\n await refresh();\n } catch (e: unknown) {\n const msg = errorMessage(e);\n setDeleteError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setDeleteBusy(false);\n }\n }\n\n return (\n <>\n <div>\n <div className=\"ck-card p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {filtered.length > 0 && (\n <input\n type=\"checkbox\"\n checked={allSelected && filtered.length > 0}\n onChange={toggleAll}\n className=\"accent-[var(--ck-accent-red)]\"\n aria-label=\"Select all cron jobs\"\n />\n )}\n <div>\n <h2 className=\"text-lg font-semibold\">All Cron Jobs</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n {statusFilter !== \"all\"\n ? `${filtered.length} of ${jobs.length} job${jobs.length !== 1 ? \"s\" : \"\"} (${statusFilter})`\n : `${jobs.length} job${jobs.length !== 1 ? \"s\" : \"\"} total · ${jobs.filter((j) => isEnabled(j)).length} enabled`}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value as \"all\" | \"enabled\" | \"disabled\")}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"all\">All</option>\n <option value=\"enabled\">Enabled</option>\n <option value=\"disabled\">Disabled</option>\n </select>\n <button\n type=\"button\"\n onClick={() => setCreateOpen(true)}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]\"\n >\n Create Job\n </button>\n <button\n type=\"button\"\n onClick={refresh}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Refresh\n </button>\n </div>\n </div>\n </div>\n\n {msg ? (\n <div className=\"mt-4 rounded-lg border border-white/10 bg-white/5 p-3 text-sm\">\n {msg}\n </div>\n ) : null}\n\n <div className=\"mt-6 space-y-3\">\n {filtered.map((j) => (\n <div key={j.id} className=\"ck-card px-4 py-3\">\n <div className=\"flex items-start gap-3\">\n <input\n type=\"checkbox\"\n checked={selected.has(j.id)}\n onChange={() => toggle(j.id)}\n className=\"mt-1.5 shrink-0 accent-[var(--ck-accent-red)]\"\n aria-label={`Select ${j.name ?? j.id}`}\n />\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setExpandedId((cur) => (cur === j.id ? null : j.id))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setExpandedId((cur) => (cur === j.id ? null : j.id));\n }\n }}\n className=\"min-w-0 flex-1 cursor-pointer text-left\"\n >\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium\">{j.name ?? j.id}</div>\n <div className=\"mt-1 flex flex-wrap gap-x-3 text-xs text-[color:var(--ck-text-secondary)]\">\n <span>{fmtSchedule(j.schedule)}</span>\n <span>{isEnabled(j) ? \"✅ enabled\" : \"⏸ disabled\"}</span>\n {j.agentId ? <span>agent: {j.agentId}</span> : null}\n {j.scope ? (\n <span>\n {j.scope.kind}: {\" \"}\n <a\n className=\"underline hover:no-underline\"\n href={j.scope.href}\n onClick={(e) => e.stopPropagation()}\n >\n {j.scope.label}\n </a>\n </span>\n ) : null}\n {j.sessionTarget ? <span>target: {j.sessionTarget}</span> : null}\n {j.state?.nextRunAtMs ? <span>next: {new Date(j.state.nextRunAtMs).toLocaleString()}</span> : null}\n </div>\n </div>\n\n <div className=\"flex gap-2\" onClick={(e) => e.stopPropagation()}>\n <button\n type=\"button\"\n onClick={() => openEdit(j)}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10\"\n >\n Edit\n </button>\n <button\n type=\"button\"\n onClick={() => act(j.id, isEnabled(j) ? \"disable\" : \"enable\")}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10\"\n >\n {isEnabled(j) ? \"Disable\" : \"Enable\"}\n </button>\n <button\n type=\"button\"\n onClick={() => act(j.id, \"run\")}\n disabled={loading}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]\"\n >\n Run now\n </button>\n <button\n type=\"button\"\n title={isEnabled(j) ? \"Disable this job before deleting.\" : \"Delete cron job\"}\n onClick={() => openDelete(j)}\n disabled={loading || isEnabled(j)}\n className=\"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-40\"\n >\n Delete\n </button>\n </div>\n </div>\n </div>\n </div>\n\n {expandedId === j.id ? (\n <pre className=\"mt-3 overflow-x-auto rounded-lg border border-white/10 bg-white/5 p-3 text-xs text-[color:var(--ck-text-primary)]\">\n {JSON.stringify(j, null, 2)}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n </div>\n\n {count > 0 && (\n <div className=\"sticky bottom-4 mt-4 flex items-center justify-between rounded-xl border border-white/10 bg-black/80 backdrop-blur-md px-4 py-3 shadow-lg\">\n <span className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n {count} job{count !== 1 ? \"s\" : \"\"} selected\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={clear}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Clear\n </button>\n {selectedDisabledCount > 0 && (\n <button\n type=\"button\"\n onClick={() => openBulkModal(\"enable\")}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Enable{selectedDisabledCount < count ? ` (${selectedDisabledCount})` : \"\"}\n </button>\n )}\n {selectedEnabledCount > 0 && (\n <button\n type=\"button\"\n onClick={() => openBulkModal(\"disable\")}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Disable{selectedEnabledCount < count ? ` (${selectedEnabledCount})` : \"\"}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => openBulkModal(\"delete\")}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-1.5 text-xs font-medium text-white hover:bg-[var(--ck-accent-red-hover)]\"\n >\n Delete selected\n </button>\n </div>\n </div>\n )}\n\n <ConfirmationModal\n open={bulkModalAction !== null && !bulkConfirmed}\n onClose={closeBulkModal}\n title={\n bulkModalAction === \"delete\" ? \"Delete Cron Jobs\"\n : bulkModalAction === \"enable\" ? \"Enable Cron Jobs\"\n : \"Disable Cron Jobs\"\n }\n confirmLabel={\n bulkModalAction === \"delete\" ? \"Delete\"\n : bulkModalAction === \"enable\" ? \"Enable\"\n : \"Disable\"\n }\n onConfirm={confirmBulkAction}\n confirmButtonClassName={\n bulkModalAction === \"delete\"\n ? undefined\n : \"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n }\n >\n <p className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">\n {bulkModalAction === \"delete\" ? (\n <>\n Are you sure you want to permanently delete{\" \"}\n <strong className=\"text-[color:var(--ck-text-primary)]\">{count} cron job{count !== 1 ? \"s\" : \"\"}</strong>?\n This action cannot be undone.\n </>\n ) : bulkModalAction === \"enable\" ? (\n <>\n Enable{\" \"}\n <strong className=\"text-[color:var(--ck-text-primary)]\">{selectedDisabledCount} cron job{selectedDisabledCount !== 1 ? \"s\" : \"\"}</strong>?\n {selectedEnabledCount > 0 && (\n <span> ({selectedEnabledCount} already enabled will be skipped.)</span>\n )}\n </>\n ) : (\n <>\n Disable{\" \"}\n <strong className=\"text-[color:var(--ck-text-primary)]\">{selectedEnabledCount} cron job{selectedEnabledCount !== 1 ? \"s\" : \"\"}</strong>?\n {selectedDisabledCount > 0 && (\n <span> ({selectedDisabledCount} already disabled will be skipped.)</span>\n )}\n </>\n )}\n </p>\n </ConfirmationModal>\n\n {/* Live progress modal */}\n {bulkModalAction !== null && bulkConfirmed && (\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" aria-hidden=\"true\" />\n <div className=\"fixed inset-0 overflow-y-auto\" role=\"dialog\" aria-modal=\"true\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-5 shadow-[var(--ck-shadow-2)]\">\n <h2 className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">\n {bulkModalAction === \"delete\" ? \"Deleting\" : bulkModalAction === \"enable\" ? \"Enabling\" : \"Disabling\"} Cron Jobs\n </h2>\n <div className=\"mt-4 max-h-80 space-y-1 overflow-y-auto rounded-lg border border-white/10 bg-black/30 p-3 font-mono text-xs\">\n {Array.from(bulkJobStatuses.entries()).map(([id, { status, error }]) => (\n <div key={id} className=\"flex items-center gap-2\">\n <span className=\"shrink-0 w-4 text-center\">\n {status === \"pending\" && <span className=\"text-[color:var(--ck-text-tertiary)]\">·</span>}\n {status === \"in-progress\" && <span className=\"text-yellow-400 animate-pulse\">▸</span>}\n {status === \"done\" && <span className=\"text-green-400\">✓</span>}\n {status === \"skipped\" && <span className=\"text-[color:var(--ck-text-tertiary)]\">–</span>}\n {status === \"error\" && <span className=\"text-red-400\">✗</span>}\n </span>\n <span className={\n status === \"done\" ? \"text-green-400\"\n : status === \"in-progress\" ? \"text-yellow-400\"\n : status === \"error\" ? \"text-red-400\"\n : \"text-[color:var(--ck-text-tertiary)]\"\n }>\n {jobLabel(id)}\n </span>\n <span className=\"ml-auto shrink-0 text-[10px]\">\n {status === \"pending\" && \"\"}\n {status === \"in-progress\" && (\n <span className=\"text-yellow-400\">\n {bulkModalAction === \"delete\" ? \"deleting...\" : bulkModalAction === \"enable\" ? \"enabling...\" : \"disabling...\"}\n </span>\n )}\n {status === \"done\" && (\n <span className=\"text-green-400\">\n {bulkModalAction === \"delete\" ? \"deleted\" : bulkModalAction === \"enable\" ? \"enabled\" : \"disabled\"}\n </span>\n )}\n {status === \"skipped\" && (\n <span className=\"text-[color:var(--ck-text-tertiary)]\">\n already {bulkModalAction === \"enable\" ? \"enabled\" : \"disabled\"}\n </span>\n )}\n {status === \"error\" && (\n <span className=\"text-red-400\" title={error}>{error ?? \"failed\"}</span>\n )}\n </span>\n </div>\n ))}\n </div>\n <div className=\"mt-4 flex items-center justify-end\">\n <button\n type=\"button\"\n disabled={bulkRunning}\n onClick={closeBulkModal}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-40\"\n >\n {bulkRunning ? \"Processing...\" : \"Close\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n <DeleteCronJobModal\n open={deleteOpen}\n jobLabel={deleteLabel}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <EditCronJobModal\n job={liveEditJob}\n open={editOpen}\n onClose={() => setEditOpen(false)}\n onSaved={refresh}\n />\n\n <CreateCronJobModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n onCreated={refresh}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport { CronJobForm } from \"@/components/CronJobForm\";\nimport { useCronJobForm } from \"@/hooks/useCronJobForm\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype CronJob = {\n id: string;\n name?: string;\n description?: string;\n enabled?: boolean;\n schedule?: {\n kind?: string;\n expr?: string;\n everyMs?: number;\n tz?: string;\n };\n delivery?: {\n mode?: string;\n channel?: string;\n to?: string;\n bestEffort?: boolean;\n };\n payload?: {\n kind?: string;\n text?: string;\n message?: string;\n model?: string;\n thinking?: string;\n timeoutSeconds?: number;\n };\n agentId?: string;\n sessionTarget?: string;\n sessionKey?: string;\n};\n\ninterface EditCronJobModalProps {\n job: CronJob | null;\n open: boolean;\n onClose: () => void;\n onSaved: () => void;\n}\n\nexport function EditCronJobModal({ job, open, onClose, onSaved }: EditCronJobModalProps) {\n const {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n buildPayload,\n } = useCronJobForm();\n\n // Populate form when job changes\n useEffect(() => {\n if (job) {\n const everyMs = job.schedule?.everyMs;\n let everyValue = 60;\n let everyUnit: \"s\" | \"m\" | \"h\" | \"d\";\n \n if (everyMs) {\n if (everyMs % 86400000 === 0) {\n everyValue = everyMs / 86400000;\n everyUnit = \"d\";\n } else if (everyMs % 3600000 === 0) {\n everyValue = everyMs / 3600000;\n everyUnit = \"h\";\n } else if (everyMs % 60000 === 0) {\n everyValue = everyMs / 60000;\n everyUnit = \"m\";\n } else {\n everyValue = everyMs / 1000;\n everyUnit = \"s\";\n }\n } else {\n everyUnit = \"m\";\n }\n\n // Update all form fields with job data\n updateField(\"name\", job.name || \"\");\n updateField(\"description\", job.description || \"\");\n updateField(\"enabled\", job.enabled ?? true);\n updateField(\"scheduleKind\", (job.schedule?.kind as \"cron\" | \"every\" | \"at\") || \"every\");\n updateField(\"cronExpr\", job.schedule?.expr || \"0 * * * *\");\n updateField(\"everyValue\", everyValue);\n updateField(\"everyUnit\", everyUnit);\n updateField(\"timezone\", job.schedule?.tz || \"\");\n updateField(\"deliveryMode\", (job.delivery?.mode as \"none\" | \"announce\") || \"none\");\n updateField(\"deliveryChannel\", job.delivery?.channel || \"\");\n updateField(\"deliveryTo\", job.delivery?.to || \"\");\n updateField(\"deliveryBestEffort\", job.delivery?.bestEffort ?? true);\n updateField(\"payloadKind\", (job.payload?.kind as \"systemEvent\" | \"agentTurn\") || \"agentTurn\");\n updateField(\"payloadText\", job.payload?.text || \"\");\n updateField(\"payloadMessage\", job.payload?.message || \"\");\n updateField(\"payloadModel\", job.payload?.model || \"\");\n updateField(\"payloadThinking\", job.payload?.thinking || \"\");\n updateField(\"payloadTimeout\", job.payload?.timeoutSeconds || 30);\n updateField(\"agentId\", job.agentId || \"\");\n updateField(\"sessionTarget\", job.sessionTarget || \"\");\n updateField(\"sessionKey\", job.sessionKey || \"\");\n }\n }, [job, updateField]);\n\n const handleSave = async () => {\n if (!job) return;\n \n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/edit\", {\n method: \"POST\",\n body: JSON.stringify({\n id: job.id,\n ...buildPayload(),\n }),\n });\n\n onSaved();\n onClose();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n const handleDelete = async () => {\n if (!job || !confirm(\"Are you sure you want to delete this cron job?\")) return;\n \n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/delete\", {\n method: \"POST\",\n body: JSON.stringify({ id: job.id }),\n });\n\n onSaved();\n onClose();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n if (!job) return null;\n\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title=\"Edit Cron Job\"\n error={error}\n confirmLabel=\"Save changes\"\n confirmBusyLabel=\"Saving…\"\n confirmDisabled={!formData.name}\n busy={loading}\n onConfirm={handleSave}\n >\n <div className=\"mt-4 max-h-[70vh] overflow-y-auto\">\n <CronJobForm formData={formData} updateField={updateField} />\n </div>\n\n <div className=\"mt-6 flex items-center justify-between gap-2 border-t border-white/10 pt-4\">\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={loading}\n className=\"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-50\"\n >\n Delete job\n </button>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Tip: use dryRun=true to test safely.</div>\n </div>\n </ConfirmationModal>\n );\n}\n","import React from \"react\";\nimport { CronJobFormData } from \"@/hooks/useCronJobForm\";\n\ninterface CronJobFormProps {\n formData: CronJobFormData;\n updateField: <K extends keyof CronJobFormData>(field: K, value: CronJobFormData[K]) => void;\n}\n\nexport function CronJobForm({ formData, updateField }: CronJobFormProps) {\n return (\n <div className=\"space-y-4\">\n {/* Basic Info */}\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Name</span>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => updateField(\"name\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n placeholder=\"Job name\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent ID</span>\n <input\n type=\"text\"\n value={formData.agentId}\n onChange={(e) => updateField(\"agentId\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n placeholder=\"Agent ID\"\n />\n </label>\n </div>\n\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Description</span>\n <textarea\n value={formData.description}\n onChange={(e) => updateField(\"description\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n rows={2}\n placeholder=\"Optional description\"\n />\n </label>\n\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"enabled\"\n checked={formData.enabled}\n onChange={(e) => updateField(\"enabled\", e.target.checked)}\n className=\"h-4 w-4 rounded border-white/20 bg-white/5\"\n />\n <label htmlFor=\"enabled\" className=\"ml-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">\n Enabled\n </label>\n </div>\n\n {/* Schedule */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Schedule</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Schedule Type</span>\n <select\n value={formData.scheduleKind}\n onChange={(e) => updateField(\"scheduleKind\", e.target.value as \"cron\" | \"every\" | \"at\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"every\">Every (interval)</option>\n <option value=\"cron\">Cron expression</option>\n <option value=\"at\">At specific time</option>\n </select>\n </label>\n\n {formData.scheduleKind === \"every\" && (\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Every</span>\n <input\n type=\"number\"\n value={formData.everyValue}\n onChange={(e) => updateField(\"everyValue\", Number(e.target.value))}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n min=\"1\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Unit</span>\n <select\n value={formData.everyUnit}\n onChange={(e) => updateField(\"everyUnit\", e.target.value as \"s\" | \"m\" | \"h\" | \"d\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"s\">Seconds</option>\n <option value=\"m\">Minutes</option>\n <option value=\"h\">Hours</option>\n <option value=\"d\">Days</option>\n </select>\n </label>\n </div>\n )}\n\n {formData.scheduleKind === \"cron\" && (\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Cron Expression</span>\n <input\n type=\"text\"\n value={formData.cronExpr}\n onChange={(e) => updateField(\"cronExpr\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"0 * * * *\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Timezone (optional)</span>\n <input\n type=\"text\"\n value={formData.timezone}\n onChange={(e) => updateField(\"timezone\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"UTC\"\n />\n </label>\n </div>\n )}\n\n {formData.scheduleKind === \"at\" && (\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">At Time (ISO 8601)</span>\n <input\n type=\"text\"\n value={formData.atValue}\n onChange={(e) => updateField(\"atValue\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"2024-01-01T00:00:00Z\"\n />\n </label>\n )}\n </div>\n\n {/* Payload */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Payload</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Payload Type</span>\n <select\n value={formData.payloadKind}\n onChange={(e) => updateField(\"payloadKind\", e.target.value as \"systemEvent\" | \"agentTurn\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"agentTurn\">Agent Turn</option>\n <option value=\"systemEvent\">System Event</option>\n </select>\n </label>\n\n {formData.payloadKind === \"systemEvent\" ? (\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Event Text</span>\n <textarea\n value={formData.payloadText}\n onChange={(e) => updateField(\"payloadText\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n rows={3}\n placeholder=\"System event message\"\n />\n </label>\n ) : (\n <div className=\"space-y-3\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Message</span>\n <textarea\n value={formData.payloadMessage}\n onChange={(e) => updateField(\"payloadMessage\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n rows={3}\n placeholder=\"Agent message\"\n />\n </label>\n \n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Model (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadModel}\n onChange={(e) => updateField(\"payloadModel\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Model ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Thinking (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadThinking}\n onChange={(e) => updateField(\"payloadThinking\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Thinking level\"\n />\n </label>\n </div>\n \n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Timeout (seconds)</span>\n <input\n type=\"number\"\n value={formData.payloadTimeout}\n onChange={(e) => updateField(\"payloadTimeout\", Number(e.target.value))}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n min=\"1\"\n />\n </label>\n </div>\n )}\n </div>\n\n {/* Delivery */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Delivery</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Delivery Mode</span>\n <select\n value={formData.deliveryMode}\n onChange={(e) => updateField(\"deliveryMode\", e.target.value as \"none\" | \"announce\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"none\">None</option>\n <option value=\"announce\">Announce</option>\n </select>\n </label>\n\n {formData.deliveryMode === \"announce\" && (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Channel (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryChannel}\n onChange={(e) => updateField(\"deliveryChannel\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Channel ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">To (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryTo}\n onChange={(e) => updateField(\"deliveryTo\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Target\"\n />\n </label>\n </div>\n \n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"bestEffort\"\n checked={formData.deliveryBestEffort}\n onChange={(e) => updateField(\"deliveryBestEffort\", e.target.checked)}\n className=\"h-4 w-4 rounded border-white/20 bg-white/5\"\n />\n <label htmlFor=\"bestEffort\" className=\"ml-2 text-sm text-[color:var(--ck-text-primary)]\">\n Best effort delivery\n </label>\n </div>\n </div>\n )}\n </div>\n\n {/* Advanced */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Advanced</h4>\n \n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Session Target (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionTarget}\n onChange={(e) => updateField(\"sessionTarget\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Session target\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Session Key (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionKey}\n onChange={(e) => updateField(\"sessionKey\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Session key\"\n />\n </label>\n </div>\n </div>\n </div>\n );\n}","import { useCallback, useState } from \"react\";\n\nexport interface CronJobFormData {\n name: string;\n description: string;\n enabled: boolean;\n scheduleKind: \"cron\" | \"every\" | \"at\";\n cronExpr: string;\n everyValue: number;\n everyUnit: \"s\" | \"m\" | \"h\" | \"d\";\n atValue: string;\n timezone: string;\n deliveryMode: \"none\" | \"announce\";\n deliveryChannel: string;\n deliveryTo: string;\n deliveryBestEffort: boolean;\n payloadKind: \"systemEvent\" | \"agentTurn\";\n payloadText: string;\n payloadMessage: string;\n payloadModel: string;\n payloadThinking: string;\n payloadTimeout: number;\n agentId: string;\n sessionTarget: string;\n sessionKey: string;\n}\n\nexport interface UseCronJobFormOptions {\n initialData?: Partial<CronJobFormData>;\n}\n\nexport function useCronJobForm(options: UseCronJobFormOptions = {}) {\n const [formData, setFormData] = useState<CronJobFormData>({\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n cronExpr: \"0 * * * *\",\n everyValue: 60,\n everyUnit: \"m\",\n atValue: \"\",\n timezone: \"\",\n deliveryMode: \"none\",\n deliveryChannel: \"\",\n deliveryTo: \"\",\n deliveryBestEffort: true,\n payloadKind: \"agentTurn\",\n payloadText: \"\",\n payloadMessage: \"\",\n payloadModel: \"\",\n payloadThinking: \"\",\n payloadTimeout: 30,\n agentId: \"\",\n sessionTarget: \"\",\n sessionKey: \"\",\n ...options.initialData,\n });\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const updateField = useCallback(\n <K extends keyof CronJobFormData>(field: K, value: CronJobFormData[K]) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n },\n [],\n );\n\n const reset = () => {\n setFormData({\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n cronExpr: \"0 * * * *\",\n everyValue: 60,\n everyUnit: \"m\",\n atValue: \"\",\n timezone: \"\",\n deliveryMode: \"none\",\n deliveryChannel: \"\",\n deliveryTo: \"\",\n deliveryBestEffort: true,\n payloadKind: \"agentTurn\",\n payloadText: \"\",\n payloadMessage: \"\",\n payloadModel: \"\",\n payloadThinking: \"\",\n payloadTimeout: 30,\n agentId: \"\",\n sessionTarget: \"\",\n sessionKey: \"\",\n ...options.initialData,\n });\n };\n\n const buildPayload = () => {\n const everyMs = formData.scheduleKind === \"every\" ? \n formData.everyValue * (\n formData.everyUnit === \"s\" ? 1000 : \n formData.everyUnit === \"m\" ? 60000 : \n formData.everyUnit === \"h\" ? 3600000 : \n 86400000\n ) : undefined;\n\n const schedule = formData.scheduleKind === \"cron\" \n ? { kind: \"cron\" as const, expr: formData.cronExpr, ...(formData.timezone ? { tz: formData.timezone } : {}) }\n : formData.scheduleKind === \"every\"\n ? { kind: \"every\" as const, everyMs: everyMs! }\n : { kind: \"at\" as const, at: formData.atValue };\n\n const delivery = formData.deliveryMode === \"none\" \n ? { mode: \"none\" as const }\n : { \n mode: \"announce\" as const, \n ...(formData.deliveryChannel ? { channel: formData.deliveryChannel } : {}),\n ...(formData.deliveryTo ? { to: formData.deliveryTo } : {}),\n bestEffort: formData.deliveryBestEffort \n };\n\n const payload = formData.payloadKind === \"systemEvent\"\n ? { kind: \"systemEvent\" as const, text: formData.payloadText }\n : { \n kind: \"agentTurn\" as const, \n message: formData.payloadMessage,\n ...(formData.payloadModel ? { model: formData.payloadModel } : {}),\n ...(formData.payloadThinking ? { thinking: formData.payloadThinking } : {}),\n timeoutSeconds: formData.payloadTimeout \n };\n\n return {\n name: formData.name,\n description: formData.description,\n enabled: formData.enabled,\n schedule,\n delivery,\n payload,\n agentId: formData.agentId,\n sessionTarget: formData.sessionTarget,\n sessionKey: formData.sessionKey,\n };\n };\n\n return {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n reset,\n buildPayload,\n };\n}","\"use client\";\n\nimport { Modal } from \"@/components/Modal\";\nimport { CronJobForm } from \"@/components/CronJobForm\";\nimport { useCronJobForm } from \"@/hooks/useCronJobForm\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { errorMessage } from \"@/lib/errors\";\n\ninterface CreateCronJobModalProps {\n open: boolean;\n onClose: () => void;\n onCreated: () => void;\n}\n\nexport function CreateCronJobModal({ open, onClose, onCreated }: CreateCronJobModalProps) {\n const {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n reset,\n buildPayload,\n } = useCronJobForm();\n\n const handleCreate = async () => {\n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/add\", {\n method: \"POST\",\n body: JSON.stringify(buildPayload()),\n });\n\n onCreated();\n onClose();\n reset();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Cron Job\" size=\"lg\">\n <div className=\"max-h-[70vh] overflow-y-auto\">\n <CronJobForm formData={formData} updateField={updateField} />\n\n {error && (\n <div className=\"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n )}\n </div>\n\n <div className=\"mt-6 flex items-center justify-end gap-2 border-t border-white/10 pt-4\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleCreate}\n disabled={loading || !formData.name}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {loading ? \"Creating...\" : \"Create Job\"}\n </button>\n </div>\n </Modal>\n );\n}"],"names":[],"mappings":"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"}
|