@jiggai/kitchen 0.1.8 → 0.1.10-canary.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 (399) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +5 -0
  3. package/.next/build-manifest.json +6 -6
  4. package/.next/prerender-manifest.json +3 -27
  5. package/.next/required-server-files.js +4 -4
  6. package/.next/required-server-files.json +4 -4
  7. package/.next/routes-manifest.json +30 -0
  8. package/.next/server/app/_global-error/page/build-manifest.json +4 -4
  9. package/.next/server/app/_global-error/page.js +2 -2
  10. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  11. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/_global-error.html +2 -2
  13. package/.next/server/app/_global-error.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/.next/server/app/_not-found/page/build-manifest.json +4 -4
  20. package/.next/server/app/_not-found/page.js +10 -9
  21. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/_not-found.html +1 -1
  24. package/.next/server/app/_not-found.rsc +4 -4
  25. package/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  26. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  28. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  30. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  31. package/.next/server/app/agents/[agentId]/page/build-manifest.json +4 -4
  32. package/.next/server/app/agents/[agentId]/page.js +7 -7
  33. package/.next/server/app/agents/[agentId]/page.js.nft.json +1 -1
  34. package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +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/files/route.js.nft.json +1 -1
  38. package/.next/server/app/api/agents/identity/route.js +1 -1
  39. package/.next/server/app/api/agents/identity/route.js.nft.json +1 -1
  40. package/.next/server/app/api/agents/route.js +1 -1
  41. package/.next/server/app/api/agents/route.js.nft.json +1 -1
  42. package/.next/server/app/api/gateway/restart/route.js +1 -1
  43. package/.next/server/app/api/gateway/restart/route.js.nft.json +1 -1
  44. package/.next/server/app/api/goals/[id]/promote/route.js.nft.json +1 -1
  45. package/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  46. package/.next/server/app/api/goals/route.js.nft.json +1 -1
  47. package/.next/server/app/api/recipes/[id]/route.js.nft.json +1 -1
  48. package/.next/server/app/api/recipes/clone/route.js.nft.json +1 -1
  49. package/.next/server/app/api/recipes/delete/route.js.nft.json +1 -1
  50. package/.next/server/app/api/recipes/route.js +1 -1
  51. package/.next/server/app/api/recipes/route.js.nft.json +1 -1
  52. package/.next/server/app/api/recipes/team-agents/route.js.nft.json +1 -1
  53. package/.next/server/app/api/scaffold/route.js.nft.json +1 -1
  54. package/.next/server/app/api/swarms/start/route/app-paths-manifest.json +3 -0
  55. package/.next/server/app/api/swarms/start/route/build-manifest.json +11 -0
  56. package/.next/server/app/api/swarms/start/route/server-reference-manifest.json +4 -0
  57. package/.next/server/app/api/swarms/start/route.js +6 -0
  58. package/.next/server/app/api/swarms/start/route.js.map +5 -0
  59. package/.next/server/app/api/swarms/start/route.js.nft.json +1 -0
  60. package/.next/server/app/api/swarms/start/route_client-reference-manifest.js +2 -0
  61. package/.next/server/app/api/swarms/status/route/app-paths-manifest.json +3 -0
  62. package/.next/server/app/api/swarms/status/route/build-manifest.json +11 -0
  63. package/.next/server/app/api/swarms/status/route/server-reference-manifest.json +4 -0
  64. package/.next/server/app/api/swarms/status/route.js +6 -0
  65. package/.next/server/app/api/swarms/status/route.js.map +5 -0
  66. package/.next/server/app/api/swarms/status/route.js.nft.json +1 -0
  67. package/.next/server/app/api/swarms/status/route_client-reference-manifest.js +2 -0
  68. package/.next/server/app/api/teams/orchestrator/route/app-paths-manifest.json +3 -0
  69. package/.next/server/app/api/teams/orchestrator/route/build-manifest.json +11 -0
  70. package/.next/server/app/api/teams/orchestrator/route/server-reference-manifest.json +4 -0
  71. package/.next/server/app/api/teams/orchestrator/route.js +6 -0
  72. package/.next/server/app/api/teams/orchestrator/route.js.map +5 -0
  73. package/.next/server/app/api/teams/orchestrator/route.js.nft.json +1 -0
  74. package/.next/server/app/api/teams/orchestrator/route_client-reference-manifest.js +2 -0
  75. package/.next/server/app/api/teams/remove-team/route.js +1 -1
  76. package/.next/server/app/api/teams/remove-team/route.js.nft.json +1 -1
  77. package/.next/server/app/api/teams/skills/install/route.js +1 -1
  78. package/.next/server/app/api/teams/skills/install/route.js.nft.json +1 -1
  79. package/.next/server/app/api/teams/workflow-runs/route/app-paths-manifest.json +3 -0
  80. package/.next/server/app/api/teams/workflow-runs/route/build-manifest.json +11 -0
  81. package/.next/server/app/api/teams/workflow-runs/route/server-reference-manifest.json +4 -0
  82. package/.next/server/app/api/teams/workflow-runs/route.js +7 -0
  83. package/.next/server/app/api/teams/workflow-runs/route.js.map +5 -0
  84. package/.next/server/app/api/teams/workflow-runs/route.js.nft.json +1 -0
  85. package/.next/server/app/api/teams/workflow-runs/route_client-reference-manifest.js +2 -0
  86. package/.next/server/app/api/teams/workflows/route/app-paths-manifest.json +3 -0
  87. package/.next/server/app/api/teams/workflows/route/build-manifest.json +11 -0
  88. package/.next/server/app/api/teams/workflows/route/server-reference-manifest.json +4 -0
  89. package/.next/server/app/api/teams/workflows/route.js +6 -0
  90. package/.next/server/app/api/teams/workflows/route.js.map +5 -0
  91. package/.next/server/app/api/teams/workflows/route.js.nft.json +1 -0
  92. package/.next/server/app/api/teams/workflows/route_client-reference-manifest.js +2 -0
  93. package/.next/server/app/api/tickets/move/route.js +1 -1
  94. package/.next/server/app/api/tickets/move/route.js.nft.json +1 -1
  95. package/.next/server/app/channels/page/build-manifest.json +4 -4
  96. package/.next/server/app/channels/page.js +7 -7
  97. package/.next/server/app/channels/page.js.nft.json +1 -1
  98. package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
  99. package/.next/server/app/channels.html +2 -2
  100. package/.next/server/app/channels.rsc +5 -5
  101. package/.next/server/app/channels.segments/_full.segment.rsc +5 -5
  102. package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
  103. package/.next/server/app/channels.segments/_index.segment.rsc +3 -3
  104. package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
  105. package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +2 -2
  106. package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
  107. package/.next/server/app/cron-jobs/page/build-manifest.json +4 -4
  108. package/.next/server/app/cron-jobs/page.js +7 -7
  109. package/.next/server/app/cron-jobs/page.js.nft.json +1 -1
  110. package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
  111. package/.next/server/app/cron-jobs.html +1 -1
  112. package/.next/server/app/cron-jobs.rsc +6 -6
  113. package/.next/server/app/cron-jobs.segments/_full.segment.rsc +6 -6
  114. package/.next/server/app/cron-jobs.segments/_head.segment.rsc +1 -1
  115. package/.next/server/app/cron-jobs.segments/_index.segment.rsc +3 -3
  116. package/.next/server/app/cron-jobs.segments/_tree.segment.rsc +2 -2
  117. package/.next/server/app/cron-jobs.segments/cron-jobs/__PAGE__.segment.rsc +3 -3
  118. package/.next/server/app/cron-jobs.segments/cron-jobs.segment.rsc +1 -1
  119. package/.next/server/app/goals/[id]/page/build-manifest.json +4 -4
  120. package/.next/server/app/goals/[id]/page.js +7 -7
  121. package/.next/server/app/goals/[id]/page.js.nft.json +1 -1
  122. package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  123. package/.next/server/app/goals/new/page/build-manifest.json +4 -4
  124. package/.next/server/app/goals/new/page.js +7 -7
  125. package/.next/server/app/goals/new/page.js.nft.json +1 -1
  126. package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
  127. package/.next/server/app/goals/new.html +2 -2
  128. package/.next/server/app/goals/new.rsc +5 -5
  129. package/.next/server/app/goals/new.segments/_full.segment.rsc +5 -5
  130. package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
  131. package/.next/server/app/goals/new.segments/_index.segment.rsc +3 -3
  132. package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
  133. package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +2 -2
  134. package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
  135. package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
  136. package/.next/server/app/goals/page/build-manifest.json +4 -4
  137. package/.next/server/app/goals/page.js +7 -7
  138. package/.next/server/app/goals/page.js.nft.json +1 -1
  139. package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  140. package/.next/server/app/goals.html +1 -1
  141. package/.next/server/app/goals.rsc +5 -5
  142. package/.next/server/app/goals.segments/_full.segment.rsc +5 -5
  143. package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
  144. package/.next/server/app/goals.segments/_index.segment.rsc +3 -3
  145. package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
  146. package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +2 -2
  147. package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
  148. package/.next/server/app/page/build-manifest.json +4 -4
  149. package/.next/server/app/page.js +7 -7
  150. package/.next/server/app/page.js.nft.json +1 -1
  151. package/.next/server/app/page_client-reference-manifest.js +1 -1
  152. package/.next/server/app/recipes/[id]/page/build-manifest.json +4 -4
  153. package/.next/server/app/recipes/[id]/page.js +8 -8
  154. package/.next/server/app/recipes/[id]/page.js.nft.json +1 -1
  155. package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/recipes/page/build-manifest.json +4 -4
  157. package/.next/server/app/recipes/page.js +8 -8
  158. package/.next/server/app/recipes/page.js.nft.json +1 -1
  159. package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
  160. package/.next/server/app/settings/page/build-manifest.json +4 -4
  161. package/.next/server/app/settings/page.js +7 -7
  162. package/.next/server/app/settings/page.js.nft.json +1 -1
  163. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  164. package/.next/server/app/settings.html +1 -1
  165. package/.next/server/app/settings.rsc +5 -5
  166. package/.next/server/app/settings.segments/_full.segment.rsc +5 -5
  167. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  168. package/.next/server/app/settings.segments/_index.segment.rsc +3 -3
  169. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  170. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
  171. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  172. package/.next/server/app/teams/[teamId]/page/build-manifest.json +4 -4
  173. package/.next/server/app/teams/[teamId]/page.js +8 -8
  174. package/.next/server/app/teams/[teamId]/page.js.nft.json +1 -1
  175. package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
  176. package/.next/server/app/tickets/[ticket]/page/build-manifest.json +4 -4
  177. package/.next/server/app/tickets/[ticket]/page.js +7 -7
  178. package/.next/server/app/tickets/[ticket]/page.js.nft.json +1 -1
  179. package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
  180. package/.next/server/app/tickets/page/build-manifest.json +4 -4
  181. package/.next/server/app/tickets/page.js +7 -7
  182. package/.next/server/app/tickets/page.js.nft.json +1 -1
  183. package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
  184. package/.next/server/app-paths-manifest.json +5 -0
  185. package/.next/server/chunks/[root-of-the-server]__065a27a4._.js +3 -0
  186. package/.next/server/chunks/[root-of-the-server]__065a27a4._.js.map +1 -0
  187. package/.next/server/chunks/{[root-of-the-server]__94d68aa3._.js → [root-of-the-server]__1989d64f._.js} +2 -2
  188. package/.next/server/chunks/{[root-of-the-server]__94d68aa3._.js.map → [root-of-the-server]__1989d64f._.js.map} +1 -1
  189. package/.next/server/chunks/{[root-of-the-server]__c4ffbb03._.js → [root-of-the-server]__21b72903._.js} +2 -2
  190. package/.next/server/chunks/{[root-of-the-server]__c4ffbb03._.js.map → [root-of-the-server]__21b72903._.js.map} +1 -1
  191. package/.next/server/chunks/{[root-of-the-server]__0c01c5c7._.js → [root-of-the-server]__262d8a6e._.js} +2 -2
  192. package/.next/server/chunks/{[root-of-the-server]__0c01c5c7._.js.map → [root-of-the-server]__262d8a6e._.js.map} +1 -1
  193. package/.next/server/chunks/{[root-of-the-server]__b11231a9._.js → [root-of-the-server]__2f2c799d._.js} +2 -2
  194. package/.next/server/chunks/{[root-of-the-server]__b11231a9._.js.map → [root-of-the-server]__2f2c799d._.js.map} +1 -1
  195. package/.next/server/chunks/[root-of-the-server]__6f85770b._.js +3 -0
  196. package/.next/server/chunks/[root-of-the-server]__6f85770b._.js.map +1 -0
  197. package/.next/server/chunks/[root-of-the-server]__7cf49621._.js +3 -0
  198. package/.next/server/chunks/[root-of-the-server]__7cf49621._.js.map +1 -0
  199. package/.next/server/chunks/[root-of-the-server]__a27f8405._.js +1 -1
  200. package/.next/server/chunks/[root-of-the-server]__a27f8405._.js.map +1 -1
  201. package/.next/server/chunks/[root-of-the-server]__a5226713._.js +3 -0
  202. package/.next/server/chunks/[root-of-the-server]__a5226713._.js.map +1 -0
  203. package/.next/server/chunks/[root-of-the-server]__c7f92fce._.js +3 -0
  204. package/.next/server/chunks/[root-of-the-server]__c7f92fce._.js.map +1 -0
  205. package/.next/server/chunks/{[root-of-the-server]__d737ca42._.js → [root-of-the-server]__e8bfeaba._.js} +2 -2
  206. package/.next/server/chunks/{[root-of-the-server]__d737ca42._.js.map → [root-of-the-server]__e8bfeaba._.js.map} +1 -1
  207. package/.next/server/chunks/{[root-of-the-server]__4eda99a9._.js → [root-of-the-server]__ebaa0038._.js} +2 -2
  208. package/.next/server/chunks/{[root-of-the-server]__4eda99a9._.js.map → [root-of-the-server]__ebaa0038._.js.map} +1 -1
  209. package/.next/server/chunks/{[root-of-the-server]__b59b3cdd._.js → [root-of-the-server]__f5546a39._.js} +2 -2
  210. package/.next/server/chunks/{[root-of-the-server]__b59b3cdd._.js.map → [root-of-the-server]__f5546a39._.js.map} +1 -1
  211. package/.next/server/chunks/{[root-of-the-server]__e6184ba3._.js → [root-of-the-server]__fdda9176._.js} +2 -2
  212. package/.next/server/chunks/{[root-of-the-server]__e6184ba3._.js.map → [root-of-the-server]__fdda9176._.js.map} +1 -1
  213. package/.next/server/chunks/_next-internal_server_app_api_swarms_start_route_actions_b79e9029.js +3 -0
  214. package/.next/server/chunks/_next-internal_server_app_api_swarms_start_route_actions_b79e9029.js.map +1 -0
  215. package/.next/server/chunks/_next-internal_server_app_api_swarms_status_route_actions_54826df0.js +3 -0
  216. package/.next/server/chunks/_next-internal_server_app_api_swarms_status_route_actions_54826df0.js.map +1 -0
  217. package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_route_actions_1949c463.js +3 -0
  218. package/.next/server/chunks/_next-internal_server_app_api_teams_orchestrator_route_actions_1949c463.js.map +1 -0
  219. package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-runs_route_actions_8327ac7d.js +3 -0
  220. package/.next/server/chunks/_next-internal_server_app_api_teams_workflow-runs_route_actions_8327ac7d.js.map +1 -0
  221. package/.next/server/chunks/_next-internal_server_app_api_teams_workflows_route_actions_43dd6e07.js +3 -0
  222. package/.next/server/chunks/_next-internal_server_app_api_teams_workflows_route_actions_43dd6e07.js.map +1 -0
  223. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js +14 -0
  224. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_1fe98a49.js.map +1 -0
  225. package/.next/server/chunks/ssr/[root-of-the-server]__0d4cb2ba._.js +3 -0
  226. package/.next/server/chunks/ssr/[root-of-the-server]__0fd02d84._.js +3 -0
  227. package/.next/server/chunks/ssr/{[root-of-the-server]__4393e897._.js.map → [root-of-the-server]__0fd02d84._.js.map} +1 -1
  228. package/.next/server/chunks/ssr/[root-of-the-server]__285ae6b7._.js +3 -0
  229. package/.next/server/chunks/ssr/{[root-of-the-server]__46e08d44._.js.map → [root-of-the-server]__285ae6b7._.js.map} +1 -1
  230. package/.next/server/chunks/ssr/[root-of-the-server]__2bef6884._.js +3 -0
  231. package/.next/server/chunks/ssr/{[root-of-the-server]__15600e29._.js.map → [root-of-the-server]__2bef6884._.js.map} +1 -1
  232. package/.next/server/chunks/ssr/[root-of-the-server]__3efd25c4._.js +3 -0
  233. package/.next/server/chunks/ssr/{[root-of-the-server]__2a6f1e3e._.js.map → [root-of-the-server]__3efd25c4._.js.map} +1 -1
  234. package/.next/server/chunks/ssr/[root-of-the-server]__491e06fa._.js +1 -1
  235. package/.next/server/chunks/ssr/[root-of-the-server]__491e06fa._.js.map +1 -1
  236. package/.next/server/chunks/ssr/[root-of-the-server]__550d78f8._.js +3 -0
  237. package/.next/server/chunks/ssr/{[root-of-the-server]__bc3b27b0._.js.map → [root-of-the-server]__550d78f8._.js.map} +1 -1
  238. package/.next/server/chunks/ssr/{[root-of-the-server]__e2e52c6e._.js → [root-of-the-server]__78cdd31e._.js} +2 -2
  239. package/.next/server/chunks/ssr/[root-of-the-server]__8ecc89e4._.js +3 -0
  240. package/.next/server/chunks/ssr/{[root-of-the-server]__507d2fc9._.js.map → [root-of-the-server]__8ecc89e4._.js.map} +1 -1
  241. package/.next/server/chunks/ssr/[root-of-the-server]__92524828._.js +3 -0
  242. package/.next/server/chunks/ssr/{[root-of-the-server]__247198dc._.js.map → [root-of-the-server]__92524828._.js.map} +1 -1
  243. package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js +3 -0
  244. package/.next/server/chunks/ssr/[root-of-the-server]__9e1ab064._.js.map +1 -0
  245. package/.next/server/chunks/ssr/[root-of-the-server]__a36a058d._.js +3 -0
  246. package/.next/server/chunks/ssr/{[root-of-the-server]__8d24c9c3._.js.map → [root-of-the-server]__a36a058d._.js.map} +1 -1
  247. package/.next/server/chunks/ssr/[root-of-the-server]__a8eca9e1._.js +3 -0
  248. package/.next/server/chunks/ssr/{[root-of-the-server]__82ce3aee._.js.map → [root-of-the-server]__a8eca9e1._.js.map} +1 -1
  249. package/.next/server/chunks/ssr/[root-of-the-server]__aa8e2649._.js +3 -0
  250. package/.next/server/chunks/ssr/{[root-of-the-server]__f75a61bf._.js.map → [root-of-the-server]__aa8e2649._.js.map} +1 -1
  251. package/.next/server/chunks/ssr/[root-of-the-server]__b2617fbf._.js +3 -0
  252. package/.next/server/chunks/ssr/{[root-of-the-server]__fd669584._.js.map → [root-of-the-server]__b2617fbf._.js.map} +1 -1
  253. package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js +3 -0
  254. package/.next/server/chunks/ssr/[root-of-the-server]__b5f65083._.js.map +1 -0
  255. package/.next/server/chunks/ssr/[root-of-the-server]__e5d416d5._.js +3 -0
  256. package/.next/server/chunks/ssr/{[root-of-the-server]__3ad3e5b1._.js.map → [root-of-the-server]__e5d416d5._.js.map} +1 -1
  257. package/.next/server/chunks/ssr/{[root-of-the-server]__b9356576._.js → [root-of-the-server]__f62d412e._.js} +2 -2
  258. package/.next/server/chunks/ssr/{[root-of-the-server]__b9356576._.js.map → [root-of-the-server]__f62d412e._.js.map} +1 -1
  259. package/.next/server/chunks/ssr/[root-of-the-server]__fbe5ff69._.js +3 -0
  260. package/.next/server/chunks/ssr/{[root-of-the-server]__3575e6da._.js.map → [root-of-the-server]__fbe5ff69._.js.map} +1 -1
  261. package/.next/server/chunks/ssr/{_8c45edba._.js → _0bdae23a._.js} +3 -3
  262. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_68c68167.js.map → _0bdae23a._.js.map} +1 -1
  263. package/.next/server/chunks/ssr/{_0808c2b9._.js → _347e2d56._.js} +3 -3
  264. package/.next/server/chunks/ssr/_347e2d56._.js.map +1 -0
  265. package/.next/server/chunks/ssr/{_68793c1f._.js → _49fb12c2._.js} +3 -3
  266. package/.next/server/chunks/ssr/_49fb12c2._.js.map +1 -0
  267. package/.next/server/chunks/ssr/{_3c8b2df6._.js → _536983a4._.js} +3 -3
  268. package/.next/server/chunks/ssr/_536983a4._.js.map +1 -0
  269. package/.next/server/chunks/ssr/{_cd23c5af._.js → _5b282394._.js} +3 -3
  270. package/.next/server/chunks/ssr/_5b282394._.js.map +1 -0
  271. package/.next/server/chunks/ssr/{_6e70b5a4._.js → _5cc24343._.js} +3 -3
  272. package/.next/server/chunks/ssr/_5cc24343._.js.map +1 -0
  273. package/.next/server/chunks/ssr/{_92140ca3._.js → _7eac37fb._.js} +3 -3
  274. package/.next/server/chunks/ssr/_7eac37fb._.js.map +1 -0
  275. package/.next/server/chunks/ssr/{_8c8207c1._.js → _8062e992._.js} +3 -3
  276. package/.next/server/chunks/ssr/_8062e992._.js.map +1 -0
  277. package/.next/server/chunks/ssr/{_25e6aab8._.js → _99994c05._.js} +3 -3
  278. package/.next/server/chunks/ssr/_99994c05._.js.map +1 -0
  279. package/.next/server/chunks/ssr/{_b5e9afcc._.js → _aafc99aa._.js} +3 -3
  280. package/.next/server/chunks/ssr/_aafc99aa._.js.map +1 -0
  281. package/.next/server/chunks/ssr/{_39e6e769._.js → _b7f3caf7._.js} +3 -3
  282. package/.next/server/chunks/ssr/_b7f3caf7._.js.map +1 -0
  283. package/.next/server/chunks/ssr/_c2041f88._.js +4 -0
  284. package/.next/server/chunks/ssr/_c2041f88._.js.map +1 -0
  285. package/.next/server/chunks/ssr/{_3158c108._.js → _f4d8af3b._.js} +3 -3
  286. package/.next/server/chunks/ssr/_f4d8af3b._.js.map +1 -0
  287. package/.next/server/chunks/ssr/{node_modules_next_dist_12287b3d._.js → node_modules_next_dist_8a37abed._.js} +2 -2
  288. package/.next/server/chunks/ssr/{node_modules_next_dist_12287b3d._.js.map → node_modules_next_dist_8a37abed._.js.map} +1 -1
  289. package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_9774470f._.js → node_modules_next_dist_client_components_2fffaa3a._.js} +2 -2
  290. 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
  291. package/.next/server/chunks/ssr/{node_modules_next_dist_esm_build_templates_app-page_68c68167.js → node_modules_next_dist_esm_build_templates_app-page_b5ef32b4.js} +3 -3
  292. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_b5ef32b4.js.map +1 -0
  293. package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.js +1 -1
  294. package/.next/server/chunks/ssr/src_app_HomeClient_tsx_f9f7568d._.js.map +1 -1
  295. package/.next/server/chunks/ssr/src_app_global-error_tsx_aa661ba4._.js +3 -0
  296. package/.next/server/chunks/ssr/src_app_global-error_tsx_aa661ba4._.js.map +1 -0
  297. package/.next/server/chunks/ssr/src_app_not-found_tsx_3f23d179._.js +3 -0
  298. package/.next/server/chunks/ssr/src_app_not-found_tsx_3f23d179._.js.map +1 -0
  299. package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_tsx_2900b91d._.js +2 -2
  300. package/.next/server/chunks/ssr/src_app_teams_[teamId]_team-editor_tsx_2900b91d._.js.map +1 -1
  301. package/.next/server/middleware-build-manifest.js +4 -4
  302. package/.next/server/pages/404.html +1 -1
  303. package/.next/server/pages/500.html +2 -2
  304. package/.next/server/server-reference-manifest.js +1 -1
  305. package/.next/server/server-reference-manifest.json +1 -1
  306. package/.next/static/chunks/{40f7fde35327d214.js → 423ca3a7f09c1470.js} +1 -1
  307. package/.next/static/chunks/{82abf2d65f5428ae.js → 68a088aa49e6124a.js} +3 -3
  308. package/.next/static/chunks/96b0d0ef92ef0eca.css +3 -0
  309. package/.next/static/chunks/a92e9d0c91b71b55.js +1 -0
  310. package/.next/static/chunks/bd3fcd39d918f9b4.js +10 -0
  311. package/.next/static/chunks/c84580993f22c17a.js +1 -0
  312. package/.next/static/chunks/f3e3461eda4a8d62.js +1 -0
  313. package/.next/static/chunks/{turbopack-ae1340e658f67df8.js → turbopack-6c658f991a22d28a.js} +1 -1
  314. package/package.json +2 -2
  315. package/public/android-chrome-192x192.png +0 -0
  316. package/public/android-chrome-512x512.png +0 -0
  317. package/public/apple-touch-icon.png +0 -0
  318. package/public/chef.jpg +0 -0
  319. package/public/favicon-16x16.png +0 -0
  320. package/public/favicon-32x32.png +0 -0
  321. package/public/favicon.ico +0 -0
  322. package/src/app/HomeClient.tsx +1 -1
  323. package/src/app/api/cron/jobs/route.ts +12 -4
  324. package/src/app/api/swarms/start/route.ts +118 -0
  325. package/src/app/api/swarms/status/route.ts +50 -0
  326. package/src/app/api/teams/orchestrator/route.ts +218 -0
  327. package/src/app/api/teams/workflow-runs/route.ts +431 -0
  328. package/src/app/api/teams/workflows/route.ts +88 -0
  329. package/src/app/cron-jobs/page.tsx +1 -1
  330. package/src/app/global-error.tsx +50 -0
  331. package/src/app/not-found.tsx +8 -0
  332. package/src/app/recipes/page.tsx +1 -1
  333. package/src/app/settings/page.tsx +1 -1
  334. package/src/app/teams/[teamId]/OrchestratorPanel.tsx +228 -0
  335. package/src/app/teams/[teamId]/page.tsx +25 -29
  336. package/src/app/teams/[teamId]/team-editor.tsx +1656 -8
  337. package/src/app/tickets/[ticket]/page.tsx +3 -0
  338. package/src/app/tickets/page.tsx +3 -0
  339. package/src/components/AppShell.tsx +245 -31
  340. package/src/lib/workflows/README.md +11 -0
  341. package/src/lib/workflows/runs-storage.ts +71 -0
  342. package/src/lib/workflows/runs-types.ts +32 -0
  343. package/src/lib/workflows/storage.ts +82 -0
  344. package/src/lib/workflows/types.ts +50 -0
  345. package/src/lib/workflows/validate.ts +70 -0
  346. package/.next/server/app/tickets.html +0 -1
  347. package/.next/server/app/tickets.meta +0 -15
  348. package/.next/server/app/tickets.rsc +0 -19
  349. package/.next/server/app/tickets.segments/_full.segment.rsc +0 -19
  350. package/.next/server/app/tickets.segments/_head.segment.rsc +0 -6
  351. package/.next/server/app/tickets.segments/_index.segment.rsc +0 -6
  352. package/.next/server/app/tickets.segments/_tree.segment.rsc +0 -4
  353. package/.next/server/app/tickets.segments/tickets/__PAGE__.segment.rsc +0 -8
  354. package/.next/server/app/tickets.segments/tickets.segment.rsc +0 -4
  355. package/.next/server/chunks/ssr/[root-of-the-server]__15600e29._.js +0 -3
  356. package/.next/server/chunks/ssr/[root-of-the-server]__247198dc._.js +0 -3
  357. package/.next/server/chunks/ssr/[root-of-the-server]__2a6f1e3e._.js +0 -3
  358. package/.next/server/chunks/ssr/[root-of-the-server]__346f79e5._.js +0 -3
  359. package/.next/server/chunks/ssr/[root-of-the-server]__346f79e5._.js.map +0 -1
  360. package/.next/server/chunks/ssr/[root-of-the-server]__3575e6da._.js +0 -3
  361. package/.next/server/chunks/ssr/[root-of-the-server]__3ad3e5b1._.js +0 -3
  362. package/.next/server/chunks/ssr/[root-of-the-server]__3bc7ad0a._.js +0 -3
  363. package/.next/server/chunks/ssr/[root-of-the-server]__4393e897._.js +0 -3
  364. package/.next/server/chunks/ssr/[root-of-the-server]__46e08d44._.js +0 -3
  365. package/.next/server/chunks/ssr/[root-of-the-server]__507d2fc9._.js +0 -3
  366. package/.next/server/chunks/ssr/[root-of-the-server]__82ce3aee._.js +0 -3
  367. package/.next/server/chunks/ssr/[root-of-the-server]__8d24c9c3._.js +0 -3
  368. package/.next/server/chunks/ssr/[root-of-the-server]__a457c799._.js +0 -3
  369. package/.next/server/chunks/ssr/[root-of-the-server]__a457c799._.js.map +0 -1
  370. package/.next/server/chunks/ssr/[root-of-the-server]__bc3b27b0._.js +0 -3
  371. package/.next/server/chunks/ssr/[root-of-the-server]__f75a61bf._.js +0 -3
  372. package/.next/server/chunks/ssr/[root-of-the-server]__fd669584._.js +0 -3
  373. package/.next/server/chunks/ssr/_0808c2b9._.js.map +0 -1
  374. package/.next/server/chunks/ssr/_25e6aab8._.js.map +0 -1
  375. package/.next/server/chunks/ssr/_3158c108._.js.map +0 -1
  376. package/.next/server/chunks/ssr/_39e6e769._.js.map +0 -1
  377. package/.next/server/chunks/ssr/_3c8b2df6._.js.map +0 -1
  378. package/.next/server/chunks/ssr/_68793c1f._.js.map +0 -1
  379. package/.next/server/chunks/ssr/_6e70b5a4._.js.map +0 -1
  380. package/.next/server/chunks/ssr/_8c45edba._.js.map +0 -1
  381. package/.next/server/chunks/ssr/_8c8207c1._.js.map +0 -1
  382. package/.next/server/chunks/ssr/_92140ca3._.js.map +0 -1
  383. package/.next/server/chunks/ssr/_b5e9afcc._.js.map +0 -1
  384. package/.next/server/chunks/ssr/_cd23c5af._.js.map +0 -1
  385. package/.next/server/chunks/ssr/_d27483a1._.js +0 -4
  386. package/.next/server/chunks/ssr/_d27483a1._.js.map +0 -1
  387. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_45780354.js +0 -3
  388. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_45780354.js.map +0 -1
  389. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js +0 -3
  390. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js.map +0 -1
  391. package/.next/static/chunks/8484c54dc9a377e8.js +0 -10
  392. package/.next/static/chunks/8662fcc3cdff66f3.js +0 -1
  393. package/.next/static/chunks/a4e69b85b74277a7.css +0 -3
  394. package/.next/static/chunks/a9ed074e89b16a5e.js +0 -1
  395. /package/.next/server/chunks/ssr/{[root-of-the-server]__3bc7ad0a._.js.map → [root-of-the-server]__0d4cb2ba._.js.map} +0 -0
  396. /package/.next/server/chunks/ssr/{[root-of-the-server]__e2e52c6e._.js.map → [root-of-the-server]__78cdd31e._.js.map} +0 -0
  397. /package/.next/static/{2hgbnJUmLMe9COlc5rJd3 → LkBl31uBDAuYl-0TzH69D}/_buildManifest.js +0 -0
  398. /package/.next/static/{2hgbnJUmLMe9COlc5rJd3 → LkBl31uBDAuYl-0TzH69D}/_clientMiddlewareManifest.json +0 -0
  399. /package/.next/static/{2hgbnJUmLMe9COlc5rJd3 → LkBl31uBDAuYl-0TzH69D}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/team-editor.tsx","../../../../src/app/teams/%5BteamId%5D/DeleteTeamModal.tsx","../../../../src/app/teams/%5BteamId%5D/PublishChangesModal.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { parse as parseYaml } from \"yaml\";\nimport { useRouter } from \"next/navigation\";\nimport { DeleteTeamModal } from \"./DeleteTeamModal\";\nimport { PublishChangesModal } from \"./PublishChangesModal\";\nimport { useToast } from \"@/components/ToastProvider\";\n\ntype RecipeListItem = {\n id: string;\n name: string;\n kind: \"agent\" | \"team\";\n source: \"builtin\" | \"workspace\";\n};\n\ntype RecipeDetail = RecipeListItem & {\n content: string;\n filePath: string | null;\n};\n\n\nfunction forceFrontmatterId(md: string, id: string) {\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n\n const lines = fm.split(\"\\n\");\n let found = false;\n const nextLines = lines.map((line) => {\n if (/^id\\s*:/i.test(line)) {\n found = true;\n return `id: ${id}`;\n }\n return line;\n });\n if (!found) nextLines.unshift(`id: ${id}`);\n\n return `---\\n${nextLines.join(\"\\n\")}\\n---\\n${body}`;\n}\n\nfunction forceFrontmatterTeamTeamId(md: string, teamId: string) {\n // Best-effort YAML frontmatter patch without reparsing the whole recipe.\n // Goal: ensure `team: { teamId: <id> }` matches the custom recipe id after Save.\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n const lines = fm.split(\"\\n\");\n\n const next: string[] = [];\n let inTeam = false;\n let sawTeamBlock = false;\n let patched = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (/^team\\s*:\\s*$/i.test(line)) {\n inTeam = true;\n sawTeamBlock = true;\n next.push(line);\n continue;\n }\n\n // Leave team block when indentation returns to column 0.\n if (inTeam && /^\\S/.test(line)) {\n inTeam = false;\n }\n\n if (inTeam && /^\\s+teamId\\s*:/i.test(line)) {\n next.push(` teamId: ${teamId}`);\n patched = true;\n continue;\n }\n\n next.push(line);\n }\n\n // If there was a team block but no teamId, insert it right after `team:`.\n if (sawTeamBlock && !patched) {\n const out: string[] = [];\n for (let i = 0; i < next.length; i++) {\n out.push(next[i]);\n if (/^team\\s*:\\s*$/i.test(next[i])) {\n out.push(` teamId: ${teamId}`);\n patched = true;\n }\n }\n return `---\\n${out.join(\"\\n\")}\\n---\\n${body}`;\n }\n\n return `---\\n${next.join(\"\\n\")}\\n---\\n${body}`;\n}\n\nexport default function TeamEditor({ teamId }: { teamId: string }) {\n const router = useRouter();\n const [recipes, setRecipes] = useState<RecipeListItem[]>([]);\n const [fromId, setFromId] = useState<string>(\"\");\n const [lockedFromId, setLockedFromId] = useState<string | null>(null);\n const [lockedFromName, setLockedFromName] = useState<string | null>(null);\n const [provenanceMissing, setProvenanceMissing] = useState(false);\n const [toId, setToId] = useState<string>(teamId);\n const [toName, setToName] = useState<string>(teamId);\n const [content, setContent] = useState<string>(\"\");\n const [loadedRecipeHash, setLoadedRecipeHash] = useState<string | null>(null);\n const [activeTab, setActiveTab] = useState<\"recipe\" | \"agents\" | \"skills\" | \"cron\" | \"files\">(\"recipe\");\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [publishing, setPublishing] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [loadingSource, setLoadingSource] = useState(false);\n const [recipeLoadError, setRecipeLoadError] = useState<string>(\"\");\n const toast = useToast();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [publishOpen, setPublishOpen] = useState(false);\n\n const [teamMetaRecipeHash, setTeamMetaRecipeHash] = useState<string | null>(null);\n\n function flashMessage(next: string, kind: \"success\" | \"error\" | \"info\" = \"info\") {\n const msg = String(next ?? \"\").trim();\n if (!msg) return;\n toast.push({ kind, message: msg });\n }\n\n const [teamFiles, setTeamFiles] = useState<Array<{ name: string; missing: boolean; required: boolean; rationale?: string }>>([]);\n const [teamFilesLoading, setTeamFilesLoading] = useState(false);\n const [teamFileError, setTeamFileError] = useState<string>(\"\");\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"SOUL.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const [cronJobs, setCronJobs] = useState<unknown[]>([]);\n const [cronLoading, setCronLoading] = useState(false);\n\n const [teamAgents, setTeamAgents] = useState<Array<{ id: string; identityName?: string }>>([]);\n const [teamAgentsLoading, setTeamAgentsLoading] = useState(false);\n\n const recipeAgents = useMemo(() => {\n const md = String(content ?? \"\");\n if (!md.startsWith(\"---\\n\")) return [] as Array<{ role: string; name?: string }>;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return [] as Array<{ role: string; name?: string }>;\n const fmText = md.slice(4, end + 1);\n try {\n const fm = (parseYaml(fmText) ?? {}) as { agents?: unknown };\n const agents = Array.isArray(fm.agents) ? fm.agents : [];\n return agents\n .map((a) => a as { role?: unknown; name?: unknown })\n .map((a) => ({ role: String(a.role ?? \"\").trim(), name: typeof a.name === \"string\" ? a.name : undefined }))\n .filter((a) => Boolean(a.role));\n } catch {\n return [] as Array<{ role: string; name?: string }>;\n }\n }, [content]);\n\n const [newRole, setNewRole] = useState<string>(\"\");\n const [customRole, setCustomRole] = useState<string>(\"\");\n const [newRoleName, setNewRoleName] = useState<string>(\"\");\n\n const derivedRole = useMemo(() => {\n const v = (newRole === \"__custom__\" ? customRole : newRole).trim();\n if (!v) return \"\";\n return v;\n }, [newRole, customRole]);\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 const [teamSkillMsg, setTeamSkillMsg] = useState<string>(\"\");\n const [teamSkillError, setTeamSkillError] = useState<string>(\"\");\n\n const teamRecipes = useMemo(() => recipes.filter((r) => r.kind === \"team\"), [recipes]);\n\n const toRecipe = useMemo(() => {\n // Prefer the workspace recipe when both builtin + workspace exist for the same id.\n const ws = recipes.find((r) => r.id === toId && r.source === \"workspace\");\n return ws ?? recipes.find((r) => r.id === toId) ?? null;\n }, [recipes, toId]);\n\n const teamIdValid = Boolean(teamId.trim());\n const targetIdValid = Boolean(toId.trim());\n const hasWorkspaceOverride = recipes.some((r) => r.id === toId && r.source === \"workspace\");\n const targetIsBuiltin = Boolean(toRecipe?.source === \"builtin\" && !hasWorkspaceOverride);\n // The \"Recipe id\" field is the workspace recipe id target.\n // It should be editable, and we must not auto-prefix/modify what the user types.\n const canEditTargetId = true;\n\n // Initialize defaults whenever we navigate to a new team.\n useEffect(() => {\n setToId(teamId);\n setToName(teamId);\n setContent(\"\");\n setLoadedRecipeHash(null);\n setTeamMetaRecipeHash(null);\n setPublishOpen(false);\n setDeleteOpen(false);\n }, [teamId]);\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n try {\n const [recipesRes, metaRes] = await Promise.all([\n fetch(\"/api/recipes\", { cache: \"no-store\" }),\n fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n\n const json = await recipesRes.json();\n const list = (json.recipes ?? []) as RecipeListItem[];\n setRecipes(list);\n\n // Note: do not sync toName/toId from remote state here.\n // Edits to the target id/name must not trigger reload loops while typing.\n\n // Prefer a recipe that corresponds to this teamId.\n // Primary source of truth: provenance stored in the team workspace.\n // Fallback: heuristic matching (legacy teams without provenance).\n let locked: { recipeId: string; recipeName?: string } | null = null;\n try {\n const metaJson = await metaRes.json();\n if (metaRes.ok && metaJson.ok && metaJson.meta && (metaJson.meta as { recipeId?: unknown }).recipeId) {\n const m = metaJson.meta as { recipeId?: unknown; recipeName?: unknown; recipeHash?: unknown };\n locked = {\n recipeId: String(m.recipeId),\n recipeName: typeof m.recipeName === \"string\" ? m.recipeName : undefined,\n };\n const h = typeof m.recipeHash === \"string\" ? m.recipeHash : null;\n setTeamMetaRecipeHash(h);\n } else {\n setTeamMetaRecipeHash(null);\n }\n } catch {\n // ignore\n }\n\n if (locked) {\n setLockedFromId(locked.recipeId);\n setLockedFromName(locked.recipeName ?? null);\n setProvenanceMissing(false);\n setFromId(locked.recipeId);\n } else {\n setLockedFromId(null);\n setLockedFromName(null);\n setProvenanceMissing(true);\n\n const preferred = list.find((r) => r.kind === \"team\" && r.id === teamId);\n const fallback = list.find((r) => r.kind === \"team\");\n const pick = preferred ?? fallback;\n if (pick) setFromId(pick.id);\n }\n\n // Render ASAP; load the heavier per-tab data in the background.\n setLoading(false);\n\n void (async () => {\n setTeamFilesLoading(true);\n setCronLoading(true);\n setTeamAgentsLoading(true);\n setSkillsLoading(true);\n\n try {\n const [filesRes, cronRes, agentsRes, skillsRes, availableSkillsRes] = await Promise.all([\n fetch(`/api/teams/files?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n fetch(`/api/cron/jobs?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n fetch(\"/api/agents\", { cache: \"no-store\" }),\n fetch(`/api/teams/skills?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n fetch(\"/api/skills/available\", { cache: \"no-store\" }),\n ]);\n\n try {\n const filesJson = (await filesRes.json()) as { ok?: boolean; files?: unknown[] };\n if (filesRes.ok && filesJson.ok) {\n const files = Array.isArray(filesJson.files) ? filesJson.files : [];\n setTeamFiles(\n files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown; required?: unknown; rationale?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean(entry.required),\n rationale: typeof entry.rationale === \"string\" ? entry.rationale : undefined,\n };\n }),\n );\n }\n } catch {\n // ignore\n }\n\n try {\n const cronJson = (await cronRes.json()) as { ok?: boolean; jobs?: unknown[] };\n if (cronRes.ok && cronJson.ok) {\n const all = Array.isArray(cronJson.jobs) ? cronJson.jobs : [];\n setCronJobs(all);\n }\n } catch {\n // ignore\n }\n\n try {\n const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };\n if (agentsRes.ok) {\n const all = Array.isArray(agentsJson.agents) ? agentsJson.agents : [];\n // Team membership for agents is by id convention: <teamId>-<role>\n const filtered = all.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n setTeamAgents(\n filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return { id: String(agent.id ?? \"\"), identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined };\n }),\n );\n }\n } catch {\n // ignore\n }\n\n try {\n const skillsJson = await skillsRes.json();\n if (skillsRes.ok && skillsJson.ok) {\n setSkillsList(Array.isArray(skillsJson.skills) ? (skillsJson.skills as string[]) : []);\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 setSelectedSkill((prev) => {\n const p = String(prev ?? \"\").trim();\n if (p && list.includes(p)) return p;\n return list[0] ?? \"\";\n });\n }\n } catch {\n // ignore\n }\n } finally {\n setTeamFilesLoading(false);\n setCronLoading(false);\n setTeamAgentsLoading(false);\n setSkillsLoading(false);\n }\n })();\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n // If the happy-path already flipped loading=false early, this is a no-op.\n setLoading(false);\n }\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [teamId]);\n\n async function onLoadTeamRecipeMarkdown() {\n const id = toId.trim();\n if (!id) return;\n setLoadingSource(true);\n setRecipeLoadError(\"\");\n try {\n const res = await fetch(`/api/recipes/${encodeURIComponent(id)}`, { cache: \"no-store\" });\n const json = await res.json();\n if (!res.ok) {\n // Usually means the workspace recipe doesn't exist yet.\n throw new Error(json.error || `Recipe not found: ${id}. Save first to create it.`);\n }\n const r = json.recipe as RecipeDetail;\n setContent(r.content);\n setLoadedRecipeHash(typeof json.recipeHash === \"string\" ? json.recipeHash : null);\n } catch (e: unknown) {\n setRecipeLoadError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoadingSource(false);\n }\n }\n\n // Load raw recipe markdown by default (no \"click to load\").\n useEffect(() => {\n const id = toId.trim();\n if (!id) return;\n if (content.trim()) return;\n if (loadingSource) return;\n void onLoadTeamRecipeMarkdown();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toId]);\n\n async function ensureCustomRecipeExists(args: { overwrite: boolean; toId?: string; toName?: string; scaffold?: boolean }) {\n const f = fromId.trim();\n const id = String(args.toId ?? toId).trim();\n const name = String(args.toName ?? toName).trim();\n const overwrite = Boolean(args.overwrite);\n const scaffold = Boolean(args.scaffold);\n\n if (!f) throw new Error(\"Source recipe id is required\");\n if (!id) throw new Error(\"Custom recipe id is required\");\n\n const res = await fetch(\"/api/recipes/clone\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ fromId: f, toId: id, toName: name || undefined, overwrite, scaffold }),\n });\n const json = await res.json();\n if (!res.ok) throw new Error(json.error || \"Save failed\");\n return json as { filePath: string; content: string; scaffold?: { ok: boolean; error?: string } | null };\n }\n\n async function onSaveCustom(overwrite: boolean, overrides?: { toId?: string; toName?: string; scaffold?: boolean }) {\n setSaving(true);\n flashMessage(\"\");\n try {\n const json = await ensureCustomRecipeExists({ overwrite, ...overrides });\n\n if (json.scaffold && !json.scaffold.ok) {\n flashMessage(`Scaffold failed (recipe was still cloned): ${json.scaffold.error || \"Unknown error\"}`, \"error\");\n }\n\n // If the user has edited the markdown, \"Save (overwrite)\" should persist both\n // the updated name (frontmatter) and the edited markdown.\n const hasEdits = Boolean(content.trim()) && content.trim() !== json.content.trim();\n\n if (hasEdits) {\n const nextContent = forceFrontmatterTeamTeamId(forceFrontmatterId(content, toId.trim()), toId.trim());\n const res = await fetch(`/api/recipes/${encodeURIComponent(toId.trim())}`, {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ content: nextContent }),\n });\n const putJson = await res.json();\n if (!res.ok) throw new Error(putJson.error || \"Save failed\");\n setContent(nextContent);\n } else {\n setContent(json.content);\n }\n\n // Refresh hash from server so Publish can reliably detect unpropagated changes.\n try {\n const res = await fetch(`/api/recipes/${encodeURIComponent(toId.trim())}`, { cache: \"no-store\" });\n const next = await res.json();\n if (res.ok && typeof next.recipeHash === \"string\") setLoadedRecipeHash(next.recipeHash);\n } catch {\n setLoadedRecipeHash(null);\n }\n\n flashMessage(`Saved team recipe: ${json.filePath}`, \"success\");\n } catch (e: unknown) {\n const raw = e instanceof Error ? e.message : String(e);\n flashMessage(raw, \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadTeamFile(name: string) {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const res = await fetch(\n `/api/teams/file?teamId=${encodeURIComponent(teamId)}&name=${encodeURIComponent(name)}`,\n { cache: \"no-store\" }\n );\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load file\");\n setFileName(name);\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setTeamFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveTeamFile() {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const res = await fetch(\"/api/teams/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, name: fileName, content: fileContent }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save file\");\n // No toast; keep file-related messaging local.\n } catch (e: unknown) {\n setTeamFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n // Initial load only gates the minimal state (recipes + team meta). Everything else streams in.\n if (loading) return <div className=\"ck-glass mx-auto max-w-4xl p-6\">Loading…</div>;\n\n return (\n <div className=\"ck-glass mx-auto max-w-6xl p-6 sm:p-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team editor</h1>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Bootstrap a <strong>custom team recipe</strong> for this installed team, without modifying builtin recipes.\n </p>\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {(\n [\n { id: \"recipe\", label: \"Recipe\" },\n { id: \"agents\", label: \"Agents\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"cron\", label: \"Cron\" },\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 {activeTab === \"recipe\" ? (\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)]\">Custom recipe target</div>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team id</label>\n <input\n value={toId}\n onChange={(e) => setToId(e.target.value)}\n disabled={!canEditTargetId}\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)] disabled:opacity-70\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This is the <b>custom recipe id</b> that will be created/overwritten when you save.\n </div>\n\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team name</label>\n <input\n value={toName}\n onChange={(e) => setToName(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-4 grid grid-cols-1 gap-2\">\n {/* Load team markdown removed (auto-loads by default). */}\n\n <button\n type=\"button\"\n disabled={saving || !teamIdValid || !targetIdValid || targetIsBuiltin}\n onClick={() => onSaveCustom(true)}\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\n <button\n type=\"button\"\n disabled={\n saving ||\n !teamIdValid ||\n !targetIdValid ||\n targetIsBuiltin ||\n // Enabled only when there are unpropagated (saved) changes.\n !loadedRecipeHash ||\n !teamMetaRecipeHash ||\n loadedRecipeHash === teamMetaRecipeHash\n }\n onClick={() => setPublishOpen(true)}\n className=\"rounded-[var(--ck-radius-sm)] bg-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-emerald-500 active:bg-emerald-700 disabled:opacity-50\"\n >\n {publishing ? \"Publishing…\" : \"Publish changes\"}\n </button>\n\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => setDeleteOpen(true)}\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 Delete Team\n </button>\n </div>\n </div>\n\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Notes</div>\n\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Parent recipe (locked)</div>\n <select\n disabled\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)] disabled:opacity-70\"\n value={fromId}\n onChange={(e) => setFromId(e.target.value)}\n >\n {teamRecipes.map((r) => (\n <option key={`${r.source}:${r.id}`} value={r.id}>\n {r.id} ({r.source})\n </option>\n ))}\n </select>\n {lockedFromId ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n <code>{lockedFromId}</code>\n {lockedFromName ? ` (${lockedFromName})` : \"\"}\n </div>\n ) : provenanceMissing ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Provenance not found for this team. The parent recipe above is a best-guess.\n </div>\n ) : null}\n\n\n </div>\n\n <ul className=\"mt-4 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>\n <strong>Save</strong> writes/overwrites the custom recipe file identified by “Team id”.\n </li>\n <li>\n <strong>Publish changes</strong> re-scaffolds this team from your current custom recipe and applies config (complete overwrite).\n </li>\n <li>\n <strong>Delete Team</strong> runs the safe uninstall command (<code>openclaw recipes remove-team</code>).\n </li>\n </ul>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"agents\" ? (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agents in this team</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Add/remove agents by updating the <code>agents:</code> list in your custom team recipe (<code>{toId}</code>).\n </p>\n\n <div className=\"mt-4 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)]\">Role</label>\n <select\n value={newRole}\n onChange={(e) => {\n const v = e.target.value;\n setNewRole(v);\n if (v === \"__custom__\") {\n setCustomRole(\"\");\n setNewRoleName(\"\");\n return;\n }\n setCustomRole(\"\");\n const match = recipeAgents.find((a) => a.role === v);\n setNewRoleName(match?.name || \"\");\n }}\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 <option value=\"\">Select…</option>\n {recipeAgents.map((a) => (\n <option key={a.role} value={a.role}>\n {a.name || a.role}\n </option>\n ))}\n <option value=\"__custom__\">Other…</option>\n </select>\n\n {newRole === \"__custom__\" ? (\n <input\n value={customRole}\n onChange={(e) => setCustomRole(e.target.value)}\n placeholder=\"role (e.g. researcher)\"\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 />\n ) : null}\n\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This writes to the recipe’s <code>agents:</code> list.\n </div>\n </div>\n\n <div className=\"sm:col-span-2\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name (optional)</label>\n <input\n value={newRoleName}\n onChange={(e) => setNewRoleName(e.target.value)}\n placeholder=\"Onchain Researcher\"\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>\n\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <button\n disabled={saving || !derivedRole}\n onClick={async () => {\n setSaving(true);\n try {\n try {\n await ensureCustomRecipeExists({ overwrite: false });\n } catch (e: unknown) {\n // If the custom recipe already exists, proceed; we only needed to ensure a workspace file exists.\n // Note: /api/recipes/clone returns 409 in this case.\n const msg = e instanceof Error ? e.message : String(e);\n if (!/Recipe id already exists:/i.test(msg)) throw e;\n }\n const res = await fetch(\"/api/recipes/team-agents\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(\n newRole === \"__custom__\"\n ? {\n recipeId: toId.trim(),\n op: \"add\",\n role: derivedRole,\n name: newRoleName,\n }\n : {\n recipeId: toId.trim(),\n op: \"addLike\",\n baseRole: derivedRole,\n teamId,\n name: newRoleName,\n },\n ),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed updating agents list\");\n setContent(String(json.content ?? content));\n\n // Immediately install/create the new agent by applying config and scaffolding missing files.\n // Do not overwrite existing recipe-managed files.\n try {\n const sync = await fetch(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n applyConfig: true,\n overwrite: false,\n allowExisting: true,\n cronInstallChoice: \"no\",\n }),\n });\n const syncJson = await sync.json();\n if (!sync.ok) throw new Error(syncJson.error || \"Failed to apply config / scaffold team\");\n } catch (e: unknown) {\n // Non-fatal: recipe change is still saved.\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n }\n\n // Poll for new agent to appear; only restart gateway if needed.\n const expectedAgentId = typeof (json as { addedAgentId?: unknown }).addedAgentId === \"string\" ? (json as { addedAgentId?: string }).addedAgentId : \"\";\n\n async function refreshAgentsOnce() {\n const agentsRes = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };\n if (!agentsRes.ok) return { ok: false as const, hasExpected: false as const, agents: [] as Array<{ id: string; identityName?: string }> };\n const all = Array.isArray(agentsJson.agents) ? agentsJson.agents : [];\n const filtered = all.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n const mapped = filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return {\n id: String(agent.id ?? \"\"),\n identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined,\n };\n });\n const hasExpected = expectedAgentId ? mapped.some((a) => a.id === expectedAgentId) : false;\n return { ok: true as const, hasExpected, agents: mapped };\n }\n\n async function pollAgents(maxMs: number) {\n const start = Date.now();\n while (Date.now() - start < maxMs) {\n try {\n const r = await refreshAgentsOnce();\n if (r.ok) {\n setTeamAgents(r.agents);\n if (!expectedAgentId || r.hasExpected) return true;\n }\n } catch {\n // ignore\n }\n await new Promise((res) => setTimeout(res, 500));\n }\n return false;\n }\n\n const appeared = await pollAgents(5000);\n if (!appeared && expectedAgentId) {\n // Background-ish restart: do it only if needed.\n try {\n void fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // ignore\n }\n await pollAgents(10000);\n }\n\n flashMessage(`Updated agents list in ${toId}`, \"success\");\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n setSaving(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 Add agent\n </button>\n {/* remove-agent UI intentionally omitted */}\n </div>\n\n <div className=\"mt-6\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Detected installed team agents (read-only)</div>\n <ul className=\"mt-2 space-y-2\">\n {teamAgents.length ? (\n teamAgents.map((a) => (\n <li key={a.id} className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-[color:var(--ck-text-primary)]\">\n {a.identityName || a.id}\n </div>\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">{a.id}</div>\n </div>\n <a\n className=\"text-sm font-medium text-[color:var(--ck-accent-red)] hover:text-[color:var(--ck-accent-red-hover)]\"\n href={`/agents/${encodeURIComponent(a.id)}?returnTo=${encodeURIComponent(`/teams/${teamId}?tab=agents`)}`}\n >\n Edit\n </a>\n </li>\n ))\n ) : teamAgentsLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No team agents detected.</li>\n )}\n </ul>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"skills\" ? (\n <div className=\"mt-6 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>team</strong> workspace (<code>skills/</code>). These are available to all agents in the team.\n For agent-specific skills, open the agent from the Agents tab.\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 {skillsList.length ? skillsList.map((s) => <li key={s}>{s}</li>) : <li>None installed.</li>}\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 || skillsLoading || !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 || skillsLoading || !selectedSkill}\n onClick={async () => {\n setInstallingSkill(true);\n setTeamSkillMsg(\"\");\n setTeamSkillError(\"\");\n try {\n const res = await fetch(\"/api/teams/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, 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 setTeamSkillMsg(`Installed skill: ${selectedSkill}`);\n\n // Refresh installed list.\n const r = await fetch(`/api/teams/skills?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok) setSkillsList(Array.isArray(j.skills) ? (j.skills as string[]) : []);\n } catch (e: unknown) {\n setTeamSkillError(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 {teamSkillError ? (\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 {teamSkillError}\n </div>\n ) : null}\n\n {teamSkillMsg ? (\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 {teamSkillMsg}\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; --team-id {teamId} --yes</code>.\n </div>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"cron\" ? (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Cron jobs (filtered by team name)</div>\n <ul className=\"mt-3 space-y-3\">\n {cronJobs.length ? (\n cronJobs.map((j) => {\n const job = j as {\n id?: unknown;\n jobId?: unknown;\n name?: unknown;\n enabled?: unknown;\n state?: { enabled?: unknown };\n };\n const id = String(job.id ?? job.jobId ?? \"\").trim();\n const key = id || String(job.name ?? \"job\");\n const label = String(job.name ?? job.id ?? job.jobId ?? \"(unnamed)\");\n const enabled = job.enabled ?? job.state?.enabled;\n\n async function act(action: \"enable\" | \"disable\" | \"run\") {\n setSaving(true);\n try {\n const res = await fetch(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Cron action failed\");\n flashMessage(`Cron ${action}: ${label}`, \"success\");\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <li key={key} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{label}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Enabled: {String(enabled ?? \"?\")}</div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <button\n disabled={saving || !id}\n onClick={() => act(\"run\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Run\n </button>\n <button\n disabled={saving || !id}\n onClick={() => act(\"enable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Enable\n </button>\n <button\n disabled={saving || !id}\n onClick={() => act(\"disable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Disable\n </button>\n {!id ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">(missing id)</div>\n ) : null}\n </div>\n </li>\n );\n })\n ) : cronLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No cron jobs detected for this team.</li>\n )}\n </ul>\n </div>\n ) : null}\n\n {activeTab === \"files\" ? (\n <div className=\"mt-6 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)]\">Team files</div>\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={showOptionalFiles}\n onChange={(e) => setShowOptionalFiles(e.target.checked)}\n />\n Show optional\n </label>\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Default view hides optional missing files to reduce noise.\n </div>\n <ul className=\"mt-3 space-y-1\">\n {teamFilesLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : null}\n {teamFiles\n .filter((f) => (showOptionalFiles ? true : f.required || !f.missing))\n .map((f) => (\n <li key={f.name}>\n <button\n onClick={() => onLoadTeamFile(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 </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 <button\n disabled={saving}\n onClick={onSaveTeamFile}\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\n {teamFileError ? (\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 {teamFileError}\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\n {/* markdown editor lives below for convenience */}\n {activeTab === \"recipe\" ? (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Recipe markdown</div>\n\n {recipeLoadError ? (\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 {recipeLoadError}\n </div>\n ) : null}\n\n <textarea\n value={content}\n onChange={(e) => {\n setContent(e.target.value);\n setLoadedRecipeHash(null);\n }}\n className=\"mt-2 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n ) : null}\n\n {/* Clone Team removed (per #0075). */}\n\n <PublishChangesModal\n open={publishOpen}\n teamId={teamId}\n recipeId={toId}\n busy={publishing}\n onClose={() => setPublishOpen(false)}\n onConfirm={async () => {\n setPublishing(true);\n try {\n const res = await fetch(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n overwrite: true,\n applyConfig: true,\n }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Publish failed\");\n\n // Refresh team meta so we can reflect published hash/state.\n try {\n const metaRes = await fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, {\n cache: \"no-store\",\n });\n const metaJson = await metaRes.json();\n if (metaRes.ok && metaJson.ok && metaJson.meta && typeof metaJson.meta.recipeHash === \"string\") {\n setTeamMetaRecipeHash(metaJson.meta.recipeHash);\n }\n } catch {\n // ignore\n }\n\n setPublishOpen(false);\n flashMessage(\"Published changes to active team\", \"success\");\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n setPublishing(false);\n }\n }}\n />\n\n <DeleteTeamModal\n open={deleteOpen}\n teamId={teamId}\n busy={deleting}\n onClose={() => setDeleteOpen(false)}\n onConfirm={async () => {\n setDeleting(true);\n try {\n const res = await fetch(\"/api/teams/remove-team\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Delete failed\");\n flashMessage(\"Deleted team successfully\", \"success\");\n setDeleteOpen(false);\n setTimeout(() => router.push(\"/\"), 250);\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n setDeleting(false);\n }\n }}\n />\n\n {/* duplicate markdown editor removed */}\n </div>\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function DeleteTeamModal({\n open,\n teamId,\n onClose,\n onConfirm,\n busy,\n}: {\n open: boolean;\n teamId: string;\n busy?: boolean;\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 Team</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Delete team <code className=\"font-mono\">{teamId}</code>? This will remove the team workspace, agents, and stamped cron jobs.\n </p>\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","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function PublishChangesModal({\n open,\n teamId,\n recipeId,\n onClose,\n onConfirm,\n busy,\n}: {\n open: boolean;\n teamId: string;\n recipeId: string;\n busy?: boolean;\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)]\">Publish changes</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n This will re-scaffold team <code className=\"font-mono\">{teamId}</code> from recipe <code className=\"font-mono\">{recipeId}</code>.\n </p>\n\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-amber-400/30 bg-amber-500/10 p-3 text-sm text-amber-100\">\n <div className=\"font-medium\">Complete overwrite</div>\n <div className=\"mt-1\">\n All existing team workspace files managed by the recipe will be overwritten (for example: <code className=\"font-mono\">AGENTS.md</code>,{\" \"}\n <code className=\"font-mono\">SOUL.md</code>, role templates, and other scaffolded files). Any manual edits in those files will be lost.\n </div>\n </div>\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-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-emerald-500 disabled:opacity-50\"\n >\n {busy ? \"Publishing…\" : \"Publish changes\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/app/teams/%5BteamId%5D/team-editor.tsx","../../../../src/app/teams/%5BteamId%5D/DeleteTeamModal.tsx","../../../../src/app/teams/%5BteamId%5D/PublishChangesModal.tsx","../../../../src/app/teams/%5BteamId%5D/OrchestratorPanel.tsx","../../../../src/lib/workflows/validate.ts"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { parse as parseYaml } from \"yaml\";\nimport { useRouter } from \"next/navigation\";\nimport { DeleteTeamModal } from \"./DeleteTeamModal\";\nimport { PublishChangesModal } from \"./PublishChangesModal\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { OrchestratorPanel } from \"./OrchestratorPanel\";\nimport type { WorkflowFileV1 } from \"@/lib/workflows/types\";\nimport { validateWorkflowFileV1 } from \"@/lib/workflows/validate\";\n\ntype RecipeListItem = {\n id: string;\n name: string;\n kind: \"agent\" | \"team\";\n source: \"builtin\" | \"workspace\";\n};\n\ntype RecipeDetail = RecipeListItem & {\n content: string;\n filePath: string | null;\n};\n\n\nfunction forceFrontmatterId(md: string, id: string) {\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n\n const lines = fm.split(\"\\n\");\n let found = false;\n const nextLines = lines.map((line) => {\n if (/^id\\s*:/i.test(line)) {\n found = true;\n return `id: ${id}`;\n }\n return line;\n });\n if (!found) nextLines.unshift(`id: ${id}`);\n\n return `---\\n${nextLines.join(\"\\n\")}\\n---\\n${body}`;\n}\n\nfunction forceFrontmatterTeamTeamId(md: string, teamId: string) {\n // Best-effort YAML frontmatter patch without reparsing the whole recipe.\n // Goal: ensure `team: { teamId: <id> }` matches the custom recipe id after Save.\n if (!md.startsWith(\"---\\n\")) return md;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return md;\n\n const fm = md.slice(4, end);\n const body = md.slice(end + 5);\n const lines = fm.split(\"\\n\");\n\n const next: string[] = [];\n let inTeam = false;\n let sawTeamBlock = false;\n let patched = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (/^team\\s*:\\s*$/i.test(line)) {\n inTeam = true;\n sawTeamBlock = true;\n next.push(line);\n continue;\n }\n\n // Leave team block when indentation returns to column 0.\n if (inTeam && /^\\S/.test(line)) {\n inTeam = false;\n }\n\n if (inTeam && /^\\s+teamId\\s*:/i.test(line)) {\n next.push(` teamId: ${teamId}`);\n patched = true;\n continue;\n }\n\n next.push(line);\n }\n\n // If there was a team block but no teamId, insert it right after `team:`.\n if (sawTeamBlock && !patched) {\n const out: string[] = [];\n for (let i = 0; i < next.length; i++) {\n out.push(next[i]);\n if (/^team\\s*:\\s*$/i.test(next[i])) {\n out.push(` teamId: ${teamId}`);\n patched = true;\n }\n }\n return `---\\n${out.join(\"\\n\")}\\n---\\n${body}`;\n }\n\n return `---\\n${next.join(\"\\n\")}\\n---\\n${body}`;\n}\n\nexport default function TeamEditor({ teamId, initialTab }: { teamId: string; initialTab?: string }) {\n const router = useRouter();\n const [recipes, setRecipes] = useState<RecipeListItem[]>([]);\n const [fromId, setFromId] = useState<string>(\"\");\n const [lockedFromId, setLockedFromId] = useState<string | null>(null);\n const [lockedFromName, setLockedFromName] = useState<string | null>(null);\n const [provenanceMissing, setProvenanceMissing] = useState(false);\n const [toId, setToId] = useState<string>(teamId);\n const [toName, setToName] = useState<string>(teamId);\n const [content, setContent] = useState<string>(\"\");\n const [loadedRecipeHash, setLoadedRecipeHash] = useState<string | null>(null);\n const [activeTab, setActiveTab] = useState<\"recipe\" | \"agents\" | \"skills\" | \"cron\" | \"workflows\" | \"files\" | \"orchestrator\">(\"recipe\");\n\n useEffect(() => {\n const allowed = [\"recipe\", \"agents\", \"skills\", \"cron\", \"workflows\", \"files\", \"orchestrator\"] as const;\n if (initialTab && (allowed as readonly string[]).includes(initialTab)) {\n setActiveTab(initialTab as (typeof allowed)[number]);\n }\n }, [initialTab]);\n\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [publishing, setPublishing] = useState(false);\n const [deleting, setDeleting] = useState(false);\n const [loadingSource, setLoadingSource] = useState(false);\n const [recipeLoadError, setRecipeLoadError] = useState<string>(\"\");\n const toast = useToast();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [publishOpen, setPublishOpen] = useState(false);\n\n const [teamMetaRecipeHash, setTeamMetaRecipeHash] = useState<string | null>(null);\n\n function flashMessage(next: string, kind: \"success\" | \"error\" | \"info\" = \"info\") {\n const msg = String(next ?? \"\").trim();\n if (!msg) return;\n toast.push({ kind, message: msg });\n }\n\n const [teamFiles, setTeamFiles] = useState<Array<{ name: string; missing: boolean; required: boolean; rationale?: string }>>([]);\n const [teamFilesLoading, setTeamFilesLoading] = useState(false);\n const [teamFileError, setTeamFileError] = useState<string>(\"\");\n const [showOptionalFiles, setShowOptionalFiles] = useState(false);\n const [fileName, setFileName] = useState<string>(\"SOUL.md\");\n const [fileContent, setFileContent] = useState<string>(\"\");\n\n const [cronJobs, setCronJobs] = useState<unknown[]>([]);\n const [cronLoading, setCronLoading] = useState(false);\n\n const [workflowFiles, setWorkflowFiles] = useState<string[]>([]);\n const [workflowFilesLoading, setWorkflowFilesLoading] = useState(false);\n const [workflowFilesError, setWorkflowFilesError] = useState<string>(\"\");\n const [selectedWorkflowFile, setSelectedWorkflowFile] = useState<string>(\"\");\n const [workflowJsonText, setWorkflowJsonText] = useState<string>(\"\");\n const [workflowSaving, setWorkflowSaving] = useState(false);\n const [workflowView, setWorkflowView] = useState<\"canvas\" | \"json\">(\"canvas\");\n const [workflowSelectedNodeId, setWorkflowSelectedNodeId] = useState<string>(\"\");\n const [workflowDragging, setWorkflowDragging] = useState<null | { nodeId: string; dx: number; dy: number; containerLeft: number; containerTop: number }>(null);\n\n // Canvas editor helpers (minimal MVP): add/remove nodes + edges via inspector forms.\n const [workflowNewNodeId, setWorkflowNewNodeId] = useState<string>(\"\");\n const [workflowNewNodeName, setWorkflowNewNodeName] = useState<string>(\"\");\n const [workflowNewNodeType, setWorkflowNewNodeType] = useState<WorkflowFileV1[\"nodes\"][number][\"type\"]>(\"llm\");\n const [workflowNewEdgeFrom, setWorkflowNewEdgeFrom] = useState<string>(\"\");\n const [workflowNewEdgeTo, setWorkflowNewEdgeTo] = useState<string>(\"\");\n const [workflowNewEdgeLabel, setWorkflowNewEdgeLabel] = useState<string>(\"\");\n\n const [workflowEditorOpen, setWorkflowEditorOpen] = useState(false);\n\n const [workflowCreateOpen, setWorkflowCreateOpen] = useState(false);\n const [workflowCreateId, setWorkflowCreateId] = useState(\"new-workflow\");\n const [workflowCreateName, setWorkflowCreateName] = useState(\"New workflow\");\n\n const [workflowRuns, setWorkflowRuns] = useState<string[]>([]);\n const [workflowRunsLoading, setWorkflowRunsLoading] = useState(false);\n const [workflowRunsError, setWorkflowRunsError] = useState<string>(\"\");\n const [selectedWorkflowRunId, setSelectedWorkflowRunId] = useState<string>(\"\");\n const [selectedWorkflowRun, setSelectedWorkflowRun] = useState<unknown | null>(null);\n\n const [teamAgents, setTeamAgents] = useState<Array<{ id: string; identityName?: string }>>([]);\n const [teamAgentsLoading, setTeamAgentsLoading] = useState(false);\n\n const workflowCanvasRef = useRef<HTMLDivElement | null>(null);\n const workflowImportInputRef = useRef<HTMLInputElement | null>(null);\n\n const workflowParsed = useMemo(() => {\n const raw = String(workflowJsonText || \"\").trim();\n if (!raw) return null;\n try {\n return JSON.parse(raw) as WorkflowFileV1;\n } catch {\n return null;\n }\n }, [workflowJsonText]);\n\n const workflowParseError = useMemo(() => {\n const raw = String(workflowJsonText || \"\").trim();\n if (!raw) return \"\";\n try {\n JSON.parse(raw);\n return \"\";\n } catch (e: unknown) {\n return e instanceof Error ? e.message : \"Invalid JSON\";\n }\n }, [workflowJsonText]);\n\n const workflowValidation = useMemo(() => {\n if (!workflowParsed) return { errors: [], warnings: [] };\n try {\n return validateWorkflowFileV1(workflowParsed);\n } catch (e: unknown) {\n return { errors: [e instanceof Error ? e.message : String(e)], warnings: [] };\n }\n }, [workflowParsed]);\n\n useEffect(() => {\n const wfId = String(workflowParsed?.id ?? \"\").trim();\n if (!wfId) {\n setWorkflowRuns([]);\n setSelectedWorkflowRunId(\"\");\n setSelectedWorkflowRun(null);\n setWorkflowRunsError(\"\");\n return;\n }\n\n let canceled = false;\n (async () => {\n setWorkflowRunsLoading(true);\n setWorkflowRunsError(\"\");\n try {\n const res = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to list runs\");\n const files = Array.isArray(json.files) ? json.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n if (canceled) return;\n setWorkflowRuns(list);\n if (selectedWorkflowRunId && !list.some((f: string) => f === `${selectedWorkflowRunId}.run.json`)) {\n setSelectedWorkflowRunId(\"\");\n setSelectedWorkflowRun(null);\n }\n } catch (e: unknown) {\n if (canceled) return;\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n } finally {\n if (!canceled) setWorkflowRunsLoading(false);\n }\n })();\n\n return () => {\n canceled = true;\n };\n }, [teamId, workflowParsed?.id, selectedWorkflowRunId]);\n\n useEffect(() => {\n if (!workflowDragging) return;\n\n function onMove(e: PointerEvent) {\n if (!workflowDragging) return;\n const wf = workflowParsed;\n if (!wf) return;\n\n const node = wf.nodes.find((n) => n.id === workflowDragging.nodeId);\n if (!node) return;\n\n const x = Math.max(0, Math.round(e.clientX - workflowDragging.containerLeft - workflowDragging.dx));\n const y = Math.max(0, Math.round(e.clientY - workflowDragging.containerTop - workflowDragging.dy));\n\n const next: WorkflowFileV1 = {\n ...wf,\n nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, x, y } : n)),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }\n\n function onUp() {\n setWorkflowDragging(null);\n }\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n }, [workflowDragging, workflowParsed]);\n\n const recipeAgents = useMemo(() => {\n const md = String(content ?? \"\");\n if (!md.startsWith(\"---\\n\")) return [] as Array<{ role: string; name?: string }>;\n const end = md.indexOf(\"\\n---\\n\", 4);\n if (end === -1) return [] as Array<{ role: string; name?: string }>;\n const fmText = md.slice(4, end + 1);\n try {\n const fm = (parseYaml(fmText) ?? {}) as { agents?: unknown };\n const agents = Array.isArray(fm.agents) ? fm.agents : [];\n return agents\n .map((a) => a as { role?: unknown; name?: unknown })\n .map((a) => ({ role: String(a.role ?? \"\").trim(), name: typeof a.name === \"string\" ? a.name : undefined }))\n .filter((a) => Boolean(a.role));\n } catch {\n return [] as Array<{ role: string; name?: string }>;\n }\n }, [content]);\n\n const [newRole, setNewRole] = useState<string>(\"\");\n const [customRole, setCustomRole] = useState<string>(\"\");\n const [newRoleName, setNewRoleName] = useState<string>(\"\");\n\n const derivedRole = useMemo(() => {\n const v = (newRole === \"__custom__\" ? customRole : newRole).trim();\n if (!v) return \"\";\n return v;\n }, [newRole, customRole]);\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 const [teamSkillMsg, setTeamSkillMsg] = useState<string>(\"\");\n const [teamSkillError, setTeamSkillError] = useState<string>(\"\");\n\n const teamRecipes = useMemo(() => recipes.filter((r) => r.kind === \"team\"), [recipes]);\n\n const toRecipe = useMemo(() => {\n // Prefer the workspace recipe when both builtin + workspace exist for the same id.\n const ws = recipes.find((r) => r.id === toId && r.source === \"workspace\");\n return ws ?? recipes.find((r) => r.id === toId) ?? null;\n }, [recipes, toId]);\n\n const teamIdValid = Boolean(teamId.trim());\n const targetIdValid = Boolean(toId.trim());\n const hasWorkspaceOverride = recipes.some((r) => r.id === toId && r.source === \"workspace\");\n const targetIsBuiltin = Boolean(toRecipe?.source === \"builtin\" && !hasWorkspaceOverride);\n // The \"Recipe id\" field is the workspace recipe id target.\n // It should be editable, and we must not auto-prefix/modify what the user types.\n const canEditTargetId = true;\n\n // Initialize defaults whenever we navigate to a new team.\n useEffect(() => {\n setToId(teamId);\n setToName(teamId);\n setContent(\"\");\n setLoadedRecipeHash(null);\n setTeamMetaRecipeHash(null);\n setPublishOpen(false);\n setDeleteOpen(false);\n }, [teamId]);\n\n useEffect(() => {\n (async () => {\n setLoading(true);\n try {\n const [recipesRes, metaRes] = await Promise.all([\n fetch(\"/api/recipes\", { cache: \"no-store\" }),\n fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n\n const json = await recipesRes.json();\n const list = (json.recipes ?? []) as RecipeListItem[];\n setRecipes(list);\n\n // Note: do not sync toName/toId from remote state here.\n // Edits to the target id/name must not trigger reload loops while typing.\n\n // Prefer a recipe that corresponds to this teamId.\n // Primary source of truth: provenance stored in the team workspace.\n // Fallback: heuristic matching (legacy teams without provenance).\n let locked: { recipeId: string; recipeName?: string } | null = null;\n try {\n const metaJson = await metaRes.json();\n if (metaRes.ok && metaJson.ok && metaJson.meta && (metaJson.meta as { recipeId?: unknown }).recipeId) {\n const m = metaJson.meta as { recipeId?: unknown; recipeName?: unknown; recipeHash?: unknown };\n locked = {\n recipeId: String(m.recipeId),\n recipeName: typeof m.recipeName === \"string\" ? m.recipeName : undefined,\n };\n const h = typeof m.recipeHash === \"string\" ? m.recipeHash : null;\n setTeamMetaRecipeHash(h);\n } else {\n setTeamMetaRecipeHash(null);\n }\n } catch {\n // ignore\n }\n\n if (locked) {\n setLockedFromId(locked.recipeId);\n setLockedFromName(locked.recipeName ?? null);\n setProvenanceMissing(false);\n setFromId(locked.recipeId);\n } else {\n setLockedFromId(null);\n setLockedFromName(null);\n setProvenanceMissing(true);\n\n const preferred = list.find((r) => r.kind === \"team\" && r.id === teamId);\n const fallback = list.find((r) => r.kind === \"team\");\n const pick = preferred ?? fallback;\n if (pick) setFromId(pick.id);\n }\n\n // Render ASAP; load the heavier per-tab data in the background.\n setLoading(false);\n\n void (async () => {\n setTeamFilesLoading(true);\n setCronLoading(true);\n setWorkflowFilesLoading(true);\n setTeamAgentsLoading(true);\n setSkillsLoading(true);\n\n try {\n const [filesRes, cronRes, agentsRes, skillsRes, availableSkillsRes, workflowsRes] = await Promise.all([\n fetch(`/api/teams/files?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n fetch(`/api/cron/jobs?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n fetch(\"/api/agents\", { cache: \"no-store\" }),\n fetch(`/api/teams/skills?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n fetch(\"/api/skills/available\", { cache: \"no-store\" }),\n fetch(`/api/teams/workflows?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" }),\n ]);\n\n try {\n const filesJson = (await filesRes.json()) as { ok?: boolean; files?: unknown[] };\n if (filesRes.ok && filesJson.ok) {\n const files = Array.isArray(filesJson.files) ? filesJson.files : [];\n setTeamFiles(\n files.map((f) => {\n const entry = f as { name?: unknown; missing?: unknown; required?: unknown; rationale?: unknown };\n return {\n name: String(entry.name ?? \"\"),\n missing: Boolean(entry.missing),\n required: Boolean(entry.required),\n rationale: typeof entry.rationale === \"string\" ? entry.rationale : undefined,\n };\n }),\n );\n }\n } catch {\n // ignore\n }\n\n try {\n const cronJson = (await cronRes.json()) as { ok?: boolean; jobs?: unknown[] };\n if (cronRes.ok && cronJson.ok) {\n const all = Array.isArray(cronJson.jobs) ? cronJson.jobs : [];\n setCronJobs(all);\n }\n } catch {\n // ignore\n }\n\n try {\n const workflowsJson = (await workflowsRes.json()) as { ok?: boolean; files?: unknown[]; dir?: unknown };\n if (workflowsRes.ok && workflowsJson.ok) {\n const files = Array.isArray(workflowsJson.files) ? workflowsJson.files : [];\n const list = files.map((f) => String(f ?? '').trim()).filter((f) => Boolean(f));\n setWorkflowFiles(list);\n setSelectedWorkflowFile((prev) => {\n const p = String(prev ?? '').trim();\n if (p && list.includes(p)) return p;\n return list[0] ?? '';\n });\n }\n } catch {\n // ignore\n }\n\n try {\n const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };\n if (agentsRes.ok) {\n const all = Array.isArray(agentsJson.agents) ? agentsJson.agents : [];\n // Team membership for agents is by id convention: <teamId>-<role>\n const filtered = all.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n setTeamAgents(\n filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return { id: String(agent.id ?? \"\"), identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined };\n }),\n );\n }\n } catch {\n // ignore\n }\n\n try {\n const skillsJson = await skillsRes.json();\n if (skillsRes.ok && skillsJson.ok) {\n setSkillsList(Array.isArray(skillsJson.skills) ? (skillsJson.skills as string[]) : []);\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 setSelectedSkill((prev) => {\n const p = String(prev ?? \"\").trim();\n if (p && list.includes(p)) return p;\n return list[0] ?? \"\";\n });\n }\n } catch {\n // ignore\n }\n } finally {\n setTeamFilesLoading(false);\n setCronLoading(false);\n setWorkflowFilesLoading(false);\n setTeamAgentsLoading(false);\n setSkillsLoading(false);\n }\n })();\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n // If the happy-path already flipped loading=false early, this is a no-op.\n setLoading(false);\n }\n })();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [teamId]);\n\n async function onLoadTeamRecipeMarkdown() {\n const id = toId.trim();\n if (!id) return;\n setLoadingSource(true);\n setRecipeLoadError(\"\");\n try {\n const res = await fetch(`/api/recipes/${encodeURIComponent(id)}`, { cache: \"no-store\" });\n const json = await res.json();\n if (!res.ok) {\n // Usually means the workspace recipe doesn't exist yet.\n throw new Error(json.error || `Recipe not found: ${id}. Save first to create it.`);\n }\n const r = json.recipe as RecipeDetail;\n setContent(r.content);\n setLoadedRecipeHash(typeof json.recipeHash === \"string\" ? json.recipeHash : null);\n } catch (e: unknown) {\n setRecipeLoadError(e instanceof Error ? e.message : String(e));\n } finally {\n setLoadingSource(false);\n }\n }\n\n // Load raw recipe markdown by default (no \"click to load\").\n useEffect(() => {\n const id = toId.trim();\n if (!id) return;\n if (content.trim()) return;\n if (loadingSource) return;\n void onLoadTeamRecipeMarkdown();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [toId]);\n\n async function ensureCustomRecipeExists(args: { overwrite: boolean; toId?: string; toName?: string; scaffold?: boolean }) {\n const f = fromId.trim();\n const id = String(args.toId ?? toId).trim();\n const name = String(args.toName ?? toName).trim();\n const overwrite = Boolean(args.overwrite);\n const scaffold = Boolean(args.scaffold);\n\n if (!f) throw new Error(\"Source recipe id is required\");\n if (!id) throw new Error(\"Custom recipe id is required\");\n\n const res = await fetch(\"/api/recipes/clone\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ fromId: f, toId: id, toName: name || undefined, overwrite, scaffold }),\n });\n const json = await res.json();\n if (!res.ok) throw new Error(json.error || \"Save failed\");\n return json as { filePath: string; content: string; scaffold?: { ok: boolean; error?: string } | null };\n }\n\n async function onSaveCustom(overwrite: boolean, overrides?: { toId?: string; toName?: string; scaffold?: boolean }) {\n setSaving(true);\n flashMessage(\"\");\n try {\n const json = await ensureCustomRecipeExists({ overwrite, ...overrides });\n\n if (json.scaffold && !json.scaffold.ok) {\n flashMessage(`Scaffold failed (recipe was still cloned): ${json.scaffold.error || \"Unknown error\"}`, \"error\");\n }\n\n // If the user has edited the markdown, \"Save (overwrite)\" should persist both\n // the updated name (frontmatter) and the edited markdown.\n const hasEdits = Boolean(content.trim()) && content.trim() !== json.content.trim();\n\n if (hasEdits) {\n const nextContent = forceFrontmatterTeamTeamId(forceFrontmatterId(content, toId.trim()), toId.trim());\n const res = await fetch(`/api/recipes/${encodeURIComponent(toId.trim())}`, {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ content: nextContent }),\n });\n const putJson = await res.json();\n if (!res.ok) throw new Error(putJson.error || \"Save failed\");\n setContent(nextContent);\n } else {\n setContent(json.content);\n }\n\n // Refresh hash from server so Publish can reliably detect unpropagated changes.\n try {\n const res = await fetch(`/api/recipes/${encodeURIComponent(toId.trim())}`, { cache: \"no-store\" });\n const next = await res.json();\n if (res.ok && typeof next.recipeHash === \"string\") setLoadedRecipeHash(next.recipeHash);\n } catch {\n setLoadedRecipeHash(null);\n }\n\n flashMessage(`Saved team recipe: ${json.filePath}`, \"success\");\n } catch (e: unknown) {\n const raw = e instanceof Error ? e.message : String(e);\n flashMessage(raw, \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n async function onLoadTeamFile(name: string) {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const res = await fetch(\n `/api/teams/file?teamId=${encodeURIComponent(teamId)}&name=${encodeURIComponent(name)}`,\n { cache: \"no-store\" }\n );\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load file\");\n setFileName(name);\n setFileContent(String(json.content ?? \"\"));\n } catch (e: unknown) {\n setTeamFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n async function onSaveTeamFile() {\n setSaving(true);\n setTeamFileError(\"\");\n try {\n const res = await fetch(\"/api/teams/file\", {\n method: \"PUT\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, name: fileName, content: fileContent }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save file\");\n // No toast; keep file-related messaging local.\n } catch (e: unknown) {\n setTeamFileError(e instanceof Error ? e.message : String(e));\n } finally {\n setSaving(false);\n }\n }\n\n // Initial load only gates the minimal state (recipes + team meta). Everything else streams in.\n if (loading) return <div className=\"ck-glass w-full p-6\">Loading…</div>;\n\n return (\n <div className=\"ck-glass w-full p-6 sm:p-8\">\n <h1 className=\"text-2xl font-semibold tracking-tight\">Team editor</h1>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Bootstrap a <strong>custom team recipe</strong> for this installed team, without modifying builtin recipes.\n </p>\n\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n {(\n [\n { id: \"recipe\", label: \"Recipe\" },\n { id: \"agents\", label: \"Agents\" },\n { id: \"skills\", label: \"Skills\" },\n { id: \"cron\", label: \"Cron\" },\n { id: \"workflows\", label: \"Workflows\" },\n { id: \"files\", label: \"Files\" },\n { id: \"orchestrator\", label: \"Orchestrator\" },\n ] as const\n ).map((t) => (\n <button\n key={t.id}\n onClick={() => {\n setActiveTab(t.id);\n try {\n router.replace(`/teams/${encodeURIComponent(teamId)}?tab=${encodeURIComponent(t.id)}`, { scroll: false });\n } catch {\n // ignore\n }\n }}\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 {activeTab === \"recipe\" ? (\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)]\">Custom recipe target</div>\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team id</label>\n <input\n value={toId}\n onChange={(e) => setToId(e.target.value)}\n disabled={!canEditTargetId}\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)] disabled:opacity-70\"\n />\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This is the <b>custom recipe id</b> that will be created/overwritten when you save.\n </div>\n\n <label className=\"mt-3 block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Team name</label>\n <input\n value={toName}\n onChange={(e) => setToName(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-4 grid grid-cols-1 gap-2\">\n {/* Load team markdown removed (auto-loads by default). */}\n\n <button\n type=\"button\"\n disabled={saving || !teamIdValid || !targetIdValid || targetIsBuiltin}\n onClick={() => onSaveCustom(true)}\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\n <button\n type=\"button\"\n disabled={\n saving ||\n !teamIdValid ||\n !targetIdValid ||\n targetIsBuiltin ||\n // Enabled only when there are unpropagated (saved) changes.\n !loadedRecipeHash ||\n !teamMetaRecipeHash ||\n loadedRecipeHash === teamMetaRecipeHash\n }\n onClick={() => setPublishOpen(true)}\n className=\"rounded-[var(--ck-radius-sm)] bg-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] transition-colors hover:bg-emerald-500 active:bg-emerald-700 disabled:opacity-50\"\n >\n {publishing ? \"Publishing…\" : \"Publish changes\"}\n </button>\n\n <button\n type=\"button\"\n disabled={saving}\n onClick={() => setDeleteOpen(true)}\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 Delete Team\n </button>\n </div>\n </div>\n\n <div className=\"ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Notes</div>\n\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Parent recipe (locked)</div>\n <select\n disabled\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)] disabled:opacity-70\"\n value={fromId}\n onChange={(e) => setFromId(e.target.value)}\n >\n {teamRecipes.map((r) => (\n <option key={`${r.source}:${r.id}`} value={r.id}>\n {r.id} ({r.source})\n </option>\n ))}\n </select>\n {lockedFromId ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n <code>{lockedFromId}</code>\n {lockedFromName ? ` (${lockedFromName})` : \"\"}\n </div>\n ) : provenanceMissing ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Provenance not found for this team. The parent recipe above is a best-guess.\n </div>\n ) : null}\n\n\n </div>\n\n <ul className=\"mt-4 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>\n <strong>Save</strong> writes/overwrites the custom recipe file identified by “Team id”.\n </li>\n <li>\n <strong>Publish changes</strong> re-scaffolds this team from your current custom recipe and applies config (complete overwrite).\n </li>\n <li>\n <strong>Delete Team</strong> runs the safe uninstall command (<code>openclaw recipes remove-team</code>).\n </li>\n </ul>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"agents\" ? (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agents in this team</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Add/remove agents by updating the <code>agents:</code> list in your custom team recipe (<code>{toId}</code>).\n </p>\n\n <div className=\"mt-4 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)]\">Role</label>\n <select\n value={newRole}\n onChange={(e) => {\n const v = e.target.value;\n setNewRole(v);\n if (v === \"__custom__\") {\n setCustomRole(\"\");\n setNewRoleName(\"\");\n return;\n }\n setCustomRole(\"\");\n const match = recipeAgents.find((a) => a.role === v);\n setNewRoleName(match?.name || \"\");\n }}\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 <option value=\"\">Select…</option>\n {recipeAgents.map((a) => (\n <option key={a.role} value={a.role}>\n {a.name || a.role}\n </option>\n ))}\n <option value=\"__custom__\">Other…</option>\n </select>\n\n {newRole === \"__custom__\" ? (\n <input\n value={customRole}\n onChange={(e) => setCustomRole(e.target.value)}\n placeholder=\"role (e.g. researcher)\"\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 />\n ) : null}\n\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n This writes to the recipe’s <code>agents:</code> list.\n </div>\n </div>\n\n <div className=\"sm:col-span-2\">\n <div>\n <label className=\"block text-xs font-medium text-[color:var(--ck-text-secondary)]\">Name (optional)</label>\n <input\n value={newRoleName}\n onChange={(e) => setNewRoleName(e.target.value)}\n placeholder=\"Onchain Researcher\"\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>\n\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <button\n disabled={saving || !derivedRole}\n onClick={async () => {\n setSaving(true);\n try {\n try {\n await ensureCustomRecipeExists({ overwrite: false });\n } catch (e: unknown) {\n // If the custom recipe already exists, proceed; we only needed to ensure a workspace file exists.\n // Note: /api/recipes/clone returns 409 in this case.\n const msg = e instanceof Error ? e.message : String(e);\n if (!/Recipe id already exists:/i.test(msg)) throw e;\n }\n const res = await fetch(\"/api/recipes/team-agents\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(\n newRole === \"__custom__\"\n ? {\n recipeId: toId.trim(),\n op: \"add\",\n role: derivedRole,\n name: newRoleName,\n }\n : {\n recipeId: toId.trim(),\n op: \"addLike\",\n baseRole: derivedRole,\n teamId,\n name: newRoleName,\n },\n ),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed updating agents list\");\n setContent(String(json.content ?? content));\n\n // Immediately install/create the new agent by applying config and scaffolding missing files.\n // Do not overwrite existing recipe-managed files.\n try {\n const sync = await fetch(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n applyConfig: true,\n overwrite: false,\n allowExisting: true,\n cronInstallChoice: \"no\",\n }),\n });\n const syncJson = await sync.json();\n if (!sync.ok) throw new Error(syncJson.error || \"Failed to apply config / scaffold team\");\n } catch (e: unknown) {\n // Non-fatal: recipe change is still saved.\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n }\n\n // Poll for new agent to appear; only restart gateway if needed.\n const expectedAgentId = typeof (json as { addedAgentId?: unknown }).addedAgentId === \"string\" ? (json as { addedAgentId?: string }).addedAgentId : \"\";\n\n async function refreshAgentsOnce() {\n const agentsRes = await fetch(\"/api/agents\", { cache: \"no-store\" });\n const agentsJson = (await agentsRes.json()) as { agents?: unknown[] };\n if (!agentsRes.ok) return { ok: false as const, hasExpected: false as const, agents: [] as Array<{ id: string; identityName?: string }> };\n const all = Array.isArray(agentsJson.agents) ? agentsJson.agents : [];\n const filtered = all.filter((a) => String((a as { id?: unknown }).id ?? \"\").startsWith(`${teamId}-`));\n const mapped = filtered.map((a) => {\n const agent = a as { id?: unknown; identityName?: unknown };\n return {\n id: String(agent.id ?? \"\"),\n identityName: typeof agent.identityName === \"string\" ? agent.identityName : undefined,\n };\n });\n const hasExpected = expectedAgentId ? mapped.some((a) => a.id === expectedAgentId) : false;\n return { ok: true as const, hasExpected, agents: mapped };\n }\n\n async function pollAgents(maxMs: number) {\n const start = Date.now();\n while (Date.now() - start < maxMs) {\n try {\n const r = await refreshAgentsOnce();\n if (r.ok) {\n setTeamAgents(r.agents);\n if (!expectedAgentId || r.hasExpected) return true;\n }\n } catch {\n // ignore\n }\n await new Promise((res) => setTimeout(res, 500));\n }\n return false;\n }\n\n const appeared = await pollAgents(5000);\n if (!appeared && expectedAgentId) {\n // Background-ish restart: do it only if needed.\n try {\n void fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // ignore\n }\n await pollAgents(10000);\n }\n\n flashMessage(`Updated agents list in ${toId}`, \"success\");\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n setSaving(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 Add agent\n </button>\n {/* remove-agent UI intentionally omitted */}\n </div>\n\n <div className=\"mt-6\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Detected installed team agents (read-only)</div>\n <ul className=\"mt-2 space-y-2\">\n {teamAgents.length ? (\n teamAgents.map((a) => (\n <li key={a.id} className=\"flex items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium text-[color:var(--ck-text-primary)]\">\n {a.identityName || a.id}\n </div>\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">{a.id}</div>\n </div>\n <a\n className=\"text-sm font-medium text-[color:var(--ck-accent-red)] hover:text-[color:var(--ck-accent-red-hover)]\"\n href={`/agents/${encodeURIComponent(a.id)}?returnTo=${encodeURIComponent(`/teams/${teamId}?tab=agents`)}`}\n >\n Edit\n </a>\n </li>\n ))\n ) : teamAgentsLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No team agents detected.</li>\n )}\n </ul>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"skills\" ? (\n <div className=\"mt-6 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>team</strong> workspace (<code>skills/</code>). These are available to all agents in the team.\n For agent-specific skills, open the agent from the Agents tab.\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 {skillsList.length ? skillsList.map((s) => <li key={s}>{s}</li>) : <li>None installed.</li>}\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 || skillsLoading || !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 || skillsLoading || !selectedSkill}\n onClick={async () => {\n setInstallingSkill(true);\n setTeamSkillMsg(\"\");\n setTeamSkillError(\"\");\n try {\n const res = await fetch(\"/api/teams/skills/install\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, 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 setTeamSkillMsg(`Installed skill: ${selectedSkill}`);\n\n // Refresh installed list.\n const r = await fetch(`/api/teams/skills?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const j = await r.json();\n if (r.ok && j.ok) setSkillsList(Array.isArray(j.skills) ? (j.skills as string[]) : []);\n } catch (e: unknown) {\n setTeamSkillError(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 {teamSkillError ? (\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 {teamSkillError}\n </div>\n ) : null}\n\n {teamSkillMsg ? (\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 {teamSkillMsg}\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; --team-id {teamId} --yes</code>.\n </div>\n </div>\n </div>\n ) : null}\n\n {activeTab === \"cron\" ? (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Cron jobs (filtered by team name)</div>\n <ul className=\"mt-3 space-y-3\">\n {cronJobs.length ? (\n cronJobs.map((j) => {\n const job = j as {\n id?: unknown;\n jobId?: unknown;\n name?: unknown;\n enabled?: unknown;\n state?: { enabled?: unknown };\n };\n const id = String(job.id ?? job.jobId ?? \"\").trim();\n const key = id || String(job.name ?? \"job\");\n const label = String(job.name ?? job.id ?? job.jobId ?? \"(unnamed)\");\n const enabled = job.enabled ?? job.state?.enabled;\n\n async function act(action: \"enable\" | \"disable\" | \"run\") {\n setSaving(true);\n try {\n const res = await fetch(\"/api/cron/job\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id, action }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Cron action failed\");\n flashMessage(`Cron ${action}: ${label}`, \"success\");\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n setSaving(false);\n }\n }\n\n return (\n <li key={key} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{label}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Enabled: {String(enabled ?? \"?\")}</div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <button\n disabled={saving || !id}\n onClick={() => act(\"run\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Run\n </button>\n <button\n disabled={saving || !id}\n onClick={() => act(\"enable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Enable\n </button>\n <button\n disabled={saving || !id}\n onClick={() => act(\"disable\")}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2.5 py-1.5 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n Disable\n </button>\n {!id ? (\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">(missing id)</div>\n ) : null}\n </div>\n </li>\n );\n })\n ) : cronLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No cron jobs detected for this team.</li>\n )}\n </ul>\n </div>\n ) : null}\n\n {activeTab === \"workflows\" ? (\n <div className=\"mt-6 grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <div className={workflowEditorOpen ? \"ck-glass-strong p-4\" : \"ck-glass-strong p-4 lg:col-span-3\"}>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Workflows (file-first)</div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Stored in <code>shared-context/workflows/&lt;id&gt;.workflow.json</code> inside the team workspace.\n </div>\n\n {workflowFilesError ? (\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 {workflowFilesError}\n </div>\n ) : null}\n\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <button\n disabled={workflowSaving}\n onClick={() => {\n setWorkflowCreateId(\"new-workflow\");\n setWorkflowCreateName(\"New workflow\");\n setWorkflowCreateOpen(true);\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 Add workflow\n </button>\n\n {workflowFiles.length === 0 ? (\n <button\n disabled={workflowSaving}\n onClick={async () => {\n setWorkflowSaving(true);\n setWorkflowFilesError(\"\");\n try {\n // Create the MVP built-in template (Marketing Cadence v1) for THIS TEAM.\n const workflow: WorkflowFileV1 = {\n schema: \"clawkitchen.workflow.v1\",\n id: \"marketing-cadence\",\n name: \"Marketing Cadence (v1)\",\n version: 1,\n timezone: \"America/New_York\",\n triggers: [\n { kind: \"cron\", id: \"content-cadence\", name: \"Content cadence\", enabled: true, expr: \"0 9 * * 1,3,5\", tz: \"America/New_York\" },\n { kind: \"cron\", id: \"seasonal-scan\", name: \"Seasonal scan\", enabled: true, expr: \"0 8 * * *\", tz: \"America/New_York\" },\n { kind: \"cron\", id: \"weekly-recap\", name: \"Weekly recap\", enabled: false, expr: \"30 9 * * 1\", tz: \"America/New_York\" },\n ],\n nodes: [\n { id: \"start\", type: \"start\", name: \"Start\", x: 80, y: 80 },\n { id: \"research\", type: \"llm\", name: \"Research\", x: 320, y: 80 },\n { id: \"draft_assets\", type: \"llm\", name: \"Draft assets\", x: 560, y: 80 },\n { id: \"qc_brand\", type: \"llm\", name: \"QC brand\", x: 800, y: 80 },\n { id: \"approval\", type: \"human_approval\", name: \"Approval\", x: 1040, y: 80 },\n { id: \"post_x\", type: \"tool\", name: \"Post: X\", x: 1040, y: 240 },\n { id: \"post_instagram\", type: \"tool\", name: \"Post: Instagram\", x: 1040, y: 360 },\n { id: \"post_tiktok\", type: \"tool\", name: \"Post: TikTok\", x: 1040, y: 480 },\n { id: \"post_youtube\", type: \"tool\", name: \"Post: YouTube\", x: 1040, y: 600 },\n { id: \"writeback\", type: \"tool\", name: \"Writeback\", x: 800, y: 600 },\n { id: \"end\", type: \"end\", name: \"End\", x: 560, y: 600 },\n ],\n edges: [\n { id: \"e1\", from: \"start\", to: \"research\" },\n { id: \"e2\", from: \"research\", to: \"draft_assets\" },\n { id: \"e3\", from: \"draft_assets\", to: \"qc_brand\" },\n { id: \"e4\", from: \"qc_brand\", to: \"approval\" },\n { id: \"e5\", from: \"approval\", to: \"post_x\", label: \"approve\" },\n { id: \"e6\", from: \"post_x\", to: \"post_instagram\" },\n { id: \"e7\", from: \"post_instagram\", to: \"post_tiktok\" },\n { id: \"e8\", from: \"post_tiktok\", to: \"post_youtube\" },\n { id: \"e9\", from: \"post_youtube\", to: \"writeback\" },\n { id: \"e10\", from: \"writeback\", to: \"end\" },\n ],\n meta: {\n templateId: \"marketing-cadence-v1\",\n approvalGateRequired: true,\n },\n };\n\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to write workflow\");\n\n // Refresh list\n const listRes = await fetch(`/api/teams/workflows?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const listJson = await listRes.json();\n if (listRes.ok && listJson.ok) {\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowFiles(list);\n setSelectedWorkflowFile(\"marketing-cadence.workflow.json\");\n setWorkflowJsonText(JSON.stringify(workflow, null, 2) + \"\\n\");\n setWorkflowEditorOpen(true);\n }\n\n flashMessage(\"Created workflow template: marketing-cadence\", \"success\");\n } catch (e: unknown) {\n setWorkflowFilesError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowSaving(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 {workflowSaving ? \"Working…\" : \"Create Marketing Cadence template\"}\n </button>\n ) : null}\n\n <button\n disabled={workflowSaving}\n onClick={async () => {\n setWorkflowSaving(true);\n setWorkflowFilesError(\"\");\n try {\n const res = await fetch(`/api/teams/workflows?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to list workflows\");\n const files = Array.isArray(json.files) ? json.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowFiles(list);\n flashMessage(\"Refreshed workflow list\", \"success\");\n } catch (e: unknown) {\n setWorkflowFilesError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowSaving(false);\n }\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)] hover:bg-white/10 disabled:opacity-50\"\n >\n Refresh\n </button>\n </div>\n\n {workflowCreateOpen ? (\n <div className=\"fixed inset-0 z-[60] flex items-center justify-center bg-black/70 p-4\">\n <div className=\"ck-glass-strong w-full max-w-lg rounded-[var(--ck-radius-lg)] border border-white/10 p-4 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Create workflow</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">Creates a new file under shared-context/workflows/ for this team.</div>\n\n <div className=\"mt-4 grid grid-cols-1 gap-3\">\n <label className=\"grid gap-1\">\n <span className=\"text-xs text-[color:var(--ck-text-secondary)]\">Workflow id</span>\n <input\n value={workflowCreateId}\n onChange={(e) => setWorkflowCreateId(e.target.value)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. marketing-cadence\"\n />\n <span className=\"text-xs text-[color:var(--ck-text-tertiary)]\">lowercase letters, numbers, dashes</span>\n </label>\n\n <label className=\"grid gap-1\">\n <span className=\"text-xs text-[color:var(--ck-text-secondary)]\">Name</span>\n <input\n value={workflowCreateName}\n onChange={(e) => setWorkflowCreateName(e.target.value)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n placeholder=\"New workflow\"\n />\n </label>\n </div>\n\n <div className=\"mt-4 flex flex-wrap justify-end gap-2\">\n <button\n type=\"button\"\n onClick={() => setWorkflowCreateOpen(false)}\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 onClick={() => {\n const safeId = String(workflowCreateId || \"\").trim();\n if (!safeId) {\n flashMessage(\"Workflow id is required\", \"error\");\n return;\n }\n\n const workflow: WorkflowFileV1 = {\n schema: \"clawkitchen.workflow.v1\",\n id: safeId,\n name: String(workflowCreateName || safeId),\n version: 1,\n timezone: \"America/New_York\",\n triggers: [],\n nodes: [\n { id: \"start\", type: \"start\", name: \"Start\", x: 120, y: 120 },\n { id: \"end\", type: \"end\", name: \"End\", x: 420, y: 120 },\n ],\n edges: [{ id: \"e1\", from: \"start\", to: \"end\" }],\n meta: {},\n };\n\n setSelectedWorkflowFile(`${safeId}.workflow.json`);\n setWorkflowJsonText(JSON.stringify(workflow, null, 2) + \"\\n\");\n setWorkflowCreateOpen(false);\n setWorkflowEditorOpen(true);\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)]\"\n >\n Create\n </button>\n </div>\n </div>\n </div>\n ) : null}\n\n <div className=\"mt-4 text-xs font-medium text-[color:var(--ck-text-secondary)]\">Files</div>\n <ul className=\"mt-2 space-y-1\">\n {workflowFilesLoading ? <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li> : null}\n {workflowFiles.length ? (\n workflowFiles.map((f) => {\n const isActive = selectedWorkflowFile === f;\n return (\n <li key={f} className=\"flex items-center justify-between gap-3 rounded-[var(--ck-radius-sm)] px-2 py-1 hover:bg-white/5\">\n <button\n type=\"button\"\n onClick={() => setSelectedWorkflowFile(f)}\n className=\"flex min-w-0 items-center gap-2 text-left\"\n >\n <span className={isActive ? \"text-green-400\" : \"text-white/25\"}>{isActive ? \"✓\" : \"•\"}</span>\n <span\n className={\n isActive\n ? \"truncate text-base font-medium text-[color:var(--ck-text-primary)]\"\n : \"truncate text-base text-[color:var(--ck-text-secondary)]\"\n }\n >\n {f}\n </span>\n </button>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n disabled={workflowSaving}\n onClick={async () => {\n setSelectedWorkflowFile(f);\n setWorkflowSaving(true);\n setWorkflowFilesError(\"\");\n try {\n const id = String(f).replace(/\\.workflow\\.json$/i, \"\");\n const res = await fetch(\n `/api/teams/workflows?teamId=${encodeURIComponent(teamId)}&id=${encodeURIComponent(id)}`,\n { cache: \"no-store\" }\n );\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load workflow\");\n setWorkflowJsonText(JSON.stringify(json.workflow, null, 2) + \"\\n\");\n setWorkflowEditorOpen(true);\n } catch (e: unknown) {\n setWorkflowFilesError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowSaving(false);\n }\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)] hover:bg-white/10 disabled:opacity-50\"\n >\n Edit\n </button>\n\n <button\n type=\"button\"\n disabled={workflowSaving}\n onClick={async () => {\n if (!confirm(`Delete workflow ${f}?`)) return;\n setWorkflowSaving(true);\n setWorkflowFilesError(\"\");\n try {\n const id = String(f).replace(/\\.workflow\\.json$/i, \"\");\n const res = await fetch(\n `/api/teams/workflows?teamId=${encodeURIComponent(teamId)}&id=${encodeURIComponent(id)}`,\n { method: \"DELETE\" }\n );\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to delete workflow\");\n\n const listRes = await fetch(`/api/teams/workflows?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const listJson = await listRes.json();\n if (listRes.ok && listJson.ok) {\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((x: unknown) => String(x ?? \"\").trim()).filter((x: string) => Boolean(x));\n setWorkflowFiles(list);\n }\n\n if (selectedWorkflowFile === f) {\n setSelectedWorkflowFile(\"\");\n setWorkflowJsonText(\"\");\n }\n\n flashMessage(`Deleted workflow: ${f}`, \"success\");\n } catch (e: unknown) {\n setWorkflowFilesError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowSaving(false);\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 px-3 py-2 text-sm font-medium text-red-100 shadow-[var(--ck-shadow-1)] hover:bg-red-500/20 disabled:opacity-50\"\n >\n Delete\n </button>\n </div>\n </li>\n );\n })\n ) : !workflowFilesLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">No workflows yet.</li>\n ) : null}\n </ul>\n </div>\n\n {workflowEditorOpen ? (\n <div className=\"fixed inset-0 z-50 bg-black/70\">\n <div className=\"ck-glass-strong h-full w-full overflow-hidden border border-white/10 shadow-[var(--ck-shadow-2)]\">\n <div className=\"flex items-center justify-between border-b border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">\n Workflow editor{selectedWorkflowFile ? ` — ${selectedWorkflowFile}` : \"\"}\n </div>\n <button\n type=\"button\"\n onClick={() => setWorkflowEditorOpen(false)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Close\n </button>\n </div>\n\n <div className=\"h-[calc(100%-3rem)] overflow-auto p-4\">\n <div className=\"ck-glass-strong p-4 lg:col-span-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Workflow editor</div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex overflow-hidden rounded-[var(--ck-radius-sm)] border border-white/10\">\n <button\n type=\"button\"\n onClick={() => setWorkflowView(\"canvas\")}\n className={\n workflowView === \"canvas\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n Canvas\n </button>\n <button\n type=\"button\"\n onClick={() => setWorkflowView(\"json\")}\n className={\n workflowView === \"json\"\n ? \"bg-white/10 px-3 py-2 text-xs font-medium text-[color:var(--ck-text-primary)]\"\n : \"bg-transparent px-3 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n JSON\n </button>\n </div>\n\n <input\n ref={workflowImportInputRef}\n type=\"file\"\n accept=\"application/json,.json\"\n className=\"hidden\"\n onChange={async (e) => {\n const file = e.target.files?.[0];\n // Reset the input so re-importing the same file still triggers onChange.\n e.target.value = \"\";\n if (!file) return;\n\n setWorkflowFilesError(\"\");\n try {\n const text = await file.text();\n const parsed = JSON.parse(text) as WorkflowFileV1;\n setWorkflowJsonText(JSON.stringify(parsed, null, 2) + \"\\n\");\n setSelectedWorkflowFile(\"\");\n flashMessage(`Imported workflow JSON: ${parsed.id || file.name}`, \"success\");\n } catch (err: unknown) {\n setWorkflowFilesError(err instanceof Error ? err.message : String(err));\n }\n }}\n />\n\n <button\n type=\"button\"\n disabled={workflowSaving}\n onClick={() => workflowImportInputRef.current?.click()}\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)] hover:bg-white/10 disabled:opacity-50\"\n >\n Import\n </button>\n\n <button\n type=\"button\"\n disabled={workflowSaving || !workflowParsed || Boolean(workflowParseError) || workflowValidation.errors.length > 0}\n onClick={() => {\n setWorkflowFilesError(\"\");\n try {\n const wf = workflowParsed;\n if (!wf) throw new Error(\"No workflow loaded\");\n if (workflowParseError) throw new Error(`Invalid JSON: ${workflowParseError}`);\n if (workflowValidation.errors.length) throw new Error(\"Fix workflow validation errors before exporting\");\n\n const filename = `${wf.id || \"workflow\"}.workflow.json`;\n const blob = new Blob([JSON.stringify(wf, null, 2) + \"\\n\"], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n flashMessage(`Exported: ${filename}`, \"success\");\n } catch (err: unknown) {\n setWorkflowFilesError(err instanceof Error ? err.message : String(err));\n }\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)] hover:bg-white/10 disabled:opacity-50\"\n >\n Export\n </button>\n\n <button\n disabled={workflowSaving || !workflowParsed || Boolean(workflowParseError) || workflowValidation.errors.length > 0}\n onClick={async () => {\n setWorkflowSaving(true);\n setWorkflowFilesError(\"\");\n try {\n const wf = workflowParsed;\n if (!wf) throw new Error(\"No workflow loaded\");\n if (workflowParseError) throw new Error(`Invalid JSON: ${workflowParseError}`);\n if (workflowValidation.errors.length) throw new Error(\"Fix workflow validation errors before saving\");\n\n const res = await fetch(\"/api/teams/workflows\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflow: wf }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to save workflow\");\n flashMessage(`Saved workflow: ${wf.id}`, \"success\");\n\n const listRes = await fetch(`/api/teams/workflows?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const listJson = await listRes.json();\n if (listRes.ok && listJson.ok) {\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowFiles(list);\n setSelectedWorkflowFile(`${wf.id}.workflow.json`);\n }\n } catch (e: unknown) {\n setWorkflowFilesError(e instanceof Error ? e.message : String(e));\n } finally {\n setWorkflowSaving(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 {workflowSaving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n\n {workflowParseError ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n JSON parse error: {workflowParseError}\n </div>\n ) : null}\n\n {!workflowParseError && workflowValidation.errors.length ? (\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 <div className=\"font-medium\">Workflow validation errors</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {workflowValidation.errors.map((e) => (\n <li key={e}>{e}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {!workflowParseError && !workflowValidation.errors.length && workflowValidation.warnings.length ? (\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-yellow-400/30 bg-yellow-500/10 p-3 text-sm text-yellow-100\">\n <div className=\"font-medium\">Workflow validation warnings</div>\n <ul className=\"mt-2 list-disc space-y-1 pl-5\">\n {workflowValidation.warnings.map((w) => (\n <li key={w}>{w}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {workflowView === \"canvas\" ? (\n <div className=\"mt-3 grid grid-cols-1 gap-3 lg:grid-cols-4\">\n <div className=\"lg:col-span-3\">\n <div\n ref={workflowCanvasRef}\n className=\"relative h-[calc(100vh-20rem)] min-h-[55vh] w-full overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20\"\n >\n <div className=\"relative h-[900px] w-[1400px]\">\n <svg className=\"absolute inset-0\" width={1400} height={900}>\n {(workflowParsed?.edges ?? []).map((e) => {\n const wf = workflowParsed;\n if (!wf) return null;\n const a = wf.nodes.find((n) => n.id === e.from);\n const b = wf.nodes.find((n) => n.id === e.to);\n if (!a || !b) return null;\n\n const ax = (typeof a.x === \"number\" ? a.x : 80) + 90;\n const ay = (typeof a.y === \"number\" ? a.y : 80) + 24;\n const bx = (typeof b.x === \"number\" ? b.x : 80) + 90;\n const by = (typeof b.y === \"number\" ? b.y : 80) + 24;\n\n return (\n <g key={e.id}>\n <line x1={ax} y1={ay} x2={bx} y2={by} stroke=\"rgba(255,255,255,0.18)\" strokeWidth={2} />\n {e.label ? (\n <text x={(ax + bx) / 2} y={(ay + by) / 2 - 6} fill=\"rgba(255,255,255,0.55)\" fontSize={10} textAnchor=\"middle\">\n {e.label}\n </text>\n ) : null}\n </g>\n );\n })}\n </svg>\n\n {(workflowParsed?.nodes ?? []).map((n, idx) => {\n const x = typeof n.x === \"number\" ? n.x : 80 + idx * 220;\n const y = typeof n.y === \"number\" ? n.y : 80;\n const selected = workflowSelectedNodeId === n.id;\n\n return (\n <div\n key={n.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => setWorkflowSelectedNodeId(n.id)}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n const el = workflowCanvasRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const dx = e.clientX - rect.left - x;\n const dy = e.clientY - rect.top - y;\n setWorkflowSelectedNodeId(n.id);\n setWorkflowDragging({ nodeId: n.id, dx, dy, containerLeft: rect.left, containerTop: rect.top });\n }}\n className={\n selected\n ? \"absolute cursor-grab rounded-[var(--ck-radius-sm)] border border-white/25 bg-white/10 px-3 py-2 text-xs text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)]\"\n : \"absolute cursor-grab rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-xs text-[color:var(--ck-text-secondary)] hover:bg-white/10\"\n }\n style={{ left: x, top: y, width: 180 }}\n >\n <div className=\"font-medium text-[color:var(--ck-text-primary)]\">{n.name || n.id}</div>\n <div className=\"mt-0.5 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</div>\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Tip: click a node to inspect it; drag to reposition. Positions are stored in the workflow JSON (file-first).\n </div>\n </div>\n\n <div className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 lg:col-span-1\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Workflow</div>\n\n {workflowParsed ? (\n (() => {\n const wf = workflowParsed;\n const tz = String(wf.timezone ?? \"\").trim() || \"UTC\";\n const triggers = wf.triggers ?? [];\n\n const meta = wf.meta && typeof wf.meta === \"object\" && !Array.isArray(wf.meta) ? (wf.meta as Record<string, unknown>) : {};\n const approvalProvider = String(meta.approvalProvider ?? \"telegram\").trim() || \"telegram\";\n const approvalTarget = String(meta.approvalTarget ?? \"\").trim();\n\n const presets = [\n { label: \"(no preset)\", expr: \"\" },\n { label: \"Mon/Wed/Fri 09:00 local\", expr: \"0 9 * * 1,3,5\" },\n { label: \"Daily 08:00 local\", expr: \"0 8 * * *\" },\n { label: \"Mon 09:30 local\", expr: \"30 9 * * 1\" },\n ];\n\n return (\n <div className=\"mt-2 space-y-4\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timezone</div>\n <input\n value={tz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || \"UTC\";\n const next: WorkflowFileV1 = { ...wf, timezone: nextTz };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"America/New_York\"\n />\n </label>\n\n <div className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">approval channel (mvp)</div>\n <div className=\"mt-2 space-y-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">provider</div>\n <input\n value={approvalProvider}\n onChange={(e) => {\n const nextProvider = String(e.target.value || \"\").trim() || \"telegram\";\n const nextMeta = { ...meta, approvalProvider: nextProvider };\n const next: WorkflowFileV1 = { ...wf, meta: nextMeta };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"telegram\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">target</div>\n <input\n value={approvalTarget}\n onChange={(e) => {\n const nextTarget = String(e.target.value || \"\").trim();\n const nextMeta = { ...meta, approvalTarget: nextTarget };\n const next: WorkflowFileV1 = { ...wf, meta: nextMeta };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"(e.g. Telegram chat id)\"\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n If set, sample runs that reach a human-approval node will send an approval packet via the gateway message tool.\n </div>\n </label>\n </div>\n </div>\n\n <div>\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">triggers</div>\n <button\n type=\"button\"\n onClick={() => {\n const id = `t${Date.now()}`;\n const next: WorkflowFileV1 = {\n ...wf,\n triggers: [\n ...triggers,\n { kind: \"cron\", id, name: \"New trigger\", enabled: true, expr: \"0 9 * * 1-5\", tz },\n ],\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add\n </button>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n {triggers.length ? (\n triggers.map((t, i) => {\n const kind = (t as { kind?: unknown }).kind;\n const isCron = kind === \"cron\";\n const id = String((t as { id?: unknown }).id ?? \"\");\n const name = String((t as { name?: unknown }).name ?? \"\");\n const enabled = Boolean((t as { enabled?: unknown }).enabled);\n const expr = String((t as { expr?: unknown }).expr ?? \"\");\n const trigTz = String((t as { tz?: unknown }).tz ?? tz);\n const cronFields = expr.trim().split(/\\s+/).filter(Boolean);\n const cronLooksValid = !expr.trim() || cronFields.length === 5;\n\n return (\n <div key={`${id}-${i}`} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs text-[color:var(--ck-text-primary)]\">{name || id || `trigger-${i + 1}`}</div>\n <button\n type=\"button\"\n onClick={() => {\n const next: WorkflowFileV1 = { ...wf, triggers: triggers.filter((_, idx) => idx !== i) };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n\n {!isCron ? (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">Unsupported trigger kind: {String(kind)}</div>\n ) : null}\n\n <div className=\"mt-2 grid grid-cols-1 gap-2\">\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => {\n const nextEnabled = e.target.checked;\n const next: WorkflowFileV1 = {\n ...wf,\n triggers: triggers.map((x, idx) =>\n idx === i ? (x.kind === \"cron\" ? { ...x, enabled: nextEnabled } : x) : x\n ),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n />\n Enabled\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={name}\n onChange={(e) => {\n const nextName = e.target.value;\n const next: WorkflowFileV1 = {\n ...wf,\n triggers: triggers.map((x, idx) =>\n idx === i ? (x.kind === \"cron\" ? { ...x, name: nextName } : x) : x\n ),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Content cadence\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">schedule (cron)</div>\n <input\n value={expr}\n onChange={(e) => {\n const nextExpr = e.target.value;\n const next: WorkflowFileV1 = {\n ...wf,\n triggers: triggers.map((x, idx) =>\n idx === i ? (x.kind === \"cron\" ? { ...x, expr: nextExpr } : x) : x\n ),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className={\n cronLooksValid\n ? \"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-red-400/50 bg-black/25 px-2 py-1 font-mono text-[11px] text-[color:var(--ck-text-primary)]\"\n }\n placeholder=\"0 9 * * 1,3,5\"\n />\n {!cronLooksValid ? (\n <div className=\"mt-1 text-[10px] text-red-200\">\n Cron should be 5 fields (min hour dom month dow). You entered {cronFields.length}.\n </div>\n ) : null}\n <div className=\"mt-1 grid grid-cols-1 gap-1\">\n <select\n value={presets.some((p) => p.expr === expr) ? expr : \"\"}\n onChange={(e) => {\n const nextExpr = e.target.value;\n if (!nextExpr) return;\n const next: WorkflowFileV1 = {\n ...wf,\n triggers: triggers.map((x, idx) =>\n idx === i ? (x.kind === \"cron\" ? { ...x, expr: nextExpr } : x) : x\n ),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-[11px] text-[color:var(--ck-text-secondary)]\"\n >\n {presets.map((p) => (\n <option key={p.label} value={p.expr}>\n {p.label}\n </option>\n ))}\n </select>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">Presets set the cron; edit freely for advanced schedules.</div>\n </div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">timezone override</div>\n <input\n value={trigTz}\n onChange={(e) => {\n const nextTz = String(e.target.value || \"\").trim() || tz;\n const next: WorkflowFileV1 = {\n ...wf,\n triggers: triggers.map((x, idx) =>\n idx === i ? (x.kind === \"cron\" ? { ...x, tz: nextTz } : x) : x\n ),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder={tz}\n />\n </label>\n </div>\n </div>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No triggers yet.</div>\n )}\n </div>\n </div>\n\n <div className=\"border-t border-white/10 pt-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Runs (history)</div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n disabled={workflowSaving}\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n setWorkflowRunsError(\"\");\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId: wfId, mode: \"sample\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to create sample run\");\n\n const listRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}`,\n { cache: \"no-store\" }\n );\n const listJson = await listRes.json();\n if (!listRes.ok || !listJson.ok) throw new Error(listJson.error || \"Failed to refresh runs\");\n const files = Array.isArray(listJson.files) ? listJson.files : [];\n const list = files.map((f: unknown) => String(f ?? \"\").trim()).filter((f: string) => Boolean(f));\n setWorkflowRuns(list);\n flashMessage(\"Created sample run\", \"success\");\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10 disabled:opacity-50\"\n >\n + Sample run\n </button>\n </div>\n </div>\n\n {workflowRunsError ? (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 p-2 text-xs text-red-100\">\n {workflowRunsError}\n </div>\n ) : null}\n\n <div className=\"mt-2 space-y-1\">\n {workflowRunsLoading ? (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">Loading runs…</div>\n ) : workflowRuns.length ? (\n workflowRuns.slice(0, 8).map((f) => {\n const runId = String(f).replace(/\\.run\\.json$/i, \"\");\n const selected = selectedWorkflowRunId === runId;\n return (\n <button\n key={f}\n type=\"button\"\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n if (!wfId) return;\n setSelectedWorkflowRunId(runId);\n setSelectedWorkflowRun(null);\n setWorkflowRunsError(\"\");\n try {\n const res = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}&runId=${encodeURIComponent(runId)}`,\n { cache: \"no-store\" }\n );\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to load run\");\n setSelectedWorkflowRun(json.run);\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n }\n }}\n className={\n selected\n ? \"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-[var(--ck-radius-sm)] px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n {runId}\n </button>\n );\n })\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No runs yet.</div>\n )}\n </div>\n\n {selectedWorkflowRun ? (\n (() => {\n const run =\n selectedWorkflowRun && typeof selectedWorkflowRun === \"object\"\n ? (selectedWorkflowRun as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n const nodesVal = (run as Record<string, unknown>).nodes;\n const nodes = Array.isArray(nodesVal) ? (nodesVal as unknown[]) : [];\n return (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <div className=\"text-[11px] font-medium text-[color:var(--ck-text-primary)]\">Run detail</div>\n <div className=\"text-[10px] text-[color:var(--ck-text-tertiary)]\">\n <span className=\"font-mono\">{String(run?.status ?? \"\")}</span>\n {run?.startedAt ? <span> · {String(run.startedAt)}</span> : null}\n </div>\n </div>\n\n {run?.summary ? (\n <div className=\"mt-1 text-[11px] text-[color:var(--ck-text-secondary)]\">{String(run.summary)}</div>\n ) : null}\n\n {(() => {\n const status = String(run?.status ?? \"\");\n const approvalVal = (run as Record<string, unknown>).approval;\n const approval =\n approvalVal && typeof approvalVal === \"object\" ? (approvalVal as Record<string, unknown>) : ({} as Record<string, unknown>);\n const approvalState = String(approval.state ?? \"\");\n const approvalNodeId = String(approval.nodeId ?? \"\");\n const canAct = status === \"waiting_for_approval\" && approvalState === \"pending\" && approvalNodeId;\n\n if (!canAct) return null;\n\n return (\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-amber-300/30 bg-amber-500/10 p-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-amber-100\">approval required</div>\n <div className=\"mt-1 text-[11px] text-amber-50\">\n Waiting on <span className=\"font-mono\">{approvalNodeId}</span>\n </div>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n const rId = String((run as Record<string, unknown>).id ?? \"\").trim();\n if (!wfId || !rId) return;\n setWorkflowRunsError(\"\");\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId: wfId, runId: rId, action: \"approve\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to approve\");\n\n const detailRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}&runId=${encodeURIComponent(rId)}`,\n { cache: \"no-store\" }\n );\n const detailJson = await detailRes.json();\n if (!detailRes.ok || !detailJson.ok) throw new Error(detailJson.error || \"Failed to reload run\");\n setSelectedWorkflowRun(detailJson.run);\n flashMessage(\"Approved\", \"success\");\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-emerald-300/30 bg-emerald-500/10 px-2 py-1 text-[10px] font-medium text-emerald-50 hover:bg-emerald-500/20\"\n >\n Approve &amp; continue\n </button>\n <button\n type=\"button\"\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n const rId = String((run as Record<string, unknown>).id ?? \"\").trim();\n if (!wfId || !rId) return;\n setWorkflowRunsError(\"\");\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId: wfId, runId: rId, action: \"request_changes\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to request changes\");\n\n const detailRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}&runId=${encodeURIComponent(rId)}`,\n { cache: \"no-store\" }\n );\n const detailJson = await detailRes.json();\n if (!detailRes.ok || !detailJson.ok) throw new Error(detailJson.error || \"Failed to reload run\");\n setSelectedWorkflowRun(detailJson.run);\n flashMessage(\"Requested changes\", \"success\");\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Request changes\n </button>\n <button\n type=\"button\"\n onClick={async () => {\n const wfId = String(wf.id ?? \"\").trim();\n const rId = String((run as Record<string, unknown>).id ?? \"\").trim();\n if (!wfId || !rId) return;\n setWorkflowRunsError(\"\");\n try {\n const res = await fetch(\"/api/teams/workflow-runs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, workflowId: wfId, runId: rId, action: \"cancel\" }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Failed to cancel\");\n\n const detailRes = await fetch(\n `/api/teams/workflow-runs?teamId=${encodeURIComponent(teamId)}&workflowId=${encodeURIComponent(wfId)}&runId=${encodeURIComponent(rId)}`,\n { cache: \"no-store\" }\n );\n const detailJson = await detailRes.json();\n if (!detailRes.ok || !detailJson.ok) throw new Error(detailJson.error || \"Failed to reload run\");\n setSelectedWorkflowRun(detailJson.run);\n flashMessage(\"Canceled\", \"success\");\n } catch (e: unknown) {\n setWorkflowRunsError(e instanceof Error ? e.message : String(e));\n }\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-red-400/30 bg-red-500/10 px-2 py-1 text-[10px] font-medium text-red-50 hover:bg-red-500/20\"\n >\n Cancel\n </button>\n </div>\n <div className=\"mt-2 text-[10px] text-amber-100/80\">\n Note: this is currently an in-app approval stub; channel delivery/resume wiring still TBD.\n </div>\n </div>\n );\n })()}\n\n <div className=\"mt-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">per-node results</div>\n {nodes.length ? (\n <div className=\"mt-1 space-y-1\">\n {nodes.slice(0, 50).map((n, idx) => {\n const node = n && typeof n === \"object\" ? (n as Record<string, unknown>) : ({} as Record<string, unknown>);\n const status = String(node.status ?? \"\");\n const statusColor =\n status === \"success\"\n ? \"text-emerald-200\"\n : status === \"error\"\n ? \"text-red-200\"\n : status === \"running\" || status === \"waiting\"\n ? \"text-amber-200\"\n : \"text-[color:var(--ck-text-secondary)]\";\n const nodeId = String(node.nodeId ?? \"\");\n const errVal = node.error;\n const outputVal = node.output;\n return (\n <div key={`${nodeId || \"node\"}-${idx}`} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[11px] text-[color:var(--ck-text-primary)]\">\n <span className=\"font-mono\">{nodeId}</span>\n </div>\n <div className={`text-[10px] font-medium ${statusColor}`}>{status}</div>\n </div>\n {errVal ? (\n <div className=\"mt-1 text-[10px] text-red-100\">\n {typeof errVal === \"string\"\n ? errVal\n : typeof errVal === \"object\" && errVal && \"message\" in errVal\n ? String((errVal as Record<string, unknown>).message ?? \"\")\n : String(errVal)}\n </div>\n ) : null}\n {typeof outputVal !== \"undefined\" ? (\n <pre className=\"mt-1 max-h-[120px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(outputVal, null, 2)}\n </pre>\n ) : null}\n </div>\n );\n })}\n </div>\n ) : (\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">No node results recorded on this run yet.</div>\n )}\n </div>\n\n <details className=\"mt-2\">\n <summary className=\"cursor-pointer select-none text-[10px] text-[color:var(--ck-text-tertiary)]\">raw JSON</summary>\n <pre className=\"mt-2 max-h-[220px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(selectedWorkflowRun, null, 2)}\n </pre>\n </details>\n </div>\n );\n })()\n ) : null}\n </div>\n\n <div className=\"border-t border-white/10 pt-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Nodes</div>\n\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <input\n value={workflowNewNodeId}\n onChange={(e) => setWorkflowNewNodeId(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. draft_assets\"\n />\n <div className=\"mt-1 text-[10px] text-[color:var(--ck-text-tertiary)]\">\n Tip: ids are file-first + portable; use lowercase letters, numbers, and underscores.\n </div>\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name (optional)</div>\n <input\n value={workflowNewNodeName}\n onChange={(e) => setWorkflowNewNodeName(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Human-friendly label\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={workflowNewNodeType}\n onChange={(e) => setWorkflowNewNodeType(e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"])}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n </select>\n </label>\n\n <button\n type=\"button\"\n onClick={() => {\n const rawId = String(workflowNewNodeId || \"\").trim();\n const id = rawId.replace(/[^a-z0-9_\\-]/gi, \"_\");\n if (!id) {\n flashMessage(\"Node id is required\", \"error\");\n return;\n }\n if (wf.nodes.some((n) => n.id === id)) {\n flashMessage(`Node id already exists: ${id}`, \"error\");\n return;\n }\n\n const maxX = wf.nodes.reduce((acc, n) => (typeof n.x === \"number\" ? Math.max(acc, n.x) : acc), 80);\n const nextNode = {\n id,\n type: workflowNewNodeType,\n name: String(workflowNewNodeName || \"\").trim() || id,\n x: maxX + 220,\n y: 80,\n } as WorkflowFileV1[\"nodes\"][number];\n\n const next: WorkflowFileV1 = { ...wf, nodes: [...wf.nodes, nextNode] };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n setWorkflowSelectedNodeId(id);\n setWorkflowNewNodeId(\"\");\n setWorkflowNewNodeName(\"\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add node\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-1\">\n {wf.nodes.map((n) => {\n const selected = workflowSelectedNodeId === n.id;\n return (\n <button\n key={n.id}\n type=\"button\"\n onClick={() => setWorkflowSelectedNodeId(n.id)}\n className={\n selected\n ? \"w-full rounded-[var(--ck-radius-sm)] bg-white/10 px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-primary)]\"\n : \"w-full rounded-[var(--ck-radius-sm)] px-2 py-1 text-left text-[11px] text-[color:var(--ck-text-secondary)] hover:bg-white/5\"\n }\n >\n <span className=\"font-mono\">{n.id}</span>\n <span className=\"ml-2 text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">{n.type}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"border-t border-white/10 pt-3\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Edges</div>\n\n <div className=\"mt-2 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"grid grid-cols-1 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">from</div>\n <select\n value={workflowNewEdgeFrom}\n onChange={(e) => setWorkflowNewEdgeFrom(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">to</div>\n <select\n value={workflowNewEdgeTo}\n onChange={(e) => setWorkflowNewEdgeTo(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"\">(select)</option>\n {wf.nodes.map((n) => (\n <option key={n.id} value={n.id}>\n {n.id}\n </option>\n ))}\n </select>\n </label>\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">label (optional)</div>\n <input\n value={workflowNewEdgeLabel}\n onChange={(e) => setWorkflowNewEdgeLabel(e.target.value)}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"e.g. approve\"\n />\n </label>\n <button\n type=\"button\"\n onClick={() => {\n const from = String(workflowNewEdgeFrom || \"\").trim();\n const to = String(workflowNewEdgeTo || \"\").trim();\n if (!from || !to) {\n flashMessage(\"Edge requires from + to\", \"error\");\n return;\n }\n if (from === to) {\n flashMessage(\"Edge from/to must be different\", \"error\");\n return;\n }\n const id = `e${Date.now()}`;\n const nextEdge: WorkflowFileV1[\"edges\"][number] = {\n id,\n from,\n to,\n ...(String(workflowNewEdgeLabel || \"\").trim() ? { label: String(workflowNewEdgeLabel).trim() } : {}),\n };\n const next: WorkflowFileV1 = { ...wf, edges: [...(wf.edges ?? []), nextEdge] };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n setWorkflowNewEdgeLabel(\"\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[11px] font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n + Add edge\n </button>\n </div>\n </div>\n\n <div className=\"mt-2 space-y-2\">\n {(wf.edges ?? []).length ? (\n (wf.edges ?? []).map((e) => (\n <div key={e.id} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-[11px] text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{e.from}</span> → <span className=\"font-mono\">{e.to}</span>\n {e.label ? <span className=\"ml-2 text-[10px] text-[color:var(--ck-text-tertiary)]\">({e.label})</span> : null}\n </div>\n <button\n type=\"button\"\n onClick={() => {\n const next: WorkflowFileV1 = { ...wf, edges: (wf.edges ?? []).filter((x) => x.id !== e.id) };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"text-[10px] text-[color:var(--ck-text-tertiary)] hover:text-[color:var(--ck-text-primary)]\"\n >\n Remove\n </button>\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-xs text-[color:var(--ck-text-secondary)]\">No edges yet.</div>\n )}\n </div>\n </div>\n\n <div className=\"border-t border-white/10 pt-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Node inspector</div>\n {workflowSelectedNodeId ? (\n <button\n type=\"button\"\n onClick={() => {\n const nodeId = workflowSelectedNodeId;\n const nextNodes = wf.nodes.filter((n) => n.id !== nodeId);\n const nextEdges = (wf.edges ?? []).filter((e) => e.from !== nodeId && e.to !== nodeId);\n const next: WorkflowFileV1 = { ...wf, nodes: nextNodes, edges: nextEdges };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n setWorkflowSelectedNodeId(\"\");\n }}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-[10px] font-medium text-red-100 hover:bg-white/10\"\n >\n Delete node\n </button>\n ) : null}\n </div>\n\n {workflowSelectedNodeId ? (\n (() => {\n const node = wf.nodes.find((n) => n.id === workflowSelectedNodeId);\n if (!node) return <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No node selected.</div>;\n\n return (\n <div className=\"mt-3 space-y-3\">\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">id</div>\n <div className=\"mt-1 rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\">\n {node.id}\n </div>\n </div>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">name</div>\n <input\n value={String(node.name ?? \"\")}\n onChange={(e) => {\n const nextName = e.target.value;\n const next: WorkflowFileV1 = {\n ...wf,\n nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, name: nextName } : n)),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n placeholder=\"Optional\"\n />\n </label>\n\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">type</div>\n <select\n value={node.type}\n onChange={(e) => {\n const nextType = e.target.value as WorkflowFileV1[\"nodes\"][number][\"type\"];\n const next: WorkflowFileV1 = {\n ...wf,\n nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, type: nextType } : n)),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n >\n <option value=\"start\">start</option>\n <option value=\"end\">end</option>\n <option value=\"llm\">llm</option>\n <option value=\"tool\">tool</option>\n <option value=\"condition\">condition</option>\n <option value=\"delay\">delay</option>\n <option value=\"human_approval\">human_approval</option>\n </select>\n </label>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">x</div>\n <input\n type=\"number\"\n value={typeof node.x === \"number\" ? node.x : 0}\n onChange={(e) => {\n const nextX = Number(e.target.value);\n const next: WorkflowFileV1 = {\n ...wf,\n nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, x: nextX } : n)),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n <label className=\"block\">\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">y</div>\n <input\n type=\"number\"\n value={typeof node.y === \"number\" ? node.y : 0}\n onChange={(e) => {\n const nextY = Number(e.target.value);\n const next: WorkflowFileV1 = {\n ...wf,\n nodes: wf.nodes.map((n) => (n.id === node.id ? { ...n, y: nextY } : n)),\n };\n setWorkflowJsonText(JSON.stringify(next, null, 2) + \"\\n\");\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-1 text-xs text-[color:var(--ck-text-primary)]\"\n />\n </label>\n </div>\n\n <div>\n <div className=\"text-[10px] uppercase tracking-wide text-[color:var(--ck-text-tertiary)]\">config</div>\n <pre className=\"mt-1 max-h-[200px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-2 text-[10px] text-[color:var(--ck-text-secondary)]\">\n {JSON.stringify(node.config ?? {}, null, 2)}\n </pre>\n </div>\n </div>\n );\n })()\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">Select a node.</div>\n )}\n </div>\n </div>\n );\n })()\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">Load or create a workflow to edit triggers.</div>\n )}\n </div>\n </div>\n ) : (\n <textarea\n value={workflowJsonText}\n onChange={(e) => setWorkflowJsonText(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 placeholder=\"Select a workflow from the left (or create the template).\"\n />\n )}\n </div>\n </div>\n </div>\n </div>\n ) : null}\n\n </div>\n ) : null}\n\n{activeTab === \"files\" ? (\n <div className=\"mt-6 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)]\">Team files</div>\n <label className=\"flex items-center gap-2 text-xs text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={showOptionalFiles}\n onChange={(e) => setShowOptionalFiles(e.target.checked)}\n />\n Show optional\n </label>\n </div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Default view hides optional missing files to reduce noise.\n </div>\n <ul className=\"mt-3 space-y-1\">\n {teamFilesLoading ? (\n <li className=\"text-sm text-[color:var(--ck-text-secondary)]\">Loading…</li>\n ) : null}\n {teamFiles\n .filter((f) => (showOptionalFiles ? true : f.required || !f.missing))\n .map((f) => (\n <li key={f.name}>\n <button\n onClick={() => onLoadTeamFile(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 </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 <button\n disabled={saving}\n onClick={onSaveTeamFile}\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\n {teamFileError ? (\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 {teamFileError}\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\n {activeTab === \"orchestrator\" ? <OrchestratorPanel teamId={teamId} /> : null}\n\n {/* markdown editor lives below for convenience */}\n {activeTab === \"recipe\" ? (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Recipe markdown</div>\n\n {recipeLoadError ? (\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 {recipeLoadError}\n </div>\n ) : null}\n\n <textarea\n value={content}\n onChange={(e) => {\n setContent(e.target.value);\n setLoadedRecipeHash(null);\n }}\n className=\"mt-2 h-[55vh] w-full resize-none rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 p-3 font-mono text-xs text-[color:var(--ck-text-primary)]\"\n spellCheck={false}\n />\n </div>\n ) : null}\n\n {/* Clone Team removed (per #0075). */}\n\n <PublishChangesModal\n open={publishOpen}\n teamId={teamId}\n recipeId={toId}\n busy={publishing}\n onClose={() => setPublishOpen(false)}\n onConfirm={async () => {\n setPublishing(true);\n try {\n const res = await fetch(\"/api/scaffold\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n kind: \"team\",\n recipeId: toId.trim(),\n teamId,\n overwrite: true,\n applyConfig: true,\n }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Publish failed\");\n\n // Refresh team meta so we can reflect published hash/state.\n try {\n const metaRes = await fetch(`/api/teams/meta?teamId=${encodeURIComponent(teamId)}`, {\n cache: \"no-store\",\n });\n const metaJson = await metaRes.json();\n if (metaRes.ok && metaJson.ok && metaJson.meta && typeof metaJson.meta.recipeHash === \"string\") {\n setTeamMetaRecipeHash(metaJson.meta.recipeHash);\n }\n } catch {\n // ignore\n }\n\n setPublishOpen(false);\n flashMessage(\"Published changes to active team\", \"success\");\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n setPublishing(false);\n }\n }}\n />\n\n <DeleteTeamModal\n open={deleteOpen}\n teamId={teamId}\n busy={deleting}\n onClose={() => setDeleteOpen(false)}\n onConfirm={async () => {\n setDeleting(true);\n try {\n const res = await fetch(\"/api/teams/remove-team\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId }),\n });\n const json = await res.json();\n if (!res.ok || !json.ok) throw new Error(json.error || \"Delete failed\");\n flashMessage(\"Deleted team successfully\", \"success\");\n setDeleteOpen(false);\n setTimeout(() => router.push(\"/\"), 250);\n } catch (e: unknown) {\n flashMessage(e instanceof Error ? e.message : String(e), \"error\");\n } finally {\n setDeleting(false);\n }\n }}\n />\n\n {/* duplicate markdown editor removed */}\n </div>\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function DeleteTeamModal({\n open,\n teamId,\n onClose,\n onConfirm,\n busy,\n}: {\n open: boolean;\n teamId: string;\n busy?: boolean;\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 Team</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Delete team <code className=\"font-mono\">{teamId}</code>? This will remove the team workspace, agents, and stamped cron jobs.\n </p>\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","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport function PublishChangesModal({\n open,\n teamId,\n recipeId,\n onClose,\n onConfirm,\n busy,\n}: {\n open: boolean;\n teamId: string;\n recipeId: string;\n busy?: boolean;\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)]\">Publish changes</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n This will re-scaffold team <code className=\"font-mono\">{teamId}</code> from recipe <code className=\"font-mono\">{recipeId}</code>.\n </p>\n\n <div className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-amber-400/30 bg-amber-500/10 p-3 text-sm text-amber-100\">\n <div className=\"font-medium\">Complete overwrite</div>\n <div className=\"mt-1\">\n All existing team workspace files managed by the recipe will be overwritten (for example: <code className=\"font-mono\">AGENTS.md</code>,{\" \"}\n <code className=\"font-mono\">SOUL.md</code>, role templates, and other scaffolded files). Any manual edits in those files will be lost.\n </div>\n </div>\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-emerald-600 px-3 py-2 text-sm font-medium text-white shadow-[var(--ck-shadow-1)] hover:bg-emerald-500 disabled:opacity-50\"\n >\n {busy ? \"Publishing…\" : \"Publish changes\"}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\n\ntype OrchestratorState =\n | {\n ok: true;\n teamId: string;\n present: false;\n reason?: string;\n }\n | {\n ok: true;\n teamId: string;\n present: true;\n agent: { id: string; identityName?: string; workspace: string };\n tmuxSessions: Array<{ name: string; attached: boolean; windows?: number; created?: string }>;\n worktrees: Array<{ path: string; branch?: string; sha?: string }>;\n activeTasksSummary: null | { path: string; taskCount?: number; rawType?: string };\n settingsPaths: string[];\n }\n | {\n ok: false;\n error: string;\n };\n\nexport function OrchestratorPanel({ teamId }: { teamId: string }) {\n const [loading, setLoading] = useState(true);\n const [state, setState] = useState<OrchestratorState | null>(null);\n const [lastLoadedAt, setLastLoadedAt] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n setLoading(true);\n try {\n const res = await fetch(`/api/teams/orchestrator?teamId=${encodeURIComponent(teamId)}`, { cache: \"no-store\" });\n const json = (await res.json()) as OrchestratorState;\n setState(json);\n setLastLoadedAt(new Date().toISOString());\n } catch (e: unknown) {\n setState({ ok: false, error: e instanceof Error ? e.message : String(e) });\n setLastLoadedAt(new Date().toISOString());\n } finally {\n setLoading(false);\n }\n }, [teamId]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n if (loading) {\n return <div className=\"mt-6 ck-glass-strong p-4\">Loading orchestrator state…</div>;\n }\n\n if (!state) {\n return <div className=\"mt-6 ck-glass-strong p-4\">No orchestrator state available.</div>;\n }\n\n if (!state.ok) {\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\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 {state.error}\n </div>\n </div>\n );\n }\n\n if (!state.present) {\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n No swarm/orchestrator detected for this team.\n </p>\n <div className=\"mt-3 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3 text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"text-xs font-medium text-[color:var(--ck-text-tertiary)]\">Detection</div>\n <div className=\"mt-1 font-mono text-xs\">{state.reason || \"(no reason provided)\"}</div>\n </div>\n <p className=\"mt-3 text-sm text-[color:var(--ck-text-secondary)]\">\n Once an orchestrator agent is installed (e.g. <code>&lt;teamId&gt;-swarm-orchestrator</code>), this tab will show:\n tmux sessions, git worktrees/branches, and active task state.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"mt-6 ck-glass-strong p-4\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Orchestrator</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n Agent: <span className=\"font-mono\">{state.agent.id}</span>\n {state.agent.identityName ? ` (${state.agent.identityName})` : \"\"}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n Workspace: <span className=\"font-mono\">{state.agent.workspace}</span>\n </div>\n </div>\n\n <div className=\"flex items-center gap-3\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {lastLoadedAt ? (\n <span>\n Last updated: <span className=\"font-mono\">{lastLoadedAt}</span>\n </span>\n ) : null}\n </div>\n <button\n type=\"button\"\n onClick={() => void load()}\n disabled={loading}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm font-medium 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 {loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n </div>\n\n <div className=\"mt-5 grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <section className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">tmux sessions</div>\n {state.tmuxSessions.length ? (\n <ul className=\"mt-2 space-y-2\">\n {state.tmuxSessions.map((s) => (\n <li key={s.name} className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{s.name}</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n attached={String(s.attached)}\n {typeof s.windows === \"number\" ? ` windows=${s.windows}` : \"\"}\n </span>\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No sessions detected (or tmux not running).</div>\n )}\n </section>\n\n <section className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">git worktrees</div>\n {state.worktrees.length ? (\n <ul className=\"mt-2 space-y-2\">\n {state.worktrees.map((w) => (\n <li key={w.path} className=\"text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"font-mono text-xs\">{w.path}</div>\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">\n {w.branch ? w.branch : \"(no branch)\"}\n {w.sha ? ` @ ${w.sha.slice(0, 7)}` : \"\"}\n </div>\n </li>\n ))}\n </ul>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No worktrees detected.</div>\n )}\n </section>\n </div>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Active tasks</div>\n {state.activeTasksSummary ? (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <div className=\"font-mono text-xs\">{state.activeTasksSummary.path}</div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-tertiary)]\">\n {typeof state.activeTasksSummary.taskCount === \"number\" ? `tasks=${state.activeTasksSummary.taskCount}` : \"tasks=?\"}\n {state.activeTasksSummary.rawType ? ` type=${state.activeTasksSummary.rawType}` : \"\"}\n </div>\n </div>\n ) : (\n <div className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">No active-tasks.json found.</div>\n )}\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">CLI quick actions</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n The orchestrator is designed to be driven from the CLI (and usually tmux). Common commands:\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>\n <span className=\"font-mono text-xs\">tmux ls</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(list sessions)</span>\n </li>\n <li>\n <span className=\"font-mono text-xs\">tmux attach -t &lt;session&gt;</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(jump into a running swarm)</span>\n </li>\n <li>\n <span className=\"font-mono text-xs\">git -C {state.agent.workspace} worktree list</span>\n <span className=\"ml-2 text-xs text-[color:var(--ck-text-tertiary)]\">(inspect worktrees)</span>\n </li>\n </ul>\n <p className=\"mt-3 text-xs text-[color:var(--ck-text-tertiary)]\">\n Note: ClawKitchen is read-only here; it surfaces status and pointers, but does not run or attach to tmux.\n </p>\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Human approval gate (recommended)</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n For workflows that publish, deploy, or send outbound messages, keep a <strong>human approval step</strong>.\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n <li>Generate a proposed change/post as a draft.</li>\n <li>Send the draft to a bound messaging channel (e.g. Telegram) for approval.</li>\n <li>Only execute the final action after explicit approve/deny.</li>\n </ul>\n </section>\n\n <section className=\"mt-4 rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/20 p-3\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Where to change settings</div>\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n These are the common knobs for a swarm/orchestrator scaffold (read-only references):\n </p>\n <ul className=\"mt-2 list-disc space-y-1 pl-5 text-sm text-[color:var(--ck-text-secondary)]\">\n {state.settingsPaths.map((p) => (\n <li key={p} className=\"font-mono text-xs\">\n {p}\n </li>\n ))}\n </ul>\n </section>\n </div>\n );\n}\n","import type { WorkflowEdgeV1, WorkflowFileV1, WorkflowNodeV1, WorkflowTriggerV1 } from \"@/lib/workflows/types\";\n\nexport type WorkflowValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isFiveFieldCron(expr: string) {\n const parts = String(expr || \"\")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n return parts.length === 5;\n}\n\nfunction uniqCount(values: string[]) {\n const set = new Set<string>();\n for (const v of values) set.add(v);\n return set.size;\n}\n\nexport function validateWorkflowFileV1(wf: WorkflowFileV1): WorkflowValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (wf.schema !== \"clawkitchen.workflow.v1\") errors.push(`schema must be clawkitchen.workflow.v1 (got ${String(wf.schema)})`);\n if (!String(wf.id || \"\").trim()) errors.push(\"id is required\");\n if (!String(wf.name || \"\").trim()) errors.push(\"name is required\");\n\n const nodes: WorkflowNodeV1[] = Array.isArray(wf.nodes) ? wf.nodes : [];\n const edges: WorkflowEdgeV1[] = Array.isArray(wf.edges) ? wf.edges : [];\n const triggers: WorkflowTriggerV1[] = Array.isArray(wf.triggers) ? wf.triggers : [];\n\n const nodeIds = nodes.map((n) => String(n?.id ?? \"\").trim()).filter(Boolean);\n if (nodeIds.length !== nodes.length) errors.push(\"all nodes must have a non-empty id\");\n if (uniqCount(nodeIds) !== nodeIds.length) errors.push(\"node ids must be unique\");\n\n const edgeIds = edges.map((e) => String(e?.id ?? \"\").trim()).filter(Boolean);\n if (edgeIds.length !== edges.length) errors.push(\"all edges must have a non-empty id\");\n if (uniqCount(edgeIds) !== edgeIds.length) errors.push(\"edge ids must be unique\");\n\n const nodeIdSet = new Set(nodeIds);\n for (const e of edges) {\n const from = String(e?.from ?? \"\").trim();\n const to = String(e?.to ?? \"\").trim();\n if (!from || !to) {\n errors.push(`edge ${String(e?.id ?? \"(missing id)\")} must have from/to`);\n continue;\n }\n if (!nodeIdSet.has(from)) errors.push(`edge ${String(e.id)} references missing from node: ${from}`);\n if (!nodeIdSet.has(to)) errors.push(`edge ${String(e.id)} references missing to node: ${to}`);\n }\n\n const starts = nodes.filter((n) => n.type === \"start\");\n const ends = nodes.filter((n) => n.type === \"end\");\n if (!starts.length) warnings.push(\"no start node found\");\n if (starts.length > 1) warnings.push(\"multiple start nodes found (MVP supports this, but execution semantics may be ambiguous)\");\n if (!ends.length) warnings.push(\"no end node found\");\n\n for (const t of triggers) {\n if (t.kind === \"cron\") {\n if (!String(t.id || \"\").trim()) errors.push(\"cron trigger missing id\");\n if (!String(t.expr || \"\").trim()) errors.push(`cron trigger ${String(t.id || \"(missing id)\")} missing expr`);\n else if (!isFiveFieldCron(t.expr)) warnings.push(`cron trigger ${String(t.id)} expr is not 5-field: ${String(t.expr)}`);\n if (t.tz && !String(t.tz).includes(\"/\")) warnings.push(`cron trigger ${String(t.id)} tz doesn't look like an IANA timezone: ${String(t.tz)}`);\n }\n }\n\n return { errors, warnings };\n}\n"],"names":[],"mappings":"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"}