@jiggai/kitchen 0.3.29 → 0.3.31
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 +1 -0
- package/.next/build-manifest.json +2 -2
- package/.next/routes-manifest.json +6 -0
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +3 -3
- package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- 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_client-reference-manifest.js +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/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/settings/model-options/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/settings/model-options/route/build-manifest.json +11 -0
- package/.next/server/app/api/settings/model-options/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/settings/model-options/route.js +6 -0
- package/.next/server/app/api/settings/model-options/route.js.map +5 -0
- package/.next/server/app/api/settings/model-options/route.js.nft.json +1 -0
- package/.next/server/app/api/settings/model-options/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/teams/[teamId]/tickets/assign/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/orchestrator/route.js +1 -1
- package/.next/server/app/api/teams/orchestrator/route.js.nft.json +1 -1
- package/.next/server/app/api/teams/workflow-runs/route.js +1 -1
- package/.next/server/app/api/teams/workflow-runs/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_client-reference-manifest.js +1 -1
- package/.next/server/app/channels.html +2 -2
- package/.next/server/app/channels.rsc +3 -3
- package/.next/server/app/channels.segments/_full.segment.rsc +3 -3
- package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
- package/.next/server/app/channels.segments/_index.segment.rsc +2 -2
- package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
- package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/goals/[id]/page_client-reference-manifest.js +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 +3 -3
- package/.next/server/app/goals/new.segments/_full.segment.rsc +3 -3
- package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals/new.segments/_index.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/server/app/goals.html +1 -1
- package/.next/server/app/goals.rsc +3 -3
- package/.next/server/app/goals.segments/_full.segment.rsc +3 -3
- package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
- package/.next/server/app/goals.segments/_index.segment.rsc +2 -2
- package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
- package/.next/server/app/runs/page_client-reference-manifest.js +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 +3 -3
- package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/teams/[teamId]/deliverables/page_client-reference-manifest.js +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_client-reference-manifest.js +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.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.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_client-reference-manifest.js +1 -1
- package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +1 -1
- 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.js.nft.json +1 -1
- package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +1 -0
- package/.next/server/chunks/[root-of-the-server]__00a30f40._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__00a30f40._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__04f289da._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__04f289da._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__08b4c8f2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__08b4c8f2._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__0bea0f71._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0bea0f71._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1311d7a3._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1311d7a3._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__1480ffda._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1480ffda._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__17124952._.js +4 -0
- package/.next/server/chunks/[root-of-the-server]__17124952._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__18423bab._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__18423bab._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__1873f417._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1873f417._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__2c207e60._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__2c207e60._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__3021a250._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3021a250._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__30cd38e9._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__30cd38e9._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__343776df._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__343776df._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__35ec765d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__35ec765d._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__3b2d0020._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3b2d0020._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__3bfad714._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__3bfad714._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__3d15e850._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3d15e850._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__3f648b9b._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3f648b9b._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__482575d2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__482575d2._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__4ee12514._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__4ee12514._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__55defc7c._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__55defc7c._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__663e79ff._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__663e79ff._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__69c065ce._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__69c065ce._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__74e2a9ba._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__74e2a9ba._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__7bdf9f6e._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__7bdf9f6e._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__7e12b9f4._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__7e12b9f4._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__87875179._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__87875179._.js.map +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]__aed4e4f2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__aed4e4f2._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__b6cff26d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__b6cff26d._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__c1b0d50e._.js +4 -0
- package/.next/server/chunks/[root-of-the-server]__c1b0d50e._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__c50e4bc4._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__c50e4bc4._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__c5e88cbb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__c5e88cbb._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__cc0860cb._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__cc0860cb._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__d4a8660e._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__d4a8660e._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__e478ef0d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e478ef0d._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__e9acbabd._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__e9acbabd._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__f4cbadf7._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__f4cbadf7._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__f994dc62._.js +2 -2
- package/.next/server/chunks/[root-of-the-server]__f994dc62._.js.map +1 -1
- package/.next/server/chunks/_next-internal_server_app_api_settings_model-options_route_actions_bccf115a.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_settings_model-options_route_actions_bccf115a.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/_7f9e89d2._.js +1 -1
- package/.next/server/chunks/ssr/_7f9e89d2._.js.map +1 -1
- package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +1 -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/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/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/static/chunks/57ad5290f7e92ffd.css +3 -0
- package/.next/static/chunks/8a919077b73862da.js +1 -0
- package/.next/static/chunks/9906444fb1191bb4.js +1 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -1
- package/.next/server/chunks/[root-of-the-server]__3452dc06._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__3452dc06._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__5d47b90b._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__5d47b90b._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__bb52fdc9._.js +0 -4
- package/.next/server/chunks/[root-of-the-server]__bb52fdc9._.js.map +0 -1
- package/.next/static/chunks/79b7c8c80713887a.js +0 -1
- package/.next/static/chunks/b3bca877b0f5b4e9.css +0 -3
- package/.next/static/chunks/c411f6e912e3c3a1.js +0 -1
- /package/.next/static/{kWLUtSfI8C26lIp4FvoAU → jy6WTfJCuzMwTBF_4KUm6}/_buildManifest.js +0 -0
- /package/.next/static/{kWLUtSfI8C26lIp4FvoAU → jy6WTfJCuzMwTBF_4KUm6}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{kWLUtSfI8C26lIp4FvoAU → jy6WTfJCuzMwTBF_4KUm6}/_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(35112);function g({open:a,onClose:c,title:d,children:e,size:g="md"}){if(!a)return null;let h="modal-title";return(0,f.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":h,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"}[g]} 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:h,className:"text-lg font-semibold text-[color:var(--ck-text-primary)] mb-4",children:d}),e]})})})]}),document.body)}function h({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",children:"Name"}),(0,b.jsx)("input",{type:"text",value:a.name,onChange:a=>c("name",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"Job name"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Agent ID"}),(0,b.jsx)("input",{type:"text",value:a.agentId,onChange:a=>c("agentId",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"Agent ID"})]})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Description"}),(0,b.jsx)("textarea",{value:a.description,onChange:a=>c("description",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",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 text-blue-600 focus:ring-blue-500 border-gray-300 rounded"}),(0,b.jsx)("label",{htmlFor:"enabled",className:"ml-2 text-sm font-medium",children:"Enabled"})]}),(0,b.jsxs)("div",{className:"border-t pt-4",children:[(0,b.jsx)("h4",{className:"font-medium mb-3",children:"Schedule"}),(0,b.jsxs)("label",{className:"block mb-3",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Schedule Type"}),(0,b.jsxs)("select",{value:a.scheduleKind,onChange:a=>c("scheduleKind",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",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",children:"Every"}),(0,b.jsx)("input",{type:"number",value:a.everyValue,onChange:a=>c("everyValue",Number(a.target.value)),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",min:"1"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Unit"}),(0,b.jsxs)("select",{value:a.everyUnit,onChange:a=>c("everyUnit",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",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",children:"Cron Expression"}),(0,b.jsx)("input",{type:"text",value:a.cronExpr,onChange:a=>c("cronExpr",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"0 * * * *"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Timezone (optional)"}),(0,b.jsx)("input",{type:"text",value:a.timezone,onChange:a=>c("timezone",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"UTC"})]})]}),"at"===a.scheduleKind&&(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"At Time (ISO 8601)"}),(0,b.jsx)("input",{type:"text",value:a.atValue,onChange:a=>c("atValue",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"2024-01-01T00:00:00Z"})]})]}),(0,b.jsxs)("div",{className:"border-t pt-4",children:[(0,b.jsx)("h4",{className:"font-medium mb-3",children:"Payload"}),(0,b.jsxs)("label",{className:"block mb-3",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Payload Type"}),(0,b.jsxs)("select",{value:a.payloadKind,onChange:a=>c("payloadKind",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",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",children:"Event Text"}),(0,b.jsx)("textarea",{value:a.payloadText,onChange:a=>c("payloadText",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",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",children:"Message"}),(0,b.jsx)("textarea",{value:a.payloadMessage,onChange:a=>c("payloadMessage",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",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",children:"Model (optional)"}),(0,b.jsx)("input",{type:"text",value:a.payloadModel,onChange:a=>c("payloadModel",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"Model ID"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Thinking (optional)"}),(0,b.jsx)("input",{type:"text",value:a.payloadThinking,onChange:a=>c("payloadThinking",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"Thinking level"})]})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Timeout (seconds)"}),(0,b.jsx)("input",{type:"number",value:a.payloadTimeout,onChange:a=>c("payloadTimeout",Number(a.target.value)),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",min:"1"})]})]})]}),(0,b.jsxs)("div",{className:"border-t pt-4",children:[(0,b.jsx)("h4",{className:"font-medium mb-3",children:"Delivery"}),(0,b.jsxs)("label",{className:"block mb-3",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Delivery Mode"}),(0,b.jsxs)("select",{value:a.deliveryMode,onChange:a=>c("deliveryMode",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",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",children:"Channel (optional)"}),(0,b.jsx)("input",{type:"text",value:a.deliveryChannel,onChange:a=>c("deliveryChannel",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"Channel ID"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"To (optional)"}),(0,b.jsx)("input",{type:"text",value:a.deliveryTo,onChange:a=>c("deliveryTo",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",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 text-blue-600 focus:ring-blue-500 border-gray-300 rounded"}),(0,b.jsx)("label",{htmlFor:"bestEffort",className:"ml-2 text-sm",children:"Best effort delivery"})]})]})]}),(0,b.jsxs)("div",{className:"border-t pt-4",children:[(0,b.jsx)("h4",{className:"font-medium 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",children:"Session Target (optional)"}),(0,b.jsx)("input",{type:"text",value:a.sessionTarget,onChange:a=>c("sessionTarget",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"Session target"})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("span",{className:"text-sm font-medium",children:"Session Key (optional)"}),(0,b.jsx)("input",{type:"text",value:a.sessionKey,onChange:a=>c("sessionKey",a.target.value),className:"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2",placeholder:"Session key"})]})]})]})]})}function i(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,h]=(0,c.useState)(null);return{formData:b,loading:e,error:g,setLoading:f,setError:h,updateField:(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 j=a.i(51200),k=a.i(74621);function l({job:a,open:d,onClose:e,onSaved:f}){let{formData:l,loading:m,error:n,setLoading:o,setError:p,updateField:q,buildPayload:r}=i();(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,j.fetchJson)("/api/cron/edit",{method:"POST",body:JSON.stringify({id:a.id,...r()})}),f(),e()}catch(a){p((0,k.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,j.fetchJson)("/api/cron/delete",{method:"POST",body:JSON.stringify({id:a.id})}),f(),e()}catch(a){p((0,k.errorMessage)(a))}finally{o(!1)}}};return a?(0,b.jsxs)(g,{open:d,onClose:e,title:"Edit Cron Job",size:"lg",children:[(0,b.jsxs)("div",{className:"max-h-[70vh] overflow-y-auto",children:[(0,b.jsx)(h,{formData:l,updateField:q}),n&&(0,b.jsx)("div",{className:"mt-4 p-3 bg-red-50 border border-red-200 rounded text-red-700 text-sm",children:n})]}),(0,b.jsxs)("div",{className:"flex justify-between mt-6 pt-4 border-t",children:[(0,b.jsx)("button",{type:"button",onClick:t,disabled:m,className:"px-4 py-2 bg-red-600 text-white rounded hover:bg-red-700 disabled:opacity-50 disabled:cursor-not-allowed",children:m?"Deleting...":"Delete Job"}),(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:e,className:"px-4 py-2 text-gray-600 hover:text-gray-800",disabled:m,children:"Cancel"}),(0,b.jsx)("button",{type:"button",onClick:s,disabled:m||!l.name,className:"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed",children:m?"Saving...":"Save Changes"})]})]})]}):null}function m({open:a,onClose:c,onCreated:d}){let{formData:e,loading:f,error:l,setLoading:m,setError:n,updateField:o,reset:p,buildPayload:q}=i(),r=async()=>{m(!0),n(null);try{await (0,j.fetchJson)("/api/cron/add",{method:"POST",body:JSON.stringify(q())}),d(),c(),p()}catch(a){n((0,k.errorMessage)(a))}finally{m(!1)}};return(0,b.jsxs)(g,{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)(h,{formData:e,updateField:o}),l&&(0,b.jsx)("div",{className:"mt-4 p-3 bg-red-50 border border-red-200 rounded text-red-700 text-sm",children:l})]}),(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 n(a){return!!(a.enabled??a.state?.enabled)}function o({teamId:a}){let f=(0,d.useToast)(),g=(a??"").trim(),[h,i]=(0,c.useState)(!1),[o,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)(()=>[...o].sort((a,b)=>{let c=n(a);return c!==n(b)?c?-1:1:String(a.name??"").localeCompare(String(b.name??""))}),[o]);async function L(){i(!0),r("");try{let a=g?`/api/cron/jobs?teamId=${encodeURIComponent(g)}`:"/api/cron/jobs",b=await (0,j.fetchJson)(a,{cache:"no-store"});p(b.jobs??[]),0===(b.jobs??[]).length&&r("No cron jobs found.")}catch(a){r((0,k.errorMessage)(a)),p([])}finally{i(!1)}}async function M(a,b){i(!0),r("");try{await (0,j.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 L()}catch(a){r((0,k.errorMessage)(a))}finally{i(!1)}}async function N(){B(!0),D(null);try{let a=await (0,j.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 L()}catch(b){let a=(0,k.errorMessage)(b);D(a),f.push({kind:"error",message:a})}finally{B(!1)}}return(0,c.useEffect)(()=>{L()},[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:[o.length," job",1!==o.length?"s":""," total · ",o.filter(a=>n(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:L,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:n(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:()=>M(a.id,n(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:n(a)?"Disable":"Enable"}),(0,b.jsx)("button",{type:"button",onClick:()=>M(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:n(a)?"Disable this job before deleting.":"Delete cron job",onClick:()=>{x(a.id),z(a.name??a.id),D(null),v(!0)},disabled:h||n(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:N}),(0,b.jsx)(l,{job:G,open:E,onClose:()=>F(!1),onSaved:L}),(0,b.jsx)(m,{open:I,onClose:()=>J(!1),onCreated:L})]})}a.s(["default",()=>o],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-[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)}];
|
|
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/Modal.tsx","../../../../src/components/CronJobForm.tsx","../../../../src/hooks/useCronJobForm.ts","../../../../src/components/EditCronJobModal.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 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={editJob}\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 { 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}","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\">Name</span>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => updateField(\"name\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n placeholder=\"Job name\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium\">Agent ID</span>\n <input\n type=\"text\"\n value={formData.agentId}\n onChange={(e) => updateField(\"agentId\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n placeholder=\"Agent ID\"\n />\n </label>\n </div>\n\n <label className=\"block\">\n <span className=\"text-sm font-medium\">Description</span>\n <textarea\n value={formData.description}\n onChange={(e) => updateField(\"description\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\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 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"enabled\" className=\"ml-2 text-sm font-medium\">\n Enabled\n </label>\n </div>\n\n {/* Schedule */}\n <div className=\"border-t pt-4\">\n <h4 className=\"font-medium mb-3\">Schedule</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium\">Schedule Type</span>\n <select\n value={formData.scheduleKind}\n onChange={(e) => updateField(\"scheduleKind\", e.target.value as \"cron\" | \"every\" | \"at\")}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\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\">Every</span>\n <input\n type=\"number\"\n value={formData.everyValue}\n onChange={(e) => updateField(\"everyValue\", Number(e.target.value))}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n min=\"1\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium\">Unit</span>\n <select\n value={formData.everyUnit}\n onChange={(e) => updateField(\"everyUnit\", e.target.value as \"s\" | \"m\" | \"h\" | \"d\")}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\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\">Cron Expression</span>\n <input\n type=\"text\"\n value={formData.cronExpr}\n onChange={(e) => updateField(\"cronExpr\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n placeholder=\"0 * * * *\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium\">Timezone (optional)</span>\n <input\n type=\"text\"\n value={formData.timezone}\n onChange={(e) => updateField(\"timezone\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\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\">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-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n placeholder=\"2024-01-01T00:00:00Z\"\n />\n </label>\n )}\n </div>\n\n {/* Payload */}\n <div className=\"border-t pt-4\">\n <h4 className=\"font-medium mb-3\">Payload</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium\">Payload Type</span>\n <select\n value={formData.payloadKind}\n onChange={(e) => updateField(\"payloadKind\", e.target.value as \"systemEvent\" | \"agentTurn\")}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\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\">Event Text</span>\n <textarea\n value={formData.payloadText}\n onChange={(e) => updateField(\"payloadText\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\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\">Message</span>\n <textarea\n value={formData.payloadMessage}\n onChange={(e) => updateField(\"payloadMessage\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\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\">Model (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadModel}\n onChange={(e) => updateField(\"payloadModel\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n placeholder=\"Model ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium\">Thinking (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadThinking}\n onChange={(e) => updateField(\"payloadThinking\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n placeholder=\"Thinking level\"\n />\n </label>\n </div>\n \n <label className=\"block\">\n <span className=\"text-sm font-medium\">Timeout (seconds)</span>\n <input\n type=\"number\"\n value={formData.payloadTimeout}\n onChange={(e) => updateField(\"payloadTimeout\", Number(e.target.value))}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n min=\"1\"\n />\n </label>\n </div>\n )}\n </div>\n\n {/* Delivery */}\n <div className=\"border-t pt-4\">\n <h4 className=\"font-medium mb-3\">Delivery</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium\">Delivery Mode</span>\n <select\n value={formData.deliveryMode}\n onChange={(e) => updateField(\"deliveryMode\", e.target.value as \"none\" | \"announce\")}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\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\">Channel (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryChannel}\n onChange={(e) => updateField(\"deliveryChannel\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n placeholder=\"Channel ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium\">To (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryTo}\n onChange={(e) => updateField(\"deliveryTo\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\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 text-blue-600 focus:ring-blue-500 border-gray-300 rounded\"\n />\n <label htmlFor=\"bestEffort\" className=\"ml-2 text-sm\">\n Best effort delivery\n </label>\n </div>\n </div>\n )}\n </div>\n\n {/* Advanced */}\n <div className=\"border-t pt-4\">\n <h4 className=\"font-medium 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\">Session Target (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionTarget}\n onChange={(e) => updateField(\"sessionTarget\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n placeholder=\"Session target\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium\">Session Key (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionKey}\n onChange={(e) => updateField(\"sessionKey\", e.target.value)}\n className=\"mt-1 block w-full rounded-md border border-gray-300 px-3 py-2\"\n placeholder=\"Session key\"\n />\n </label>\n </div>\n </div>\n </div>\n );\n}","import { 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 = <K extends keyof CronJobFormData>(\n field: K,\n value: CronJobFormData[K]\n ) => {\n setFormData(prev => ({ ...prev, [field]: value }));\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 { useEffect } from \"react\";\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\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 <Modal open={open} onClose={onClose} title=\"Edit 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-between mt-6 pt-4 border-t\">\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={loading}\n className=\"px-4 py-2 bg-red-600 text-white rounded hover:bg-red-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {loading ? \"Deleting...\" : \"Delete Job\"}\n </button>\n \n <div className=\"flex gap-2\">\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={handleSave}\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 ? \"Saving...\" : \"Save Changes\"}\n </button>\n </div>\n </div>\n </Modal>\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/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 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--kWLUtSfI8C26lIp4FvoAU--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/b3bca877b0f5b4e9.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/e03137fd069b1514.js"/><script src="/_next/static/chunks/68a088aa49e6124a.js" async=""></script><script src="/_next/static/chunks/aebc3b6d791f68d2.js" async=""></script><script src="/_next/static/chunks/0edab8a24d59a626.js" async=""></script><script src="/_next/static/chunks/turbopack-dbf3078dbf5863bd.js" async=""></script><script src="/_next/static/chunks/d7541a171116ec9c.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/0bd6498bda341889.js" async=""></script><script src="/_next/static/chunks/d6e1b7307a9274ce.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>ClawKitchen (0.3.28-beta)</title><meta name="description" content="Local-first UI for authoring ClawRecipes recipes and scaffolding agents/teams."/><link rel="manifest" href="/manifest.webmanifest"/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" href="/favicon-16x16.png" sizes="16x16" type="image/png"/><link rel="icon" href="/favicon-32x32.png" sizes="32x32" type="image/png"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><script>(function(){try{var t=localStorage.getItem('ck-theme');var theme=(t==='light')?'light':'dark';document.documentElement.dataset.theme=theme;}catch(e){document.documentElement.dataset.theme='dark';}})();</script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-dvh w-dvw overflow-hidden"><aside class="flex shrink-0 flex-col border-r border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] backdrop-blur-[var(--ck-glass-blur)] w-72"><div class="flex h-14 items-center justify-between gap-2 border-b border-[color:var(--ck-border-subtle)] px-3"><a class="text-sm font-semibold tracking-tight" title="Home" href="/">Claw Kitchen</a><button class="rounded-[var(--ck-radius-sm)] px-2 py-1 text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5 hover:text-[color:var(--ck-text-primary)]" title="Collapse">«</button></div><div class="border-b border-[color:var(--ck-border-subtle)] p-2"><div class="flex flex-col gap-1"><div class="px-2 pt-1 text-xs font-semibold uppercase tracking-wide text-[color:var(--ck-text-tertiary)]">Team</div><select class="w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]"><option value="" selected="">All teams</option></select></div></div><nav class="min-h-0 flex-1 overflow-auto p-2"><div class="mt-2 px-2 pb-2 pt-2"></div><a title="Agents" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 11l9-8 9 8"></path><path d="M5 10v10h14V10"></path></svg></span></span><span>Agents</span></a><a title="Recipes" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/recipes"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 4h12v16H6z"></path><path d="M9 8h6"></path><path d="M9 12h6"></path></svg></span></span><span>Recipes</span></a><a title="Tickets" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/tickets"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 7h16v4a2 2 0 0 1 0 4v4H4v-4a2 2 0 0 0 0-4z"></path></svg></span></span><span>Tickets</span></a><a title="Channels" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/channels"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 6h16"></path><path d="M4 12h16"></path><path d="M4 18h16"></path><path d="M7 9h0"></path></svg></span></span><span>Channels</span></a><a title="Goals" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/goals"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5l3 3"></path></svg></span></span><span>Goals</span></a><a title="Cron jobs" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/cron-jobs"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5"></path></svg></span></span><span>Cron jobs</span></a><a title="Runs" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/runs"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19h16"></path><path d="M6 16l4-4 3 3 5-7"></path><circle cx="10" cy="12" r="1"></circle><circle cx="13" cy="15" r="1"></circle><circle cx="18" cy="8" r="1"></circle></svg></span></span><span>Runs</span></a><a title="Settings" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/settings"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 15.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Z"></path><path d="M19.4 15a7.9 7.9 0 0 0 .1-1l2-1.5-2-3.5-2.4.5a7.8 7.8 0 0 0-1.7-1L13.5 3h-4L8.6 6.5a7.8 7.8 0 0 0-1.7 1L4.5 7l-2 3.5 2 1.5a7.9 7.9 0 0 0 .1 1l-2 1.5 2 3.5 2.4-.5a7.8 7.8 0 0 0 1.7 1L10.5 21h4l.9-3.5a7.8 7.8 0 0 0 1.7-1l2.4.5 2-3.5-2-1.5Z"></path></svg></span></span><span>Settings</span></a></nav><div class="flex items-center justify-between gap-2 border-t border-[color:var(--ck-border-subtle)] p-2"><a href="https://github.com/JIGGAI/ClawRecipes/tree/main/docs" target="_blank" rel="noreferrer" class="rounded-[var(--ck-radius-sm)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5 hover:text-[color:var(--ck-text-primary)]" title="Docs">Docs</a><button type="button" class="grid h-9 w-9 place-items-center rounded-full border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]" aria-label="Switch to light mode" title="Switch to light mode"><span class="sr-only">Switch to light mode</span><svg class="h-4.5 w-4.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M21 14.2A7.8 7.8 0 0 1 9.8 3a7 7 0 1 0 11.2 11.2Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"></path></svg></button></div></aside><div class="min-w-0 flex-1"><main class="h-full overflow-auto p-4 md:p-6"><div class="mx-auto max-w-2xl px-6 py-12"><h1 class="text-xl font-semibold">Page not found</h1><p class="mt-2 text-sm text-[color:var(--ck-text-secondary)]">The page you requested does not exist.</p></div><!--$--><!--/$--></main></div></div><div aria-live="assertive" class="pointer-events-none fixed inset-0 z-[100] flex items-end px-4 py-6 sm:p-6"><div class="flex w-full flex-col items-start space-y-4"></div></div><script src="/_next/static/chunks/e03137fd069b1514.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[49830,[\"/_next/static/chunks/d7541a171116ec9c.js\"],\"AppShell\"]\n3:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"MetadataBoundary\"]\nc:I[63491,[\"/_next/static/chunks/d6e1b7307a9274ce.js\"],\"default\"]\n:HL[\"/_next/static/chunks/b3bca877b0f5b4e9.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"kWLUtSfI8C26lIp4FvoAU\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/b3bca877b0f5b4e9.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d7541a171116ec9c.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem('ck-theme');var theme=(t==='light')?'light':'dark';document.documentElement.dataset.theme=theme;}catch(e){document.documentElement.dataset.theme='dark';}})();\"}}]}],[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-2xl px-6 py-12\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-xl font-semibold\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\",\"children\":\"The page you requested does not exist.\"}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-2xl px-6 py-12\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-xl font-semibold\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\",\"children\":\"The page you requested does not exist.\"}]]}],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"d:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"IconMark\"]\n7:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"ClawKitchen (0.3.28-beta)\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Local-first UI for authoring ClawRecipes recipes and scaffolding agents/teams.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"5\",{\"rel\":\"icon\",\"href\":\"/favicon-16x16.png\",\"sizes\":\"16x16\",\"type\":\"image/png\"}],[\"$\",\"link\",\"6\",{\"rel\":\"icon\",\"href\":\"/favicon-32x32.png\",\"sizes\":\"32x32\",\"type\":\"image/png\"}],[\"$\",\"link\",\"7\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\"}],[\"$\",\"$Ld\",\"8\",{}]]\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><!--jy6WTfJCuzMwTBF_4KUm6--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/57ad5290f7e92ffd.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/e03137fd069b1514.js"/><script src="/_next/static/chunks/68a088aa49e6124a.js" async=""></script><script src="/_next/static/chunks/aebc3b6d791f68d2.js" async=""></script><script src="/_next/static/chunks/0edab8a24d59a626.js" async=""></script><script src="/_next/static/chunks/turbopack-dbf3078dbf5863bd.js" async=""></script><script src="/_next/static/chunks/d7541a171116ec9c.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/0bd6498bda341889.js" async=""></script><script src="/_next/static/chunks/d6e1b7307a9274ce.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>ClawKitchen (0.3.30-beta)</title><meta name="description" content="Local-first UI for authoring ClawRecipes recipes and scaffolding agents/teams."/><link rel="manifest" href="/manifest.webmanifest"/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" href="/favicon-16x16.png" sizes="16x16" type="image/png"/><link rel="icon" href="/favicon-32x32.png" sizes="32x32" type="image/png"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><script>(function(){try{var t=localStorage.getItem('ck-theme');var theme=(t==='light')?'light':'dark';document.documentElement.dataset.theme=theme;}catch(e){document.documentElement.dataset.theme='dark';}})();</script><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased"><div hidden=""><!--$--><!--/$--></div><div class="flex h-dvh w-dvw overflow-hidden"><aside class="flex shrink-0 flex-col border-r border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] backdrop-blur-[var(--ck-glass-blur)] w-72"><div class="flex h-14 items-center justify-between gap-2 border-b border-[color:var(--ck-border-subtle)] px-3"><a class="text-sm font-semibold tracking-tight" title="Home" href="/">Claw Kitchen</a><button class="rounded-[var(--ck-radius-sm)] px-2 py-1 text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5 hover:text-[color:var(--ck-text-primary)]" title="Collapse">«</button></div><div class="border-b border-[color:var(--ck-border-subtle)] p-2"><div class="flex flex-col gap-1"><div class="px-2 pt-1 text-xs font-semibold uppercase tracking-wide text-[color:var(--ck-text-tertiary)]">Team</div><select class="w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]"><option value="" selected="">All teams</option></select></div></div><nav class="min-h-0 flex-1 overflow-auto p-2"><div class="mt-2 px-2 pb-2 pt-2"></div><a title="Agents" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 11l9-8 9 8"></path><path d="M5 10v10h14V10"></path></svg></span></span><span>Agents</span></a><a title="Recipes" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/recipes"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M6 4h12v16H6z"></path><path d="M9 8h6"></path><path d="M9 12h6"></path></svg></span></span><span>Recipes</span></a><a title="Tickets" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/tickets"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 7h16v4a2 2 0 0 1 0 4v4H4v-4a2 2 0 0 0 0-4z"></path></svg></span></span><span>Tickets</span></a><a title="Channels" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/channels"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 6h16"></path><path d="M4 12h16"></path><path d="M4 18h16"></path><path d="M7 9h0"></path></svg></span></span><span>Channels</span></a><a title="Goals" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/goals"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5l3 3"></path></svg></span></span><span>Goals</span></a><a title="Cron jobs" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/cron-jobs"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"></circle><path d="M12 7v5"></path></svg></span></span><span>Cron jobs</span></a><a title="Runs" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/runs"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19h16"></path><path d="M6 16l4-4 3 3 5-7"></path><circle cx="10" cy="12" r="1"></circle><circle cx="13" cy="15" r="1"></circle><circle cx="18" cy="8" r="1"></circle></svg></span></span><span>Runs</span></a><a title="Settings" class="flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)] gap-4 px-4 py-3" href="/settings"><span aria-hidden="true"><span class="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]" aria-hidden="true"><svg viewBox="0 0 24 24" class="h-6 w-6" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 15.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Z"></path><path d="M19.4 15a7.9 7.9 0 0 0 .1-1l2-1.5-2-3.5-2.4.5a7.8 7.8 0 0 0-1.7-1L13.5 3h-4L8.6 6.5a7.8 7.8 0 0 0-1.7 1L4.5 7l-2 3.5 2 1.5a7.9 7.9 0 0 0 .1 1l-2 1.5 2 3.5 2.4-.5a7.8 7.8 0 0 0 1.7 1L10.5 21h4l.9-3.5a7.8 7.8 0 0 0 1.7-1l2.4.5 2-3.5-2-1.5Z"></path></svg></span></span><span>Settings</span></a></nav><div class="flex items-center justify-between gap-2 border-t border-[color:var(--ck-border-subtle)] p-2"><a href="https://github.com/JIGGAI/ClawRecipes/tree/main/docs" target="_blank" rel="noreferrer" class="rounded-[var(--ck-radius-sm)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5 hover:text-[color:var(--ck-text-primary)]" title="Docs">Docs</a><button type="button" class="grid h-9 w-9 place-items-center rounded-full border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:var(--ck-bg-glass-strong)]" aria-label="Switch to light mode" title="Switch to light mode"><span class="sr-only">Switch to light mode</span><svg class="h-4.5 w-4.5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M21 14.2A7.8 7.8 0 0 1 9.8 3a7 7 0 1 0 11.2 11.2Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"></path></svg></button></div></aside><div class="min-w-0 flex-1"><main class="h-full overflow-auto p-4 md:p-6"><div class="mx-auto max-w-2xl px-6 py-12"><h1 class="text-xl font-semibold">Page not found</h1><p class="mt-2 text-sm text-[color:var(--ck-text-secondary)]">The page you requested does not exist.</p></div><!--$--><!--/$--></main></div></div><div aria-live="assertive" class="pointer-events-none fixed inset-0 z-[100] flex items-end px-4 py-6 sm:p-6"><div class="flex w-full flex-col items-start space-y-4"></div></div><script src="/_next/static/chunks/e03137fd069b1514.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[49830,[\"/_next/static/chunks/d7541a171116ec9c.js\"],\"AppShell\"]\n3:I[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n4:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n5:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"OutletBoundary\"]\n6:\"$Sreact.suspense\"\n8:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"ViewportBoundary\"]\na:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"MetadataBoundary\"]\nc:I[63491,[\"/_next/static/chunks/d6e1b7307a9274ce.js\"],\"default\"]\n:HL[\"/_next/static/chunks/57ad5290f7e92ffd.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"jy6WTfJCuzMwTBF_4KUm6\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/57ad5290f7e92ffd.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d7541a171116ec9c.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var t=localStorage.getItem('ck-theme');var theme=(t==='light')?'light':'dark';document.documentElement.dataset.theme=theme;}catch(e){document.documentElement.dataset.theme='dark';}})();\"}}]}],[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-2xl px-6 py-12\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-xl font-semibold\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\",\"children\":\"The page you requested does not exist.\"}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-2xl px-6 py-12\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-xl font-semibold\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\",\"children\":\"The page you requested does not exist.\"}]]}],null,[\"$\",\"$L5\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@7\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$6\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"d:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"IconMark\"]\n7:null\nb:[[\"$\",\"title\",\"0\",{\"children\":\"ClawKitchen (0.3.30-beta)\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Local-first UI for authoring ClawRecipes recipes and scaffolding agents/teams.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"5\",{\"rel\":\"icon\",\"href\":\"/favicon-16x16.png\",\"sizes\":\"16x16\",\"type\":\"image/png\"}],[\"$\",\"link\",\"6\",{\"rel\":\"icon\",\"href\":\"/favicon-32x32.png\",\"sizes\":\"32x32\",\"type\":\"image/png\"}],[\"$\",\"link\",\"7\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\"}],[\"$\",\"$Ld\",\"8\",{}]]\n"])</script></body></html>
|