@jiggai/kitchen 0.1.11 → 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/{N9RkFGiZEAkG3RdK_y3XE → z9yFlFZ5f_hw9mm0nfMJl}/_buildManifest.js +0 -0
  1082. /package/.next/static/{N9RkFGiZEAkG3RdK_y3XE → z9yFlFZ5f_hw9mm0nfMJl}/_clientMiddlewareManifest.json +0 -0
  1083. /package/.next/static/{N9RkFGiZEAkG3RdK_y3XE → z9yFlFZ5f_hw9mm0nfMJl}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/agents/%5BagentId%5D/agent-editor.tsx"],"sourcesContent":["\"use client\";\n\nimport { createPortal } from \"react-dom\";\nimport { useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\n\ntype AgentListItem = {\n id: string;\n identityName?: string;\n workspace?: string;\n model?: string;\n isDefault?: boolean;\n};\n\ntype FileListResponse = { ok?: boolean; files?: unknown[] };\n\ntype FileEntry = { name: string; missing: boolean };\n\nfunction DeleteAgentModal({\n open,\n agentId,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n agentId: string;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[200]\">\n <div className=\"fixed inset-0 bg-black/60\" onClick={onClose} />\n <div className=\"fixed inset-0 overflow-y-auto\">\n <div className=\"flex min-h-full items-center justify-center p-4\">\n <div className=\"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-lg font-semibold text-[color:var(--ck-text-primary)]\">Delete agent</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Delete agent <code className=\"font-mono\">{agentId}</code>? This will remove its workspace/state.\n </p>\n\n {error ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100\">\n {error}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onClose}\n 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)] hover:bg-white/10\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={busy}\n onClick={onConfirm}\n 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)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50\"\n >\n {busy ? \"Deleting…\" : \"Delete\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\nexport default function AgentEditor({ agentId, returnTo }: { agentId: string; returnTo?: string }) {\n const router = useRouter();\n const [agent, setAgent] = useState<AgentListItem | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [loadingFile, setLoadingFile] = useState(false);\n // Split concerns: avoid file-load errors showing up in the Skills notice area.\n const [pageMsg, setPageMsg] = useState<string>(\"\");\n const [fileError, setFileError] = useState<string>(\"\");\n const [skillMsg, setSkillMsg] = useState<string>(\"\");\n const [skillError, setSkillError] = useState<string>(\"\");\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [activeTab, setActiveTab] = useState<\"identity\" | \"config\" | \"skills\" | \"files\">(\"identity\");\n\n const [name, setName] = useState<string>(\"\");\n const [emoji, setEmoji] = useState<string>(\"\");\n const [theme, setTheme] = useState<string>(\"\");\n const [avatar, setAvatar] = useState<string>(\"\");\n\n const [model, setModel] = useState<string>(\"\");\n\n const [skillsList, setSkillsList] = useState<string[]>([]);\n const [availableSkills, setAvailableSkills] = useState<string[]>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<string>(\"\");\n const [installingSkill, setInstallingSkill] = useState(false);\n\n const [agentFiles, setAgentFiles] = useState<Array<FileEntry & { required?: boolean; rationale?: string }>>([]);\n const [agentFilesLoading, setAgentFilesLoading] = useState(false);\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"SOUL.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const teamId = agentId.includes(\"-\") ? agentId.split(\"-\").slice(0, -1).join(\"-\") : \"\";\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setPageMsg(\"\");\n try {\n const agentsRes = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };\n const list = Array.isArray(agentsJson.agents) ? (agentsJson.agents as AgentListItem[]) : [];\n const found = list.find((a) => a.id === agentId) ?? null;\n setAgent(found);\n setName(found?.identityName ?? \"\");\n setModel(found?.model ?? \"\");\n\n // Render ASAP; load files/skills in the background.\n setLoading(false);\n\n void (async () => {\n setAgentFilesLoading(true);\n setSkillsLoading(true);\n\n try {\n const [filesRes, skillsRes, availableSkillsRes] = await Promise.all([\n fetch(`/api/agents/files?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" }),\n fetch(\"/api/skills/available\", { cache: \"no-store\" }),\n ]);\n\n let installedSkills: string[] = [];\n\n try {\n const filesJson = (await filesRes.json()) as FileListResponse;\n if (filesRes.ok && filesJson.ok) {\n const files = Array.isArray(filesJson.files) ? filesJson.files : [];\n setAgentFiles(\n files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean((entry as { required?: unknown }).required),\n rationale:\n typeof (entry as { rationale?: unknown }).rationale === \"string\"\n ? ((entry as { rationale?: string }).rationale as string)\n : undefined,\n };\n }),\n );\n }\n } catch {\n // ignore\n }\n\n try {\n const skillsJson = (await skillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (skillsRes.ok && skillsJson.ok) {\n installedSkills = Array.isArray(skillsJson.skills) ? (skillsJson.skills as string[]) : [];\n setSkillsList(installedSkills);\n }\n } catch {\n // ignore\n }\n\n try {\n const availableSkillsJson = (await availableSkillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (availableSkillsRes.ok && availableSkillsJson.ok) {\n const list = Array.isArray(availableSkillsJson.skills) ? (availableSkillsJson.skills as string[]) : [];\n setAvailableSkills(list);\n // Default select first available skill not already installed.\n const first = list.find((s) => !installedSkills.includes(s));\n setSelectedSkill(first ?? list[0] ?? \"\");\n }\n } catch {\n // ignore\n }\n } finally {\n setAgentFilesLoading(false);\n setSkillsLoading(false);\n }\n })();\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n // If the happy-path already flipped loading=false early, this is a no-op.\n setLoading(false);\n }\n })();\n }, [agentId]);\n\n async function onSaveIdentity() {\n setSaving(true);\n setPageMsg(\"\");\n try {\n const res = await fetch(\"/api/agents/identity\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name, emoji, theme, avatar }),\n });\n const json = (await res.json()) as { message?: string; error?: string };\n if (!res.ok) throw new Error(json.message || json.error || \"Save failed\");\n setPageMsg(\"Saved identity via openclaw agents set-identity\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveConfig() {\n setSaving(true);\n setPageMsg(\"\");\n\n try {\n const res = await fetch(\"/api/agents/update\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, patch: { model } }),\n });\n const json = (await res.json()) as { error?: string };\n if (!res.ok) throw new Error(json.error || \"Save config failed\");\n setPageMsg(\"Saved agent config (model) and restarted gateway\");\n } catch (e: unknown) {\n setPageMsg(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadAgentFile(nextName: string) {\n // Update selection immediately so the UI reflects what the user clicked,\n // even if the network request fails.\n setFileName(nextName);\n setFileContent(\"\");\n\n setLoadingFile(true);\n setFileError(\"\");\n try {\n const res = await fetch(\n `/api/agents/file?agentId=${encodeURIComponent(agentId)}&name=${encodeURIComponent(nextName)}`,\n { cache: \"no-store\" },\n );\n const json = (await res.json()) as { ok?: boolean; error?: string; content?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load file\");\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoadingFile(false);\n }\n }\n\n // When entering the Files tab, load the current file immediately (default: IDENTITY.md).\n useEffect(() => {\n if (activeTab !== \"files\") return;\n if (!agentFiles.length) return;\n\n const exists = agentFiles.some((f) => f.name === fileName);\n const fallback = agentFiles[0]?.name;\n const target = exists ? fileName : fallback;\n if (!target) return;\n\n if (target !== fileName) {\n setFileName(target);\n setFileContent(\"\");\n }\n\n if (!fileContent) {\n onLoadAgentFile(target);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeTab, agentId, agentFiles.length]);\n\n function defaultFileContent(name: string) {\n switch (name) {\n case \"SOUL.md\":\n return \"# SOUL.md\\n\\n\";\n case \"AGENTS.md\":\n return \"# AGENTS.md\\n\\n\";\n case \"TOOLS.md\":\n return \"# TOOLS.md\\n\\n\";\n case \"STATUS.md\":\n return \"# STATUS.md\\n\\n- (empty)\\n\";\n case \"NOTES.md\":\n return \"# NOTES.md\\n\\n- (empty)\\n\";\n case \"IDENTITY.md\":\n return \"# IDENTITY.md\\n\\n- **Name:**\\n- **Creature:**\\n- **Vibe:**\\n- **Emoji:**\\n- **Avatar:**\\n\";\n case \"USER.md\":\n return \"# USER.md\\n\\n\";\n case \"HEARTBEAT.md\":\n return \"# HEARTBEAT.md\\n\\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\\n\";\n default:\n return \"\";\n }\n }\n\n async function onSaveAgentFile() {\n setSaving(true);\n setFileError(\"\");\n try {\n const res = await fetch(\"/api/agents/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name: fileName, content: fileContent }),\n });\n const json = (await res.json()) as { ok?: boolean; error?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save file\");\n\n // Refresh the file list so missing/mtime updates immediately.\n const r = await fetch(`/api/agents/files?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok && Array.isArray(j.files)) {\n setAgentFiles(j.files);\n }\n // No-op: saving a file doesn't need a global notice.\n } catch (e: unknown) {\n setFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onCreateMissingFile(name: string) {\n setFileName(name);\n setFileError(\"\");\n setFileContent(defaultFileContent(name));\n await onSaveAgentFile();\n }\n\n async function onDeleteAgent() {\n setDeleteBusy(true);\n setDeleteError(null);\n setPageMsg(\"\");\n\n try {\n const res = await fetch(`/api/agents/${encodeURIComponent(agentId)}`, { method: \"DELETE\" });\n const json = (await res.json()) as { ok?: boolean; error?: string; message?: string; stderr?: string };\n if (!res.ok || !json.ok) throw new Error(json.error || json.message || json.stderr || \"Delete failed\");\n\n window.location.href = \"/\";\n } catch (e: unknown) {\n setDeleteError(e instanceof Error ? e.message : String(e));\n setDeleteBusy(false);\n }\n }\n\n // Initial load only gates the minimal state (agent exists). Files/skills stream in.\n if (loading) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Loading…</div>;\n if (!agent) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Agent not found: {agentId}</div>;\n\n return (\n <div className=\"ck-glass mx-auto max-w-4xl p-6 sm:p-8\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Agent editor</h1>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {agent.id}\n {agent.isDefault ? \" • default\" : \"\"}\n {agent.model ? ` • ${agent.model}` : \"\"}\n </div>\n </div>\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => {\n setDeleteError(null);\n setDeleteOpen(true);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-red-400/40 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/15 disabled:opacity-50\"\n >\n Delete agent\n </button>\n </div>\n {agent.workspace ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Workspace: {agent.workspace}</div>\n ) : null}\n {teamId ? <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div> : null}\n\n {pageMsg ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]\">\n {pageMsg}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {(\n [\n { id: \"identity\", label: \"Identity\" },\n { id: \"config\", label: \"Config\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"files\", label: \"Files\" },\n ] as const\n ).map((t) => (\n <button\n key={t.id}\n onClick={() => setActiveTab(t.id)}\n className={\n activeTab === t.id\n ? \"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)]\"\n : \"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\"\n }\n >\n {t.label}\n </button>\n ))}\n </div>\n\n <div className=\"mt-6 grid grid-cols-1 gap-4\">\n {activeTab === \"identity\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Identity</div>\n\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name</label>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n 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)]\"\n />\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Emoji</label>\n <input\n value={emoji}\n onChange={(e) => setEmoji(e.target.value)}\n placeholder=\"🦞\"\n 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)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Theme</label>\n <input\n value={theme}\n onChange={(e) => setTheme(e.target.value)}\n placeholder=\"warm, sharp, calm\"\n 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)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Avatar</label>\n <input\n value={avatar}\n onChange={(e) => setAvatar(e.target.value)}\n placeholder=\"avatars/openclaw.png\"\n 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)]\"\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-col gap-2 sm:flex-row\">\n <button\n disabled={saving}\n onClick={onSaveIdentity}\n 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\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n {returnTo ? (\n <button\n disabled={saving}\n onClick={async () => {\n await onSaveIdentity();\n router.push(returnTo);\n }}\n 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\"\n >\n Save & return\n </button>\n ) : null}\n </div>\n </div>\n ) : null}\n\n {activeTab === \"config\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Config</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Thin slice: edit the configured model id for this agent (writes to OpenClaw config).\n </p>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Model</label>\n <input\n value={model}\n onChange={(e) => setModel(e.target.value)}\n placeholder=\"openai/gpt-5.2\"\n 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)]\"\n />\n <div className=\"mt-3\">\n <button\n disabled={saving}\n onClick={onSaveConfig}\n 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\"\n >\n {saving ? \"Saving…\" : \"Save config\"}\n </button>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"skills\" ? (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Skills</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Skills installed in this <strong>agent</strong> workspace (<code>skills/</code>). If you want a skill available to all agents,\n add it at the team level.\n </p>\n\n <div className=\"mt-4\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Installed</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {skillsLoading ? (\n <li>Loading…</li>\n ) : skillsList.length ? (\n skillsList.map((s) => <li key={s}>{s}</li>)\n ) : (\n <li>None installed.</li>\n )}\n </ul>\n </div>\n\n <div className=\"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Add a skill</div>\n <div className=\"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <select\n value={selectedSkill}\n onChange={(e) => setSelectedSkill(e.target.value)}\n 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)]\"\n disabled={installingSkill || !availableSkills.length}\n >\n {availableSkills.length ? (\n availableSkills.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))\n ) : (\n <option value=\"\">No skills found</option>\n )}\n </select>\n <button\n type=\"button\"\n disabled={installingSkill || !selectedSkill}\n onClick={async () => {\n setInstallingSkill(true);\n setSkillMsg(\"\");\n setSkillError(\"\");\n try {\n const res = await fetch(\"/api/agents/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, skill: selectedSkill }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to install skill\");\n setSkillMsg(`Installed skill: ${selectedSkill}`);\n // Refresh installed list.\n const r = await fetch(`/api/agents/skills?agentId=${encodeURIComponent(agentId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok) setSkillsList(Array.isArray(j.skills) ? j.skills : []);\n } catch (e: unknown) {\n setSkillError(e instanceof Error ? e.message : String(e));\n } finally {\n setInstallingSkill(false);\n }\n }}\n 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\"\n >\n {installingSkill ? \"Adding…\" : \"Add\"}\n </button>\n </div>\n\n {skillError ? (\n <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\">\n {skillError}\n </div>\n ) : skillMsg ? (\n <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\">\n {skillMsg}\n </div>\n ) : null}\n\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This uses <code>openclaw recipes install-skill &lt;skill&gt; --agent-id {agentId} --yes</code>.\n </div>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"files\" ? (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent files</div>\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={showOptionalFiles} onChange={(e) => setShowOptionalFiles(e.target.checked)} />\n Show optional\n </label>\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">Default view hides optional missing files to reduce noise.</div>\n <ul className=\"mt-3 space-y-1\">\n {agentFilesLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : null}\n {agentFiles\n .filter((f) => (showOptionalFiles ? true : Boolean(f.required) || !f.missing))\n .map((f) => (\n <li key={f.name}>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => onLoadAgentFile(f.name)}\n className={\n fileName === f.name\n ? \"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-3 py-2 text-left text-sm text-[color:var(--ck-text-primary)]\"\n : \"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\"\n }\n >\n <span className={f.required ? \"text-[color:var(--ck-text-primary)]\" : \"text-[color:var(--ck-text-secondary)]\"}>\n {f.name}\n </span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">\n {f.required ? \"required\" : \"optional\"}\n </span>\n {f.missing ? <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">missing</span> : null}\n </button>\n {f.missing ? (\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => void onCreateMissingFile(f.name)}\n className=\"shrink-0 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Create\n </button>\n ) : null}\n </div>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Edit: {fileName}</div>\n <div className=\"flex items-center gap-3\">\n {loadingFile ? <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Loading…</span> : null}\n <button\n disabled={saving}\n onClick={onSaveAgentFile}\n 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\"\n >\n {saving ? \"Saving…\" : \"Save file\"}\n </button>\n </div>\n </div>\n\n {fileError ? (\n <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\">\n {fileError}\n </div>\n ) : null}\n\n <textarea\n value={fileContent}\n onChange={(e) => setFileContent(e.target.value)}\n 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)]\"\n spellCheck={false}\n />\n </div>\n </div>\n ) : null}\n </div>\n\n <DeleteAgentModal\n open={deleteOpen}\n agentId={agentId}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={() => void onDeleteAgent()}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/app/agents/%5BagentId%5D/agent-editor.tsx","../../../../src/app/agents/%5BagentId%5D/agent-editor-tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchAll, fetchJson } from \"@/lib/fetch-json\";\nimport { DeleteAgentModal } from \"@/components/delete-modals\";\nimport { IdentityTab, ConfigTab, SkillsTab, FilesTab } from \"./agent-editor-tabs\";\n\ntype AgentListItem = {\n id: string;\n identityName?: string;\n workspace?: string;\n model?: string;\n isDefault?: boolean;\n};\n\ntype FileListResponse = { ok?: boolean; files?: unknown[] };\n\ntype FileEntry = { name: string; missing: boolean };\n\nasync function loadAgentFilesAndSkills(\n agentId: string,\n setters: {\n setAgentFiles: (f: Array<FileEntry & { required?: boolean; rationale?: string }>) => void;\n setSkillsList: (s: string[]) => void;\n setAvailableSkills: (s: string[]) => void;\n setSelectedSkill: (s: string) => void;\n setAgentFilesLoading: (v: boolean) => void;\n setSkillsLoading: (v: boolean) => void;\n }\n): Promise<void> {\n setters.setAgentFilesLoading(true);\n setters.setSkillsLoading(true);\n try {\n const [filesRes, skillsRes, availableSkillsRes] = await fetchAll([\n `/api/agents/files?agentId=${encodeURIComponent(agentId)}`,\n `/api/agents/skills?agentId=${encodeURIComponent(agentId)}`,\n \"/api/skills/available\",\n ]);\n\n let installedSkills: string[] = [];\n try {\n const filesJson = (await filesRes.json()) as FileListResponse;\n if (filesRes.ok && filesJson.ok) {\n const files = Array.isArray(filesJson.files) ? filesJson.files : [];\n setters.setAgentFiles(\n files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean((entry as { required?: unknown }).required),\n rationale:\n typeof (entry as { rationale?: unknown }).rationale === \"string\"\n ? ((entry as { rationale?: string }).rationale as string)\n : undefined,\n };\n }),\n );\n }\n } catch {\n // ignore\n }\n try {\n const skillsJson = (await skillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (skillsRes.ok && skillsJson.ok) {\n installedSkills = Array.isArray(skillsJson.skills) ? (skillsJson.skills as string[]) : [];\n setters.setSkillsList(installedSkills);\n }\n } catch {\n // ignore\n }\n try {\n const availableSkillsJson = (await availableSkillsRes.json()) as { ok?: boolean; skills?: unknown[] };\n if (availableSkillsRes.ok && availableSkillsJson.ok) {\n const list = Array.isArray(availableSkillsJson.skills) ? (availableSkillsJson.skills as string[]) : [];\n setters.setAvailableSkills(list);\n const first = list.find((s) => !installedSkills.includes(s));\n setters.setSelectedSkill(first ?? list[0] ?? \"\");\n }\n } catch {\n // ignore\n }\n } finally {\n setters.setAgentFilesLoading(false);\n setters.setSkillsLoading(false);\n }\n}\n\nexport default function AgentEditor({ agentId, returnTo }: { agentId: string; returnTo?: string }) {\n const router = useRouter();\n const [agent, setAgent] = useState<AgentListItem | null>(null);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [loadingFile, setLoadingFile] = useState(false);\n // Split concerns: avoid file-load errors showing up in the Skills notice area.\n const [pageMsg, setPageMsg] = useState<string>(\"\");\n const [fileError, setFileError] = useState<string>(\"\");\n const [skillMsg, setSkillMsg] = useState<string>(\"\");\n const [skillError, setSkillError] = useState<string>(\"\");\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteBusy, setDeleteBusy] = useState(false);\n const [deleteError, setDeleteError] = useState<string | null>(null);\n\n const [activeTab, setActiveTab] = useState<\"identity\" | \"config\" | \"skills\" | \"files\">(\"identity\");\n\n const [name, setName] = useState<string>(\"\");\n const [emoji, setEmoji] = useState<string>(\"\");\n const [theme, setTheme] = useState<string>(\"\");\n const [avatar, setAvatar] = useState<string>(\"\");\n\n const [model, setModel] = useState<string>(\"\");\n\n const [skillsList, setSkillsList] = useState<string[]>([]);\n const [availableSkills, setAvailableSkills] = useState<string[]>([]);\n const [skillsLoading, setSkillsLoading] = useState(false);\n const [selectedSkill, setSelectedSkill] = useState<string>(\"\");\n const [installingSkill, setInstallingSkill] = useState(false);\n\n const [agentFiles, setAgentFiles] = useState<Array<FileEntry & { required?: boolean; rationale?: string }>>([]);\n const [agentFilesLoading, setAgentFilesLoading] = useState(false);\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"SOUL.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const teamId = agentId.includes(\"-\") ? agentId.split(\"-\").slice(0, -1).join(\"-\") : \"\";\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setPageMsg(\"\");\n try {\n const agentsJson = await fetchJson<{ agents?: unknown[] }>(\"/api/agents\", { cache: \"no-store\" });\n const list = Array.isArray(agentsJson.agents) ? (agentsJson.agents as AgentListItem[]) : [];\n const found = list.find((a) => a.id === agentId) ?? null;\n setAgent(found);\n setName(found?.identityName ?? \"\");\n setModel(found?.model ?? \"\");\n\n setLoading(false);\n\n void loadAgentFilesAndSkills(agentId, {\n setAgentFiles,\n setSkillsList,\n setAvailableSkills,\n setSelectedSkill,\n setAgentFilesLoading,\n setSkillsLoading,\n });\n } catch (e: unknown) {\n setPageMsg(errorMessage(e));\n } finally {\n setLoading(false);\n }\n })();\n }, [agentId]);\n\n async function withSaveFeedback(\n fn: () => Promise<string>,\n ) {\n setSaving(true);\n setPageMsg(\"\");\n try {\n const msg = await fn();\n setPageMsg(msg);\n } catch (e: unknown) {\n setPageMsg(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveIdentity() {\n await withSaveFeedback(async () => {\n await fetchJson(\"/api/agents/identity\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name, emoji, theme, avatar }),\n });\n return \"Saved identity via openclaw agents set-identity\";\n });\n }\n\n async function onSaveConfig() {\n await withSaveFeedback(async () => {\n await fetchJson(\"/api/agents/update\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, patch: { model } }),\n });\n return \"Saved agent config (model) and restarted gateway\";\n });\n }\n\n async function onLoadAgentFile(nextName: string) {\n // Update selection immediately so the UI reflects what the user clicked,\n // even if the network request fails.\n setFileName(nextName);\n setFileContent(\"\");\n\n setLoadingFile(true);\n setFileError(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean; content?: string }>(\n `/api/agents/file?agentId=${encodeURIComponent(agentId)}&name=${encodeURIComponent(nextName)}`,\n { cache: \"no-store\" },\n );\n if (!json.ok) throw new Error(\"Failed to load file\");\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setFileError(errorMessage(e));\n } finally {\n setLoadingFile(false);\n }\n }\n\n // When entering the Files tab, load the current file immediately (default: IDENTITY.md).\n useEffect(() => {\n if (activeTab !== \"files\") return;\n if (!agentFiles.length) return;\n\n const exists = agentFiles.some((f) => f.name === fileName);\n const fallback = agentFiles[0]?.name;\n const target = exists ? fileName : fallback;\n if (!target) return;\n\n if (target !== fileName) {\n setFileName(target);\n setFileContent(\"\");\n }\n\n if (!fileContent) {\n onLoadAgentFile(target);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Load file when entering Files tab; onLoadAgentFile and fileContent intentionally omitted.\n }, [activeTab, agentId, agentFiles.length]);\n\n function defaultFileContent(name: string) {\n switch (name) {\n case \"SOUL.md\":\n return \"# SOUL.md\\n\\n\";\n case \"AGENTS.md\":\n return \"# AGENTS.md\\n\\n\";\n case \"TOOLS.md\":\n return \"# TOOLS.md\\n\\n\";\n case \"STATUS.md\":\n return \"# STATUS.md\\n\\n- (empty)\\n\";\n case \"NOTES.md\":\n return \"# NOTES.md\\n\\n- (empty)\\n\";\n case \"IDENTITY.md\":\n return \"# IDENTITY.md\\n\\n- **Name:**\\n- **Creature:**\\n- **Vibe:**\\n- **Emoji:**\\n- **Avatar:**\\n\";\n case \"USER.md\":\n return \"# USER.md\\n\\n\";\n case \"HEARTBEAT.md\":\n return \"# HEARTBEAT.md\\n\\n# Keep this file empty (or with only comments) to skip heartbeat API calls.\\n\";\n default:\n return \"\";\n }\n }\n\n async function onSaveAgentFile() {\n setSaving(true);\n setFileError(\"\");\n try {\n const json = await fetchJson<{ ok?: boolean }>(\"/api/agents/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, name: fileName, content: fileContent }),\n });\n if (!json.ok) throw new Error(\"Failed to save file\");\n\n // Refresh the file list so missing/mtime updates immediately.\n try {\n const j = await fetchJson<{ ok?: boolean; files?: Array<FileEntry & { required?: boolean; rationale?: string }> }>(\n `/api/agents/files?agentId=${encodeURIComponent(agentId)}`,\n { cache: \"no-store\" },\n );\n if (j.ok && Array.isArray(j.files)) setAgentFiles(j.files);\n } catch {\n // ignore\n }\n // No-op: saving a file doesn't need a global notice.\n } catch (e: unknown) {\n setFileError(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onCreateMissingFile(name: string) {\n setFileName(name);\n setFileError(\"\");\n setFileContent(defaultFileContent(name));\n await onSaveAgentFile();\n }\n\n async function onDeleteAgent() {\n setDeleteBusy(true);\n setDeleteError(null);\n setPageMsg(\"\");\n\n try {\n await fetchJson(`/api/agents/${encodeURIComponent(agentId)}`, { method: \"DELETE\" });\n\n window.location.href = \"/\";\n } catch (e: unknown) {\n setDeleteError(errorMessage(e));\n setDeleteBusy(false);\n }\n }\n\n // Initial load only gates the minimal state (agent exists). Files/skills stream in.\n if (loading) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Loading…</div>;\n if (!agent) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Agent not found: {agentId}</div>;\n\n return (\n <div className=\"ck-glass mx-auto max-w-4xl p-6 sm:p-8\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">Agent editor</h1>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {agent.id}\n {agent.isDefault ? \" • default\" : \"\"}\n {agent.model ? ` • ${agent.model}` : \"\"}\n </div>\n </div>\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => {\n setDeleteError(null);\n setDeleteOpen(true);\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-[color:rgba(255,59,48,0.45)] bg-[color:rgba(255,59,48,0.08)] px-3 py-2 text-sm font-medium text-[color:var(--ck-accent-red)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-[color:rgba(255,59,48,0.12)] disabled:opacity-50\"\n >\n Delete agent\n </button>\n </div>\n {agent.workspace ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Workspace: {agent.workspace}</div>\n ) : null}\n {teamId ? <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Team: {teamId}</div> : null}\n\n {pageMsg ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3 text-sm text-[color:var(--ck-text-primary)]\">\n {pageMsg}\n </div>\n ) : null}\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {(\n [\n { id: \"identity\", label: \"Identity\" },\n { id: \"config\", label: \"Config\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"files\", label: \"Files\" },\n ] as const\n ).map((t) => (\n <button\n key={t.id}\n onClick={() => setActiveTab(t.id)}\n className={\n activeTab === t.id\n ? \"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)]\"\n : \"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\"\n }\n >\n {t.label}\n </button>\n ))}\n </div>\n\n <div className=\"mt-6 grid grid-cols-1 gap-4\">\n {activeTab === \"identity\" && (\n <IdentityTab\n name={name}\n emoji={emoji}\n theme={theme}\n avatar={avatar}\n saving={saving}\n returnTo={returnTo}\n onNameChange={setName}\n onEmojiChange={setEmoji}\n onThemeChange={setTheme}\n onAvatarChange={setAvatar}\n onSave={onSaveIdentity}\n router={router}\n />\n )}\n {activeTab === \"config\" && (\n <ConfigTab\n model={model}\n saving={saving}\n onModelChange={setModel}\n onSave={onSaveConfig}\n />\n )}\n {activeTab === \"skills\" && (\n <SkillsTab\n agentId={agentId}\n skillsList={skillsList}\n availableSkills={availableSkills}\n skillsLoading={skillsLoading}\n selectedSkill={selectedSkill}\n installingSkill={installingSkill}\n skillError={skillError}\n skillMsg={skillMsg}\n onSelectedSkillChange={setSelectedSkill}\n onInstallSkill={async () => {\n setInstallingSkill(true);\n setSkillMsg(\"\");\n setSkillError(\"\");\n try {\n await fetchJson(\"/api/agents/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ agentId, skill: selectedSkill }),\n });\n setSkillMsg(`Installed skill: ${selectedSkill}`);\n try {\n const j = await fetchJson<{ ok?: boolean; skills?: string[] }>(\n `/api/agents/skills?agentId=${encodeURIComponent(agentId)}`,\n { cache: \"no-store\" },\n );\n if (j.ok && Array.isArray(j.skills)) setSkillsList(j.skills);\n } catch {\n // ignore\n }\n } catch (e: unknown) {\n setSkillError(errorMessage(e));\n } finally {\n setInstallingSkill(false);\n }\n }}\n />\n )}\n {activeTab === \"files\" && (\n <FilesTab\n agentFiles={agentFiles}\n agentFilesLoading={agentFilesLoading}\n showOptionalFiles={showOptionalFiles}\n fileName={fileName}\n fileContent={fileContent}\n loadingFile={loadingFile}\n saving={saving}\n fileError={fileError}\n onShowOptionalChange={setShowOptionalFiles}\n onLoadFile={onLoadAgentFile}\n onFileContentChange={setFileContent}\n onSaveFile={onSaveAgentFile}\n onCreateMissingFile={onCreateMissingFile}\n />\n )}\n </div>\n\n <DeleteAgentModal\n open={deleteOpen}\n agentId={agentId}\n busy={deleteBusy}\n error={deleteError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={() => void onDeleteAgent()}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { FileListWithOptionalToggle } from \"@/components/FileListWithOptionalToggle\";\n\ntype FileEntry = { name: string; missing: boolean; required?: boolean; rationale?: string };\n\nexport function IdentityTab({\n name,\n emoji,\n theme,\n avatar,\n saving,\n returnTo,\n onNameChange,\n onEmojiChange,\n onThemeChange,\n onAvatarChange,\n onSave,\n router,\n}: {\n name: string;\n emoji: string;\n theme: string;\n avatar: string;\n saving: boolean;\n returnTo?: string;\n onNameChange: (v: string) => void;\n onEmojiChange: (v: string) => void;\n onThemeChange: (v: string) => void;\n onAvatarChange: (v: string) => void;\n onSave: () => Promise<void>;\n router: { push: (href: string) => void };\n}) {\n return (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Identity</div>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name</label>\n <input\n value={name}\n onChange={(e) => onNameChange(e.target.value)}\n 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)]\"\n />\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Emoji</label>\n <input\n value={emoji}\n onChange={(e) => onEmojiChange(e.target.value)}\n placeholder=\"🦞\"\n 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)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Theme</label>\n <input\n value={theme}\n onChange={(e) => onThemeChange(e.target.value)}\n placeholder=\"warm, sharp, calm\"\n 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)]\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Avatar</label>\n <input\n value={avatar}\n onChange={(e) => onAvatarChange(e.target.value)}\n placeholder=\"avatars/openclaw.png\"\n 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)]\"\n />\n </div>\n </div>\n <div className=\"mt-4 flex flex-col gap-2 sm:flex-row\">\n <button\n disabled={saving}\n onClick={onSave}\n 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\"\n >\n {saving ? \"Saving…\" : \"Save\"}\n </button>\n {returnTo ? (\n <button\n disabled={saving}\n onClick={async () => {\n await onSave();\n router.push(returnTo);\n }}\n 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\"\n >\n Save & return\n </button>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport function ConfigTab({\n model,\n saving,\n onModelChange,\n onSave,\n}: {\n model: string;\n saving: boolean;\n onModelChange: (v: string) => void;\n onSave: () => Promise<void>;\n}) {\n return (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Config</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Thin slice: edit the configured model id for this agent (writes to OpenClaw config).\n </p>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Model</label>\n <input\n value={model}\n onChange={(e) => onModelChange(e.target.value)}\n placeholder=\"openai/gpt-5.2\"\n 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)]\"\n />\n <div className=\"mt-3\">\n <button\n disabled={saving}\n onClick={onSave}\n 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\"\n >\n {saving ? \"Saving…\" : \"Save config\"}\n </button>\n </div>\n </div>\n );\n}\n\nexport function SkillsTab({\n agentId,\n skillsList,\n availableSkills,\n skillsLoading,\n selectedSkill,\n installingSkill,\n skillError,\n skillMsg,\n onSelectedSkillChange,\n onInstallSkill,\n}: {\n agentId: string;\n skillsList: string[];\n availableSkills: string[];\n skillsLoading: boolean;\n selectedSkill: string;\n installingSkill: boolean;\n skillError: string;\n skillMsg: string;\n onSelectedSkillChange: (v: string) => void;\n onInstallSkill: () => Promise<void>;\n}) {\n return (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Skills</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Skills installed in this <strong>agent</strong> workspace (<code>skills/</code>). If you want a skill available to all agents,\n add it at the team level.\n </p>\n <div className=\"mt-4\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Installed</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {skillsLoading && <li>Loading…</li>}\n {!skillsLoading && skillsList.length > 0 && skillsList.map((s) => <li key={s}>{s}</li>)}\n {!skillsLoading && !skillsList.length && <li>None installed.</li>}\n </ul>\n </div>\n <div className=\"mt-5 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Add a skill</div>\n <div className=\"mt-2 flex flex-col gap-2 sm:flex-row sm:items-center\">\n <select\n value={selectedSkill}\n onChange={(e) => onSelectedSkillChange(e.target.value)}\n 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)]\"\n disabled={installingSkill || !availableSkills.length}\n >\n {availableSkills.length ? (\n availableSkills.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))\n ) : (\n <option value=\"\">No skills found</option>\n )}\n </select>\n <button\n type=\"button\"\n disabled={installingSkill || !selectedSkill}\n onClick={() => void onInstallSkill()}\n 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\"\n >\n {installingSkill ? \"Adding…\" : \"Add\"}\n </button>\n </div>\n {skillError && (\n <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\">\n {skillError}\n </div>\n )}\n {!skillError && skillMsg && (\n <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\">\n {skillMsg}\n </div>\n )}\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This uses <code>openclaw recipes install-skill &lt;skill&gt; --agent-id {agentId} --yes</code>.\n </div>\n </div>\n </div>\n );\n}\n\nexport function FilesTab({\n agentFiles,\n agentFilesLoading,\n showOptionalFiles,\n fileName,\n fileContent,\n loadingFile,\n saving,\n fileError,\n onShowOptionalChange,\n onLoadFile,\n onFileContentChange,\n onSaveFile,\n onCreateMissingFile,\n}: {\n agentFiles: FileEntry[];\n agentFilesLoading: boolean;\n showOptionalFiles: boolean;\n fileName: string;\n fileContent: string;\n loadingFile: boolean;\n saving: boolean;\n fileError: string;\n onShowOptionalChange: (v: boolean) => void;\n onLoadFile: (name: string) => void;\n onFileContentChange: (v: string) => void;\n onSaveFile: () => Promise<void>;\n onCreateMissingFile: (name: string) => Promise<void>;\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <FileListWithOptionalToggle\n title=\"Agent files\"\n files={agentFiles}\n loading={agentFilesLoading}\n showOptionalFiles={showOptionalFiles}\n onShowOptionalChange={onShowOptionalChange}\n selectedFileName={fileName}\n onSelectFile={onLoadFile}\n renderItemExtra={(f) =>\n f.missing ? (\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => void onCreateMissingFile(f.name)}\n className=\"shrink-0 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Create\n </button>\n ) : null\n }\n />\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Edit: {fileName}</div>\n <div className=\"flex items-center gap-3\">\n {loadingFile ? <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">Loading…</span> : null}\n <button\n disabled={saving}\n onClick={onSaveFile}\n 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\"\n >\n {saving ? \"Saving…\" : \"Save file\"}\n </button>\n </div>\n </div>\n {fileError ? (\n <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\">\n {fileError}\n </div>\n ) : null}\n <textarea\n value={fileContent}\n onChange={(e) => onFileContentChange(e.target.value)}\n 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)]\"\n spellCheck={false}\n />\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OCJA,EAAA,EAAA,CAAA,CAAA,OAIO,SAAS,EAAY,MAC1B,CAAI,OACJ,CAAK,OACL,CAAK,QACL,CAAM,QACN,CAAM,UACN,CAAQ,cACR,CAAY,eACZ,CAAa,eACb,CAAa,gBACb,CAAc,QACd,CAAM,QACN,CAAM,CAcP,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,aACzE,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,gFAAuE,SACxF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAa,EAAE,MAAM,CAAC,KAAK,EAC5C,UAAU,uIAEZ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,2EAAkE,UACnF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,YAAY,KACZ,UAAU,0IAGd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,2EAAkE,UACnF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,YAAY,oBACZ,UAAU,0IAGd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,2EAAkE,WACnF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAW,AAAD,GAAO,EAAe,EAAE,MAAM,CAAC,KAAK,EAC9C,YAAY,uBACZ,UAAU,6IAIhB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iDACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,EACV,QAAS,EACT,UAAU,4PAET,EAAS,UAAY,SAEvB,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,EACV,QAAS,UACP,MAAM,IACN,EAAO,IAAI,CAAC,EACd,EACA,UAAU,oPACX,kBAGC,UAIZ,CAEO,SAAS,EAAU,OACxB,CAAK,QACL,CAAM,eACN,CAAa,QACb,CAAM,CAMP,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,WACzE,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8DAAqD,yFAGlE,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CAAM,UAAU,gFAAuE,UACxF,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,YAAY,iBACZ,UAAU,uIAEZ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gBACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,EACV,QAAS,EACT,UAAU,4JAET,EAAS,UAAY,oBAKhC,CAEO,SAAS,EAAU,SACxB,CAAO,YACP,CAAU,iBACV,CAAe,eACf,CAAa,eACb,CAAa,iBACb,CAAe,YACf,CAAU,UACV,CAAQ,uBACR,CAAqB,gBACrB,CAAc,CAYf,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,WACzE,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,+DAAqD,4BACvC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,UAAO,UAAc,eAAY,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,YAAc,+EAGjF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,cAC3E,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,CAAG,UAAU,wFACX,GAAiB,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,aACrB,CAAC,GAAiB,EAAW,MAAM,CAAG,GAAK,EAAW,GAAG,CAAC,AAAC,GAAM,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAY,GAAJ,IAC1E,CAAC,GAAiB,CAAC,EAAW,MAAM,EAAI,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,UAAG,0BAGjD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,sFACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,gBAC3E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iEACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAsB,EAAE,MAAM,CAAC,KAAK,EACrD,UAAU,gIACV,SAAU,GAAmB,CAAC,EAAgB,MAAM,UAEnD,EAAgB,MAAM,CACrB,EAAgB,GAAG,CAAC,AAAC,GACnB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAe,MAAO,WACpB,GADU,IAKf,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,YAAG,sBAGrB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,GAAmB,CAAC,EAC9B,QAAS,IAAM,KAAK,IACpB,UAAU,4JAET,EAAkB,UAAY,WAGlC,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8GACZ,IAGJ,CAAC,GAAc,GACd,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0HACZ,IAGL,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,aACvD,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,WAAK,qDAAyD,EAAQ,YAAa,YAKxG,CAEO,SAAS,EAAS,YACvB,CAAU,CACV,mBAAiB,CACjB,mBAAiB,UACjB,CAAQ,aACR,CAAW,aACX,CAAW,QACX,CAAM,WACN,CAAS,sBACT,CAAoB,CACpB,YAAU,qBACV,CAAmB,CACnB,YAAU,qBACV,CAAmB,CAepB,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kDACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,0BAA0B,CAAA,CACzB,MAAM,cACN,MAAO,EACP,QAAS,EACT,kBAAmB,EACnB,qBAAsB,EACtB,iBAAkB,EAClB,aAAc,EACd,gBAAiB,AAAC,GAChB,EAAE,OAAO,CACP,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EACV,QAAS,IAAM,KAAK,EAAoB,EAAE,IAAI,EAC9C,UAAU,4LACX,WAGC,OAGR,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8CACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oEAA0D,SAAO,KAChF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oCACZ,EAAc,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,wDAA+C,aAAkB,KAChG,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,EACV,QAAS,EACT,UAAU,4JAET,EAAS,UAAY,oBAI3B,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,8GACZ,IAED,KACJ,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAoB,EAAE,MAAM,CAAC,KAAK,EACnD,UAAU,8JACV,YAAY,SAKtB,CDpRA,eAAe,EACb,CAAe,CACf,CAOC,EAED,EAAQ,oBAAoB,EAAC,GAC7B,EAAQ,gBAAgB,EAAC,GACzB,GAAI,CACF,GAAM,CAAC,EAAU,EAAW,EAAmB,CAAG,MAAM,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,CAC/D,CAAC,0BAA0B,EAAE,mBAAmB,GAAA,CAAU,CAC1D,CAAC,2BAA2B,EAAE,mBAAmB,GAAA,CAAU,CAC3D,wBACD,EAEG,EAA4B,EAAE,CAClC,GAAI,CACF,IAAM,EAAa,MAAM,EAAS,IAAI,GACtC,GAAI,EAAS,EAAE,EAAI,EAAU,EAAE,CAAE,CAC/B,IAAM,EAAQ,MAAM,OAAO,CAAC,EAAU,KAAK,EAAI,EAAU,KAAK,CAAG,EAAE,CACnE,EAAQ,aAAa,CACnB,EAAM,GAAG,CAAC,AAAC,IAEF,CACL,KAAM,OAAO,EAAM,IAAI,EAAI,IAC3B,SAAS,CAAQ,EAAM,OAAO,CAC9B,SAAU,EAAS,EAAiC,QAAQ,CAC5D,UAC0D,UAAxD,OAAQ,EAAkC,SAAS,CAC7C,AAPI,EAO6B,SAAS,MAC5C,CACR,IAGN,CACF,CAAE,KAAM,CAER,CACA,GAAI,CACF,IAAM,EAAc,MAAM,EAAU,IAAI,GACpC,EAAU,EAAE,EAAI,EAAW,EAAE,EAAE,CACjC,EAAkB,MAAM,OAAO,CAAC,EAAW,MAAM,EAAK,EAAW,MAAM,CAAgB,EAAE,CACzF,EAAQ,aAAa,CAAC,GAE1B,CAAE,KAAM,CAER,CACA,GAAI,CACF,IAAM,EAAuB,MAAM,EAAmB,IAAI,GAC1D,GAAI,EAAmB,EAAE,EAAI,EAAoB,EAAE,CAAE,CACnD,IAAM,EAAO,MAAM,OAAO,CAAC,EAAoB,MAAM,EAAK,EAAoB,MAAM,CAAgB,EAAE,CACtG,EAAQ,kBAAkB,CAAC,GAC3B,IAAM,EAAQ,EAAK,IAAI,CAAC,AAAC,GAAM,CAAC,EAAgB,QAAQ,CAAC,IACzD,EAAQ,gBAAgB,CAAC,GAAS,CAAI,CAAC,EAAE,EAAI,GAC/C,CACF,CAAE,KAAM,CAER,CACF,QAAU,CACR,EAAQ,oBAAoB,EAAC,GAC7B,EAAQ,gBAAgB,EAAC,EAC3B,CACF,CAEe,SAAS,EAAY,CAAE,SAAO,UAAE,CAAQ,CAA0C,EAC/F,IAAM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAClB,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAuB,MACnD,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC/B,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAEzC,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAiB,IACzC,CAAC,EAAW,EAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAC7C,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAC3C,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAE/C,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,GAAS,GACvC,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAExD,CAAC,EAAW,EAAa,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAA6C,YAEjF,CAAC,EAAM,EAAQ,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACnC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACrC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACrC,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAiB,IAEvC,CAAC,EAAO,EAAS,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAErC,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAmB,EAAE,EACnD,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAW,EAAE,EAC7D,CAAC,EAAe,EAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC7C,CAAC,GAAe,GAAiB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACrD,CAAC,GAAiB,GAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAEjD,CAAC,GAAY,GAAc,CAAG,CAAA,EAAA,EAAA,QAAQ,AAAR,EAAwE,EAAE,EACxG,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACrD,CAAC,GAAmB,GAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACrD,CAAC,GAAU,GAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,WAC3C,CAAC,GAAa,GAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAEjD,GAAS,EAAQ,QAAQ,CAAC,KAAO,EAAQ,KAAK,CAAC,KAAK,KAAK,CAAC,EAAG,CAAC,GAAG,IAAI,CAAC,KAAO,GAgCnF,eAAe,GACb,CAAyB,EAEzB,GAAU,GACV,EAAW,IACX,GAAI,CACF,IAAM,EAAM,MAAM,IAClB,EAAW,EACb,CAAE,MAAO,EAAY,CACnB,EAAW,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAC1B,QAAU,CACR,GAAU,EACZ,CACF,CAEA,eAAe,KACb,MAAM,GAAiB,UACrB,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,uBAAwB,CACtC,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,SAAE,EAAS,aAAM,QAAO,SAAO,CAAO,EAC7D,GACO,mDAEX,CAEA,eAAe,KACb,MAAM,GAAiB,UACrB,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,qBAAsB,CACpC,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,UAAS,MAAO,OAAE,CAAM,CAAE,EACnD,GACO,oDAEX,CAEA,eAAe,GAAgB,CAAgB,EAG7C,GAAY,GACZ,GAAe,IAEf,GAAe,GACf,EAAa,IACb,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAC1B,CAAC,yBAAyB,EAAE,mBAAmB,GAAS,MAAM,EAAE,mBAAmB,GAAA,CAAW,CAC9F,CAAE,MAAO,UAAW,GAEtB,GAAI,CAAC,EAAK,EAAE,CAAE,MAAM,AAAI,MAAM,uBAC9B,GAAe,OAAO,EAAK,OAAO,EAAI,IACxC,CAAE,MAAO,EAAY,CACnB,EAAa,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAC5B,QAAU,CACR,GAAe,EACjB,CACF,CA8CA,eAAe,KACb,EAAU,IACV,EAAa,IACb,GAAI,CAMF,GAAI,CAAC,CALQ,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAmB,mBAAoB,CACjE,OAAQ,MACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,UAAS,KAAM,GAAU,QAAS,EAAY,EACvE,EAAA,EACU,EAAE,CAAE,MAAM,AAAI,MAAM,uBAG9B,GAAI,CACF,IAAM,EAAI,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EACvB,CAAC,0BAA0B,EAAE,mBAAmB,GAAA,CAAU,CAC1D,CAAE,MAAO,UAAW,GAElB,EAAE,EAAE,EAAI,MAAM,OAAO,CAAC,EAAE,KAAK,GAAG,GAAc,EAAE,KAAK,CAC3D,CAAE,KAAM,CAER,CAEF,CAAE,MAAO,EAAY,CACnB,EAAa,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAC5B,QAAU,CACR,GAAU,EACZ,CACF,CAEA,eAAe,GAAoB,CAAY,EAC7C,GAAY,GACZ,EAAa,IACb,GAAe,AAvDjB,SAA4B,AAAnB,CAA+B,EACtC,OAAQ,GACN,IAAK,UACH,MAAO,eACT,KAAK,YACH,MAAO,iBACT,KAAK,WACH,MAAO,gBACT,KAAK,YACH,MAAO,4BACT,KAAK,WACH,MAAO,2BACT,KAAK,cACH,MAAO,2FACT,KAAK,UACH,MAAO,eACT,KAAK,eACH,MAAO,iGACT,SACE,MAAO,EACX,CACF,EAkCoC,IAClC,MAAM,IACR,CAEA,eAAe,KACb,GAAc,GACd,EAAe,MACf,EAAW,IAEX,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,CAAC,YAAY,EAAE,mBAAmB,GAAA,CAAU,CAAE,CAAE,OAAQ,QAAS,GAEjF,OAAO,QAAQ,CAAC,IAAI,CAAG,GACzB,CAAE,MAAO,EAAY,CACnB,EAAe,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,IAC5B,GAAc,EAChB,CACF,OAtLA,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,CAAC,UACC,GAAW,GACX,EAAW,IACX,GAAI,CACF,IAAM,EAAa,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAyB,cAAe,CAAE,MAAO,UAAW,GAExF,EAAQ,CADD,MAAM,OAAO,CAAC,EAAW,MAAM,EAAK,EAAW,MAAM,CAAuB,EAAA,AAAE,EACxE,IAAI,CAAC,AAAC,GAAM,EAAE,EAAE,GAAK,IAAY,KACpD,EAAS,GACT,EAAQ,GAAO,cAAgB,IAC/B,EAAS,GAAO,OAAS,IAEzB,GAAW,GAEN,EAAwB,EAAS,eACpC,iBACA,qBACA,mBACA,wBACA,oBACA,CACF,EACF,CAAE,MAAO,EAAY,CACnB,EAAW,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAC1B,QAAU,CACR,GAAW,EACb,EACF,CAAC,EACH,EAAG,CAAC,EAAQ,EA8DZ,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,GAAkB,UAAd,GACA,CAAC,GAAW,MAAM,CADK,CACH,MAExB,IAAM,EAAS,GAAW,IAAI,CAAC,AAAC,GAAM,EAAE,IAAI,GAAK,IAC3C,EAAW,EAAU,CAAC,EAAE,EAAE,KAC1B,EAAS,EAAS,GAAW,EAC9B,IAED,IAFS,AAEE,KACb,GAAY,EADW,CAEvB,GAAe,KAGZ,AAAD,IACF,GAAgB,GAGpB,EAAG,CAJiB,AAIhB,EAAW,EAAS,GAAW,MAAM,CAAC,EA6E1C,AAAI,EAAgB,CAAA,EAAA,EAAA,EAAP,CAAO,EAAC,MAAA,CAAI,UAAU,0CAAiC,aAC/D,EAGH,CAAA,EAAA,EAAA,AAHU,IAGV,EAAC,MAAA,CAAI,UAAU,kDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,6DACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iDAAwC,iBACtD,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DACZ,EAAM,EAAE,CACR,EAAM,SAAS,CAAG,aAAe,GACjC,EAAM,KAAK,CAAG,CAAC,GAAG,EAAE,EAAM,KAAK,CAAA,CAAE,CAAG,SAGzC,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EACV,QAAS,KACP,EAAe,MACf,GAAc,EAChB,EACA,UAAU,4RACX,oBAIF,EAAM,SAAS,CACd,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,cAAY,EAAM,SAAS,IAC5F,KACH,GAAS,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,SAAO,MAAgB,KAEnG,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gIACZ,IAED,KAEJ,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qCAEX,CACE,CAAE,GAAI,WAAY,MAAO,UAAW,EACpC,CAAE,GAAI,SAAU,MAAO,QAAS,EAChC,CAAE,GAAI,SAAU,MAAO,QAAS,EAChC,CAAE,GAAI,QAAS,MAAO,OAAQ,EAC/B,CACD,GAAG,CAAC,AAAC,GACL,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAEC,QAAS,IAAM,EAAa,EAAE,EAAE,EAChC,UACE,IAAc,EAAE,EAAE,CACd,+HACA,2LAGL,EAAE,KAAK,EARH,EAAE,EAAE,KAaf,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wCACE,aAAd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,KAAM,EACN,MAAO,EACP,MAAO,EACP,OAAQ,EACR,OAAQ,EACR,SAAU,EACV,aAAc,EACd,cAAe,EACf,cAAe,EACf,eAAgB,EAChB,OAAQ,GACR,OAAQ,IAGX,AAAc,cACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,MAAO,EACP,OAAQ,EACR,cAAe,EACf,OAAQ,KAGG,WAAd,GACC,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,QAAS,EACT,WAAY,EACZ,gBAAiB,EACjB,cAAe,EACf,cAAe,GACf,gBAAiB,GACjB,WAAY,EACZ,SAAU,EACV,sBAAuB,GACvB,eAAgB,UACd,IAAmB,GACnB,EAAY,IACZ,EAAc,IACd,GAAI,CACF,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,6BAA8B,CAC5C,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,SAAE,EAAS,MAAO,EAAc,EACvD,GACA,EAAY,CAAC,iBAAiB,EAAE,GAAA,CAAe,EAC/C,GAAI,CACF,IAAM,EAAI,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EACvB,CAAC,2BAA2B,EAAE,mBAAmB,GAAA,CAAU,CAC3D,CAAE,MAAO,UAAW,GAElB,EAAE,EAAE,EAAI,MAAM,OAAO,CAAC,EAAE,MAAM,GAAG,EAAc,EAAE,MAAM,CAC7D,CAAE,KAAM,CAER,CACF,CAAE,MAAO,EAAY,CACnB,EAAc,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAC7B,QAAU,CACR,IAAmB,EACrB,CACF,IAGH,AAAc,aACb,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,WAAY,GACZ,kBAAmB,GACnB,kBAAmB,GACnB,SAAU,GACV,YAAa,GACb,YAAa,EACb,OAAQ,EACR,UAAW,EACX,qBAAsB,GACtB,WAAY,GACZ,oBAAqB,GACrB,WAAY,GACZ,oBAAqB,QAK3B,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,gBAAgB,CAAA,CACf,KAAM,EACN,QAAS,EACT,KAAM,EACN,MAAO,EACP,QAAS,IAAM,GAAc,GAC7B,UAAW,IAAM,KAAK,UApJT,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2CAAiC,oBAAkB,IAwJvF"}
@@ -0,0 +1,3 @@
1
+ module.exports=[30728,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/src/app/global-error.tsx <module evaluation> from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/app/global-error.tsx <module evaluation>","default")},30269,a=>{"use strict";a.s(["default",()=>b]);let b=(0,a.i(11857).registerClientReference)(function(){throw Error("Attempted to call the default export of [project]/src/app/global-error.tsx from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"[project]/src/app/global-error.tsx","default")},54832,a=>{"use strict";a.i(30728);var b=a.i(30269);a.n(b)}];
2
+
3
+ //# sourceMappingURL=src_app_global-error_tsx_aa661ba4._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/global-error.tsx/__nextjs-internal-proxy.mjs"],"sourcesContent":["// This file is generated by next-core EcmascriptClientReferenceModule.\nimport { registerClientReference } from \"react-server-dom-turbopack/server\";\nexport default registerClientReference(\n function() { throw new Error(\"Attempted to call the default export of [project]/src/app/global-error.tsx from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.\"); },\n \"[project]/src/app/global-error.tsx\",\n \"default\",\n);\n"],"names":[],"mappings":"oEAEe,CAAA,EAAA,AADf,EAAA,CAAA,CAAA,OACe,uBAAA,AAAuB,EAClC,WAAa,MAAM,AAAI,MAAM,0RAA4R,EACzT,yDACA,gEAHW,CAAA,EADf,AACe,EADf,CAAA,CAAA,OACe,uBAAA,AAAuB,EAClC,WAAa,MAAM,AAAI,MAAM,sQAAwQ,EACrS,qCACA","ignoreList":[0]}
@@ -0,0 +1,3 @@
1
+ module.exports=[3363,a=>{"use strict";var b=a.i(7997);function c(){return(0,b.jsxs)("div",{className:"mx-auto max-w-2xl px-6 py-12",children:[(0,b.jsx)("h1",{className:"text-xl font-semibold",children:"Page not found"}),(0,b.jsx)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:"The page you requested does not exist."})]})}a.s(["default",()=>c])}];
2
+
3
+ //# sourceMappingURL=src_app_not-found_tsx_3f23d179._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/not-found.tsx"],"sourcesContent":["export default function NotFound() {\n return (\n <div className=\"mx-auto max-w-2xl px-6 py-12\">\n <h1 className=\"text-xl font-semibold\">Page not found</h1>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">The page you requested does not exist.</p>\n </div>\n );\n}\n"],"names":[],"mappings":"sDAAe,SAAS,IACtB,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yCACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,iCAAwB,mBACtC,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,CAAE,UAAU,8DAAqD,6CAGxE"}
@@ -0,0 +1,3 @@
1
+ module.exports=[68236,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(50944),e=a.i(74621),f=a.i(51200),g=a.i(56635),h=a.i(1760);function i(a){if(0!==a.indexOf("---\n"))return{fm:null};let b=a.indexOf("\n---\n",4);if(-1===b)return{fm:null};let c=a.slice(4,b);try{let a=(0,h.parse)(c);if(!a||"object"!=typeof a)return{fm:null};return{fm:a}}catch(a){return{fm:null,error:(0,e.errorMessage)(a)}}}function j(a,b){let c=b?a.split(".").slice(1).join("."):a;switch(c){case"soul":return"SOUL.md";case"agents":return"AGENTS.md";case"tools":return"TOOLS.md";case"identity":return"IDENTITY.md";case"install":return"INSTALL.md";case"status":return"STATUS.md";default:return c?`${c.toUpperCase()}`:a}}function k(a,b){return a&&b&&a.templates?[...new Set(Object.keys(a.templates).filter(a=>a.startsWith(`${b}.`)).map(a=>j(a,!0)))]:[]}function l({title:a,description:c,buttonLabel:d,onButtonClick:e,error:f,children:g}){return(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:a}),(0,b.jsx)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:c})]}),(0,b.jsx)("button",{type:"button",onClick:e,className:"shrink-0 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)]",children:d})]}),f?(0,b.jsxs)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-xs text-[color:var(--ck-text-primary)]",children:["Frontmatter parse error: ",f]}):null,g]})}function m({fm:a,recipe:c}){return(0,b.jsxs)("div",{className:"mt-4 space-y-3",children:[(0,b.jsxs)("details",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",open:!0,children:[(0,b.jsx)("summary",{className:"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Recipe information"}),(0,b.jsxs)("div",{className:"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Recipe id:"})," ",a?.id??c.id]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Version:"})," ",a?.version??"(unknown)"]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Team id:"})," ",a?.team?.teamId??"(not set)"]}),a?.description?(0,b.jsx)("div",{className:"whitespace-pre-wrap",children:a.description}):null]})]}),(0,b.jsx)(n,{fm:a}),(0,b.jsx)(o,{fm:a})]})}function n({fm:a}){return(0,b.jsxs)("details",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,b.jsxs)("summary",{className:"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Agents (",a?.agents?.length??0,")"]}),(0,b.jsxs)("div",{className:"mt-2 space-y-2",children:[(a?.agents??[]).map((c,d)=>(0,b.jsxs)("details",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3",children:[(0,b.jsxs)("summary",{className:"cursor-pointer text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("span",{className:"font-medium",children:c.name??c.role??"(unnamed)"}),c.role?(0,b.jsxs)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:[" — ",c.role]}):null]}),(0,b.jsxs)("div",{className:"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Role:"})," ",c.role??"(none)"]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Tools profile:"})," ",c.tools?.profile??"(default)"]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Allow:"})," ",(c.tools?.allow??[]).length?(c.tools?.allow??[]).join(", "):"(none)"]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Deny:"})," ",(c.tools?.deny??[]).length?(c.tools?.deny??[]).join(", "):"(none)"]}),(0,b.jsxs)("div",{className:"pt-1",children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Expected files:"})," ",k(a,c.role).length?k(a,c.role).join(", "):"(not listed)"]})]})]},`${c.role??"agent"}:${d}`)),a?.agents&&0!==a.agents.length?null:(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"(No agents listed in frontmatter)"})]})]})}function o({fm:a}){return(0,b.jsxs)("details",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,b.jsxs)("summary",{className:"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Cron jobs (",a?.cronJobs?.length??0,")"]}),(0,b.jsxs)("div",{className:"mt-2 space-y-2",children:[(a?.cronJobs??[]).map((a,c)=>(0,b.jsxs)("details",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3",children:[(0,b.jsxs)("summary",{className:"cursor-pointer text-sm text-[color:var(--ck-text-primary)]",children:[(0,b.jsx)("span",{className:"font-medium",children:a.name??a.id??"(unnamed)"}),a.schedule?(0,b.jsxs)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:[" — ",a.schedule]}):null]}),(0,b.jsxs)("div",{className:"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]",children:[a.agentId?(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Agent:"})," ",a.agentId]}):null,a.channel?(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Channel:"})," ",a.channel]}):null,"boolean"==typeof a.enabledByDefault?(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Enabled by default:"})," ",a.enabledByDefault?"yes":"no"]}):null,a.message?(0,b.jsx)("div",{className:"mt-2 whitespace-pre-wrap rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-[11px] text-[color:var(--ck-text-primary)]",children:a.message}):null]})]},`${a.id??"cron"}:${c}`)),a?.cronJobs&&0!==a.cronJobs.length?null:(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:"(No cron jobs listed in frontmatter)"})]})]})}function p({recipe:a,fm:c,fmErr:d,onOpenCreateTeam:e}){return(0,b.jsx)(l,{title:"Team recipe",description:(0,b.jsxs)(b.Fragment,{children:["Create a team from this recipe. Creating a Team runs ",(0,b.jsx)("code",{children:"openclaw recipes scaffold-team"})," with"," ",(0,b.jsx)("code",{children:"--apply-config"}),"."]}),buttonLabel:"Create Team",onButtonClick:e,error:d,children:(0,b.jsx)(m,{fm:c,recipe:a})})}function q({recipe:a,afm:c,afmErr:d,onOpenCreateAgent:e}){return(0,b.jsx)(l,{title:"Agent recipe",description:(0,b.jsxs)(b.Fragment,{children:["Create an agent from this recipe. Creating an Agent runs ",(0,b.jsx)("code",{children:"openclaw recipes scaffold"})," with"," ",(0,b.jsx)("code",{children:"--apply-config"}),"."]}),buttonLabel:"Create Agent",onButtonClick:e,error:d,children:(0,b.jsxs)("div",{className:"mt-4 space-y-3",children:[(0,b.jsxs)("details",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",open:!0,children:[(0,b.jsx)("summary",{className:"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Recipe information"}),(0,b.jsxs)("div",{className:"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Recipe id:"})," ",c?.id??a.id]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:"Version:"})," ",c?.version??"(unknown)"]}),c?.description?(0,b.jsx)("div",{className:"whitespace-pre-wrap",children:c.description}):null]})]}),(0,b.jsxs)("details",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3",children:[(0,b.jsxs)("summary",{className:"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]",children:["Files (",Object.keys(c?.templates??{}).length,")"]}),(0,b.jsx)("div",{className:"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]",children:Object.keys(c?.templates??{}).length?(0,b.jsx)("ul",{className:"list-disc space-y-1 pl-5",children:Object.keys(c?.templates??{}).map(a=>(0,b.jsxs)("li",{children:[(0,b.jsx)("span",{className:"font-mono text-[11px]",children:a}),(0,b.jsx)("span",{className:"text-[color:var(--ck-text-tertiary)]",children:" → "}),(0,b.jsx)("span",{className:"font-mono text-[11px]",children:j(a)})]},a))}):(0,b.jsx)("div",{className:"text-[color:var(--ck-text-tertiary)]",children:"(No templates listed in frontmatter)"})})]})]})})}function r({open:a,title:c,recipeId:d,children:e,error:f,busy:g,onClose:h,onConfirm:i,confirmLabel:j}){return a?(0,b.jsx)("div",{className:"fixed inset-0 z-[100] flex items-center justify-center bg-black/60 p-4",role:"dialog","aria-modal":"true",children:(0,b.jsxs)("div",{className:"ck-glass w-full max-w-lg p-5",children:[(0,b.jsxs)("div",{className:"flex items-start justify-between gap-3",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("div",{className:"truncate text-lg font-semibold tracking-tight",children:c}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:["From recipe: ",d]})]}),(0,b.jsx)("button",{type:"button",onClick:()=>g?void 0:h(),className:"rounded-[var(--ck-radius-sm)] px-2 py-1 text-sm text-[color:var(--ck-text-secondary)] hover:text-[color:var(--ck-text-primary)]",children:"Close"})]}),(0,b.jsxs)("div",{className:"mt-4 space-y-3",children:[e,f?(0,b.jsx)("div",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm",children:f}):null,(0,b.jsxs)("div",{className:"flex justify-end gap-2 pt-2",children:[(0,b.jsx)("button",{type:"button",disabled:g,onClick:h,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)] transition-colors hover:bg-white/10 disabled:opacity-50",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:g,onClick:i,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",children:g?"Creating":j})]})]})]})}):null}function s({recipeId:a}){let h=(0,d.useRouter)(),[j,k]=(0,c.useState)(!0),[l,m]=(0,c.useState)(!1),[n,o]=(0,c.useState)(null),[s,t]=(0,c.useState)(""),[u,v]=(0,c.useState)(""),[w,x]=(0,c.useState)(null),[y,z]=(0,c.useState)(""),[A,B]=(0,c.useState)(""),[C,D]=(0,c.useState)("no"),[E,F]=(0,c.useState)(!1),[G,H]=(0,c.useState)("");(0,c.useEffect)(()=>{(async()=>{k(!0),v("");try{let b=(await (0,f.fetchJson)(`/api/recipes/${encodeURIComponent(a)}`,{cache:"no-store"})).recipe;o(b),t(b.content)}catch(a){v((0,e.errorMessage)(a))}finally{k(!1)}})()},[a]);let I=(0,c.useMemo)(()=>!!n&&null!==n.filePath,[n]),J=(0,c.useMemo)(()=>n&&"team"===n.kind?i(s):{fm:null,error:void 0},[n,s]),K=(0,c.useMemo)(()=>n&&"agent"===n.kind?i(s):{fm:null,error:void 0},[n,s]);async function L(){m(!0),v("");try{let b=await (0,f.fetchJson)(`/api/recipes/${encodeURIComponent(a)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:s})});v(`Saved to ${b.filePath}`)}catch(a){v((0,e.errorMessage)(a))}finally{m(!1)}}async function M(){if(!n||!w)return;let a=function(a,b,c){if(!a)return null;let d=b.trim(),e="team"===c?"Team id":"Agent id";return d?d===a.id?`${e} cannot be the same as the recipe id (${a.id}). Choose a new ${c} id.`:null:`${e} is required.`}(n,y,w);if(a)return void H(a);let b=y.trim();F(!0),H("");try{if("team"===w){let{res:a,json:c}=await (0,g.fetchScaffold)({kind:"team",recipeId:n.id,teamId:b,cronInstallChoice:C});if(!a.ok)throw Error(c.error||"Create Team failed");x(null),h.push(`/teams/${encodeURIComponent(b)}`)}else{let{res:a,json:c}=await (0,g.fetchScaffold)({kind:"agent",recipeId:n.id,agentId:b,name:A.trim()||void 0});if(!a.ok)throw Error(c.error||"Create Agent failed");x(null),h.push(`/agents/${encodeURIComponent(b)}`)}h.refresh()}catch(a){H((0,e.errorMessage)(a))}finally{F(!1)}}if(j)return(0,b.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Loading"});if(!n)return(0,b.jsx)("div",{className:"ck-glass mx-auto max-w-4xl p-6",children:"Not found."});let N="team"===n.kind?J.fm:null,O="team"===n.kind?J.error:void 0,P="agent"===n.kind?K.fm:null,Q="agent"===n.kind?K.error:void 0;return(0,b.jsxs)("div",{className:"ck-glass mx-auto max-w-6xl p-6 sm:p-8",children:[(0,b.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between sm:gap-6",children:[(0,b.jsxs)("div",{className:"min-w-0",children:[(0,b.jsx)("h1",{className:"truncate text-2xl font-semibold tracking-tight",children:n.name}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[n.id," • ",n.kind," • ",n.source]}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:["Path: ",n.filePath??"(unknown / not writable)"]})]}),(0,b.jsx)("div",{className:"flex gap-2",children:(0,b.jsx)("button",{disabled:!I||l,onClick:L,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",children:l?"Saving":"Save"})})]}),u?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-primary)]",children:u}):null,(0,b.jsxs)("div",{className:"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-2",children:[(0,b.jsxs)("div",{className:"ck-glass-strong p-4",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Recipe markdown"}),(0,b.jsx)("textarea",{value:s,onChange:a=>t(a.target.value),className:"mt-2 h-[70vh] 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)] placeholder:text-[color:var(--ck-text-tertiary)]",spellCheck:!1})]}),"team"===n.kind?(0,b.jsx)(p,{recipe:n,fm:N,fmErr:O,onOpenCreateTeam:function(){H(""),z(""),D("no"),x("team")}}):(0,b.jsx)(q,{recipe:n,afm:P,afmErr:Q,onOpenCreateAgent:function(){H(""),z(""),B((K.fm?.name||n?.name||"").trim()),x("agent")}})]}),(0,b.jsx)(r,{open:null!==w,title:"team"===w?"Create Team":"Create Agent",recipeId:n.id,busy:E,error:G||void 0,onClose:()=>x(null),onConfirm:M,confirmLabel:"team"===w?"Create Team":"Create Agent",children:"team"===w?(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Team id"}),(0,b.jsx)("input",{value:y,onChange:a=>z(a.target.value),placeholder:"e.g. acme",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:E})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Install cron jobs"}),(0,b.jsxs)("select",{value:C,onChange:a=>D(a.target.value),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:E,children:[(0,b.jsx)("option",{value:"no",children:"No (recommended)"}),(0,b.jsx)("option",{value:"yes",children:"Yes"})]}),(0,b.jsx)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-tertiary)]",children:"Kitchen scaffolds non-interactively; this controls the one-time cron install choice for this run."})]})]}):(0,b.jsxs)(b.Fragment,{children:[(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Agent id"}),(0,b.jsx)("input",{value:y,onChange:a=>z(a.target.value),placeholder:"e.g. larry",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:E})]}),(0,b.jsxs)("label",{className:"block",children:[(0,b.jsx)("div",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Name (optional)"}),(0,b.jsx)("input",{value:A,onChange:a=>B(a.target.value),placeholder:"e.g. Larry",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:E})]})]})}),(0,b.jsxs)("p",{className:"mt-6 text-xs text-[color:var(--ck-text-tertiary)]",children:["This page edits the recipe markdown and previews what will be created when you click"," ","team"===n.kind?"Create Team":"Create Agent","."]})]})}a.s(["default",()=>s],68236)}];
2
+
3
+ //# sourceMappingURL=src_app_recipes_%5Bid%5D_RecipeEditor_index_tsx_98393217._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/recipes/%5Bid%5D/RecipeEditor/index.tsx","../../../../src/lib/recipe-team-agents.ts","../../../../src/app/recipes/%5Bid%5D/RecipeEditor/recipe-editor-utils.ts","../../../../src/app/recipes/%5Bid%5D/RecipeEditor/RecipeEditorPanel.tsx","../../../../src/app/recipes/%5Bid%5D/RecipeEditor/RecipeEditorCreateModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useRouter } from \"next/navigation\";\nimport { errorMessage } from \"@/lib/errors\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { validateCreateId } from \"@/lib/recipe-team-agents\";\nimport { fetchScaffold } from \"@/lib/scaffold-client\";\nimport type { AgentRecipeFrontmatter, Recipe, TeamRecipeFrontmatter } from \"./types\";\nimport { parseFrontmatter } from \"./recipe-editor-utils\";\nimport { TeamRecipePanelContent, AgentRecipePanelContent } from \"./RecipeEditorPanel\";\nimport { RecipeEditorCreateModal } from \"./RecipeEditorCreateModal\";\n\ntype CreateModalKind = \"team\" | \"agent\" | null;\n\nexport default function RecipeEditor({ recipeId }: { recipeId: string }) {\n const router = useRouter();\n\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [recipe, setRecipe] = useState<Recipe | null>(null);\n const [content, setContent] = useState<string>(\"\");\n const [message, setMessage] = useState<string>(\"\");\n\n const [createModalKind, setCreateModalKind] = useState<CreateModalKind>(null);\n const [createId, setCreateId] = useState(\"\");\n const [createName, setCreateName] = useState(\"\");\n const [cronInstallChoice, setCronInstallChoice] = useState<\"yes\" | \"no\">(\"no\");\n const [createBusy, setCreateBusy] = useState(false);\n const [createError, setCreateError] = useState(\"\");\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n setMessage(\"\");\n try {\n const json = await fetchJson<{ recipe: Recipe }>(\n `/api/recipes/${encodeURIComponent(recipeId)}`,\n { cache: \"no-store\" }\n );\n const r = json.recipe;\n setRecipe(r);\n setContent(r.content);\n } catch (e: unknown) {\n setMessage(errorMessage(e));\n } finally {\n setLoading(false);\n }\n })();\n }, [recipeId]);\n\n const canSave = useMemo(() => {\n if (!recipe) return false;\n return recipe.filePath !== null;\n }, [recipe]);\n\n const teamFrontmatter = useMemo(() => {\n if (!recipe || recipe.kind !== \"team\") return { fm: null as TeamRecipeFrontmatter | null, error: undefined as string | undefined };\n return parseFrontmatter(content);\n }, [recipe, content]);\n\n const agentFrontmatter = useMemo(() => {\n if (!recipe || recipe.kind !== \"agent\") return { fm: null as AgentRecipeFrontmatter | null, error: undefined as string | undefined };\n return parseFrontmatter(content);\n }, [recipe, content]);\n\n async function onSave() {\n setSaving(true);\n setMessage(\"\");\n try {\n const json = await fetchJson<{ filePath: string }>(\n `/api/recipes/${encodeURIComponent(recipeId)}`,\n {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ content }),\n }\n );\n setMessage(`Saved to ${json.filePath}`);\n } catch (e: unknown) {\n setMessage(errorMessage(e));\n } finally {\n setSaving(false);\n }\n }\n\n function openCreateTeam() {\n setCreateError(\"\");\n setCreateId(\"\");\n setCronInstallChoice(\"no\");\n setCreateModalKind(\"team\");\n }\n\n function openCreateAgent() {\n setCreateError(\"\");\n setCreateId(\"\");\n setCreateName((agentFrontmatter.fm?.name || recipe?.name || \"\").trim());\n setCreateModalKind(\"agent\");\n }\n\n async function onSubmitCreate() {\n if (!recipe || !createModalKind) return;\n const kind = createModalKind;\n const err = validateCreateId(recipe, createId, kind);\n if (err) {\n setCreateError(err);\n return;\n }\n\n const id = createId.trim();\n setCreateBusy(true);\n setCreateError(\"\");\n\n try {\n if (kind === \"team\") {\n const { res, json } = await fetchScaffold({\n kind: \"team\",\n recipeId: recipe.id,\n teamId: id,\n cronInstallChoice,\n });\n if (!res.ok) throw new Error((json as { error?: string }).error || \"Create Team failed\");\n setCreateModalKind(null);\n router.push(`/teams/${encodeURIComponent(id)}`);\n } else {\n const { res, json } = await fetchScaffold({\n kind: \"agent\",\n recipeId: recipe.id,\n agentId: id,\n name: createName.trim() || undefined,\n });\n if (!res.ok) throw new Error((json as { error?: string }).error || \"Create Agent failed\");\n setCreateModalKind(null);\n router.push(`/agents/${encodeURIComponent(id)}`);\n }\n router.refresh();\n } catch (e: unknown) {\n setCreateError(errorMessage(e));\n } finally {\n setCreateBusy(false);\n }\n }\n\n if (loading) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Loading</div>;\n if (!recipe) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Not found.</div>;\n\n const fm = recipe.kind === \"team\" ? teamFrontmatter.fm : null;\n const fmErr = recipe.kind === \"team\" ? teamFrontmatter.error : undefined;\n\n const afm = recipe.kind === \"agent\" ? agentFrontmatter.fm : null;\n const afmErr = recipe.kind === \"agent\" ? agentFrontmatter.error : undefined;\n\n return (\n <div className=\"ck-glass mx-auto max-w-6xl p-6 sm:p-8\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between sm:gap-6\">\n <div className=\"min-w-0\">\n <h1 className=\"truncate text-2xl font-semibold tracking-tight\">{recipe.name}</h1>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {recipe.id} • {recipe.kind} • {recipe.source}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Path: {recipe.filePath ?? \"(unknown / not writable)\"}\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n <button\n disabled={!canSave || saving}\n onClick={onSave}\n 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\"\n >\n {saving ? \"Saving\" : \"Save\"}\n </button>\n </div>\n </div>\n\n {message ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-primary)]\">\n {message}\n </div>\n ) : null}\n\n <div className=\"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Recipe markdown</div>\n <textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n className=\"mt-2 h-[70vh] 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)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n spellCheck={false}\n />\n </div>\n\n {recipe.kind === \"team\" ? (\n <TeamRecipePanelContent recipe={recipe} fm={fm as TeamRecipeFrontmatter | null} fmErr={fmErr} onOpenCreateTeam={openCreateTeam} />\n ) : (\n <AgentRecipePanelContent recipe={recipe} afm={afm as AgentRecipeFrontmatter | null} afmErr={afmErr} onOpenCreateAgent={openCreateAgent} />\n )}\n </div>\n\n <RecipeEditorCreateModal\n open={createModalKind !== null}\n title={createModalKind === \"team\" ? \"Create Team\" : \"Create Agent\"}\n recipeId={recipe.id}\n busy={createBusy}\n error={createError || undefined}\n onClose={() => setCreateModalKind(null)}\n onConfirm={onSubmitCreate}\n confirmLabel={createModalKind === \"team\" ? \"Create Team\" : \"Create Agent\"}\n >\n {createModalKind === \"team\" ? (\n <>\n <label className=\"block\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team id</div>\n <input\n value={createId}\n onChange={(e) => setCreateId(e.target.value)}\n placeholder=\"e.g. acme\"\n 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)]\"\n disabled={createBusy}\n />\n </label>\n <label className=\"block\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Install cron jobs</div>\n <select\n value={cronInstallChoice}\n onChange={(e) => setCronInstallChoice(e.target.value as \"yes\" | \"no\")}\n 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)]\"\n disabled={createBusy}\n >\n <option value=\"no\">No (recommended)</option>\n <option value=\"yes\">Yes</option>\n </select>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n Kitchen scaffolds non-interactively; this controls the one-time cron install choice for this run.\n </div>\n </label>\n </>\n ) : (\n <>\n <label className=\"block\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Agent id</div>\n <input\n value={createId}\n onChange={(e) => setCreateId(e.target.value)}\n placeholder=\"e.g. larry\"\n 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)]\"\n disabled={createBusy}\n />\n </label>\n <label className=\"block\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name (optional)</div>\n <input\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Larry\"\n 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)]\"\n disabled={createBusy}\n />\n </label>\n </>\n )}\n </RecipeEditorCreateModal>\n\n <p className=\"mt-6 text-xs text-[color:var(--ck-text-tertiary)]\">\n This page edits the recipe markdown and previews what will be created when you click{\" \"}\n {recipe.kind === \"team\" ? \"Create Team\" : \"Create Agent\"}.\n </p>\n </div>\n );\n}\n","export function splitRecipeFrontmatter(md: string): { yamlText: string; rest: string } {\n if (!md.startsWith(\"---\\n\")) throw new Error(\"Recipe markdown must start with YAML frontmatter (---)\");\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) throw new Error(\"Recipe frontmatter not terminated (---)\");\n const yamlText = md.slice(4, end + 1);\n const rest = md.slice(end + 5);\n return { yamlText, rest };\n}\n\nexport function normalizeRole(role: string): string {\n const r = role.trim();\n if (!r) throw new Error(\"role is required\");\n if (!/^[a-z][a-z0-9-]{0,62}$/i.test(r)) throw new Error(\"role must be alphanumeric/dash\");\n return r;\n}\n\n/** Validates create-team or create-agent id. Returns error message or null. */\nexport function validateCreateId(\n recipe: { id: string } | null,\n id: string,\n entityLabel: \"team\" | \"agent\"\n): string | null {\n if (!recipe) return null;\n const t = id.trim();\n const label = entityLabel === \"team\" ? \"Team id\" : \"Agent id\";\n if (!t) return `${label} is required.`;\n if (t === recipe.id)\n return `${label} cannot be the same as the recipe id (${recipe.id}). Choose a new ${entityLabel} id.`;\n return null;\n}\n","import { parse as parseYaml } from \"yaml\";\nimport { errorMessage } from \"@/lib/errors\";\nimport type { AgentRecipeFrontmatter, TeamRecipeFrontmatter } from \"./types\";\n\nexport function parseFrontmatter(raw: string): { fm: TeamRecipeFrontmatter | AgentRecipeFrontmatter | null; error?: string } {\n const start = raw.indexOf(\"---\\n\");\n if (start !== 0) return { fm: null };\n const end = raw.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return { fm: null };\n const yamlText = raw.slice(4, end);\n\n try {\n const fm = parseYaml(yamlText) as TeamRecipeFrontmatter | AgentRecipeFrontmatter;\n if (!fm || typeof fm !== \"object\") return { fm: null };\n return { fm };\n } catch (e) {\n return { fm: null, error: errorMessage(e) };\n }\n}\n\nexport function templateKeyToFileName(key: string, stripRolePrefix?: boolean): string {\n const suffix = stripRolePrefix ? key.split(\".\").slice(1).join(\".\") : key;\n switch (suffix) {\n case \"soul\":\n return \"SOUL.md\";\n case \"agents\":\n return \"AGENTS.md\";\n case \"tools\":\n return \"TOOLS.md\";\n case \"identity\":\n return \"IDENTITY.md\";\n case \"install\":\n return \"INSTALL.md\";\n case \"status\":\n return \"STATUS.md\";\n default:\n return suffix ? `${suffix.toUpperCase()}` : key;\n }\n}\n\nexport function expectedFilesForRole(fm: TeamRecipeFrontmatter | null, role: string | undefined): string[] {\n if (!fm || !role || !fm.templates) return [];\n const keys = Object.keys(fm.templates).filter((k) => k.startsWith(`${role}.`));\n const files = keys.map((k) => templateKeyToFileName(k, true));\n return [...new Set(files)];\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { expectedFilesForRole, templateKeyToFileName } from \"./recipe-editor-utils\";\nimport type { AgentRecipeFrontmatter, TeamRecipeFrontmatter } from \"./types\";\n\nfunction RecipePanelCard({\n title,\n description,\n buttonLabel,\n onButtonClick,\n error,\n children,\n}: {\n title: string;\n description: ReactNode;\n buttonLabel: string;\n onButtonClick: () => void;\n error?: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"ck-glass-strong p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">{title}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">{description}</div>\n </div>\n <button\n type=\"button\"\n onClick={onButtonClick}\n className=\"shrink-0 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)]\"\n >\n {buttonLabel}\n </button>\n </div>\n {error ? (\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-xs text-[color:var(--ck-text-primary)]\">\n Frontmatter parse error: {error}\n </div>\n ) : null}\n {children}\n </div>\n );\n}\n\nfunction TeamRecipeDetails({ fm, recipe }: { fm: TeamRecipeFrontmatter | null; recipe: { id: string } }) {\n return (\n <div className=\"mt-4 space-y-3\">\n <details className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\" open>\n <summary className=\"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]\">Recipe information</summary>\n <div className=\"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Recipe id:</span> {fm?.id ?? recipe.id}</div>\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Version:</span> {fm?.version ?? \"(unknown)\"}</div>\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Team id:</span> {fm?.team?.teamId ?? \"(not set)\"}</div>\n {fm?.description ? <div className=\"whitespace-pre-wrap\">{fm.description}</div> : null}\n </div>\n </details>\n <TeamAgentsDetails fm={fm} />\n <TeamCronDetails fm={fm} />\n </div>\n );\n}\n\nfunction TeamAgentsDetails({ fm }: { fm: TeamRecipeFrontmatter | null }) {\n return (\n <details className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <summary className=\"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]\">\n Agents ({fm?.agents?.length ?? 0})\n </summary>\n <div className=\"mt-2 space-y-2\">\n {(fm?.agents ?? []).map((a, idx) => (\n <details key={`${a.role ?? \"agent\"}:${idx}`} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <summary className=\"cursor-pointer text-sm text-[color:var(--ck-text-primary)]\">\n <span className=\"font-medium\">{a.name ?? a.role ?? \"(unnamed)\"}</span>\n {a.role ? <span className=\"text-[color:var(--ck-text-tertiary)]\"> — {a.role}</span> : null}\n </summary>\n <div className=\"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Role:</span> {a.role ?? \"(none)\"}</div>\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Tools profile:</span> {a.tools?.profile ?? \"(default)\"}</div>\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Allow:</span> {(a.tools?.allow ?? []).length ? (a.tools?.allow ?? []).join(\", \") : \"(none)\"}</div>\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Deny:</span> {(a.tools?.deny ?? []).length ? (a.tools?.deny ?? []).join(\", \") : \"(none)\"}</div>\n <div className=\"pt-1\">\n <span className=\"text-[color:var(--ck-text-tertiary)]\">Expected files:</span>{\" \"}\n {expectedFilesForRole(fm, a.role).length ? expectedFilesForRole(fm, a.role).join(\", \") : \"(not listed)\"}\n </div>\n </div>\n </details>\n ))}\n {(!fm?.agents || fm.agents.length === 0) ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">(No agents listed in frontmatter)</div>\n ) : null}\n </div>\n </details>\n );\n}\n\nfunction TeamCronDetails({ fm }: { fm: TeamRecipeFrontmatter | null }) {\n return (\n <details className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <summary className=\"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]\">\n Cron jobs ({fm?.cronJobs?.length ?? 0})\n </summary>\n <div className=\"mt-2 space-y-2\">\n {(fm?.cronJobs ?? []).map((c, idx) => (\n <details key={`${c.id ?? \"cron\"}:${idx}`} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <summary className=\"cursor-pointer text-sm text-[color:var(--ck-text-primary)]\">\n <span className=\"font-medium\">{c.name ?? c.id ?? \"(unnamed)\"}</span>\n {c.schedule ? <span className=\"text-[color:var(--ck-text-tertiary)]\"> — {c.schedule}</span> : null}\n </summary>\n <div className=\"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {c.agentId ? <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Agent:</span> {c.agentId}</div> : null}\n {c.channel ? <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Channel:</span> {c.channel}</div> : null}\n {typeof c.enabledByDefault === \"boolean\" ? (\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Enabled by default:</span> {c.enabledByDefault ? \"yes\" : \"no\"}</div>\n ) : null}\n {c.message ? (\n <div className=\"mt-2 whitespace-pre-wrap rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-[11px] text-[color:var(--ck-text-primary)]\">{c.message}</div>\n ) : null}\n </div>\n </details>\n ))}\n {(!fm?.cronJobs || fm.cronJobs.length === 0) ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">(No cron jobs listed in frontmatter)</div>\n ) : null}\n </div>\n </details>\n );\n}\n\nexport function TeamRecipePanelContent({\n recipe,\n fm,\n fmErr,\n onOpenCreateTeam,\n}: {\n recipe: { id: string };\n fm: TeamRecipeFrontmatter | null;\n fmErr?: string;\n onOpenCreateTeam: () => void;\n}) {\n return (\n <RecipePanelCard\n title=\"Team recipe\"\n description={\n <>\n Create a team from this recipe. Creating a Team runs <code>openclaw recipes scaffold-team</code> with{\" \"}\n <code>--apply-config</code>.\n </>\n }\n buttonLabel=\"Create Team\"\n onButtonClick={onOpenCreateTeam}\n error={fmErr}\n >\n <TeamRecipeDetails fm={fm} recipe={recipe} />\n </RecipePanelCard>\n );\n}\n\nexport function AgentRecipePanelContent({\n recipe,\n afm,\n afmErr,\n onOpenCreateAgent,\n}: {\n recipe: { id: string };\n afm: AgentRecipeFrontmatter | null;\n afmErr?: string;\n onOpenCreateAgent: () => void;\n}) {\n return (\n <RecipePanelCard\n title=\"Agent recipe\"\n description={\n <>\n Create an agent from this recipe. Creating an Agent runs <code>openclaw recipes scaffold</code> with{\" \"}\n <code>--apply-config</code>.\n </>\n }\n buttonLabel=\"Create Agent\"\n onButtonClick={onOpenCreateAgent}\n error={afmErr}\n >\n <div className=\"mt-4 space-y-3\">\n <details className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\" open>\n <summary className=\"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]\">Recipe information</summary>\n <div className=\"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Recipe id:</span> {afm?.id ?? recipe.id}</div>\n <div><span className=\"text-[color:var(--ck-text-tertiary)]\">Version:</span> {afm?.version ?? \"(unknown)\"}</div>\n {afm?.description ? <div className=\"whitespace-pre-wrap\">{afm.description}</div> : null}\n </div>\n </details>\n <details className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/15 p-3\">\n <summary className=\"cursor-pointer text-sm font-medium text-[color:var(--ck-text-primary)]\">\n Files ({Object.keys(afm?.templates ?? {}).length})\n </summary>\n <div className=\"mt-2 space-y-1 text-xs text-[color:var(--ck-text-secondary)]\">\n {Object.keys(afm?.templates ?? {}).length ? (\n <ul className=\"list-disc space-y-1 pl-5\">\n {Object.keys(afm?.templates ?? {}).map((k) => (\n <li key={k}>\n <span className=\"font-mono text-[11px]\">{k}</span>\n <span className=\"text-[color:var(--ck-text-tertiary)]\"> → </span>\n <span className=\"font-mono text-[11px]\">{templateKeyToFileName(k)}</span>\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"text-[color:var(--ck-text-tertiary)]\">(No templates listed in frontmatter)</div>\n )}\n </div>\n </details>\n </div>\n </RecipePanelCard>\n );\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\n\ntype RecipeEditorCreateModalProps = {\n open: boolean;\n title: string;\n recipeId: string;\n children: ReactNode;\n error?: string;\n busy: boolean;\n onClose: () => void;\n onConfirm: () => void;\n confirmLabel: string;\n};\n\nexport function RecipeEditorCreateModal({\n open,\n title,\n recipeId,\n children,\n error,\n busy,\n onClose,\n onConfirm,\n confirmLabel,\n}: RecipeEditorCreateModalProps) {\n if (!open) return null;\n return (\n <div className=\"fixed inset-0 z-[100] flex items-center justify-center bg-black/60 p-4\" role=\"dialog\" aria-modal=\"true\">\n <div className=\"ck-glass w-full max-w-lg p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-lg font-semibold tracking-tight\">{title}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">From recipe: {recipeId}</div>\n </div>\n <button\n type=\"button\"\n onClick={() => (!busy ? onClose() : undefined)}\n className=\"rounded-[var(--ck-radius-sm)] px-2 py-1 text-sm text-[color:var(--ck-text-secondary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Close\n </button>\n </div>\n <div className=\"mt-4 space-y-3\">\n {children}\n {error ? (\n <div className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm\">{error}</div>\n ) : null}\n <div className=\"flex justify-end gap-2 pt-2\">\n <button\n type=\"button\"\n disabled={busy}\n onClick={onClose}\n 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)] transition-colors hover:bg-white/10 disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={busy}\n onClick={onConfirm}\n 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\"\n >\n {busy ? \"Creating\" : confirmLabel}\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"wDAEA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEA,EAAA,EAAA,CAAA,CAAA,OEPA,EAAA,EAAA,CAAA,CAAA,MAIO,SAAS,EAAiB,CAAW,EAE1C,GAAI,AAAU,IADA,EAAI,OAAO,CAAC,SACT,MAAO,CAAE,GAAI,IAAK,EACnC,IAAM,EAAM,EAAI,OAAO,CAAC,UAAW,GACnC,GAAY,CAAC,IAAT,EAAY,MAAO,CAAE,GAAI,IAAK,EAClC,IAAM,EAAW,EAAI,KAAK,CAAC,EAAG,GAE9B,GAAI,CACF,IAAM,EAAK,CAAA,EAAA,EAAA,KAAS,AAAT,EAAU,GACrB,GAAI,CAAC,GAAoB,UAAd,OAAO,EAAiB,MAAO,CAAE,GAAI,IAAK,EACrD,MAAO,IAAE,CAAG,CACd,CAAE,MAAO,EAAG,CACV,MAAO,CAAE,GAAI,KAAM,MAAO,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,EAAG,CAC5C,CACF,CAEO,SAAS,EAAsB,CAAW,CAAE,CAAyB,EAC1E,IAAM,EAAS,EAAkB,EAAI,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,KAAO,EACrE,OAAQ,GACN,IAAK,OACH,MAAO,SACT,KAAK,SACH,MAAO,WACT,KAAK,QACH,MAAO,UACT,KAAK,WACH,MAAO,aACT,KAAK,UACH,MAAO,YACT,KAAK,SACH,MAAO,WACT,SACE,OAAO,EAAS,CAAA,EAAG,EAAO,WAAW,GAAA,CAAI,CAAG,CAChD,CACF,CAEO,SAAS,EAAqB,CAAgC,CAAE,CAAwB,SAC7F,AAAI,AAAC,GAAO,GAAD,AAAU,EAAG,GAAJ,MAAa,CAG1B,CAH4B,GAGxB,IAAI,IAAI,AAFN,AACC,OADM,IAAI,CAAC,EAAG,SAAS,EAAE,MAAM,CAAC,AAAC,GAAM,EAAE,UAAU,CAAC,CAAA,EAAG,EAAK,CAAC,CAAC,GACzD,GAAG,CAAC,AAAC,GAAM,EAAsB,GAAG,KAC7B,CAHgB,EAAE,AAI9C,CCvCA,SAAS,EAAgB,OACvB,CAAK,aACL,CAAW,aACX,CAAW,eACX,CAAa,OACb,CAAK,UACL,CAAQ,CAQT,EACC,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA2D,IAC1E,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6DAAqD,OAEtE,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,EACT,UAAU,iPAET,OAGJ,EACC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kIAAwH,4BAC3G,KAE1B,KACH,IAGP,CAEA,SAAS,EAAkB,IAAE,CAAE,QAAE,CAAM,CAAgE,EACrG,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACb,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,uEAAuE,IAAI,CAAA,CAAA,YAC5F,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,kFAAyE,uBAC5F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,eAAiB,IAAE,GAAI,IAAM,EAAO,EAAE,IAClG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,aAAe,IAAE,GAAI,SAAW,eAC5F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,aAAe,IAAE,GAAI,MAAM,QAAU,eAChG,GAAI,YAAc,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+BAAuB,EAAG,WAAW,GAAU,WAGrF,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAkB,GAAI,IACvB,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAgB,GAAI,MAG3B,CAEA,SAAS,EAAkB,IAAE,CAAE,CAAwC,EACrE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,iFACjB,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,mFAAyE,WACjF,GAAI,QAAQ,QAAU,EAAE,OAEnC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACZ,CAAC,GAAI,QAAU,EAAA,AAAE,EAAE,GAAG,CAAC,CAAC,EAAG,IAC1B,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAA4C,UAAU,iFACrD,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,uEACjB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uBAAe,EAAE,IAAI,EAAI,EAAE,IAAI,EAAI,cAClD,EAAE,IAAI,CAAG,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,iDAAuC,MAAI,EAAE,IAAI,IAAW,QAExF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,UAAY,IAAE,EAAE,IAAI,EAAI,YACpF,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,mBAAqB,IAAE,EAAE,KAAK,EAAE,SAAW,eACvG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,WAAa,IAAE,CAAC,EAAE,KAAK,EAAE,OAAS,EAAA,AAAE,EAAE,MAAM,CAAG,CAAC,EAAE,KAAK,EAAE,OAAS,EAAE,AAAF,EAAI,IAAI,CAAC,MAAQ,YAC/I,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,UAAY,IAAE,CAAC,EAAE,KAAK,EAAE,MAAQ,EAAA,AAAE,EAAE,MAAM,CAAG,CAAC,EAAE,KAAK,EAAE,MAAQ,EAAA,AAAE,EAAE,IAAI,CAAC,MAAQ,YAC5I,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,iBACb,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,oBAAuB,IAC7E,EAAqB,EAAI,EAAE,IAAI,EAAE,MAAM,CAAG,EAAqB,EAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAQ,uBAZjF,CAAA,EAAG,EAAE,IAAI,EAAI,QAAQ,CAAC,EAAE,EAAA,CAAK,GAiB3C,AAAC,GAAI,QAA+B,IAArB,EAAG,MAAM,CAAC,MAAM,CAE7B,KADF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDAA+C,2CAKxE,CAEA,SAAS,EAAgB,IAAE,CAAE,CAAwC,EACnE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,iFACjB,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,mFAAyE,cAC9E,GAAI,UAAU,QAAU,EAAE,OAExC,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACZ,CAAC,GAAI,UAAY,EAAE,AAAF,EAAI,GAAG,CAAC,CAAC,EAAG,IAC5B,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAyC,UAAU,iFAClD,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,uEACjB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,uBAAe,EAAE,IAAI,EAAI,EAAE,EAAE,EAAI,cAChD,EAAE,QAAQ,CAAG,CAAA,EAAA,EAAA,IAAA,EAAC,OAAA,CAAK,UAAU,iDAAuC,MAAI,EAAE,QAAQ,IAAW,QAEhG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yEACZ,EAAE,OAAO,CAAG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,WAAa,IAAE,EAAE,OAAO,IAAU,KAC1G,EAAE,OAAO,CAAG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,aAAe,IAAE,EAAE,OAAO,IAAU,KAC9E,WAA9B,OAAO,EAAE,gBAAgB,CACxB,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,wBAA0B,IAAE,EAAE,gBAAgB,CAAG,MAAQ,QACnH,KACH,EAAE,OAAO,CACR,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yJAAiJ,EAAE,OAAO,GACvK,UAbM,CAAA,EAAG,EAAE,EAAE,EAAI,OAAO,CAAC,EAAE,EAAA,CAAK,GAiBvC,AAAD,GAAK,UAAmC,IAAvB,EAAG,QAAQ,CAAC,MAAM,CAEjC,KADF,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wDAA+C,8CAKxE,CAEO,SAAS,EAAuB,QACrC,CAAM,CACN,IAAE,OACF,CAAK,kBACL,CAAgB,CAMjB,EACC,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,MAAM,cACN,YACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WAAE,wDACqD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,mCAAqC,QAAM,IACtG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,mBAAqB,OAG/B,YAAY,cACZ,cAAe,EACf,MAAO,WAEP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAkB,GAAI,EAAI,OAAQ,KAGzC,CAEO,SAAS,EAAwB,QACtC,CAAM,KACN,CAAG,QACH,CAAM,mBACN,CAAiB,CAMlB,EACC,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,MAAM,eACN,YACE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WAAE,4DACyD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,8BAAgC,QAAM,IACrG,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAK,mBAAqB,OAG/B,YAAY,eACZ,cAAe,EACf,MAAO,WAEP,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACb,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,uEAAuE,IAAI,CAAA,CAAA,YAC5F,CAAA,EAAA,EAAA,GAAA,EAAC,UAAA,CAAQ,UAAU,kFAAyE,uBAC5F,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yEACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,eAAiB,IAAE,GAAK,IAAM,EAAO,EAAE,IACnG,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,WAAI,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,aAAe,IAAE,GAAK,SAAW,eAC5F,GAAK,YAAc,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+BAAuB,EAAI,WAAW,GAAU,WAGvF,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,iFACjB,CAAA,EAAA,EAAA,IAAA,EAAC,UAAA,CAAQ,UAAU,mFAAyE,UAClF,OAAO,IAAI,CAAC,GAAK,WAAa,CAAC,GAAG,MAAM,CAAC,OAEnD,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wEACZ,OAAO,IAAI,CAAC,GAAK,WAAa,CAAC,GAAG,MAAM,CACvC,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,oCACX,OAAO,IAAI,CAAC,GAAK,WAAa,CAAC,GAAG,GAAG,CAAC,AAAC,GACtC,CAAA,EAAA,EAAA,IAAA,EAAC,KAAA,WACC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,iCAAyB,IACzC,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,gDAAuC,QACvD,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,UAAU,iCAAyB,EAAsB,OAHxD,MAQb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,gDAAuC,kDAOpE,CCvMO,SAAS,EAAwB,MACtC,CAAI,CACJ,OAAK,UACL,CAAQ,UACR,CAAQ,OACR,CAAK,CACL,MAAI,SACJ,CAAO,CACP,WAAS,cACT,CAAY,CACiB,SAC7B,AAAK,EAEH,CAAA,CAFE,CAEF,CAFS,CAET,GAAA,EAAC,MAAA,CAAI,UAAU,yEAAyE,KAAK,SAAS,aAAW,gBAC/G,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,yCACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,mDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oBACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,yDAAiD,IAChE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DAAqD,gBAAc,QAEpF,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAQ,AAAD,OAAoB,EAAZ,IACxB,UAAU,2IACX,aAIH,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,2BACZ,EACA,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,wFAAgF,IAC7F,KACJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,wCACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EACV,QAAS,EACT,UAAU,qMACX,WAGD,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,KAAK,SACL,SAAU,EACV,QAAS,EACT,UAAU,4PAET,EAAO,WAAa,eArCf,IA4CpB,CJxDe,SAAS,EAAa,CAAE,UAAQ,CAAwB,EACrE,IAAM,EAAS,CAAA,EAAA,EAAA,SAAA,AAAS,IAElB,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACjC,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GAC/B,CAAC,EAAQ,EAAU,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAgB,MAC9C,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IACzC,CAAC,EAAS,EAAW,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAS,IAEzC,CAAC,EAAiB,EAAmB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAkB,MAClE,CAAC,EAAU,EAAY,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACnC,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IACvC,CAAC,EAAmB,EAAqB,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAe,MACnE,CAAC,EAAY,EAAc,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,GAAC,GACvC,CAAC,EAAa,EAAe,CAAG,CAAA,EAAA,EAAA,QAAA,AAAQ,EAAC,IAE/C,CAAA,EAAA,EAAA,SAAA,AAAS,EAAC,KACR,CAAC,UACC,GAAW,GACX,EAAW,IACX,GAAI,CAKF,IAAM,EAAI,CAJG,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAC1B,CAAC,aAAa,EAAE,mBAAmB,GAAA,CAAW,CAC9C,CAAE,MAAO,UAAW,EAAA,EAEP,MAAM,CACrB,EAAU,GACV,EAAW,EAAE,OAAO,CACtB,CAAE,MAAO,EAAY,CACnB,EAAW,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAC1B,QAAU,CACR,GAAW,EACb,EACF,CAAC,EACH,EAAG,CAAC,EAAS,EAEb,IAAM,EAAU,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IACtB,CAAI,CAAC,GACsB,KADd,EACN,EAAO,GADM,KACE,CACrB,CAAC,EAAO,EAEL,EAAkB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAC9B,AAAI,AAAC,GAA0B,QAAQ,CAAxB,EAAO,IAAI,CACnB,EAAiB,GADsB,CAAE,GAAI,KAAsC,WAAO,CAAgC,EAEhI,CAAC,EAAQ,EAAQ,EAEd,EAAmB,CAAA,EAAA,EAAA,OAAA,AAAO,EAAC,IAC/B,AAAI,AAAC,GAA0B,SAAS,CAAzB,EAAO,IAAI,CACnB,EAAiB,GADuB,CAAE,GAAI,KAAuC,WAAO,CAAgC,EAElI,CAAC,EAAQ,EAAQ,EAEpB,eAAe,IACb,EAAU,IACV,EAAW,IACX,GAAI,CACF,IAAM,EAAO,MAAM,CAAA,EAAA,EAAA,SAAA,AAAS,EAC1B,CAAC,aAAa,EAAE,mBAAmB,GAAA,CAAW,CAC9C,CACE,OAAQ,MACR,QAAS,CAAE,eAAgB,kBAAmB,EAC9C,KAAM,KAAK,SAAS,CAAC,CAAE,SAAQ,EACjC,GAEF,EAAW,CAAC,SAAS,EAAE,EAAK,QAAQ,CAAA,CAAE,CACxC,CAAE,MAAO,EAAY,CACnB,EAAW,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAC1B,QAAU,CACR,GAAU,EACZ,CACF,CAgBA,eAAe,IACb,GAAI,CAAC,GAAU,CAAC,EAAiB,OAEjC,IAAM,ECtFH,ADsFS,SCtFA,AACd,CAA6B,CAC7B,CAAU,CACV,CAA6B,EAE7B,GAAI,CAAC,EAAQ,OAAO,KACpB,IAAM,EAAI,EAAG,IAAI,GACX,EAAwB,SAAhB,EAAyB,UAAY,kBACnD,AAAK,EACD,CADI,CAAJ,EACM,EAAO,EAAE,CACV,CAAP,AAAO,EAAG,EAAM,sCAAsC,EAAE,EAAO,EAAE,CAAC,gBAAgB,EAAE,EAAY,IAAI,CAAC,CAChG,KAHQ,CAAA,EAAG,EAAM,aAAa,CAIvC,AAJwC,ED8EP,EAAQ,EADxB,GAEb,GAAI,EAD2C,AACtC,YACP,EAAe,GAIjB,IAAM,EAAK,EAAS,IAAI,GACxB,GAAc,GACd,EAAe,IAEf,GAAI,CACF,GAAI,AAAS,WAAQ,CACnB,GAAM,KAAE,CAAG,CAAE,MAAI,CAAE,CAAG,MAAM,CAAA,EAAA,EAAA,aAAA,AAAa,EAAC,CACxC,KAAM,OACN,SAAU,EAAO,EAAE,CACnB,OAAQ,oBACR,CACF,GACA,GAAI,CAAC,EAAI,EAAE,CAAE,MAAM,AAAI,MAAO,EAA4B,KAAK,EAAI,sBACnE,EAAmB,MACnB,EAAO,IAAI,CAAC,CAAC,OAAO,EAAE,mBAAmB,GAAA,CAAK,CAChD,KAAO,CACL,GAAM,CAAE,KAAG,MAAE,CAAI,CAAE,CAAG,MAAM,CAAA,EAAA,EAAA,aAAa,AAAb,EAAc,CACxC,KAAM,QACN,SAAU,EAAO,EAAE,CACnB,QAAS,EACT,KAAM,EAAW,IAAI,SAAM,CAC7B,GACA,GAAI,CAAC,EAAI,EAAE,CAAE,MAAM,AAAI,MAAO,EAA4B,KAAK,EAAI,uBACnE,EAAmB,MACnB,EAAO,IAAI,CAAC,CAAC,QAAQ,EAAE,mBAAmB,GAAA,CAAK,CACjD,CACA,EAAO,OAAO,EAChB,CAAE,MAAO,EAAY,CACnB,EAAe,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAC9B,QAAU,CACR,GAAc,EAChB,CACF,CAEA,GAAI,EAAS,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0CAAiC,YACpE,GAAI,CAAC,EAAQ,MAAO,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,0CAAiC,eAEpE,IAAM,EAAqB,SAAhB,EAAO,IAAI,CAAc,EAAgB,EAAE,CAAG,KACnD,EAAwB,SAAhB,EAAO,IAAI,CAAc,EAAgB,KAAK,MAAG,EAEzD,EAAsB,UAAhB,EAAO,IAAI,CAAe,EAAiB,EAAE,CAAG,KACtD,EAAS,AAAgB,YAAT,IAAI,CAAe,EAAiB,KAAK,CAAG,OAElE,MACE,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,kDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uFACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,oBACb,CAAA,EAAA,EAAA,GAAA,EAAC,KAAA,CAAG,UAAU,0DAAkD,EAAO,IAAI,GAC3E,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,+DACZ,EAAO,EAAE,CAAC,MAAI,EAAO,IAAI,CAAC,MAAI,EAAO,MAAM,IAE9C,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,8DAAoD,SAC1D,EAAO,QAAQ,EAAI,iCAI9B,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,sBACb,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CACC,SAAU,CAAC,GAAW,EACtB,QAAS,EACT,UAAU,4PAET,EAAS,SAAW,cAK1B,EACC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,iIACZ,IAED,KAEJ,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,uDACb,CAAA,EAAA,EAAA,IAAA,EAAC,MAAA,CAAI,UAAU,gCACb,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,mEAA0D,oBACzE,CAAA,EAAA,EAAA,GAAA,EAAC,WAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAW,EAAE,MAAM,CAAC,KAAK,EAC1C,UAAU,+MACV,YAAY,OAIf,AAAgB,WAAT,IAAI,CACV,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAuB,OAAQ,EAAQ,GAAI,EAAoC,MAAO,EAAO,iBA5GtG,CA4GwH,QA5G/G,EACP,EAAe,IACf,EAAY,IACZ,EAAqB,MACrB,EAAmB,OACrB,IAyGQ,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CAAwB,OAAQ,EAAQ,IAAK,EAAsC,OAAQ,EAAQ,kBAvG5G,CAuG+H,QAvGtH,EACP,EAAe,IACf,EAAY,IACZ,EAAc,CAAC,EAAiB,EAAE,EAAE,MAAQ,GAAQ,MAAQ,EAAA,CAAE,CAAE,IAAI,IACpE,EAAmB,QACrB,OAsGI,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,CACC,KAA0B,OAApB,EACN,MAAO,AAAoB,WAAS,cAAgB,eACpD,SAAU,EAAO,EAAE,CACnB,KAAM,EACN,MAAO,QAAe,EACtB,QAAS,IAAM,EAAmB,MAClC,UAAW,EACX,aAAkC,SAApB,EAA6B,cAAgB,wBAEtC,SAApB,EACC,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,YAC3E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAY,EAAE,MAAM,CAAC,KAAK,EAC3C,YAAY,YACZ,UAAU,qIACV,SAAU,OAGd,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,sBAC3E,CAAA,EAAA,EAAA,IAAA,EAAC,SAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAqB,EAAE,MAAM,CAAC,KAAK,EACpD,UAAU,qIACV,SAAU,YAEV,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,cAAK,qBACnB,CAAA,EAAA,EAAA,GAAA,EAAC,SAAA,CAAO,MAAM,eAAM,WAEtB,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,6DAAoD,4GAMvE,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,QAAA,CAAA,WACE,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,aAC3E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAY,EAAE,MAAM,CAAC,KAAK,EAC3C,YAAY,aACZ,UAAU,qIACV,SAAU,OAGd,CAAA,EAAA,EAAA,IAAA,EAAC,QAAA,CAAM,UAAU,kBACf,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,qEAA4D,oBAC3E,CAAA,EAAA,EAAA,GAAA,EAAC,QAAA,CACC,MAAO,EACP,SAAU,AAAC,GAAM,EAAc,EAAE,MAAM,CAAC,KAAK,EAC7C,YAAY,aACZ,UAAU,qIACV,SAAU,YAOpB,CAAA,EAAA,EAAA,IAAA,EAAC,IAAA,CAAE,UAAU,8DAAoD,uFACsB,IACpE,SAAhB,EAAO,IAAI,CAAc,cAAgB,eAAe,SAIjE"}
@@ -1,3 +1,3 @@
1
- module.exports=[55408,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(50944),e=a.i(72131),f=a.i(35112);let g={1:"Ordering team…",2:"Cooking up agents…",3:"Serving them up hot…"};function h({open:a,step:c,onDismiss:d}){return a?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none"}),d?(0,b.jsx)("button",{type:"button",onClick:a=>{a.preventDefault(),a.stopPropagation(),d()},className:"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-glass-strong)]","aria-label":"Dismiss loading overlay",title:"Dismiss",children:"Esc"}):null,(0,b.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,b.jsxs)("div",{className:"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-2xl font-semibold text-[color:var(--ck-text-primary)]",children:"Claw Kitchen"}),(0,b.jsx)("div",{className:"mt-3 text-base text-[color:var(--ck-text-secondary)]",children:"Hang tight — we’re updating your OpenClaw install."}),(0,b.jsx)("div",{className:"mt-8 space-y-4 text-base",children:[1,2,3].map(a=>{let d=a===c,e=a<c;return(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)("div",{className:"h-4 w-4 rounded-full "+(e?"bg-emerald-400":d?"bg-[var(--ck-accent-red)] animate-pulse":"bg-white/20")}),(0,b.jsx)("div",{className:e?"text-[color:var(--ck-text-secondary)] line-through":"text-[color:var(--ck-text-primary)]",children:g[a]})]},a)})})]})})]}),document.body):null}var i=a.i(61889);function j({open:a,recipeId:c,recipeName:d,teamId:g,setTeamId:h,installCron:i,setInstallCron:j,busy:k,error:l,onClose:m,onConfirm:n}){let[o,p]=(0,e.useState)(""),[q,r]=(0,e.useState)(!1),s=(0,e.useMemo)(()=>String(o??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[o]),t=q?g:s;return((0,e.useEffect)(()=>{a&&(q||h(s))},[s,a,q]),(0,e.useEffect)(()=>{a&&(r(!1),p(""),h(""))},[a]),a)?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:m}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create team"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new team from recipe ",(0,b.jsx)("code",{className:"font-mono",children:c}),d?(0,b.jsxs)(b.Fragment,{children:[" ","(",(0,b.jsx)("span",{className:"font-medium",children:d}),")"]}):null,"."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team name"}),(0,b.jsx)("input",{value:o,onChange:a=>p(a.target.value),placeholder:"e.g. Crypto Team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,b.jsx)("input",{value:t,onChange:a=>{r(!0),h(a.target.value)},placeholder:"e.g. my-team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config."})]}),(0,b.jsxs)("label",{className:"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:i,onChange:a=>j(a.target.checked)}),"Install cron jobs from this recipe"]}),l?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:l}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:m,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)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:k||!t.trim(),onClick:n,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)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:k?"Creating…":"Create team"})]})]})})})]}),document.body):null}function k({open:a,recipeId:c,recipeName:d,agentId:g,setAgentId:h,agentName:i,setAgentName:j,existingRecipeIds:k,existingAgentIds:l,busy:m,error:n,onClose:o,onConfirm:p}){let[q,r]=(0,e.useState)(!1),[s,t]=(0,e.useState)({state:"empty"}),u=(0,e.useMemo)(()=>String(i??"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/--+/g,"-"),[i]),v=q?g:u;return((0,e.useEffect)(()=>{a&&(q||h(u))},[u,a,q]),(0,e.useEffect)(()=>{a&&(r(!1),t({state:"empty"}),j(""),h(""))},[a]),(0,e.useEffect)(()=>{if(!a)return;let b=String(v??"").trim();if(!b)return void t({state:"empty"});if(k.includes(b))return void t({state:"taken",reason:"recipe-id-collision"});if(l.includes(b))return void t({state:"taken",reason:"agent-exists"});t({state:"available"});let c=setTimeout(()=>{(async()=>{t({state:"checking"});try{let a=await fetch(`/api/ids/check?kind=agent&id=${encodeURIComponent(b)}`,{cache:"no-store"}),c=await a.json();if(!a.ok||!c.ok)throw Error(String(c.error??"Failed to check id"));c.available?t({state:"available"}):t({state:"taken",reason:c.reason})}catch{t({state:"available"})}})()},250);return()=>clearTimeout(c)},[v,a,k,l]),a)?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:o}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Create agent"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new agent from recipe ",(0,b.jsx)("code",{className:"font-mono",children:c}),d?(0,b.jsxs)(b.Fragment,{children:[" ","(",(0,b.jsx)("span",{className:"font-medium",children:d}),")"]}):null,"."]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent name"}),(0,b.jsx)("input",{value:i,onChange:a=>j(a.target.value),placeholder:"e.g. Crypto Onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent id"}),(0,b.jsx)("input",{value:v,onChange:a=>{r(!0),h(a.target.value)},placeholder:"e.g. crypto-onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] "+("available"===s.state?"border-emerald-400/50":"taken"===s.state?"border-red-400/60":"border-white/10")}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"taken"===s.state?"That id is already taken.":"available"===s.state?"Id is available.":"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config."})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Name (optional)"}),(0,b.jsx)("input",{value:i,onChange:a=>j(a.target.value),placeholder:"e.g. My Agent",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"})]}),n?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:n}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:o,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)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:m||!v.trim()||"taken"===s.state||"checking"===s.state,onClick:p,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)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:m?"Creating…":"Create agent"})]})]})})})]}),document.body):null}function l({open:a,recipeId:c,onClose:d,onConfirm:e,busy:g,error:h}){return a?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[200]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-black/60",onClick:d}),(0,b.jsx)("div",{className:"fixed inset-0 overflow-y-auto",children:(0,b.jsx)("div",{className:"flex min-h-full items-center justify-center p-4",children:(0,b.jsxs)("div",{className:"w-full max-w-lg rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-5 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-lg font-semibold text-[color:var(--ck-text-primary)]",children:"Delete recipe"}),(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Delete recipe ",(0,b.jsx)("code",{className:"font-mono",children:c}),"? This removes the markdown file from your workspace."]}),h?(0,b.jsx)("div",{className:"mt-4 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-3 text-sm text-red-100",children:h}):null,(0,b.jsxs)("div",{className:"mt-6 flex items-center justify-end gap-2",children:[(0,b.jsx)("button",{type:"button",onClick:d,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)] hover:bg-white/10",children:"Cancel"}),(0,b.jsx)("button",{type:"button",disabled:g,onClick:e,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)] hover:bg-[var(--ck-accent-red-hover)] disabled:opacity-50",children:g?"Deleting…":"Delete"})]})]})})})]}),document.body):null}function m({title:a,items:d,onDelete:e,onCreateTeam:f,onCreateAgent:g,installedAgentIds:h}){return(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:a}),0===d.length?(0,b.jsx)("div",{className:"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]",children:"None yet."}):(0,b.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:d.map(a=>{let d="agent"===a.kind&&h.includes(a.id),i=d?`/agents/${encodeURIComponent(a.id)}`:`/recipes/${encodeURIComponent(a.id)}`,j=d?"Edit agent":"builtin"===a.source?"View recipe":"Edit recipe";return(0,b.jsxs)("div",{className:"ck-glass flex flex-col gap-3 px-4 py-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words",children:a.name}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("span",{className:"font-mono",children:a.id})," • ",a.kind," • ",a.source]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:["team"===a.kind&&f?(0,b.jsx)("button",{type:"button",onClick:()=>f(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 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",children:"Create team"}):null,"agent"===a.kind&&g?(0,b.jsx)("button",{type:"button",onClick:()=>g(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 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",children:"Create agent"}):null,(0,b.jsx)(c.default,{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 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",href:i,children:j}),e?(0,b.jsx)("button",{type:"button",onClick:()=>e(a.id),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Delete"}):null]})]},`${a.source}:${a.id}`)})})]})}function n({builtin:a,customTeamRecipes:c,customAgentRecipes:f,installedAgentIds:g}){let n=(0,i.useToast)(),[o,p]=(0,e.useState)(!1),[q,r]=(0,e.useState)(1),s=(0,d.useRouter)(),[t,u]=(0,e.useState)(!1),[v,w]=(0,e.useState)(""),[x,y]=(0,e.useState)(!1),[z,A]=(0,e.useState)(null),[B,C]=(0,e.useState)(!1),[D,E]=(0,e.useState)(null),[F,G]=(0,e.useState)(""),[H,I]=(0,e.useState)(!0),[J,K]=(0,e.useState)(!1),[L,M]=(0,e.useState)(null),[N,O]=(0,e.useState)(!1),[P,Q]=(0,e.useState)(null),[R,S]=(0,e.useState)(""),[T,U]=(0,e.useState)(""),[V,W]=(0,e.useState)(!1),[X,Y]=(0,e.useState)(null),Z=a=>{w(a),A(null),u(!0)},$=a=>{E(a),G(""),I(!0),M(null),C(!0)},_=a=>{Q(a),S(""),U(""),Y(null),O(!0)};async function aa(){y(!0),A(null);try{let a=await fetch("/api/recipes/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:v})}),b=await a.json();if(!a.ok||!b.ok){let c=String(b.error||"Delete failed");if(409===a.status)return void A(c);throw Error(c)}n.push({kind:"success",message:`Deleted recipe: ${v}`}),u(!1),window.location.reload()}catch(a){n.push({kind:"error",message:a instanceof Error?a.message:String(a)})}finally{y(!1)}}async function ab(a){let b=a?.timeoutMs??3e4,c=Date.now();for(;Date.now()-c<b;){try{if((await fetch("/healthz",{cache:"no-store"})).ok)return!0}catch{}await new Promise(a=>setTimeout(a,500))}return!1}async function ac(a,b){let c=b?.timeoutMs??3e4,d=Date.now();for(;Date.now()-d<c;){try{let[b,c]=await Promise.all([fetch("/api/recipes",{cache:"no-store"}),fetch(`/api/teams/meta?teamId=${encodeURIComponent(a)}`,{cache:"no-store"})]),d=await b.json(),e=(Array.isArray(d.recipes)?d.recipes:[]).some(b=>String(b.id??"")===a&&"team"===String(b.kind??"")),f=await c.json(),g=!!(c.ok&&f.ok&&!f.missing);if(e&&g)return!0}catch{}await new Promise(a=>setTimeout(a,500))}return!1}async function ad(){if(!D)return;let a=F.trim();if(!a)return void M("Team id is required.");if(a===D.id)return void M(`Team id cannot be the same as the recipe id (${D.id}). Choose a new team id.`);K(!0),M(null),C(!1),p(!0),r(1);let b=null;try{let c=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"team",recipeId:D.id,teamId:a,applyConfig:!0,overwrite:!1,cronInstallChoice:H?"yes":"no"})}),d=await c.json();if(!c.ok||!d.ok)throw Error(String(d.error||"Create team failed"));r(2),b=setTimeout(()=>{r(a=>a<3?3:a)},2e4);let e="string"==typeof d.stderr?d.stderr:"";if(/Failed to start CLI:/i.test(e)||/\bError: /i.test(e))throw Error(e.trim()||"Scaffold failed");if(/Restart required:/i.test(e)){r(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ab({timeoutMs:6e4})}await ac(a,{timeoutMs:6e4}),b&&clearTimeout(b),n.push({kind:"success",message:`Created team: ${a}`}),C(!1),s.push(`/teams/${encodeURIComponent(a)}`),setTimeout(()=>p(!1),500)}catch(c){b&&clearTimeout(b),p(!1);let a=c instanceof Error?c.message:String(c);M(a),n.push({kind:"error",message:a})}finally{K(!1)}}async function ae(){if(!P)return;let a=R.trim();if(!a)return void Y("Agent id is required.");if(a===P.id)return void Y(`Agent id cannot be the same as the recipe id (${P.id}). Choose a new agent id.`);W(!0),Y(null),O(!1),p(!0),r(1);let b=null;try{let c=await fetch("/api/scaffold",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({kind:"agent",recipeId:P.id,agentId:a,name:T.trim()||void 0,applyConfig:!0,overwrite:!1})}),d=await c.json();if(!c.ok||!d.ok)throw Error(String(d.error||"Create agent failed"));r(2),b=setTimeout(()=>{r(a=>a<3?3:a)},2e4);let e="string"==typeof d.stderr?d.stderr:"";if(/Failed to start CLI:/i.test(e)||/\bError: /i.test(e))throw Error(e.trim()||"Scaffold failed");if(/Restart required:/i.test(e)){r(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ab({timeoutMs:6e4})}b&&clearTimeout(b),n.push({kind:"success",message:`Created agent: ${a}`}),O(!1),s.push(`/agents/${encodeURIComponent(a)}`),setTimeout(()=>p(!1),500)}catch(c){b&&clearTimeout(b),p(!1);let a=c instanceof Error?c.message:String(c);Y(a),n.push({kind:"error",message:a})}finally{W(!1)}}return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(h,{open:o,step:q,onDismiss:()=>{p(!1)}}),(0,b.jsxs)("div",{className:"mt-8 space-y-10",children:[(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Custom recipes"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Workspace recipes (editable) — stored under ",(0,b.jsx)("code",{className:"font-mono",children:"~/.openclaw/workspace/recipes/"}),"."]}),(0,b.jsxs)("div",{className:"mt-4 space-y-8",children:[(0,b.jsx)(m,{title:`Teams (${c.length})`,items:c,onDelete:Z,onCreateTeam:$,installedAgentIds:g}),(0,b.jsx)(m,{title:`Agents (${f.length})`,items:f,onDelete:Z,onCreateAgent:_,installedAgentIds:g})]})]}),(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Builtin recipes"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"Bundled recipes shipped with the plugin."}),(0,b.jsx)("div",{className:"mt-4",children:(0,b.jsx)(m,{title:`All (${a.length})`,items:a,onCreateTeam:$,onCreateAgent:_,installedAgentIds:g})})]})]}),(0,b.jsx)(l,{open:t,recipeId:v,busy:x,error:z,onClose:()=>u(!1),onConfirm:aa}),(0,b.jsx)(j,{open:B,recipeId:D?.id??"",recipeName:D?.name??"",teamId:F,setTeamId:G,installCron:H,setInstallCron:I,busy:J,error:L,onClose:()=>C(!1),onConfirm:ad}),(0,b.jsx)(k,{open:N,recipeId:P?.id??"",recipeName:P?.name??"",agentId:R,setAgentId:S,agentName:T,setAgentName:U,existingRecipeIds:[...a,...c,...f].map(a=>a.id),existingAgentIds:g,busy:V,error:X,onClose:()=>O(!1),onConfirm:ae})]})}a.s(["default",()=>n],55408)}];
1
+ module.exports=[55408,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(50944),e=a.i(72131),f=a.i(35112);let g={1:"Ordering team…",2:"Cooking up agents…",3:"Serving them up hot…"};function h({open:a,step:c,onDismiss:d}){return a?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none"}),d?(0,b.jsx)("button",{type:"button",onClick:a=>{a.preventDefault(),a.stopPropagation(),d()},className:"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-glass-strong)]","aria-label":"Dismiss loading overlay",title:"Dismiss",children:"Esc"}):null,(0,b.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,b.jsxs)("div",{className:"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-2xl font-semibold text-[color:var(--ck-text-primary)]",children:"Claw Kitchen"}),(0,b.jsx)("div",{className:"mt-3 text-base text-[color:var(--ck-text-secondary)]",children:"Hang tight — we’re updating your OpenClaw install."}),(0,b.jsx)("div",{className:"mt-8 space-y-4 text-base",children:[1,2,3].map(a=>{let d=a===c,e=a<c;return(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)("div",{className:"h-4 w-4 rounded-full "+(e?"bg-emerald-400":d?"bg-[var(--ck-accent-red)] animate-pulse":"bg-white/20")}),(0,b.jsx)("div",{className:e?"text-[color:var(--ck-text-secondary)] line-through":"text-[color:var(--ck-text-primary)]",children:g[a]})]},a)})})]})})]}),document.body):null}var i=a.i(51200);async function j(a,b){let c=b.intervalMs??500,d=Date.now();for(;Date.now()-d<b.timeoutMs;){let b=await a();if(null!==b)return b;await new Promise(a=>setTimeout(a,c))}return null}var k=a.i(56635),l=a.i(61889),m=a.i(40211);function n(a){let{open:b,name:c,setName:d,id:f,setId:g,idTouched:h,setIdTouched:i,slugify:j=m.slugifyId}=a,k=(0,e.useMemo)(()=>j(c),[c,j]),l=h?f:k;return(0,e.useEffect)(()=>{b&&(h||g(k))},[k,b,h,g]),(0,e.useEffect)(()=>{b||(i(!1),d(""),g(""))},[b,i,d,g]),{derivedId:k,effectiveId:l}}var o=a.i(66063);function p({open:a,title:c,recipeId:d,recipeName:e,children:f,error:g,busy:h,canConfirm:i,onClose:j,onConfirm:k,confirmLabel:l}){return(0,b.jsxs)(o.ConfirmationModal,{open:a,onClose:j,title:c,error:g,confirmLabel:l,confirmBusyLabel:"Creating…",confirmDisabled:!i,busy:h,onConfirm:k,children:[(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new ",c.toLowerCase().replace("create ","")," from recipe"," ",(0,b.jsx)("code",{className:"font-mono",children:d}),e?(0,b.jsxs)(b.Fragment,{children:[" ","(",(0,b.jsx)("span",{className:"font-medium",children:e}),")"]}):null,"."]}),f]})}function q({open:a,recipeId:c,recipeName:d,teamId:f,setTeamId:g,installCron:h,setInstallCron:i,busy:j,error:k,onClose:l,onConfirm:m}){let[o,q]=(0,e.useState)(""),[r,s]=(0,e.useState)(!1),{effectiveId:t}=n({open:a,name:o,setName:q,id:f,setId:g,idTouched:r,setIdTouched:s});return(0,b.jsxs)(p,{open:a,title:"Create team",recipeId:c,recipeName:d,error:k,busy:j,canConfirm:!!t.trim(),onClose:l,onConfirm:m,confirmLabel:"Create team",children:[(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team name"}),(0,b.jsx)("input",{value:o,onChange:a=>q(a.target.value),placeholder:"e.g. Crypto Team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,b.jsx)("input",{value:t,onChange:a=>{s(!0),g(a.target.value)},placeholder:"e.g. my-team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config."})]}),(0,b.jsxs)("label",{className:"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:h,onChange:a=>i(a.target.checked)}),"Install cron jobs from this recipe"]})]})}function r(a){return/^[a-z0-9][a-z0-9_-]{1,62}$/.test(a)}function s({open:a,teamId:c,setTeamId:d,busy:f,error:g,onClose:h,onConfirm:j,onRolesChange:k}){let[l,m]=(0,e.useState)([]),[n,o]=(0,e.useState)(null),[q,s]=(0,e.useState)({}),[t,u]=(0,e.useState)(null),[v,w]=(0,e.useState)(null),[x,y]=(0,e.useState)(null);(0,e.useEffect)(()=>{let a=!1;return(async()=>{let b=await (0,i.fetchJsonWithStatus)("/api/agents",{cache:"no-store"});if(!a){if(!b.ok)return o(b.error);m(Array.isArray(b.data.agents)?b.data.agents:[])}})(),()=>{a=!0}},[]);let[z,A]=(0,e.useState)({state:"unknown"}),B=(0,e.useMemo)(()=>l.slice().sort((a,b)=>String(a.id??"").localeCompare(String(b.id??""))).map(a=>({id:String(a.id??""),label:a.identityName?`${a.identityName} (${a.id})`:String(a.id??"")})).filter(a=>a.id),[l]),C=(0,e.useMemo)(()=>Object.values(q),[q]),D=c.trim(),E=(0,e.useMemo)(()=>a?D?r(D)?D.endsWith("-team")?"taken"===z.state?`Team id is already taken: ${D}`:null:"Team id must end with -team.":"Invalid team id. Use lowercase letters/numbers with - or _ (2-63 chars).":"Team id is required.":null,[a,D,z.state]),F=(0,e.useMemo)(()=>{let a=new Map;for(let b of C){let c=String(b.roleId??"").trim();if(!c){a.set(b.agentId,"Role id is required.");continue}r(c)||a.set(b.agentId,"Invalid role id (lowercase letters/numbers with - or _).")}return a},[C]),G=!E&&"checking"!==z.state&&"unknown"!==z.state&&C.length>0&&0===F.size;return(0,e.useEffect)(()=>{a&&k(C)},[a,C,k]),(0,e.useEffect)(()=>{if(!a)return;let b=!1,c=setTimeout(async()=>{if(!D||!(r(D)&&D.endsWith("-team")))return void A({state:"unknown"});A({state:"checking"});let a=await (0,i.fetchJsonWithStatus)(`/api/ids/check?kind=team&id=${encodeURIComponent(D)}`,{cache:"no-store"});if(!b){if(!a.ok)return void A({state:"unknown"});if(a.data.ok&&!0===a.data.available)return void A({state:"available"});A({state:"taken",reason:a.data.reason})}},250);return()=>{b=!0,clearTimeout(c)}},[a,D]),(0,e.useEffect)(()=>{if(!a||!G)return;let b=!1,c=setTimeout(async()=>{let a=D.endsWith("-team")?D.slice(0,-5):D,c=await (0,i.fetchJsonWithStatus)("/api/recipes/custom-team",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({dryRun:!0,recipeId:a,teamId:D,roles:C.map(a=>({roleId:a.roleId,displayName:a.displayName}))})});if(!b){if(!c.ok){y(c.error),u(null),w(null);return}if(!c.data.ok){y(c.data.error||"Failed to generate preview"),u(null),w(null);return}y(null),u("string"==typeof c.data.md?c.data.md:null),w("string"==typeof c.data.filePath?c.data.filePath:null)}},250);return()=>{b=!0,clearTimeout(c)}},[a,G,D,C]),(0,b.jsxs)(p,{open:a,title:"Create custom team",recipeId:"(new recipe)",recipeName:"Custom Team",error:g||n,busy:f,canConfirm:G,onClose:h,onConfirm:j,confirmLabel:"Create team",children:[(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,b.jsx)("input",{value:c,onChange:a=>d(a.target.value.toLowerCase().replace(/\s+/g,"-")),placeholder:"e.g. my-team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0}),E?(0,b.jsx)("div",{className:"mt-2 text-xs text-red-300",children:E}):null,!E&&D?(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["checking"===z.state?"Checking availability…":null,"available"===z.state?"Available.":null]}):null,(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["This creates a new team recipe under ",(0,b.jsx)("code",{children:"~/.openclaw/workspace/recipes"})," and scaffolds",(0,b.jsx)("code",{className:"ml-1",children:"~/.openclaw/workspace-<teamId>"}),"."]})]}),(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Select agents"}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"MVP: this creates new team roles that mirror the selected agents' names. You can edit the resulting team recipe later."}),(0,b.jsx)("div",{className:"mt-3 max-h-[220px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3",children:0===B.length?(0,b.jsx)("div",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"No installed agents found."}):(0,b.jsx)("div",{className:"space-y-2",children:B.map(a=>{let c=!!q[a.id];return(0,b.jsxs)("label",{className:"flex items-start gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:c,onChange:b=>{let c={...q};if(b.target.checked){var d;let b;c[a.id]={agentId:a.id,roleId:((b=(d=a.id).split("/").pop()||d).split("-").slice(-1)[0]||b).toLowerCase().replace(/[^a-z0-9_-]+/g,"-"),displayName:a.label}}else delete c[a.id];s(c)}}),(0,b.jsx)("span",{className:"min-w-0 break-words",children:a.label})]},a.id)})})})]}),C.length?(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Role mapping"}),(0,b.jsx)("div",{className:"mt-3 space-y-3",children:C.map(a=>{let c=F.get(a.agentId);return(0,b.jsxs)("div",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3",children:[(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:a.agentId}),(0,b.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Role id"}),(0,b.jsx)("input",{value:a.roleId,onChange:b=>{s(c=>({...c,[a.agentId]:{...c[a.agentId],roleId:b.target.value}}))},className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),c?(0,b.jsx)("div",{className:"mt-1 text-xs text-red-300",children:c}):null]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Display name"}),(0,b.jsx)("input",{value:a.displayName,onChange:b=>{s(c=>({...c,[a.agentId]:{...c[a.agentId],displayName:b.target.value}}))},className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]})]},a.agentId)})})]}):null,(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Preview"}),(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["Generated recipe preview (best-effort). This is what will be written to",(0,b.jsx)("code",{className:"ml-1",children:"~/.openclaw/workspace/recipes/<teamId>.md"}),"."]}),G&&x?(0,b.jsx)("div",{className:"mt-2 text-xs text-red-300",children:x}):null,G&&v?(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["Target path: ",(0,b.jsx)("code",{children:v})]}):null,(0,b.jsx)("pre",{className:"mt-3 max-h-[260px] overflow-auto whitespace-pre-wrap rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-3 text-xs text-[color:var(--ck-text-secondary)]",children:G?t||"(Loading preview…)":"(Select a valid team id and at least one agent to preview.)"})]})]})}function t({open:a,recipeId:c,recipeName:d,agentId:f,setAgentId:g,agentName:h,setAgentName:j,existingRecipeIds:k,existingAgentIds:l,busy:m,error:o,onClose:q,onConfirm:r}){var s,t;let[u,v]=(0,e.useState)(!1),[w,x]=(0,e.useState)(null),{effectiveId:y}=n({open:a,name:h,setName:j,id:f,setId:g,idTouched:u,setIdTouched:v}),z=String(y??"").trim(),A=(0,e.useMemo)(()=>a?z?k.includes(z)?{state:"taken",reason:"recipe-id-collision"}:l.includes(z)?{state:"taken",reason:"agent-exists"}:null:{state:"empty"}:{state:"empty"},[a,z,k,l]),B=A??w??{state:"available"};return(0,e.useEffect)(()=>{if(!a||null!==A)return;let b=setTimeout(()=>{(async()=>{x({state:"checking"});try{let a=await (0,i.fetchJson)(`/api/ids/check?kind=agent&id=${encodeURIComponent(z)}`,{cache:"no-store"});a.available?x({state:"available"}):x({state:"taken",reason:a.reason})}catch{x({state:"available"})}})()},250);return()=>clearTimeout(b)},[a,A,z]),(0,b.jsxs)(p,{open:a,title:"Create agent",recipeId:c,recipeName:d,error:o,busy:m,canConfirm:!!y.trim()&&"taken"!==B.state&&"checking"!==B.state,onClose:q,onConfirm:r,confirmLabel:"Create agent",children:[(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent name"}),(0,b.jsx)("input",{value:h,onChange:a=>j(a.target.value),placeholder:"e.g. Crypto Onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent id"}),(0,b.jsx)("input",{value:y,onChange:a=>{v(!0),g(a.target.value)},placeholder:"e.g. crypto-onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] "+("available"===(s=B.state)?"border-emerald-400/50":"taken"===s?"border-red-400/60":"border-white/10")}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"taken"===(t=B.state)?"That id is already taken.":"available"===t?"Id is available.":"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config."})]})]})}var u=a.i(88764),v=a.i(74621);function w({title:a,items:d,onDelete:e,onCreateTeam:f,onCreateAgent:g,installedAgentIds:h}){return(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:a}),0===d.length?(0,b.jsx)("div",{className:"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]",children:"None yet."}):(0,b.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:d.map(a=>{var d;let i="agent"===a.kind&&h.includes(a.id),j=i?`/agents/${encodeURIComponent(a.id)}`:`/recipes/${encodeURIComponent(a.id)}`,k=(d=a.source,i?"Edit agent":"builtin"===d?"View recipe":"Edit recipe");return(0,b.jsxs)("div",{className:"ck-glass flex flex-col gap-3 px-4 py-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words",children:a.name}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("span",{className:"font-mono",children:a.id})," • ",a.kind," • ",a.source]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:["team"===a.kind&&f?(0,b.jsx)("button",{type:"button",onClick:()=>f(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 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",children:"Create team"}):null,"agent"===a.kind&&g?(0,b.jsx)("button",{type:"button",onClick:()=>g(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 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",children:"Create agent"}):null,(0,b.jsx)(c.default,{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 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",href:j,children:k}),e?(0,b.jsx)("button",{type:"button",onClick:()=>e(a.id),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Delete"}):null]})]},`${a.source}:${a.id}`)})})]})}function x({builtin:a,customTeamRecipes:c,customAgentRecipes:f,installedAgentIds:g,initialOpenCustomTeam:m=!1}){let n=(0,l.useToast)(),[o,p]=(0,e.useState)(!1),[r,x]=(0,e.useState)(1),y=(0,d.useRouter)(),[z,A]=(0,e.useState)(!1),[B,C]=(0,e.useState)(""),[D,E]=(0,e.useState)(!1),[F,G]=(0,e.useState)(null),[H,I]=(0,e.useState)(!1),[J,K]=(0,e.useState)(null),[L,M]=(0,e.useState)(""),[N,O]=(0,e.useState)(!0),[P,Q]=(0,e.useState)(!1),[R,S]=(0,e.useState)(null),[T,U]=(0,e.useState)(!1),[V,W]=(0,e.useState)(null),[X,Y]=(0,e.useState)(""),[Z,$]=(0,e.useState)(""),[_,aa]=(0,e.useState)(!1),[ab,ac]=(0,e.useState)(null),[ad,ae]=(0,e.useState)(m),[af,ag]=(0,e.useState)(""),[ah,ai]=(0,e.useState)(!1),[aj,ak]=(0,e.useState)(null),[al,am]=(0,e.useState)([]),an=a=>{C(a),G(null),A(!0)},ao=a=>{K(a),M(""),O(!0),S(null),I(!0)},ap=a=>{W(a),Y(""),$(""),ac(null),U(!0)};async function aq(){E(!0),G(null);try{let a=await (0,i.fetchJsonWithStatus)("/api/recipes/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:B})});if(!a.ok){if(409===a.status)return void G(a.error);throw Error(a.error)}if(!a.data.ok)return void G(a.data.error??"Delete failed");n.push({kind:"success",message:`Deleted recipe: ${B}`}),A(!1),window.location.reload()}catch(a){n.push({kind:"error",message:(0,v.errorMessage)(a)})}finally{E(!1)}}async function ar(a){let b=a?.timeoutMs??3e4;return await j(async()=>{try{return!!(await fetch("/healthz",{cache:"no-store"})).ok||null}catch{return null}},{timeoutMs:b})??!1}async function as(a,b){let c=b?.timeoutMs??3e4;return await j(async()=>{try{let[b,c]=await Promise.all([fetch("/api/recipes",{cache:"no-store"}),fetch(`/api/teams/meta?teamId=${encodeURIComponent(a)}`,{cache:"no-store"})]),d=await b.json(),e=(Array.isArray(d.recipes)?d.recipes:[]).some(b=>String(b.id??"")===a&&"team"===String(b.kind??"")),f=await c.json(),g=!!(c.ok&&f.ok&&!f.missing);return!!e&&!!g||null}catch{return null}},{timeoutMs:c})??!1}async function at(a,b,c){let d=await (0,i.fetchJsonWithStatus)("/api/teams/meta",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({teamId:a,recipeId:b,recipeName:c})});if(!d.ok)throw Error(d.error);if(!d.data.ok)throw Error(d.data.error||"Failed to attach team meta")}async function au(a){let{kind:b,recipeId:c,teamId:d,agentId:e,name:f,cronInstallChoice:g,setBusy:h,setError:i,setModalOpen:j,setOverlayOpen:l,setOverlayStep:m,successMessage:o,navigateTo:p,waitBeforeNavigate:q}=a;h(!0),i(null),j(!1),l(!0),m(1);let r=null;try{let{res:a,json:h}=await (0,k.fetchScaffold)("team"===b?{kind:"team",recipeId:c,teamId:d,cronInstallChoice:g}:{kind:"agent",recipeId:c,agentId:e,name:f});if(!a.ok||!h.ok)throw Error(String(h.error||("team"===b?"Create team failed":"Create agent failed")));m(2),r=setTimeout(()=>{m(a=>a<3?3:a)},2e4);let i="string"==typeof h.stderr?h.stderr:"";if(/Failed to start CLI:/i.test(i)||/\bError: /i.test(i))throw Error(i.trim()||"Scaffold failed");if(/Restart required:/i.test(i)){m(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ar({timeoutMs:6e4})}q&&await q(),r&&clearTimeout(r),n.push({kind:"success",message:o}),j(!1),y.push(p),setTimeout(()=>l(!1),500)}catch(b){r&&clearTimeout(r),l(!1);let a=(0,v.errorMessage)(b);i(a),n.push({kind:"error",message:a})}finally{h(!1)}}async function av(){let a=function(a,b){if(!a)return null;let c=b.trim();return c?c.endsWith("-team")?c===a.id?`Team id cannot be the same as the recipe id (${a.id}). Choose a new team id.`:null:"Team id must end with -team.":"Team id is required."}(J,L);if(a)return void S(a);if(!J)return;let b=L.trim();await au({kind:"team",recipeId:J.id,teamId:b,cronInstallChoice:N?"yes":"no",setBusy:Q,setError:S,setModalOpen:I,setOverlayOpen:p,setOverlayStep:x,successMessage:`Created team: ${b}`,navigateTo:`/teams/${encodeURIComponent(b)}`,waitBeforeNavigate:()=>as(b,{timeoutMs:6e4})})}async function aw(){if(!V)return;let a=X.trim();a?a===V.id?ac(`Agent id cannot be the same as the recipe id (${V.id}). Choose a new agent id.`):await au({kind:"agent",recipeId:V.id,agentId:a,name:Z.trim()||void 0,setBusy:aa,setError:ac,setModalOpen:U,setOverlayOpen:p,setOverlayStep:x,successMessage:`Created agent: ${a}`,navigateTo:`/agents/${encodeURIComponent(a)}`}):ac("Agent id is required.")}async function ax(){let a=af.trim();if(!a)return void ak("Team id is required.");let b=a.endsWith("-team")?a.slice(0,-5):a;if(!b)return void ak("Team id is invalid.");if(al.length<1)return void ak("Select at least one agent.");ak(null);try{ai(!0);let c=await (0,i.fetchJsonWithStatus)("/api/recipes/custom-team",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({recipeId:b,teamId:a,roles:al.map(a=>({roleId:a.roleId,displayName:a.displayName}))})});if(ai(!1),!c.ok)throw Error(c.error);if(!c.data.ok)throw Error(c.data.error||"Failed to create custom team recipe");await au({kind:"team",recipeId:b,teamId:a,cronInstallChoice:"no",setBusy:ai,setError:ak,setModalOpen:ae,setOverlayOpen:p,setOverlayStep:x,successMessage:`Created team: ${a}`,navigateTo:`/teams/${encodeURIComponent(a)}`,waitBeforeNavigate:async()=>{await at(a,b,"Custom Team"),await as(a,{timeoutMs:6e4})}})}catch(b){ai(!1);let a=(0,v.errorMessage)(b);ak(a),n.push({kind:"error",message:a})}}return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(h,{open:o,step:r,onDismiss:()=>{p(!1)}}),(0,b.jsxs)("div",{className:"mt-8 space-y-10",children:[(0,b.jsxs)("section",{children:[(0,b.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Custom recipes"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Workspace recipes (editable) — stored under ",(0,b.jsx)("code",{className:"font-mono",children:"~/.openclaw/workspace/recipes/"}),"."]})]}),(0,b.jsx)("button",{type:"button",onClick:()=>{ag(""),am([]),ak(null),ae(!0)},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 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",children:"Create custom team"})]}),(0,b.jsxs)("div",{className:"mt-4 space-y-8",children:[(0,b.jsx)(w,{title:`Teams (${c.length})`,items:c,onDelete:an,onCreateTeam:ao,installedAgentIds:g}),(0,b.jsx)(w,{title:`Agents (${f.length})`,items:f,onDelete:an,onCreateAgent:ap,installedAgentIds:g})]})]}),(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Builtin recipes"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"Bundled recipes shipped with the plugin."}),(0,b.jsx)("div",{className:"mt-4",children:(0,b.jsx)(w,{title:`All (${a.length})`,items:a,onCreateTeam:ao,onCreateAgent:ap,installedAgentIds:g})})]})]}),(0,b.jsx)(u.DeleteRecipeModal,{open:z,recipeId:B,busy:D,error:F,onClose:()=>A(!1),onConfirm:aq}),(0,b.jsx)(s,{open:ad,teamId:af,setTeamId:ag,busy:ah,error:aj,onRolesChange:am,onClose:()=>ae(!1),onConfirm:ax}),(0,b.jsx)(q,{open:H,recipeId:J?.id??"",recipeName:J?.name??"",teamId:L,setTeamId:M,installCron:N,setInstallCron:O,busy:P,error:R,onClose:()=>I(!1),onConfirm:av}),(0,b.jsx)(t,{open:T,recipeId:V?.id??"",recipeName:V?.name??"",agentId:X,setAgentId:Y,agentName:Z,setAgentName:$,existingRecipeIds:[...a,...c,...f].map(a=>a.id),existingAgentIds:g,busy:_,error:ab,onClose:()=>U(!1),onConfirm:aw})]})}a.s(["default",()=>x],55408)}];
2
2
 
3
3
  //# sourceMappingURL=src_app_recipes_recipes-client_tsx_8ed3ca94._.js.map