@jiggai/kitchen 0.1.12 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1083) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +21 -0
  3. package/.next/build-manifest.json +6 -6
  4. package/.next/prerender-manifest.json +11 -6
  5. package/.next/routes-manifest.json +146 -0
  6. package/.next/server/app/_global-error/page/build-manifest.json +4 -4
  7. package/.next/server/app/_global-error/page.js +3 -3
  8. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  9. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/_global-error.html +2 -2
  11. package/.next/server/app/_global-error.rsc +2 -2
  12. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  14. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/.next/server/app/_not-found/page/build-manifest.json +4 -4
  18. package/.next/server/app/_not-found/page.js +10 -9
  19. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  20. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/_not-found.html +1 -1
  22. package/.next/server/app/_not-found.rsc +5 -5
  23. package/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
  24. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  26. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  29. package/.next/server/app/agents/[agentId]/page/build-manifest.json +4 -4
  30. package/.next/server/app/agents/[agentId]/page.js +8 -8
  31. package/.next/server/app/agents/[agentId]/page.js.nft.json +1 -1
  32. package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/agents/[id]/route.js +1 -1
  34. package/.next/server/app/api/agents/[id]/route.js.nft.json +1 -1
  35. package/.next/server/app/api/agents/add/route.js +1 -1
  36. package/.next/server/app/api/agents/add/route.js.nft.json +1 -1
  37. package/.next/server/app/api/agents/file/route.js +1 -1
  38. package/.next/server/app/api/agents/file/route.js.nft.json +1 -1
  39. package/.next/server/app/api/agents/files/route.js +1 -1
  40. package/.next/server/app/api/agents/files/route.js.nft.json +1 -1
  41. package/.next/server/app/api/agents/identity/route.js +1 -1
  42. package/.next/server/app/api/agents/identity/route.js.nft.json +1 -1
  43. package/.next/server/app/api/agents/route.js +1 -1
  44. package/.next/server/app/api/agents/route.js.nft.json +1 -1
  45. package/.next/server/app/api/agents/skills/install/route.js +1 -1
  46. package/.next/server/app/api/agents/skills/install/route.js.nft.json +1 -1
  47. package/.next/server/app/api/agents/skills/route.js +1 -1
  48. package/.next/server/app/api/agents/skills/route.js.nft.json +1 -1
  49. package/.next/server/app/api/agents/update/route.js +1 -1
  50. package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
  51. package/.next/server/app/api/channels/bindings/route.js +1 -1
  52. package/.next/server/app/api/channels/bindings/route.js.nft.json +1 -1
  53. package/.next/server/app/api/cron/delete/route.js +1 -1
  54. package/.next/server/app/api/cron/delete/route.js.nft.json +1 -1
  55. package/.next/server/app/api/cron/job/route.js +1 -1
  56. package/.next/server/app/api/cron/job/route.js.nft.json +1 -1
  57. package/.next/server/app/api/cron/jobs/route.js +1 -1
  58. package/.next/server/app/api/cron/jobs/route.js.nft.json +1 -1
  59. package/.next/server/app/api/cron/recipe-installed/route.js +1 -1
  60. package/.next/server/app/api/cron/recipe-installed/route.js.nft.json +1 -1
  61. package/.next/server/app/api/gateway/restart/route.js +1 -1
  62. package/.next/server/app/api/gateway/restart/route.js.nft.json +1 -1
  63. package/.next/server/app/api/goals/[id]/promote/route.js +1 -1
  64. package/.next/server/app/api/goals/[id]/promote/route.js.nft.json +1 -1
  65. package/.next/server/app/api/goals/[id]/route.js +1 -1
  66. package/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  67. package/.next/server/app/api/goals/route.js +1 -1
  68. package/.next/server/app/api/goals/route.js.nft.json +1 -1
  69. package/.next/server/app/api/ids/check/route.js +1 -1
  70. package/.next/server/app/api/ids/check/route.js.nft.json +1 -1
  71. package/.next/server/app/api/marketplace/recipes/[slug]/route.js +1 -1
  72. package/.next/server/app/api/marketplace/recipes/[slug]/route.js.nft.json +1 -1
  73. package/.next/server/app/api/marketplace/recipes/route.js +1 -1
  74. package/.next/server/app/api/marketplace/recipes/route.js.nft.json +1 -1
  75. package/.next/server/app/api/recipes/[id]/route.js +1 -1
  76. package/.next/server/app/api/recipes/[id]/route.js.nft.json +1 -1
  77. package/.next/server/app/api/recipes/clone/route.js +1 -1
  78. package/.next/server/app/api/recipes/clone/route.js.nft.json +1 -1
  79. package/.next/server/app/api/recipes/custom-team/route/app-paths-manifest.json +3 -0
  80. package/.next/server/app/api/recipes/custom-team/route/build-manifest.json +11 -0
  81. package/.next/server/app/api/recipes/custom-team/route/server-reference-manifest.json +4 -0
  82. package/.next/server/app/api/recipes/custom-team/route.js +6 -0
  83. package/.next/server/app/api/recipes/custom-team/route.js.map +5 -0
  84. package/.next/server/app/api/recipes/custom-team/route.js.nft.json +1 -0
  85. package/.next/server/app/api/recipes/custom-team/route_client-reference-manifest.js +2 -0
  86. package/.next/server/app/api/recipes/delete/route.js +1 -1
  87. package/.next/server/app/api/recipes/delete/route.js.nft.json +1 -1
  88. package/.next/server/app/api/recipes/route.js +1 -1
  89. package/.next/server/app/api/recipes/route.js.nft.json +1 -1
  90. package/.next/server/app/api/recipes/team-agents/route.js +1 -1
  91. package/.next/server/app/api/recipes/team-agents/route.js.nft.json +1 -1
  92. package/.next/server/app/api/scaffold/route.js +1 -2
  93. package/.next/server/app/api/scaffold/route.js.nft.json +1 -1
  94. package/.next/server/app/api/settings/cron-installation/route.js +1 -1
  95. package/.next/server/app/api/settings/cron-installation/route.js.nft.json +1 -1
  96. package/.next/server/app/api/skills/available/route.js +1 -1
  97. package/.next/server/app/api/skills/available/route.js.nft.json +1 -1
  98. package/.next/server/app/api/swarms/start/route/app-paths-manifest.json +3 -0
  99. package/.next/server/app/api/swarms/start/route/build-manifest.json +11 -0
  100. package/.next/server/app/api/swarms/start/route/server-reference-manifest.json +4 -0
  101. package/.next/server/app/api/swarms/start/route.js +6 -0
  102. package/.next/server/app/api/swarms/start/route.js.map +5 -0
  103. package/.next/server/app/api/swarms/start/route.js.nft.json +1 -0
  104. package/.next/server/app/api/swarms/start/route_client-reference-manifest.js +2 -0
  105. package/.next/server/app/api/swarms/status/route/app-paths-manifest.json +3 -0
  106. package/.next/server/app/api/swarms/status/route/build-manifest.json +11 -0
  107. package/.next/server/app/api/swarms/status/route/server-reference-manifest.json +4 -0
  108. package/.next/server/app/api/swarms/status/route.js +6 -0
  109. package/.next/server/app/api/swarms/status/route.js.map +5 -0
  110. package/.next/server/app/api/swarms/status/route.js.nft.json +1 -0
  111. package/.next/server/app/api/swarms/status/route_client-reference-manifest.js +2 -0
  112. package/.next/server/app/api/teams/[teamId]/tickets/assign/route/app-paths-manifest.json +3 -0
  113. package/.next/server/app/api/teams/[teamId]/tickets/assign/route/build-manifest.json +11 -0
  114. package/.next/server/app/api/teams/[teamId]/tickets/assign/route/server-reference-manifest.json +4 -0
  115. package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js +6 -0
  116. package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js.map +5 -0
  117. package/.next/server/app/api/teams/[teamId]/tickets/assign/route.js.nft.json +1 -0
  118. package/.next/server/app/api/teams/[teamId]/tickets/assign/route_client-reference-manifest.js +2 -0
  119. package/.next/server/app/api/teams/[teamId]/tickets/assignees/route/app-paths-manifest.json +3 -0
  120. package/.next/server/app/api/teams/[teamId]/tickets/assignees/route/build-manifest.json +11 -0
  121. package/.next/server/app/api/teams/[teamId]/tickets/assignees/route/server-reference-manifest.json +4 -0
  122. package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js +6 -0
  123. package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js.map +5 -0
  124. package/.next/server/app/api/teams/[teamId]/tickets/assignees/route.js.nft.json +1 -0
  125. package/.next/server/app/api/teams/[teamId]/tickets/assignees/route_client-reference-manifest.js +2 -0
  126. package/.next/server/app/api/teams/[teamId]/tickets/delete/route/app-paths-manifest.json +3 -0
  127. package/.next/server/app/api/teams/[teamId]/tickets/delete/route/build-manifest.json +11 -0
  128. package/.next/server/app/api/teams/[teamId]/tickets/delete/route/server-reference-manifest.json +4 -0
  129. package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js +6 -0
  130. package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js.map +5 -0
  131. package/.next/server/app/api/teams/[teamId]/tickets/delete/route.js.nft.json +1 -0
  132. package/.next/server/app/api/teams/[teamId]/tickets/delete/route_client-reference-manifest.js +2 -0
  133. package/.next/server/app/api/teams/[teamId]/tickets/move/route/app-paths-manifest.json +3 -0
  134. package/.next/server/app/api/teams/[teamId]/tickets/move/route/build-manifest.json +11 -0
  135. package/.next/server/app/api/teams/[teamId]/tickets/move/route/server-reference-manifest.json +4 -0
  136. package/.next/server/app/api/teams/[teamId]/tickets/move/route.js +6 -0
  137. package/.next/server/app/api/teams/[teamId]/tickets/move/route.js.map +5 -0
  138. package/.next/server/app/api/teams/[teamId]/tickets/move/route.js.nft.json +1 -0
  139. package/.next/server/app/api/teams/[teamId]/tickets/move/route_client-reference-manifest.js +2 -0
  140. package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route/app-paths-manifest.json +3 -0
  141. package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route/build-manifest.json +11 -0
  142. package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route/server-reference-manifest.json +4 -0
  143. package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js +6 -0
  144. package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js.map +5 -0
  145. package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route.js.nft.json +1 -0
  146. package/.next/server/app/api/teams/[teamId]/tickets/move-to-goals/route_client-reference-manifest.js +2 -0
  147. package/.next/server/app/api/teams/file/route.js +1 -1
  148. package/.next/server/app/api/teams/file/route.js.nft.json +1 -1
  149. package/.next/server/app/api/teams/files/route.js +1 -1
  150. package/.next/server/app/api/teams/files/route.js.nft.json +1 -1
  151. package/.next/server/app/api/teams/memory/route/app-paths-manifest.json +3 -0
  152. package/.next/server/app/api/teams/memory/route/build-manifest.json +11 -0
  153. package/.next/server/app/api/teams/memory/route/server-reference-manifest.json +4 -0
  154. package/.next/server/app/api/teams/memory/route.js +6 -0
  155. package/.next/server/app/api/teams/memory/route.js.map +5 -0
  156. package/.next/server/app/api/teams/memory/route.js.nft.json +1 -0
  157. package/.next/server/app/api/teams/memory/route_client-reference-manifest.js +2 -0
  158. package/.next/server/app/api/teams/meta/route.js +1 -1
  159. package/.next/server/app/api/teams/meta/route.js.nft.json +1 -1
  160. package/.next/server/app/api/teams/orchestrator/install/route/app-paths-manifest.json +3 -0
  161. package/.next/server/app/api/teams/orchestrator/install/route/build-manifest.json +11 -0
  162. package/.next/server/app/api/teams/orchestrator/install/route/server-reference-manifest.json +4 -0
  163. package/.next/server/app/api/teams/orchestrator/install/route.js +6 -0
  164. package/.next/server/app/api/teams/orchestrator/install/route.js.map +5 -0
  165. package/.next/server/app/api/teams/orchestrator/install/route.js.nft.json +1 -0
  166. package/.next/server/app/api/teams/orchestrator/install/route_client-reference-manifest.js +2 -0
  167. package/.next/server/app/api/teams/orchestrator/route/app-paths-manifest.json +3 -0
  168. package/.next/server/app/api/teams/orchestrator/route/build-manifest.json +11 -0
  169. package/.next/server/app/api/teams/orchestrator/route/server-reference-manifest.json +4 -0
  170. package/.next/server/app/api/teams/orchestrator/route.js +6 -0
  171. package/.next/server/app/api/teams/orchestrator/route.js.map +5 -0
  172. package/.next/server/app/api/teams/orchestrator/route.js.nft.json +1 -0
  173. package/.next/server/app/api/teams/orchestrator/route_client-reference-manifest.js +2 -0
  174. package/.next/server/app/api/teams/remove-team/route.js +2 -1
  175. package/.next/server/app/api/teams/remove-team/route.js.nft.json +1 -1
  176. package/.next/server/app/api/teams/skills/install/route.js +1 -1
  177. package/.next/server/app/api/teams/skills/install/route.js.nft.json +1 -1
  178. package/.next/server/app/api/teams/skills/route.js +1 -1
  179. package/.next/server/app/api/teams/skills/route.js.nft.json +1 -1
  180. package/.next/server/app/api/teams/workflow-runs/route/app-paths-manifest.json +3 -0
  181. package/.next/server/app/api/teams/workflow-runs/route/build-manifest.json +11 -0
  182. package/.next/server/app/api/teams/workflow-runs/route/server-reference-manifest.json +4 -0
  183. package/.next/server/app/api/teams/workflow-runs/route.js +7 -0
  184. package/.next/server/app/api/teams/workflow-runs/route.js.map +5 -0
  185. package/.next/server/app/api/teams/workflow-runs/route.js.nft.json +1 -0
  186. package/.next/server/app/api/teams/workflow-runs/route_client-reference-manifest.js +2 -0
  187. package/.next/server/app/api/teams/workflow-templates/route/app-paths-manifest.json +3 -0
  188. package/.next/server/app/api/teams/workflow-templates/route/build-manifest.json +11 -0
  189. package/.next/server/app/api/teams/workflow-templates/route/server-reference-manifest.json +4 -0
  190. package/.next/server/app/api/teams/workflow-templates/route.js +6 -0
  191. package/.next/server/app/api/teams/workflow-templates/route.js.map +5 -0
  192. package/.next/server/app/api/teams/workflow-templates/route.js.nft.json +1 -0
  193. package/.next/server/app/api/teams/workflow-templates/route_client-reference-manifest.js +2 -0
  194. package/.next/server/app/api/teams/workflows/route/app-paths-manifest.json +3 -0
  195. package/.next/server/app/api/teams/workflows/route/build-manifest.json +11 -0
  196. package/.next/server/app/api/teams/workflows/route/server-reference-manifest.json +4 -0
  197. package/.next/server/app/api/teams/workflows/route.js +6 -0
  198. package/.next/server/app/api/teams/workflows/route.js.map +5 -0
  199. package/.next/server/app/api/teams/workflows/route.js.nft.json +1 -0
  200. package/.next/server/app/api/teams/workflows/route_client-reference-manifest.js +2 -0
  201. package/.next/server/app/api/tickets/assign/route/app-paths-manifest.json +3 -0
  202. package/.next/server/app/api/tickets/assign/route/build-manifest.json +11 -0
  203. package/.next/server/app/api/tickets/assign/route/server-reference-manifest.json +4 -0
  204. package/.next/server/app/api/tickets/assign/route.js +6 -0
  205. package/.next/server/app/api/tickets/assign/route.js.map +5 -0
  206. package/.next/server/app/api/tickets/assign/route.js.nft.json +1 -0
  207. package/.next/server/app/api/tickets/assign/route_client-reference-manifest.js +2 -0
  208. package/.next/server/app/api/tickets/assignees/route/app-paths-manifest.json +3 -0
  209. package/.next/server/app/api/tickets/assignees/route/build-manifest.json +11 -0
  210. package/.next/server/app/api/tickets/assignees/route/server-reference-manifest.json +4 -0
  211. package/.next/server/app/api/tickets/assignees/route.js +6 -0
  212. package/.next/server/app/api/tickets/assignees/route.js.map +5 -0
  213. package/.next/server/app/api/tickets/assignees/route.js.nft.json +1 -0
  214. package/.next/server/app/api/tickets/assignees/route_client-reference-manifest.js +2 -0
  215. package/.next/server/app/api/tickets/move/route.js +1 -1
  216. package/.next/server/app/api/tickets/move/route.js.nft.json +1 -1
  217. package/.next/server/app/channels/page/build-manifest.json +4 -4
  218. package/.next/server/app/channels/page.js +8 -8
  219. package/.next/server/app/channels/page.js.nft.json +1 -1
  220. package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
  221. package/.next/server/app/channels.html +2 -2
  222. package/.next/server/app/channels.rsc +6 -6
  223. package/.next/server/app/channels.segments/_full.segment.rsc +6 -6
  224. package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
  225. package/.next/server/app/channels.segments/_index.segment.rsc +3 -3
  226. package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
  227. package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +2 -2
  228. package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
  229. package/.next/server/app/cron-jobs/page/build-manifest.json +4 -4
  230. package/.next/server/app/cron-jobs/page.js +8 -8
  231. package/.next/server/app/cron-jobs/page.js.nft.json +1 -1
  232. package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
  233. package/.next/server/app/cron-jobs.html +1 -1
  234. package/.next/server/app/cron-jobs.rsc +7 -7
  235. package/.next/server/app/cron-jobs.segments/_full.segment.rsc +7 -7
  236. package/.next/server/app/cron-jobs.segments/_head.segment.rsc +1 -1
  237. package/.next/server/app/cron-jobs.segments/_index.segment.rsc +3 -3
  238. package/.next/server/app/cron-jobs.segments/_tree.segment.rsc +2 -2
  239. package/.next/server/app/cron-jobs.segments/cron-jobs/__PAGE__.segment.rsc +3 -3
  240. package/.next/server/app/cron-jobs.segments/cron-jobs.segment.rsc +1 -1
  241. package/.next/server/app/goals/[id]/page/build-manifest.json +4 -4
  242. package/.next/server/app/goals/[id]/page.js +8 -8
  243. package/.next/server/app/goals/[id]/page.js.nft.json +1 -1
  244. package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  245. package/.next/server/app/goals/new/page/build-manifest.json +4 -4
  246. package/.next/server/app/goals/new/page.js +8 -8
  247. package/.next/server/app/goals/new/page.js.nft.json +1 -1
  248. package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
  249. package/.next/server/app/goals/new.html +2 -2
  250. package/.next/server/app/goals/new.rsc +6 -6
  251. package/.next/server/app/goals/new.segments/_full.segment.rsc +6 -6
  252. package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
  253. package/.next/server/app/goals/new.segments/_index.segment.rsc +3 -3
  254. package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
  255. package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +2 -2
  256. package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
  257. package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
  258. package/.next/server/app/goals/page/build-manifest.json +4 -4
  259. package/.next/server/app/goals/page.js +8 -8
  260. package/.next/server/app/goals/page.js.nft.json +1 -1
  261. package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  262. package/.next/server/app/goals.html +1 -1
  263. package/.next/server/app/goals.rsc +6 -6
  264. package/.next/server/app/goals.segments/_full.segment.rsc +6 -6
  265. package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
  266. package/.next/server/app/goals.segments/_index.segment.rsc +3 -3
  267. package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
  268. package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +2 -2
  269. package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
  270. package/.next/server/app/manifest.webmanifest/route/app-paths-manifest.json +3 -0
  271. package/.next/server/app/manifest.webmanifest/route/build-manifest.json +11 -0
  272. package/.next/server/app/manifest.webmanifest/route/server-reference-manifest.json +4 -0
  273. package/.next/server/app/manifest.webmanifest/route.js +6 -0
  274. package/.next/server/app/manifest.webmanifest/route.js.map +5 -0
  275. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
  276. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +2 -0
  277. package/.next/server/app/manifest.webmanifest.body +1 -0
  278. package/.next/server/app/manifest.webmanifest.meta +1 -0
  279. package/.next/server/app/page/build-manifest.json +4 -4
  280. package/.next/server/app/page.js +10 -9
  281. package/.next/server/app/page.js.nft.json +1 -1
  282. package/.next/server/app/page_client-reference-manifest.js +1 -1
  283. package/.next/server/app/recipes/[id]/page/build-manifest.json +4 -4
  284. package/.next/server/app/recipes/[id]/page.js +10 -9
  285. package/.next/server/app/recipes/[id]/page.js.nft.json +1 -1
  286. package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
  287. package/.next/server/app/recipes/page/build-manifest.json +4 -4
  288. package/.next/server/app/recipes/page.js +9 -9
  289. package/.next/server/app/recipes/page.js.nft.json +1 -1
  290. package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
  291. package/.next/server/app/settings/page/build-manifest.json +4 -4
  292. package/.next/server/app/settings/page.js +8 -8
  293. package/.next/server/app/settings/page.js.nft.json +1 -1
  294. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  295. package/.next/server/app/settings.html +1 -1
  296. package/.next/server/app/settings.rsc +6 -6
  297. package/.next/server/app/settings.segments/_full.segment.rsc +6 -6
  298. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  299. package/.next/server/app/settings.segments/_index.segment.rsc +3 -3
  300. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  301. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  302. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  303. package/.next/server/app/teams/[teamId]/page/build-manifest.json +4 -4
  304. package/.next/server/app/teams/[teamId]/page.js +10 -9
  305. package/.next/server/app/teams/[teamId]/page.js.nft.json +1 -1
  306. package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
  307. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/app-paths-manifest.json +3 -0
  308. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/build-manifest.json +17 -0
  309. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/next-font-manifest.json +11 -0
  310. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/react-loadable-manifest.json +1 -0
  311. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page/server-reference-manifest.json +4 -0
  312. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js +18 -0
  313. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js.map +5 -0
  314. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page.js.nft.json +1 -0
  315. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +2 -0
  316. package/.next/server/app/teams/[teamId]/tickets/page/app-paths-manifest.json +3 -0
  317. package/.next/server/app/teams/[teamId]/tickets/page/build-manifest.json +17 -0
  318. package/.next/server/app/teams/[teamId]/tickets/page/next-font-manifest.json +11 -0
  319. package/.next/server/app/teams/[teamId]/tickets/page/react-loadable-manifest.json +1 -0
  320. package/.next/server/app/teams/[teamId]/tickets/page/server-reference-manifest.json +4 -0
  321. package/.next/server/app/teams/[teamId]/tickets/page.js +18 -0
  322. package/.next/server/app/teams/[teamId]/tickets/page.js.map +5 -0
  323. package/.next/server/app/teams/[teamId]/tickets/page.js.nft.json +1 -0
  324. package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +2 -0
  325. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/app-paths-manifest.json +3 -0
  326. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/build-manifest.json +17 -0
  327. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/next-font-manifest.json +11 -0
  328. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/react-loadable-manifest.json +1 -0
  329. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page/server-reference-manifest.json +4 -0
  330. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js +19 -0
  331. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.map +5 -0
  332. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page.js.nft.json +1 -0
  333. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +2 -0
  334. package/.next/server/app/teams/[teamId]/workflows/page/app-paths-manifest.json +3 -0
  335. package/.next/server/app/teams/[teamId]/workflows/page/build-manifest.json +17 -0
  336. package/.next/server/app/teams/[teamId]/workflows/page/next-font-manifest.json +11 -0
  337. package/.next/server/app/teams/[teamId]/workflows/page/react-loadable-manifest.json +1 -0
  338. package/.next/server/app/teams/[teamId]/workflows/page/server-reference-manifest.json +4 -0
  339. package/.next/server/app/teams/[teamId]/workflows/page.js +20 -0
  340. package/.next/server/app/teams/[teamId]/workflows/page.js.map +5 -0
  341. package/.next/server/app/teams/[teamId]/workflows/page.js.nft.json +1 -0
  342. package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +2 -0
  343. package/.next/server/app/tickets/[ticket]/page/build-manifest.json +4 -4
  344. package/.next/server/app/tickets/[ticket]/page.js +8 -8
  345. package/.next/server/app/tickets/[ticket]/page.js.nft.json +1 -1
  346. package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
  347. package/.next/server/app/tickets/page/build-manifest.json +4 -4
  348. package/.next/server/app/tickets/page.js +8 -8
  349. package/.next/server/app/tickets/page.js.nft.json +1 -1
  350. package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
  351. package/.next/server/app-paths-manifest.json +21 -0
  352. package/.next/server/chunks/[root-of-the-server]__04d535a1._.js +3 -0
  353. package/.next/server/chunks/[root-of-the-server]__04d535a1._.js.map +1 -0
  354. package/.next/server/chunks/[root-of-the-server]__0554d494._.js +3 -0
  355. package/.next/server/chunks/[root-of-the-server]__0554d494._.js.map +1 -0
  356. package/.next/server/chunks/[root-of-the-server]__05f5e243._.js +3 -0
  357. package/.next/server/chunks/[root-of-the-server]__05f5e243._.js.map +1 -0
  358. package/.next/server/chunks/[root-of-the-server]__0e5f94e2._.js +3 -0
  359. package/.next/server/chunks/[root-of-the-server]__0e5f94e2._.js.map +1 -0
  360. package/.next/server/chunks/[root-of-the-server]__107d374d._.js +3 -0
  361. package/.next/server/chunks/[root-of-the-server]__107d374d._.js.map +1 -0
  362. package/.next/server/chunks/[root-of-the-server]__1106aaf7._.js +8 -0
  363. package/.next/server/chunks/[root-of-the-server]__1106aaf7._.js.map +1 -0
  364. package/.next/server/chunks/[root-of-the-server]__1805932c._.js +3 -0
  365. package/.next/server/chunks/[root-of-the-server]__1805932c._.js.map +1 -0
  366. package/.next/server/chunks/[root-of-the-server]__26c618a3._.js +3 -0
  367. package/.next/server/chunks/[root-of-the-server]__26c618a3._.js.map +1 -0
  368. package/.next/server/chunks/[root-of-the-server]__2fa553db._.js +3 -0
  369. package/.next/server/chunks/[root-of-the-server]__2fa553db._.js.map +1 -0
  370. package/.next/server/chunks/[root-of-the-server]__392e585d._.js +18 -0
  371. package/.next/server/chunks/[root-of-the-server]__392e585d._.js.map +1 -0
  372. package/.next/server/chunks/[root-of-the-server]__3cddf0a5._.js +3 -0
  373. package/.next/server/chunks/[root-of-the-server]__3cddf0a5._.js.map +1 -0
  374. package/.next/server/chunks/[root-of-the-server]__3f7058b4._.js +3 -0
  375. package/.next/server/chunks/[root-of-the-server]__3f7058b4._.js.map +1 -0
  376. package/.next/server/chunks/[root-of-the-server]__477c3d5b._.js +3 -0
  377. package/.next/server/chunks/[root-of-the-server]__477c3d5b._.js.map +1 -0
  378. package/.next/server/chunks/[root-of-the-server]__47eb3111._.js +3 -0
  379. package/.next/server/chunks/[root-of-the-server]__47eb3111._.js.map +1 -0
  380. package/.next/server/chunks/[root-of-the-server]__4898071c._.js +2 -2
  381. package/.next/server/chunks/[root-of-the-server]__59a6cf09._.js +3 -0
  382. package/.next/server/chunks/[root-of-the-server]__59a6cf09._.js.map +1 -0
  383. package/.next/server/chunks/[root-of-the-server]__5ea38a67._.js +3 -0
  384. package/.next/server/chunks/[root-of-the-server]__5ea38a67._.js.map +1 -0
  385. package/.next/server/chunks/[root-of-the-server]__6629e914._.js +3 -0
  386. package/.next/server/chunks/[root-of-the-server]__6629e914._.js.map +1 -0
  387. package/.next/server/chunks/[root-of-the-server]__667c3a2d._.js +3 -0
  388. package/.next/server/chunks/[root-of-the-server]__667c3a2d._.js.map +1 -0
  389. package/.next/server/chunks/[root-of-the-server]__691a8e5d._.js +6 -0
  390. package/.next/server/chunks/[root-of-the-server]__691a8e5d._.js.map +1 -0
  391. package/.next/server/chunks/[root-of-the-server]__698cf062._.js +3 -0
  392. package/.next/server/chunks/[root-of-the-server]__698cf062._.js.map +1 -0
  393. package/.next/server/chunks/[root-of-the-server]__69be1758._.js +3 -0
  394. package/.next/server/chunks/[root-of-the-server]__69be1758._.js.map +1 -0
  395. package/.next/server/chunks/[root-of-the-server]__6d8e7b75._.js +6 -0
  396. package/.next/server/chunks/[root-of-the-server]__6d8e7b75._.js.map +1 -0
  397. package/.next/server/chunks/[root-of-the-server]__6e5826c5._.js +3 -0
  398. package/.next/server/chunks/[root-of-the-server]__6e5826c5._.js.map +1 -0
  399. package/.next/server/chunks/[root-of-the-server]__795578f0._.js +3 -0
  400. package/.next/server/chunks/[root-of-the-server]__795578f0._.js.map +1 -0
  401. package/.next/server/chunks/[root-of-the-server]__7a331e51._.js +8 -0
  402. package/.next/server/chunks/[root-of-the-server]__7a331e51._.js.map +1 -0
  403. package/.next/server/chunks/[root-of-the-server]__7e46fb06._.js +3 -0
  404. package/.next/server/chunks/[root-of-the-server]__7e46fb06._.js.map +1 -0
  405. package/.next/server/chunks/[root-of-the-server]__864a08dd._.js +10 -0
  406. package/.next/server/chunks/[root-of-the-server]__864a08dd._.js.map +1 -0
  407. package/.next/server/chunks/[root-of-the-server]__8a811a30._.js +3 -0
  408. package/.next/server/chunks/[root-of-the-server]__8a811a30._.js.map +1 -0
  409. package/.next/server/chunks/[root-of-the-server]__8e27e9f7._.js +8 -0
  410. package/.next/server/chunks/[root-of-the-server]__8e27e9f7._.js.map +1 -0
  411. package/.next/server/chunks/[root-of-the-server]__8ea22d0a._.js +3 -0
  412. package/.next/server/chunks/[root-of-the-server]__8ea22d0a._.js.map +1 -0
  413. package/.next/server/chunks/[root-of-the-server]__904a6d9f._.js +3 -0
  414. package/.next/server/chunks/[root-of-the-server]__904a6d9f._.js.map +1 -0
  415. package/.next/server/chunks/[root-of-the-server]__a12dc320._.js +3 -0
  416. package/.next/server/chunks/[root-of-the-server]__a12dc320._.js.map +1 -0
  417. package/.next/server/chunks/[root-of-the-server]__a6ade549._.js +3 -0
  418. package/.next/server/chunks/[root-of-the-server]__a6ade549._.js.map +1 -0
  419. package/.next/server/chunks/[root-of-the-server]__abcda400._.js +6 -0
  420. package/.next/server/chunks/[root-of-the-server]__abcda400._.js.map +1 -0
  421. package/.next/server/chunks/[root-of-the-server]__b002764e._.js +3 -0
  422. package/.next/server/chunks/[root-of-the-server]__b002764e._.js.map +1 -0
  423. package/.next/server/chunks/[root-of-the-server]__bc3630f4._.js +3 -0
  424. package/.next/server/chunks/[root-of-the-server]__bc3630f4._.js.map +1 -0
  425. package/.next/server/chunks/[root-of-the-server]__befb8c19._.js +3 -0
  426. package/.next/server/chunks/[root-of-the-server]__befb8c19._.js.map +1 -0
  427. package/.next/server/chunks/[root-of-the-server]__bf608f29._.js +3 -0
  428. package/.next/server/chunks/{[root-of-the-server]__be5f57b2._.js.map → [root-of-the-server]__bf608f29._.js.map} +1 -1
  429. package/.next/server/chunks/{[root-of-the-server]__74b80ca4._.js → [root-of-the-server]__c63a9f28._.js} +2 -2
  430. package/.next/server/chunks/[root-of-the-server]__c86c0469._.js +3 -0
  431. package/.next/server/chunks/[root-of-the-server]__c86c0469._.js.map +1 -0
  432. package/.next/server/chunks/[root-of-the-server]__c9e4c772._.js +3 -0
  433. package/.next/server/chunks/[root-of-the-server]__c9e4c772._.js.map +1 -0
  434. package/.next/server/chunks/[root-of-the-server]__cbe01b74._.js +3 -0
  435. package/.next/server/chunks/[root-of-the-server]__cbe01b74._.js.map +1 -0
  436. package/.next/server/chunks/[root-of-the-server]__ce9cfa39._.js +3 -0
  437. package/.next/server/chunks/[root-of-the-server]__ce9cfa39._.js.map +1 -0
  438. package/.next/server/chunks/[root-of-the-server]__d924e5ac._.js +3 -0
  439. package/.next/server/chunks/[root-of-the-server]__d924e5ac._.js.map +1 -0
  440. package/.next/server/chunks/[root-of-the-server]__e40409a2._.js +3 -0
  441. package/.next/server/chunks/[root-of-the-server]__e40409a2._.js.map +1 -0
  442. package/.next/server/chunks/[root-of-the-server]__e6fa5823._.js +3 -0
  443. package/.next/server/chunks/[root-of-the-server]__e6fa5823._.js.map +1 -0
  444. package/.next/server/chunks/[root-of-the-server]__e8bfeaba._.js +3 -0
  445. package/.next/server/chunks/[root-of-the-server]__e8bfeaba._.js.map +1 -0
  446. package/.next/server/chunks/[root-of-the-server]__e8f8017b._.js +3 -0
  447. package/.next/server/chunks/[root-of-the-server]__e8f8017b._.js.map +1 -0
  448. package/.next/server/chunks/[root-of-the-server]__ee5cefd8._.js +3 -0
  449. package/.next/server/chunks/[root-of-the-server]__ee5cefd8._.js.map +1 -0
  450. package/.next/server/chunks/[root-of-the-server]__ef60acef._.js +3 -0
  451. package/.next/server/chunks/[root-of-the-server]__ef60acef._.js.map +1 -0
  452. package/.next/server/chunks/[root-of-the-server]__fdda9176._.js +3 -0
  453. package/.next/server/chunks/{[root-of-the-server]__a6ac3ddf._.js.map → [root-of-the-server]__fdda9176._.js.map} +1 -1
  454. package/.next/server/chunks/[root-of-the-server]__fec14c75._.js +3 -0
  455. package/.next/server/chunks/[root-of-the-server]__fec14c75._.js.map +1 -0
  456. package/.next/server/chunks/[root-of-the-server]__fef7183d._.js +3 -0
  457. package/.next/server/chunks/[root-of-the-server]__fef7183d._.js.map +1 -0
  458. package/.next/server/chunks/_next-internal_server_app_api_recipes_custom-team_route_actions_861b1489.js +3 -0
  459. package/.next/server/chunks/_next-internal_server_app_api_swarms_start_route_actions_b79e9029.js +3 -0
  460. package/.next/server/chunks/_next-internal_server_app_api_swarms_start_route_actions_b79e9029.js.map +1 -0
  461. package/.next/server/chunks/_next-internal_server_app_api_swarms_status_route_actions_54826df0.js +3 -0
  462. package/.next/server/chunks/_next-internal_server_app_api_swarms_status_route_actions_54826df0.js.map +1 -0
  463. package/.next/server/chunks/_next-internal_server_app_api_teams_[teamId]_tickets_move_route_actions_b47d8708.js +3 -0
  464. package/.next/server/chunks/_next-internal_server_app_api_teams_[teamId]_tickets_move_route_actions_b47d8708.js.map +1 -0
  465. package/.next/server/chunks/_next-internal_server_app_api_teams_memory_route_actions_5b7dc699.js +3 -0
  466. package/.next/server/chunks/_next-internal_server_app_api_teams_memory_route_actions_5b7dc699.js.map +1 -0
  467. package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_install_route_actions_49b6602b.js +3 -0
  468. package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_install_route_actions_49b6602b.js.map +1 -0
  469. package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_route_actions_1949c463.js +3 -0
  470. package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_route_actions_1949c463.js.map +1 -0
  471. package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-runs_route_actions_8327ac7d.js +3 -0
  472. package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-runs_route_actions_8327ac7d.js.map +1 -0
  473. package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-templates_route_actions_87b51d57.js +3 -0
  474. package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-templates_route_actions_87b51d57.js.map +1 -0
  475. package/.next/server/chunks/_next-internal_server_app_api_teams_workflows_route_actions_43dd6e07.js +3 -0
  476. package/.next/server/chunks/_next-internal_server_app_api_teams_workflows_route_actions_43dd6e07.js.map +1 -0
  477. package/.next/server/chunks/_next-internal_server_app_api_tickets_assign_route_actions_629cc773.js +3 -0
  478. package/.next/server/chunks/_next-internal_server_app_api_tickets_assign_route_actions_629cc773.js.map +1 -0
  479. package/.next/server/chunks/_next-internal_server_app_api_tickets_assignees_route_actions_64d3d63e.js +3 -0
  480. package/.next/server/chunks/_next-internal_server_app_api_tickets_assignees_route_actions_64d3d63e.js.map +1 -0
  481. package/.next/server/chunks/_next-internal_server_app_manifest_webmanifest_route_actions_1bff3fca.js +3 -0
  482. package/.next/server/chunks/_next-internal_server_app_manifest_webmanifest_route_actions_1bff3fca.js.map +1 -0
  483. package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_assign_route_actions_50521c46.js +3 -0
  484. package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_assign_route_actions_50521c46.js.map +1 -0
  485. package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_assignees_route_actions_75675d78.js +3 -0
  486. package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_assignees_route_actions_75675d78.js.map +1 -0
  487. package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_delete_route_actions_9d6ca9f4.js +3 -0
  488. package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_delete_route_actions_9d6ca9f4.js.map +1 -0
  489. package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_move-to-goals_route_actions_760612ca.js +3 -0
  490. package/.next/server/chunks/ce889_server_app_api_teams_[teamId]_tickets_move-to-goals_route_actions_760612ca.js.map +1 -0
  491. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js +16 -0
  492. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js.map +1 -0
  493. package/.next/server/chunks/ssr/[root-of-the-server]__0d4cb2ba._.js +3 -0
  494. package/.next/server/chunks/ssr/[root-of-the-server]__285ae6b7._.js +3 -0
  495. package/.next/server/chunks/ssr/{[root-of-the-server]__46e08d44._.js.map → [root-of-the-server]__285ae6b7._.js.map} +1 -1
  496. package/.next/server/chunks/ssr/[root-of-the-server]__28f5d174._.js +3 -0
  497. package/.next/server/chunks/ssr/[root-of-the-server]__28f5d174._.js.map +1 -0
  498. package/.next/server/chunks/ssr/[root-of-the-server]__2bef6884._.js +3 -0
  499. package/.next/server/chunks/ssr/{[root-of-the-server]__15600e29._.js.map → [root-of-the-server]__2bef6884._.js.map} +1 -1
  500. package/.next/server/chunks/ssr/[root-of-the-server]__37c705d4._.js +3 -0
  501. package/.next/server/chunks/ssr/[root-of-the-server]__37c705d4._.js.map +1 -0
  502. package/.next/server/chunks/ssr/[root-of-the-server]__3ec61b25._.js +3 -0
  503. package/.next/server/chunks/ssr/[root-of-the-server]__3ec61b25._.js.map +1 -0
  504. package/.next/server/chunks/ssr/[root-of-the-server]__3efd25c4._.js +3 -0
  505. package/.next/server/chunks/ssr/{[root-of-the-server]__2a6f1e3e._.js.map → [root-of-the-server]__3efd25c4._.js.map} +1 -1
  506. package/.next/server/chunks/ssr/[root-of-the-server]__44d2d5fa._.js +3 -0
  507. package/.next/server/chunks/ssr/[root-of-the-server]__44d2d5fa._.js.map +1 -0
  508. package/.next/server/chunks/ssr/[root-of-the-server]__49281b4c._.js +3 -0
  509. package/.next/server/chunks/ssr/[root-of-the-server]__49281b4c._.js.map +1 -0
  510. package/.next/server/chunks/ssr/[root-of-the-server]__4c4391c1._.js +3 -0
  511. package/.next/server/chunks/ssr/[root-of-the-server]__4c4391c1._.js.map +1 -0
  512. package/.next/server/chunks/ssr/[root-of-the-server]__4c6592ca._.js +3 -0
  513. package/.next/server/chunks/ssr/[root-of-the-server]__4c6592ca._.js.map +1 -0
  514. package/.next/server/chunks/ssr/[root-of-the-server]__682758bd._.js +3 -0
  515. package/.next/server/chunks/ssr/[root-of-the-server]__682758bd._.js.map +1 -0
  516. package/.next/server/chunks/ssr/[root-of-the-server]__6bd48d33._.js +1 -1
  517. package/.next/server/chunks/ssr/[root-of-the-server]__6bd48d33._.js.map +1 -1
  518. package/.next/server/chunks/ssr/[root-of-the-server]__78972f52._.js +3 -0
  519. package/.next/server/chunks/ssr/[root-of-the-server]__78972f52._.js.map +1 -0
  520. package/.next/server/chunks/ssr/{[root-of-the-server]__e2e52c6e._.js → [root-of-the-server]__78cdd31e._.js} +2 -2
  521. package/.next/server/chunks/ssr/[root-of-the-server]__92524828._.js +3 -0
  522. package/.next/server/chunks/ssr/{[root-of-the-server]__247198dc._.js.map → [root-of-the-server]__92524828._.js.map} +1 -1
  523. package/.next/server/chunks/ssr/[root-of-the-server]__9a7d79aa._.js +3 -0
  524. package/.next/server/chunks/ssr/[root-of-the-server]__9a7d79aa._.js.map +1 -0
  525. package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js +3 -0
  526. package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js.map +1 -0
  527. package/.next/server/chunks/ssr/[root-of-the-server]__ad654f09._.js +3 -0
  528. package/.next/server/chunks/ssr/[root-of-the-server]__ad654f09._.js.map +1 -0
  529. package/.next/server/chunks/ssr/[root-of-the-server]__b2617fbf._.js +3 -0
  530. package/.next/server/chunks/ssr/{[root-of-the-server]__fd669584._.js.map → [root-of-the-server]__b2617fbf._.js.map} +1 -1
  531. package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js +3 -0
  532. package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js.map +1 -0
  533. package/.next/server/chunks/ssr/{[root-of-the-server]__4c6cc96d._.js → [root-of-the-server]__de18d058._.js} +2 -2
  534. package/.next/server/chunks/ssr/{[root-of-the-server]__4c6cc96d._.js.map → [root-of-the-server]__de18d058._.js.map} +1 -1
  535. package/.next/server/chunks/ssr/{[root-of-the-server]__7180d770._.js → [root-of-the-server]__e364449b._.js} +2 -2
  536. package/.next/server/chunks/ssr/[root-of-the-server]__e364449b._.js.map +1 -0
  537. package/.next/server/chunks/ssr/[root-of-the-server]__e5d416d5._.js +3 -0
  538. package/.next/server/chunks/ssr/{[root-of-the-server]__3ad3e5b1._.js.map → [root-of-the-server]__e5d416d5._.js.map} +1 -1
  539. package/.next/server/chunks/ssr/[root-of-the-server]__e94ab521._.js +3 -0
  540. package/.next/server/chunks/ssr/[root-of-the-server]__e94ab521._.js.map +1 -0
  541. package/.next/server/chunks/ssr/{[root-of-the-server]__b9356576._.js → [root-of-the-server]__f62d412e._.js} +2 -2
  542. package/.next/server/chunks/ssr/{[root-of-the-server]__b9356576._.js.map → [root-of-the-server]__f62d412e._.js.map} +1 -1
  543. package/.next/server/chunks/ssr/[root-of-the-server]__f8a2f82d._.js +3 -0
  544. package/.next/server/chunks/ssr/[root-of-the-server]__f8a2f82d._.js.map +1 -0
  545. package/.next/server/chunks/ssr/[root-of-the-server]__fbe5ff69._.js +3 -0
  546. package/.next/server/chunks/ssr/{[root-of-the-server]__3575e6da._.js.map → [root-of-the-server]__fbe5ff69._.js.map} +1 -1
  547. package/.next/server/chunks/ssr/_018dfe6b._.js +27 -0
  548. package/.next/server/chunks/ssr/_018dfe6b._.js.map +1 -0
  549. package/.next/server/chunks/ssr/{_8c45edba._.js → _0bdae23a._.js} +3 -3
  550. package/.next/server/chunks/ssr/_0bdae23a._.js.map +1 -0
  551. package/.next/server/chunks/ssr/{_d27483a1._.js → _19aa68d3._.js} +3 -3
  552. package/.next/server/chunks/ssr/_19aa68d3._.js.map +1 -0
  553. package/.next/server/chunks/ssr/{_25e6aab8._.js → _347e2d56._.js} +3 -3
  554. package/.next/server/chunks/ssr/_347e2d56._.js.map +1 -0
  555. package/.next/server/chunks/ssr/_3c9015dc._.js +4 -0
  556. package/.next/server/chunks/ssr/_3c9015dc._.js.map +1 -0
  557. package/.next/server/chunks/ssr/_41ca4e70._.js +3 -0
  558. package/.next/server/chunks/ssr/_41ca4e70._.js.map +1 -0
  559. package/.next/server/chunks/ssr/{node_modules_next_dist_12287b3d._.js → _49fb12c2._.js} +3 -3
  560. package/.next/server/chunks/ssr/_49fb12c2._.js.map +1 -0
  561. package/.next/server/chunks/ssr/{_3c8b2df6._.js → _536983a4._.js} +3 -3
  562. package/.next/server/chunks/ssr/_536983a4._.js.map +1 -0
  563. package/.next/server/chunks/ssr/_5443093b._.js +3 -0
  564. package/.next/server/chunks/ssr/_5443093b._.js.map +1 -0
  565. package/.next/server/chunks/ssr/{_cd23c5af._.js → _5b282394._.js} +3 -3
  566. package/.next/server/chunks/ssr/_5b282394._.js.map +1 -0
  567. package/.next/server/chunks/ssr/{_6e70b5a4._.js → _5cc24343._.js} +3 -3
  568. package/.next/server/chunks/ssr/_5cc24343._.js.map +1 -0
  569. package/.next/server/chunks/ssr/_67830ad6._.js +3 -0
  570. package/.next/server/chunks/ssr/_67830ad6._.js.map +1 -0
  571. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_68c68167.js → _7eac37fb._.js} +3 -3
  572. package/.next/server/chunks/ssr/_7eac37fb._.js.map +1 -0
  573. package/.next/server/chunks/ssr/{_92140ca3._.js → _802ee40f._.js} +3 -3
  574. package/.next/server/chunks/ssr/{_25e6aab8._.js.map → _802ee40f._.js.map} +1 -1
  575. package/.next/server/chunks/ssr/{_8c8207c1._.js → _8062e992._.js} +3 -3
  576. package/.next/server/chunks/ssr/_8062e992._.js.map +1 -0
  577. package/.next/server/chunks/ssr/{_0808c2b9._.js → _99994c05._.js} +3 -3
  578. package/.next/server/chunks/ssr/_99994c05._.js.map +1 -0
  579. package/.next/server/chunks/ssr/{_b5e9afcc._.js → _aafc99aa._.js} +3 -3
  580. package/.next/server/chunks/ssr/_aafc99aa._.js.map +1 -0
  581. package/.next/server/chunks/ssr/{_39e6e769._.js → _b7f3caf7._.js} +3 -3
  582. package/.next/server/chunks/ssr/_b7f3caf7._.js.map +1 -0
  583. package/.next/server/chunks/ssr/_c2041f88._.js +4 -0
  584. package/.next/server/chunks/ssr/_c2041f88._.js.map +1 -0
  585. package/.next/server/chunks/ssr/_d2e9dda9._.js +4 -0
  586. package/.next/server/chunks/ssr/_d2e9dda9._.js.map +1 -0
  587. package/.next/server/chunks/ssr/{_3158c108._.js → _f4d8af3b._.js} +3 -3
  588. package/.next/server/chunks/ssr/_f4d8af3b._.js.map +1 -0
  589. package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_tickets_[ticket]_page_actions_25ad633d.js +3 -0
  590. package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_tickets_[ticket]_page_actions_25ad633d.js.map +1 -0
  591. package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_tickets_page_actions_dffb2525.js +3 -0
  592. package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_tickets_page_actions_dffb2525.js.map +1 -0
  593. package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_workflows_page_actions_3defde35.js +3 -0
  594. package/.next/server/chunks/ssr/_next-internal_server_app_teams_[teamId]_workflows_page_actions_3defde35.js.map +1 -0
  595. package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js +3 -0
  596. package/.next/server/chunks/ssr/b1a17_app_teams_[teamId]_workflows_[workflowId]_workflows-editor-client_tsx_5e714aa2._.js.map +1 -0
  597. package/.next/server/chunks/ssr/ce889_server_app_teams_[teamId]_workflows_[workflowId]_page_actions_880cbbc3.js +3 -0
  598. package/.next/server/chunks/ssr/ce889_server_app_teams_[teamId]_workflows_[workflowId]_page_actions_880cbbc3.js.map +1 -0
  599. package/.next/server/chunks/ssr/node_modules_ea845e5f._.js +3 -0
  600. package/.next/server/chunks/ssr/node_modules_ea845e5f._.js.map +1 -0
  601. package/.next/server/chunks/ssr/{_da6f800e._.js → node_modules_next_aefa2538._.js} +2 -2
  602. package/.next/server/chunks/ssr/node_modules_next_aefa2538._.js.map +1 -0
  603. package/.next/server/chunks/ssr/node_modules_next_dist_8a37abed._.js +4 -0
  604. package/.next/server/chunks/ssr/node_modules_next_dist_8a37abed._.js.map +1 -0
  605. package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_9774470f._.js → node_modules_next_dist_client_components_2fffaa3a._.js} +2 -2
  606. package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_9774470f._.js.map → node_modules_next_dist_client_components_2fffaa3a._.js.map} +1 -1
  607. package/.next/server/chunks/ssr/{_68793c1f._.js → node_modules_next_dist_esm_build_templates_app-page_b5ef32b4.js} +3 -3
  608. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_b5ef32b4.js.map +1 -0
  609. package/.next/server/chunks/ssr/src_13139e3d._.js +3 -0
  610. package/.next/server/chunks/ssr/src_13139e3d._.js.map +1 -0
  611. package/.next/server/chunks/ssr/src_2a73b867._.js +3 -0
  612. package/.next/server/chunks/ssr/src_2a73b867._.js.map +1 -0
  613. package/.next/server/chunks/ssr/src_2dbb3b7f._.js +3 -0
  614. package/.next/server/chunks/ssr/src_2dbb3b7f._.js.map +1 -0
  615. package/.next/server/chunks/ssr/src_417bc4a6._.js +3 -0
  616. package/.next/server/chunks/ssr/src_417bc4a6._.js.map +1 -0
  617. package/.next/server/chunks/ssr/src_59477309._.js +3 -0
  618. package/.next/server/chunks/ssr/src_59477309._.js.map +1 -0
  619. package/.next/server/chunks/ssr/src_79d55c05._.js +3 -0
  620. package/.next/server/chunks/ssr/src_79d55c05._.js.map +1 -0
  621. package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.js +1 -1
  622. package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.js.map +1 -1
  623. package/.next/server/chunks/ssr/src_app_agents_[agentId]_agent-editor_tsx_f85bbe65._.js +1 -1
  624. package/.next/server/chunks/ssr/src_app_agents_[agentId]_agent-editor_tsx_f85bbe65._.js.map +1 -1
  625. package/.next/server/chunks/ssr/src_app_global-error_tsx_aa661ba4._.js +3 -0
  626. package/.next/server/chunks/ssr/src_app_global-error_tsx_aa661ba4._.js.map +1 -0
  627. package/.next/server/chunks/ssr/src_app_not-found_tsx_3f23d179._.js +3 -0
  628. package/.next/server/chunks/ssr/src_app_not-found_tsx_3f23d179._.js.map +1 -0
  629. package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_index_tsx_98393217._.js +3 -0
  630. package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_index_tsx_98393217._.js.map +1 -0
  631. package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js +1 -1
  632. package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js.map +1 -1
  633. package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_index_tsx_e68e9cbc._.js +12 -0
  634. package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_index_tsx_e68e9cbc._.js.map +1 -0
  635. package/.next/server/chunks/ssr/src_app_tickets_TicketsBoardClient_tsx_5e156ef3._.js +1 -1
  636. package/.next/server/chunks/ssr/src_app_tickets_TicketsBoardClient_tsx_5e156ef3._.js.map +1 -1
  637. package/.next/server/chunks/ssr/src_e54f24fb._.js +3 -0
  638. package/.next/server/chunks/ssr/src_e54f24fb._.js.map +1 -0
  639. package/.next/server/middleware-build-manifest.js +4 -4
  640. package/.next/server/next-font-manifest.js +1 -1
  641. package/.next/server/next-font-manifest.json +16 -0
  642. package/.next/server/pages/404.html +1 -1
  643. package/.next/server/pages/500.html +2 -2
  644. package/.next/static/chunks/0edab8a24d59a626.js +2 -0
  645. package/.next/static/chunks/11da0a52793b005a.js +1 -0
  646. package/.next/static/chunks/150338287c7dae30.js +1 -0
  647. package/.next/static/chunks/236ef28eb649c432.js +1 -0
  648. package/.next/static/chunks/3e1fe6be993c61fb.js +1 -0
  649. package/.next/static/chunks/55a88f2071ebe766.js +1 -0
  650. package/.next/static/chunks/5cf42ef49ad071af.js +10 -0
  651. package/.next/static/chunks/62e0c437eb8fc2da.js +1 -0
  652. package/.next/static/chunks/{82abf2d65f5428ae.js → 68a088aa49e6124a.js} +3 -3
  653. package/.next/static/chunks/7bb0aafbf73524bf.js +1 -0
  654. package/.next/static/chunks/8d359fbce4ebb835.js +1 -0
  655. package/.next/static/chunks/9197ecb9606557f3.js +1 -0
  656. package/.next/static/chunks/93719e85369dd453.js +1 -0
  657. package/.next/static/chunks/b244476ded155cf9.css +3 -0
  658. package/.next/static/chunks/c75e00652e6b7d85.js +1 -0
  659. package/.next/static/chunks/c84580993f22c17a.js +1 -0
  660. package/.next/static/chunks/d73a47fc8def319c.js +1 -0
  661. package/.next/static/chunks/daa78a9d669e23f5.js +1 -0
  662. package/.next/static/chunks/db4da5ee45033817.js +1 -0
  663. package/.next/static/chunks/e8021fea9aee6b63.js +1 -0
  664. package/.next/static/chunks/e854e56ea8cb6236.js +1 -0
  665. package/.next/static/chunks/ffff6b5105288d2c.js +1 -0
  666. package/.next/static/chunks/{turbopack-ae1340e658f67df8.js → turbopack-0236a74c4f471967.js} +1 -1
  667. package/README.md +22 -1
  668. package/openclaw/index.ts +133 -26
  669. package/openclaw.plugin.json +9 -1
  670. package/package.json +24 -3
  671. package/public/android-chrome-192x192.png +0 -0
  672. package/public/android-chrome-512x512.png +0 -0
  673. package/public/apple-touch-icon.png +0 -0
  674. package/public/chef.jpg +0 -0
  675. package/public/favicon-16x16.png +0 -0
  676. package/public/favicon-32x32.png +0 -0
  677. package/public/favicon.ico +0 -0
  678. package/src/app/HomeClient.tsx +8 -9
  679. package/src/app/agents/[agentId]/agent-editor-tabs.tsx +298 -0
  680. package/src/app/agents/[agentId]/agent-editor.tsx +200 -428
  681. package/src/app/api/__tests__/agents-add-route.test.ts +143 -0
  682. package/src/app/api/__tests__/agents-file-route.test.ts +117 -0
  683. package/src/app/api/__tests__/agents-files-route.test.ts +61 -0
  684. package/src/app/api/__tests__/agents-id-route.test.ts +104 -0
  685. package/src/app/api/__tests__/agents-identity-route.test.ts +92 -0
  686. package/src/app/api/__tests__/agents-route.test.ts +54 -0
  687. package/src/app/api/__tests__/agents-skills-install-route.test.ts +131 -0
  688. package/src/app/api/__tests__/agents-skills-route.test.ts +64 -0
  689. package/src/app/api/__tests__/agents-update-route.test.ts +95 -0
  690. package/src/app/api/__tests__/channels-bindings-route.test.ts +143 -0
  691. package/src/app/api/__tests__/cron-delete-route.test.ts +93 -0
  692. package/src/app/api/__tests__/cron-job-route.test.ts +78 -0
  693. package/src/app/api/__tests__/cron-jobs-route.test.ts +116 -0
  694. package/src/app/api/__tests__/cron-recipe-installed-route.test.ts +114 -0
  695. package/src/app/api/__tests__/gateway-restart-route.test.ts +36 -0
  696. package/src/app/api/__tests__/goals-promote-route.test.ts +200 -0
  697. package/src/app/api/__tests__/goals-route.test.ts +184 -0
  698. package/src/app/api/__tests__/ids-check-route.test.ts +188 -0
  699. package/src/app/api/__tests__/marketplace-recipes-route.test.ts +123 -0
  700. package/src/app/api/__tests__/recipes-clone-route.test.ts +221 -0
  701. package/src/app/api/__tests__/recipes-delete-route.test.ts +248 -0
  702. package/src/app/api/__tests__/recipes-id-route.test.ts +166 -0
  703. package/src/app/api/__tests__/recipes-route.test.ts +57 -0
  704. package/src/app/api/__tests__/recipes-team-agents-route.test.ts +135 -0
  705. package/src/app/api/__tests__/scaffold-route.test.ts +173 -0
  706. package/src/app/api/__tests__/settings-cron-installation-route.test.ts +82 -0
  707. package/src/app/api/__tests__/skills-available-route.test.ts +47 -0
  708. package/src/app/api/__tests__/swarms-start-route.test.ts +79 -0
  709. package/src/app/api/__tests__/swarms-status-route.test.ts +42 -0
  710. package/src/app/api/__tests__/teams-file-route.test.ts +129 -0
  711. package/src/app/api/__tests__/teams-files-route.test.ts +57 -0
  712. package/src/app/api/__tests__/teams-meta-route.test.ts +113 -0
  713. package/src/app/api/__tests__/teams-orchestrator-install-route.test.ts +66 -0
  714. package/src/app/api/__tests__/teams-orchestrator-route.test.ts +59 -0
  715. package/src/app/api/__tests__/teams-remove-team-route.test.ts +122 -0
  716. package/src/app/api/__tests__/teams-skills-install-route.test.ts +78 -0
  717. package/src/app/api/__tests__/teams-skills-route.test.ts +73 -0
  718. package/src/app/api/__tests__/teams-workflow-runs-route.test.ts +85 -0
  719. package/src/app/api/__tests__/teams-workflows-route.test.ts +110 -0
  720. package/src/app/api/__tests__/tickets-move-route.test.ts +60 -0
  721. package/src/app/api/agents/[id]/route.ts +33 -29
  722. package/src/app/api/agents/add/route.ts +38 -33
  723. package/src/app/api/agents/file/route.ts +14 -27
  724. package/src/app/api/agents/files/route.ts +7 -62
  725. package/src/app/api/agents/route.ts +3 -10
  726. package/src/app/api/agents/skills/install/route.ts +2 -14
  727. package/src/app/api/agents/skills/route.ts +6 -18
  728. package/src/app/api/channels/bindings/route.ts +6 -15
  729. package/src/app/api/cron/__tests__/helpers.test.ts +164 -0
  730. package/src/app/api/cron/delete/route.ts +4 -63
  731. package/src/app/api/cron/helpers.ts +172 -0
  732. package/src/app/api/cron/jobs/route.ts +24 -113
  733. package/src/app/api/cron/recipe-installed/route.ts +6 -4
  734. package/src/app/api/gateway/restart/route.ts +2 -1
  735. package/src/app/api/goals/[id]/promote/route.ts +10 -43
  736. package/src/app/api/goals/[id]/route.ts +10 -16
  737. package/src/app/api/goals/route.ts +3 -6
  738. package/src/app/api/ids/check/route.ts +18 -26
  739. package/src/app/api/marketplace/recipes/[slug]/route.ts +2 -2
  740. package/src/app/api/recipes/[id]/route.ts +3 -9
  741. package/src/app/api/recipes/clone/route.ts +3 -38
  742. package/src/app/api/recipes/custom-team/route.ts +193 -0
  743. package/src/app/api/recipes/delete/helpers.ts +65 -0
  744. package/src/app/api/recipes/delete/route.ts +11 -78
  745. package/src/app/api/recipes/team-agents/__tests__/helpers.test.ts +156 -0
  746. package/src/app/api/recipes/team-agents/helpers.ts +151 -0
  747. package/src/app/api/recipes/team-agents/route.ts +27 -125
  748. package/src/app/api/scaffold/__tests__/helpers.test.ts +186 -0
  749. package/src/app/api/scaffold/helpers.ts +214 -0
  750. package/src/app/api/scaffold/route.ts +40 -274
  751. package/src/app/api/settings/cron-installation/route.ts +3 -2
  752. package/src/app/api/skills/available/route.ts +2 -1
  753. package/src/app/api/swarms/start/route.ts +100 -0
  754. package/src/app/api/swarms/status/route.ts +31 -0
  755. package/src/app/api/teams/[teamId]/tickets/assign/route.ts +105 -0
  756. package/src/app/api/teams/[teamId]/tickets/assignees/route.ts +27 -0
  757. package/src/app/api/teams/[teamId]/tickets/delete/route.ts +55 -0
  758. package/src/app/api/teams/[teamId]/tickets/move/route.ts +70 -0
  759. package/src/app/api/teams/[teamId]/tickets/move-to-goals/route.ts +56 -0
  760. package/src/app/api/teams/file/route.ts +26 -47
  761. package/src/app/api/teams/files/route.ts +13 -45
  762. package/src/app/api/teams/memory/route.ts +250 -0
  763. package/src/app/api/teams/meta/route.ts +16 -35
  764. package/src/app/api/teams/orchestrator/install/route.ts +129 -0
  765. package/src/app/api/teams/orchestrator/route.ts +216 -0
  766. package/src/app/api/teams/remove-team/route.ts +7 -15
  767. package/src/app/api/teams/skills/install/route.ts +2 -13
  768. package/src/app/api/teams/skills/route.ts +6 -17
  769. package/src/app/api/teams/workflow-runs/route.ts +534 -0
  770. package/src/app/api/teams/workflow-templates/route.ts +71 -0
  771. package/src/app/api/teams/workflows/route.ts +55 -0
  772. package/src/app/api/tickets/assign/route.ts +94 -0
  773. package/src/app/api/tickets/assignees/route.ts +24 -0
  774. package/src/app/api/tickets/move/route.ts +31 -0
  775. package/src/app/channels/channels-client.tsx +48 -47
  776. package/src/app/cron-jobs/cron-jobs-client.tsx +11 -14
  777. package/src/app/cron-jobs/page.tsx +1 -1
  778. package/src/app/global-error.tsx +50 -0
  779. package/src/app/goals/[id]/goal-editor.tsx +74 -179
  780. package/src/app/goals/goals-client.tsx +30 -39
  781. package/src/app/goals/new/page.tsx +45 -124
  782. package/src/app/layout.tsx +8 -0
  783. package/src/app/manifest.ts +15 -0
  784. package/src/app/not-found.tsx +8 -0
  785. package/src/app/page.tsx +4 -31
  786. package/src/app/recipes/CreateAgentModal.tsx +98 -153
  787. package/src/app/recipes/CreateCustomTeamModal.tsx +375 -0
  788. package/src/app/recipes/CreateModalShell.tsx +55 -0
  789. package/src/app/recipes/CreateTeamModal.tsx +54 -105
  790. package/src/app/recipes/[id]/RecipeEditor/RecipeEditorCreateModal.tsx +72 -0
  791. package/src/app/recipes/[id]/RecipeEditor/RecipeEditorPanel.tsx +216 -0
  792. package/src/app/recipes/[id]/RecipeEditor/index.tsx +271 -0
  793. package/src/app/recipes/[id]/RecipeEditor/recipe-editor-utils.ts +46 -0
  794. package/src/app/recipes/[id]/RecipeEditor/types.ts +52 -0
  795. package/src/app/recipes/[id]/page.tsx +4 -18
  796. package/src/app/recipes/page.tsx +9 -2
  797. package/src/app/recipes/recipes-client.tsx +266 -156
  798. package/src/app/settings/page.tsx +1 -1
  799. package/src/app/settings/settings-client.tsx +11 -10
  800. package/src/app/teams/[teamId]/CloneTeamModal.tsx +77 -111
  801. package/src/app/teams/[teamId]/OrchestratorPanel.tsx +255 -0
  802. package/src/app/teams/[teamId]/OrchestratorSetupModal.tsx +184 -0
  803. package/src/app/teams/[teamId]/PublishChangesModal.tsx +21 -42
  804. package/src/app/teams/[teamId]/page.tsx +27 -49
  805. package/src/app/teams/[teamId]/team-editor/TeamAgentsTab.tsx +145 -0
  806. package/src/app/teams/[teamId]/team-editor/TeamCronTab.tsx +72 -0
  807. package/src/app/teams/[teamId]/team-editor/TeamFilesTab.tsx +74 -0
  808. package/src/app/teams/[teamId]/team-editor/TeamMemoryTab.tsx +349 -0
  809. package/src/app/teams/[teamId]/team-editor/TeamRecipeTab.tsx +151 -0
  810. package/src/app/teams/[teamId]/team-editor/TeamSkillsTab.tsx +68 -0
  811. package/src/app/teams/[teamId]/team-editor/index.tsx +558 -0
  812. package/src/app/teams/[teamId]/team-editor/team-editor-data.ts +255 -0
  813. package/src/app/teams/[teamId]/team-editor/team-editor-utils.ts +78 -0
  814. package/src/app/teams/[teamId]/team-editor/types.ts +34 -0
  815. package/src/app/teams/[teamId]/tickets/[ticket]/page.tsx +35 -0
  816. package/src/app/teams/[teamId]/tickets/page.tsx +15 -0
  817. package/src/app/teams/[teamId]/workflows/[workflowId]/WorkflowCanvas.tsx +111 -0
  818. package/src/app/teams/[teamId]/workflows/[workflowId]/page.tsx +27 -0
  819. package/src/app/teams/[teamId]/workflows/[workflowId]/workflows-editor-client.tsx +1608 -0
  820. package/src/app/teams/[teamId]/workflows/page.tsx +40 -0
  821. package/src/app/teams/[teamId]/workflows/workflows-client.tsx +494 -0
  822. package/src/app/tickets/TicketDetailClient.tsx +147 -0
  823. package/src/app/tickets/TicketsBoardClient.tsx +11 -57
  824. package/src/app/tickets/[ticket]/TicketAssignControl.tsx +112 -0
  825. package/src/app/tickets/[ticket]/page.tsx +13 -21
  826. package/src/app/tickets/page.tsx +5 -2
  827. package/src/components/AppShell.tsx +252 -31
  828. package/src/{app/cron-jobs/DeleteCronJobModal.tsx → components/ConfirmationModal.tsx} +35 -17
  829. package/src/components/DeleteEntityModal.tsx +41 -0
  830. package/src/components/ErrorBoundary.tsx +70 -0
  831. package/src/components/FileListWithOptionalToggle.tsx +86 -0
  832. package/src/components/GoalFormFields.tsx +163 -0
  833. package/src/components/ScaffoldOverlay.tsx +7 -10
  834. package/src/components/ToastProvider.tsx +22 -18
  835. package/src/components/__tests__/ConfirmationModal.test.tsx +109 -0
  836. package/src/components/__tests__/ErrorBoundary.test.tsx +39 -0
  837. package/src/components/__tests__/FileListWithOptionalToggle.test.tsx +109 -0
  838. package/src/components/__tests__/GoalFormFields.test.tsx +117 -0
  839. package/src/components/delete-modals.tsx +59 -0
  840. package/src/components/icons.tsx +12 -10
  841. package/src/lib/__tests__/agent-workspace.test.ts +44 -0
  842. package/src/lib/__tests__/agents.test.ts +36 -0
  843. package/src/lib/__tests__/api-route-helpers.test.ts +188 -0
  844. package/src/lib/__tests__/cron.test.ts +45 -0
  845. package/src/lib/__tests__/editor-utils.test.ts +38 -0
  846. package/src/lib/__tests__/errors.test.ts +15 -0
  847. package/src/lib/__tests__/exec.test.ts +13 -0
  848. package/src/lib/__tests__/fetch-json.test.ts +118 -0
  849. package/src/lib/__tests__/gateway.test.ts +234 -0
  850. package/src/lib/__tests__/goal-promote.test.ts +39 -0
  851. package/src/lib/__tests__/goals-client.test.ts +26 -0
  852. package/src/lib/__tests__/goals.test.ts +275 -0
  853. package/src/lib/__tests__/json.test.ts +15 -0
  854. package/src/lib/__tests__/kitchen-api.test.ts +32 -0
  855. package/src/lib/__tests__/marketplace.test.ts +116 -0
  856. package/src/lib/__tests__/openclaw.test.ts +129 -0
  857. package/src/lib/__tests__/paths.test.ts +136 -0
  858. package/src/lib/__tests__/poll.test.ts +26 -0
  859. package/src/lib/__tests__/recipe-clone.test.ts +85 -0
  860. package/src/lib/__tests__/recipe-team-agents.test.ts +70 -0
  861. package/src/lib/__tests__/recipes.test.ts +199 -0
  862. package/src/lib/__tests__/scaffold-client.test.ts +106 -0
  863. package/src/lib/__tests__/scaffold.test.ts +64 -0
  864. package/src/lib/__tests__/slugify.test.ts +23 -0
  865. package/src/lib/__tests__/tickets.test.ts +158 -0
  866. package/src/lib/__tests__/type-guards.test.ts +18 -0
  867. package/src/lib/__tests__/use-slugified-id.test.tsx +120 -0
  868. package/src/lib/agents.ts +17 -0
  869. package/src/lib/api-route-helpers.ts +157 -0
  870. package/src/lib/cron.ts +40 -0
  871. package/src/lib/editor-utils.ts +18 -0
  872. package/src/lib/errors.ts +7 -0
  873. package/src/lib/exec.ts +4 -0
  874. package/src/lib/fetch-json.ts +29 -0
  875. package/src/lib/gateway.ts +5 -1
  876. package/src/lib/goal-promote.ts +27 -0
  877. package/src/lib/goals-client.ts +69 -0
  878. package/src/lib/goals.ts +22 -3
  879. package/src/lib/json.ts +10 -0
  880. package/src/lib/openclaw.ts +28 -13
  881. package/src/lib/paths.ts +12 -0
  882. package/src/lib/poll.ts +18 -0
  883. package/src/lib/recipe-clone.ts +42 -0
  884. package/src/lib/recipe-team-agents.ts +30 -0
  885. package/src/lib/recipes.ts +47 -0
  886. package/src/lib/scaffold-client.ts +31 -0
  887. package/src/lib/scaffold.ts +37 -0
  888. package/src/lib/slugify.ts +25 -0
  889. package/src/lib/swarms.ts +25 -0
  890. package/src/lib/tickets.ts +81 -25
  891. package/src/lib/type-guards.ts +3 -0
  892. package/src/lib/use-slugified-id.ts +35 -0
  893. package/src/lib/workflows/README.md +11 -0
  894. package/src/lib/workflows/__tests__/storage.test.ts +129 -0
  895. package/src/lib/workflows/__tests__/validate.test.ts +92 -0
  896. package/src/lib/workflows/api-handlers.ts +35 -0
  897. package/src/lib/workflows/readdir.ts +23 -0
  898. package/src/lib/workflows/runs-storage.ts +59 -0
  899. package/src/lib/workflows/runs-types.ts +42 -0
  900. package/src/lib/workflows/storage.ts +70 -0
  901. package/src/lib/workflows/templates/index.ts +1 -0
  902. package/src/lib/workflows/templates/marketing-cadence-v1.ts +142 -0
  903. package/src/lib/workflows/types.ts +48 -0
  904. package/src/lib/workflows/validate.ts +92 -0
  905. package/.next/server/app/tickets.html +0 -1
  906. package/.next/server/app/tickets.meta +0 -15
  907. package/.next/server/app/tickets.rsc +0 -19
  908. package/.next/server/app/tickets.segments/_full.segment.rsc +0 -19
  909. package/.next/server/app/tickets.segments/_head.segment.rsc +0 -6
  910. package/.next/server/app/tickets.segments/_index.segment.rsc +0 -6
  911. package/.next/server/app/tickets.segments/_tree.segment.rsc +0 -4
  912. package/.next/server/app/tickets.segments/tickets/__PAGE__.segment.rsc +0 -8
  913. package/.next/server/app/tickets.segments/tickets.segment.rsc +0 -4
  914. package/.next/server/chunks/[root-of-the-server]__055885ce._.js +0 -3
  915. package/.next/server/chunks/[root-of-the-server]__055885ce._.js.map +0 -1
  916. package/.next/server/chunks/[root-of-the-server]__0c01c5c7._.js +0 -10
  917. package/.next/server/chunks/[root-of-the-server]__0c01c5c7._.js.map +0 -1
  918. package/.next/server/chunks/[root-of-the-server]__1398a33a._.js +0 -3
  919. package/.next/server/chunks/[root-of-the-server]__1398a33a._.js.map +0 -1
  920. package/.next/server/chunks/[root-of-the-server]__159c002b._.js +0 -8
  921. package/.next/server/chunks/[root-of-the-server]__159c002b._.js.map +0 -1
  922. package/.next/server/chunks/[root-of-the-server]__20c60fb7._.js +0 -3
  923. package/.next/server/chunks/[root-of-the-server]__20c60fb7._.js.map +0 -1
  924. package/.next/server/chunks/[root-of-the-server]__2588560d._.js +0 -6
  925. package/.next/server/chunks/[root-of-the-server]__2588560d._.js.map +0 -1
  926. package/.next/server/chunks/[root-of-the-server]__27293e91._.js +0 -3
  927. package/.next/server/chunks/[root-of-the-server]__27293e91._.js.map +0 -1
  928. package/.next/server/chunks/[root-of-the-server]__29c85a51._.js +0 -3
  929. package/.next/server/chunks/[root-of-the-server]__29c85a51._.js.map +0 -1
  930. package/.next/server/chunks/[root-of-the-server]__29fa8108._.js +0 -3
  931. package/.next/server/chunks/[root-of-the-server]__29fa8108._.js.map +0 -1
  932. package/.next/server/chunks/[root-of-the-server]__2bd44067._.js +0 -3
  933. package/.next/server/chunks/[root-of-the-server]__2bd44067._.js.map +0 -1
  934. package/.next/server/chunks/[root-of-the-server]__2dd1afff._.js +0 -3
  935. package/.next/server/chunks/[root-of-the-server]__2dd1afff._.js.map +0 -1
  936. package/.next/server/chunks/[root-of-the-server]__401ab759._.js +0 -3
  937. package/.next/server/chunks/[root-of-the-server]__401ab759._.js.map +0 -1
  938. package/.next/server/chunks/[root-of-the-server]__422c7160._.js +0 -3
  939. package/.next/server/chunks/[root-of-the-server]__422c7160._.js.map +0 -1
  940. package/.next/server/chunks/[root-of-the-server]__4670294e._.js +0 -3
  941. package/.next/server/chunks/[root-of-the-server]__4670294e._.js.map +0 -1
  942. package/.next/server/chunks/[root-of-the-server]__4eda99a9._.js +0 -3
  943. package/.next/server/chunks/[root-of-the-server]__4eda99a9._.js.map +0 -1
  944. package/.next/server/chunks/[root-of-the-server]__54478298._.js +0 -8
  945. package/.next/server/chunks/[root-of-the-server]__54478298._.js.map +0 -1
  946. package/.next/server/chunks/[root-of-the-server]__6dbdb384._.js +0 -3
  947. package/.next/server/chunks/[root-of-the-server]__6dbdb384._.js.map +0 -1
  948. package/.next/server/chunks/[root-of-the-server]__94d68aa3._.js +0 -3
  949. package/.next/server/chunks/[root-of-the-server]__94d68aa3._.js.map +0 -1
  950. package/.next/server/chunks/[root-of-the-server]__9ecbb339._.js +0 -3
  951. package/.next/server/chunks/[root-of-the-server]__9ecbb339._.js.map +0 -1
  952. package/.next/server/chunks/[root-of-the-server]__a27f8405._.js +0 -3
  953. package/.next/server/chunks/[root-of-the-server]__a27f8405._.js.map +0 -1
  954. package/.next/server/chunks/[root-of-the-server]__a6ac3ddf._.js +0 -3
  955. package/.next/server/chunks/[root-of-the-server]__b11231a9._.js +0 -3
  956. package/.next/server/chunks/[root-of-the-server]__b11231a9._.js.map +0 -1
  957. package/.next/server/chunks/[root-of-the-server]__b59b3cdd._.js +0 -3
  958. package/.next/server/chunks/[root-of-the-server]__b59b3cdd._.js.map +0 -1
  959. package/.next/server/chunks/[root-of-the-server]__b5c2b370._.js +0 -3
  960. package/.next/server/chunks/[root-of-the-server]__b5c2b370._.js.map +0 -1
  961. package/.next/server/chunks/[root-of-the-server]__b955e35a._.js +0 -3
  962. package/.next/server/chunks/[root-of-the-server]__b955e35a._.js.map +0 -1
  963. package/.next/server/chunks/[root-of-the-server]__be5f57b2._.js +0 -3
  964. package/.next/server/chunks/[root-of-the-server]__c4ff0427._.js +0 -3
  965. package/.next/server/chunks/[root-of-the-server]__c4ff0427._.js.map +0 -1
  966. package/.next/server/chunks/[root-of-the-server]__c4ffbb03._.js +0 -3
  967. package/.next/server/chunks/[root-of-the-server]__c4ffbb03._.js.map +0 -1
  968. package/.next/server/chunks/[root-of-the-server]__d737ca42._.js +0 -3
  969. package/.next/server/chunks/[root-of-the-server]__d737ca42._.js.map +0 -1
  970. package/.next/server/chunks/[root-of-the-server]__df7df3ac._.js +0 -3
  971. package/.next/server/chunks/[root-of-the-server]__df7df3ac._.js.map +0 -1
  972. package/.next/server/chunks/[root-of-the-server]__dfca6557._.js +0 -3
  973. package/.next/server/chunks/[root-of-the-server]__dfca6557._.js.map +0 -1
  974. package/.next/server/chunks/[root-of-the-server]__e6184ba3._.js +0 -3
  975. package/.next/server/chunks/[root-of-the-server]__e6184ba3._.js.map +0 -1
  976. package/.next/server/chunks/[root-of-the-server]__ed0323e9._.js +0 -8
  977. package/.next/server/chunks/[root-of-the-server]__ed0323e9._.js.map +0 -1
  978. package/.next/server/chunks/[root-of-the-server]__f585823b._.js +0 -6
  979. package/.next/server/chunks/[root-of-the-server]__f585823b._.js.map +0 -1
  980. package/.next/server/chunks/[root-of-the-server]__ff940674._.js +0 -3
  981. package/.next/server/chunks/[root-of-the-server]__ff940674._.js.map +0 -1
  982. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_5a9305ea.js +0 -6
  983. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_5a9305ea.js.map +0 -1
  984. package/.next/server/chunks/src_lib_d2210cbf._.js +0 -3
  985. package/.next/server/chunks/src_lib_d2210cbf._.js.map +0 -1
  986. package/.next/server/chunks/ssr/[externals]__c37e9f91._.js +0 -3
  987. package/.next/server/chunks/ssr/[root-of-the-server]__15600e29._.js +0 -3
  988. package/.next/server/chunks/ssr/[root-of-the-server]__247198dc._.js +0 -3
  989. package/.next/server/chunks/ssr/[root-of-the-server]__2a6f1e3e._.js +0 -3
  990. package/.next/server/chunks/ssr/[root-of-the-server]__346f79e5._.js +0 -3
  991. package/.next/server/chunks/ssr/[root-of-the-server]__346f79e5._.js.map +0 -1
  992. package/.next/server/chunks/ssr/[root-of-the-server]__3575e6da._.js +0 -3
  993. package/.next/server/chunks/ssr/[root-of-the-server]__3ad3e5b1._.js +0 -3
  994. package/.next/server/chunks/ssr/[root-of-the-server]__3bc7ad0a._.js +0 -3
  995. package/.next/server/chunks/ssr/[root-of-the-server]__4393e897._.js +0 -3
  996. package/.next/server/chunks/ssr/[root-of-the-server]__4393e897._.js.map +0 -1
  997. package/.next/server/chunks/ssr/[root-of-the-server]__46e08d44._.js +0 -3
  998. package/.next/server/chunks/ssr/[root-of-the-server]__491e06fa._.js +0 -3
  999. package/.next/server/chunks/ssr/[root-of-the-server]__491e06fa._.js.map +0 -1
  1000. package/.next/server/chunks/ssr/[root-of-the-server]__507d2fc9._.js +0 -3
  1001. package/.next/server/chunks/ssr/[root-of-the-server]__507d2fc9._.js.map +0 -1
  1002. package/.next/server/chunks/ssr/[root-of-the-server]__5d24d429._.js +0 -3
  1003. package/.next/server/chunks/ssr/[root-of-the-server]__5d24d429._.js.map +0 -1
  1004. package/.next/server/chunks/ssr/[root-of-the-server]__7180d770._.js.map +0 -1
  1005. package/.next/server/chunks/ssr/[root-of-the-server]__82ce3aee._.js +0 -3
  1006. package/.next/server/chunks/ssr/[root-of-the-server]__82ce3aee._.js.map +0 -1
  1007. package/.next/server/chunks/ssr/[root-of-the-server]__8d24c9c3._.js +0 -3
  1008. package/.next/server/chunks/ssr/[root-of-the-server]__8d24c9c3._.js.map +0 -1
  1009. package/.next/server/chunks/ssr/[root-of-the-server]__a457c799._.js +0 -3
  1010. package/.next/server/chunks/ssr/[root-of-the-server]__a457c799._.js.map +0 -1
  1011. package/.next/server/chunks/ssr/[root-of-the-server]__bc3b27b0._.js +0 -3
  1012. package/.next/server/chunks/ssr/[root-of-the-server]__bc3b27b0._.js.map +0 -1
  1013. package/.next/server/chunks/ssr/[root-of-the-server]__f75a61bf._.js +0 -3
  1014. package/.next/server/chunks/ssr/[root-of-the-server]__f75a61bf._.js.map +0 -1
  1015. package/.next/server/chunks/ssr/[root-of-the-server]__fd669584._.js +0 -3
  1016. package/.next/server/chunks/ssr/_0808c2b9._.js.map +0 -1
  1017. package/.next/server/chunks/ssr/_1aad1d9b._.js +0 -24
  1018. package/.next/server/chunks/ssr/_1aad1d9b._.js.map +0 -1
  1019. package/.next/server/chunks/ssr/_3158c108._.js.map +0 -1
  1020. package/.next/server/chunks/ssr/_39e6e769._.js.map +0 -1
  1021. package/.next/server/chunks/ssr/_3c8b2df6._.js.map +0 -1
  1022. package/.next/server/chunks/ssr/_5070929e._.js +0 -3
  1023. package/.next/server/chunks/ssr/_5070929e._.js.map +0 -1
  1024. package/.next/server/chunks/ssr/_68793c1f._.js.map +0 -1
  1025. package/.next/server/chunks/ssr/_6e70b5a4._.js.map +0 -1
  1026. package/.next/server/chunks/ssr/_8c45edba._.js.map +0 -1
  1027. package/.next/server/chunks/ssr/_8c8207c1._.js.map +0 -1
  1028. package/.next/server/chunks/ssr/_92140ca3._.js.map +0 -1
  1029. package/.next/server/chunks/ssr/_b5e9afcc._.js.map +0 -1
  1030. package/.next/server/chunks/ssr/_cd23c5af._.js.map +0 -1
  1031. package/.next/server/chunks/ssr/_d27483a1._.js.map +0 -1
  1032. package/.next/server/chunks/ssr/_da6f800e._.js.map +0 -1
  1033. package/.next/server/chunks/ssr/d4b1c_modules_next_dist_server_route-modules_app-page_vendored_ssr_react-dom_6ef9314a.js +0 -3
  1034. package/.next/server/chunks/ssr/d4b1c_modules_next_dist_server_route-modules_app-page_vendored_ssr_react-dom_6ef9314a.js.map +0 -1
  1035. package/.next/server/chunks/ssr/node_modules_next_dist_12287b3d._.js.map +0 -1
  1036. package/.next/server/chunks/ssr/node_modules_next_dist_852965c2._.js +0 -3
  1037. package/.next/server/chunks/ssr/node_modules_next_dist_852965c2._.js.map +0 -1
  1038. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_45780354.js +0 -3
  1039. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_45780354.js.map +0 -1
  1040. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js +0 -3
  1041. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js.map +0 -1
  1042. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_68c68167.js.map +0 -1
  1043. package/.next/server/chunks/ssr/src_app_channels_channels-client_tsx_8c8be116._.js +0 -3
  1044. package/.next/server/chunks/ssr/src_app_channels_channels-client_tsx_8c8be116._.js.map +0 -1
  1045. package/.next/server/chunks/ssr/src_app_goals_[id]_goal-editor_tsx_7df8193f._.js +0 -3
  1046. package/.next/server/chunks/ssr/src_app_goals_[id]_goal-editor_tsx_7df8193f._.js.map +0 -1
  1047. package/.next/server/chunks/ssr/src_app_goals_goals-client_tsx_a45eeff4._.js +0 -3
  1048. package/.next/server/chunks/ssr/src_app_goals_goals-client_tsx_a45eeff4._.js.map +0 -1
  1049. package/.next/server/chunks/ssr/src_app_goals_new_page_tsx_8f749229._.js +0 -3
  1050. package/.next/server/chunks/ssr/src_app_goals_new_page_tsx_8f749229._.js.map +0 -1
  1051. package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_tsx_c6d38350._.js +0 -3
  1052. package/.next/server/chunks/ssr/src_app_recipes_[id]_RecipeEditor_tsx_c6d38350._.js.map +0 -1
  1053. package/.next/server/chunks/ssr/src_app_settings_settings-client_tsx_279084f8._.js +0 -3
  1054. package/.next/server/chunks/ssr/src_app_settings_settings-client_tsx_279084f8._.js.map +0 -1
  1055. package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_tsx_2900b91d._.js +0 -12
  1056. package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_tsx_2900b91d._.js.map +0 -1
  1057. package/.next/static/chunks/10cbf02e6fc36465.js +0 -2
  1058. package/.next/static/chunks/1ce21af6dfb18ee3.js +0 -1
  1059. package/.next/static/chunks/40f7fde35327d214.js +0 -1
  1060. package/.next/static/chunks/54beb791bcc086ae.js +0 -1
  1061. package/.next/static/chunks/55866d57aa2c7a9c.js +0 -1
  1062. package/.next/static/chunks/6a7862e37c616cc3.js +0 -1
  1063. package/.next/static/chunks/817ae077ec8c6255.js +0 -1
  1064. package/.next/static/chunks/8484c54dc9a377e8.js +0 -10
  1065. package/.next/static/chunks/8662fcc3cdff66f3.js +0 -1
  1066. package/.next/static/chunks/99208ebf7e47471d.js +0 -1
  1067. package/.next/static/chunks/a4e69b85b74277a7.css +0 -3
  1068. package/.next/static/chunks/a9ed074e89b16a5e.js +0 -1
  1069. package/.next/static/chunks/c6dfa918cafb6c0c.js +0 -1
  1070. package/.next/static/chunks/d1c5f764e5fd615a.js +0 -1
  1071. package/.next/static/chunks/d4ce2f908d8c4dea.js +0 -1
  1072. package/.next/static/chunks/de9e30e86ef31e72.js +0 -1
  1073. package/src/app/recipes/DeleteRecipeModal.tsx +0 -62
  1074. package/src/app/recipes/[id]/RecipeEditor.tsx +0 -697
  1075. package/src/app/teams/[teamId]/DeleteTeamModal.tsx +0 -54
  1076. package/src/app/teams/[teamId]/team-editor.tsx +0 -1195
  1077. /package/.next/server/chunks/{[root-of-the-server]__74b80ca4._.js.map → [root-of-the-server]__c63a9f28._.js.map} +0 -0
  1078. /package/.next/server/chunks/{ssr/[externals]__c37e9f91._.js.map → _next-internal_server_app_api_recipes_custom-team_route_actions_861b1489.js.map} +0 -0
  1079. /package/.next/server/chunks/ssr/{[root-of-the-server]__3bc7ad0a._.js.map → [root-of-the-server]__0d4cb2ba._.js.map} +0 -0
  1080. /package/.next/server/chunks/ssr/{[root-of-the-server]__e2e52c6e._.js.map → [root-of-the-server]__78cdd31e._.js.map} +0 -0
  1081. /package/.next/static/{QOy0ilqTW1kHfmpls_oWp → z9yFlFZ5f_hw9mm0nfMJl}/_buildManifest.js +0 -0
  1082. /package/.next/static/{QOy0ilqTW1kHfmpls_oWp → z9yFlFZ5f_hw9mm0nfMJl}/_clientMiddlewareManifest.json +0 -0
  1083. /package/.next/static/{QOy0ilqTW1kHfmpls_oWp → z9yFlFZ5f_hw9mm0nfMJl}/_ssgManifest.js +0 -0
@@ -1,1195 +0,0 @@
1
- "use client";
2
-
3
- import { useEffect, useMemo, useState } from "react";
4
- import { parse as parseYaml } from "yaml";
5
- import { useRouter } from "next/navigation";
6
- import { DeleteTeamModal } from "./DeleteTeamModal";
7
- import { PublishChangesModal } from "./PublishChangesModal";
8
- import { useToast } from "@/components/ToastProvider";
9
-
10
- type RecipeListItem = {
11
- id: string;
12
- name: string;
13
- kind: "agent" | "team";
14
- source: "builtin" | "workspace";
15
- };
16
-
17
- type RecipeDetail = RecipeListItem & {
18
- content: string;
19
- filePath: string | null;
20
- };
21
-
22
-
23
- function forceFrontmatterId(md: string, id: string) {
24
- if (!md.startsWith("---\n")) return md;
25
- const end = md.indexOf("\n---\n", 4);
26
- if (end === -1) return md;
27
- const fm = md.slice(4, end);
28
- const body = md.slice(end + 5);
29
-
30
- const lines = fm.split("\n");
31
- let found = false;
32
- const nextLines = lines.map((line) => {
33
- if (/^id\s*:/i.test(line)) {
34
- found = true;
35
- return `id: ${id}`;
36
- }
37
- return line;
38
- });
39
- if (!found) nextLines.unshift(`id: ${id}`);
40
-
41
- return `---\n${nextLines.join("\n")}\n---\n${body}`;
42
- }
43
-
44
- function forceFrontmatterTeamTeamId(md: string, teamId: string) {
45
- // Best-effort YAML frontmatter patch without reparsing the whole recipe.
46
- // Goal: ensure `team: { teamId: <id> }` matches the custom recipe id after Save.
47
- if (!md.startsWith("---\n")) return md;
48
- const end = md.indexOf("\n---\n", 4);
49
- if (end === -1) return md;
50
-
51
- const fm = md.slice(4, end);
52
- const body = md.slice(end + 5);
53
- const lines = fm.split("\n");
54
-
55
- const next: string[] = [];
56
- let inTeam = false;
57
- let sawTeamBlock = false;
58
- let patched = false;
59
-
60
- for (let i = 0; i < lines.length; i++) {
61
- const line = lines[i];
62
- if (/^team\s*:\s*$/i.test(line)) {
63
- inTeam = true;
64
- sawTeamBlock = true;
65
- next.push(line);
66
- continue;
67
- }
68
-
69
- // Leave team block when indentation returns to column 0.
70
- if (inTeam && /^\S/.test(line)) {
71
- inTeam = false;
72
- }
73
-
74
- if (inTeam && /^\s+teamId\s*:/i.test(line)) {
75
- next.push(` teamId: ${teamId}`);
76
- patched = true;
77
- continue;
78
- }
79
-
80
- next.push(line);
81
- }
82
-
83
- // If there was a team block but no teamId, insert it right after `team:`.
84
- if (sawTeamBlock && !patched) {
85
- const out: string[] = [];
86
- for (let i = 0; i < next.length; i++) {
87
- out.push(next[i]);
88
- if (/^team\s*:\s*$/i.test(next[i])) {
89
- out.push(` teamId: ${teamId}`);
90
- patched = true;
91
- }
92
- }
93
- return `---\n${out.join("\n")}\n---\n${body}`;
94
- }
95
-
96
- return `---\n${next.join("\n")}\n---\n${body}`;
97
- }
98
-
99
- export default function TeamEditor({ teamId }: { teamId: string }) {
100
- const router = useRouter();
101
- const [recipes, setRecipes] = useState<RecipeListItem[]>([]);
102
- const [fromId, setFromId] = useState<string>("");
103
- const [lockedFromId, setLockedFromId] = useState<string | null>(null);
104
- const [lockedFromName, setLockedFromName] = useState<string | null>(null);
105
- const [provenanceMissing, setProvenanceMissing] = useState(false);
106
- const [toId, setToId] = useState<string>(teamId);
107
- const [toName, setToName] = useState<string>(teamId);
108
- const [content, setContent] = useState<string>("");
109
- const [loadedRecipeHash, setLoadedRecipeHash] = useState<string | null>(null);
110
- const [activeTab, setActiveTab] = useState<"recipe" | "agents" | "skills" | "cron" | "files">("recipe");
111
- const [loading, setLoading] = useState(true);
112
- const [saving, setSaving] = useState(false);
113
- const [publishing, setPublishing] = useState(false);
114
- const [deleting, setDeleting] = useState(false);
115
- const [loadingSource, setLoadingSource] = useState(false);
116
- const [recipeLoadError, setRecipeLoadError] = useState<string>("");
117
- const toast = useToast();
118
-
119
- const [deleteOpen, setDeleteOpen] = useState(false);
120
- const [publishOpen, setPublishOpen] = useState(false);
121
-
122
- const [teamMetaRecipeHash, setTeamMetaRecipeHash] = useState<string | null>(null);
123
-
124
- function flashMessage(next: string, kind: "success" | "error" | "info" = "info") {
125
- const msg = String(next ?? "").trim();
126
- if (!msg) return;
127
- toast.push({ kind, message: msg });
128
- }
129
-
130
- const [teamFiles, setTeamFiles] = useState<Array<{ name: string; missing: boolean; required: boolean; rationale?: string }>>([]);
131
- const [teamFilesLoading, setTeamFilesLoading] = useState(false);
132
- const [teamFileError, setTeamFileError] = useState<string>("");
133
- const [showOptionalFiles, setShowOptionalFiles] = useState(false);
134
- const [fileName, setFileName] = useState<string>("SOUL.md");
135
- const [fileContent, setFileContent] = useState<string>("");
136
-
137
- const [cronJobs, setCronJobs] = useState<unknown[]>([]);
138
- const [cronLoading, setCronLoading] = useState(false);
139
-
140
- const [teamAgents, setTeamAgents] = useState<Array<{ id: string; identityName?: string }>>([]);
141
- const [teamAgentsLoading, setTeamAgentsLoading] = useState(false);
142
-
143
- const recipeAgents = useMemo(() => {
144
- const md = String(content ?? "");
145
- if (!md.startsWith("---\n")) return [] as Array<{ role: string; name?: string }>;
146
- const end = md.indexOf("\n---\n", 4);
147
- if (end === -1) return [] as Array<{ role: string; name?: string }>;
148
- const fmText = md.slice(4, end + 1);
149
- try {
150
- const fm = (parseYaml(fmText) ?? {}) as { agents?: unknown };
151
- const agents = Array.isArray(fm.agents) ? fm.agents : [];
152
- return agents
153
- .map((a) => a as { role?: unknown; name?: unknown })
154
- .map((a) => ({ role: String(a.role ?? "").trim(), name: typeof a.name === "string" ? a.name : undefined }))
155
- .filter((a) => Boolean(a.role));
156
- } catch {
157
- return [] as Array<{ role: string; name?: string }>;
158
- }
159
- }, [content]);
160
-
161
- const [newRole, setNewRole] = useState<string>("");
162
- const [customRole, setCustomRole] = useState<string>("");
163
- const [newRoleName, setNewRoleName] = useState<string>("");
164
-
165
- const derivedRole = useMemo(() => {
166
- const v = (newRole === "__custom__" ? customRole : newRole).trim();
167
- if (!v) return "";
168
- return v;
169
- }, [newRole, customRole]);
170
-
171
- const [skillsList, setSkillsList] = useState<string[]>([]);
172
- const [availableSkills, setAvailableSkills] = useState<string[]>([]);
173
- const [skillsLoading, setSkillsLoading] = useState(false);
174
- const [selectedSkill, setSelectedSkill] = useState<string>("");
175
- const [installingSkill, setInstallingSkill] = useState(false);
176
- const [teamSkillMsg, setTeamSkillMsg] = useState<string>("");
177
- const [teamSkillError, setTeamSkillError] = useState<string>("");
178
-
179
- const teamRecipes = useMemo(() => recipes.filter((r) => r.kind === "team"), [recipes]);
180
-
181
- const toRecipe = useMemo(() => {
182
- // Prefer the workspace recipe when both builtin + workspace exist for the same id.
183
- const ws = recipes.find((r) => r.id === toId && r.source === "workspace");
184
- return ws ?? recipes.find((r) => r.id === toId) ?? null;
185
- }, [recipes, toId]);
186
-
187
- const teamIdValid = Boolean(teamId.trim());
188
- const targetIdValid = Boolean(toId.trim());
189
- const hasWorkspaceOverride = recipes.some((r) => r.id === toId && r.source === "workspace");
190
- const targetIsBuiltin = Boolean(toRecipe?.source === "builtin" && !hasWorkspaceOverride);
191
- // The "Recipe id" field is the workspace recipe id target.
192
- // It should be editable, and we must not auto-prefix/modify what the user types.
193
- const canEditTargetId = true;
194
-
195
- // Initialize defaults whenever we navigate to a new team.
196
- useEffect(() => {
197
- setToId(teamId);
198
- setToName(teamId);
199
- setContent("");
200
- setLoadedRecipeHash(null);
201
- setTeamMetaRecipeHash(null);
202
- setPublishOpen(false);
203
- setDeleteOpen(false);
204
- }, [teamId]);
205
-
206
- useEffect(() => {
207
- (async () => {
208
- setLoading(true);
209
- try {
210
- const [recipesRes, metaRes] = await Promise.all([
211
- fetch("/api/recipes", { cache: "no-store" }),
212
- fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: "no-store" }),
213
- ]);
214
-
215
- const json = await recipesRes.json();
216
- const list = (json.recipes ?? []) as RecipeListItem[];
217
- setRecipes(list);
218
-
219
- // Note: do not sync toName/toId from remote state here.
220
- // Edits to the target id/name must not trigger reload loops while typing.
221
-
222
- // Prefer a recipe that corresponds to this teamId.
223
- // Primary source of truth: provenance stored in the team workspace.
224
- // Fallback: heuristic matching (legacy teams without provenance).
225
- let locked: { recipeId: string; recipeName?: string } | null = null;
226
- try {
227
- const metaJson = await metaRes.json();
228
- if (metaRes.ok && metaJson.ok && metaJson.meta && (metaJson.meta as { recipeId?: unknown }).recipeId) {
229
- const m = metaJson.meta as { recipeId?: unknown; recipeName?: unknown; recipeHash?: unknown };
230
- locked = {
231
- recipeId: String(m.recipeId),
232
- recipeName: typeof m.recipeName === "string" ? m.recipeName : undefined,
233
- };
234
- const h = typeof m.recipeHash === "string" ? m.recipeHash : null;
235
- setTeamMetaRecipeHash(h);
236
- } else {
237
- setTeamMetaRecipeHash(null);
238
- }
239
- } catch {
240
- // ignore
241
- }
242
-
243
- if (locked) {
244
- setLockedFromId(locked.recipeId);
245
- setLockedFromName(locked.recipeName ?? null);
246
- setProvenanceMissing(false);
247
- setFromId(locked.recipeId);
248
- } else {
249
- setLockedFromId(null);
250
- setLockedFromName(null);
251
- setProvenanceMissing(true);
252
-
253
- const preferred = list.find((r) => r.kind === "team" && r.id === teamId);
254
- const fallback = list.find((r) => r.kind === "team");
255
- const pick = preferred ?? fallback;
256
- if (pick) setFromId(pick.id);
257
- }
258
-
259
- // Render ASAP; load the heavier per-tab data in the background.
260
- setLoading(false);
261
-
262
- void (async () => {
263
- setTeamFilesLoading(true);
264
- setCronLoading(true);
265
- setTeamAgentsLoading(true);
266
- setSkillsLoading(true);
267
-
268
- try {
269
- const [filesRes, cronRes, agentsRes, skillsRes, availableSkillsRes] = await Promise.all([
270
- fetch(`/api/teams/files?teamId=${encodeURIComponent(teamId)}`, { cache: "no-store" }),
271
- fetch(`/api/cron/jobs?teamId=${encodeURIComponent(teamId)}`, { cache: "no-store" }),
272
- fetch("/api/agents", { cache: "no-store" }),
273
- fetch(`/api/teams/skills?teamId=${encodeURIComponent(teamId)}`, { cache: "no-store" }),
274
- fetch("/api/skills/available", { cache: "no-store" }),
275
- ]);
276
-
277
- try {
278
- const filesJson = (await filesRes.json()) as { ok?: boolean; files?: unknown[] };
279
- if (filesRes.ok && filesJson.ok) {
280
- const files = Array.isArray(filesJson.files) ? filesJson.files : [];
281
- setTeamFiles(
282
- files.map((f) => {
283
- const entry = f as { name?: unknown; missing?: unknown; required?: unknown; rationale?: unknown };
284
- return {
285
- name: String(entry.name ?? ""),
286
- missing: Boolean(entry.missing),
287
- required: Boolean(entry.required),
288
- rationale: typeof entry.rationale === "string" ? entry.rationale : undefined,
289
- };
290
- }),
291
- );
292
- }
293
- } catch {
294
- // ignore
295
- }
296
-
297
- try {
298
- const cronJson = (await cronRes.json()) as { ok?: boolean; jobs?: unknown[] };
299
- if (cronRes.ok && cronJson.ok) {
300
- const all = Array.isArray(cronJson.jobs) ? cronJson.jobs : [];
301
- setCronJobs(all);
302
- }
303
- } catch {
304
- // ignore
305
- }
306
-
307
- try {
308
- const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };
309
- if (agentsRes.ok) {
310
- const all = Array.isArray(agentsJson.agents) ? agentsJson.agents : [];
311
- // Team membership for agents is by id convention: <teamId>-<role>
312
- const filtered = all.filter((a) => String((a as { id?: unknown }).id ?? "").startsWith(`${teamId}-`));
313
- setTeamAgents(
314
- filtered.map((a) => {
315
- const agent = a as { id?: unknown; identityName?: unknown };
316
- return { id: String(agent.id ?? ""), identityName: typeof agent.identityName === "string" ? agent.identityName : undefined };
317
- }),
318
- );
319
- }
320
- } catch {
321
- // ignore
322
- }
323
-
324
- try {
325
- const skillsJson = await skillsRes.json();
326
- if (skillsRes.ok && skillsJson.ok) {
327
- setSkillsList(Array.isArray(skillsJson.skills) ? (skillsJson.skills as string[]) : []);
328
- }
329
- } catch {
330
- // ignore
331
- }
332
-
333
- try {
334
- const availableSkillsJson = (await availableSkillsRes.json()) as { ok?: boolean; skills?: unknown[] };
335
- if (availableSkillsRes.ok && availableSkillsJson.ok) {
336
- const list = Array.isArray(availableSkillsJson.skills) ? (availableSkillsJson.skills as string[]) : [];
337
- setAvailableSkills(list);
338
- setSelectedSkill((prev) => {
339
- const p = String(prev ?? "").trim();
340
- if (p && list.includes(p)) return p;
341
- return list[0] ?? "";
342
- });
343
- }
344
- } catch {
345
- // ignore
346
- }
347
- } finally {
348
- setTeamFilesLoading(false);
349
- setCronLoading(false);
350
- setTeamAgentsLoading(false);
351
- setSkillsLoading(false);
352
- }
353
- })();
354
- } catch (e: unknown) {
355
- flashMessage(e instanceof Error ? e.message : String(e), "error");
356
- } finally {
357
- // If the happy-path already flipped loading=false early, this is a no-op.
358
- setLoading(false);
359
- }
360
- })();
361
- // eslint-disable-next-line react-hooks/exhaustive-deps
362
- }, [teamId]);
363
-
364
- async function onLoadTeamRecipeMarkdown() {
365
- const id = toId.trim();
366
- if (!id) return;
367
- setLoadingSource(true);
368
- setRecipeLoadError("");
369
- try {
370
- const res = await fetch(`/api/recipes/${encodeURIComponent(id)}`, { cache: "no-store" });
371
- const json = await res.json();
372
- if (!res.ok) {
373
- // Usually means the workspace recipe doesn't exist yet.
374
- throw new Error(json.error || `Recipe not found: ${id}. Save first to create it.`);
375
- }
376
- const r = json.recipe as RecipeDetail;
377
- setContent(r.content);
378
- setLoadedRecipeHash(typeof json.recipeHash === "string" ? json.recipeHash : null);
379
- } catch (e: unknown) {
380
- setRecipeLoadError(e instanceof Error ? e.message : String(e));
381
- } finally {
382
- setLoadingSource(false);
383
- }
384
- }
385
-
386
- // Load raw recipe markdown by default (no "click to load").
387
- useEffect(() => {
388
- const id = toId.trim();
389
- if (!id) return;
390
- if (content.trim()) return;
391
- if (loadingSource) return;
392
- void onLoadTeamRecipeMarkdown();
393
- // eslint-disable-next-line react-hooks/exhaustive-deps
394
- }, [toId]);
395
-
396
- async function ensureCustomRecipeExists(args: { overwrite: boolean; toId?: string; toName?: string; scaffold?: boolean }) {
397
- const f = fromId.trim();
398
- const id = String(args.toId ?? toId).trim();
399
- const name = String(args.toName ?? toName).trim();
400
- const overwrite = Boolean(args.overwrite);
401
- const scaffold = Boolean(args.scaffold);
402
-
403
- if (!f) throw new Error("Source recipe id is required");
404
- if (!id) throw new Error("Custom recipe id is required");
405
-
406
- const res = await fetch("/api/recipes/clone", {
407
- method: "POST",
408
- headers: { "content-type": "application/json" },
409
- body: JSON.stringify({ fromId: f, toId: id, toName: name || undefined, overwrite, scaffold }),
410
- });
411
- const json = await res.json();
412
- if (!res.ok) throw new Error(json.error || "Save failed");
413
- return json as { filePath: string; content: string; scaffold?: { ok: boolean; error?: string } | null };
414
- }
415
-
416
- async function onSaveCustom(overwrite: boolean, overrides?: { toId?: string; toName?: string; scaffold?: boolean }) {
417
- setSaving(true);
418
- flashMessage("");
419
- try {
420
- const json = await ensureCustomRecipeExists({ overwrite, ...overrides });
421
-
422
- if (json.scaffold && !json.scaffold.ok) {
423
- flashMessage(`Scaffold failed (recipe was still cloned): ${json.scaffold.error || "Unknown error"}`, "error");
424
- }
425
-
426
- // If the user has edited the markdown, "Save (overwrite)" should persist both
427
- // the updated name (frontmatter) and the edited markdown.
428
- const hasEdits = Boolean(content.trim()) && content.trim() !== json.content.trim();
429
-
430
- if (hasEdits) {
431
- const nextContent = forceFrontmatterTeamTeamId(forceFrontmatterId(content, toId.trim()), toId.trim());
432
- const res = await fetch(`/api/recipes/${encodeURIComponent(toId.trim())}`, {
433
- method: "PUT",
434
- headers: { "content-type": "application/json" },
435
- body: JSON.stringify({ content: nextContent }),
436
- });
437
- const putJson = await res.json();
438
- if (!res.ok) throw new Error(putJson.error || "Save failed");
439
- setContent(nextContent);
440
- } else {
441
- setContent(json.content);
442
- }
443
-
444
- // Refresh hash from server so Publish can reliably detect unpropagated changes.
445
- try {
446
- const res = await fetch(`/api/recipes/${encodeURIComponent(toId.trim())}`, { cache: "no-store" });
447
- const next = await res.json();
448
- if (res.ok && typeof next.recipeHash === "string") setLoadedRecipeHash(next.recipeHash);
449
- } catch {
450
- setLoadedRecipeHash(null);
451
- }
452
-
453
- flashMessage(`Saved team recipe: ${json.filePath}`, "success");
454
- } catch (e: unknown) {
455
- const raw = e instanceof Error ? e.message : String(e);
456
- flashMessage(raw, "error");
457
- } finally {
458
- setSaving(false);
459
- }
460
- }
461
-
462
- async function onLoadTeamFile(name: string) {
463
- setSaving(true);
464
- setTeamFileError("");
465
- try {
466
- const res = await fetch(
467
- `/api/teams/file?teamId=${encodeURIComponent(teamId)}&name=${encodeURIComponent(name)}`,
468
- { cache: "no-store" }
469
- );
470
- const json = await res.json();
471
- if (!res.ok || !json.ok) throw new Error(json.error || "Failed to load file");
472
- setFileName(name);
473
- setFileContent(String(json.content ?? ""));
474
- } catch (e: unknown) {
475
- setTeamFileError(e instanceof Error ? e.message : String(e));
476
- } finally {
477
- setSaving(false);
478
- }
479
- }
480
-
481
- async function onSaveTeamFile() {
482
- setSaving(true);
483
- setTeamFileError("");
484
- try {
485
- const res = await fetch("/api/teams/file", {
486
- method: "PUT",
487
- headers: { "content-type": "application/json" },
488
- body: JSON.stringify({ teamId, name: fileName, content: fileContent }),
489
- });
490
- const json = await res.json();
491
- if (!res.ok || !json.ok) throw new Error(json.error || "Failed to save file");
492
- // No toast; keep file-related messaging local.
493
- } catch (e: unknown) {
494
- setTeamFileError(e instanceof Error ? e.message : String(e));
495
- } finally {
496
- setSaving(false);
497
- }
498
- }
499
-
500
- // Initial load only gates the minimal state (recipes + team meta). Everything else streams in.
501
- if (loading) return <div className="ck-glass mx-auto max-w-4xl p-6">Loading…</div>;
502
-
503
- return (
504
- <div className="ck-glass mx-auto max-w-6xl p-6 sm:p-8">
505
- <h1 className="text-2xl font-semibold tracking-tight">Team editor</h1>
506
- <p className="mt-2 text-sm text-[color:var(--ck-text-secondary)]">
507
- Bootstrap a <strong>custom team recipe</strong> for this installed team, without modifying builtin recipes.
508
- </p>
509
-
510
- <div className="mt-6 flex flex-wrap gap-2">
511
- {(
512
- [
513
- { id: "recipe", label: "Recipe" },
514
- { id: "agents", label: "Agents" },
515
- { id: "skills", label: "Skills" },
516
- { id: "cron", label: "Cron" },
517
- { id: "files", label: "Files" },
518
- ] as const
519
- ).map((t) => (
520
- <button
521
- key={t.id}
522
- onClick={() => setActiveTab(t.id)}
523
- className={
524
- activeTab === t.id
525
- ? "rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)]"
526
- : "rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-white/10"
527
- }
528
- >
529
- {t.label}
530
- </button>
531
- ))}
532
- </div>
533
-
534
- {activeTab === "recipe" ? (
535
- <div className="mt-6 grid grid-cols-1 gap-4 lg:grid-cols-2">
536
- <div className="ck-glass-strong p-4">
537
- <div className="text-sm font-medium text-[color:var(--ck-text-primary)]">Custom recipe target</div>
538
- <label className="mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]">Team id</label>
539
- <input
540
- value={toId}
541
- onChange={(e) => setToId(e.target.value)}
542
- disabled={!canEditTargetId}
543
- className="mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] disabled:opacity-70"
544
- />
545
- <div className="mt-1 text-xs text-[color:var(--ck-text-tertiary)]">
546
- This is the <b>custom recipe id</b> that will be created/overwritten when you save.
547
- </div>
548
-
549
- <label className="mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]">Team name</label>
550
- <input
551
- value={toName}
552
- onChange={(e) => setToName(e.target.value)}
553
- className="mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"
554
- />
555
-
556
- <div className="mt-4 grid grid-cols-1 gap-2">
557
- {/* Load team markdown removed (auto-loads by default). */}
558
-
559
- <button
560
- type="button"
561
- disabled={saving || !teamIdValid || !targetIdValid || targetIsBuiltin}
562
- onClick={() => onSaveCustom(true)}
563
- className="rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[var(--ck-accent-red-hover)] active:bg-[var(--ck-accent-red-active)] disabled:opacity-50"
564
- >
565
- {saving ? "Saving…" : "Save"}
566
- </button>
567
-
568
- <button
569
- type="button"
570
- disabled={
571
- saving ||
572
- !teamIdValid ||
573
- !targetIdValid ||
574
- targetIsBuiltin ||
575
- // Enabled only when there are unpropagated (saved) changes.
576
- !loadedRecipeHash ||
577
- !teamMetaRecipeHash ||
578
- loadedRecipeHash === teamMetaRecipeHash
579
- }
580
- onClick={() => setPublishOpen(true)}
581
- className="rounded-[var(--ck-radius-sm)] bg-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-emerald-500 active:bg-emerald-700 disabled:opacity-50"
582
- >
583
- {publishing ? "Publishing…" : "Publish changes"}
584
- </button>
585
-
586
- <button
587
- type="button"
588
- disabled={saving}
589
- onClick={() => setDeleteOpen(true)}
590
- className="rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15 disabled:opacity-50"
591
- >
592
- Delete Team
593
- </button>
594
- </div>
595
- </div>
596
-
597
- <div className="ck-glass-strong p-4">
598
- <div className="text-sm font-medium text-[color:var(--ck-text-primary)]">Notes</div>
599
-
600
- <div className="mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3">
601
- <div className="text-xs font-medium text-[color:var(--ck-text-secondary)]">Parent recipe (locked)</div>
602
- <select
603
- disabled
604
- className="mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] disabled:opacity-70"
605
- value={fromId}
606
- onChange={(e) => setFromId(e.target.value)}
607
- >
608
- {teamRecipes.map((r) => (
609
- <option key={`${r.source}:${r.id}`} value={r.id}>
610
- {r.id} ({r.source})
611
- </option>
612
- ))}
613
- </select>
614
- {lockedFromId ? (
615
- <div className="mt-2 text-xs text-[color:var(--ck-text-tertiary)]">
616
- <code>{lockedFromId}</code>
617
- {lockedFromName ? ` (${lockedFromName})` : ""}
618
- </div>
619
- ) : provenanceMissing ? (
620
- <div className="mt-2 text-xs text-[color:var(--ck-text-tertiary)]">
621
- Provenance not found for this team. The parent recipe above is a best-guess.
622
- </div>
623
- ) : null}
624
-
625
-
626
- </div>
627
-
628
- <ul className="mt-4 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]">
629
- <li>
630
- <strong>Save</strong> writes/overwrites the custom recipe file identified by “Team id”.
631
- </li>
632
- <li>
633
- <strong>Publish changes</strong> re-scaffolds this team from your current custom recipe and applies config (complete overwrite).
634
- </li>
635
- <li>
636
- <strong>Delete Team</strong> runs the safe uninstall command (<code>openclaw recipes remove-team</code>).
637
- </li>
638
- </ul>
639
- </div>
640
- </div>
641
- ) : null}
642
-
643
- {activeTab === "agents" ? (
644
- <div className="mt-6 ck-glass-strong p-4">
645
- <div className="text-sm font-medium text-[color:var(--ck-text-primary)]">Agents in this team</div>
646
- <p className="mt-2 text-sm text-[color:var(--ck-text-secondary)]">
647
- Add/remove agents by updating the <code>agents:</code> list in your custom team recipe (<code>{toId}</code>).
648
- </p>
649
-
650
- <div className="mt-4 grid grid-cols-1 gap-3 sm:grid-cols-3">
651
- <div>
652
- <label className="block text-xs font-medium text-[color:var(--ck-text-secondary)]">Role</label>
653
- <select
654
- value={newRole}
655
- onChange={(e) => {
656
- const v = e.target.value;
657
- setNewRole(v);
658
- if (v === "__custom__") {
659
- setCustomRole("");
660
- setNewRoleName("");
661
- return;
662
- }
663
- setCustomRole("");
664
- const match = recipeAgents.find((a) => a.role === v);
665
- setNewRoleName(match?.name || "");
666
- }}
667
- className="mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"
668
- >
669
- <option value="">Select…</option>
670
- {recipeAgents.map((a) => (
671
- <option key={a.role} value={a.role}>
672
- {a.name || a.role}
673
- </option>
674
- ))}
675
- <option value="__custom__">Other…</option>
676
- </select>
677
-
678
- {newRole === "__custom__" ? (
679
- <input
680
- value={customRole}
681
- onChange={(e) => setCustomRole(e.target.value)}
682
- placeholder="role (e.g. researcher)"
683
- className="mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"
684
- />
685
- ) : null}
686
-
687
- <div className="mt-1 text-xs text-[color:var(--ck-text-tertiary)]">
688
- This writes to the recipe’s <code>agents:</code> list.
689
- </div>
690
- </div>
691
-
692
- <div className="sm:col-span-2">
693
- <div>
694
- <label className="block text-xs font-medium text-[color:var(--ck-text-secondary)]">Name (optional)</label>
695
- <input
696
- value={newRoleName}
697
- onChange={(e) => setNewRoleName(e.target.value)}
698
- placeholder="Onchain Researcher"
699
- className="mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"
700
- />
701
- </div>
702
- </div>
703
- </div>
704
-
705
- <div className="mt-3 flex flex-wrap gap-2">
706
- <button
707
- disabled={saving || !derivedRole}
708
- onClick={async () => {
709
- setSaving(true);
710
- try {
711
- try {
712
- await ensureCustomRecipeExists({ overwrite: false });
713
- } catch (e: unknown) {
714
- // If the custom recipe already exists, proceed; we only needed to ensure a workspace file exists.
715
- // Note: /api/recipes/clone returns 409 in this case.
716
- const msg = e instanceof Error ? e.message : String(e);
717
- if (!/Recipe id already exists:/i.test(msg)) throw e;
718
- }
719
- const res = await fetch("/api/recipes/team-agents", {
720
- method: "POST",
721
- headers: { "content-type": "application/json" },
722
- body: JSON.stringify(
723
- newRole === "__custom__"
724
- ? {
725
- recipeId: toId.trim(),
726
- op: "add",
727
- role: derivedRole,
728
- name: newRoleName,
729
- }
730
- : {
731
- recipeId: toId.trim(),
732
- op: "addLike",
733
- baseRole: derivedRole,
734
- teamId,
735
- name: newRoleName,
736
- },
737
- ),
738
- });
739
- const json = await res.json();
740
- if (!res.ok || !json.ok) throw new Error(json.error || "Failed updating agents list");
741
- setContent(String(json.content ?? content));
742
-
743
- // Immediately install/create the new agent by applying config and scaffolding missing files.
744
- // Do not overwrite existing recipe-managed files.
745
- try {
746
- const sync = await fetch("/api/scaffold", {
747
- method: "POST",
748
- headers: { "content-type": "application/json" },
749
- body: JSON.stringify({
750
- kind: "team",
751
- recipeId: toId.trim(),
752
- teamId,
753
- applyConfig: true,
754
- overwrite: false,
755
- allowExisting: true,
756
- cronInstallChoice: "no",
757
- }),
758
- });
759
- const syncJson = await sync.json();
760
- if (!sync.ok) throw new Error(syncJson.error || "Failed to apply config / scaffold team");
761
- } catch (e: unknown) {
762
- // Non-fatal: recipe change is still saved.
763
- flashMessage(e instanceof Error ? e.message : String(e), "error");
764
- }
765
-
766
- // Poll for new agent to appear; only restart gateway if needed.
767
- const expectedAgentId = typeof (json as { addedAgentId?: unknown }).addedAgentId === "string" ? (json as { addedAgentId?: string }).addedAgentId : "";
768
-
769
- async function refreshAgentsOnce() {
770
- const agentsRes = await fetch("/api/agents", { cache: "no-store" });
771
- const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };
772
- if (!agentsRes.ok) return { ok: false as const, hasExpected: false as const, agents: [] as Array<{ id: string; identityName?: string }> };
773
- const all = Array.isArray(agentsJson.agents) ? agentsJson.agents : [];
774
- const filtered = all.filter((a) => String((a as { id?: unknown }).id ?? "").startsWith(`${teamId}-`));
775
- const mapped = filtered.map((a) => {
776
- const agent = a as { id?: unknown; identityName?: unknown };
777
- return {
778
- id: String(agent.id ?? ""),
779
- identityName: typeof agent.identityName === "string" ? agent.identityName : undefined,
780
- };
781
- });
782
- const hasExpected = expectedAgentId ? mapped.some((a) => a.id === expectedAgentId) : false;
783
- return { ok: true as const, hasExpected, agents: mapped };
784
- }
785
-
786
- async function pollAgents(maxMs: number) {
787
- const start = Date.now();
788
- while (Date.now() - start < maxMs) {
789
- try {
790
- const r = await refreshAgentsOnce();
791
- if (r.ok) {
792
- setTeamAgents(r.agents);
793
- if (!expectedAgentId || r.hasExpected) return true;
794
- }
795
- } catch {
796
- // ignore
797
- }
798
- await new Promise((res) => setTimeout(res, 500));
799
- }
800
- return false;
801
- }
802
-
803
- const appeared = await pollAgents(5000);
804
- if (!appeared && expectedAgentId) {
805
- // Background-ish restart: do it only if needed.
806
- try {
807
- void fetch("/api/gateway/restart", { method: "POST" });
808
- } catch {
809
- // ignore
810
- }
811
- await pollAgents(10000);
812
- }
813
-
814
- flashMessage(`Updated agents list in ${toId}`, "success");
815
- } catch (e: unknown) {
816
- flashMessage(e instanceof Error ? e.message : String(e), "error");
817
- } finally {
818
- setSaving(false);
819
- }
820
- }}
821
- className="rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50"
822
- >
823
- Add agent
824
- </button>
825
- {/* remove-agent UI intentionally omitted */}
826
- </div>
827
-
828
- <div className="mt-6">
829
- <div className="text-xs font-medium text-[color:var(--ck-text-secondary)]">Detected installed team agents (read-only)</div>
830
- <ul className="mt-2 space-y-2">
831
- {teamAgents.length ? (
832
- teamAgents.map((a) => (
833
- <li key={a.id} className="flex items-center justify-between gap-3">
834
- <div className="min-w-0">
835
- <div className="truncate text-sm font-medium text-[color:var(--ck-text-primary)]">
836
- {a.identityName || a.id}
837
- </div>
838
- <div className="text-xs text-[color:var(--ck-text-secondary)]">{a.id}</div>
839
- </div>
840
- <a
841
- className="text-sm font-medium text-[color:var(--ck-accent-red)] hover:text-[color:var(--ck-accent-red-hover)]"
842
- href={`/agents/${encodeURIComponent(a.id)}?returnTo=${encodeURIComponent(`/teams/${teamId}?tab=agents`)}`}
843
- >
844
- Edit
845
- </a>
846
- </li>
847
- ))
848
- ) : teamAgentsLoading ? (
849
- <li className="text-sm text-[color:var(--ck-text-secondary)]">Loading…</li>
850
- ) : (
851
- <li className="text-sm text-[color:var(--ck-text-secondary)]">No team agents detected.</li>
852
- )}
853
- </ul>
854
- </div>
855
- </div>
856
- ) : null}
857
-
858
- {activeTab === "skills" ? (
859
- <div className="mt-6 ck-glass-strong p-4">
860
- <div className="text-sm font-medium text-[color:var(--ck-text-primary)]">Skills</div>
861
- <p className="mt-2 text-sm text-[color:var(--ck-text-secondary)]">
862
- Skills installed in this <strong>team</strong> workspace (<code>skills/</code>). These are available to all agents in the team.
863
- For agent-specific skills, open the agent from the Agents tab.
864
- </p>
865
-
866
- <div className="mt-4">
867
- <div className="text-xs font-medium text-[color:var(--ck-text-secondary)]">Installed</div>
868
- <ul className="mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]">
869
- {skillsList.length ? skillsList.map((s) => <li key={s}>{s}</li>) : <li>None installed.</li>}
870
- </ul>
871
- </div>
872
-
873
- <div className="mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3">
874
- <div className="text-xs font-medium text-[color:var(--ck-text-secondary)]">Add a skill</div>
875
- <div className="mt-2 flex flex-col gap-2 sm:flex-row sm:items-center">
876
- <select
877
- value={selectedSkill}
878
- onChange={(e) => setSelectedSkill(e.target.value)}
879
- className="w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"
880
- disabled={installingSkill || skillsLoading || !availableSkills.length}
881
- >
882
- {availableSkills.length ? (
883
- availableSkills.map((s) => (
884
- <option key={s} value={s}>
885
- {s}
886
- </option>
887
- ))
888
- ) : (
889
- <option value="">No skills found</option>
890
- )}
891
- </select>
892
- <button
893
- type="button"
894
- disabled={installingSkill || skillsLoading || !selectedSkill}
895
- onClick={async () => {
896
- setInstallingSkill(true);
897
- setTeamSkillMsg("");
898
- setTeamSkillError("");
899
- try {
900
- const res = await fetch("/api/teams/skills/install", {
901
- method: "POST",
902
- headers: { "content-type": "application/json" },
903
- body: JSON.stringify({ teamId, skill: selectedSkill }),
904
- });
905
- const json = await res.json();
906
- if (!res.ok || !json.ok) throw new Error(json.error || "Failed to install skill");
907
- setTeamSkillMsg(`Installed skill: ${selectedSkill}`);
908
-
909
- // Refresh installed list.
910
- const r = await fetch(`/api/teams/skills?teamId=${encodeURIComponent(teamId)}`, { cache: "no-store" });
911
- const j = await r.json();
912
- if (r.ok && j.ok) setSkillsList(Array.isArray(j.skills) ? (j.skills as string[]) : []);
913
- } catch (e: unknown) {
914
- setTeamSkillError(e instanceof Error ? e.message : String(e));
915
- } finally {
916
- setInstallingSkill(false);
917
- }
918
- }}
919
- className="rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50"
920
- >
921
- {installingSkill ? "Adding…" : "Add"}
922
- </button>
923
- </div>
924
- {teamSkillError ? (
925
- <div className="mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100">
926
- {teamSkillError}
927
- </div>
928
- ) : null}
929
-
930
- {teamSkillMsg ? (
931
- <div className="mt-3 rounded-[var(--ck-radius-sm)] border border-emerald-400/30 bg-emerald-500/10 p-3 text-sm text-emerald-100">
932
- {teamSkillMsg}
933
- </div>
934
- ) : null}
935
-
936
- <div className="mt-2 text-xs text-[color:var(--ck-text-tertiary)]">
937
- This uses <code>openclaw recipes install-skill &lt;skill&gt; --team-id {teamId} --yes</code>.
938
- </div>
939
- </div>
940
- </div>
941
- ) : null}
942
-
943
- {activeTab === "cron" ? (
944
- <div className="mt-6 ck-glass-strong p-4">
945
- <div className="text-sm font-medium text-[color:var(--ck-text-primary)]">Cron jobs (filtered by team name)</div>
946
- <ul className="mt-3 space-y-3">
947
- {cronJobs.length ? (
948
- cronJobs.map((j) => {
949
- const job = j as {
950
- id?: unknown;
951
- jobId?: unknown;
952
- name?: unknown;
953
- enabled?: unknown;
954
- state?: { enabled?: unknown };
955
- };
956
- const id = String(job.id ?? job.jobId ?? "").trim();
957
- const key = id || String(job.name ?? "job");
958
- const label = String(job.name ?? job.id ?? job.jobId ?? "(unnamed)");
959
- const enabled = job.enabled ?? job.state?.enabled;
960
-
961
- async function act(action: "enable" | "disable" | "run") {
962
- setSaving(true);
963
- try {
964
- const res = await fetch("/api/cron/job", {
965
- method: "POST",
966
- headers: { "content-type": "application/json" },
967
- body: JSON.stringify({ id, action }),
968
- });
969
- const json = await res.json();
970
- if (!res.ok || !json.ok) throw new Error(json.error || "Cron action failed");
971
- flashMessage(`Cron ${action}: ${label}`, "success");
972
- } catch (e: unknown) {
973
- flashMessage(e instanceof Error ? e.message : String(e), "error");
974
- } finally {
975
- setSaving(false);
976
- }
977
- }
978
-
979
- return (
980
- <li key={key} className="rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3">
981
- <div className="font-medium text-[color:var(--ck-text-primary)]">{label}</div>
982
- <div className="mt-1 text-xs text-[color:var(--ck-text-secondary)]">Enabled: {String(enabled ?? "?")}</div>
983
- <div className="mt-2 flex flex-wrap gap-2">
984
- <button
985
- disabled={saving || !id}
986
- onClick={() => act("run")}
987
- className="rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50"
988
- >
989
- Run
990
- </button>
991
- <button
992
- disabled={saving || !id}
993
- onClick={() => act("enable")}
994
- className="rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50"
995
- >
996
- Enable
997
- </button>
998
- <button
999
- disabled={saving || !id}
1000
- onClick={() => act("disable")}
1001
- className="rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50"
1002
- >
1003
- Disable
1004
- </button>
1005
- {!id ? (
1006
- <div className="text-xs text-[color:var(--ck-text-tertiary)]">(missing id)</div>
1007
- ) : null}
1008
- </div>
1009
- </li>
1010
- );
1011
- })
1012
- ) : cronLoading ? (
1013
- <li className="text-sm text-[color:var(--ck-text-secondary)]">Loading…</li>
1014
- ) : (
1015
- <li className="text-sm text-[color:var(--ck-text-secondary)]">No cron jobs detected for this team.</li>
1016
- )}
1017
- </ul>
1018
- </div>
1019
- ) : null}
1020
-
1021
- {activeTab === "files" ? (
1022
- <div className="mt-6 grid grid-cols-1 gap-4 lg:grid-cols-3">
1023
- <div className="ck-glass-strong p-4">
1024
- <div className="flex items-center justify-between gap-3">
1025
- <div className="text-sm font-medium text-[color:var(--ck-text-primary)]">Team files</div>
1026
- <label className="flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]">
1027
- <input
1028
- type="checkbox"
1029
- checked={showOptionalFiles}
1030
- onChange={(e) => setShowOptionalFiles(e.target.checked)}
1031
- />
1032
- Show optional
1033
- </label>
1034
- </div>
1035
- <div className="mt-2 text-xs text-[color:var(--ck-text-tertiary)]">
1036
- Default view hides optional missing files to reduce noise.
1037
- </div>
1038
- <ul className="mt-3 space-y-1">
1039
- {teamFilesLoading ? (
1040
- <li className="text-sm text-[color:var(--ck-text-secondary)]">Loading…</li>
1041
- ) : null}
1042
- {teamFiles
1043
- .filter((f) => (showOptionalFiles ? true : f.required || !f.missing))
1044
- .map((f) => (
1045
- <li key={f.name}>
1046
- <button
1047
- onClick={() => onLoadTeamFile(f.name)}
1048
- className={
1049
- fileName === f.name
1050
- ? "w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]"
1051
- : "w-full rounded-[var(--ck-radius-sm)] px-3 py-2 text-left text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5"
1052
- }
1053
- >
1054
- <span className={f.required ? "text-[color:var(--ck-text-primary)]" : "text-[color:var(--ck-text-secondary)]"}>
1055
- {f.name}
1056
- </span>
1057
- <span className="ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]">
1058
- {f.required ? "required" : "optional"}
1059
- </span>
1060
- {f.missing ? <span className="ml-2 text-xs text-[color:var(--ck-text-tertiary)]">missing</span> : null}
1061
- </button>
1062
- </li>
1063
- ))}
1064
- </ul>
1065
- </div>
1066
-
1067
- <div className="ck-glass-strong p-4 lg:col-span-2">
1068
- <div className="flex items-center justify-between gap-3">
1069
- <div className="text-sm font-medium text-[color:var(--ck-text-primary)]">Edit: {fileName}</div>
1070
- <button
1071
- disabled={saving}
1072
- onClick={onSaveTeamFile}
1073
- className="rounded-[var(--ck-radius-sm)] bg-[var(--ck-accent-red)] px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] disabled:opacity-50"
1074
- >
1075
- {saving ? "Saving…" : "Save file"}
1076
- </button>
1077
- </div>
1078
-
1079
- {teamFileError ? (
1080
- <div className="mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100">
1081
- {teamFileError}
1082
- </div>
1083
- ) : null}
1084
-
1085
- <textarea
1086
- value={fileContent}
1087
- onChange={(e) => setFileContent(e.target.value)}
1088
- className="mt-3 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]"
1089
- spellCheck={false}
1090
- />
1091
- </div>
1092
- </div>
1093
- ) : null}
1094
-
1095
- {/* markdown editor lives below for convenience */}
1096
- {activeTab === "recipe" ? (
1097
- <div className="mt-6 ck-glass-strong p-4">
1098
- <div className="text-sm font-medium text-[color:var(--ck-text-primary)]">Recipe markdown</div>
1099
-
1100
- {recipeLoadError ? (
1101
- <div className="mt-3 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100">
1102
- {recipeLoadError}
1103
- </div>
1104
- ) : null}
1105
-
1106
- <textarea
1107
- value={content}
1108
- onChange={(e) => {
1109
- setContent(e.target.value);
1110
- setLoadedRecipeHash(null);
1111
- }}
1112
- className="mt-2 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]"
1113
- spellCheck={false}
1114
- />
1115
- </div>
1116
- ) : null}
1117
-
1118
- {/* Clone Team removed (per #0075). */}
1119
-
1120
- <PublishChangesModal
1121
- open={publishOpen}
1122
- teamId={teamId}
1123
- recipeId={toId}
1124
- busy={publishing}
1125
- onClose={() => setPublishOpen(false)}
1126
- onConfirm={async () => {
1127
- setPublishing(true);
1128
- try {
1129
- const res = await fetch("/api/scaffold", {
1130
- method: "POST",
1131
- headers: { "content-type": "application/json" },
1132
- body: JSON.stringify({
1133
- kind: "team",
1134
- recipeId: toId.trim(),
1135
- teamId,
1136
- overwrite: true,
1137
- applyConfig: true,
1138
- }),
1139
- });
1140
- const json = await res.json();
1141
- if (!res.ok || !json.ok) throw new Error(json.error || "Publish failed");
1142
-
1143
- // Refresh team meta so we can reflect published hash/state.
1144
- try {
1145
- const metaRes = await fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, {
1146
- cache: "no-store",
1147
- });
1148
- const metaJson = await metaRes.json();
1149
- if (metaRes.ok && metaJson.ok && metaJson.meta && typeof metaJson.meta.recipeHash === "string") {
1150
- setTeamMetaRecipeHash(metaJson.meta.recipeHash);
1151
- }
1152
- } catch {
1153
- // ignore
1154
- }
1155
-
1156
- setPublishOpen(false);
1157
- flashMessage("Published changes to active team", "success");
1158
- } catch (e: unknown) {
1159
- flashMessage(e instanceof Error ? e.message : String(e), "error");
1160
- } finally {
1161
- setPublishing(false);
1162
- }
1163
- }}
1164
- />
1165
-
1166
- <DeleteTeamModal
1167
- open={deleteOpen}
1168
- teamId={teamId}
1169
- busy={deleting}
1170
- onClose={() => setDeleteOpen(false)}
1171
- onConfirm={async () => {
1172
- setDeleting(true);
1173
- try {
1174
- const res = await fetch("/api/teams/remove-team", {
1175
- method: "POST",
1176
- headers: { "content-type": "application/json" },
1177
- body: JSON.stringify({ teamId }),
1178
- });
1179
- const json = await res.json();
1180
- if (!res.ok || !json.ok) throw new Error(json.error || "Delete failed");
1181
- flashMessage("Deleted team successfully", "success");
1182
- setDeleteOpen(false);
1183
- setTimeout(() => router.push("/"), 250);
1184
- } catch (e: unknown) {
1185
- flashMessage(e instanceof Error ? e.message : String(e), "error");
1186
- } finally {
1187
- setDeleting(false);
1188
- }
1189
- }}
1190
- />
1191
-
1192
- {/* duplicate markdown editor removed */}
1193
- </div>
1194
- );
1195
- }