@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,6 +1,9 @@
1
1
  import Link from "next/link";
2
2
  import { getTicketMarkdown } from "@/lib/tickets";
3
3
 
4
+ // Ticket detail should always reflect current stage/file; do not cache.
5
+ export const dynamic = "force-dynamic";
6
+
4
7
  export default async function TicketDetailPage({
5
8
  params,
6
9
  }: {
@@ -1,6 +1,9 @@
1
1
  import { listTickets } from "@/lib/tickets";
2
2
  import { TicketsBoardClient } from "@/app/tickets/TicketsBoardClient";
3
3
 
4
+ // Tickets reflect live filesystem state; do not cache.
5
+ export const dynamic = "force-dynamic";
6
+
4
7
  export default async function TicketsPage() {
5
8
  const tickets = await listTickets();
6
9
  return <TicketsBoardClient tickets={tickets} />;
@@ -1,65 +1,279 @@
1
1
  "use client";
2
2
 
3
3
  import Link from "next/link";
4
- import { usePathname } from "next/navigation";
4
+ import { usePathname, useRouter } from "next/navigation";
5
+ import { useEffect, useMemo, useState } from "react";
5
6
  import { ThemeToggle } from "@/components/ThemeToggle";
6
7
  import { ToastProvider } from "@/components/ToastProvider";
7
8
 
8
- function NavLink({ href, label }: { href: string; label: string }) {
9
- const pathname = usePathname();
10
- const active = pathname === href || (href !== "/" && pathname.startsWith(href));
9
+ function Icon({ children }: { children: React.ReactNode }) {
10
+ return (
11
+ <span
12
+ className="grid size-7 place-items-center text-[color:var(--ck-text-secondary)]"
13
+ aria-hidden
14
+ >
15
+ {children}
16
+ </span>
17
+ );
18
+ }
11
19
 
20
+ function SideNavLink({
21
+ href,
22
+ label,
23
+ icon,
24
+ active,
25
+ collapsed,
26
+ }: {
27
+ href: string;
28
+ label: string;
29
+ icon: React.ReactNode;
30
+ active: boolean;
31
+ collapsed: boolean;
32
+ }) {
12
33
  return (
13
34
  <Link
14
35
  href={href}
36
+ title={label}
15
37
  className={
16
- "rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium transition-colors " +
17
- (active
18
- ? "bg-[var(--ck-accent-red)] text-white"
19
- : "text-[color:var(--ck-text-secondary)] hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]")
38
+ (
39
+ active
40
+ ? "flex items-center rounded-[var(--ck-radius-sm)] bg-white/10 text-sm font-medium text-[color:var(--ck-text-primary)]"
41
+ : "flex items-center rounded-[var(--ck-radius-sm)] text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-white/5 hover:text-[color:var(--ck-text-primary)]"
42
+ ) +
43
+ (collapsed ? " justify-center px-0 py-3" : " gap-4 px-4 py-3")
20
44
  }
21
45
  >
22
- {label}
46
+ {icon}
47
+ {collapsed ? null : <span>{label}</span>}
23
48
  </Link>
24
49
  );
25
50
  }
26
51
 
27
52
  export function AppShell({ children }: { children: React.ReactNode }) {
53
+ const pathname = usePathname() || "/";
54
+ const router = useRouter();
55
+
56
+ const currentTeamId = useMemo(() => {
57
+ const m = pathname.match(/^\/teams\/([^/]+)(?:\/|$)/);
58
+ return m ? decodeURIComponent(m[1]) : null;
59
+ }, [pathname]);
60
+
61
+ const [collapsed, setCollapsed] = useState(() => {
62
+ try {
63
+ const v = localStorage.getItem("ck-leftnav-collapsed");
64
+ return v === "1";
65
+ } catch {
66
+ return false;
67
+ }
68
+ });
69
+
70
+ function toggleCollapsed() {
71
+ setCollapsed((v) => {
72
+ const next = !v;
73
+ try {
74
+ localStorage.setItem("ck-leftnav-collapsed", next ? "1" : "0");
75
+ } catch {
76
+ // ignore
77
+ }
78
+ return next;
79
+ });
80
+ }
81
+
82
+ // Minimal team list (for switcher). We rely on existing /api/recipes.
83
+ const [teamIds, setTeamIds] = useState<string[]>([]);
84
+ useEffect(() => {
85
+ (async () => {
86
+ try {
87
+ const res = await fetch("/api/agents", { cache: "no-store" });
88
+ const json = await res.json();
89
+ const agents = Array.isArray(json.agents)
90
+ ? (json.agents as Array<{ workspace?: string }> )
91
+ : [];
92
+
93
+ const s = new Set<string>();
94
+ for (const a of agents) {
95
+ const ws = String(a.workspace ?? "");
96
+ const parts = ws.split("/").filter(Boolean);
97
+ const wsPart = parts.find((p) => p.startsWith("workspace-")) ?? "";
98
+ if (!wsPart) continue;
99
+ const teamId = wsPart.slice("workspace-".length);
100
+ if (teamId && teamId !== "workspace") s.add(teamId);
101
+ }
102
+
103
+ setTeamIds(Array.from(s).sort());
104
+ } catch {
105
+ setTeamIds([]);
106
+ }
107
+ })();
108
+ }, []);
109
+
110
+ const globalNav = [
111
+ {
112
+ href: `/`,
113
+ label: "Home",
114
+ icon: (
115
+ <Icon>
116
+ <svg viewBox="0 0 24 24" className="h-6 w-6" fill="none" stroke="currentColor" strokeWidth="2">
117
+ <path d="M3 11l9-8 9 8" />
118
+ <path d="M5 10v10h14V10" />
119
+ </svg>
120
+ </Icon>
121
+ ),
122
+ },
123
+ {
124
+ href: `/recipes`,
125
+ label: "Recipes",
126
+ icon: (
127
+ <Icon>
128
+ <svg viewBox="0 0 24 24" className="h-6 w-6" fill="none" stroke="currentColor" strokeWidth="2">
129
+ <path d="M6 4h12v16H6z" />
130
+ <path d="M9 8h6" />
131
+ <path d="M9 12h6" />
132
+ </svg>
133
+ </Icon>
134
+ ),
135
+ },
136
+ {
137
+ href: `/tickets`,
138
+ label: "Tickets",
139
+ icon: (
140
+ <Icon>
141
+ <svg viewBox="0 0 24 24" className="h-6 w-6" fill="none" stroke="currentColor" strokeWidth="2">
142
+ <path d="M4 7h16v4a2 2 0 0 1 0 4v4H4v-4a2 2 0 0 0 0-4z" />
143
+ </svg>
144
+ </Icon>
145
+ ),
146
+ },
147
+ {
148
+ href: `/goals`,
149
+ label: "Goals",
150
+ icon: (
151
+ <Icon>
152
+ <svg viewBox="0 0 24 24" className="h-6 w-6" fill="none" stroke="currentColor" strokeWidth="2">
153
+ <circle cx="12" cy="12" r="9" />
154
+ <path d="M12 7v5l3 3" />
155
+ </svg>
156
+ </Icon>
157
+ ),
158
+ },
159
+ {
160
+ href: `/cron-jobs`,
161
+ label: "Cron jobs",
162
+ icon: (
163
+ <Icon>
164
+ <svg viewBox="0 0 24 24" className="h-6 w-6" fill="none" stroke="currentColor" strokeWidth="2">
165
+ <circle cx="12" cy="12" r="9" />
166
+ <path d="M12 7v5" />
167
+ </svg>
168
+ </Icon>
169
+ ),
170
+ },
171
+ {
172
+ href: `/settings`,
173
+ label: "Settings",
174
+ icon: (
175
+ <Icon>
176
+ <svg viewBox="0 0 24 24" className="h-6 w-6" fill="none" stroke="currentColor" strokeWidth="2">
177
+ <path d="M12 15.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7Z" />
178
+ <path d="M19.4 15a7.9 7.9 0 0 0 .1-1l2-1.5-2-3.5-2.4.5a7.8 7.8 0 0 0-1.7-1L13.5 3h-4L8.6 6.5a7.8 7.8 0 0 0-1.7 1L4.5 7l-2 3.5 2 1.5a7.9 7.9 0 0 0 .1 1l-2 1.5 2 3.5 2.4-.5a7.8 7.8 0 0 0 1.7 1L10.5 21h4l.9-3.5a7.8 7.8 0 0 0 1.7-1l2.4.5 2-3.5-2-1.5Z" />
179
+ </svg>
180
+ </Icon>
181
+ ),
182
+ },
183
+ ];
184
+
185
+ const sideWidth = collapsed ? "w-16" : "w-72";
186
+
28
187
  return (
29
188
  <ToastProvider>
30
- <div className="min-h-screen">
31
- <header className="sticky top-0 z-50 border-b border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] backdrop-blur-[var(--ck-glass-blur)]">
32
- <div className="mx-auto flex max-w-6xl items-center justify-between gap-4 px-4 py-3">
33
- <div className="flex items-center gap-3">
34
- <Link href="/" className="text-sm font-semibold tracking-tight">
35
- Claw Kitchen
189
+ <div className="flex h-dvh w-dvw overflow-hidden">
190
+ <aside className={`flex shrink-0 flex-col border-r border-[color:var(--ck-border-subtle)] bg-[color:var(--ck-bg-glass)] backdrop-blur-[var(--ck-glass-blur)] ${sideWidth}`}>
191
+ <div className="flex h-14 items-center justify-between gap-2 border-b border-[color:var(--ck-border-subtle)] px-3">
192
+ <Link href="/" className="text-sm font-semibold tracking-tight" title="Home">
193
+ {collapsed ? "CK" : "Claw Kitchen"}
36
194
  </Link>
37
- <nav className="hidden items-center gap-1 sm:flex">
38
- <NavLink href="/recipes" label="Recipes" />
39
- <NavLink href="/tickets" label="Tickets" />
40
- <NavLink href="/goals" label="Goals" />
41
- {/* Channels hidden for release */}
42
- <NavLink href="/cron-jobs" label="Cron jobs" />
43
- <NavLink href="/settings" label="Settings" />
44
- </nav>
195
+ <button
196
+ onClick={toggleCollapsed}
197
+ className="rounded-[var(--ck-radius-sm)] px-2 py-1 text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5 hover:text-[color:var(--ck-text-primary)]"
198
+ title={collapsed ? "Expand" : "Collapse"}
199
+ >
200
+ {collapsed ? "»" : "«"}
201
+ </button>
45
202
  </div>
46
203
 
47
- <div className="flex items-center gap-2">
204
+ <div className="border-b border-[color:var(--ck-border-subtle)] p-2">
205
+ {collapsed ? (
206
+ <button
207
+ className="w-full rounded-[var(--ck-radius-sm)] bg-white/5 px-2 py-2 text-xs font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/10"
208
+ title={currentTeamId ? `Team: ${currentTeamId}` : "Select team"}
209
+ onClick={() => {
210
+ if (teamIds[0]) router.push(`/teams/${encodeURIComponent(teamIds[0])}`);
211
+ }}
212
+ >
213
+ 👥
214
+ </button>
215
+ ) : (
216
+ <div className="flex flex-col gap-1">
217
+ <div className="px-2 pt-1 text-xs font-semibold uppercase tracking-wide text-[color:var(--ck-text-tertiary)]">
218
+ Team
219
+ </div>
220
+ <select
221
+ value={currentTeamId ?? ""}
222
+ onChange={(e) => {
223
+ const id = e.target.value;
224
+ if (id) router.push(`/teams/${encodeURIComponent(id)}`);
225
+ }}
226
+ className="w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/25 px-2 py-2 text-sm text-[color:var(--ck-text-primary)]"
227
+ >
228
+ <option value="">(select)</option>
229
+ {teamIds.map((id) => (
230
+ <option key={id} value={id}>
231
+ {id}
232
+ </option>
233
+ ))}
234
+ </select>
235
+ </div>
236
+ )}
237
+ </div>
238
+
239
+ <nav className="min-h-0 flex-1 overflow-auto p-2">
240
+ <div className={collapsed ? "mt-2 px-2 pb-2 pt-2" : "mt-2 px-2 pb-2 pt-2"}>
241
+ {/* section label intentionally omitted */}
242
+ </div>
243
+ {globalNav.map((it) => (
244
+ <SideNavLink
245
+ key={it.href}
246
+ href={it.href}
247
+ label={it.label}
248
+ icon={<span aria-hidden>{it.icon}</span>}
249
+ collapsed={collapsed}
250
+ active={pathname === it.href || pathname.startsWith(it.href + "/")}
251
+ />
252
+ ))}
253
+ </nav>
254
+
255
+ <div className="flex items-center justify-between gap-2 border-t border-[color:var(--ck-border-subtle)] p-2">
48
256
  <a
49
257
  href="https://github.com/JIGGAI/ClawRecipes/tree/main/docs"
50
258
  target="_blank"
51
259
  rel="noreferrer"
52
- className="rounded-[var(--ck-radius-sm)] px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-secondary)] transition-colors hover:bg-[color:var(--ck-bg-glass)] hover:text-[color:var(--ck-text-primary)]"
260
+ className={
261
+ collapsed
262
+ ? "mx-auto rounded-[var(--ck-radius-sm)] px-2 py-2 text-sm text-[color:var(--ck-text-secondary)] hover:bg-white/5 hover:text-[color:var(--ck-text-primary)]"
263
+ : "rounded-[var(--ck-radius-sm)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-secondary)] hover:bg-white/5 hover:text-[color:var(--ck-text-primary)]"
264
+ }
265
+ title="Docs"
53
266
  >
54
- Docs
267
+ {collapsed ? "📖" : "Docs"}
55
268
  </a>
56
- <ThemeToggle />
269
+ {collapsed ? null : <ThemeToggle />}
57
270
  </div>
58
- </div>
59
- </header>
271
+ </aside>
60
272
 
61
- <main className="mx-auto max-w-6xl px-4 py-8">{children}</main>
62
- </div>
273
+ <div className="min-w-0 flex-1">
274
+ <main className="h-full overflow-auto p-4 md:p-6">{children}</main>
275
+ </div>
276
+ </div>
63
277
  </ToastProvider>
64
278
  );
65
279
  }
@@ -0,0 +1,11 @@
1
+ This folder contains the (early) file-first workflow model for ClawKitchen's Visual Workflows MVP.
2
+
3
+ Source of truth lives in each team workspace:
4
+
5
+ - shared-context/workflows/<id>.workflow.json
6
+
7
+ API (temporary):
8
+
9
+ - GET /api/teams/workflows?teamId=... (list)
10
+ - GET /api/teams/workflows?teamId=...&id=... (read)
11
+ - POST /api/teams/workflows { teamId, workflow } (write)
@@ -0,0 +1,71 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getTeamWorkspaceDir } from "@/lib/paths";
4
+ import { assertSafeWorkflowId } from "@/lib/workflows/storage";
5
+ import type { WorkflowRunFileV1 } from "@/lib/workflows/runs-types";
6
+
7
+ const RUNS_DIR = path.join("shared-context", "workflow-runs");
8
+
9
+ export function assertSafeRunId(runId: string) {
10
+ const id = String(runId ?? "").trim();
11
+ if (!id) throw new Error("run id is required");
12
+ if (!/^[a-z0-9][a-z0-9-]{0,80}$/.test(id)) {
13
+ throw new Error("Invalid run id. Use lowercase letters, numbers, and dashes (max 81 chars).");
14
+ }
15
+ return id;
16
+ }
17
+
18
+ export async function getWorkflowRunsDir(teamId: string, workflowId: string) {
19
+ const wfId = assertSafeWorkflowId(workflowId);
20
+ const teamDir = await getTeamWorkspaceDir(teamId);
21
+ return path.join(teamDir, RUNS_DIR, wfId);
22
+ }
23
+
24
+ export function workflowRunFileName(runId: string) {
25
+ return `${runId}.run.json`;
26
+ }
27
+
28
+ export async function listWorkflowRuns(teamId: string, workflowId: string) {
29
+ const dir = await getWorkflowRunsDir(teamId, workflowId);
30
+ try {
31
+ const entries = await fs.readdir(dir, { withFileTypes: true });
32
+ const files = entries
33
+ .filter((e) => e.isFile() && e.name.endsWith(".run.json"))
34
+ .map((e) => e.name)
35
+ .sort()
36
+ .reverse();
37
+ return { ok: true as const, dir, files };
38
+ } catch (err: unknown) {
39
+ if (err && typeof err === "object" && (err as { code?: unknown }).code === "ENOENT") {
40
+ return { ok: true as const, dir, files: [] as string[] };
41
+ }
42
+ throw err;
43
+ }
44
+ }
45
+
46
+ export async function readWorkflowRun(teamId: string, workflowId: string, runId: string) {
47
+ const wfId = assertSafeWorkflowId(workflowId);
48
+ const rId = assertSafeRunId(runId);
49
+ const dir = await getWorkflowRunsDir(teamId, wfId);
50
+ const p = path.join(dir, workflowRunFileName(rId));
51
+ const raw = await fs.readFile(p, "utf8");
52
+ const parsed = JSON.parse(raw) as WorkflowRunFileV1;
53
+ return { ok: true as const, path: p, run: parsed };
54
+ }
55
+
56
+ export async function writeWorkflowRun(teamId: string, workflowId: string, run: WorkflowRunFileV1) {
57
+ const wfId = assertSafeWorkflowId(workflowId);
58
+ const rId = assertSafeRunId(run.id);
59
+ const dir = await getWorkflowRunsDir(teamId, wfId);
60
+ await fs.mkdir(dir, { recursive: true });
61
+ const p = path.join(dir, workflowRunFileName(rId));
62
+ const toWrite: WorkflowRunFileV1 = {
63
+ ...run,
64
+ schema: "clawkitchen.workflow-run.v1",
65
+ id: rId,
66
+ workflowId: wfId,
67
+ teamId,
68
+ };
69
+ await fs.writeFile(p, JSON.stringify(toWrite, null, 2) + "\n", "utf8");
70
+ return { ok: true as const, path: p };
71
+ }
@@ -0,0 +1,32 @@
1
+ export type WorkflowRunNodeResultV1 = {
2
+ nodeId: string;
3
+ status: "pending" | "running" | "waiting" | "success" | "error" | "skipped";
4
+ startedAt?: string;
5
+ endedAt?: string;
6
+ output?: unknown;
7
+ error?: { message: string; stack?: string } | string;
8
+ };
9
+
10
+ export type WorkflowRunApprovalV1 = {
11
+ nodeId: string;
12
+ state: "pending" | "approved" | "changes_requested" | "canceled";
13
+ requestedAt?: string;
14
+ decidedAt?: string;
15
+ /** Freeform notes from the approver (optional) */
16
+ note?: string;
17
+ };
18
+
19
+ export type WorkflowRunFileV1 = {
20
+ schema: "clawkitchen.workflow-run.v1";
21
+ id: string;
22
+ workflowId: string;
23
+ teamId?: string;
24
+ startedAt: string;
25
+ endedAt?: string;
26
+ status: "running" | "waiting_for_approval" | "success" | "error" | "canceled";
27
+ /** Optional high-level summary */
28
+ summary?: string;
29
+ nodes?: WorkflowRunNodeResultV1[];
30
+ approval?: WorkflowRunApprovalV1;
31
+ meta?: Record<string, unknown>;
32
+ };
@@ -0,0 +1,82 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { getTeamWorkspaceDir } from "@/lib/paths";
4
+ import type { WorkflowFileV1 } from "@/lib/workflows/types";
5
+
6
+ const WORKFLOWS_DIR = path.join("shared-context", "workflows");
7
+
8
+ export function workflowFileName(workflowId: string) {
9
+ return `${workflowId}.workflow.json`;
10
+ }
11
+
12
+ export function assertSafeWorkflowId(workflowId: string) {
13
+ const id = String(workflowId ?? "").trim();
14
+ if (!id) throw new Error("workflow id is required");
15
+ if (!/^[a-z0-9][a-z0-9-]{0,62}$/.test(id)) {
16
+ throw new Error(
17
+ "Invalid workflow id. Use lowercase letters, numbers, and dashes (max 63 chars), e.g. marketing-cadence-v1"
18
+ );
19
+ }
20
+ return id;
21
+ }
22
+
23
+ export async function getTeamWorkflowsDir(teamId: string) {
24
+ const teamDir = await getTeamWorkspaceDir(teamId);
25
+ return path.join(teamDir, WORKFLOWS_DIR);
26
+ }
27
+
28
+ export async function listWorkflows(teamId: string) {
29
+ const dir = await getTeamWorkflowsDir(teamId);
30
+ try {
31
+ const entries = await fs.readdir(dir, { withFileTypes: true });
32
+ const files = entries
33
+ .filter((e) => e.isFile() && e.name.endsWith(".workflow.json"))
34
+ .map((e) => e.name)
35
+ .sort();
36
+
37
+ return { ok: true as const, dir, files };
38
+ } catch (err: unknown) {
39
+ if (err && typeof err === "object" && (err as { code?: unknown }).code === "ENOENT") {
40
+ return { ok: true as const, dir, files: [] as string[] };
41
+ }
42
+ throw err;
43
+ }
44
+ }
45
+
46
+ export async function readWorkflow(teamId: string, workflowId: string) {
47
+ const id = assertSafeWorkflowId(workflowId);
48
+ const dir = await getTeamWorkflowsDir(teamId);
49
+ const p = path.join(dir, workflowFileName(id));
50
+ const raw = await fs.readFile(p, "utf8");
51
+ const parsed = JSON.parse(raw) as WorkflowFileV1;
52
+ return { ok: true as const, path: p, workflow: parsed };
53
+ }
54
+
55
+ export async function writeWorkflow(teamId: string, workflow: WorkflowFileV1) {
56
+ const id = assertSafeWorkflowId(workflow.id);
57
+ const dir = await getTeamWorkflowsDir(teamId);
58
+ await fs.mkdir(dir, { recursive: true });
59
+ const p = path.join(dir, workflowFileName(id));
60
+ const toWrite: WorkflowFileV1 = {
61
+ ...workflow,
62
+ schema: "clawkitchen.workflow.v1",
63
+ id,
64
+ };
65
+ await fs.writeFile(p, JSON.stringify(toWrite, null, 2) + "\n", "utf8");
66
+ return { ok: true as const, path: p };
67
+ }
68
+
69
+ export async function deleteWorkflow(teamId: string, workflowId: string) {
70
+ const id = assertSafeWorkflowId(workflowId);
71
+ const dir = await getTeamWorkflowsDir(teamId);
72
+ const p = path.join(dir, workflowFileName(id));
73
+ try {
74
+ await fs.unlink(p);
75
+ } catch (err: unknown) {
76
+ if (err && typeof err === "object" && (err as { code?: unknown }).code === "ENOENT") {
77
+ return { ok: true as const, path: p, existed: false as const };
78
+ }
79
+ throw err;
80
+ }
81
+ return { ok: true as const, path: p, existed: true as const };
82
+ }
@@ -0,0 +1,50 @@
1
+ export type WorkflowTriggerCronV1 = {
2
+ kind: "cron";
3
+ id: string;
4
+ name?: string;
5
+ enabled?: boolean;
6
+ /** Standard 5-field cron expression */
7
+ expr: string;
8
+ /** IANA timezone, e.g. America/New_York */
9
+ tz?: string;
10
+ };
11
+
12
+ export type WorkflowTriggerV1 = WorkflowTriggerCronV1;
13
+
14
+ export type WorkflowNodeV1 = {
15
+ id: string;
16
+ type:
17
+ | "start"
18
+ | "end"
19
+ | "llm"
20
+ | "tool"
21
+ | "condition"
22
+ | "delay"
23
+ | "human_approval";
24
+ name?: string;
25
+ /** UI layout hints (optional) */
26
+ x?: number;
27
+ y?: number;
28
+ /** Node-type-specific config */
29
+ config?: Record<string, unknown>;
30
+ };
31
+
32
+ export type WorkflowEdgeV1 = {
33
+ id: string;
34
+ from: string;
35
+ to: string;
36
+ /** Optional edge label/condition */
37
+ label?: string;
38
+ };
39
+
40
+ export type WorkflowFileV1 = {
41
+ schema: "clawkitchen.workflow.v1";
42
+ id: string;
43
+ name: string;
44
+ version?: number;
45
+ timezone?: string;
46
+ triggers?: WorkflowTriggerV1[];
47
+ nodes: WorkflowNodeV1[];
48
+ edges: WorkflowEdgeV1[];
49
+ meta?: Record<string, unknown>;
50
+ };
@@ -0,0 +1,70 @@
1
+ import type { WorkflowEdgeV1, WorkflowFileV1, WorkflowNodeV1, WorkflowTriggerV1 } from "@/lib/workflows/types";
2
+
3
+ export type WorkflowValidationResult = {
4
+ errors: string[];
5
+ warnings: string[];
6
+ };
7
+
8
+ function isFiveFieldCron(expr: string) {
9
+ const parts = String(expr || "")
10
+ .trim()
11
+ .split(/\s+/)
12
+ .filter(Boolean);
13
+ return parts.length === 5;
14
+ }
15
+
16
+ function uniqCount(values: string[]) {
17
+ const set = new Set<string>();
18
+ for (const v of values) set.add(v);
19
+ return set.size;
20
+ }
21
+
22
+ export function validateWorkflowFileV1(wf: WorkflowFileV1): WorkflowValidationResult {
23
+ const errors: string[] = [];
24
+ const warnings: string[] = [];
25
+
26
+ if (wf.schema !== "clawkitchen.workflow.v1") errors.push(`schema must be clawkitchen.workflow.v1 (got ${String(wf.schema)})`);
27
+ if (!String(wf.id || "").trim()) errors.push("id is required");
28
+ if (!String(wf.name || "").trim()) errors.push("name is required");
29
+
30
+ const nodes: WorkflowNodeV1[] = Array.isArray(wf.nodes) ? wf.nodes : [];
31
+ const edges: WorkflowEdgeV1[] = Array.isArray(wf.edges) ? wf.edges : [];
32
+ const triggers: WorkflowTriggerV1[] = Array.isArray(wf.triggers) ? wf.triggers : [];
33
+
34
+ const nodeIds = nodes.map((n) => String(n?.id ?? "").trim()).filter(Boolean);
35
+ if (nodeIds.length !== nodes.length) errors.push("all nodes must have a non-empty id");
36
+ if (uniqCount(nodeIds) !== nodeIds.length) errors.push("node ids must be unique");
37
+
38
+ const edgeIds = edges.map((e) => String(e?.id ?? "").trim()).filter(Boolean);
39
+ if (edgeIds.length !== edges.length) errors.push("all edges must have a non-empty id");
40
+ if (uniqCount(edgeIds) !== edgeIds.length) errors.push("edge ids must be unique");
41
+
42
+ const nodeIdSet = new Set(nodeIds);
43
+ for (const e of edges) {
44
+ const from = String(e?.from ?? "").trim();
45
+ const to = String(e?.to ?? "").trim();
46
+ if (!from || !to) {
47
+ errors.push(`edge ${String(e?.id ?? "(missing id)")} must have from/to`);
48
+ continue;
49
+ }
50
+ if (!nodeIdSet.has(from)) errors.push(`edge ${String(e.id)} references missing from node: ${from}`);
51
+ if (!nodeIdSet.has(to)) errors.push(`edge ${String(e.id)} references missing to node: ${to}`);
52
+ }
53
+
54
+ const starts = nodes.filter((n) => n.type === "start");
55
+ const ends = nodes.filter((n) => n.type === "end");
56
+ if (!starts.length) warnings.push("no start node found");
57
+ if (starts.length > 1) warnings.push("multiple start nodes found (MVP supports this, but execution semantics may be ambiguous)");
58
+ if (!ends.length) warnings.push("no end node found");
59
+
60
+ for (const t of triggers) {
61
+ if (t.kind === "cron") {
62
+ if (!String(t.id || "").trim()) errors.push("cron trigger missing id");
63
+ if (!String(t.expr || "").trim()) errors.push(`cron trigger ${String(t.id || "(missing id)")} missing expr`);
64
+ else if (!isFiveFieldCron(t.expr)) warnings.push(`cron trigger ${String(t.id)} expr is not 5-field: ${String(t.expr)}`);
65
+ 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)}`);
66
+ }
67
+ }
68
+
69
+ return { errors, warnings };
70
+ }