@jiggai/kitchen 0.5.12 → 0.5.13

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.
Files changed (454) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/app/_global-error.html +2 -2
  5. package/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +3 -3
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/agents/[id]/route.js +1 -1
  22. package/.next/server/app/api/agents/[id]/route.js.nft.json +1 -1
  23. package/.next/server/app/api/agents/add/route.js +1 -1
  24. package/.next/server/app/api/agents/add/route.js.nft.json +1 -1
  25. package/.next/server/app/api/agents/file/route.js +2 -1
  26. package/.next/server/app/api/agents/file/route.js.nft.json +1 -1
  27. package/.next/server/app/api/agents/files/route.js +2 -1
  28. package/.next/server/app/api/agents/files/route.js.nft.json +1 -1
  29. package/.next/server/app/api/agents/route.js +1 -1
  30. package/.next/server/app/api/agents/route.js.nft.json +1 -1
  31. package/.next/server/app/api/agents/skills/install/route.js +2 -1
  32. package/.next/server/app/api/agents/skills/install/route.js.nft.json +1 -1
  33. package/.next/server/app/api/agents/skills/route.js +2 -1
  34. package/.next/server/app/api/agents/skills/route.js.nft.json +1 -1
  35. package/.next/server/app/api/agents/update/route.js +1 -1
  36. package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
  37. package/.next/server/app/api/channels/bindings/route.js +1 -1
  38. package/.next/server/app/api/channels/bindings/route.js.nft.json +1 -1
  39. package/.next/server/app/api/cron/add/route.js +1 -1
  40. package/.next/server/app/api/cron/add/route.js.nft.json +1 -1
  41. package/.next/server/app/api/cron/bulk/route.js +1 -1
  42. package/.next/server/app/api/cron/bulk/route.js.nft.json +1 -1
  43. package/.next/server/app/api/cron/delete/route.js +1 -1
  44. package/.next/server/app/api/cron/delete/route.js.nft.json +1 -1
  45. package/.next/server/app/api/cron/edit/route.js +1 -1
  46. package/.next/server/app/api/cron/edit/route.js.nft.json +1 -1
  47. package/.next/server/app/api/cron/job/route.js +1 -1
  48. package/.next/server/app/api/cron/job/route.js.nft.json +1 -1
  49. package/.next/server/app/api/cron/jobs/route.js +1 -1
  50. package/.next/server/app/api/cron/jobs/route.js.nft.json +1 -1
  51. package/.next/server/app/api/cron/recipe-installed/route.js +1 -1
  52. package/.next/server/app/api/cron/recipe-installed/route.js.nft.json +1 -1
  53. package/.next/server/app/api/cron/worker/route.js +1 -1
  54. package/.next/server/app/api/cron/worker/route.js.nft.json +1 -1
  55. package/.next/server/app/api/goals/[id]/promote/route.js +1 -1
  56. package/.next/server/app/api/goals/[id]/promote/route.js.nft.json +1 -1
  57. package/.next/server/app/api/goals/[id]/route.js +1 -1
  58. package/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  59. package/.next/server/app/api/goals/route.js +1 -1
  60. package/.next/server/app/api/goals/route.js.nft.json +1 -1
  61. package/.next/server/app/api/ids/check/route.js +1 -1
  62. package/.next/server/app/api/ids/check/route.js.nft.json +1 -1
  63. package/.next/server/app/api/manifest/route.js +1 -1
  64. package/.next/server/app/api/manifest/route.js.nft.json +1 -1
  65. package/.next/server/app/api/plugins/[pluginId]/[...path]/route.js +1 -1
  66. package/.next/server/app/api/plugins/[pluginId]/[...path]/route.js.nft.json +1 -1
  67. package/.next/server/app/api/plugins/[pluginId]/tabs/[tabId]/route.js +1 -1
  68. package/.next/server/app/api/plugins/[pluginId]/tabs/[tabId]/route.js.nft.json +1 -1
  69. package/.next/server/app/api/plugins/route.js +1 -1
  70. package/.next/server/app/api/plugins/route.js.nft.json +1 -1
  71. package/.next/server/app/api/plugins/test/route.js.nft.json +1 -1
  72. package/.next/server/app/api/recipes/[id]/route.js +1 -1
  73. package/.next/server/app/api/recipes/[id]/route.js.nft.json +1 -1
  74. package/.next/server/app/api/recipes/clone/route.js +1 -1
  75. package/.next/server/app/api/recipes/clone/route.js.nft.json +1 -1
  76. package/.next/server/app/api/recipes/custom-team/route.js +1 -1
  77. package/.next/server/app/api/recipes/custom-team/route.js.nft.json +1 -1
  78. package/.next/server/app/api/recipes/delete/route.js +1 -1
  79. package/.next/server/app/api/recipes/delete/route.js.nft.json +1 -1
  80. package/.next/server/app/api/recipes/local-agent-catalog/route.js +1 -1
  81. package/.next/server/app/api/recipes/local-agent-catalog/route.js.nft.json +1 -1
  82. package/.next/server/app/api/recipes/route.js +1 -1
  83. package/.next/server/app/api/recipes/route.js.nft.json +1 -1
  84. package/.next/server/app/api/recipes/team-agents/route.js +1 -1
  85. package/.next/server/app/api/recipes/team-agents/route.js.nft.json +1 -1
  86. package/.next/server/app/api/scaffold/route.js +1 -1
  87. package/.next/server/app/api/scaffold/route.js.nft.json +1 -1
  88. package/.next/server/app/api/settings/cron-installation/route.js +1 -1
  89. package/.next/server/app/api/settings/cron-installation/route.js.nft.json +1 -1
  90. package/.next/server/app/api/settings/model-options/route.js +1 -1
  91. package/.next/server/app/api/settings/model-options/route.js.nft.json +1 -1
  92. package/.next/server/app/api/skills/available/route.js +1 -1
  93. package/.next/server/app/api/skills/available/route.js.nft.json +1 -1
  94. package/.next/server/app/api/swarms/start/route.js +1 -1
  95. package/.next/server/app/api/swarms/start/route.js.nft.json +1 -1
  96. package/.next/server/app/api/swarms/status/route.js +1 -1
  97. package/.next/server/app/api/swarms/status/route.js.nft.json +1 -1
  98. package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js +1 -1
  99. package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js.nft.json +1 -1
  100. package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js +1 -1
  101. package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js.nft.json +1 -1
  102. package/.next/server/app/api/teams/[teamId]/tickets/comment/route.js +1 -1
  103. package/.next/server/app/api/teams/[teamId]/tickets/comment/route.js.nft.json +1 -1
  104. package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js +1 -1
  105. package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js.nft.json +1 -1
  106. package/.next/server/app/api/teams/[teamId]/tickets/move/route.js +1 -1
  107. package/.next/server/app/api/teams/[teamId]/tickets/move/route.js.nft.json +1 -1
  108. package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js +1 -1
  109. package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js.nft.json +1 -1
  110. package/.next/server/app/api/teams/file/route.js +2 -1
  111. package/.next/server/app/api/teams/file/route.js.nft.json +1 -1
  112. package/.next/server/app/api/teams/files/route.js +2 -1
  113. package/.next/server/app/api/teams/files/route.js.nft.json +1 -1
  114. package/.next/server/app/api/teams/list/route.js +1 -1
  115. package/.next/server/app/api/teams/list/route.js.nft.json +1 -1
  116. package/.next/server/app/api/teams/memory/route.js +1 -1
  117. package/.next/server/app/api/teams/memory/route.js.nft.json +1 -1
  118. package/.next/server/app/api/teams/meta/route.js +2 -1
  119. package/.next/server/app/api/teams/meta/route.js.nft.json +1 -1
  120. package/.next/server/app/api/teams/orchestrator/install/route.js +1 -1
  121. package/.next/server/app/api/teams/orchestrator/install/route.js.nft.json +1 -1
  122. package/.next/server/app/api/teams/orchestrator/route.js +1 -1
  123. package/.next/server/app/api/teams/orchestrator/route.js.nft.json +1 -1
  124. package/.next/server/app/api/teams/plugins/route.js +3 -2
  125. package/.next/server/app/api/teams/plugins/route.js.nft.json +1 -1
  126. package/.next/server/app/api/teams/remove-team/route.js +1 -1
  127. package/.next/server/app/api/teams/remove-team/route.js.nft.json +1 -1
  128. package/.next/server/app/api/teams/skills/install/route.js +2 -1
  129. package/.next/server/app/api/teams/skills/install/route.js.nft.json +1 -1
  130. package/.next/server/app/api/teams/skills/route.js +2 -1
  131. package/.next/server/app/api/teams/skills/route.js.nft.json +1 -1
  132. package/.next/server/app/api/teams/workflow-deliverables/file/route.js +1 -1
  133. package/.next/server/app/api/teams/workflow-deliverables/file/route.js.nft.json +1 -1
  134. package/.next/server/app/api/teams/workflow-deliverables/route.js +1 -1
  135. package/.next/server/app/api/teams/workflow-deliverables/route.js.nft.json +1 -1
  136. package/.next/server/app/api/teams/workflow-runs/route.js +3 -2
  137. package/.next/server/app/api/teams/workflow-runs/route.js.nft.json +1 -1
  138. package/.next/server/app/api/teams/workflow-templates/route.js +2 -1
  139. package/.next/server/app/api/teams/workflow-templates/route.js.nft.json +1 -1
  140. package/.next/server/app/api/teams/workflow-triggers/route.js +1 -1
  141. package/.next/server/app/api/teams/workflow-triggers/route.js.nft.json +1 -1
  142. package/.next/server/app/api/teams/workflows/route.js +2 -1
  143. package/.next/server/app/api/teams/workflows/route.js.nft.json +1 -1
  144. package/.next/server/app/api/tickets/assign/route.js +1 -1
  145. package/.next/server/app/api/tickets/assign/route.js.nft.json +1 -1
  146. package/.next/server/app/api/tickets/assignees/route.js +1 -1
  147. package/.next/server/app/api/tickets/assignees/route.js.nft.json +1 -1
  148. package/.next/server/app/api/tickets/move/route.js +1 -1
  149. package/.next/server/app/api/tickets/move/route.js.nft.json +1 -1
  150. package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
  151. package/.next/server/app/channels.html +2 -2
  152. package/.next/server/app/channels.rsc +3 -3
  153. package/.next/server/app/channels.segments/_full.segment.rsc +3 -3
  154. package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
  155. package/.next/server/app/channels.segments/_index.segment.rsc +2 -2
  156. package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
  157. package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
  158. package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
  159. package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
  160. package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  161. package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
  162. package/.next/server/app/goals/new.html +2 -2
  163. package/.next/server/app/goals/new.rsc +3 -3
  164. package/.next/server/app/goals/new.segments/_full.segment.rsc +3 -3
  165. package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
  166. package/.next/server/app/goals/new.segments/_index.segment.rsc +2 -2
  167. package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
  168. package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
  169. package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
  170. package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
  171. package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  172. package/.next/server/app/goals.html +1 -1
  173. package/.next/server/app/goals.rsc +3 -3
  174. package/.next/server/app/goals.segments/_full.segment.rsc +3 -3
  175. package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
  176. package/.next/server/app/goals.segments/_index.segment.rsc +2 -2
  177. package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
  178. package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
  179. package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
  180. package/.next/server/app/page.js +2 -2
  181. package/.next/server/app/page.js.nft.json +1 -1
  182. package/.next/server/app/page_client-reference-manifest.js +1 -1
  183. package/.next/server/app/recipes/[id]/page.js +4 -4
  184. package/.next/server/app/recipes/[id]/page.js.nft.json +1 -1
  185. package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
  186. package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
  187. package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  188. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  189. package/.next/server/app/settings.html +1 -1
  190. package/.next/server/app/settings.rsc +3 -3
  191. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  192. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  193. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  194. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  195. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  196. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  197. package/.next/server/app/teams/[teamId]/deliverables/page.js +1 -1
  198. package/.next/server/app/teams/[teamId]/deliverables/page.js.nft.json +1 -1
  199. package/.next/server/app/teams/[teamId]/deliverables/page_client-reference-manifest.js +1 -1
  200. package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
  201. package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js +2 -2
  202. package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page.js.nft.json +1 -1
  203. package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page_client-reference-manifest.js +1 -1
  204. package/.next/server/app/teams/[teamId]/runs/page_client-reference-manifest.js +1 -1
  205. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js.nft.json +1 -1
  206. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +1 -1
  207. package/.next/server/app/teams/[teamId]/tickets/page.js.nft.json +1 -1
  208. package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +1 -1
  209. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js +3 -3
  210. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.nft.json +1 -1
  211. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
  212. package/.next/server/app/teams/[teamId]/workflows/page.js +2 -2
  213. package/.next/server/app/teams/[teamId]/workflows/page.js.nft.json +1 -1
  214. package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +1 -1
  215. package/.next/server/app/tickets/[ticket]/page.js.nft.json +1 -1
  216. package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/tickets/page.js.nft.json +1 -1
  218. package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
  219. package/.next/server/chunks/{[root-of-the-server]__9e96d37b._.js → [root-of-the-server]__0371f2bc._.js} +2 -2
  220. package/.next/server/chunks/[root-of-the-server]__0964b35a._.js +3 -0
  221. package/.next/server/chunks/[root-of-the-server]__0964b35a._.js.map +1 -0
  222. package/.next/server/chunks/{[root-of-the-server]__e1432bba._.js → [root-of-the-server]__0eef1b4c._.js} +2 -2
  223. package/.next/server/chunks/{[root-of-the-server]__e1432bba._.js.map → [root-of-the-server]__0eef1b4c._.js.map} +1 -1
  224. package/.next/server/chunks/[root-of-the-server]__15008417._.js +3 -0
  225. package/.next/server/chunks/[root-of-the-server]__15008417._.js.map +1 -0
  226. package/.next/server/chunks/{[root-of-the-server]__2dd1afff._.js → [root-of-the-server]__203b56ac._.js} +2 -2
  227. package/.next/server/chunks/{[root-of-the-server]__0f55461f._.js → [root-of-the-server]__29781cc0._.js} +2 -2
  228. package/.next/server/chunks/{[root-of-the-server]__5c5990a6._.js → [root-of-the-server]__2f6a0911._.js} +2 -2
  229. package/.next/server/chunks/{[root-of-the-server]__cc3ea05b._.js → [root-of-the-server]__33717611._.js} +2 -2
  230. package/.next/server/chunks/[root-of-the-server]__337ee852._.js +3 -0
  231. package/.next/server/chunks/[root-of-the-server]__337ee852._.js.map +1 -0
  232. package/.next/server/chunks/{[root-of-the-server]__603cb0fa._.js → [root-of-the-server]__36c430c7._.js} +2 -2
  233. package/.next/server/chunks/{[root-of-the-server]__653d42f0._.js → [root-of-the-server]__3a216511._.js} +2 -2
  234. package/.next/server/chunks/{[root-of-the-server]__5aa1dc93._.js → [root-of-the-server]__50179133._.js} +2 -2
  235. package/.next/server/chunks/{[root-of-the-server]__03c5f2a6._.js → [root-of-the-server]__506ec633._.js} +2 -2
  236. package/.next/server/chunks/[root-of-the-server]__5124e458._.js +3 -0
  237. package/.next/server/chunks/[root-of-the-server]__5124e458._.js.map +1 -0
  238. package/.next/server/chunks/{[root-of-the-server]__89f2190c._.js → [root-of-the-server]__5324f0f2._.js} +2 -2
  239. package/.next/server/chunks/{[root-of-the-server]__89f2190c._.js.map → [root-of-the-server]__5324f0f2._.js.map} +1 -1
  240. package/.next/server/chunks/[root-of-the-server]__540cbc0a._.js +3 -0
  241. package/.next/server/chunks/[root-of-the-server]__540cbc0a._.js.map +1 -0
  242. package/.next/server/chunks/{[root-of-the-server]__8f8e110f._.js → [root-of-the-server]__576c42b0._.js} +2 -2
  243. package/.next/server/chunks/{[root-of-the-server]__9dba20b3._.js → [root-of-the-server]__57ebd007._.js} +2 -2
  244. package/.next/server/chunks/{[root-of-the-server]__1f1e62ac._.js → [root-of-the-server]__632cc20d._.js} +2 -2
  245. package/.next/server/chunks/{[root-of-the-server]__7f014dfd._.js → [root-of-the-server]__6c26557b._.js} +2 -2
  246. package/.next/server/chunks/[root-of-the-server]__7a73dee7._.js +3 -0
  247. package/.next/server/chunks/[root-of-the-server]__7a73dee7._.js.map +1 -0
  248. package/.next/server/chunks/{[root-of-the-server]__69ffdae8._.js → [root-of-the-server]__821b3ca9._.js} +2 -2
  249. package/.next/server/chunks/{[root-of-the-server]__7347e39f._.js → [root-of-the-server]__82959637._.js} +2 -2
  250. package/.next/server/chunks/[root-of-the-server]__84edf1c3._.js +3 -0
  251. package/.next/server/chunks/[root-of-the-server]__84edf1c3._.js.map +1 -0
  252. package/.next/server/chunks/{[root-of-the-server]__e9d9d570._.js → [root-of-the-server]__8d1c69aa._.js} +2 -2
  253. package/.next/server/chunks/{[root-of-the-server]__9853b72d._.js → [root-of-the-server]__97c0689a._.js} +2 -2
  254. package/.next/server/chunks/[root-of-the-server]__9ae5d489._.js +6 -0
  255. package/.next/server/chunks/[root-of-the-server]__9ae5d489._.js.map +1 -0
  256. package/.next/server/chunks/{[root-of-the-server]__aba68368._.js → [root-of-the-server]__a13ba4e9._.js} +2 -2
  257. package/.next/server/chunks/{[root-of-the-server]__ec5b8508._.js → [root-of-the-server]__a1d4195b._.js} +2 -2
  258. package/.next/server/chunks/{[root-of-the-server]__68a21bb1._.js → [root-of-the-server]__a4b416bf._.js} +2 -2
  259. package/.next/server/chunks/{[root-of-the-server]__7194dfe2._.js → [root-of-the-server]__a93f86ca._.js} +2 -2
  260. package/.next/server/chunks/{[root-of-the-server]__7194dfe2._.js.map → [root-of-the-server]__a93f86ca._.js.map} +1 -1
  261. package/.next/server/chunks/{[root-of-the-server]__d302afb4._.js → [root-of-the-server]__ad96320d._.js} +2 -2
  262. package/.next/server/chunks/{[root-of-the-server]__6131b7e2._.js → [root-of-the-server]__b8298074._.js} +2 -2
  263. package/.next/server/chunks/[root-of-the-server]__bbf9672b._.js +3 -0
  264. package/.next/server/chunks/[root-of-the-server]__bbf9672b._.js.map +1 -0
  265. package/.next/server/chunks/{[root-of-the-server]__e9acbabd._.js → [root-of-the-server]__c055bf8b._.js} +2 -2
  266. package/.next/server/chunks/{[root-of-the-server]__e9acbabd._.js.map → [root-of-the-server]__c055bf8b._.js.map} +1 -1
  267. package/.next/server/chunks/{[root-of-the-server]__c50e4bc4._.js → [root-of-the-server]__c2c4ded6._.js} +2 -2
  268. package/.next/server/chunks/[root-of-the-server]__c36db8bb._.js +3 -0
  269. package/.next/server/chunks/[root-of-the-server]__c36db8bb._.js.map +1 -0
  270. package/.next/server/chunks/{[root-of-the-server]__654b0c85._.js → [root-of-the-server]__c5fb588b._.js} +2 -2
  271. package/.next/server/chunks/{[root-of-the-server]__1d123784._.js → [root-of-the-server]__c6a55b2e._.js} +2 -2
  272. package/.next/server/chunks/[root-of-the-server]__c77b0b81._.js +3 -0
  273. package/.next/server/chunks/[root-of-the-server]__c77b0b81._.js.map +1 -0
  274. package/.next/server/chunks/{[root-of-the-server]__bc094b8f._.js → [root-of-the-server]__cd0f78cd._.js} +2 -2
  275. package/.next/server/chunks/[root-of-the-server]__cd49b1bd._.js +3 -0
  276. package/.next/server/chunks/[root-of-the-server]__cd49b1bd._.js.map +1 -0
  277. package/.next/server/chunks/{[root-of-the-server]__20b1f42d._.js → [root-of-the-server]__cdeb32fb._.js} +2 -2
  278. package/.next/server/chunks/[root-of-the-server]__d8e2be0a._.js +3 -0
  279. package/.next/server/chunks/[root-of-the-server]__d8e2be0a._.js.map +1 -0
  280. package/.next/server/chunks/{[root-of-the-server]__1480ffda._.js → [root-of-the-server]__d9256812._.js} +2 -2
  281. package/.next/server/chunks/{[root-of-the-server]__636919a0._.js → [root-of-the-server]__df1ff3d3._.js} +2 -2
  282. package/.next/server/chunks/[root-of-the-server]__e0960142._.js +3 -0
  283. package/.next/server/chunks/[root-of-the-server]__e0960142._.js.map +1 -0
  284. package/.next/server/chunks/{[root-of-the-server]__68b03663._.js → [root-of-the-server]__e727e957._.js} +2 -2
  285. package/.next/server/chunks/{[root-of-the-server]__937b40e2._.js → [root-of-the-server]__f3099f80._.js} +2 -2
  286. package/.next/server/chunks/[root-of-the-server]__f8abf92d._.js +3 -0
  287. package/.next/server/chunks/[root-of-the-server]__f8abf92d._.js.map +1 -0
  288. package/.next/server/chunks/{[root-of-the-server]__dbe8d4c9._.js → [root-of-the-server]__fa7664de._.js} +2 -2
  289. package/.next/server/chunks/[root-of-the-server]__fe16f026._.js +3 -0
  290. package/.next/server/chunks/[root-of-the-server]__fe16f026._.js.map +1 -0
  291. package/.next/server/chunks/_6189bbca._.js +3 -0
  292. package/.next/server/chunks/_6189bbca._.js.map +1 -0
  293. package/.next/server/chunks/_7f3f54b0._.js +3 -0
  294. package/.next/server/chunks/_7f3f54b0._.js.map +1 -0
  295. package/.next/server/chunks/_8e1e2c26._.js +3 -0
  296. package/.next/server/chunks/_8e1e2c26._.js.map +1 -0
  297. package/.next/server/chunks/_bdadf32a._.js +3 -0
  298. package/.next/server/chunks/_bdadf32a._.js.map +1 -0
  299. package/.next/server/chunks/_e90b77d5._.js +3 -0
  300. package/.next/server/chunks/_e90b77d5._.js.map +1 -0
  301. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1ede7019.js +3 -0
  302. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1ede7019.js.map +1 -0
  303. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_25b3f552.js +3 -0
  304. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_25b3f552.js.map +1 -0
  305. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_649a4f9e.js +3 -0
  306. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_649a4f9e.js.map +1 -0
  307. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_77c0b121.js +3 -0
  308. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_77c0b121.js.map +1 -0
  309. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_c49da317.js +3 -0
  310. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_c49da317.js.map +1 -0
  311. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_cb6ddb24.js +2 -2
  312. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_cb6ddb24.js.map +1 -1
  313. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fd57b1e5.js +3 -0
  314. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_fd57b1e5.js.map +1 -0
  315. package/.next/server/chunks/src_lib_1edcc447._.js +3 -0
  316. package/.next/server/chunks/src_lib_1edcc447._.js.map +1 -0
  317. package/.next/server/chunks/ssr/[root-of-the-server]__00365d2a._.js +3 -0
  318. package/.next/server/chunks/ssr/{[root-of-the-server]__c97fe9e9._.js.map → [root-of-the-server]__00365d2a._.js.map} +1 -1
  319. package/.next/server/chunks/ssr/[root-of-the-server]__03399d11._.js +3 -0
  320. package/.next/server/chunks/ssr/[root-of-the-server]__03399d11._.js.map +1 -0
  321. package/.next/server/chunks/ssr/[root-of-the-server]__076b2077._.js +3 -0
  322. package/.next/server/chunks/ssr/[root-of-the-server]__076b2077._.js.map +1 -0
  323. package/.next/server/chunks/ssr/[root-of-the-server]__195421b7._.js +2 -2
  324. package/.next/server/chunks/ssr/[root-of-the-server]__195421b7._.js.map +1 -1
  325. package/.next/server/chunks/ssr/[root-of-the-server]__2a657095._.js +1 -1
  326. package/.next/server/chunks/ssr/[root-of-the-server]__2a657095._.js.map +1 -1
  327. package/.next/server/chunks/ssr/[root-of-the-server]__2b009660._.js +3 -0
  328. package/.next/server/chunks/ssr/{[root-of-the-server]__52cb8e0e._.js.map → [root-of-the-server]__2b009660._.js.map} +1 -1
  329. package/.next/server/chunks/ssr/[root-of-the-server]__388bae11._.js +1 -1
  330. package/.next/server/chunks/ssr/[root-of-the-server]__388bae11._.js.map +1 -1
  331. package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js +1 -1
  332. package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js.map +1 -1
  333. package/.next/server/chunks/ssr/[root-of-the-server]__5180e2c4._.js +3 -0
  334. package/.next/server/chunks/ssr/{[root-of-the-server]__e9faef37._.js.map → [root-of-the-server]__5180e2c4._.js.map} +1 -1
  335. package/.next/server/chunks/ssr/[root-of-the-server]__997a440f._.js +3 -0
  336. package/.next/server/chunks/ssr/[root-of-the-server]__997a440f._.js.map +1 -0
  337. package/.next/server/chunks/ssr/[root-of-the-server]__df23886e._.js +1 -1
  338. package/.next/server/chunks/ssr/[root-of-the-server]__df23886e._.js.map +1 -1
  339. package/.next/server/chunks/ssr/_018dfe6b._.js.map +1 -1
  340. package/.next/server/chunks/ssr/src_app_cron-jobs_cron-jobs-client_tsx_ec91a73d._.js +1 -1
  341. package/.next/server/chunks/ssr/src_app_cron-jobs_cron-jobs-client_tsx_ec91a73d._.js.map +1 -1
  342. package/.next/server/pages/404.html +1 -1
  343. package/.next/server/pages/500.html +2 -2
  344. package/.next/server/server-reference-manifest.js +1 -1
  345. package/.next/server/server-reference-manifest.json +1 -1
  346. package/.next/static/chunks/{f51763a2aea0a4b6.js → ca97f33dce4a7720.js} +1 -1
  347. package/.next/static/chunks/cc172eec0c47f311.css +3 -0
  348. package/.next/static/chunks/d4b7ed231a81c514.js +10 -0
  349. package/openclaw/index.ts +6 -28
  350. package/openclaw/list-installed-plugins.ts +49 -0
  351. package/openclaw.plugin.json +1 -1
  352. package/package.json +1 -1
  353. package/.next/server/chunks/[root-of-the-server]__0625e28f._.js +0 -3
  354. package/.next/server/chunks/[root-of-the-server]__0625e28f._.js.map +0 -1
  355. package/.next/server/chunks/[root-of-the-server]__1331482c._.js +0 -3
  356. package/.next/server/chunks/[root-of-the-server]__1331482c._.js.map +0 -1
  357. package/.next/server/chunks/[root-of-the-server]__224ffe98._.js +0 -3
  358. package/.next/server/chunks/[root-of-the-server]__224ffe98._.js.map +0 -1
  359. package/.next/server/chunks/[root-of-the-server]__24d25a8c._.js +0 -3
  360. package/.next/server/chunks/[root-of-the-server]__24d25a8c._.js.map +0 -1
  361. package/.next/server/chunks/[root-of-the-server]__2b84b8e2._.js +0 -3
  362. package/.next/server/chunks/[root-of-the-server]__2b84b8e2._.js.map +0 -1
  363. package/.next/server/chunks/[root-of-the-server]__309a4318._.js +0 -3
  364. package/.next/server/chunks/[root-of-the-server]__309a4318._.js.map +0 -1
  365. package/.next/server/chunks/[root-of-the-server]__336dafb8._.js +0 -3
  366. package/.next/server/chunks/[root-of-the-server]__336dafb8._.js.map +0 -1
  367. package/.next/server/chunks/[root-of-the-server]__3d9c4025._.js +0 -3
  368. package/.next/server/chunks/[root-of-the-server]__3d9c4025._.js.map +0 -1
  369. package/.next/server/chunks/[root-of-the-server]__507af82b._.js +0 -3
  370. package/.next/server/chunks/[root-of-the-server]__507af82b._.js.map +0 -1
  371. package/.next/server/chunks/[root-of-the-server]__83753ef0._.js +0 -3
  372. package/.next/server/chunks/[root-of-the-server]__83753ef0._.js.map +0 -1
  373. package/.next/server/chunks/[root-of-the-server]__8799df50._.js +0 -3
  374. package/.next/server/chunks/[root-of-the-server]__8799df50._.js.map +0 -1
  375. package/.next/server/chunks/[root-of-the-server]__8981f980._.js +0 -3
  376. package/.next/server/chunks/[root-of-the-server]__8981f980._.js.map +0 -1
  377. package/.next/server/chunks/[root-of-the-server]__92517eeb._.js +0 -3
  378. package/.next/server/chunks/[root-of-the-server]__92517eeb._.js.map +0 -1
  379. package/.next/server/chunks/[root-of-the-server]__a90f7cdc._.js +0 -3
  380. package/.next/server/chunks/[root-of-the-server]__a90f7cdc._.js.map +0 -1
  381. package/.next/server/chunks/[root-of-the-server]__afde9f7c._.js +0 -3
  382. package/.next/server/chunks/[root-of-the-server]__afde9f7c._.js.map +0 -1
  383. package/.next/server/chunks/[root-of-the-server]__b986660c._.js +0 -3
  384. package/.next/server/chunks/[root-of-the-server]__b986660c._.js.map +0 -1
  385. package/.next/server/chunks/[root-of-the-server]__bbed0e46._.js +0 -3
  386. package/.next/server/chunks/[root-of-the-server]__bbed0e46._.js.map +0 -1
  387. package/.next/server/chunks/[root-of-the-server]__bcf10654._.js +0 -3
  388. package/.next/server/chunks/[root-of-the-server]__bcf10654._.js.map +0 -1
  389. package/.next/server/chunks/[root-of-the-server]__bdb8b806._.js +0 -3
  390. package/.next/server/chunks/[root-of-the-server]__bdb8b806._.js.map +0 -1
  391. package/.next/server/chunks/[root-of-the-server]__d1b157f2._.js +0 -3
  392. package/.next/server/chunks/[root-of-the-server]__d1b157f2._.js.map +0 -1
  393. package/.next/server/chunks/[root-of-the-server]__e17f35da._.js +0 -3
  394. package/.next/server/chunks/[root-of-the-server]__e17f35da._.js.map +0 -1
  395. package/.next/server/chunks/[root-of-the-server]__e3431817._.js +0 -3
  396. package/.next/server/chunks/[root-of-the-server]__e3431817._.js.map +0 -1
  397. package/.next/server/chunks/[root-of-the-server]__e6ecca08._.js +0 -3
  398. package/.next/server/chunks/[root-of-the-server]__e6ecca08._.js.map +0 -1
  399. package/.next/server/chunks/[root-of-the-server]__e8d765bb._.js +0 -3
  400. package/.next/server/chunks/[root-of-the-server]__e8d765bb._.js.map +0 -1
  401. package/.next/server/chunks/[root-of-the-server]__ed3ced73._.js +0 -3
  402. package/.next/server/chunks/[root-of-the-server]__ed3ced73._.js.map +0 -1
  403. package/.next/server/chunks/[root-of-the-server]__fc511c8f._.js +0 -3
  404. package/.next/server/chunks/[root-of-the-server]__fc511c8f._.js.map +0 -1
  405. package/.next/server/chunks/[root-of-the-server]__fcde644b._.js +0 -3
  406. package/.next/server/chunks/[root-of-the-server]__fcde644b._.js.map +0 -1
  407. package/.next/server/chunks/[root-of-the-server]__fe6502cf._.js +0 -6
  408. package/.next/server/chunks/[root-of-the-server]__fe6502cf._.js.map +0 -1
  409. package/.next/server/chunks/ssr/[root-of-the-server]__0a8db855._.js +0 -3
  410. package/.next/server/chunks/ssr/[root-of-the-server]__0a8db855._.js.map +0 -1
  411. package/.next/server/chunks/ssr/[root-of-the-server]__18154c9e._.js +0 -3
  412. package/.next/server/chunks/ssr/[root-of-the-server]__18154c9e._.js.map +0 -1
  413. package/.next/server/chunks/ssr/[root-of-the-server]__52cb8e0e._.js +0 -3
  414. package/.next/server/chunks/ssr/[root-of-the-server]__7c14561e._.js +0 -3
  415. package/.next/server/chunks/ssr/[root-of-the-server]__7c14561e._.js.map +0 -1
  416. package/.next/server/chunks/ssr/[root-of-the-server]__c97fe9e9._.js +0 -3
  417. package/.next/server/chunks/ssr/[root-of-the-server]__e9faef37._.js +0 -3
  418. package/.next/static/chunks/7e5bbe9b394728be.js +0 -10
  419. package/.next/static/chunks/a683f58aaf4f41e9.css +0 -3
  420. /package/.next/server/chunks/{[root-of-the-server]__9e96d37b._.js.map → [root-of-the-server]__0371f2bc._.js.map} +0 -0
  421. /package/.next/server/chunks/{[root-of-the-server]__2dd1afff._.js.map → [root-of-the-server]__203b56ac._.js.map} +0 -0
  422. /package/.next/server/chunks/{[root-of-the-server]__0f55461f._.js.map → [root-of-the-server]__29781cc0._.js.map} +0 -0
  423. /package/.next/server/chunks/{[root-of-the-server]__5c5990a6._.js.map → [root-of-the-server]__2f6a0911._.js.map} +0 -0
  424. /package/.next/server/chunks/{[root-of-the-server]__cc3ea05b._.js.map → [root-of-the-server]__33717611._.js.map} +0 -0
  425. /package/.next/server/chunks/{[root-of-the-server]__603cb0fa._.js.map → [root-of-the-server]__36c430c7._.js.map} +0 -0
  426. /package/.next/server/chunks/{[root-of-the-server]__653d42f0._.js.map → [root-of-the-server]__3a216511._.js.map} +0 -0
  427. /package/.next/server/chunks/{[root-of-the-server]__5aa1dc93._.js.map → [root-of-the-server]__50179133._.js.map} +0 -0
  428. /package/.next/server/chunks/{[root-of-the-server]__03c5f2a6._.js.map → [root-of-the-server]__506ec633._.js.map} +0 -0
  429. /package/.next/server/chunks/{[root-of-the-server]__8f8e110f._.js.map → [root-of-the-server]__576c42b0._.js.map} +0 -0
  430. /package/.next/server/chunks/{[root-of-the-server]__9dba20b3._.js.map → [root-of-the-server]__57ebd007._.js.map} +0 -0
  431. /package/.next/server/chunks/{[root-of-the-server]__1f1e62ac._.js.map → [root-of-the-server]__632cc20d._.js.map} +0 -0
  432. /package/.next/server/chunks/{[root-of-the-server]__7f014dfd._.js.map → [root-of-the-server]__6c26557b._.js.map} +0 -0
  433. /package/.next/server/chunks/{[root-of-the-server]__69ffdae8._.js.map → [root-of-the-server]__821b3ca9._.js.map} +0 -0
  434. /package/.next/server/chunks/{[root-of-the-server]__7347e39f._.js.map → [root-of-the-server]__82959637._.js.map} +0 -0
  435. /package/.next/server/chunks/{[root-of-the-server]__e9d9d570._.js.map → [root-of-the-server]__8d1c69aa._.js.map} +0 -0
  436. /package/.next/server/chunks/{[root-of-the-server]__9853b72d._.js.map → [root-of-the-server]__97c0689a._.js.map} +0 -0
  437. /package/.next/server/chunks/{[root-of-the-server]__aba68368._.js.map → [root-of-the-server]__a13ba4e9._.js.map} +0 -0
  438. /package/.next/server/chunks/{[root-of-the-server]__ec5b8508._.js.map → [root-of-the-server]__a1d4195b._.js.map} +0 -0
  439. /package/.next/server/chunks/{[root-of-the-server]__68a21bb1._.js.map → [root-of-the-server]__a4b416bf._.js.map} +0 -0
  440. /package/.next/server/chunks/{[root-of-the-server]__d302afb4._.js.map → [root-of-the-server]__ad96320d._.js.map} +0 -0
  441. /package/.next/server/chunks/{[root-of-the-server]__6131b7e2._.js.map → [root-of-the-server]__b8298074._.js.map} +0 -0
  442. /package/.next/server/chunks/{[root-of-the-server]__c50e4bc4._.js.map → [root-of-the-server]__c2c4ded6._.js.map} +0 -0
  443. /package/.next/server/chunks/{[root-of-the-server]__654b0c85._.js.map → [root-of-the-server]__c5fb588b._.js.map} +0 -0
  444. /package/.next/server/chunks/{[root-of-the-server]__1d123784._.js.map → [root-of-the-server]__c6a55b2e._.js.map} +0 -0
  445. /package/.next/server/chunks/{[root-of-the-server]__bc094b8f._.js.map → [root-of-the-server]__cd0f78cd._.js.map} +0 -0
  446. /package/.next/server/chunks/{[root-of-the-server]__20b1f42d._.js.map → [root-of-the-server]__cdeb32fb._.js.map} +0 -0
  447. /package/.next/server/chunks/{[root-of-the-server]__1480ffda._.js.map → [root-of-the-server]__d9256812._.js.map} +0 -0
  448. /package/.next/server/chunks/{[root-of-the-server]__636919a0._.js.map → [root-of-the-server]__df1ff3d3._.js.map} +0 -0
  449. /package/.next/server/chunks/{[root-of-the-server]__68b03663._.js.map → [root-of-the-server]__e727e957._.js.map} +0 -0
  450. /package/.next/server/chunks/{[root-of-the-server]__937b40e2._.js.map → [root-of-the-server]__f3099f80._.js.map} +0 -0
  451. /package/.next/server/chunks/{[root-of-the-server]__dbe8d4c9._.js.map → [root-of-the-server]__fa7664de._.js.map} +0 -0
  452. /package/.next/static/{p8YaBY0FwA86zQelkOQ-m → IDhQCme1GnI-fdSGoYAJ3}/_buildManifest.js +0 -0
  453. /package/.next/static/{p8YaBY0FwA86zQelkOQ-m → IDhQCme1GnI-fdSGoYAJ3}/_clientMiddlewareManifest.json +0 -0
  454. /package/.next/static/{p8YaBY0FwA86zQelkOQ-m → IDhQCme1GnI-fdSGoYAJ3}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/cron-jobs/cron-jobs-client.tsx","../../../../src/components/EditCronJobModal.tsx","../../../../src/components/CronJobForm.tsx","../../../../src/hooks/useCronJobForm.ts","../../../../src/components/CreateCronJobModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { DeleteCronJobModal } from \"@/components/delete-modals\";\nimport { EditCronJobModal } from \"@/components/EditCronJobModal\";\nimport { CreateCronJobModal } from \"@/components/CreateCronJobModal\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport { useRunSelection } from \"@/hooks/useRunSelection\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\n\ntype CronJob = {\n id: string;\n name?: string;\n enabled?: boolean;\n schedule?: { kind?: string; expr?: string; everyMs?: number; tz?: string };\n state?: { nextRunAtMs?: number };\n agentId?: string;\n sessionTarget?: string;\n sessionKey?: string;\n // Optional enrichment from the API (which team/agent it belongs to)\n scope?: { kind: \"team\" | \"agent\"; id: string; label: string; href: string };\n};\n\nfunction fmtSchedule(s?: CronJob[\"schedule\"]): string {\n if (!s) return \"\";\n if (s.kind === \"cron\" && s.expr) return s.expr;\n if (s.kind === \"every\" && s.everyMs) {\n const mins = Math.round(s.everyMs / 60000);\n return mins >= 60 ? `every ${Math.round(mins / 60)}h` : `every ${mins}m`;\n }\n return s.kind ?? \"\";\n}\n\nfunction isEnabled(j: CronJob): boolean {\n // Some responses put enabled under state.enabled.\n return Boolean(j.enabled ?? (j as { state?: { enabled?: unknown } }).state?.enabled);\n}\n\nexport default function CronJobsClient({ teamId }: { teamId: string | null }) {\n const toast = useToast();\n const teamFilter = (teamId ?? \"\").trim();\n const [loading, setLoading] = useState(false);\n const [jobs, setJobs] = useState<CronJob[]>([]);\n const [msg, setMsg] = useState<string>(\"\");\n const [expandedId, setExpandedId] = useState<string | null>(null);\n const [statusFilter, setStatusFilter] = useState<\"all\" | \"enabled\" | \"disabled\">(\"all\");\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [deleteLabel, setDeleteLabel] = useState<string>(\"\");\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [editOpen, setEditOpen] = useState(false);\n const [editJob, setEditJob] = useState<CronJob | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n\n // Bulk action state\n type BulkAction = \"enable\" | \"disable\" | \"delete\";\n const [bulkModalAction, setBulkModalAction] = useState<BulkAction | null>(null);\n const [bulkConfirmed, setBulkConfirmed] = useState(false);\n type JobStatus = \"pending\" | \"in-progress\" | \"done\" | \"skipped\" | \"error\";\n const [bulkJobStatuses, setBulkJobStatuses] = useState<Map<string, { status: JobStatus; error?: string }>>(new Map());\n const [bulkRunning, setBulkRunning] = useState(false);\n\n const sorted = useMemo(() => {\n return [...jobs].sort((a, b) => {\n const ae = isEnabled(a);\n const be = isEnabled(b);\n if (ae !== be) return ae ? -1 : 1; // enabled first\n return String(a.name ?? \"\").localeCompare(String(b.name ?? \"\"));\n });\n }, [jobs]);\n\n const filtered = useMemo(() => {\n if (statusFilter === \"all\") return sorted;\n const wantEnabled = statusFilter === \"enabled\";\n return sorted.filter((j) => isEnabled(j) === wantEnabled);\n }, [sorted, statusFilter]);\n\n const visibleIds = useMemo(() => filtered.map((j) => j.id), [filtered]);\n const { selected, toggle, allSelected, toggleAll, clear, count } = useRunSelection(visibleIds);\n\n const selectedEnabledCount = useMemo(\n () => filtered.filter((j) => selected.has(j.id) && isEnabled(j)).length,\n [filtered, selected],\n );\n const selectedDisabledCount = useMemo(\n () => filtered.filter((j) => selected.has(j.id) && !isEnabled(j)).length,\n [filtered, selected],\n );\n\n function openBulkModal(action: BulkAction) {\n setBulkConfirmed(false);\n setBulkJobStatuses(new Map());\n setBulkRunning(false);\n setBulkModalAction(action);\n }\n\n function closeBulkModal() {\n if (bulkRunning) return; // don't close while processing\n setBulkModalAction(null);\n setBulkConfirmed(false);\n setBulkJobStatuses(new Map());\n }\n\n /** Return the label shown for a job in the progress list. */\n function jobLabel(id: string): string {\n const j = jobs.find((x) => x.id === id);\n return j?.name ?? id;\n }\n\n /** Which jobs to actually act on (skip already-in-desired-state). */\n function bulkTargetIds(): { actionable: string[]; skipped: string[] } {\n const ids = Array.from(selected);\n if (!bulkModalAction || bulkModalAction === \"delete\") return { actionable: ids, skipped: [] };\n const wantEnabled = bulkModalAction === \"enable\";\n const actionable: string[] = [];\n const skipped: string[] = [];\n for (const id of ids) {\n const j = jobs.find((x) => x.id === id);\n if (j && isEnabled(j) === wantEnabled) skipped.push(id);\n else actionable.push(id);\n }\n return { actionable, skipped };\n }\n\n async function confirmBulkAction() {\n if (!bulkModalAction) return;\n setBulkConfirmed(true);\n setBulkRunning(true);\n\n const { actionable, skipped } = bulkTargetIds();\n\n // Initialize statuses\n const initial = new Map<string, { status: JobStatus; error?: string }>();\n for (const id of actionable) initial.set(id, { status: \"pending\" });\n for (const id of skipped) initial.set(id, { status: \"skipped\" });\n setBulkJobStatuses(new Map(initial));\n\n const actionLabel = bulkModalAction;\n let doneCount = 0;\n let errCount = 0;\n\n for (const id of actionable) {\n // Mark in-progress\n setBulkJobStatuses((prev) => {\n const next = new Map(prev);\n next.set(id, { status: \"in-progress\" });\n return next;\n });\n\n try {\n if (actionLabel === \"delete\") {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id }),\n });\n if (!json.ok) throw new Error(json.error || \"Delete failed\");\n } else {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action: actionLabel }),\n });\n if (!json.ok) throw new Error(json.error || `${actionLabel} failed`);\n }\n doneCount++;\n setBulkJobStatuses((prev) => {\n const next = new Map(prev);\n next.set(id, { status: \"done\" });\n return next;\n });\n } catch (e: unknown) {\n errCount++;\n setBulkJobStatuses((prev) => {\n const next = new Map(prev);\n next.set(id, { status: \"error\", error: errorMessage(e) });\n return next;\n });\n }\n }\n\n setBulkRunning(false);\n\n const verb = actionLabel === \"delete\" ? \"Deleted\" : actionLabel === \"enable\" ? \"Enabled\" : \"Disabled\";\n if (errCount === 0) {\n toast.push({ kind: \"success\", message: `${verb} ${doneCount} cron job${doneCount !== 1 ? \"s\" : \"\"}.` });\n } else {\n toast.push({ kind: \"error\", message: `${verb} ${doneCount}, ${errCount} failed.` });\n }\n clear();\n await refresh();\n }\n\n const liveEditJob = useMemo(() => {\n if (!editJob) return null;\n return jobs.find((job) => job.id === editJob.id) ?? editJob;\n }, [jobs, editJob]);\n\n async function refresh() {\n setLoading(true);\n setMsg(\"\");\n try {\n const url = teamFilter ? `/api/cron/jobs?teamId=${encodeURIComponent(teamFilter)}` : \"/api/cron/jobs\";\n const json = await fetchJson<{ jobs?: CronJob[] }>(url, { cache: \"no-store\" });\n setJobs(json.jobs ?? []);\n if ((json.jobs ?? []).length === 0) {\n setMsg(\"No cron jobs found.\");\n }\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n setJobs([]);\n } finally {\n setLoading(false);\n }\n }\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refresh closes over teamFilter\n }, [teamFilter]);\n\n async function act(id: string, action: \"enable\" | \"disable\" | \"run\") {\n setLoading(true);\n setMsg(\"\");\n try {\n await fetchJson(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action }),\n });\n setMsg(action === \"run\" ? \"Triggered run.\" : \"Updated.\");\n await refresh();\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n } finally {\n setLoading(false);\n }\n }\n\n function openDelete(job: CronJob) {\n setDeleteId(job.id);\n setDeleteLabel(job.name ?? job.id);\n setDeleteError(null);\n setDeleteOpen(true);\n }\n\n function openEdit(job: CronJob) {\n setEditJob(job);\n setEditOpen(true);\n }\n\n async function confirmDelete() {\n setDeleteBusy(true);\n setDeleteError(null);\n try {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n if (!json.ok) throw new Error(json.error || \"Delete failed\");\n toast.push({ kind: \"success\", message: `Removed cron job: ${deleteLabel}` });\n setDeleteOpen(false);\n await refresh();\n } catch (e: unknown) {\n const msg = errorMessage(e);\n setDeleteError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setDeleteBusy(false);\n }\n }\n\n return (\n <>\n <div>\n <div className=\"ck-card p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {filtered.length > 0 && (\n <input\n type=\"checkbox\"\n checked={allSelected && filtered.length > 0}\n onChange={toggleAll}\n className=\"accent-[var(--ck-accent-red)]\"\n aria-label=\"Select all cron jobs\"\n />\n )}\n <div>\n <h2 className=\"text-lg font-semibold\">All Cron Jobs</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n {statusFilter !== \"all\"\n ? `${filtered.length} of ${jobs.length} job${jobs.length !== 1 ? \"s\" : \"\"} (${statusFilter})`\n : `${jobs.length} job${jobs.length !== 1 ? \"s\" : \"\"} total · ${jobs.filter((j) => isEnabled(j)).length} enabled`}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value as \"all\" | \"enabled\" | \"disabled\")}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"all\">All</option>\n <option value=\"enabled\">Enabled</option>\n <option value=\"disabled\">Disabled</option>\n </select>\n <button\n type=\"button\"\n onClick={() => setCreateOpen(true)}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]\"\n >\n Create Job\n </button>\n <button\n type=\"button\"\n onClick={refresh}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Refresh\n </button>\n </div>\n </div>\n </div>\n\n {msg ? (\n <div className=\"mt-4 rounded-lg border border-white/10 bg-white/5 p-3 text-sm\">\n {msg}\n </div>\n ) : null}\n\n <div className=\"mt-6 space-y-3\">\n {filtered.map((j) => (\n <div key={j.id} className=\"ck-card px-4 py-3\">\n <div className=\"flex items-start gap-3\">\n <input\n type=\"checkbox\"\n checked={selected.has(j.id)}\n onChange={() => toggle(j.id)}\n className=\"mt-1.5 shrink-0 accent-[var(--ck-accent-red)]\"\n aria-label={`Select ${j.name ?? j.id}`}\n />\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setExpandedId((cur) => (cur === j.id ? null : j.id))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setExpandedId((cur) => (cur === j.id ? null : j.id));\n }\n }}\n className=\"min-w-0 flex-1 cursor-pointer text-left\"\n >\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium\">{j.name ?? j.id}</div>\n <div className=\"mt-1 flex flex-wrap gap-x-3 text-xs text-[color:var(--ck-text-secondary)]\">\n <span>{fmtSchedule(j.schedule)}</span>\n <span>{isEnabled(j) ? \"✅ enabled\" : \"⏸ disabled\"}</span>\n {j.agentId ? <span>agent: {j.agentId}</span> : null}\n {j.scope ? (\n <span>\n {j.scope.kind}: {\" \"}\n <a\n className=\"underline hover:no-underline\"\n href={j.scope.href}\n onClick={(e) => e.stopPropagation()}\n >\n {j.scope.label}\n </a>\n </span>\n ) : null}\n {j.sessionTarget ? <span>target: {j.sessionTarget}</span> : null}\n {j.state?.nextRunAtMs ? <span>next: {new Date(j.state.nextRunAtMs).toLocaleString()}</span> : null}\n </div>\n </div>\n\n <div className=\"flex gap-2\" onClick={(e) => e.stopPropagation()}>\n <button\n type=\"button\"\n onClick={() => openEdit(j)}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10\"\n >\n Edit\n </button>\n <button\n type=\"button\"\n onClick={() => act(j.id, isEnabled(j) ? \"disable\" : \"enable\")}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10\"\n >\n {isEnabled(j) ? \"Disable\" : \"Enable\"}\n </button>\n <button\n type=\"button\"\n onClick={() => act(j.id, \"run\")}\n disabled={loading}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]\"\n >\n Run now\n </button>\n <button\n type=\"button\"\n title={isEnabled(j) ? \"Disable this job before deleting.\" : \"Delete cron job\"}\n onClick={() => openDelete(j)}\n disabled={loading || isEnabled(j)}\n className=\"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-40\"\n >\n Delete\n </button>\n </div>\n </div>\n </div>\n </div>\n\n {expandedId === j.id ? (\n <pre className=\"mt-3 overflow-x-auto rounded-lg border border-white/10 bg-white/5 p-3 text-xs text-[color:var(--ck-text-primary)]\">\n {JSON.stringify(j, null, 2)}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n </div>\n\n {count > 0 && (\n <div className=\"sticky bottom-4 mt-4 flex items-center justify-between rounded-xl border border-white/10 bg-black/80 backdrop-blur-md px-4 py-3 shadow-lg\">\n <span className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n {count} job{count !== 1 ? \"s\" : \"\"} selected\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={clear}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Clear\n </button>\n {selectedDisabledCount > 0 && (\n <button\n type=\"button\"\n onClick={() => openBulkModal(\"enable\")}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Enable{selectedDisabledCount < count ? ` (${selectedDisabledCount})` : \"\"}\n </button>\n )}\n {selectedEnabledCount > 0 && (\n <button\n type=\"button\"\n onClick={() => openBulkModal(\"disable\")}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Disable{selectedEnabledCount < count ? ` (${selectedEnabledCount})` : \"\"}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => openBulkModal(\"delete\")}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-1.5 text-xs font-medium text-white hover:bg-[var(--ck-accent-red-hover)]\"\n >\n Delete selected\n </button>\n </div>\n </div>\n )}\n\n <ConfirmationModal\n open={bulkModalAction !== null && !bulkConfirmed}\n onClose={closeBulkModal}\n title={\n bulkModalAction === \"delete\" ? \"Delete Cron Jobs\"\n : bulkModalAction === \"enable\" ? \"Enable Cron Jobs\"\n : \"Disable Cron Jobs\"\n }\n confirmLabel={\n bulkModalAction === \"delete\" ? \"Delete\"\n : bulkModalAction === \"enable\" ? \"Enable\"\n : \"Disable\"\n }\n onConfirm={confirmBulkAction}\n confirmButtonClassName={\n bulkModalAction === \"delete\"\n ? undefined\n : \"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n }\n >\n <p className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">\n {bulkModalAction === \"delete\" ? (\n <>\n Are you sure you want to permanently delete{\" \"}\n <strong className=\"text-[color:var(--ck-text-primary)]\">{count} cron job{count !== 1 ? \"s\" : \"\"}</strong>?\n This action cannot be undone.\n </>\n ) : bulkModalAction === \"enable\" ? (\n <>\n Enable{\" \"}\n <strong className=\"text-[color:var(--ck-text-primary)]\">{selectedDisabledCount} cron job{selectedDisabledCount !== 1 ? \"s\" : \"\"}</strong>?\n {selectedEnabledCount > 0 && (\n <span> ({selectedEnabledCount} already enabled will be skipped.)</span>\n )}\n </>\n ) : (\n <>\n Disable{\" \"}\n <strong className=\"text-[color:var(--ck-text-primary)]\">{selectedEnabledCount} cron job{selectedEnabledCount !== 1 ? \"s\" : \"\"}</strong>?\n {selectedDisabledCount > 0 && (\n <span> ({selectedDisabledCount} already disabled will be skipped.)</span>\n )}\n </>\n )}\n </p>\n </ConfirmationModal>\n\n {/* Live progress modal */}\n {bulkModalAction !== null && bulkConfirmed && (\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" aria-hidden=\"true\" />\n <div className=\"fixed inset-0 overflow-y-auto\" role=\"dialog\" aria-modal=\"true\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-5 shadow-[var(--ck-shadow-2)]\">\n <h2 className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">\n {bulkModalAction === \"delete\" ? \"Deleting\" : bulkModalAction === \"enable\" ? \"Enabling\" : \"Disabling\"} Cron Jobs\n </h2>\n <div className=\"mt-4 max-h-80 space-y-1 overflow-y-auto rounded-lg border border-white/10 bg-black/30 p-3 font-mono text-xs\">\n {Array.from(bulkJobStatuses.entries()).map(([id, { status, error }]) => (\n <div key={id} className=\"flex items-center gap-2\">\n <span className=\"shrink-0 w-4 text-center\">\n {status === \"pending\" && <span className=\"text-[color:var(--ck-text-tertiary)]\">·</span>}\n {status === \"in-progress\" && <span className=\"text-yellow-400 animate-pulse\">▸</span>}\n {status === \"done\" && <span className=\"text-green-400\">✓</span>}\n {status === \"skipped\" && <span className=\"text-[color:var(--ck-text-tertiary)]\">–</span>}\n {status === \"error\" && <span className=\"text-red-400\">✗</span>}\n </span>\n <span className={\n status === \"done\" ? \"text-green-400\"\n : status === \"in-progress\" ? \"text-yellow-400\"\n : status === \"error\" ? \"text-red-400\"\n : \"text-[color:var(--ck-text-tertiary)]\"\n }>\n {jobLabel(id)}\n </span>\n <span className=\"ml-auto shrink-0 text-[10px]\">\n {status === \"pending\" && \"\"}\n {status === \"in-progress\" && (\n <span className=\"text-yellow-400\">\n {bulkModalAction === \"delete\" ? \"deleting...\" : bulkModalAction === \"enable\" ? \"enabling...\" : \"disabling...\"}\n </span>\n )}\n {status === \"done\" && (\n <span className=\"text-green-400\">\n {bulkModalAction === \"delete\" ? \"deleted\" : bulkModalAction === \"enable\" ? \"enabled\" : \"disabled\"}\n </span>\n )}\n {status === \"skipped\" && (\n <span className=\"text-[color:var(--ck-text-tertiary)]\">\n already {bulkModalAction === \"enable\" ? \"enabled\" : \"disabled\"}\n </span>\n )}\n {status === \"error\" && (\n <span className=\"text-red-400\" title={error}>{error ?? \"failed\"}</span>\n )}\n </span>\n </div>\n ))}\n </div>\n <div className=\"mt-4 flex items-center justify-end\">\n <button\n type=\"button\"\n disabled={bulkRunning}\n onClick={closeBulkModal}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-40\"\n >\n {bulkRunning ? \"Processing...\" : \"Close\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n <DeleteCronJobModal\n open={deleteOpen}\n jobLabel={deleteLabel}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <EditCronJobModal\n job={liveEditJob}\n open={editOpen}\n onClose={() => setEditOpen(false)}\n onSaved={refresh}\n />\n\n <CreateCronJobModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n onCreated={refresh}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport { CronJobForm } from \"@/components/CronJobForm\";\nimport { useCronJobForm } from \"@/hooks/useCronJobForm\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype CronJob = {\n id: string;\n name?: string;\n description?: string;\n enabled?: boolean;\n schedule?: {\n kind?: string;\n expr?: string;\n everyMs?: number;\n tz?: string;\n };\n delivery?: {\n mode?: string;\n channel?: string;\n to?: string;\n bestEffort?: boolean;\n };\n payload?: {\n kind?: string;\n text?: string;\n message?: string;\n model?: string;\n thinking?: string;\n timeoutSeconds?: number;\n };\n agentId?: string;\n sessionTarget?: string;\n sessionKey?: string;\n};\n\ninterface EditCronJobModalProps {\n job: CronJob | null;\n open: boolean;\n onClose: () => void;\n onSaved: () => void;\n}\n\nexport function EditCronJobModal({ job, open, onClose, onSaved }: EditCronJobModalProps) {\n const {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n buildPayload,\n } = useCronJobForm();\n\n // Populate form when job changes\n useEffect(() => {\n if (job) {\n const everyMs = job.schedule?.everyMs;\n let everyValue = 60;\n let everyUnit: \"s\" | \"m\" | \"h\" | \"d\";\n \n if (everyMs) {\n if (everyMs % 86400000 === 0) {\n everyValue = everyMs / 86400000;\n everyUnit = \"d\";\n } else if (everyMs % 3600000 === 0) {\n everyValue = everyMs / 3600000;\n everyUnit = \"h\";\n } else if (everyMs % 60000 === 0) {\n everyValue = everyMs / 60000;\n everyUnit = \"m\";\n } else {\n everyValue = everyMs / 1000;\n everyUnit = \"s\";\n }\n } else {\n everyUnit = \"m\";\n }\n\n // Update all form fields with job data\n updateField(\"name\", job.name || \"\");\n updateField(\"description\", job.description || \"\");\n updateField(\"enabled\", job.enabled ?? true);\n updateField(\"scheduleKind\", (job.schedule?.kind as \"cron\" | \"every\" | \"at\") || \"every\");\n updateField(\"cronExpr\", job.schedule?.expr || \"0 * * * *\");\n updateField(\"everyValue\", everyValue);\n updateField(\"everyUnit\", everyUnit);\n updateField(\"timezone\", job.schedule?.tz || \"\");\n updateField(\"deliveryMode\", (job.delivery?.mode as \"none\" | \"announce\") || \"none\");\n updateField(\"deliveryChannel\", job.delivery?.channel || \"\");\n updateField(\"deliveryTo\", job.delivery?.to || \"\");\n updateField(\"deliveryBestEffort\", job.delivery?.bestEffort ?? true);\n updateField(\"payloadKind\", (job.payload?.kind as \"systemEvent\" | \"agentTurn\") || \"agentTurn\");\n updateField(\"payloadText\", job.payload?.text || \"\");\n updateField(\"payloadMessage\", job.payload?.message || \"\");\n updateField(\"payloadModel\", job.payload?.model || \"\");\n updateField(\"payloadThinking\", job.payload?.thinking || \"\");\n updateField(\"payloadTimeout\", job.payload?.timeoutSeconds || 30);\n updateField(\"agentId\", job.agentId || \"\");\n updateField(\"sessionTarget\", job.sessionTarget || \"\");\n updateField(\"sessionKey\", job.sessionKey || \"\");\n }\n }, [job, updateField]);\n\n const handleSave = async () => {\n if (!job) return;\n \n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/edit\", {\n method: \"POST\",\n body: JSON.stringify({\n id: job.id,\n ...buildPayload(),\n }),\n });\n\n onSaved();\n onClose();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n const handleDelete = async () => {\n if (!job || !confirm(\"Are you sure you want to delete this cron job?\")) return;\n \n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/delete\", {\n method: \"POST\",\n body: JSON.stringify({ id: job.id }),\n });\n\n onSaved();\n onClose();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n if (!job) return null;\n\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title=\"Edit Cron Job\"\n error={error}\n confirmLabel=\"Save changes\"\n confirmBusyLabel=\"Saving…\"\n confirmDisabled={!formData.name}\n busy={loading}\n onConfirm={handleSave}\n >\n <div className=\"mt-4 max-h-[70vh] overflow-y-auto\">\n <CronJobForm formData={formData} updateField={updateField} />\n </div>\n\n <div className=\"mt-6 flex items-center justify-between gap-2 border-t border-white/10 pt-4\">\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={loading}\n className=\"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-50\"\n >\n Delete job\n </button>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Tip: use dryRun=true to test safely.</div>\n </div>\n </ConfirmationModal>\n );\n}\n","import React from \"react\";\nimport { CronJobFormData } from \"@/hooks/useCronJobForm\";\n\ninterface CronJobFormProps {\n formData: CronJobFormData;\n updateField: <K extends keyof CronJobFormData>(field: K, value: CronJobFormData[K]) => void;\n}\n\nexport function CronJobForm({ formData, updateField }: CronJobFormProps) {\n return (\n <div className=\"space-y-4\">\n {/* Basic Info */}\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Name</span>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => updateField(\"name\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n placeholder=\"Job name\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent ID</span>\n <input\n type=\"text\"\n value={formData.agentId}\n onChange={(e) => updateField(\"agentId\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n placeholder=\"Agent ID\"\n />\n </label>\n </div>\n\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Description</span>\n <textarea\n value={formData.description}\n onChange={(e) => updateField(\"description\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n rows={2}\n placeholder=\"Optional description\"\n />\n </label>\n\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"enabled\"\n checked={formData.enabled}\n onChange={(e) => updateField(\"enabled\", e.target.checked)}\n className=\"h-4 w-4 rounded border-white/20 bg-white/5\"\n />\n <label htmlFor=\"enabled\" className=\"ml-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">\n Enabled\n </label>\n </div>\n\n {/* Schedule */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Schedule</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Schedule Type</span>\n <select\n value={formData.scheduleKind}\n onChange={(e) => updateField(\"scheduleKind\", e.target.value as \"cron\" | \"every\" | \"at\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"every\">Every (interval)</option>\n <option value=\"cron\">Cron expression</option>\n <option value=\"at\">At specific time</option>\n </select>\n </label>\n\n {formData.scheduleKind === \"every\" && (\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Every</span>\n <input\n type=\"number\"\n value={formData.everyValue}\n onChange={(e) => updateField(\"everyValue\", Number(e.target.value))}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n min=\"1\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Unit</span>\n <select\n value={formData.everyUnit}\n onChange={(e) => updateField(\"everyUnit\", e.target.value as \"s\" | \"m\" | \"h\" | \"d\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"s\">Seconds</option>\n <option value=\"m\">Minutes</option>\n <option value=\"h\">Hours</option>\n <option value=\"d\">Days</option>\n </select>\n </label>\n </div>\n )}\n\n {formData.scheduleKind === \"cron\" && (\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Cron Expression</span>\n <input\n type=\"text\"\n value={formData.cronExpr}\n onChange={(e) => updateField(\"cronExpr\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"0 * * * *\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Timezone (optional)</span>\n <input\n type=\"text\"\n value={formData.timezone}\n onChange={(e) => updateField(\"timezone\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"UTC\"\n />\n </label>\n </div>\n )}\n\n {formData.scheduleKind === \"at\" && (\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">At Time (ISO 8601)</span>\n <input\n type=\"text\"\n value={formData.atValue}\n onChange={(e) => updateField(\"atValue\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"2024-01-01T00:00:00Z\"\n />\n </label>\n )}\n </div>\n\n {/* Payload */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Payload</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Payload Type</span>\n <select\n value={formData.payloadKind}\n onChange={(e) => updateField(\"payloadKind\", e.target.value as \"systemEvent\" | \"agentTurn\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"agentTurn\">Agent Turn</option>\n <option value=\"systemEvent\">System Event</option>\n </select>\n </label>\n\n {formData.payloadKind === \"systemEvent\" ? (\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Event Text</span>\n <textarea\n value={formData.payloadText}\n onChange={(e) => updateField(\"payloadText\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n rows={3}\n placeholder=\"System event message\"\n />\n </label>\n ) : (\n <div className=\"space-y-3\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Message</span>\n <textarea\n value={formData.payloadMessage}\n onChange={(e) => updateField(\"payloadMessage\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n rows={3}\n placeholder=\"Agent message\"\n />\n </label>\n \n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Model (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadModel}\n onChange={(e) => updateField(\"payloadModel\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Model ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Thinking (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadThinking}\n onChange={(e) => updateField(\"payloadThinking\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Thinking level\"\n />\n </label>\n </div>\n \n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Timeout (seconds)</span>\n <input\n type=\"number\"\n value={formData.payloadTimeout}\n onChange={(e) => updateField(\"payloadTimeout\", Number(e.target.value))}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n min=\"1\"\n />\n </label>\n </div>\n )}\n </div>\n\n {/* Delivery */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Delivery</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Delivery Mode</span>\n <select\n value={formData.deliveryMode}\n onChange={(e) => updateField(\"deliveryMode\", e.target.value as \"none\" | \"announce\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"none\">None</option>\n <option value=\"announce\">Announce</option>\n </select>\n </label>\n\n {formData.deliveryMode === \"announce\" && (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Channel (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryChannel}\n onChange={(e) => updateField(\"deliveryChannel\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Channel ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">To (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryTo}\n onChange={(e) => updateField(\"deliveryTo\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Target\"\n />\n </label>\n </div>\n \n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"bestEffort\"\n checked={formData.deliveryBestEffort}\n onChange={(e) => updateField(\"deliveryBestEffort\", e.target.checked)}\n className=\"h-4 w-4 rounded border-white/20 bg-white/5\"\n />\n <label htmlFor=\"bestEffort\" className=\"ml-2 text-sm text-[color:var(--ck-text-primary)]\">\n Best effort delivery\n </label>\n </div>\n </div>\n )}\n </div>\n\n {/* Advanced */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Advanced</h4>\n \n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Session Target (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionTarget}\n onChange={(e) => updateField(\"sessionTarget\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Session target\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Session Key (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionKey}\n onChange={(e) => updateField(\"sessionKey\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Session key\"\n />\n </label>\n </div>\n </div>\n </div>\n );\n}","import { useCallback, useState } from \"react\";\n\nexport interface CronJobFormData {\n name: string;\n description: string;\n enabled: boolean;\n scheduleKind: \"cron\" | \"every\" | \"at\";\n cronExpr: string;\n everyValue: number;\n everyUnit: \"s\" | \"m\" | \"h\" | \"d\";\n atValue: string;\n timezone: string;\n deliveryMode: \"none\" | \"announce\";\n deliveryChannel: string;\n deliveryTo: string;\n deliveryBestEffort: boolean;\n payloadKind: \"systemEvent\" | \"agentTurn\";\n payloadText: string;\n payloadMessage: string;\n payloadModel: string;\n payloadThinking: string;\n payloadTimeout: number;\n agentId: string;\n sessionTarget: string;\n sessionKey: string;\n}\n\nexport interface UseCronJobFormOptions {\n initialData?: Partial<CronJobFormData>;\n}\n\nexport function useCronJobForm(options: UseCronJobFormOptions = {}) {\n const [formData, setFormData] = useState<CronJobFormData>({\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n cronExpr: \"0 * * * *\",\n everyValue: 60,\n everyUnit: \"m\",\n atValue: \"\",\n timezone: \"\",\n deliveryMode: \"none\",\n deliveryChannel: \"\",\n deliveryTo: \"\",\n deliveryBestEffort: true,\n payloadKind: \"agentTurn\",\n payloadText: \"\",\n payloadMessage: \"\",\n payloadModel: \"\",\n payloadThinking: \"\",\n payloadTimeout: 30,\n agentId: \"\",\n sessionTarget: \"\",\n sessionKey: \"\",\n ...options.initialData,\n });\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const updateField = useCallback(\n <K extends keyof CronJobFormData>(field: K, value: CronJobFormData[K]) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n },\n [],\n );\n\n const reset = () => {\n setFormData({\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n cronExpr: \"0 * * * *\",\n everyValue: 60,\n everyUnit: \"m\",\n atValue: \"\",\n timezone: \"\",\n deliveryMode: \"none\",\n deliveryChannel: \"\",\n deliveryTo: \"\",\n deliveryBestEffort: true,\n payloadKind: \"agentTurn\",\n payloadText: \"\",\n payloadMessage: \"\",\n payloadModel: \"\",\n payloadThinking: \"\",\n payloadTimeout: 30,\n agentId: \"\",\n sessionTarget: \"\",\n sessionKey: \"\",\n ...options.initialData,\n });\n };\n\n const buildPayload = () => {\n const everyMs = formData.scheduleKind === \"every\" ? \n formData.everyValue * (\n formData.everyUnit === \"s\" ? 1000 : \n formData.everyUnit === \"m\" ? 60000 : \n formData.everyUnit === \"h\" ? 3600000 : \n 86400000\n ) : undefined;\n\n const schedule = formData.scheduleKind === \"cron\" \n ? { kind: \"cron\" as const, expr: formData.cronExpr, ...(formData.timezone ? { tz: formData.timezone } : {}) }\n : formData.scheduleKind === \"every\"\n ? { kind: \"every\" as const, everyMs: everyMs! }\n : { kind: \"at\" as const, at: formData.atValue };\n\n const delivery = formData.deliveryMode === \"none\" \n ? { mode: \"none\" as const }\n : { \n mode: \"announce\" as const, \n ...(formData.deliveryChannel ? { channel: formData.deliveryChannel } : {}),\n ...(formData.deliveryTo ? { to: formData.deliveryTo } : {}),\n bestEffort: formData.deliveryBestEffort \n };\n\n const payload = formData.payloadKind === \"systemEvent\"\n ? { kind: \"systemEvent\" as const, text: formData.payloadText }\n : { \n kind: \"agentTurn\" as const, \n message: formData.payloadMessage,\n ...(formData.payloadModel ? { model: formData.payloadModel } : {}),\n ...(formData.payloadThinking ? { thinking: formData.payloadThinking } : {}),\n timeoutSeconds: formData.payloadTimeout \n };\n\n return {\n name: formData.name,\n description: formData.description,\n enabled: formData.enabled,\n schedule,\n delivery,\n payload,\n agentId: formData.agentId,\n sessionTarget: formData.sessionTarget,\n sessionKey: formData.sessionKey,\n };\n };\n\n return {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n reset,\n buildPayload,\n };\n}","\"use client\";\n\nimport { Modal } from \"@/components/Modal\";\nimport { CronJobForm } from \"@/components/CronJobForm\";\nimport { useCronJobForm } from \"@/hooks/useCronJobForm\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { errorMessage } from \"@/lib/errors\";\n\ninterface CreateCronJobModalProps {\n open: boolean;\n onClose: () => void;\n onCreated: () => void;\n}\n\nexport function CreateCronJobModal({ open, onClose, onCreated }: CreateCronJobModalProps) {\n const {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n reset,\n buildPayload,\n } = useCronJobForm();\n\n const handleCreate = async () => {\n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/add\", {\n method: \"POST\",\n body: JSON.stringify(buildPayload()),\n });\n\n onCreated();\n onClose();\n reset();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Cron Job\" size=\"lg\">\n <div className=\"max-h-[70vh] overflow-y-auto\">\n <CronJobForm formData={formData} updateField={updateField} />\n\n {error && (\n <div className=\"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n )}\n </div>\n\n <div className=\"mt-6 flex items-center justify-end gap-2 border-t border-white/10 pt-4\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleCreate}\n disabled={loading || !formData.name}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {loading ? \"Creating...\" : \"Create Job\"}\n </button>\n </div>\n </Modal>\n );\n}"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCDA,EAAA,EAAA,CAAA,CAAA,OCKO,SAAS,EAAY,UAAE,CAAQ,aAAE,CAAW,CAAoB,EACrE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBAEb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,SAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,IAAI,CACpB,SAAW,AAAD,GAAO,EAAY,OAAQ,EAAE,MAAM,CAAC,KAAK,EACnD,UAAU,wKACV,YAAY,gBAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,aAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,OAAO,CACvB,SAAU,AAAC,GAAM,EAAY,UAAW,EAAE,MAAM,CAAC,KAAK,EACtD,UAAU,wKACV,YAAY,mBAKlB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,gBAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EAAS,WAAW,CAC3B,SAAU,AAAC,GAAM,EAAY,cAAe,EAAE,MAAM,CAAC,KAAK,EAC1D,UAAU,wKACV,KAAM,EACN,YAAY,4BAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8BACb,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,WACL,GAAG,UACH,QAAS,EAAS,OAAO,CACzB,SAAU,AAAC,GAAM,EAAY,UAAW,EAAE,MAAM,CAAC,OAAO,EACxD,UAAU,+CAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,QAAQ,UAAU,UAAU,wEAA+D,eAMpG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0CACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,gEAAuD,aAErE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,uBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,kBAC1E,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAS,YAAY,CAC5B,SAAU,AAAC,GAAM,EAAY,eAAgB,EAAE,MAAM,CAAC,KAAK,EAC3D,UAAU,iIAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,iBAAQ,qBACtB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,oBACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,cAAK,2BAII,UAA1B,EAAS,YAAY,EACpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,UAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,SACL,MAAO,EAAS,UAAU,CAC1B,SAAU,AAAC,GAAM,EAAY,aAAc,OAAO,EAAE,MAAM,CAAC,KAAK,GAChE,UAAU,uHACV,IAAI,SAGR,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,SAC1E,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAS,SAAS,CACzB,SAAU,AAAC,GAAM,EAAY,YAAa,EAAE,MAAM,CAAC,KAAK,EACxD,UAAU,iIAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,aAAI,YAClB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,aAAI,YAClB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,aAAI,UAClB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,aAAI,kBAMC,SAA1B,EAAS,YAAY,EACpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,oBAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,QAAQ,CACxB,SAAU,AAAC,GAAM,EAAY,WAAY,EAAE,MAAM,CAAC,KAAK,EACvD,UAAU,uHACV,YAAY,iBAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,wBAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,QAAQ,CACxB,SAAW,AAAD,GAAO,EAAY,WAAY,EAAE,MAAM,CAAC,KAAK,EACvD,UAAU,uHACV,YAAY,cAMO,OAA1B,EAAS,YAAY,EACpB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,uBAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,OAAO,CACvB,SAAU,AAAC,GAAM,EAAY,UAAW,EAAE,MAAM,CAAC,KAAK,EACtD,UAAU,uHACV,YAAY,+BAOpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0CACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,gEAAuD,YAErE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,uBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,iBAC1E,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAS,WAAW,CAC3B,SAAW,AAAD,GAAO,EAAY,cAAe,EAAE,MAAM,CAAC,KAAK,EAC1D,UAAU,iIAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,qBAAY,eAC1B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,uBAAc,uBAIN,gBAAzB,EAAS,WAAW,CACnB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,eAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EAAS,WAAW,CAC3B,SAAU,AAAC,GAAM,EAAY,cAAe,EAAE,MAAM,CAAC,KAAK,EAC1D,UAAU,uHACV,KAAM,EACN,YAAY,4BAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,YAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EAAS,cAAc,CAC9B,SAAW,AAAD,GAAO,EAAY,iBAAkB,EAAE,MAAM,CAAC,KAAK,EAC7D,UAAU,uHACV,KAAM,EACN,YAAY,qBAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,qBAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,YAAY,CAC5B,SAAU,AAAC,GAAM,EAAY,eAAgB,EAAE,MAAM,CAAC,KAAK,EAC3D,UAAU,uHACV,YAAY,gBAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,wBAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,eAAe,CAC/B,SAAU,AAAC,GAAM,EAAY,kBAAmB,EAAE,MAAM,CAAC,KAAK,EAC9D,UAAU,uHACV,YAAY,yBAKlB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,sBAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,SACL,MAAO,EAAS,cAAc,CAC9B,SAAU,AAAC,GAAM,EAAY,iBAAkB,OAAO,EAAE,MAAM,CAAC,KAAK,GACpE,UAAU,uHACV,IAAI,eAQd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0CACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,gEAAuD,aAErE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,uBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,kBAC1E,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EAAS,YAAY,CAC5B,SAAU,AAAC,GAAM,EAAY,eAAgB,EAAE,MAAM,CAAC,KAAK,EAC3D,UAAU,iIAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,gBAAO,SACrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,oBAAW,mBAI5B,AAA0B,eAAjB,YAAY,EACpB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,uBAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,eAAe,CAC/B,SAAU,AAAC,GAAM,EAAY,kBAAmB,EAAE,MAAM,CAAC,KAAK,EAC9D,UAAU,uHACV,YAAY,kBAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,kBAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,UAAU,CAC1B,SAAU,AAAC,GAAM,EAAY,aAAc,EAAE,MAAM,CAAC,KAAK,EACzD,UAAU,uHACV,YAAY,iBAKlB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8BACb,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,WACL,GAAG,aACH,QAAS,EAAS,kBAAkB,CACpC,SAAU,AAAC,GAAM,EAAY,qBAAsB,EAAE,MAAM,CAAC,OAAO,EACnE,UAAU,+CAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,QAAQ,aAAa,UAAU,4DAAmD,kCASjG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,0CACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,gEAAuD,aAErE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,8BAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,aAAa,CAC7B,SAAU,AAAC,GAAM,EAAY,gBAAiB,EAAE,MAAM,CAAC,KAAK,EAC5D,UAAU,uHACV,YAAY,sBAGhB,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,mEAA0D,2BAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,OACL,MAAO,EAAS,UAAU,CAC1B,SAAU,AAAC,GAAM,EAAY,aAAc,EAAE,MAAM,CAAC,KAAK,EACzD,UAAU,uHACV,YAAY,2BAO1B,CCnRO,SAAS,EAAe,EAAiC,CAAC,CAAC,EAChE,GAAM,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAA0B,CACxD,KAAM,GACN,YAAa,GACb,SAAS,EACT,aAAc,QACd,SAAU,YACV,WAAY,GACZ,UAAW,IACX,QAAS,GACT,SAAU,GACV,aAAc,OACd,gBAAiB,GACjB,WAAY,GACZ,oBAAoB,EACpB,YAAa,YACb,YAAa,GACb,eAAgB,GAChB,aAAc,GACd,gBAAiB,GACjB,eAAgB,GAChB,QAAS,GACT,cAAe,GACf,WAAY,GACZ,GAAG,EAAQ,WAAW,AACxB,GAEM,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAoFlD,MAAO,CACL,mBACA,EACA,mBACA,WACA,EACA,YAxFkB,CAAA,EAAA,EAAA,WAAA,AAAW,EAC7B,CAAkC,EAAU,KAC1C,EAAY,AAAC,IAAU,CAAE,EAAH,CAAM,CAAI,CAAE,CAAC,EAAM,CAAE,EAAM,CAAC,CACpD,EACA,EAAE,EAqFF,MAlFY,KACZ,EAAY,CACV,KAAM,GACN,YAAa,GACb,SAAS,EACT,aAAc,QACd,SAAU,YACV,WAAY,GACZ,UAAW,IACX,QAAS,GACT,SAAU,GACV,aAAc,OACd,gBAAiB,GACjB,WAAY,GACZ,oBAAoB,EACpB,YAAa,YACb,YAAa,GACb,eAAgB,GAChB,aAAc,GACd,gBAAiB,GACjB,eAAgB,GAChB,QAAS,GACT,cAAe,GACf,WAAY,GACZ,GAAG,EAAQ,WAAW,AACxB,EACF,EAyDE,aAvDmB,KACnB,IAAM,EAAU,AAA0B,YAAjB,YAAY,CACnC,EAAS,UAAU,EACM,AAAvB,CADoB,OACX,SAAS,CAAW,IACN,MAAvB,EAAS,SAAS,CAAW,IACN,MAAvB,EAAS,SAAS,CAAW,KAC7B,KAAA,CACF,MAAI,EAEA,EAAqC,SAA1B,EAAS,YAAY,CAClC,CAAE,KAAM,OAAiB,KAAM,EAAS,QAAQ,CAAE,GAAI,EAAS,QAAQ,CAAG,CAAE,GAAI,EAAS,QAAS,AAAD,EAAK,CAAC,CAAC,AAAE,EAChF,UAA1B,EAAS,YAAY,CACrB,CAAE,KAAM,QAAkB,QAAS,CAAS,EAC5C,CAAE,KAAM,KAAe,GAAI,EAAS,OAAO,AAAC,EAE1C,EAAqC,SAA1B,EAAS,YAAY,CAClC,CAAE,KAAM,MAAgB,EACxB,CACE,KAAM,WACN,GAAI,EAAS,eAAe,CAAG,CAAE,QAAS,EAAS,eAAe,AAAC,EAAI,CAAC,CAAC,CACzE,GAAI,EAAS,UAAU,CAAG,CAAE,GAAI,EAAS,UAAU,AAAC,EAAI,CAAC,CAAC,CAC1D,WAAY,EAAS,kBACvB,AADyC,EAGvC,EAAmC,gBAAzB,EAAS,WAAW,CAChC,CAAE,KAAM,cAAwB,KAAM,EAAS,WAAW,AAAC,EAC3D,CACE,KAAM,YACN,QAAS,EAAS,cAAc,CAChC,GAAI,EAAS,YAAY,CAAG,CAAE,MAAO,EAAS,YAAY,AAAC,EAAI,CAAC,CAAC,CACjE,GAAI,EAAS,eAAe,CAAG,CAAE,SAAU,EAAS,eAAe,AAAC,EAAI,CAAC,CAAC,CAC1E,eAAgB,EAAS,cAC3B,AADyC,EAG7C,MAAO,CACL,KAAM,EAAS,IAAI,CACnB,YAAa,EAAS,WAAW,CACjC,QAAS,EAAS,OAAO,UACzB,WACA,UACA,EACA,QAAS,EAAS,OAAO,CACzB,cAAe,EAAS,aAAa,CACrC,WAAY,EAAS,UACvB,AADiC,CAEnC,CAWA,CACF,CFnJA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAuCO,SAAS,EAAiB,KAAE,CAAG,MAAE,CAAI,SAAE,CAAO,SAAE,CAAO,CAAyB,EACrF,GAAM,UACJ,CAAQ,SACR,CAAO,OACP,CAAK,YACL,CAAU,UACV,CAAQ,aACR,CAAW,cACX,CAAY,CACb,CAAG,IAGJ,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,GAAI,EAAK,CACP,IAEI,EAFE,EAAU,EAAI,QAAQ,EAAE,QAC1B,EAAa,GAGb,EACE,EAAU,KADH,EACgB,GAAG,AAC5B,EAAa,EAAU,MACvB,EAAY,KACH,EAAU,MAAY,GAAG,AAClC,EAAa,EAAU,KACvB,EAAY,KACH,EAAU,KAAU,GAAG,AAChC,EAAa,EAAU,IACvB,EAAY,MAEZ,EAAa,EAAU,IACvB,EAAY,KAGd,EAAY,IAId,EAAY,OAAQ,EAAI,IAAI,EAAI,IAChC,EAAY,cAAe,EAAI,WAAW,EAAI,IAC9C,EAAY,UAAW,EAAI,OAAO,GAAI,GACtC,EAAY,eAAiB,EAAI,QAAQ,EAAE,MAAoC,SAC/E,EAAY,WAAY,EAAI,QAAQ,EAAE,MAAQ,aAC9C,EAAY,aAAc,GAC1B,EAAY,YAAa,GACzB,EAAY,WAAY,EAAI,QAAQ,EAAE,IAAM,IAC5C,EAAY,eAAiB,EAAI,QAAQ,EAAE,MAAgC,QAC3E,EAAY,kBAAmB,EAAI,QAAQ,EAAE,SAAW,IACxD,EAAY,aAAc,EAAI,QAAQ,EAAE,IAAM,IAC9C,EAAY,qBAAsB,EAAI,QAAQ,EAAE,aAAc,GAC9D,EAAY,cAAgB,EAAI,OAAO,EAAE,MAAwC,aACjF,EAAY,cAAe,EAAI,OAAO,EAAE,MAAQ,IAChD,EAAY,iBAAkB,EAAI,OAAO,EAAE,SAAW,IACtD,EAAY,eAAgB,EAAI,OAAO,EAAE,OAAS,IAClD,EAAY,kBAAmB,EAAI,OAAO,EAAE,UAAY,IACxD,EAAY,iBAAkB,EAAI,OAAO,EAAE,gBAAkB,IAC7D,EAAY,UAAW,EAAI,OAAO,EAAI,IACtC,EAAY,gBAAiB,EAAI,aAAa,EAAI,IAClD,EAAY,aAAc,EAAI,UAAU,EAAI,GAC9C,CACF,EAAG,CAAC,EAAK,EAAY,EAErB,IAAM,EAAa,UACjB,GAAK,CAAD,EAEJ,EAFU,CAEC,GACX,EAAS,MAET,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,iBAAkB,CAChC,OAAQ,OACR,KAAM,KAAK,SAAS,CAAC,CACnB,GAAI,EAAI,EAAE,CACV,GAAG,GAAc,AACnB,EACF,GAEA,IACA,GACF,CAAE,MAAO,EAAK,CACZ,EAAS,CAAA,EAAA,EAAA,YAAY,AAAZ,EAAa,GACxB,QAAU,CACR,GAAW,EACb,EACF,EAEM,EAAe,UACnB,GAAI,AAAC,GAAQ,IAAD,IAAS,mDAAmD,AAExE,GAAW,GACX,EAAS,MAET,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,mBAAoB,CAClC,OAAQ,OACR,KAAM,KAAK,SAAS,CAAC,CAAE,GAAI,EAAI,EAAE,AAAC,EACpC,GAEA,IACA,GACF,CAAE,MAAO,EAAK,CACZ,EAAS,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACxB,QAAU,CACR,EAAW,GACb,EACF,SAEA,AAAK,EAGH,CAAA,CAHE,CAAM,AAGR,EAAA,IAAA,EAAC,EAAA,iBAAiB,CAAA,CAChB,KAAM,EACN,QAAS,EACT,MAAM,gBACN,MAAO,EACP,aAAa,eACb,iBAAiB,UACjB,gBAAiB,CAAC,EAAS,IAAI,CAC/B,KAAM,EACN,UAAW,YAEX,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6CACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,SAAU,EAAU,YAAa,MAGhD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uFACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,SAAU,EACV,UAAU,6OACX,eAGD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDAA+C,+CA3BnD,IA+BnB,CGrLA,IAAA,EAAA,EAAA,CAAA,CAAA,OAYO,SAAS,EAAmB,MAAE,CAAI,SAAE,CAAO,WAAE,CAAS,CAA2B,EACtF,GAAM,UACJ,CAAQ,SACR,CAAO,OACP,CAAK,CACL,YAAU,UACV,CAAQ,aACR,CAAW,CACX,OAAK,CACL,cAAY,CACb,CAAG,IAEE,EAAe,UACnB,GAAW,GACX,EAAS,MAET,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAS,AAAT,EAAU,gBAAiB,CAC/B,OAAQ,OACR,KAAM,KAAK,SAAS,CAAC,IACvB,GAEA,IACA,IACA,GACF,CAAE,MAAO,EAAK,CACZ,EAAS,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACxB,QAAU,CACR,EAAW,GACb,CACF,EAEA,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CAAC,KAAM,EAAM,QAAS,EAAS,MAAM,kBAAkB,KAAK,eAChE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yCACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAY,SAAU,EAAU,YAAa,IAE7C,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2FACZ,OAKP,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mFACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,SAAU,EACV,UAAU,4IACX,WAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,SAAU,GAAW,CAAC,EAAS,IAAI,CACnC,UAAU,iMAET,EAAU,cAAgB,oBAKrC,CJtEA,IAAA,EAAA,EAAA,CAAA,CAAA,OA2BA,SAAS,EAAU,CAAU,EAE3B,OAAO,EAAQ,EAAE,OAAO,EAAK,EAAwC,KAAK,EAAE,OAAA,CAC9E,CAEe,SAAS,EAAe,QAAE,CAAM,CAA6B,EAC1E,IAAM,EAAQ,CAAA,EAAA,EAAA,QAAQ,AAAR,IACR,EAAa,CAAC,GAAU,EAAA,CAAE,CAAE,IAAI,GAChC,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAoB,EAAE,EACxC,CAAC,EAAK,EAAO,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACjC,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MACtD,CAAC,EAAc,EAAgB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAiC,OAE3E,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAC3C,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACjD,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAExD,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACnC,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAiB,MAEjD,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAIvC,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAoB,MACpE,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAE7C,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAqD,IAAI,KACzG,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAEzC,EAAS,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IACd,IAAI,EAAK,CAAC,IAAI,CAAC,CAAC,EAAG,KACxB,IAAM,EAAK,EAAU,UAErB,AAAI,IADO,EAAU,CACV,EAAW,EAAK,AAAZ,CAAa,EAAI,EACzB,CAD4B,MACrB,EAAE,IAAI,EAAI,EAD2B,EACvB,aAAa,CAAC,OAAO,EAAE,IAAI,EAAI,IAC7D,GACC,CAAC,EAAK,EAEH,EAAW,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,KACvB,GAAqB,QAAjB,EAAwB,OAAO,EACnC,IAAM,EAA+B,YAAjB,EACpB,OAAO,EAAO,MAAM,CAAC,AAAC,GAAM,EAAU,KAAO,EAC/C,EAAG,CAAC,EAAQ,EAAa,EAEnB,EAAa,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAAM,EAAS,GAAG,CAAC,AAAC,GAAM,EAAE,EAAE,EAAG,CAAC,EAAS,EAChE,UAAE,CAAQ,QAAE,CAAM,CAAE,aAAW,WAAE,EAAS,CAAE,QAAK,OAAE,EAAK,CAAE,CAAG,CAAA,EAAA,EAAA,eAAA,AAAe,EAAC,GAE7E,GAAuB,CAAA,EAAA,EAAA,OAAA,AAAO,EAClC,IAAM,EAAS,MAAM,CAAC,AAAC,GAAM,EAAS,GAAG,CAAC,EAAE,EAAE,GAAK,EAAU,IAAI,MAAM,CACvE,CAAC,EAAU,EAAS,EAEhB,GAAwB,CAAA,EAAA,EAAA,OAAO,AAAP,EAC5B,IAAM,EAAS,MAAM,CAAC,AAAC,GAAM,EAAS,GAAG,CAAC,EAAE,EAAE,GAAK,CAAC,EAAU,IAAI,MAAM,CACxE,CAAC,EAAU,EAAS,EAGtB,SAAS,GAAc,CAAkB,EACvC,GAAiB,GACjB,EAAmB,IAAI,KACvB,GAAe,GACf,EAAmB,EACrB,CAEA,SAAS,KACH,IACJ,EAAmB,MACnB,CAFiB,CAEA,IACjB,EAAmB,CAHM,GAGF,KACzB,CAuBA,eAAe,KACb,EA5BwD,CA4BpD,CAAC,EAAiB,OACtB,GAAiB,GACjB,GAAe,GAEf,GAAM,YAAE,CAAU,CAAE,SAAO,CAAE,CAnB/B,AAmBkC,SAnBzB,EACP,IAAM,EAAM,MAAM,IAAI,CAAC,GACvB,GAAI,CAAC,GAAuC,WAApB,EAA8B,MAAO,CAAE,WAAY,EAAK,QAAS,EAAE,AAAC,EAC5F,IAAM,EAAkC,WAApB,EACd,EAAuB,EAAE,CACzB,EAAoB,EAAE,CAC5B,IAAK,IAAM,KAAM,EAAK,CACpB,IAAM,EAAI,EAAK,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,GAChC,GAAK,EAAU,KAAO,EAAa,EAAQ,IAAI,CAAC,GAC/C,EAAW,IAAI,CAAC,EACvB,CACA,MAAO,YAAE,UAAY,CAAQ,CAC/B,IAUQ,EAAU,IAAI,IACpB,IAAK,IAAM,KAAM,EAAY,EAAQ,GAAG,CAAC,EAAI,CAAE,OAAQ,SAAU,GACjE,IAAK,IAAM,KAAM,EAAS,EAAQ,GAAG,CAAC,EAAI,CAAE,OAAQ,SAAU,GAC9D,EAAmB,IAAI,IAAI,IAG3B,IAAI,EAAY,EACZ,EAAW,EAEf,IAAK,IAAM,KAAM,EAAY,CAE3B,EAAmB,AAAC,IAClB,IAAM,EAAO,IAAI,IAAI,GAErB,OADA,EAAK,GAAG,CAAC,EAAI,CAAE,OAAQ,aAAc,GAC9B,CACT,GAEA,GAAI,CACF,GAAI,AAAgB,WAbJ,EAac,CAC5B,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAS,AAAT,EAA4C,mBAAoB,CACjF,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,IAAE,CAAG,EAC5B,GACA,GAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,gBAC9C,KAAO,CACL,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAS,AAAT,EAA4C,gBAAiB,CAC9E,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,KAAI,QAAQ,AAAY,EACjD,GACA,GAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,CAAA,EAAG,EAAY,OAAO,CAAC,CACrE,CACA,IACA,EAAmB,AAAC,IAClB,IAAM,EAAO,IAAI,IAAI,GAErB,OADA,EAAK,GAAG,CAAC,EAAI,CAAE,OAAQ,MAAO,GACvB,CACT,EACF,CAAE,MAAO,EAAY,CACnB,IACA,EAAmB,AAAC,IAClB,IAAM,EAAO,IAAI,IAAI,GAErB,OADA,EAAK,GAAG,CAAC,EAAI,CAAE,OAAQ,QAAS,MAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAG,GAChD,CACT,EACF,CACF,CAEA,GAAe,GAEf,IAAM,EAAO,AAAgB,aAAW,UAAY,AAAgB,aAAW,UAAY,UAC1E,GAAG,EAAhB,EACF,EAAM,IAAI,CAAC,CAAE,KAAM,UAAW,QAAS,CAAA,EAAG,EAAK,CAAC,EAAE,EAAU,SAAS,EAAgB,IAAd,EAAkB,IAAM,GAAG,CAAC,CAAC,AAAC,GAErG,EAAM,IAAI,CAAC,CAAE,KAAM,QAAS,QAAS,CAAA,EAAG,EAAK,CAAC,EAAE,EAAU,EAAE,EAAE,EAAS,QAAQ,CAAC,AAAC,GAEnF,KACA,MAAM,IACR,CAEA,IAAM,GAAc,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IACrB,AAAL,EACO,EAAK,AADR,IACY,CAAC,AAAC,AADJ,GACY,EAAI,EAAE,GAAK,EAAQ,EAAE,GAAK,EAD/B,KAEpB,CAAC,EAAM,EAAQ,EAElB,eAAe,KACb,GAAW,GACX,EAAO,IACP,GAAI,CACF,IAAM,EAAM,EAAa,CAAC,sBAAsB,EAAE,mBAAmB,GAAA,CAAa,CAAG,iBAC/E,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAuB,EAAK,CAAE,MAAO,UAAW,GAC5E,EAAQ,EAAK,IAAI,EAAI,EAAE,EACU,GAAG,CAAhC,CAAC,EAAK,IAAI,EAAI,EAAA,AAAE,EAAE,MAAM,EAC1B,EAAO,sBAEX,CAAE,MAAO,EAAY,CACnB,EAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,IACpB,EAAQ,EAAE,CACZ,QAAU,CACR,GAAW,EACb,CACF,CAOA,eAAe,GAAI,CAAU,CAAE,CAAoC,EACjE,EAAW,IACX,EAAO,IACP,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,gBAAiB,CAC/B,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,IAAE,SAAI,CAAO,EACpC,GACA,EAAO,AAAW,UAAQ,iBAAmB,YAC7C,MAAM,IACR,CAAE,MAAO,EAAY,CACnB,EAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACtB,QAAU,CACR,GAAW,EACb,CACF,CAcA,eAAe,KACb,GAAc,GACd,EAAe,MACf,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAmC,mBAAoB,CACjF,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,GAAI,CAAS,EACtC,GACA,GAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,EAAK,KAAK,EAAI,iBAC5C,EAAM,IAAI,CAAC,CAAE,KAAM,UAAW,QAAS,CAAC,kBAAkB,EAAE,EAAA,CAAa,AAAC,GAC1E,GAAc,GACd,MAAM,IACR,CAAE,MAAO,EAAY,CACnB,IAAM,EAAM,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GACzB,EAAe,GACf,EAAM,IAAI,CAAC,CAAE,KAAM,QAAS,QAAS,CAAI,EAC3C,QAAU,CACR,GAAc,EAChB,CACF,CAEA,MAzDA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,IAEF,EAAG,CAAC,EAAW,EAuDb,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uBACf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACZ,EAAS,MAAM,CAAG,GACjB,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,WACL,QAAS,GAAe,EAAS,MAAM,CAAG,EAC1C,SAAU,GACV,UAAU,gCACV,aAAW,yBAGf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iCAAwB,kBACtC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8DACO,QAAjB,EACG,CAAA,EAAG,EAAS,MAAM,CAAC,IAAI,EAAE,EAAK,MAAM,CAAC,IAAI,EAAkB,IAAhB,EAAK,MAAM,CAAS,IAAM,GAAG,EAAE,EAAE,EAAa,CAAC,CAAC,CAC3F,CAAA,EAAG,EAAK,MAAM,CAAC,IAAI,EAAkB,IAAhB,EAAK,MAAM,CAAS,IAAM,GAAG,YAAS,EAAE,EAAK,MAAM,CAAC,AAAC,GAAM,EAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,SAIxH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAgB,EAAE,MAAM,CAAC,KAAK,EAC/C,UAAU,+GAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,QACpB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,mBAAU,YACxB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,oBAAW,gBAE3B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAc,GAC7B,UAAU,yLACX,eAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,GACT,SAAU,EACV,UAAU,yKACX,oBAON,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yEACZ,IAED,KAEJ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0BACZ,EAAS,GAAG,CAAE,AAAD,GACZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAe,UAAU,8BACxB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mCACb,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,KAAK,WACL,QAAS,EAAS,GAAG,CAAC,EAAE,EAAE,EAC1B,SAAU,IAAM,EAAO,EAAE,EAAE,EAC3B,UAAU,gDACV,aAAY,CAAC,OAAO,EAAE,EAAE,IAAI,EAAI,EAAE,EAAE,CAAA,CAAE,GAE1C,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CACC,KAAK,SACL,SAAU,EACV,QAAS,IAAM,EAAc,AAAC,GAAS,IAAQ,EAAE,EAAE,CAAG,KAAO,EAAE,EAAE,EACjE,UAAW,AAAC,KACI,UAAV,EAAE,GAAG,EAA0B,MAAV,EAAE,GAAG,AAAK,GAAK,CACtC,EAAE,cAAc,GAChB,EAAc,AAAC,GAAS,IAAQ,EAAE,EAAE,CAAG,KAAO,EAAE,EAAE,EAEtD,EACA,UAAU,mDAEV,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+EACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gCAAwB,EAAE,IAAI,EAAI,EAAE,EAAE,GACrD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sFACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAM,AApV3B,SAAS,AAAY,CAAuB,EAC1C,GAAI,CAAC,EAAG,MAAO,GACf,GAAe,SAAX,EAAE,IAAI,EAAe,EAAE,IAAI,CAAE,OAAO,EAAE,IAAI,CAC9C,GAAe,UAAX,EAAE,IAAI,EAAgB,EAAE,OAAO,CAAE,CACnC,IAAM,EAAO,KAAK,KAAK,CAAC,EAAE,OAAO,CAAG,KACpC,OAAO,GAAQ,GAAK,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,EAAO,IAAI,CAAC,CAAC,CAAG,CAAC,MAAM,EAAE,EAAK,CAAC,CAAC,AAC1E,CACA,OAAO,EAAE,IAAI,EAAI,EACnB,EA4UuC,EAAE,QAAQ,IAC7B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAM,EAAU,GAAK,YAAc,eACnC,EAAE,OAAO,CAAG,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,UAAQ,EAAE,OAAO,IAAW,KAC9C,EAAE,KAAK,CACN,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WACE,EAAE,KAAK,CAAC,IAAI,CAAC,KAAG,IACjB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CACC,UAAU,+BACV,KAAM,EAAE,KAAK,CAAC,IAAI,CAClB,QAAS,AAAC,GAAM,EAAE,eAAe,YAEhC,EAAE,KAAK,CAAC,KAAK,MAGhB,KACH,EAAE,aAAa,CAAG,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,WAAS,EAAE,aAAa,IAAW,KAC3D,EAAE,KAAK,EAAE,YAAc,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,SAAO,IAAI,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,cAAc,MAAa,WAIlG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,aAAa,QAAU,AAAD,GAAO,EAAE,eAAe,aAC3D,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,CAvI/B,EAuIwC,GAtIxC,GAAY,GADD,CAwIK,SAAU,EACV,UAAU,0HACX,SAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAI,EAAE,EAAE,CAAE,EAAU,GAAK,UAAY,UACpD,SAAU,EACV,UAAU,0HAET,EAAU,GAAK,UAAY,WAE9B,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAI,EAAE,EAAE,CAAE,OACzB,SAAU,EACV,UAAU,yLACX,YAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,MAAO,EAAU,GAAK,oCAAsC,kBAC5D,QAAS,IAAM,CAvK/B,EAAY,EAAI,EAAE,EAClB,EAsK0C,AAtK3B,EAAI,IAAI,EAAI,EAAI,EAAE,EACjC,EAAe,MACf,GAAc,IAqKE,SAAU,GAAW,EAAU,GAC/B,UAAU,6OACX,sBAQN,IAAe,EAAE,EAAE,CAClB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6HACZ,KAAK,SAAS,CAAC,EAAG,KAAM,KAEzB,OAxFI,EAAE,EAAE,QA8FjB,GAAQ,GACP,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sJACb,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,0DACb,GAAM,OAAe,IAAV,GAAc,IAAM,GAAG,eAErC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,GACT,UAAU,8IACX,UAGA,GAAwB,GACvB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAc,UAC7B,UAAU,+IACX,SACQ,GAAwB,GAAQ,CAAC,EAAE,EAAE,GAAsB,CAAC,CAAC,CAAG,MAG1E,GAAuB,GACtB,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAc,WAC7B,UAAU,+IACX,UACS,GAAuB,GAAQ,CAAC,EAAE,EAAE,GAAqB,CAAC,CAAC,CAAG,MAG1E,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAM,GAAc,UAC7B,UAAU,iIACX,0BAOP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,iBAAiB,CAAA,CAChB,KAA0B,OAApB,GAA4B,CAAC,EACnC,QAAS,GACT,MACsB,WAApB,EAA+B,mBACP,WAApB,EAA+B,mBAC/B,oBAEN,aACE,AAAoB,aAAW,SACP,WAApB,EAA+B,SAC/B,UAEN,UAAW,GACX,uBACsB,WAApB,OACI,EACA,iMAGN,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8DACU,WAApB,EACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WAAE,8CAC4C,IAC5C,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,gDAAuC,GAAM,YAAoB,IAAV,GAAc,IAAM,MAAY,qCAGrF,WAApB,EACF,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WAAE,SACO,IACP,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,gDAAuC,GAAsB,YAAoC,AAA1B,OAA8B,IAAM,MAAY,IACxI,GAAuB,GACtB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,KAAG,GAAqB,2CAIlC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WAAE,UACQ,IACR,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CAAO,UAAU,gDAAuC,GAAqB,YAAmC,IAAzB,GAA6B,IAAM,MAAY,IACtI,GAAwB,GACvB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,KAAG,GAAsB,gDAQpB,AAApB,UAA4B,GAC3B,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,4BAA4B,cAAY,SACvD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gCAAgC,KAAK,SAAS,aAAW,gBACtE,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,2DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,4HACb,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,sEACS,WAApB,EAA+B,WAAiC,WAApB,EAA+B,WAAa,YAAY,gBAEvG,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,uHACZ,MAAM,IAAI,CAAC,EAAgB,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,EAAI,QAAE,CAAM,OAAE,CAAK,CAAE,CAAC,gBACjE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAa,UAAU,oCACtB,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,qCACF,YAAX,GAAwB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,MACpE,gBAAX,GAA4B,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,yCAAgC,MACjE,SAAX,GAAqB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,0BAAiB,MAC3C,YAAX,GAAwB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,MACpE,UAAX,GAAsB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,wBAAe,SAExD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UACO,SAAX,EAAoB,iBACL,gBAAX,EAA2B,kBAChB,UAAX,EAAqB,eACrB,iDApblB,AAsbe,EAtbX,EAAK,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAsbD,EAtbM,CAC7B,GAAG,QAAQ,GAubA,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,yCACF,YAAX,GAAwB,GACxB,AAAW,mBACV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,2BACO,WAApB,EAA+B,cAAoC,WAApB,EAA+B,cAAgB,iBAGlG,AAAW,YACV,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,0BACO,WAApB,EAA+B,UAAgC,WAApB,EAA+B,UAAY,aAG/E,YAAX,GACC,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,iDAAuC,WACxB,WAApB,EAA+B,UAAY,cAG5C,UAAX,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,eAAe,MAAO,WAAQ,GAAS,gBAlCnD,OAwCd,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EACV,QAAS,GACT,UAAU,gKAET,EAAc,gBAAkB,sBAS/C,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,kBAAkB,CAAA,CACjB,KAAM,EACN,SAAU,EACV,KAAM,EACN,MAAO,EACP,QAAS,IAAM,GAAc,GAC7B,UAAW,KAGb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,IAAK,GACL,KAAM,EACN,QAAS,IAAM,GAAY,GAC3B,QAAS,KAGX,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,KAAM,EACN,QAAS,IAAM,GAAc,GAC7B,UAAW,OAInB"}
1
+ {"version":3,"sources":["../../../../src/app/cron-jobs/cron-jobs-client.tsx","../../../../src/components/EditCronJobModal.tsx","../../../../src/components/CronJobForm.tsx","../../../../src/hooks/useCronJobForm.ts","../../../../src/components/CreateCronJobModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { DeleteCronJobModal } from \"@/components/delete-modals\";\nimport { EditCronJobModal } from \"@/components/EditCronJobModal\";\nimport { CreateCronJobModal } from \"@/components/CreateCronJobModal\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport { useRunSelection } from \"@/hooks/useRunSelection\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\n\ntype CronJob = {\n id: string;\n name?: string;\n enabled?: boolean;\n schedule?: { kind?: string; expr?: string; everyMs?: number; tz?: string };\n state?: { nextRunAtMs?: number };\n agentId?: string;\n sessionTarget?: string;\n sessionKey?: string;\n // Optional enrichment from the API (which team/agent it belongs to)\n scope?: { kind: \"team\" | \"agent\"; id: string; label: string; href: string };\n};\n\nfunction fmtSchedule(s?: CronJob[\"schedule\"]): string {\n if (!s) return \"\";\n if (s.kind === \"cron\" && s.expr) return s.expr;\n if (s.kind === \"every\" && s.everyMs) {\n const mins = Math.round(s.everyMs / 60000);\n return mins >= 60 ? `every ${Math.round(mins / 60)}h` : `every ${mins}m`;\n }\n return s.kind ?? \"\";\n}\n\nfunction isEnabled(j: CronJob): boolean {\n // Some responses put enabled under state.enabled.\n return Boolean(j.enabled ?? (j as { state?: { enabled?: unknown } }).state?.enabled);\n}\n\nexport default function CronJobsClient({ teamId }: { teamId: string | null }) {\n const toast = useToast();\n const teamFilter = (teamId ?? \"\").trim();\n const [loading, setLoading] = useState(false);\n const [jobs, setJobs] = useState<CronJob[]>([]);\n const [msg, setMsg] = useState<string>(\"\");\n const [expandedId, setExpandedId] = useState<string | null>(null);\n const [statusFilter, setStatusFilter] = useState<\"all\" | \"enabled\" | \"disabled\">(\"all\");\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [deleteLabel, setDeleteLabel] = useState<string>(\"\");\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [editOpen, setEditOpen] = useState(false);\n const [editJob, setEditJob] = useState<CronJob | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n\n // Bulk action state\n type BulkAction = \"enable\" | \"disable\" | \"delete\";\n const [bulkModalAction, setBulkModalAction] = useState<BulkAction | null>(null);\n const [bulkConfirmed, setBulkConfirmed] = useState(false);\n type JobStatus = \"pending\" | \"in-progress\" | \"done\" | \"skipped\" | \"error\";\n const [bulkJobStatuses, setBulkJobStatuses] = useState<Map<string, { status: JobStatus; error?: string }>>(new Map());\n const [bulkRunning, setBulkRunning] = useState(false);\n\n const sorted = useMemo(() => {\n return [...jobs].sort((a, b) => {\n const ae = isEnabled(a);\n const be = isEnabled(b);\n if (ae !== be) return ae ? -1 : 1; // enabled first\n return String(a.name ?? \"\").localeCompare(String(b.name ?? \"\"));\n });\n }, [jobs]);\n\n const filtered = useMemo(() => {\n if (statusFilter === \"all\") return sorted;\n const wantEnabled = statusFilter === \"enabled\";\n return sorted.filter((j) => isEnabled(j) === wantEnabled);\n }, [sorted, statusFilter]);\n\n const visibleIds = useMemo(() => filtered.map((j) => j.id), [filtered]);\n const { selected, toggle, allSelected, toggleAll, clear, count } = useRunSelection(visibleIds);\n\n const selectedEnabledCount = useMemo(\n () => filtered.filter((j) => selected.has(j.id) && isEnabled(j)).length,\n [filtered, selected],\n );\n const selectedDisabledCount = useMemo(\n () => filtered.filter((j) => selected.has(j.id) && !isEnabled(j)).length,\n [filtered, selected],\n );\n\n function openBulkModal(action: BulkAction) {\n setBulkConfirmed(false);\n setBulkJobStatuses(new Map());\n setBulkRunning(false);\n setBulkModalAction(action);\n }\n\n function closeBulkModal() {\n if (bulkRunning) return; // don't close while processing\n setBulkModalAction(null);\n setBulkConfirmed(false);\n setBulkJobStatuses(new Map());\n }\n\n /** Return the label shown for a job in the progress list. */\n function jobLabel(id: string): string {\n const j = jobs.find((x) => x.id === id);\n return j?.name ?? id;\n }\n\n /** Which jobs to actually act on (skip already-in-desired-state). */\n function bulkTargetIds(): { actionable: string[]; skipped: string[] } {\n const ids = Array.from(selected);\n if (!bulkModalAction || bulkModalAction === \"delete\") return { actionable: ids, skipped: [] };\n const wantEnabled = bulkModalAction === \"enable\";\n const actionable: string[] = [];\n const skipped: string[] = [];\n for (const id of ids) {\n const j = jobs.find((x) => x.id === id);\n if (j && isEnabled(j) === wantEnabled) skipped.push(id);\n else actionable.push(id);\n }\n return { actionable, skipped };\n }\n\n async function confirmBulkAction() {\n if (!bulkModalAction) return;\n setBulkConfirmed(true);\n setBulkRunning(true);\n\n const { actionable, skipped } = bulkTargetIds();\n\n // Initialize statuses\n const initial = new Map<string, { status: JobStatus; error?: string }>();\n for (const id of actionable) initial.set(id, { status: \"pending\" });\n for (const id of skipped) initial.set(id, { status: \"skipped\" });\n setBulkJobStatuses(new Map(initial));\n\n const actionLabel = bulkModalAction;\n let doneCount = 0;\n let errCount = 0;\n\n for (const id of actionable) {\n // Mark in-progress\n setBulkJobStatuses((prev) => {\n const next = new Map(prev);\n next.set(id, { status: \"in-progress\" });\n return next;\n });\n\n try {\n if (actionLabel === \"delete\") {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id }),\n });\n if (!json.ok) throw new Error(json.error || \"Delete failed\");\n } else {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action: actionLabel }),\n });\n if (!json.ok) throw new Error(json.error || `${actionLabel} failed`);\n }\n doneCount++;\n setBulkJobStatuses((prev) => {\n const next = new Map(prev);\n next.set(id, { status: \"done\" });\n return next;\n });\n } catch (e: unknown) {\n errCount++;\n setBulkJobStatuses((prev) => {\n const next = new Map(prev);\n next.set(id, { status: \"error\", error: errorMessage(e) });\n return next;\n });\n }\n }\n\n setBulkRunning(false);\n\n const verb = actionLabel === \"delete\" ? \"Deleted\" : actionLabel === \"enable\" ? \"Enabled\" : \"Disabled\";\n if (errCount === 0) {\n toast.push({ kind: \"success\", message: `${verb} ${doneCount} cron job${doneCount !== 1 ? \"s\" : \"\"}.` });\n } else {\n toast.push({ kind: \"error\", message: `${verb} ${doneCount}, ${errCount} failed.` });\n }\n clear();\n await refresh();\n }\n\n const liveEditJob = useMemo(() => {\n if (!editJob) return null;\n return jobs.find((job) => job.id === editJob.id) ?? editJob;\n }, [jobs, editJob]);\n\n async function refresh() {\n setLoading(true);\n setMsg(\"\");\n try {\n const url = teamFilter ? `/api/cron/jobs?teamId=${encodeURIComponent(teamFilter)}` : \"/api/cron/jobs\";\n const json = await fetchJson<{ jobs?: CronJob[] }>(url, { cache: \"no-store\" });\n setJobs(json.jobs ?? []);\n if ((json.jobs ?? []).length === 0) {\n setMsg(\"No cron jobs found.\");\n }\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n setJobs([]);\n } finally {\n setLoading(false);\n }\n }\n\n useEffect(() => {\n refresh();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- refresh closes over teamFilter\n }, [teamFilter]);\n\n async function act(id: string, action: \"enable\" | \"disable\" | \"run\") {\n setLoading(true);\n setMsg(\"\");\n try {\n await fetchJson(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action }),\n });\n setMsg(action === \"run\" ? \"Triggered run.\" : \"Updated.\");\n await refresh();\n } catch (e: unknown) {\n setMsg(errorMessage(e));\n } finally {\n setLoading(false);\n }\n }\n\n function openDelete(job: CronJob) {\n setDeleteId(job.id);\n setDeleteLabel(job.name ?? job.id);\n setDeleteError(null);\n setDeleteOpen(true);\n }\n\n function openEdit(job: CronJob) {\n setEditJob(job);\n setEditOpen(true);\n }\n\n async function confirmDelete() {\n setDeleteBusy(true);\n setDeleteError(null);\n try {\n const json = await fetchJson<{ ok?: boolean; error?: string }>(\"/api/cron/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n if (!json.ok) throw new Error(json.error || \"Delete failed\");\n toast.push({ kind: \"success\", message: `Removed cron job: ${deleteLabel}` });\n setDeleteOpen(false);\n await refresh();\n } catch (e: unknown) {\n const msg = errorMessage(e);\n setDeleteError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setDeleteBusy(false);\n }\n }\n\n return (\n <>\n <div>\n <div className=\"ck-card p-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {filtered.length > 0 && (\n <input\n type=\"checkbox\"\n checked={allSelected && filtered.length > 0}\n onChange={toggleAll}\n className=\"accent-[var(--ck-accent-red)]\"\n aria-label=\"Select all cron jobs\"\n />\n )}\n <div>\n <h2 className=\"text-lg font-semibold\">All Cron Jobs</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n {loading && jobs.length === 0\n ? \"Loading…\"\n : statusFilter !== \"all\"\n ? `${filtered.length} of ${jobs.length} job${jobs.length !== 1 ? \"s\" : \"\"} (${statusFilter})`\n : `${jobs.length} job${jobs.length !== 1 ? \"s\" : \"\"} total · ${jobs.filter((j) => isEnabled(j)).length} enabled`}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <select\n value={statusFilter}\n onChange={(e) => setStatusFilter(e.target.value as \"all\" | \"enabled\" | \"disabled\")}\n className=\"rounded-lg border border-white/10 bg-white/5 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"all\">All</option>\n <option value=\"enabled\">Enabled</option>\n <option value=\"disabled\">Disabled</option>\n </select>\n <button\n type=\"button\"\n onClick={() => setCreateOpen(true)}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]\"\n >\n Create Job\n </button>\n <button\n type=\"button\"\n onClick={refresh}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Refresh\n </button>\n </div>\n </div>\n </div>\n\n {msg ? (\n <div className=\"mt-4 rounded-lg border border-white/10 bg-white/5 p-3 text-sm\">\n {msg}\n </div>\n ) : null}\n\n {loading && jobs.length === 0 ? (\n <div className=\"mt-6 ck-card flex items-center gap-3 px-4 py-6 text-sm text-[color:var(--ck-text-secondary)]\">\n <span className=\"inline-block h-2 w-2 animate-pulse rounded-full bg-[color:var(--ck-text-tertiary)]\" />\n Loading cron jobs…\n </div>\n ) : !loading && jobs.length === 0 ? (\n <div className=\"mt-6 ck-card px-4 py-6 text-sm text-[color:var(--ck-text-secondary)]\">\n No cron jobs{teamFilter ? ` installed by ${teamFilter}` : \"\"}.\n </div>\n ) : null}\n\n <div className=\"mt-6 space-y-3\">\n {filtered.map((j) => (\n <div key={j.id} className=\"ck-card px-4 py-3\">\n <div className=\"flex items-start gap-3\">\n <input\n type=\"checkbox\"\n checked={selected.has(j.id)}\n onChange={() => toggle(j.id)}\n className=\"mt-1.5 shrink-0 accent-[var(--ck-accent-red)]\"\n aria-label={`Select ${j.name ?? j.id}`}\n />\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => setExpandedId((cur) => (cur === j.id ? null : j.id))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setExpandedId((cur) => (cur === j.id ? null : j.id));\n }\n }}\n className=\"min-w-0 flex-1 cursor-pointer text-left\"\n >\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"truncate font-medium\">{j.name ?? j.id}</div>\n <div className=\"mt-1 flex flex-wrap gap-x-3 text-xs text-[color:var(--ck-text-secondary)]\">\n <span>{fmtSchedule(j.schedule)}</span>\n <span>{isEnabled(j) ? \"✅ enabled\" : \"⏸ disabled\"}</span>\n {j.agentId ? <span>agent: {j.agentId}</span> : null}\n {j.scope ? (\n <span>\n {j.scope.kind}: {\" \"}\n <a\n className=\"underline hover:no-underline\"\n href={j.scope.href}\n onClick={(e) => e.stopPropagation()}\n >\n {j.scope.label}\n </a>\n </span>\n ) : null}\n {j.sessionTarget ? <span>target: {j.sessionTarget}</span> : null}\n {j.state?.nextRunAtMs ? <span>next: {new Date(j.state.nextRunAtMs).toLocaleString()}</span> : null}\n </div>\n </div>\n\n <div className=\"flex gap-2\" onClick={(e) => e.stopPropagation()}>\n <button\n type=\"button\"\n onClick={() => openEdit(j)}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10\"\n >\n Edit\n </button>\n <button\n type=\"button\"\n onClick={() => act(j.id, isEnabled(j) ? \"disable\" : \"enable\")}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10\"\n >\n {isEnabled(j) ? \"Disable\" : \"Enable\"}\n </button>\n <button\n type=\"button\"\n onClick={() => act(j.id, \"run\")}\n disabled={loading}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]\"\n >\n Run now\n </button>\n <button\n type=\"button\"\n title={isEnabled(j) ? \"Disable this job before deleting.\" : \"Delete cron job\"}\n onClick={() => openDelete(j)}\n disabled={loading || isEnabled(j)}\n className=\"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-40\"\n >\n Delete\n </button>\n </div>\n </div>\n </div>\n </div>\n\n {expandedId === j.id ? (\n <pre className=\"mt-3 overflow-x-auto rounded-lg border border-white/10 bg-white/5 p-3 text-xs text-[color:var(--ck-text-primary)]\">\n {JSON.stringify(j, null, 2)}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n </div>\n\n {count > 0 && (\n <div className=\"sticky bottom-4 mt-4 flex items-center justify-between rounded-xl border border-white/10 bg-black/80 backdrop-blur-md px-4 py-3 shadow-lg\">\n <span className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n {count} job{count !== 1 ? \"s\" : \"\"} selected\n </span>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={clear}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Clear\n </button>\n {selectedDisabledCount > 0 && (\n <button\n type=\"button\"\n onClick={() => openBulkModal(\"enable\")}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Enable{selectedDisabledCount < count ? ` (${selectedDisabledCount})` : \"\"}\n </button>\n )}\n {selectedEnabledCount > 0 && (\n <button\n type=\"button\"\n onClick={() => openBulkModal(\"disable\")}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Disable{selectedEnabledCount < count ? ` (${selectedEnabledCount})` : \"\"}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => openBulkModal(\"delete\")}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-1.5 text-xs font-medium text-white hover:bg-[var(--ck-accent-red-hover)]\"\n >\n Delete selected\n </button>\n </div>\n </div>\n )}\n\n <ConfirmationModal\n open={bulkModalAction !== null && !bulkConfirmed}\n onClose={closeBulkModal}\n title={\n bulkModalAction === \"delete\" ? \"Delete Cron Jobs\"\n : bulkModalAction === \"enable\" ? \"Enable Cron Jobs\"\n : \"Disable Cron Jobs\"\n }\n confirmLabel={\n bulkModalAction === \"delete\" ? \"Delete\"\n : bulkModalAction === \"enable\" ? \"Enable\"\n : \"Disable\"\n }\n onConfirm={confirmBulkAction}\n confirmButtonClassName={\n bulkModalAction === \"delete\"\n ? undefined\n : \"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n }\n >\n <p className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">\n {bulkModalAction === \"delete\" ? (\n <>\n Are you sure you want to permanently delete{\" \"}\n <strong className=\"text-[color:var(--ck-text-primary)]\">{count} cron job{count !== 1 ? \"s\" : \"\"}</strong>?\n This action cannot be undone.\n </>\n ) : bulkModalAction === \"enable\" ? (\n <>\n Enable{\" \"}\n <strong className=\"text-[color:var(--ck-text-primary)]\">{selectedDisabledCount} cron job{selectedDisabledCount !== 1 ? \"s\" : \"\"}</strong>?\n {selectedEnabledCount > 0 && (\n <span> ({selectedEnabledCount} already enabled will be skipped.)</span>\n )}\n </>\n ) : (\n <>\n Disable{\" \"}\n <strong className=\"text-[color:var(--ck-text-primary)]\">{selectedEnabledCount} cron job{selectedEnabledCount !== 1 ? \"s\" : \"\"}</strong>?\n {selectedDisabledCount > 0 && (\n <span> ({selectedDisabledCount} already disabled will be skipped.)</span>\n )}\n </>\n )}\n </p>\n </ConfirmationModal>\n\n {/* Live progress modal */}\n {bulkModalAction !== null && bulkConfirmed && (\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" aria-hidden=\"true\" />\n <div className=\"fixed inset-0 overflow-y-auto\" role=\"dialog\" aria-modal=\"true\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-soft)] p-5 shadow-[var(--ck-shadow-2)]\">\n <h2 className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">\n {bulkModalAction === \"delete\" ? \"Deleting\" : bulkModalAction === \"enable\" ? \"Enabling\" : \"Disabling\"} Cron Jobs\n </h2>\n <div className=\"mt-4 max-h-80 space-y-1 overflow-y-auto rounded-lg border border-white/10 bg-black/30 p-3 font-mono text-xs\">\n {Array.from(bulkJobStatuses.entries()).map(([id, { status, error }]) => (\n <div key={id} className=\"flex items-center gap-2\">\n <span className=\"shrink-0 w-4 text-center\">\n {status === \"pending\" && <span className=\"text-[color:var(--ck-text-tertiary)]\">·</span>}\n {status === \"in-progress\" && <span className=\"text-yellow-400 animate-pulse\">▸</span>}\n {status === \"done\" && <span className=\"text-green-400\">✓</span>}\n {status === \"skipped\" && <span className=\"text-[color:var(--ck-text-tertiary)]\">–</span>}\n {status === \"error\" && <span className=\"text-red-400\">✗</span>}\n </span>\n <span className={\n status === \"done\" ? \"text-green-400\"\n : status === \"in-progress\" ? \"text-yellow-400\"\n : status === \"error\" ? \"text-red-400\"\n : \"text-[color:var(--ck-text-tertiary)]\"\n }>\n {jobLabel(id)}\n </span>\n <span className=\"ml-auto shrink-0 text-[10px]\">\n {status === \"pending\" && \"\"}\n {status === \"in-progress\" && (\n <span className=\"text-yellow-400\">\n {bulkModalAction === \"delete\" ? \"deleting...\" : bulkModalAction === \"enable\" ? \"enabling...\" : \"disabling...\"}\n </span>\n )}\n {status === \"done\" && (\n <span className=\"text-green-400\">\n {bulkModalAction === \"delete\" ? \"deleted\" : bulkModalAction === \"enable\" ? \"enabled\" : \"disabled\"}\n </span>\n )}\n {status === \"skipped\" && (\n <span className=\"text-[color:var(--ck-text-tertiary)]\">\n already {bulkModalAction === \"enable\" ? \"enabled\" : \"disabled\"}\n </span>\n )}\n {status === \"error\" && (\n <span className=\"text-red-400\" title={error}>{error ?? \"failed\"}</span>\n )}\n </span>\n </div>\n ))}\n </div>\n <div className=\"mt-4 flex items-center justify-end\">\n <button\n type=\"button\"\n disabled={bulkRunning}\n onClick={closeBulkModal}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-40\"\n >\n {bulkRunning ? \"Processing...\" : \"Close\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n\n <DeleteCronJobModal\n open={deleteOpen}\n jobLabel={deleteLabel}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <EditCronJobModal\n job={liveEditJob}\n open={editOpen}\n onClose={() => setEditOpen(false)}\n onSaved={refresh}\n />\n\n <CreateCronJobModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n onCreated={refresh}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\nimport { CronJobForm } from \"@/components/CronJobForm\";\nimport { useCronJobForm } from \"@/hooks/useCronJobForm\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype CronJob = {\n id: string;\n name?: string;\n description?: string;\n enabled?: boolean;\n schedule?: {\n kind?: string;\n expr?: string;\n everyMs?: number;\n tz?: string;\n };\n delivery?: {\n mode?: string;\n channel?: string;\n to?: string;\n bestEffort?: boolean;\n };\n payload?: {\n kind?: string;\n text?: string;\n message?: string;\n model?: string;\n thinking?: string;\n timeoutSeconds?: number;\n };\n agentId?: string;\n sessionTarget?: string;\n sessionKey?: string;\n};\n\ninterface EditCronJobModalProps {\n job: CronJob | null;\n open: boolean;\n onClose: () => void;\n onSaved: () => void;\n}\n\nexport function EditCronJobModal({ job, open, onClose, onSaved }: EditCronJobModalProps) {\n const {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n buildPayload,\n } = useCronJobForm();\n\n // Populate form when job changes\n useEffect(() => {\n if (job) {\n const everyMs = job.schedule?.everyMs;\n let everyValue = 60;\n let everyUnit: \"s\" | \"m\" | \"h\" | \"d\";\n \n if (everyMs) {\n if (everyMs % 86400000 === 0) {\n everyValue = everyMs / 86400000;\n everyUnit = \"d\";\n } else if (everyMs % 3600000 === 0) {\n everyValue = everyMs / 3600000;\n everyUnit = \"h\";\n } else if (everyMs % 60000 === 0) {\n everyValue = everyMs / 60000;\n everyUnit = \"m\";\n } else {\n everyValue = everyMs / 1000;\n everyUnit = \"s\";\n }\n } else {\n everyUnit = \"m\";\n }\n\n // Update all form fields with job data\n updateField(\"name\", job.name || \"\");\n updateField(\"description\", job.description || \"\");\n updateField(\"enabled\", job.enabled ?? true);\n updateField(\"scheduleKind\", (job.schedule?.kind as \"cron\" | \"every\" | \"at\") || \"every\");\n updateField(\"cronExpr\", job.schedule?.expr || \"0 * * * *\");\n updateField(\"everyValue\", everyValue);\n updateField(\"everyUnit\", everyUnit);\n updateField(\"timezone\", job.schedule?.tz || \"\");\n updateField(\"deliveryMode\", (job.delivery?.mode as \"none\" | \"announce\") || \"none\");\n updateField(\"deliveryChannel\", job.delivery?.channel || \"\");\n updateField(\"deliveryTo\", job.delivery?.to || \"\");\n updateField(\"deliveryBestEffort\", job.delivery?.bestEffort ?? true);\n updateField(\"payloadKind\", (job.payload?.kind as \"systemEvent\" | \"agentTurn\") || \"agentTurn\");\n updateField(\"payloadText\", job.payload?.text || \"\");\n updateField(\"payloadMessage\", job.payload?.message || \"\");\n updateField(\"payloadModel\", job.payload?.model || \"\");\n updateField(\"payloadThinking\", job.payload?.thinking || \"\");\n updateField(\"payloadTimeout\", job.payload?.timeoutSeconds || 30);\n updateField(\"agentId\", job.agentId || \"\");\n updateField(\"sessionTarget\", job.sessionTarget || \"\");\n updateField(\"sessionKey\", job.sessionKey || \"\");\n }\n }, [job, updateField]);\n\n const handleSave = async () => {\n if (!job) return;\n \n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/edit\", {\n method: \"POST\",\n body: JSON.stringify({\n id: job.id,\n ...buildPayload(),\n }),\n });\n\n onSaved();\n onClose();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n const handleDelete = async () => {\n if (!job || !confirm(\"Are you sure you want to delete this cron job?\")) return;\n \n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/delete\", {\n method: \"POST\",\n body: JSON.stringify({ id: job.id }),\n });\n\n onSaved();\n onClose();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n if (!job) return null;\n\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title=\"Edit Cron Job\"\n error={error}\n confirmLabel=\"Save changes\"\n confirmBusyLabel=\"Saving…\"\n confirmDisabled={!formData.name}\n busy={loading}\n onConfirm={handleSave}\n >\n <div className=\"mt-4 max-h-[70vh] overflow-y-auto\">\n <CronJobForm formData={formData} updateField={updateField} />\n </div>\n\n <div className=\"mt-6 flex items-center justify-between gap-2 border-t border-white/10 pt-4\">\n <button\n type=\"button\"\n onClick={handleDelete}\n disabled={loading}\n className=\"rounded-lg border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-50\"\n >\n Delete job\n </button>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Tip: use dryRun=true to test safely.</div>\n </div>\n </ConfirmationModal>\n );\n}\n","import React from \"react\";\nimport { CronJobFormData } from \"@/hooks/useCronJobForm\";\n\ninterface CronJobFormProps {\n formData: CronJobFormData;\n updateField: <K extends keyof CronJobFormData>(field: K, value: CronJobFormData[K]) => void;\n}\n\nexport function CronJobForm({ formData, updateField }: CronJobFormProps) {\n return (\n <div className=\"space-y-4\">\n {/* Basic Info */}\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Name</span>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => updateField(\"name\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n placeholder=\"Job name\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent ID</span>\n <input\n type=\"text\"\n value={formData.agentId}\n onChange={(e) => updateField(\"agentId\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n placeholder=\"Agent ID\"\n />\n </label>\n </div>\n\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Description</span>\n <textarea\n value={formData.description}\n onChange={(e) => updateField(\"description\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n rows={2}\n placeholder=\"Optional description\"\n />\n </label>\n\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"enabled\"\n checked={formData.enabled}\n onChange={(e) => updateField(\"enabled\", e.target.checked)}\n className=\"h-4 w-4 rounded border-white/20 bg-white/5\"\n />\n <label htmlFor=\"enabled\" className=\"ml-2 text-sm font-medium text-[color:var(--ck-text-primary)]\">\n Enabled\n </label>\n </div>\n\n {/* Schedule */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Schedule</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Schedule Type</span>\n <select\n value={formData.scheduleKind}\n onChange={(e) => updateField(\"scheduleKind\", e.target.value as \"cron\" | \"every\" | \"at\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"every\">Every (interval)</option>\n <option value=\"cron\">Cron expression</option>\n <option value=\"at\">At specific time</option>\n </select>\n </label>\n\n {formData.scheduleKind === \"every\" && (\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Every</span>\n <input\n type=\"number\"\n value={formData.everyValue}\n onChange={(e) => updateField(\"everyValue\", Number(e.target.value))}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n min=\"1\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Unit</span>\n <select\n value={formData.everyUnit}\n onChange={(e) => updateField(\"everyUnit\", e.target.value as \"s\" | \"m\" | \"h\" | \"d\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"s\">Seconds</option>\n <option value=\"m\">Minutes</option>\n <option value=\"h\">Hours</option>\n <option value=\"d\">Days</option>\n </select>\n </label>\n </div>\n )}\n\n {formData.scheduleKind === \"cron\" && (\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Cron Expression</span>\n <input\n type=\"text\"\n value={formData.cronExpr}\n onChange={(e) => updateField(\"cronExpr\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"0 * * * *\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Timezone (optional)</span>\n <input\n type=\"text\"\n value={formData.timezone}\n onChange={(e) => updateField(\"timezone\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"UTC\"\n />\n </label>\n </div>\n )}\n\n {formData.scheduleKind === \"at\" && (\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">At Time (ISO 8601)</span>\n <input\n type=\"text\"\n value={formData.atValue}\n onChange={(e) => updateField(\"atValue\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"2024-01-01T00:00:00Z\"\n />\n </label>\n )}\n </div>\n\n {/* Payload */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Payload</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Payload Type</span>\n <select\n value={formData.payloadKind}\n onChange={(e) => updateField(\"payloadKind\", e.target.value as \"systemEvent\" | \"agentTurn\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"agentTurn\">Agent Turn</option>\n <option value=\"systemEvent\">System Event</option>\n </select>\n </label>\n\n {formData.payloadKind === \"systemEvent\" ? (\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Event Text</span>\n <textarea\n value={formData.payloadText}\n onChange={(e) => updateField(\"payloadText\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n rows={3}\n placeholder=\"System event message\"\n />\n </label>\n ) : (\n <div className=\"space-y-3\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Message</span>\n <textarea\n value={formData.payloadMessage}\n onChange={(e) => updateField(\"payloadMessage\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n rows={3}\n placeholder=\"Agent message\"\n />\n </label>\n \n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Model (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadModel}\n onChange={(e) => updateField(\"payloadModel\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Model ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Thinking (optional)</span>\n <input\n type=\"text\"\n value={formData.payloadThinking}\n onChange={(e) => updateField(\"payloadThinking\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Thinking level\"\n />\n </label>\n </div>\n \n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Timeout (seconds)</span>\n <input\n type=\"number\"\n value={formData.payloadTimeout}\n onChange={(e) => updateField(\"payloadTimeout\", Number(e.target.value))}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n min=\"1\"\n />\n </label>\n </div>\n )}\n </div>\n\n {/* Delivery */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Delivery</h4>\n \n <label className=\"block mb-3\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Delivery Mode</span>\n <select\n value={formData.deliveryMode}\n onChange={(e) => updateField(\"deliveryMode\", e.target.value as \"none\" | \"announce\")}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"none\">None</option>\n <option value=\"announce\">Announce</option>\n </select>\n </label>\n\n {formData.deliveryMode === \"announce\" && (\n <div className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Channel (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryChannel}\n onChange={(e) => updateField(\"deliveryChannel\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Channel ID\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">To (optional)</span>\n <input\n type=\"text\"\n value={formData.deliveryTo}\n onChange={(e) => updateField(\"deliveryTo\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Target\"\n />\n </label>\n </div>\n \n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id=\"bestEffort\"\n checked={formData.deliveryBestEffort}\n onChange={(e) => updateField(\"deliveryBestEffort\", e.target.checked)}\n className=\"h-4 w-4 rounded border-white/20 bg-white/5\"\n />\n <label htmlFor=\"bestEffort\" className=\"ml-2 text-sm text-[color:var(--ck-text-primary)]\">\n Best effort delivery\n </label>\n </div>\n </div>\n )}\n </div>\n\n {/* Advanced */}\n <div className=\"border-t border-white/10 pt-4\">\n <h4 className=\"font-medium text-[color:var(--ck-text-primary)] mb-3\">Advanced</h4>\n \n <div className=\"grid grid-cols-2 gap-4\">\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Session Target (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionTarget}\n onChange={(e) => updateField(\"sessionTarget\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Session target\"\n />\n </label>\n <label className=\"block\">\n <span className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Session Key (optional)</span>\n <input\n type=\"text\"\n value={formData.sessionKey}\n onChange={(e) => updateField(\"sessionKey\", e.target.value)}\n className=\"mt-2 block w-full rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"Session key\"\n />\n </label>\n </div>\n </div>\n </div>\n );\n}","import { useCallback, useState } from \"react\";\n\nexport interface CronJobFormData {\n name: string;\n description: string;\n enabled: boolean;\n scheduleKind: \"cron\" | \"every\" | \"at\";\n cronExpr: string;\n everyValue: number;\n everyUnit: \"s\" | \"m\" | \"h\" | \"d\";\n atValue: string;\n timezone: string;\n deliveryMode: \"none\" | \"announce\";\n deliveryChannel: string;\n deliveryTo: string;\n deliveryBestEffort: boolean;\n payloadKind: \"systemEvent\" | \"agentTurn\";\n payloadText: string;\n payloadMessage: string;\n payloadModel: string;\n payloadThinking: string;\n payloadTimeout: number;\n agentId: string;\n sessionTarget: string;\n sessionKey: string;\n}\n\nexport interface UseCronJobFormOptions {\n initialData?: Partial<CronJobFormData>;\n}\n\nexport function useCronJobForm(options: UseCronJobFormOptions = {}) {\n const [formData, setFormData] = useState<CronJobFormData>({\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n cronExpr: \"0 * * * *\",\n everyValue: 60,\n everyUnit: \"m\",\n atValue: \"\",\n timezone: \"\",\n deliveryMode: \"none\",\n deliveryChannel: \"\",\n deliveryTo: \"\",\n deliveryBestEffort: true,\n payloadKind: \"agentTurn\",\n payloadText: \"\",\n payloadMessage: \"\",\n payloadModel: \"\",\n payloadThinking: \"\",\n payloadTimeout: 30,\n agentId: \"\",\n sessionTarget: \"\",\n sessionKey: \"\",\n ...options.initialData,\n });\n\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const updateField = useCallback(\n <K extends keyof CronJobFormData>(field: K, value: CronJobFormData[K]) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n },\n [],\n );\n\n const reset = () => {\n setFormData({\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n cronExpr: \"0 * * * *\",\n everyValue: 60,\n everyUnit: \"m\",\n atValue: \"\",\n timezone: \"\",\n deliveryMode: \"none\",\n deliveryChannel: \"\",\n deliveryTo: \"\",\n deliveryBestEffort: true,\n payloadKind: \"agentTurn\",\n payloadText: \"\",\n payloadMessage: \"\",\n payloadModel: \"\",\n payloadThinking: \"\",\n payloadTimeout: 30,\n agentId: \"\",\n sessionTarget: \"\",\n sessionKey: \"\",\n ...options.initialData,\n });\n };\n\n const buildPayload = () => {\n const everyMs = formData.scheduleKind === \"every\" ? \n formData.everyValue * (\n formData.everyUnit === \"s\" ? 1000 : \n formData.everyUnit === \"m\" ? 60000 : \n formData.everyUnit === \"h\" ? 3600000 : \n 86400000\n ) : undefined;\n\n const schedule = formData.scheduleKind === \"cron\" \n ? { kind: \"cron\" as const, expr: formData.cronExpr, ...(formData.timezone ? { tz: formData.timezone } : {}) }\n : formData.scheduleKind === \"every\"\n ? { kind: \"every\" as const, everyMs: everyMs! }\n : { kind: \"at\" as const, at: formData.atValue };\n\n const delivery = formData.deliveryMode === \"none\" \n ? { mode: \"none\" as const }\n : { \n mode: \"announce\" as const, \n ...(formData.deliveryChannel ? { channel: formData.deliveryChannel } : {}),\n ...(formData.deliveryTo ? { to: formData.deliveryTo } : {}),\n bestEffort: formData.deliveryBestEffort \n };\n\n const payload = formData.payloadKind === \"systemEvent\"\n ? { kind: \"systemEvent\" as const, text: formData.payloadText }\n : { \n kind: \"agentTurn\" as const, \n message: formData.payloadMessage,\n ...(formData.payloadModel ? { model: formData.payloadModel } : {}),\n ...(formData.payloadThinking ? { thinking: formData.payloadThinking } : {}),\n timeoutSeconds: formData.payloadTimeout \n };\n\n return {\n name: formData.name,\n description: formData.description,\n enabled: formData.enabled,\n schedule,\n delivery,\n payload,\n agentId: formData.agentId,\n sessionTarget: formData.sessionTarget,\n sessionKey: formData.sessionKey,\n };\n };\n\n return {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n reset,\n buildPayload,\n };\n}","\"use client\";\n\nimport { Modal } from \"@/components/Modal\";\nimport { CronJobForm } from \"@/components/CronJobForm\";\nimport { useCronJobForm } from \"@/hooks/useCronJobForm\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { errorMessage } from \"@/lib/errors\";\n\ninterface CreateCronJobModalProps {\n open: boolean;\n onClose: () => void;\n onCreated: () => void;\n}\n\nexport function CreateCronJobModal({ open, onClose, onCreated }: CreateCronJobModalProps) {\n const {\n formData,\n loading,\n error,\n setLoading,\n setError,\n updateField,\n reset,\n buildPayload,\n } = useCronJobForm();\n\n const handleCreate = async () => {\n setLoading(true);\n setError(null);\n \n try {\n await fetchJson(\"/api/cron/add\", {\n method: \"POST\",\n body: JSON.stringify(buildPayload()),\n });\n\n onCreated();\n onClose();\n reset();\n } catch (err) {\n setError(errorMessage(err));\n } finally {\n setLoading(false);\n }\n };\n\n return (\n <Modal open={open} onClose={onClose} title=\"Create Cron Job\" size=\"lg\">\n <div className=\"max-h-[70vh] overflow-y-auto\">\n <CronJobForm formData={formData} updateField={updateField} />\n\n {error && (\n <div className=\"mt-4 rounded-lg border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n )}\n </div>\n\n <div className=\"mt-6 flex items-center justify-end gap-2 border-t border-white/10 pt-4\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={loading}\n className=\"rounded-lg border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleCreate}\n disabled={loading || !formData.name}\n className=\"rounded-lg bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {loading ? \"Creating...\" : \"Create Job\"}\n </button>\n </div>\n </Modal>\n );\n}"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- <!DOCTYPE html><!--p8YaBY0FwA86zQelkOQ_m--><html lang="en" data-theme="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/a683f58aaf4f41e9.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/8acd42df55d57556.js"/><script src="/_next/static/chunks/68a088aa49e6124a.js" async=""></script><script src="/_next/static/chunks/aebc3b6d791f68d2.js" async=""></script><script src="/_next/static/chunks/8aac543d98940eb3.js" async=""></script><script src="/_next/static/chunks/turbopack-bdd9478663f034d6.js" async=""></script><script src="/_next/static/chunks/f7f157ba542e1ae5.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/9c627cb11f73ac4c.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>ClawKitchen (0.5.12-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 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-soft)]/95 backdrop-blur-[var(--ck-glass-blur)] w-62"><div class="flex h-14 items-center border-b border-[color:var(--ck-border-subtle)] justify-between gap-2 px-3"><a class="text-sm font-semibold tracking-tight" title="Home" href="/">Claw Kitchen</a><button class="grid h-9 w-9 place-items-center rounded-lg text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/10 hover:text-[color:var(--ck-text-primary)]" title="Collapse sidebar"><svg viewBox="0 0 24 24" class="h-5 w-5" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="3"></rect><path d="M9 3v18"></path><path d="M14 14l-2-2 2-2"></path></svg></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-lg border border-white/10 bg-white/5 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-lg 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-lg 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-lg 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-lg 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-lg 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-lg 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-lg 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-lg 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://docs.clawkitchen.ai" target="_blank" rel="noreferrer" class="rounded-lg 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></div></aside><div class="min-w-0 flex-1"><main class="h-full overflow-auto px-6 py-5 lg:px-10"><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/8acd42df55d57556.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/f7f157ba542e1ae5.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/9c627cb11f73ac4c.js\"],\"default\"]\n:HL[\"/_next/static/chunks/a683f58aaf4f41e9.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"p8YaBY0FwA86zQelkOQ-m\",\"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/a683f58aaf4f41e9.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/f7f157ba542e1ae5.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{}],[\"$\",\"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.5.12-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><!--IDhQCme1GnI_fdSGoYAJ3--><html lang="en" data-theme="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/cc172eec0c47f311.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/8acd42df55d57556.js"/><script src="/_next/static/chunks/68a088aa49e6124a.js" async=""></script><script src="/_next/static/chunks/aebc3b6d791f68d2.js" async=""></script><script src="/_next/static/chunks/8aac543d98940eb3.js" async=""></script><script src="/_next/static/chunks/turbopack-bdd9478663f034d6.js" async=""></script><script src="/_next/static/chunks/f7f157ba542e1ae5.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/9c627cb11f73ac4c.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>ClawKitchen (0.5.13-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 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-soft)]/95 backdrop-blur-[var(--ck-glass-blur)] w-62"><div class="flex h-14 items-center border-b border-[color:var(--ck-border-subtle)] justify-between gap-2 px-3"><a class="text-sm font-semibold tracking-tight" title="Home" href="/">Claw Kitchen</a><button class="grid h-9 w-9 place-items-center rounded-lg text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/10 hover:text-[color:var(--ck-text-primary)]" title="Collapse sidebar"><svg viewBox="0 0 24 24" class="h-5 w-5" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="3"></rect><path d="M9 3v18"></path><path d="M14 14l-2-2 2-2"></path></svg></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-lg border border-white/10 bg-white/5 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-lg 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-lg 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-lg 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-lg 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-lg 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-lg 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-lg 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-lg 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://docs.clawkitchen.ai" target="_blank" rel="noreferrer" class="rounded-lg 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></div></aside><div class="min-w-0 flex-1"><main class="h-full overflow-auto px-6 py-5 lg:px-10"><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/8acd42df55d57556.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/f7f157ba542e1ae5.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/9c627cb11f73ac4c.js\"],\"default\"]\n:HL[\"/_next/static/chunks/cc172eec0c47f311.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"IDhQCme1GnI-fdSGoYAJ3\",\"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/cc172eec0c47f311.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/f7f157ba542e1ae5.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{}],[\"$\",\"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.5.13-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,2 +1,2 @@
1
- <!DOCTYPE html><!--p8YaBY0FwA86zQelkOQ_m--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/8acd42df55d57556.js"/><script src="/_next/static/chunks/68a088aa49e6124a.js" async=""></script><script src="/_next/static/chunks/aebc3b6d791f68d2.js" async=""></script><script src="/_next/static/chunks/8aac543d98940eb3.js" async=""></script><script src="/_next/static/chunks/turbopack-bdd9478663f034d6.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/0bd6498bda341889.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><link rel="manifest" href="/manifest.webmanifest"/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
- @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/8acd42df55d57556.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[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"p8YaBY0FwA86zQelkOQ-m\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"c:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"IconMark\"]\n6:null\na:[[\"$\",\"link\",\"0\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lc\",\"2\",{}]]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--IDhQCme1GnI_fdSGoYAJ3--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/8acd42df55d57556.js"/><script src="/_next/static/chunks/68a088aa49e6124a.js" async=""></script><script src="/_next/static/chunks/aebc3b6d791f68d2.js" async=""></script><script src="/_next/static/chunks/8aac543d98940eb3.js" async=""></script><script src="/_next/static/chunks/turbopack-bdd9478663f034d6.js" async=""></script><script src="/_next/static/chunks/ff1a16fafef87110.js" async=""></script><script src="/_next/static/chunks/0bd6498bda341889.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><link rel="manifest" href="/manifest.webmanifest"/><link rel="icon" href="/favicon.ico?favicon.0b3bf435.ico" sizes="256x256" type="image/x-icon"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
+ @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/8acd42df55d57556.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[39756,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"IDhQCme1GnI-fdSGoYAJ3\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"c:I[27201,[\"/_next/static/chunks/ff1a16fafef87110.js\",\"/_next/static/chunks/0bd6498bda341889.js\"],\"IconMark\"]\n6:null\na:[[\"$\",\"link\",\"0\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0b3bf435.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$Lc\",\"2\",{}]]\n"])</script></body></html>
@@ -1 +1 @@
1
- self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"VGuxVgdMfPePZ1MUWSwdj27uvaP+j5++0cDx8AqA16c=\"\n}"
1
+ self.__RSC_SERVER_MANIFEST="{\n \"node\": {},\n \"edge\": {},\n \"encryptionKey\": \"FOa5Ox04kXyHML7JhwP7oCDIu8nEyexqbLVNi5x2vpc=\"\n}"
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "node": {},
3
3
  "edge": {},
4
- "encryptionKey": "VGuxVgdMfPePZ1MUWSwdj27uvaP+j5++0cDx8AqA16c="
4
+ "encryptionKey": "FOa5Ox04kXyHML7JhwP7oCDIu8nEyexqbLVNi5x2vpc="
5
5
  }