@jiggai/kitchen 0.3.1 → 0.3.3

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 (307) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/server/app/_global-error.html +2 -2
  4. package/.next/server/app/_global-error.rsc +1 -1
  5. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  6. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  10. package/.next/server/app/_not-found.html +1 -1
  11. package/.next/server/app/_not-found.rsc +1 -1
  12. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  13. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  18. package/.next/server/app/channels.html +2 -2
  19. package/.next/server/app/channels.rsc +1 -1
  20. package/.next/server/app/channels.segments/_full.segment.rsc +1 -1
  21. package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
  22. package/.next/server/app/channels.segments/_index.segment.rsc +1 -1
  23. package/.next/server/app/channels.segments/_tree.segment.rsc +1 -1
  24. package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
  25. package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
  26. package/.next/server/app/cron-jobs.html +1 -1
  27. package/.next/server/app/cron-jobs.rsc +1 -1
  28. package/.next/server/app/cron-jobs.segments/_full.segment.rsc +1 -1
  29. package/.next/server/app/cron-jobs.segments/_head.segment.rsc +1 -1
  30. package/.next/server/app/cron-jobs.segments/_index.segment.rsc +1 -1
  31. package/.next/server/app/cron-jobs.segments/_tree.segment.rsc +1 -1
  32. package/.next/server/app/cron-jobs.segments/cron-jobs/__PAGE__.segment.rsc +1 -1
  33. package/.next/server/app/cron-jobs.segments/cron-jobs.segment.rsc +1 -1
  34. package/.next/server/app/goals/new.html +2 -2
  35. package/.next/server/app/goals/new.rsc +1 -1
  36. package/.next/server/app/goals/new.segments/_full.segment.rsc +1 -1
  37. package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
  38. package/.next/server/app/goals/new.segments/_index.segment.rsc +1 -1
  39. package/.next/server/app/goals/new.segments/_tree.segment.rsc +1 -1
  40. package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
  41. package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
  42. package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
  43. package/.next/server/app/goals.html +1 -1
  44. package/.next/server/app/goals.rsc +1 -1
  45. package/.next/server/app/goals.segments/_full.segment.rsc +1 -1
  46. package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
  47. package/.next/server/app/goals.segments/_index.segment.rsc +1 -1
  48. package/.next/server/app/goals.segments/_tree.segment.rsc +1 -1
  49. package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
  50. package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
  51. package/.next/server/app/settings.html +1 -1
  52. package/.next/server/app/settings.rsc +1 -1
  53. package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  54. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  55. package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  56. package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  57. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  58. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  59. package/.next/server/pages/404.html +1 -1
  60. package/.next/server/pages/500.html +2 -2
  61. package/package.json +1 -2
  62. package/src/app/HomeClient.tsx +0 -207
  63. package/src/app/agents/[agentId]/agent-editor-tabs.tsx +0 -298
  64. package/src/app/agents/[agentId]/agent-editor.tsx +0 -468
  65. package/src/app/agents/[agentId]/page.tsx +0 -32
  66. package/src/app/api/__tests__/agents-add-route.test.ts +0 -143
  67. package/src/app/api/__tests__/agents-file-route.test.ts +0 -117
  68. package/src/app/api/__tests__/agents-files-route.test.ts +0 -61
  69. package/src/app/api/__tests__/agents-id-route.test.ts +0 -104
  70. package/src/app/api/__tests__/agents-identity-route.test.ts +0 -92
  71. package/src/app/api/__tests__/agents-route.test.ts +0 -54
  72. package/src/app/api/__tests__/agents-skills-install-route.test.ts +0 -131
  73. package/src/app/api/__tests__/agents-skills-route.test.ts +0 -64
  74. package/src/app/api/__tests__/agents-update-route.test.ts +0 -95
  75. package/src/app/api/__tests__/channels-bindings-route.test.ts +0 -143
  76. package/src/app/api/__tests__/cron-delete-route.test.ts +0 -93
  77. package/src/app/api/__tests__/cron-job-route.test.ts +0 -78
  78. package/src/app/api/__tests__/cron-jobs-route.test.ts +0 -116
  79. package/src/app/api/__tests__/cron-recipe-installed-route.test.ts +0 -114
  80. package/src/app/api/__tests__/gateway-restart-route.test.ts +0 -36
  81. package/src/app/api/__tests__/goals-promote-route.test.ts +0 -200
  82. package/src/app/api/__tests__/goals-route.test.ts +0 -184
  83. package/src/app/api/__tests__/ids-check-route.test.ts +0 -188
  84. package/src/app/api/__tests__/marketplace-recipes-route.test.ts +0 -123
  85. package/src/app/api/__tests__/recipes-clone-route.test.ts +0 -221
  86. package/src/app/api/__tests__/recipes-delete-route.test.ts +0 -248
  87. package/src/app/api/__tests__/recipes-id-route.test.ts +0 -166
  88. package/src/app/api/__tests__/recipes-route.test.ts +0 -57
  89. package/src/app/api/__tests__/recipes-team-agents-route.test.ts +0 -135
  90. package/src/app/api/__tests__/scaffold-route.test.ts +0 -173
  91. package/src/app/api/__tests__/settings-cron-installation-route.test.ts +0 -82
  92. package/src/app/api/__tests__/skills-available-route.test.ts +0 -47
  93. package/src/app/api/__tests__/swarms-start-route.test.ts +0 -79
  94. package/src/app/api/__tests__/swarms-status-route.test.ts +0 -42
  95. package/src/app/api/__tests__/teams-file-route.test.ts +0 -129
  96. package/src/app/api/__tests__/teams-files-route.test.ts +0 -57
  97. package/src/app/api/__tests__/teams-meta-route.test.ts +0 -113
  98. package/src/app/api/__tests__/teams-orchestrator-install-route.test.ts +0 -66
  99. package/src/app/api/__tests__/teams-orchestrator-route.test.ts +0 -59
  100. package/src/app/api/__tests__/teams-remove-team-route.test.ts +0 -122
  101. package/src/app/api/__tests__/teams-skills-install-route.test.ts +0 -78
  102. package/src/app/api/__tests__/teams-skills-route.test.ts +0 -73
  103. package/src/app/api/__tests__/teams-workflow-runs-route.test.ts +0 -85
  104. package/src/app/api/__tests__/teams-workflows-route.test.ts +0 -110
  105. package/src/app/api/__tests__/tickets-move-route.test.ts +0 -60
  106. package/src/app/api/agents/[id]/route.ts +0 -83
  107. package/src/app/api/agents/add/route.ts +0 -114
  108. package/src/app/api/agents/file/route.ts +0 -45
  109. package/src/app/api/agents/files/route.ts +0 -23
  110. package/src/app/api/agents/identity/route.ts +0 -41
  111. package/src/app/api/agents/route.ts +0 -22
  112. package/src/app/api/agents/skills/install/route.ts +0 -34
  113. package/src/app/api/agents/skills/route.ts +0 -39
  114. package/src/app/api/agents/update/route.ts +0 -52
  115. package/src/app/api/channels/bindings/route.ts +0 -63
  116. package/src/app/api/cron/__tests__/helpers.test.ts +0 -164
  117. package/src/app/api/cron/delete/route.ts +0 -23
  118. package/src/app/api/cron/helpers.ts +0 -172
  119. package/src/app/api/cron/job/route.ts +0 -22
  120. package/src/app/api/cron/jobs/route.ts +0 -52
  121. package/src/app/api/cron/recipe-installed/route.ts +0 -65
  122. package/src/app/api/gateway/restart/route.ts +0 -20
  123. package/src/app/api/goals/[id]/promote/route.ts +0 -119
  124. package/src/app/api/goals/[id]/route.ts +0 -54
  125. package/src/app/api/goals/route.ts +0 -44
  126. package/src/app/api/ids/check/route.ts +0 -113
  127. package/src/app/api/marketplace/recipes/[slug]/route.ts +0 -16
  128. package/src/app/api/marketplace/recipes/route.ts +0 -22
  129. package/src/app/api/recipes/[id]/route.ts +0 -62
  130. package/src/app/api/recipes/clone/route.ts +0 -106
  131. package/src/app/api/recipes/custom-team/route.ts +0 -193
  132. package/src/app/api/recipes/delete/helpers.ts +0 -65
  133. package/src/app/api/recipes/delete/route.ts +0 -73
  134. package/src/app/api/recipes/route.ts +0 -21
  135. package/src/app/api/recipes/team-agents/__tests__/helpers.test.ts +0 -156
  136. package/src/app/api/recipes/team-agents/helpers.ts +0 -151
  137. package/src/app/api/recipes/team-agents/route.ts +0 -80
  138. package/src/app/api/scaffold/__tests__/helpers.test.ts +0 -186
  139. package/src/app/api/scaffold/helpers.ts +0 -214
  140. package/src/app/api/scaffold/route.ts +0 -95
  141. package/src/app/api/settings/cron-installation/route.ts +0 -58
  142. package/src/app/api/skills/available/route.ts +0 -23
  143. package/src/app/api/swarms/start/route.ts +0 -100
  144. package/src/app/api/swarms/status/route.ts +0 -31
  145. package/src/app/api/teams/[teamId]/tickets/assign/route.ts +0 -105
  146. package/src/app/api/teams/[teamId]/tickets/assignees/route.ts +0 -27
  147. package/src/app/api/teams/[teamId]/tickets/delete/route.ts +0 -55
  148. package/src/app/api/teams/[teamId]/tickets/move/route.ts +0 -70
  149. package/src/app/api/teams/[teamId]/tickets/move-to-goals/route.ts +0 -56
  150. package/src/app/api/teams/file/route.ts +0 -46
  151. package/src/app/api/teams/files/route.ts +0 -63
  152. package/src/app/api/teams/memory/route.ts +0 -250
  153. package/src/app/api/teams/meta/route.ts +0 -43
  154. package/src/app/api/teams/orchestrator/install/route.ts +0 -129
  155. package/src/app/api/teams/orchestrator/route.ts +0 -216
  156. package/src/app/api/teams/remove-team/route.ts +0 -37
  157. package/src/app/api/teams/skills/install/route.ts +0 -18
  158. package/src/app/api/teams/skills/route.ts +0 -25
  159. package/src/app/api/teams/workflow-runs/route.ts +0 -534
  160. package/src/app/api/teams/workflow-templates/route.ts +0 -71
  161. package/src/app/api/teams/workflows/route.ts +0 -55
  162. package/src/app/api/tickets/assign/route.ts +0 -94
  163. package/src/app/api/tickets/assignees/route.ts +0 -24
  164. package/src/app/api/tickets/move/route.ts +0 -69
  165. package/src/app/channels/channels-client.tsx +0 -271
  166. package/src/app/channels/page.tsx +0 -5
  167. package/src/app/cron-jobs/cron-jobs-client.tsx +0 -243
  168. package/src/app/cron-jobs/page.tsx +0 -34
  169. package/src/app/favicon.ico +0 -0
  170. package/src/app/global-error.tsx +0 -50
  171. package/src/app/globals.css +0 -153
  172. package/src/app/goals/[id]/goal-editor.tsx +0 -162
  173. package/src/app/goals/[id]/page.tsx +0 -6
  174. package/src/app/goals/goals-client.tsx +0 -201
  175. package/src/app/goals/new/page.tsx +0 -81
  176. package/src/app/goals/page.tsx +0 -10
  177. package/src/app/layout.tsx +0 -53
  178. package/src/app/manifest.ts +0 -15
  179. package/src/app/not-found.tsx +0 -8
  180. package/src/app/page.tsx +0 -33
  181. package/src/app/recipes/CreateAgentModal.tsx +0 -156
  182. package/src/app/recipes/CreateCustomTeamModal.tsx +0 -375
  183. package/src/app/recipes/CreateModalShell.tsx +0 -55
  184. package/src/app/recipes/CreateTeamModal.tsx +0 -91
  185. package/src/app/recipes/[id]/RecipeEditor/RecipeEditorCreateModal.tsx +0 -72
  186. package/src/app/recipes/[id]/RecipeEditor/RecipeEditorPanel.tsx +0 -216
  187. package/src/app/recipes/[id]/RecipeEditor/index.tsx +0 -271
  188. package/src/app/recipes/[id]/RecipeEditor/recipe-editor-utils.ts +0 -46
  189. package/src/app/recipes/[id]/RecipeEditor/types.ts +0 -52
  190. package/src/app/recipes/[id]/page.tsx +0 -37
  191. package/src/app/recipes/page.tsx +0 -101
  192. package/src/app/recipes/recipes-client.tsx +0 -620
  193. package/src/app/settings/page.tsx +0 -26
  194. package/src/app/settings/settings-client.tsx +0 -91
  195. package/src/app/teams/[teamId]/CloneTeamModal.tsx +0 -116
  196. package/src/app/teams/[teamId]/OrchestratorPanel.tsx +0 -255
  197. package/src/app/teams/[teamId]/OrchestratorSetupModal.tsx +0 -184
  198. package/src/app/teams/[teamId]/PublishChangesModal.tsx +0 -43
  199. package/src/app/teams/[teamId]/page.tsx +0 -49
  200. package/src/app/teams/[teamId]/team-editor/TeamAgentsTab.tsx +0 -145
  201. package/src/app/teams/[teamId]/team-editor/TeamCronTab.tsx +0 -72
  202. package/src/app/teams/[teamId]/team-editor/TeamFilesTab.tsx +0 -74
  203. package/src/app/teams/[teamId]/team-editor/TeamMemoryTab.tsx +0 -349
  204. package/src/app/teams/[teamId]/team-editor/TeamRecipeTab.tsx +0 -151
  205. package/src/app/teams/[teamId]/team-editor/TeamSkillsTab.tsx +0 -68
  206. package/src/app/teams/[teamId]/team-editor/index.tsx +0 -558
  207. package/src/app/teams/[teamId]/team-editor/team-editor-data.ts +0 -255
  208. package/src/app/teams/[teamId]/team-editor/team-editor-utils.ts +0 -78
  209. package/src/app/teams/[teamId]/team-editor/types.ts +0 -34
  210. package/src/app/teams/[teamId]/tickets/[ticket]/page.tsx +0 -35
  211. package/src/app/teams/[teamId]/tickets/page.tsx +0 -15
  212. package/src/app/teams/[teamId]/workflows/[workflowId]/WorkflowCanvas.tsx +0 -111
  213. package/src/app/teams/[teamId]/workflows/[workflowId]/page.tsx +0 -27
  214. package/src/app/teams/[teamId]/workflows/[workflowId]/workflows-editor-client.tsx +0 -1608
  215. package/src/app/teams/[teamId]/workflows/page.tsx +0 -40
  216. package/src/app/teams/[teamId]/workflows/workflows-client.tsx +0 -494
  217. package/src/app/tickets/TicketDetailClient.tsx +0 -147
  218. package/src/app/tickets/TicketsBoardClient.tsx +0 -200
  219. package/src/app/tickets/[ticket]/TicketAssignControl.tsx +0 -112
  220. package/src/app/tickets/[ticket]/page.tsx +0 -36
  221. package/src/app/tickets/page.tsx +0 -10
  222. package/src/components/AppShell.tsx +0 -286
  223. package/src/components/ConfirmationModal.tsx +0 -81
  224. package/src/components/DeleteEntityModal.tsx +0 -41
  225. package/src/components/ErrorBoundary.tsx +0 -70
  226. package/src/components/FileListWithOptionalToggle.tsx +0 -86
  227. package/src/components/GoalFormFields.tsx +0 -163
  228. package/src/components/ScaffoldOverlay.tsx +0 -78
  229. package/src/components/ThemeToggle.tsx +0 -53
  230. package/src/components/ToastProvider.tsx +0 -163
  231. package/src/components/__tests__/ConfirmationModal.test.tsx +0 -109
  232. package/src/components/__tests__/ErrorBoundary.test.tsx +0 -39
  233. package/src/components/__tests__/FileListWithOptionalToggle.test.tsx +0 -109
  234. package/src/components/__tests__/GoalFormFields.test.tsx +0 -117
  235. package/src/components/delete-modals.tsx +0 -59
  236. package/src/components/icons.tsx +0 -48
  237. package/src/lib/__tests__/agent-workspace.test.ts +0 -44
  238. package/src/lib/__tests__/agents.test.ts +0 -36
  239. package/src/lib/__tests__/api-route-helpers.test.ts +0 -188
  240. package/src/lib/__tests__/cron.test.ts +0 -45
  241. package/src/lib/__tests__/editor-utils.test.ts +0 -38
  242. package/src/lib/__tests__/errors.test.ts +0 -15
  243. package/src/lib/__tests__/exec.test.ts +0 -13
  244. package/src/lib/__tests__/fetch-json.test.ts +0 -118
  245. package/src/lib/__tests__/gateway.test.ts +0 -234
  246. package/src/lib/__tests__/goal-promote.test.ts +0 -39
  247. package/src/lib/__tests__/goals-client.test.ts +0 -26
  248. package/src/lib/__tests__/goals.test.ts +0 -275
  249. package/src/lib/__tests__/json.test.ts +0 -15
  250. package/src/lib/__tests__/kitchen-api.test.ts +0 -32
  251. package/src/lib/__tests__/marketplace.test.ts +0 -116
  252. package/src/lib/__tests__/openclaw.test.ts +0 -129
  253. package/src/lib/__tests__/paths.test.ts +0 -136
  254. package/src/lib/__tests__/poll.test.ts +0 -26
  255. package/src/lib/__tests__/recipe-clone.test.ts +0 -85
  256. package/src/lib/__tests__/recipe-team-agents.test.ts +0 -70
  257. package/src/lib/__tests__/recipes.test.ts +0 -199
  258. package/src/lib/__tests__/scaffold-client.test.ts +0 -106
  259. package/src/lib/__tests__/scaffold.test.ts +0 -64
  260. package/src/lib/__tests__/slugify.test.ts +0 -23
  261. package/src/lib/__tests__/tickets.test.ts +0 -158
  262. package/src/lib/__tests__/type-guards.test.ts +0 -18
  263. package/src/lib/__tests__/use-slugified-id.test.tsx +0 -120
  264. package/src/lib/agent-workspace.ts +0 -14
  265. package/src/lib/agents.ts +0 -17
  266. package/src/lib/api-route-helpers.ts +0 -157
  267. package/src/lib/cron.ts +0 -40
  268. package/src/lib/editor-utils.ts +0 -18
  269. package/src/lib/errors.ts +0 -7
  270. package/src/lib/exec.ts +0 -4
  271. package/src/lib/fetch-json.ts +0 -29
  272. package/src/lib/gateway.ts +0 -100
  273. package/src/lib/goal-promote.ts +0 -27
  274. package/src/lib/goals-client.ts +0 -69
  275. package/src/lib/goals.ts +0 -171
  276. package/src/lib/json.ts +0 -10
  277. package/src/lib/kitchen-api.ts +0 -19
  278. package/src/lib/marketplace.ts +0 -46
  279. package/src/lib/openclaw.ts +0 -59
  280. package/src/lib/paths.ts +0 -69
  281. package/src/lib/poll.ts +0 -18
  282. package/src/lib/recipe-clone.ts +0 -42
  283. package/src/lib/recipe-team-agents.ts +0 -30
  284. package/src/lib/recipes.ts +0 -95
  285. package/src/lib/scaffold-client.ts +0 -31
  286. package/src/lib/scaffold.ts +0 -37
  287. package/src/lib/slugify.ts +0 -25
  288. package/src/lib/swarms.ts +0 -25
  289. package/src/lib/tickets.ts +0 -192
  290. package/src/lib/type-guards.ts +0 -3
  291. package/src/lib/use-slugified-id.ts +0 -35
  292. package/src/lib/workflows/README.md +0 -11
  293. package/src/lib/workflows/__tests__/storage.test.ts +0 -129
  294. package/src/lib/workflows/__tests__/validate.test.ts +0 -92
  295. package/src/lib/workflows/api-handlers.ts +0 -35
  296. package/src/lib/workflows/readdir.ts +0 -23
  297. package/src/lib/workflows/runs-storage.ts +0 -59
  298. package/src/lib/workflows/runs-types.ts +0 -42
  299. package/src/lib/workflows/storage.ts +0 -70
  300. package/src/lib/workflows/templates/index.ts +0 -1
  301. package/src/lib/workflows/templates/marketing-cadence-v1.ts +0 -142
  302. package/src/lib/workflows/types.ts +0 -48
  303. package/src/lib/workflows/validate.ts +0 -92
  304. package/src/proxy.ts +0 -28
  305. /package/.next/static/{z86RoqzzXXrWnpi229zP6 → Jrrrm9HH5bKkSrQhe1j93}/_buildManifest.js +0 -0
  306. /package/.next/static/{z86RoqzzXXrWnpi229zP6 → Jrrrm9HH5bKkSrQhe1j93}/_clientMiddlewareManifest.json +0 -0
  307. /package/.next/static/{z86RoqzzXXrWnpi229zP6 → Jrrrm9HH5bKkSrQhe1j93}/_ssgManifest.js +0 -0
@@ -1,243 +0,0 @@
1
- "use client";
2
-
3
- import { useEffect, useMemo, useState } from "react";
4
- import { useToast } from "@/components/ToastProvider";
5
- import { DeleteCronJobModal } from "@/components/delete-modals";
6
- import { errorMessage } from "@/lib/errors";
7
- import { fetchJson } from "@/lib/fetch-json";
8
-
9
- type CronJob = {
10
- id: string;
11
- name?: string;
12
- enabled?: boolean;
13
- schedule?: { kind?: string; expr?: string; everyMs?: number; tz?: string };
14
- state?: { nextRunAtMs?: number };
15
- agentId?: string;
16
- sessionTarget?: string;
17
- // Optional enrichment from the API (which team/agent it belongs to)
18
- scope?: { kind: "team" | "agent"; id: string; label: string; href: string };
19
- };
20
-
21
- function fmtSchedule(s?: CronJob["schedule"]): string {
22
- if (!s) return "";
23
- if (s.kind === "cron" && s.expr) return s.expr;
24
- if (s.kind === "every" && s.everyMs) {
25
- const mins = Math.round(s.everyMs / 60000);
26
- return mins >= 60 ? `every ${Math.round(mins / 60)}h` : `every ${mins}m`;
27
- }
28
- return s.kind ?? "";
29
- }
30
-
31
- function isEnabled(j: CronJob): boolean {
32
- // Some responses put enabled under state.enabled.
33
- return Boolean(j.enabled ?? (j as { state?: { enabled?: unknown } }).state?.enabled);
34
- }
35
-
36
- export default function CronJobsClient() {
37
- const toast = useToast();
38
- const [loading, setLoading] = useState(false);
39
- const [jobs, setJobs] = useState<CronJob[]>([]);
40
- const [msg, setMsg] = useState<string>("");
41
- const [expandedId, setExpandedId] = useState<string | null>(null);
42
-
43
- const [deleteOpen, setDeleteOpen] = useState(false);
44
- const [deleteId, setDeleteId] = useState<string>("");
45
- const [deleteLabel, setDeleteLabel] = useState<string>("");
46
- const [deleteBusy, setDeleteBusy] = useState(false);
47
- const [deleteError, setDeleteError] = useState<string | null>(null);
48
-
49
- const sorted = useMemo(() => {
50
- return [...jobs].sort((a, b) => {
51
- const ae = isEnabled(a);
52
- const be = isEnabled(b);
53
- if (ae !== be) return ae ? -1 : 1; // enabled first
54
- return String(a.name ?? "").localeCompare(String(b.name ?? ""));
55
- });
56
- }, [jobs]);
57
-
58
- async function refresh() {
59
- setLoading(true);
60
- setMsg("");
61
- try {
62
- const json = await fetchJson<{ jobs?: CronJob[] }>("/api/cron/jobs", { cache: "no-store" });
63
- setJobs(json.jobs ?? []);
64
- if ((json.jobs ?? []).length === 0) {
65
- setMsg("No cron jobs found.");
66
- }
67
- } catch (e: unknown) {
68
- setMsg(errorMessage(e));
69
- setJobs([]);
70
- } finally {
71
- setLoading(false);
72
- }
73
- }
74
-
75
- useEffect(() => {
76
- refresh();
77
- }, []);
78
-
79
- async function act(id: string, action: "enable" | "disable" | "run") {
80
- setLoading(true);
81
- setMsg("");
82
- try {
83
- await fetchJson("/api/cron/job", {
84
- method: "POST",
85
- headers: { "content-type": "application/json" },
86
- body: JSON.stringify({ id, action }),
87
- });
88
- setMsg(action === "run" ? "Triggered run." : "Updated.");
89
- await refresh();
90
- } catch (e: unknown) {
91
- setMsg(errorMessage(e));
92
- } finally {
93
- setLoading(false);
94
- }
95
- }
96
-
97
- function openDelete(job: CronJob) {
98
- setDeleteId(job.id);
99
- setDeleteLabel(job.name ?? job.id);
100
- setDeleteError(null);
101
- setDeleteOpen(true);
102
- }
103
-
104
- async function confirmDelete() {
105
- setDeleteBusy(true);
106
- setDeleteError(null);
107
- try {
108
- const json = await fetchJson<{ ok?: boolean; error?: string }>("/api/cron/delete", {
109
- method: "POST",
110
- headers: { "content-type": "application/json" },
111
- body: JSON.stringify({ id: deleteId }),
112
- });
113
- if (!json.ok) throw new Error(json.error || "Delete failed");
114
- toast.push({ kind: "success", message: `Removed cron job: ${deleteLabel}` });
115
- setDeleteOpen(false);
116
- await refresh();
117
- } catch (e: unknown) {
118
- const msg = errorMessage(e);
119
- setDeleteError(msg);
120
- toast.push({ kind: "error", message: msg });
121
- } finally {
122
- setDeleteBusy(false);
123
- }
124
- }
125
-
126
- return (
127
- <>
128
- <div>
129
- <div className="ck-glass-strong p-4">
130
- <div className="flex items-center justify-between">
131
- <div>
132
- <h2 className="text-lg font-semibold">All Cron Jobs</h2>
133
- <p className="mt-1 text-sm text-[color:var(--ck-text-secondary)]">
134
- {jobs.length} job{jobs.length !== 1 ? "s" : ""} total · {jobs.filter((j) => isEnabled(j)).length} enabled
135
- </p>
136
- </div>
137
- <button
138
- type="button"
139
- onClick={refresh}
140
- disabled={loading}
141
- className="rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15"
142
- >
143
- Refresh
144
- </button>
145
- </div>
146
- </div>
147
-
148
- {msg ? (
149
- <div className="mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm">
150
- {msg}
151
- </div>
152
- ) : null}
153
-
154
- <div className="mt-6 space-y-3">
155
- {sorted.map((j) => (
156
- <div key={j.id} className="ck-glass px-4 py-3">
157
- <div
158
- role="button"
159
- tabIndex={0}
160
- onClick={() => setExpandedId((cur) => (cur === j.id ? null : j.id))}
161
- onKeyDown={(e) => {
162
- if (e.key === "Enter" || e.key === " ") {
163
- e.preventDefault();
164
- setExpandedId((cur) => (cur === j.id ? null : j.id));
165
- }
166
- }}
167
- className="w-full cursor-pointer text-left"
168
- >
169
- <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
170
- <div className="min-w-0">
171
- <div className="truncate font-medium">{j.name ?? j.id}</div>
172
- <div className="mt-1 flex flex-wrap gap-x-3 text-xs text-[color:var(--ck-text-secondary)]">
173
- <span>{fmtSchedule(j.schedule)}</span>
174
- <span>{isEnabled(j) ? "✅ enabled" : "⏸ disabled"}</span>
175
- {j.agentId ? <span>agent: {j.agentId}</span> : null}
176
- {j.scope ? (
177
- <span>
178
- {j.scope.kind}: {" "}
179
- <a
180
- className="underline hover:no-underline"
181
- href={j.scope.href}
182
- onClick={(e) => e.stopPropagation()}
183
- >
184
- {j.scope.label}
185
- </a>
186
- </span>
187
- ) : null}
188
- {j.sessionTarget ? <span>target: {j.sessionTarget}</span> : null}
189
- {j.state?.nextRunAtMs ? <span>next: {new Date(j.state.nextRunAtMs).toLocaleString()}</span> : null}
190
- </div>
191
- </div>
192
-
193
- <div className="flex gap-2" onClick={(e) => e.stopPropagation()}>
194
- <button
195
- type="button"
196
- onClick={() => act(j.id, isEnabled(j) ? "disable" : "enable")}
197
- disabled={loading}
198
- className="rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium transition-colors hover:bg-white/10"
199
- >
200
- {isEnabled(j) ? "Disable" : "Enable"}
201
- </button>
202
- <button
203
- type="button"
204
- onClick={() => act(j.id, "run")}
205
- disabled={loading}
206
- className="rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)]"
207
- >
208
- Run now
209
- </button>
210
- <button
211
- type="button"
212
- title={isEnabled(j) ? "Disable this job before deleting." : "Delete cron job"}
213
- onClick={() => openDelete(j)}
214
- disabled={loading || isEnabled(j)}
215
- className="rounded-[var(--ck-radius-sm)] border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-40"
216
- >
217
- Delete
218
- </button>
219
- </div>
220
- </div>
221
- </div>
222
-
223
- {expandedId === j.id ? (
224
- <pre className="mt-3 overflow-x-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 text-xs text-[color:var(--ck-text-primary)]">
225
- {JSON.stringify(j, null, 2)}
226
- </pre>
227
- ) : null}
228
- </div>
229
- ))}
230
- </div>
231
- </div>
232
-
233
- <DeleteCronJobModal
234
- open={deleteOpen}
235
- jobLabel={deleteLabel}
236
- busy={deleteBusy}
237
- error={deleteError}
238
- onClose={() => setDeleteOpen(false)}
239
- onConfirm={confirmDelete}
240
- />
241
- </>
242
- );
243
- }
@@ -1,34 +0,0 @@
1
- import CronJobsClient from "./cron-jobs-client";
2
- import Link from "next/link";
3
-
4
- export default function CronJobsPage() {
5
- return (
6
- <div className="ck-glass w-full p-6 sm:p-8">
7
- <div className="flex items-baseline justify-between gap-4">
8
- <h1 className="text-2xl font-semibold tracking-tight">Cron Jobs (recipe-installed)</h1>
9
- <div className="flex gap-3">
10
- <Link
11
- href="/settings"
12
- className="text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]"
13
- >
14
- Settings
15
- </Link>
16
- <Link
17
- href="/"
18
- className="text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:text-[color:var(--ck-text-primary)]"
19
- >
20
- Home
21
- </Link>
22
- </div>
23
- </div>
24
- <p className="mt-2 text-sm text-[color:var(--ck-text-secondary)]">
25
- This page only shows cron jobs installed by recipes (based on the scaffold mapping file
26
- <code className="ml-1">notes/cron-jobs.json</code> in the team workspace).
27
- </p>
28
-
29
- <div className="mt-6">
30
- <CronJobsClient />
31
- </div>
32
- </div>
33
- );
34
- }
Binary file
@@ -1,50 +0,0 @@
1
- "use client";
2
-
3
- import { useEffect } from "react";
4
-
5
- // NOTE: Next.js renders this when the root layout (or anything above the segment
6
- // error boundary) throws. Keep it dependency-light: no AppShell / no router hooks.
7
- export default function GlobalError({
8
- error,
9
- reset,
10
- }: {
11
- error: Error & { digest?: string };
12
- reset: () => void;
13
- }) {
14
- useEffect(() => {
15
- console.error("Global error:", error);
16
- }, [error]);
17
-
18
- return (
19
- <html lang="en">
20
- <body className="min-h-screen bg-[color:var(--ck-bg)] text-[color:var(--ck-text-primary)]">
21
- <div className="mx-auto max-w-2xl px-6 py-16">
22
- <h1 className="text-xl font-semibold">Something went wrong</h1>
23
- <p className="mt-2 text-sm text-[color:var(--ck-text-secondary)]">
24
- An unexpected error occurred.
25
- </p>
26
-
27
- <pre className="mt-6 overflow-auto rounded-md border border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] p-4 text-xs text-[color:var(--ck-text-secondary)]">
28
- {String(error?.stack || error)}
29
- </pre>
30
-
31
- {error?.digest ? (
32
- <p className="mt-3 text-xs text-[color:var(--ck-text-secondary)]">
33
- Digest: {error.digest}
34
- </p>
35
- ) : null}
36
-
37
- <div className="mt-6 flex gap-3">
38
- <button
39
- type="button"
40
- onClick={() => reset()}
41
- className="rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-4 py-2 text-sm font-medium text-white"
42
- >
43
- Try again
44
- </button>
45
- </div>
46
- </div>
47
- </body>
48
- </html>
49
- );
50
- }
@@ -1,153 +0,0 @@
1
- @import "tailwindcss";
2
-
3
- /*
4
- Claw Kitchen UI tokens
5
- Goal: macOS Mission Control vibe — frosted glass surfaces, subtle depth,
6
- and system-red accents.
7
-
8
- Default theme: LIGHT (per ticket 0024).
9
- Dark theme is opt-in via [data-theme="dark"].
10
- */
11
- :root {
12
- /* Base colors (light) */
13
- --ck-bg-base: #f6f7fb;
14
- --ck-bg-glass: rgba(255, 255, 255, 0.70);
15
- --ck-bg-glass-strong: rgba(255, 255, 255, 0.86);
16
-
17
- /* Toasts (barely transparent in light mode) */
18
- --ck-toast-bg: rgba(255, 255, 255, 0.94);
19
- --ck-toast-border: rgba(10, 12, 16, 0.16);
20
-
21
- --ck-border-subtle: rgba(10, 12, 16, 0.10);
22
- --ck-border-strong: rgba(10, 12, 16, 0.16);
23
-
24
- --ck-text-primary: rgba(10, 12, 16, 0.92);
25
- --ck-text-secondary: rgba(10, 12, 16, 0.64);
26
- --ck-text-tertiary: rgba(10, 12, 16, 0.48);
27
-
28
- /* Accent (macOS-ish system red) */
29
- --ck-accent-red: #ff3b30;
30
- --ck-accent-red-hover: #ff5a52;
31
- --ck-accent-red-active: #e6372d;
32
-
33
- /* Focus ring */
34
- --ck-focus-ring: rgba(255, 59, 48, 0.55);
35
-
36
- /* Radii */
37
- --ck-radius-sm: 10px;
38
- --ck-radius-md: 14px;
39
- --ck-radius-lg: 18px;
40
-
41
- /* Elevation (lighter shadows) */
42
- --ck-shadow-1: 0 10px 30px rgba(10, 12, 16, 0.12);
43
- --ck-shadow-2: 0 18px 50px rgba(10, 12, 16, 0.18);
44
-
45
- /* Glass */
46
- --ck-glass-blur: 18px;
47
- --ck-glass-saturation: 1.15;
48
-
49
- /* Legacy mappings (Next starter defaults) */
50
- --background: var(--ck-bg-base);
51
- --foreground: var(--ck-text-primary);
52
- }
53
-
54
- [data-theme="dark"] {
55
- --ck-bg-base: #0b0c10;
56
- --ck-bg-glass: rgba(24, 25, 31, 0.72);
57
- --ck-bg-glass-strong: rgba(24, 25, 31, 0.88);
58
-
59
- /* Toasts (barely transparent in dark mode) */
60
- --ck-toast-bg: rgba(24, 25, 31, 0.92);
61
- --ck-toast-border: rgba(255, 255, 255, 0.18);
62
-
63
- --ck-border-subtle: rgba(255, 255, 255, 0.10);
64
- --ck-border-strong: rgba(255, 255, 255, 0.16);
65
-
66
- --ck-text-primary: rgba(255, 255, 255, 0.92);
67
- --ck-text-secondary: rgba(255, 255, 255, 0.66);
68
- --ck-text-tertiary: rgba(255, 255, 255, 0.50);
69
-
70
- --ck-focus-ring: rgba(255, 59, 48, 0.70);
71
-
72
- --ck-shadow-1: 0 10px 30px rgba(0, 0, 0, 0.35);
73
- --ck-shadow-2: 0 18px 50px rgba(0, 0, 0, 0.45);
74
-
75
- --ck-glass-saturation: 1.25;
76
- }
77
-
78
- @theme inline {
79
- --color-background: var(--background);
80
- --color-foreground: var(--foreground);
81
- --font-sans: var(--font-geist-sans);
82
- --font-mono: var(--font-geist-mono);
83
- }
84
-
85
- html,
86
- body {
87
- height: 100%;
88
- }
89
-
90
- body {
91
- background: var(--ck-bg-base);
92
- color: var(--ck-text-primary);
93
- font-family: var(--font-geist-sans), system-ui, -apple-system, Segoe UI, Roboto,
94
- Arial, Helvetica, sans-serif;
95
- }
96
-
97
- /* Wallpaper-like backdrop (kept subtle; readability first) */
98
- body::before {
99
- content: "";
100
- position: fixed;
101
- inset: 0;
102
- z-index: -1;
103
- background:
104
- radial-gradient(1200px 700px at 20% 15%, rgba(255, 59, 48, 0.10), transparent 60%),
105
- radial-gradient(900px 600px at 75% 25%, rgba(10, 12, 16, 0.05), transparent 55%),
106
- radial-gradient(1100px 700px at 55% 80%, rgba(120, 140, 255, 0.10), transparent 60%),
107
- linear-gradient(180deg, rgba(255, 255, 255, 0.55), rgba(255, 255, 255, 0));
108
- }
109
-
110
- [data-theme="dark"] body::before {
111
- background:
112
- radial-gradient(1200px 700px at 20% 15%, rgba(255, 59, 48, 0.14), transparent 60%),
113
- radial-gradient(900px 600px at 75% 25%, rgba(255, 255, 255, 0.08), transparent 55%),
114
- radial-gradient(1100px 700px at 55% 80%, rgba(120, 140, 255, 0.10), transparent 60%),
115
- linear-gradient(180deg, rgba(255, 255, 255, 0.02), rgba(0, 0, 0, 0));
116
- }
117
-
118
- /* Universal focus ring: ensures keyboard nav remains obvious on glass. */
119
- :where(a, button, input, textarea, select, summary, [role="button"], [tabindex]):focus-visible {
120
- outline: 2px solid var(--ck-focus-ring);
121
- outline-offset: 2px;
122
- }
123
-
124
- /* Glass surface utility classes (fallback-first) */
125
- .ck-glass {
126
- background: var(--ck-bg-glass);
127
- border: 1px solid var(--ck-border-subtle);
128
- border-radius: var(--ck-radius-md);
129
- box-shadow: var(--ck-shadow-1);
130
- transition: background-color 160ms ease-out, box-shadow 180ms ease-out, border-color 160ms ease-out;
131
- }
132
-
133
- @supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
134
- .ck-glass {
135
- -webkit-backdrop-filter: blur(var(--ck-glass-blur)) saturate(var(--ck-glass-saturation));
136
- backdrop-filter: blur(var(--ck-glass-blur)) saturate(var(--ck-glass-saturation));
137
- }
138
- }
139
-
140
- .ck-glass-strong {
141
- background: var(--ck-bg-glass-strong);
142
- border: 1px solid var(--ck-border-strong);
143
- border-radius: var(--ck-radius-md);
144
- box-shadow: var(--ck-shadow-2);
145
- transition: background-color 160ms ease-out, box-shadow 180ms ease-out, border-color 160ms ease-out;
146
- }
147
-
148
- @supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))) {
149
- .ck-glass-strong {
150
- -webkit-backdrop-filter: blur(calc(var(--ck-glass-blur) + 4px)) saturate(var(--ck-glass-saturation));
151
- backdrop-filter: blur(calc(var(--ck-glass-blur) + 4px)) saturate(var(--ck-glass-saturation));
152
- }
153
- }
@@ -1,162 +0,0 @@
1
- "use client";
2
-
3
- import Link from "next/link";
4
- import { GoalFormCard, GoalFormFields } from "@/components/GoalFormFields";
5
- import { errorMessage } from "@/lib/errors";
6
- import { fetchJson } from "@/lib/fetch-json";
7
- import { type GoalFrontmatter, type GoalStatus, useGoalFormState } from "@/lib/goals-client";
8
- import { useRouter } from "next/navigation";
9
- import { useCallback, useEffect, useState } from "react";
10
-
11
- export default function GoalEditor({ goalId }: { goalId: string }) {
12
- const router = useRouter();
13
- const [loading, setLoading] = useState(true);
14
- const [saving, setSaving] = useState(false);
15
- const [error, setError] = useState<string | null>(null);
16
- const [updatedAt, setUpdatedAt] = useState<string | null>(null);
17
-
18
- const { formState, tags, teams } = useGoalFormState();
19
- const { setTitle, setStatus, setTagsRaw, setTeamsRaw, setBody } = formState;
20
-
21
- const loadGoal = useCallback(async () => {
22
- setLoading(true);
23
- setError(null);
24
- try {
25
- const data = await fetchJson<{ goal: GoalFrontmatter; body: string }>(
26
- `/api/goals/${encodeURIComponent(goalId)}`,
27
- { cache: "no-store" }
28
- );
29
- const g = data.goal;
30
- setTitle(g.title ?? "");
31
- setStatus((g.status as GoalStatus) ?? "planned");
32
- setTagsRaw((g.tags ?? []).join(", "));
33
- setTeamsRaw((g.teams ?? []).join(", "));
34
- setBody(data.body ?? "");
35
- setUpdatedAt(g.updatedAt ?? null);
36
- } catch (e: unknown) {
37
- setError(errorMessage(e));
38
- } finally {
39
- setLoading(false);
40
- }
41
- }, [goalId, setTitle, setStatus, setTagsRaw, setTeamsRaw, setBody]);
42
-
43
- useEffect(() => {
44
- void loadGoal();
45
- }, [loadGoal]);
46
-
47
- async function save() {
48
- setSaving(true);
49
- setError(null);
50
- try {
51
- const data = await fetchJson<{ goal: GoalFrontmatter }>(
52
- `/api/goals/${encodeURIComponent(goalId)}`,
53
- {
54
- method: "PUT",
55
- headers: { "content-type": "application/json" },
56
- body: JSON.stringify({
57
- title: formState.title,
58
- status: formState.status,
59
- tags,
60
- teams,
61
- body: formState.body,
62
- }),
63
- }
64
- );
65
- setUpdatedAt(data.goal.updatedAt ?? null);
66
- router.push("/goals");
67
- } catch (e: unknown) {
68
- setError(errorMessage(e));
69
- } finally {
70
- setSaving(false);
71
- }
72
- }
73
-
74
- async function promoteToInbox() {
75
- setSaving(true);
76
- setError(null);
77
- try {
78
- await fetchJson(`/api/goals/${encodeURIComponent(goalId)}/promote`, {
79
- method: "POST",
80
- headers: { "content-type": "application/json" },
81
- body: JSON.stringify({}),
82
- });
83
- await loadGoal();
84
- } catch (e: unknown) {
85
- setError(errorMessage(e));
86
- } finally {
87
- setSaving(false);
88
- }
89
- }
90
-
91
- async function deleteThisGoal() {
92
- const ok = window.confirm(`Delete goal \"${goalId}\"? This will delete the markdown file.`);
93
- if (!ok) return;
94
-
95
- setSaving(true);
96
- setError(null);
97
- try {
98
- await fetchJson(`/api/goals/${encodeURIComponent(goalId)}`, { method: "DELETE" });
99
- router.push("/goals");
100
- } catch (e: unknown) {
101
- setError(errorMessage(e));
102
- } finally {
103
- setSaving(false);
104
- }
105
- }
106
-
107
- return (
108
- <div className="space-y-4">
109
- <div className="flex items-center justify-between gap-3">
110
- <Link href="/goals" className="text-sm font-medium hover:underline">
111
- ← Back
112
- </Link>
113
- <div className="text-xs text-[color:var(--ck-text-tertiary)] font-mono">{goalId}</div>
114
- </div>
115
-
116
- <GoalFormCard
117
- error={error}
118
- actions={
119
- <div className="flex flex-wrap items-center gap-3">
120
- <button
121
- onClick={() => void save()}
122
- disabled={saving || loading}
123
- className="rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white disabled:opacity-50"
124
- >
125
- {saving ? "Saving…" : "Save"}
126
- </button>
127
- <button
128
- onClick={() => void loadGoal()}
129
- disabled={saving}
130
- className="rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm"
131
- >
132
- Reload
133
- </button>
134
- <button
135
- onClick={() => void promoteToInbox()}
136
- disabled={saving || loading}
137
- className="rounded-[var(--ck-radius-sm)] border border-[color:var(--ck-border-subtle)] px-3 py-2 text-sm font-medium"
138
- >
139
- Promote to inbox
140
- </button>
141
- <button
142
- onClick={() => void deleteThisGoal()}
143
- disabled={saving || loading}
144
- className="rounded-[var(--ck-radius-sm)] border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)]"
145
- >
146
- Delete
147
- </button>
148
- </div>
149
- }
150
- >
151
- <GoalFormFields formState={formState} updatedAt={updatedAt} />
152
- </GoalFormCard>
153
-
154
- <div className="ck-glass p-6">
155
- <div className="text-sm font-medium">Preview</div>
156
- <pre className="mt-2 whitespace-pre-wrap break-words text-sm leading-6 text-[color:var(--ck-text-primary)]">{formState.body}</pre>
157
- </div>
158
-
159
- {loading ? <div className="text-sm text-[color:var(--ck-text-secondary)]">Loading…</div> : null}
160
- </div>
161
- );
162
- }
@@ -1,6 +0,0 @@
1
- import GoalEditor from "./goal-editor";
2
-
3
- export default async function GoalDetailPage({ params }: { params: Promise<{ id: string }> }) {
4
- const { id } = await params;
5
- return <GoalEditor goalId={id} />;
6
- }