@jiggai/kitchen 0.3.16 → 0.3.17

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 (161) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +2 -2
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/app/_global-error.html +2 -2
  5. package/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/_not-found.html +1 -1
  13. package/.next/server/app/_not-found.rsc +3 -3
  14. package/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  15. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/server/app/agents/[agentId]/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/channels/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/channels.html +2 -2
  23. package/.next/server/app/channels.rsc +3 -3
  24. package/.next/server/app/channels.segments/_full.segment.rsc +3 -3
  25. package/.next/server/app/channels.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/channels.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/channels.segments/_tree.segment.rsc +2 -2
  28. package/.next/server/app/channels.segments/channels/__PAGE__.segment.rsc +1 -1
  29. package/.next/server/app/channels.segments/channels.segment.rsc +1 -1
  30. package/.next/server/app/cron-jobs/page_client-reference-manifest.js +1 -1
  31. package/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  32. package/.next/server/app/goals/new/page_client-reference-manifest.js +1 -1
  33. package/.next/server/app/goals/new.html +2 -2
  34. package/.next/server/app/goals/new.rsc +3 -3
  35. package/.next/server/app/goals/new.segments/_full.segment.rsc +3 -3
  36. package/.next/server/app/goals/new.segments/_head.segment.rsc +1 -1
  37. package/.next/server/app/goals/new.segments/_index.segment.rsc +2 -2
  38. package/.next/server/app/goals/new.segments/_tree.segment.rsc +2 -2
  39. package/.next/server/app/goals/new.segments/goals/new/__PAGE__.segment.rsc +1 -1
  40. package/.next/server/app/goals/new.segments/goals/new.segment.rsc +1 -1
  41. package/.next/server/app/goals/new.segments/goals.segment.rsc +1 -1
  42. package/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  43. package/.next/server/app/goals.html +1 -1
  44. package/.next/server/app/goals.rsc +3 -3
  45. package/.next/server/app/goals.segments/_full.segment.rsc +3 -3
  46. package/.next/server/app/goals.segments/_head.segment.rsc +1 -1
  47. package/.next/server/app/goals.segments/_index.segment.rsc +2 -2
  48. package/.next/server/app/goals.segments/_tree.segment.rsc +2 -2
  49. package/.next/server/app/goals.segments/goals/__PAGE__.segment.rsc +1 -1
  50. package/.next/server/app/goals.segments/goals.segment.rsc +1 -1
  51. package/.next/server/app/page_client-reference-manifest.js +1 -1
  52. package/.next/server/app/recipes/[id]/page_client-reference-manifest.js +1 -1
  53. package/.next/server/app/recipes/page_client-reference-manifest.js +1 -1
  54. package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
  55. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  56. package/.next/server/app/settings.html +1 -1
  57. package/.next/server/app/settings.rsc +3 -3
  58. package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
  59. package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  60. package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
  61. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  63. package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  64. package/.next/server/app/teams/[teamId]/page_client-reference-manifest.js +1 -1
  65. package/.next/server/app/teams/[teamId]/runs/[workflowId]/[runId]/page_client-reference-manifest.js +1 -1
  66. package/.next/server/app/teams/[teamId]/runs/page_client-reference-manifest.js +1 -1
  67. package/.next/server/app/teams/[teamId]/tickets/[ticket]/page_client-reference-manifest.js +1 -1
  68. package/.next/server/app/teams/[teamId]/tickets/page_client-reference-manifest.js +1 -1
  69. package/.next/server/app/teams/[teamId]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
  70. package/.next/server/app/teams/[teamId]/workflows/page_client-reference-manifest.js +1 -1
  71. package/.next/server/app/tickets/[ticket]/page_client-reference-manifest.js +1 -1
  72. package/.next/server/app/tickets/page_client-reference-manifest.js +1 -1
  73. package/.next/server/chunks/[root-of-the-server]__01863a8b._.js +1 -1
  74. package/.next/server/chunks/[root-of-the-server]__01863a8b._.js.map +1 -1
  75. package/.next/server/chunks/[root-of-the-server]__04f289da._.js +1 -1
  76. package/.next/server/chunks/[root-of-the-server]__04f289da._.js.map +1 -1
  77. package/.next/server/chunks/[root-of-the-server]__08b4c8f2._.js +1 -1
  78. package/.next/server/chunks/[root-of-the-server]__08b4c8f2._.js.map +1 -1
  79. package/.next/server/chunks/[root-of-the-server]__0c4fc3d3._.js +1 -1
  80. package/.next/server/chunks/[root-of-the-server]__0c4fc3d3._.js.map +1 -1
  81. package/.next/server/chunks/[root-of-the-server]__1311d7a3._.js +1 -1
  82. package/.next/server/chunks/[root-of-the-server]__1311d7a3._.js.map +1 -1
  83. package/.next/server/chunks/[root-of-the-server]__18423bab._.js +1 -1
  84. package/.next/server/chunks/[root-of-the-server]__18423bab._.js.map +1 -1
  85. package/.next/server/chunks/[root-of-the-server]__1c6c2e43._.js +1 -1
  86. package/.next/server/chunks/[root-of-the-server]__1c6c2e43._.js.map +1 -1
  87. package/.next/server/chunks/[root-of-the-server]__30cd38e9._.js +1 -1
  88. package/.next/server/chunks/[root-of-the-server]__30cd38e9._.js.map +1 -1
  89. package/.next/server/chunks/[root-of-the-server]__3cfdf0b3._.js +2 -2
  90. package/.next/server/chunks/[root-of-the-server]__3cfdf0b3._.js.map +1 -1
  91. package/.next/server/chunks/[root-of-the-server]__3fdbc43e._.js +1 -1
  92. package/.next/server/chunks/[root-of-the-server]__3fdbc43e._.js.map +1 -1
  93. package/.next/server/chunks/[root-of-the-server]__4079fa2b._.js +1 -1
  94. package/.next/server/chunks/[root-of-the-server]__4079fa2b._.js.map +1 -1
  95. package/.next/server/chunks/[root-of-the-server]__453333f5._.js +1 -1
  96. package/.next/server/chunks/[root-of-the-server]__453333f5._.js.map +1 -1
  97. package/.next/server/chunks/[root-of-the-server]__502825d0._.js +2 -2
  98. package/.next/server/chunks/[root-of-the-server]__502825d0._.js.map +1 -1
  99. package/.next/server/chunks/[root-of-the-server]__50fe6ff8._.js +1 -1
  100. package/.next/server/chunks/[root-of-the-server]__50fe6ff8._.js.map +1 -1
  101. package/.next/server/chunks/[root-of-the-server]__51198e25._.js +1 -1
  102. package/.next/server/chunks/[root-of-the-server]__51198e25._.js.map +1 -1
  103. package/.next/server/chunks/[root-of-the-server]__542a081b._.js +1 -1
  104. package/.next/server/chunks/[root-of-the-server]__542a081b._.js.map +1 -1
  105. package/.next/server/chunks/[root-of-the-server]__5ceff0f3._.js +3 -3
  106. package/.next/server/chunks/[root-of-the-server]__5ceff0f3._.js.map +1 -1
  107. package/.next/server/chunks/[root-of-the-server]__63715de8._.js +1 -1
  108. package/.next/server/chunks/[root-of-the-server]__63715de8._.js.map +1 -1
  109. package/.next/server/chunks/[root-of-the-server]__69c45937._.js +1 -1
  110. package/.next/server/chunks/[root-of-the-server]__69c45937._.js.map +1 -1
  111. package/.next/server/chunks/[root-of-the-server]__6caa8f2d._.js +1 -1
  112. package/.next/server/chunks/[root-of-the-server]__6caa8f2d._.js.map +1 -1
  113. package/.next/server/chunks/[root-of-the-server]__6f4e90a0._.js +1 -1
  114. package/.next/server/chunks/[root-of-the-server]__6f4e90a0._.js.map +1 -1
  115. package/.next/server/chunks/[root-of-the-server]__7459129e._.js +1 -1
  116. package/.next/server/chunks/[root-of-the-server]__7459129e._.js.map +1 -1
  117. package/.next/server/chunks/[root-of-the-server]__7bf889c1._.js +1 -1
  118. package/.next/server/chunks/[root-of-the-server]__7bf889c1._.js.map +1 -1
  119. package/.next/server/chunks/[root-of-the-server]__89605574._.js +1 -1
  120. package/.next/server/chunks/[root-of-the-server]__89605574._.js.map +1 -1
  121. package/.next/server/chunks/[root-of-the-server]__99b12bcb._.js +1 -1
  122. package/.next/server/chunks/[root-of-the-server]__99b12bcb._.js.map +1 -1
  123. package/.next/server/chunks/[root-of-the-server]__9d0ea07b._.js +1 -1
  124. package/.next/server/chunks/[root-of-the-server]__9d0ea07b._.js.map +1 -1
  125. package/.next/server/chunks/[root-of-the-server]__a49c534d._.js +1 -1
  126. package/.next/server/chunks/[root-of-the-server]__a49c534d._.js.map +1 -1
  127. package/.next/server/chunks/[root-of-the-server]__a74a32d5._.js +1 -1
  128. package/.next/server/chunks/[root-of-the-server]__a74a32d5._.js.map +1 -1
  129. package/.next/server/chunks/[root-of-the-server]__b64936a3._.js +1 -1
  130. package/.next/server/chunks/[root-of-the-server]__b64936a3._.js.map +1 -1
  131. package/.next/server/chunks/[root-of-the-server]__bbdb6dcb._.js +1 -1
  132. package/.next/server/chunks/[root-of-the-server]__bbdb6dcb._.js.map +1 -1
  133. package/.next/server/chunks/[root-of-the-server]__bccfb2c0._.js +2 -2
  134. package/.next/server/chunks/[root-of-the-server]__bccfb2c0._.js.map +1 -1
  135. package/.next/server/chunks/[root-of-the-server]__c5e88cbb._.js +1 -1
  136. package/.next/server/chunks/[root-of-the-server]__c5e88cbb._.js.map +1 -1
  137. package/.next/server/chunks/[root-of-the-server]__e063a986._.js +1 -1
  138. package/.next/server/chunks/[root-of-the-server]__e063a986._.js.map +1 -1
  139. package/.next/server/chunks/[root-of-the-server]__e478ef0d._.js +1 -1
  140. package/.next/server/chunks/[root-of-the-server]__e478ef0d._.js.map +1 -1
  141. package/.next/server/chunks/[root-of-the-server]__f4cbadf7._.js +1 -1
  142. package/.next/server/chunks/[root-of-the-server]__f4cbadf7._.js.map +1 -1
  143. package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js +1 -1
  144. package/.next/server/chunks/ssr/[root-of-the-server]__3b880807._.js.map +1 -1
  145. package/.next/server/chunks/ssr/_7f9e89d2._.js +1 -1
  146. package/.next/server/chunks/ssr/_7f9e89d2._.js.map +1 -1
  147. package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js +1 -1
  148. package/.next/server/chunks/ssr/src_app_recipes_recipes-client_tsx_8ed3ca94._.js.map +1 -1
  149. package/.next/server/pages/404.html +1 -1
  150. package/.next/server/pages/500.html +2 -2
  151. package/.next/server/server-reference-manifest.js +1 -1
  152. package/.next/server/server-reference-manifest.json +1 -1
  153. package/.next/static/chunks/33959503ed1ef5fe.css +3 -0
  154. package/.next/static/chunks/36aff6bd42d53c8b.js +1 -0
  155. package/openclaw.plugin.json +1 -1
  156. package/package.json +1 -1
  157. package/.next/static/chunks/3e0d3a43014c0ad2.css +0 -3
  158. package/.next/static/chunks/71909f2b1564bbfb.js +0 -1
  159. /package/.next/static/{iyJZclE058TbSPEFRavWV → -0ZAePVAM1TIGWT4ylsMD}/_buildManifest.js +0 -0
  160. /package/.next/static/{iyJZclE058TbSPEFRavWV → -0ZAePVAM1TIGWT4ylsMD}/_clientMiddlewareManifest.json +0 -0
  161. /package/.next/static/{iyJZclE058TbSPEFRavWV → -0ZAePVAM1TIGWT4ylsMD}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[55408,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(50944),e=a.i(72131),f=a.i(35112);let g={1:"Ordering team…",2:"Cooking up agents…",3:"Serving them up hot…"};function h({open:a,step:c,onDismiss:d}){return a?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none"}),d?(0,b.jsx)("button",{type:"button",onClick:a=>{a.preventDefault(),a.stopPropagation(),d()},className:"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-glass-strong)]","aria-label":"Dismiss loading overlay",title:"Dismiss",children:"Esc"}):null,(0,b.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,b.jsxs)("div",{className:"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-2xl font-semibold text-[color:var(--ck-text-primary)]",children:"Claw Kitchen"}),(0,b.jsx)("div",{className:"mt-3 text-base text-[color:var(--ck-text-secondary)]",children:"Hang tight — we’re updating your OpenClaw install."}),(0,b.jsx)("div",{className:"mt-8 space-y-4 text-base",children:[1,2,3].map(a=>{let d=a===c,e=a<c;return(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)("div",{className:"h-4 w-4 rounded-full "+(e?"bg-emerald-400":d?"bg-[var(--ck-accent-red)] animate-pulse":"bg-white/20")}),(0,b.jsx)("div",{className:e?"text-[color:var(--ck-text-secondary)] line-through":"text-[color:var(--ck-text-primary)]",children:g[a]})]},a)})})]})})]}),document.body):null}var i=a.i(51200);async function j(a,b){let c=b.intervalMs??500,d=Date.now();for(;Date.now()-d<b.timeoutMs;){let b=await a();if(null!==b)return b;await new Promise(a=>setTimeout(a,c))}return null}var k=a.i(56635),l=a.i(61889),m=a.i(40211);function n(a){let{open:b,name:c,setName:d,id:f,setId:g,idTouched:h,setIdTouched:i,slugify:j=m.slugifyId}=a,k=(0,e.useMemo)(()=>j(c),[c,j]),l=h?f:k;return(0,e.useEffect)(()=>{b&&(h||g(k))},[k,b,h,g]),(0,e.useEffect)(()=>{b||(i(!1),d(""),g(""))},[b,i,d,g]),{derivedId:k,effectiveId:l}}var o=a.i(66063);function p({open:a,title:c,recipeId:d,recipeName:e,children:f,error:g,busy:h,canConfirm:i,onClose:j,onConfirm:k,confirmLabel:l}){return(0,b.jsxs)(o.ConfirmationModal,{open:a,onClose:j,title:c,error:g,confirmLabel:l,confirmBusyLabel:"Creating…",confirmDisabled:!i,busy:h,onConfirm:k,children:[(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new ",c.toLowerCase().replace("create ","")," from recipe"," ",(0,b.jsx)("code",{className:"font-mono",children:d}),e?(0,b.jsxs)(b.Fragment,{children:[" ","(",(0,b.jsx)("span",{className:"font-medium",children:e}),")"]}):null,"."]}),f]})}function q({open:a,recipeId:c,recipeName:d,teamId:f,setTeamId:g,installCron:h,setInstallCron:i,busy:j,error:k,onClose:l,onConfirm:m}){let[o,q]=(0,e.useState)(""),[r,s]=(0,e.useState)(!1),{effectiveId:t}=n({open:a,name:o,setName:q,id:f,setId:g,idTouched:r,setIdTouched:s});return(0,b.jsxs)(p,{open:a,title:"Create team",recipeId:c,recipeName:d,error:k,busy:j,canConfirm:!!t.trim(),onClose:l,onConfirm:m,confirmLabel:"Create team",children:[(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team name"}),(0,b.jsx)("input",{value:o,onChange:a=>q(a.target.value),placeholder:"e.g. Crypto Team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,b.jsx)("input",{value:t,onChange:a=>{s(!0),g(a.target.value)},placeholder:"e.g. my-team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config."})]}),(0,b.jsxs)("label",{className:"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:h,onChange:a=>i(a.target.checked)}),"Install cron jobs from this recipe"]})]})}function r(a){return/^[a-z0-9][a-z0-9_-]{1,62}$/.test(a)}function s({open:a,teamId:c,setTeamId:d,busy:f,error:g,onClose:h,onConfirm:j,onRolesChange:k}){let[l,m]=(0,e.useState)([]),[n,o]=(0,e.useState)(null),[q,s]=(0,e.useState)(""),[t,u]=(0,e.useState)({}),[v,w]=(0,e.useState)(null),[x,y]=(0,e.useState)(null),[z,A]=(0,e.useState)(null);(0,e.useEffect)(()=>{let a=!1;return(async()=>{let b=await (0,i.fetchJsonWithStatus)("/api/recipes/local-agent-catalog",{cache:"no-store"});if(!a){if(!b.ok)return o(b.error||"Failed to load local agent catalog");if(!b.data.ok)return o(b.data.error||"Failed to load local agent catalog");m(Array.isArray(b.data.items)?b.data.items:[])}})(),()=>{a=!0}},[]);let[B,C]=(0,e.useState)({state:"unknown"}),D=(0,e.useMemo)(()=>{let a=q.trim().toLowerCase(),b=l.map(a=>{var b;let c;if("team-role"===a.kind){let b=`team:${a.recipeId}:${a.roleId}`,c=a.recipeName||a.recipeId,d=a.roleName?`${a.roleName} (${a.roleId})`:a.roleId;return{id:b,label:`${c} → ${d}`,roleId:a.roleId,displayName:a.roleName||`${c} ${a.roleId}`,haystack:`${a.recipeId} ${a.recipeName||""} ${a.roleId} ${a.roleName||""}`.toLowerCase()}}let d=`agent:${a.recipeId}`,e=a.recipeName||a.recipeId,f=a.description?` — ${a.description}`:"";return{id:d,label:`${e} (agent recipe: ${a.recipeId})${f}`,roleId:((c=(b=a.recipeId).split("/").pop()||b).split("-").slice(-1)[0]||c).toLowerCase().replace(/[^a-z0-9_-]+/g,"-"),displayName:e,haystack:`${a.recipeId} ${a.recipeName||""} ${a.description||""}`.toLowerCase()}});return(a?b.filter(b=>b.haystack.includes(a)):b).slice().sort((a,b)=>a.label.localeCompare(b.label)).map(({haystack:a,...b})=>b)},[l,q]),E=(0,e.useMemo)(()=>Object.values(t),[t]),F=c.trim(),G=(0,e.useMemo)(()=>a?F?r(F)?F.endsWith("-team")?"taken"===B.state?`Team id is already taken: ${F}`:null:"Team id must end with -team.":"Invalid team id. Use lowercase letters/numbers with - or _ (2-63 chars).":"Team id is required.":null,[a,F,B.state]),H=(0,e.useMemo)(()=>{let a=new Map;for(let b of E){let c=String(b.roleId??"").trim();if(!c){a.set(b.agentId,"Role id is required.");continue}r(c)||a.set(b.agentId,"Invalid role id (lowercase letters/numbers with - or _).")}return a},[E]),I=!G&&"checking"!==B.state&&"unknown"!==B.state&&E.length>0&&0===H.size;return(0,e.useEffect)(()=>{a&&k(E)},[a,E,k]),(0,e.useEffect)(()=>{if(!a)return;let b=!1,c=setTimeout(async()=>{if(!F||!(r(F)&&F.endsWith("-team")))return void C({state:"unknown"});C({state:"checking"});let a=await (0,i.fetchJsonWithStatus)(`/api/ids/check?kind=team&id=${encodeURIComponent(F)}`,{cache:"no-store"});if(!b){if(!a.ok)return void C({state:"unknown"});if(a.data.ok&&!0===a.data.available)return void C({state:"available"});C({state:"taken",reason:a.data.reason})}},250);return()=>{b=!0,clearTimeout(c)}},[a,F]),(0,e.useEffect)(()=>{if(!a||!I)return;let b=!1,c=setTimeout(async()=>{let a=F.endsWith("-team")?F.slice(0,-5):F,c=await (0,i.fetchJsonWithStatus)("/api/recipes/custom-team",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({dryRun:!0,recipeId:a,teamId:F,roles:E.map(a=>({roleId:a.roleId,displayName:a.displayName}))})});if(!b){if(!c.ok){A(c.error),w(null),y(null);return}if(!c.data.ok){A(c.data.error||"Failed to generate preview"),w(null),y(null);return}A(null),w("string"==typeof c.data.md?c.data.md:null),y("string"==typeof c.data.filePath?c.data.filePath:null)}},250);return()=>{b=!0,clearTimeout(c)}},[a,I,F,E]),(0,b.jsxs)(p,{open:a,title:"Create custom team",recipeId:"(new recipe)",recipeName:"Custom Team",error:g||n,busy:f,canConfirm:I,onClose:h,onConfirm:j,confirmLabel:"Create team",children:[(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,b.jsx)("input",{value:c,onChange:a=>d(a.target.value.toLowerCase().replace(/\s+/g,"-")),placeholder:"e.g. my-team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0}),G?(0,b.jsx)("div",{className:"mt-2 text-xs text-red-300",children:G}):null,!G&&F?(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["checking"===B.state?"Checking availability…":null,"available"===B.state?"Available.":null]}):null]}),(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Select agents"}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"MVP: this creates new team roles that mirror the selected agents' names. You can edit the resulting team recipe later."}),(0,b.jsxs)("div",{className:"mt-3",children:[(0,b.jsx)("input",{value:q,onChange:a=>s(a.target.value),placeholder:"Search local roles/agents (recipe id, name, role)",className:"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"}),(0,b.jsxs)("div",{className:"mt-3 max-h-[220px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3",children:[n?(0,b.jsx)("div",{className:"text-sm text-red-300",children:n}):null,n||0!==D.length?null:(0,b.jsx)("div",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"No local roles/agents found."}),!n&&D.length?(0,b.jsx)("div",{className:"space-y-2",children:D.map(a=>{let c=!!t[a.id];return(0,b.jsxs)("label",{className:"flex items-start gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:c,onChange:b=>{let c={...t};b.target.checked?c[a.id]={agentId:a.id,roleId:a.roleId,displayName:a.displayName}:delete c[a.id],u(c)}}),(0,b.jsx)("span",{className:"min-w-0 break-words",children:a.label})]},a.id)})}):null]})]})]}),E.length?(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Role mapping"}),(0,b.jsx)("div",{className:"mt-3 space-y-3",children:E.map(a=>{let c=H.get(a.agentId);return(0,b.jsxs)("div",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3",children:[(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:a.agentId}),(0,b.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Role id"}),(0,b.jsx)("input",{value:a.roleId,onChange:b=>{u(c=>({...c,[a.agentId]:{...c[a.agentId],roleId:b.target.value}}))},className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),c?(0,b.jsx)("div",{className:"mt-1 text-xs text-red-300",children:c}):null]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Display name"}),(0,b.jsx)("input",{value:a.displayName,onChange:b=>{u(c=>({...c,[a.agentId]:{...c[a.agentId],displayName:b.target.value}}))},className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]})]},a.agentId)})})]}):null,(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Preview"}),(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["Generated recipe preview (best-effort). This is what will be written to",(0,b.jsx)("code",{className:"ml-1",children:"~/.openclaw/workspace/recipes/<teamId>.md"}),"."]}),I&&z?(0,b.jsx)("div",{className:"mt-2 text-xs text-red-300",children:z}):null,I&&x?(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["Target path: ",(0,b.jsx)("code",{children:x})]}):null,(0,b.jsx)("pre",{className:"mt-3 max-h-[260px] overflow-auto whitespace-pre-wrap rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-3 text-xs text-[color:var(--ck-text-secondary)]",children:I?v||"(Loading preview…)":"(Select a valid team id and at least one agent to preview.)"})]})]})}function t({open:a,recipeId:c,recipeName:d,agentId:f,setAgentId:g,agentName:h,setAgentName:j,existingRecipeIds:k,existingAgentIds:l,busy:m,error:o,onClose:q,onConfirm:r}){var s,t;let[u,v]=(0,e.useState)(!1),[w,x]=(0,e.useState)(null),{effectiveId:y}=n({open:a,name:h,setName:j,id:f,setId:g,idTouched:u,setIdTouched:v}),z=String(y??"").trim(),A=(0,e.useMemo)(()=>a?z?k.includes(z)?{state:"taken",reason:"recipe-id-collision"}:l.includes(z)?{state:"taken",reason:"agent-exists"}:null:{state:"empty"}:{state:"empty"},[a,z,k,l]),B=A??w??{state:"available"};return(0,e.useEffect)(()=>{if(!a||null!==A)return;let b=setTimeout(()=>{(async()=>{x({state:"checking"});try{let a=await (0,i.fetchJson)(`/api/ids/check?kind=agent&id=${encodeURIComponent(z)}`,{cache:"no-store"});a.available?x({state:"available"}):x({state:"taken",reason:a.reason})}catch{x({state:"available"})}})()},250);return()=>clearTimeout(b)},[a,A,z]),(0,b.jsxs)(p,{open:a,title:"Create agent",recipeId:c,recipeName:d,error:o,busy:m,canConfirm:!!y.trim()&&"taken"!==B.state&&"checking"!==B.state,onClose:q,onConfirm:r,confirmLabel:"Create agent",children:[(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent name"}),(0,b.jsx)("input",{value:h,onChange:a=>j(a.target.value),placeholder:"e.g. Crypto Onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent id"}),(0,b.jsx)("input",{value:y,onChange:a=>{v(!0),g(a.target.value)},placeholder:"e.g. crypto-onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] "+("available"===(s=B.state)?"border-emerald-400/50":"taken"===s?"border-red-400/60":"border-white/10")}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"taken"===(t=B.state)?"That id is already taken.":"available"===t?"Id is available.":"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config."})]})]})}var u=a.i(88764),v=a.i(74621);function w({title:a,items:d,onDelete:e,onCreateTeam:f,onCreateAgent:g,installedAgentIds:h}){return(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:a}),0===d.length?(0,b.jsx)("div",{className:"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]",children:"None yet."}):(0,b.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:d.map(a=>{var d;let i="agent"===a.kind&&h.includes(a.id),j=i?`/agents/${encodeURIComponent(a.id)}`:`/recipes/${encodeURIComponent(a.id)}`,k=(d=a.source,i?"Edit agent":"builtin"===d?"View recipe":"Edit recipe");return(0,b.jsxs)("div",{className:"ck-glass flex flex-col gap-3 px-4 py-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words",children:a.name}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("span",{className:"font-mono",children:a.id})," • ",a.kind," • ",a.source]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:["team"===a.kind&&f?(0,b.jsx)("button",{type:"button",onClick:()=>f(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create team"}):null,"agent"===a.kind&&g?(0,b.jsx)("button",{type:"button",onClick:()=>g(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create agent"}):null,(0,b.jsx)(c.default,{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",href:j,children:k}),e?(0,b.jsx)("button",{type:"button",onClick:()=>e(a.id),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Delete"}):null]})]},`${a.source}:${a.id}`)})})]})}function x({builtin:a,customTeamRecipes:c,customAgentRecipes:f,installedAgentIds:g,initialOpenCustomTeam:m=!1}){let n=(0,l.useToast)(),[o,p]=(0,e.useState)(!1),[r,x]=(0,e.useState)(1),y=(0,d.useRouter)(),[z,A]=(0,e.useState)(!1),[B,C]=(0,e.useState)(""),[D,E]=(0,e.useState)(!1),[F,G]=(0,e.useState)(null),[H,I]=(0,e.useState)(!1),[J,K]=(0,e.useState)(null),[L,M]=(0,e.useState)(""),[N,O]=(0,e.useState)(!0),[P,Q]=(0,e.useState)(!1),[R,S]=(0,e.useState)(null),[T,U]=(0,e.useState)(!1),[V,W]=(0,e.useState)(null),[X,Y]=(0,e.useState)(""),[Z,$]=(0,e.useState)(""),[_,aa]=(0,e.useState)(!1),[ab,ac]=(0,e.useState)(null),[ad,ae]=(0,e.useState)(m),[af,ag]=(0,e.useState)(""),[ah,ai]=(0,e.useState)(!1),[aj,ak]=(0,e.useState)(null),[al,am]=(0,e.useState)([]),an=a=>{C(a),G(null),A(!0)},ao=a=>{K(a),M(""),O(!0),S(null),I(!0)},ap=a=>{W(a),Y(""),$(""),ac(null),U(!0)};async function aq(){E(!0),G(null);try{let a=await (0,i.fetchJsonWithStatus)("/api/recipes/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:B})});if(!a.ok){if(409===a.status)return void G(a.error);throw Error(a.error)}if(!a.data.ok)return void G(a.data.error??"Delete failed");n.push({kind:"success",message:`Deleted recipe: ${B}`}),A(!1),window.location.reload()}catch(a){n.push({kind:"error",message:(0,v.errorMessage)(a)})}finally{E(!1)}}async function ar(a){let b=a?.timeoutMs??3e4;return await j(async()=>{try{return!!(await fetch("/healthz",{cache:"no-store"})).ok||null}catch{return null}},{timeoutMs:b})??!1}async function as(a,b){let c=b?.timeoutMs??3e4;return await j(async()=>{try{let[b,c]=await Promise.all([fetch("/api/recipes",{cache:"no-store"}),fetch(`/api/teams/meta?teamId=${encodeURIComponent(a)}`,{cache:"no-store"})]),d=await b.json(),e=(Array.isArray(d.recipes)?d.recipes:[]).some(b=>String(b.id??"")===a&&"team"===String(b.kind??"")),f=await c.json(),g=!!(c.ok&&f.ok&&!f.missing);return!!e&&!!g||null}catch{return null}},{timeoutMs:c})??!1}async function at(a,b,c){let d=await (0,i.fetchJsonWithStatus)("/api/teams/meta",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({teamId:a,recipeId:b,recipeName:c})});if(!d.ok)throw Error(d.error);if(!d.data.ok)throw Error(d.data.error||"Failed to attach team meta")}async function au(a){let{kind:b,recipeId:c,teamId:d,agentId:e,name:f,cronInstallChoice:g,setBusy:h,setError:i,setModalOpen:j,setOverlayOpen:l,setOverlayStep:m,successMessage:o,navigateTo:p,waitBeforeNavigate:q}=a;h(!0),i(null),j(!1),l(!0),m(1);let r=null;try{let{res:a,json:h}=await (0,k.fetchScaffold)("team"===b?{kind:"team",recipeId:c,teamId:d,cronInstallChoice:g}:{kind:"agent",recipeId:c,agentId:e,name:f});if(!a.ok||!h.ok)throw Error(String(h.error||("team"===b?"Create team failed":"Create agent failed")));m(2),r=setTimeout(()=>{m(a=>a<3?3:a)},2e4);let i="string"==typeof h.stderr?h.stderr:"";if(/Failed to start CLI:/i.test(i)||/\bError: /i.test(i))throw Error(i.trim()||"Scaffold failed");if(/Restart required:/i.test(i)){m(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ar({timeoutMs:6e4})}q&&await q(),r&&clearTimeout(r),n.push({kind:"success",message:o}),j(!1),y.push(p),setTimeout(()=>l(!1),500)}catch(b){r&&clearTimeout(r),l(!1);let a=(0,v.errorMessage)(b);i(a),n.push({kind:"error",message:a})}finally{h(!1)}}async function av(){let a=function(a,b){if(!a)return null;let c=b.trim();return c?c.endsWith("-team")?c===a.id?`Team id cannot be the same as the recipe id (${a.id}). Choose a new team id.`:null:"Team id must end with -team.":"Team id is required."}(J,L);if(a)return void S(a);if(!J)return;let b=L.trim();await au({kind:"team",recipeId:J.id,teamId:b,cronInstallChoice:N?"yes":"no",setBusy:Q,setError:S,setModalOpen:I,setOverlayOpen:p,setOverlayStep:x,successMessage:`Created team: ${b}`,navigateTo:`/teams/${encodeURIComponent(b)}`,waitBeforeNavigate:()=>as(b,{timeoutMs:6e4})})}async function aw(){if(!V)return;let a=X.trim();a?a===V.id?ac(`Agent id cannot be the same as the recipe id (${V.id}). Choose a new agent id.`):await au({kind:"agent",recipeId:V.id,agentId:a,name:Z.trim()||void 0,setBusy:aa,setError:ac,setModalOpen:U,setOverlayOpen:p,setOverlayStep:x,successMessage:`Created agent: ${a}`,navigateTo:`/agents/${encodeURIComponent(a)}`}):ac("Agent id is required.")}async function ax(){let a=af.trim();if(!a)return void ak("Team id is required.");let b=a.endsWith("-team")?a.slice(0,-5):a;if(!b)return void ak("Team id is invalid.");if(al.length<1)return void ak("Select at least one agent.");ak(null);try{ai(!0);let c=await (0,i.fetchJsonWithStatus)("/api/recipes/custom-team",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({recipeId:b,teamId:a,roles:al.map(a=>({roleId:a.roleId,displayName:a.displayName}))})});if(ai(!1),!c.ok)throw Error(c.error);if(!c.data.ok)throw Error(c.data.error||"Failed to create custom team recipe");await au({kind:"team",recipeId:b,teamId:a,cronInstallChoice:"no",setBusy:ai,setError:ak,setModalOpen:ae,setOverlayOpen:p,setOverlayStep:x,successMessage:`Created team: ${a}`,navigateTo:`/teams/${encodeURIComponent(a)}`,waitBeforeNavigate:async()=>{await at(a,b,"Custom Team"),await as(a,{timeoutMs:6e4})}})}catch(b){ai(!1);let a=(0,v.errorMessage)(b);ak(a),n.push({kind:"error",message:a})}}return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(h,{open:o,step:r,onDismiss:()=>{p(!1)}}),(0,b.jsxs)("div",{className:"mt-8 space-y-10",children:[(0,b.jsxs)("section",{children:[(0,b.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Custom recipes"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Workspace recipes (editable) — stored under ",(0,b.jsx)("code",{className:"font-mono",children:"~/.openclaw/workspace/recipes/"}),"."]})]}),(0,b.jsx)("button",{type:"button",onClick:()=>{ag(""),am([]),ak(null),ae(!0)},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create custom team"})]}),(0,b.jsxs)("div",{className:"mt-4 space-y-8",children:[(0,b.jsx)(w,{title:`Teams (${c.length})`,items:c,onDelete:an,onCreateTeam:ao,installedAgentIds:g}),(0,b.jsx)(w,{title:`Agents (${f.length})`,items:f,onDelete:an,onCreateAgent:ap,installedAgentIds:g})]})]}),(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Builtin recipes"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"Bundled recipes shipped with the plugin."}),(0,b.jsx)("div",{className:"mt-4",children:(0,b.jsx)(w,{title:`All (${a.length})`,items:a,onCreateTeam:ao,onCreateAgent:ap,installedAgentIds:g})})]})]}),(0,b.jsx)(u.DeleteRecipeModal,{open:z,recipeId:B,busy:D,error:F,onClose:()=>A(!1),onConfirm:aq}),(0,b.jsx)(s,{open:ad,teamId:af,setTeamId:ag,busy:ah,error:aj,onRolesChange:am,onClose:()=>ae(!1),onConfirm:ax}),(0,b.jsx)(q,{open:H,recipeId:J?.id??"",recipeName:J?.name??"",teamId:L,setTeamId:M,installCron:N,setInstallCron:O,busy:P,error:R,onClose:()=>I(!1),onConfirm:av}),(0,b.jsx)(t,{open:T,recipeId:V?.id??"",recipeName:V?.name??"",agentId:X,setAgentId:Y,agentName:Z,setAgentName:$,existingRecipeIds:[...a,...c,...f].map(a=>a.id),existingAgentIds:g,busy:_,error:ab,onClose:()=>U(!1),onConfirm:aw})]})}a.s(["default",()=>x],55408)}];
1
+ module.exports=[55408,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(50944),e=a.i(72131),f=a.i(35112);let g={1:"Ordering team…",2:"Cooking up agents…",3:"Serving them up hot…"};function h({open:a,step:c,onDismiss:d}){return a?(0,f.createPortal)((0,b.jsxs)("div",{className:"fixed inset-0 z-[9999]",children:[(0,b.jsx)("div",{className:"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none"}),d?(0,b.jsx)("button",{type:"button",onClick:a=>{a.preventDefault(),a.stopPropagation(),d()},className:"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-glass-strong)]","aria-label":"Dismiss loading overlay",title:"Dismiss",children:"Esc"}):null,(0,b.jsx)("div",{className:"fixed inset-0 flex items-center justify-center p-6 sm:p-10",children:(0,b.jsxs)("div",{className:"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]",children:[(0,b.jsx)("div",{className:"text-2xl font-semibold text-[color:var(--ck-text-primary)]",children:"Claw Kitchen"}),(0,b.jsx)("div",{className:"mt-3 text-base text-[color:var(--ck-text-secondary)]",children:"Hang tight — we’re updating your OpenClaw install."}),(0,b.jsx)("div",{className:"mt-8 space-y-4 text-base",children:[1,2,3].map(a=>{let d=a===c,e=a<c;return(0,b.jsxs)("div",{className:"flex items-center gap-4",children:[(0,b.jsx)("div",{className:"h-4 w-4 rounded-full "+(e?"bg-emerald-400":d?"bg-[var(--ck-accent-red)] animate-pulse":"bg-white/20")}),(0,b.jsx)("div",{className:e?"text-[color:var(--ck-text-secondary)] line-through":"text-[color:var(--ck-text-primary)]",children:g[a]})]},a)})})]})})]}),document.body):null}var i=a.i(51200);async function j(a,b){let c=b.intervalMs??500,d=Date.now();for(;Date.now()-d<b.timeoutMs;){let b=await a();if(null!==b)return b;await new Promise(a=>setTimeout(a,c))}return null}var k=a.i(56635),l=a.i(61889),m=a.i(40211);function n(a){let{open:b,name:c,setName:d,id:f,setId:g,idTouched:h,setIdTouched:i,slugify:j=m.slugifyId}=a,k=(0,e.useMemo)(()=>j(c),[c,j]),l=h?f:k;return(0,e.useEffect)(()=>{b&&(h||g(k))},[k,b,h,g]),(0,e.useEffect)(()=>{b||(i(!1),d(""),g(""))},[b,i,d,g]),{derivedId:k,effectiveId:l}}var o=a.i(66063);function p({open:a,title:c,recipeId:d,recipeName:e,children:f,error:g,busy:h,canConfirm:i,onClose:j,onConfirm:k,confirmLabel:l}){return(0,b.jsxs)(o.ConfirmationModal,{open:a,onClose:j,title:c,error:g,confirmLabel:l,confirmBusyLabel:"Creating…",confirmDisabled:!i,busy:h,onConfirm:k,children:[(0,b.jsxs)("p",{className:"mt-2 text-sm text-[color:var(--ck-text-secondary)]",children:["Create a new ",c.toLowerCase().replace("create ","")," from recipe"," ",(0,b.jsx)("code",{className:"font-mono",children:d}),e?(0,b.jsxs)(b.Fragment,{children:[" ","(",(0,b.jsx)("span",{className:"font-medium",children:e}),")"]}):null,"."]}),f]})}function q({open:a,recipeId:c,recipeName:d,teamId:f,setTeamId:g,installCron:h,setInstallCron:i,busy:j,error:k,onClose:l,onConfirm:m}){let[o,q]=(0,e.useState)(""),[r,s]=(0,e.useState)(!1),{effectiveId:t}=n({open:a,name:o,setName:q,id:f,setId:g,idTouched:r,setIdTouched:s});return(0,b.jsxs)(p,{open:a,title:"Create team",recipeId:c,recipeName:d,error:k,busy:j,canConfirm:!!t.trim(),onClose:l,onConfirm:m,confirmLabel:"Create team",children:[(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team name"}),(0,b.jsx)("input",{value:o,onChange:a=>q(a.target.value),placeholder:"e.g. Crypto Team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,b.jsx)("input",{value:t,onChange:a=>{s(!0),g(a.target.value)},placeholder:"e.g. my-team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"This will scaffold ~/.openclaw/workspace-<teamId> and add the team to config."})]}),(0,b.jsxs)("label",{className:"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:h,onChange:a=>i(a.target.checked)}),"Install cron jobs from this recipe"]})]})}function r(a){return/^[a-z0-9][a-z0-9_-]{1,62}$/.test(a)}function s({open:a,teamId:c,setTeamId:d,busy:f,error:g,onClose:h,onConfirm:j,onRolesChange:k}){let[l,m]=(0,e.useState)([]),[n,o]=(0,e.useState)(null),[q,s]=(0,e.useState)(""),[t,u]=(0,e.useState)({}),[v,w]=(0,e.useState)(null),[x,y]=(0,e.useState)(null),[z,A]=(0,e.useState)(null);(0,e.useEffect)(()=>{let a=!1;return(async()=>{let b=await (0,i.fetchJsonWithStatus)("/api/recipes/local-agent-catalog",{cache:"no-store"});if(!a){if(!b.ok)return o(b.error||"Failed to load local agent catalog");if(!b.data.ok)return o(b.data.error||"Failed to load local agent catalog");m(Array.isArray(b.data.items)?b.data.items:[])}})(),()=>{a=!0}},[]);let[B,C]=(0,e.useState)({state:"unknown"}),D=(0,e.useMemo)(()=>{let a=q.trim().toLowerCase(),b=l.map(a=>{var b;let c;if("team-role"===a.kind){let b=`team:${a.recipeId}:${a.roleId}`,c=a.recipeName||a.recipeId,d=a.roleName?`${a.roleName} (${a.roleId})`:a.roleId;return{id:b,label:`${c} → ${d}`,roleId:a.roleId,displayName:a.roleName||`${c} ${a.roleId}`,haystack:`${a.recipeId} ${a.recipeName||""} ${a.roleId} ${a.roleName||""}`.toLowerCase()}}let d=`agent:${a.recipeId}`,e=a.recipeName||a.recipeId,f=a.description?` — ${a.description}`:"";return{id:d,label:`${e} (agent recipe: ${a.recipeId})${f}`,roleId:((c=(b=a.recipeId).split("/").pop()||b).split("-").slice(-1)[0]||c).toLowerCase().replace(/[^a-z0-9_-]+/g,"-"),displayName:e,haystack:`${a.recipeId} ${a.recipeName||""} ${a.description||""}`.toLowerCase()}});return(a?b.filter(b=>b.haystack.includes(a)):b).slice().sort((a,b)=>a.label.localeCompare(b.label)).map(({haystack:a,...b})=>b)},[l,q]),E=(0,e.useMemo)(()=>Object.values(t),[t]),F=c.trim(),G=(0,e.useMemo)(()=>a?F?r(F)?F.endsWith("-team")?"taken"===B.state?`Team id is already taken: ${F}`:null:"Team id must end with -team.":"Invalid team id. Use lowercase letters/numbers with - or _ (2-63 chars).":"Team id is required.":null,[a,F,B.state]),H=(0,e.useMemo)(()=>{let a=new Map;for(let b of E){let c=String(b.roleId??"").trim();if(!c){a.set(b.agentId,"Role id is required.");continue}r(c)||a.set(b.agentId,"Invalid role id (lowercase letters/numbers with - or _).")}return a},[E]),I=!G&&"checking"!==B.state&&"unknown"!==B.state&&E.length>0&&0===H.size;return(0,e.useEffect)(()=>{a&&k(E)},[a,E,k]),(0,e.useEffect)(()=>{if(!a)return;let b=!1,c=setTimeout(async()=>{if(!F||!(r(F)&&F.endsWith("-team")))return void C({state:"unknown"});C({state:"checking"});let a=await (0,i.fetchJsonWithStatus)(`/api/ids/check?kind=team&id=${encodeURIComponent(F)}`,{cache:"no-store"});if(!b){if(!a.ok)return void C({state:"unknown"});if(a.data.ok&&!0===a.data.available)return void C({state:"available"});C({state:"taken",reason:a.data.reason})}},250);return()=>{b=!0,clearTimeout(c)}},[a,F]),(0,e.useEffect)(()=>{if(!a||!I)return;let b=!1,c=setTimeout(async()=>{let a=F.endsWith("-team")?F.slice(0,-5):F,c=await (0,i.fetchJsonWithStatus)("/api/recipes/custom-team",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({dryRun:!0,recipeId:a,teamId:F,roles:E.map(a=>({roleId:a.roleId,displayName:a.displayName}))})});if(!b){if(!c.ok){A(c.error),w(null),y(null);return}if(!c.data.ok){A(c.data.error||"Failed to generate preview"),w(null),y(null);return}A(null),w("string"==typeof c.data.md?c.data.md:null),y("string"==typeof c.data.filePath?c.data.filePath:null)}},250);return()=>{b=!0,clearTimeout(c)}},[a,I,F,E]),(0,b.jsxs)(p,{open:a,title:"Create custom team",recipeId:"(new recipe)",recipeName:"Custom Team",error:g||n,busy:f,canConfirm:I,onClose:h,onConfirm:j,confirmLabel:"Create team",children:[(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Team id"}),(0,b.jsx)("input",{value:c,onChange:a=>d(a.target.value.toLowerCase().replace(/\s+/g,"-")),placeholder:"e.g. my-team",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0}),G?(0,b.jsx)("div",{className:"mt-2 text-xs text-red-300",children:G}):null,!G&&F?(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["checking"===B.state?"Checking availability…":null,"available"===B.state?"Available.":null]}):null]}),(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Select agents"}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"MVP: this creates new team roles that mirror the selected agents' names. You can edit the resulting team recipe later."}),(0,b.jsxs)("div",{className:"mt-3",children:[(0,b.jsx)("input",{value:q,onChange:a=>s(a.target.value),placeholder:"Search local roles/agents (recipe id, name, role)",className:"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]"}),(0,b.jsxs)("div",{className:"mt-3 max-h-[220px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3",children:[n?(0,b.jsx)("div",{className:"text-sm text-red-300",children:n}):null,n||0!==D.length?null:(0,b.jsx)("div",{className:"text-sm text-[color:var(--ck-text-secondary)]",children:"No local roles/agents found."}),!n&&D.length?(0,b.jsx)("div",{className:"space-y-2",children:D.map(a=>{let c=!!t[a.id];return(0,b.jsxs)("label",{className:"flex items-start gap-2 text-sm text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("input",{type:"checkbox",checked:c,onChange:b=>{let c={...t};b.target.checked?c[a.id]={agentId:a.id,roleId:a.roleId,displayName:a.displayName}:delete c[a.id],u(c)}}),(0,b.jsx)("span",{className:"min-w-0 break-words",children:a.label})]},a.id)})}):null]})]})]}),E.length?(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Role mapping"}),(0,b.jsx)("div",{className:"mt-3 space-y-3",children:E.map(a=>{let c=H.get(a.agentId);return(0,b.jsxs)("div",{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3",children:[(0,b.jsx)("div",{className:"text-xs text-[color:var(--ck-text-tertiary)]",children:a.agentId}),(0,b.jsxs)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Role id"}),(0,b.jsx)("input",{value:a.roleId,onChange:b=>{u(c=>({...c,[a.agentId]:{...c[a.agentId],roleId:b.target.value}}))},className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"}),c?(0,b.jsx)("div",{className:"mt-1 text-xs text-red-300",children:c}):null]}),(0,b.jsxs)("div",{children:[(0,b.jsx)("label",{className:"text-xs font-medium text-[color:var(--ck-text-secondary)]",children:"Display name"}),(0,b.jsx)("input",{value:a.displayName,onChange:b=>{u(c=>({...c,[a.agentId]:{...c[a.agentId],displayName:b.target.value}}))},className:"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]"})]})]})]},a.agentId)})})]}):null,(0,b.jsxs)("div",{className:"mt-6",children:[(0,b.jsx)("div",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Preview"}),(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["Generated recipe preview (best-effort). This is what will be written to",(0,b.jsx)("code",{className:"ml-1",children:"~/.openclaw/workspace/recipes/<teamId>.md"}),"."]}),I&&z?(0,b.jsx)("div",{className:"mt-2 text-xs text-red-300",children:z}):null,I&&x?(0,b.jsxs)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:["Target path: ",(0,b.jsx)("code",{children:x})]}):null,(0,b.jsx)("pre",{className:"mt-3 max-h-[260px] overflow-auto whitespace-pre-wrap rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-3 text-xs text-[color:var(--ck-text-secondary)]",children:I?v||"(Loading preview…)":"(Select a valid team id and at least one agent to preview.)"})]})]})}function t({open:a,recipeId:c,recipeName:d,agentId:f,setAgentId:g,agentName:h,setAgentName:j,existingRecipeIds:k,existingAgentIds:l,busy:m,error:o,onClose:q,onConfirm:r}){var s,t;let[u,v]=(0,e.useState)(!1),[w,x]=(0,e.useState)(null),{effectiveId:y}=n({open:a,name:h,setName:j,id:f,setId:g,idTouched:u,setIdTouched:v}),z=String(y??"").trim(),A=(0,e.useMemo)(()=>a?z?k.includes(z)?{state:"taken",reason:"recipe-id-collision"}:l.includes(z)?{state:"taken",reason:"agent-exists"}:null:{state:"empty"}:{state:"empty"},[a,z,k,l]),B=A??w??{state:"available"};return(0,e.useEffect)(()=>{if(!a||null!==A)return;let b=setTimeout(()=>{(async()=>{x({state:"checking"});try{let a=await (0,i.fetchJson)(`/api/ids/check?kind=agent&id=${encodeURIComponent(z)}`,{cache:"no-store"});a.available?x({state:"available"}):x({state:"taken",reason:a.reason})}catch{x({state:"available"})}})()},250);return()=>clearTimeout(b)},[a,A,z]),(0,b.jsxs)(p,{open:a,title:"Create agent",recipeId:c,recipeName:d,error:o,busy:m,canConfirm:!!y.trim()&&"taken"!==B.state&&"checking"!==B.state,onClose:q,onConfirm:r,confirmLabel:"Create agent",children:[(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent name"}),(0,b.jsx)("input",{value:h,onChange:a=>j(a.target.value),placeholder:"e.g. Crypto Onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]",autoFocus:!0})]}),(0,b.jsxs)("div",{className:"mt-4",children:[(0,b.jsx)("label",{className:"text-sm font-medium text-[color:var(--ck-text-primary)]",children:"Agent id"}),(0,b.jsx)("input",{value:y,onChange:a=>{v(!0),g(a.target.value)},placeholder:"e.g. crypto-onchain",className:"mt-2 w-full rounded-[var(--ck-radius-sm)] border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] "+("available"===(s=B.state)?"border-emerald-400/50":"taken"===s?"border-red-400/60":"border-white/10")}),(0,b.jsx)("div",{className:"mt-2 text-xs text-[color:var(--ck-text-tertiary)]",children:"taken"===(t=B.state)?"That id is already taken.":"available"===t?"Id is available.":"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config."})]})]})}var u=a.i(88764),v=a.i(74621);function w({title:a,items:d,onDelete:e,onCreateTeam:f,onCreateAgent:g,installedAgentIds:h}){return(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:a}),0===d.length?(0,b.jsx)("div",{className:"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]",children:"None yet."}):(0,b.jsx)("div",{className:"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2",children:d.map(a=>{var d;let i="agent"===a.kind&&h.includes(a.id),j=i?`/agents/${encodeURIComponent(a.id)}`:`/recipes/${encodeURIComponent(a.id)}`,k=(d=a.source,i?"Edit agent":"builtin"===d?"View recipe":"Edit recipe");return(0,b.jsxs)("div",{className:"ck-glass flex flex-col gap-3 px-4 py-3",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("div",{className:"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words",children:a.name}),(0,b.jsxs)("div",{className:"mt-1 text-xs text-[color:var(--ck-text-secondary)]",children:[(0,b.jsx)("span",{className:"font-mono",children:a.id})," • ",a.kind," • ",a.source]})]}),(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:["team"===a.kind&&f?(0,b.jsx)("button",{type:"button",onClick:()=>f(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create team"}):null,"agent"===a.kind&&g?(0,b.jsx)("button",{type:"button",onClick:()=>g(a),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create agent"}):null,(0,b.jsx)(c.default,{className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",href:j,children:k}),e?(0,b.jsx)("button",{type:"button",onClick:()=>e(a.id),className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10",children:"Delete"}):null]})]},`${a.source}:${a.id}`)})})]})}function x({builtin:a,customTeamRecipes:c,customAgentRecipes:f,installedAgentIds:g,initialOpenCustomTeam:m=!1}){let n=(0,l.useToast)(),[o,p]=(0,e.useState)(!1),[r,x]=(0,e.useState)(1),y=(0,d.useRouter)(),[z,A]=(0,e.useState)(!1),[B,C]=(0,e.useState)(""),[D,E]=(0,e.useState)(!1),[F,G]=(0,e.useState)(null),[H,I]=(0,e.useState)(!1),[J,K]=(0,e.useState)(null),[L,M]=(0,e.useState)(""),[N,O]=(0,e.useState)(!0),[P,Q]=(0,e.useState)(!1),[R,S]=(0,e.useState)(null),[T,U]=(0,e.useState)(!1),[V,W]=(0,e.useState)(null),[X,Y]=(0,e.useState)(""),[Z,$]=(0,e.useState)(""),[_,aa]=(0,e.useState)(!1),[ab,ac]=(0,e.useState)(null),[ad,ae]=(0,e.useState)(m),[af,ag]=(0,e.useState)(""),[ah,ai]=(0,e.useState)(!1),[aj,ak]=(0,e.useState)(null),[al,am]=(0,e.useState)([]),an=a=>{C(a),G(null),A(!0)},ao=a=>{K(a),M(""),O(!0),S(null),I(!0)},ap=a=>{W(a),Y(""),$(""),ac(null),U(!0)};async function aq(){E(!0),G(null);try{let a=await (0,i.fetchJsonWithStatus)("/api/recipes/delete",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:B})});if(!a.ok){if(409===a.status)return void G(a.error);throw Error(a.error)}if(!a.data.ok)return void G(a.data.error??"Delete failed");n.push({kind:"success",message:`Deleted recipe: ${B}`}),A(!1),window.location.reload()}catch(a){n.push({kind:"error",message:(0,v.errorMessage)(a)})}finally{E(!1)}}async function ar(a){let b=a?.timeoutMs??3e4;return await j(async()=>{try{return!!(await fetch("/healthz",{cache:"no-store"})).ok||null}catch{return null}},{timeoutMs:b})??!1}async function as(a,b){let c=b?.timeoutMs??3e4;return await j(async()=>{try{let[b,c]=await Promise.all([fetch("/api/recipes",{cache:"no-store"}),fetch(`/api/teams/meta?teamId=${encodeURIComponent(a)}`,{cache:"no-store"})]),d=await b.json(),e=(Array.isArray(d.recipes)?d.recipes:[]).some(b=>String(b.id??"")===a&&"team"===String(b.kind??"")),f=await c.json(),g=!!(c.ok&&f.ok&&!f.missing);return!!e&&!!g||null}catch{return null}},{timeoutMs:c})??!1}async function at(a,b,c){let d=await (0,i.fetchJsonWithStatus)("/api/teams/meta",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({teamId:a,recipeId:b,recipeName:c})});if(!d.ok)throw Error(d.error);if(!d.data.ok)throw Error(d.data.error||"Failed to attach team meta")}async function au(a){let{kind:b,recipeId:c,teamId:d,agentId:e,name:f,cronInstallChoice:g,setBusy:h,setError:i,setModalOpen:j,setOverlayOpen:l,setOverlayStep:m,successMessage:o,navigateTo:p,waitBeforeNavigate:q}=a;h(!0),i(null),j(!1),l(!0),m(1);let r=null;try{let{res:a,json:h}=await (0,k.fetchScaffold)("team"===b?{kind:"team",recipeId:c,teamId:d,cronInstallChoice:g}:{kind:"agent",recipeId:c,agentId:e,name:f});if(!a.ok||!h.ok)throw Error(String(h.error||("team"===b?"Create team failed":"Create agent failed")));m(2),r=setTimeout(()=>{m(a=>a<3?3:a)},2e4);let i="string"==typeof h.stderr?h.stderr:"";if(/Failed to start CLI:/i.test(i)||/\bError: /i.test(i))throw Error(i.trim()||"Scaffold failed");if(/Restart required:/i.test(i)){m(3);try{await fetch("/api/gateway/restart",{method:"POST"})}catch{}await ar({timeoutMs:6e4})}q&&await q(),r&&clearTimeout(r),n.push({kind:"success",message:o}),j(!1),y.push(p),setTimeout(()=>l(!1),500)}catch(b){r&&clearTimeout(r),l(!1);let a=(0,v.errorMessage)(b);i(a),n.push({kind:"error",message:a})}finally{h(!1)}}async function av(){let a=function(a,b){if(!a)return null;let c=b.trim();return c?c.endsWith("-team")?c===a.id?`Team id cannot be the same as the recipe id (${a.id}). Choose a new team id.`:null:"Team id must end with -team.":"Team id is required."}(J,L);if(a)return void S(a);if(!J)return;let b=L.trim();await au({kind:"team",recipeId:J.id,teamId:b,cronInstallChoice:N?"yes":"no",setBusy:Q,setError:S,setModalOpen:I,setOverlayOpen:p,setOverlayStep:x,successMessage:`Created team: ${b}`,navigateTo:`/teams/${encodeURIComponent(b)}`,waitBeforeNavigate:()=>as(b,{timeoutMs:6e4})})}async function aw(){if(!V)return;let a=X.trim();a?a===V.id?ac(`Agent id cannot be the same as the recipe id (${V.id}). Choose a new agent id.`):await au({kind:"agent",recipeId:V.id,agentId:a,name:Z.trim()||void 0,setBusy:aa,setError:ac,setModalOpen:U,setOverlayOpen:p,setOverlayStep:x,successMessage:`Created agent: ${a}`,navigateTo:`/agents/${encodeURIComponent(a)}`}):ac("Agent id is required.")}async function ax(){let a=af.trim();if(!a)return void ak("Team id is required.");let b=a.endsWith("-team")?a.slice(0,-5):a;if(!b)return void ak("Team id is invalid.");if(al.length<1)return void ak("Select at least one agent.");ak(null);try{ai(!0);let c=await (0,i.fetchJsonWithStatus)("/api/recipes/custom-team",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({recipeId:b,teamId:a,roles:al.map(a=>({roleId:a.roleId,displayName:a.displayName}))})});if(ai(!1),!c.ok)throw Error(c.error);if(!c.data.ok)throw Error(c.data.error||"Failed to create custom team recipe");await au({kind:"team",recipeId:b,teamId:a,cronInstallChoice:"no",setBusy:ai,setError:ak,setModalOpen:ae,setOverlayOpen:p,setOverlayStep:x,successMessage:`Created team: ${a}`,navigateTo:`/teams/${encodeURIComponent(a)}`,waitBeforeNavigate:async()=>{await at(a,b,"Custom Team"),await as(a,{timeoutMs:6e4})}})}catch(b){ai(!1);let a=(0,v.errorMessage)(b);ak(a),n.push({kind:"error",message:a})}}return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(h,{open:o,step:r,onDismiss:()=>{p(!1)}}),(0,b.jsxs)("div",{className:"mt-8 space-y-10",children:[(0,b.jsxs)("section",{children:[(0,b.jsxs)("div",{className:"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Custom recipes"}),(0,b.jsxs)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:["Workspace recipes (editable) — stored under ",(0,b.jsx)("code",{className:"font-mono",children:"~/.openclaw/workspace/recipes/"}),"."]})]}),(0,b.jsx)("button",{type:"button",onClick:()=>{ag(""),am([]),ak(null),ae(!0)},className:"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15",children:"Create custom team"})]}),(0,b.jsxs)("div",{className:"mt-4 space-y-8",children:[(0,b.jsx)(w,{title:`Teams (${c.length})`,items:c,onDelete:an,onCreateTeam:ao,installedAgentIds:g}),(0,b.jsx)(w,{title:`Agents (${f.length})`,items:f,onDelete:an,onCreateAgent:ap,installedAgentIds:g})]})]}),(0,b.jsxs)("section",{children:[(0,b.jsx)("h2",{className:"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]",children:"Builtin recipes"}),(0,b.jsx)("p",{className:"mt-1 text-sm text-[color:var(--ck-text-secondary)]",children:"Bundled recipes shipped with the plugin."}),(0,b.jsx)("div",{className:"mt-4",children:(0,b.jsx)(w,{title:`All (${a.length})`,items:a,onCreateTeam:ao,onCreateAgent:ap,installedAgentIds:g})})]})]}),(0,b.jsx)(u.DeleteRecipeModal,{open:z,recipeId:B,busy:D,error:F,onClose:()=>A(!1),onConfirm:aq}),(0,b.jsx)(s,{open:ad,teamId:af,setTeamId:ag,busy:ah,error:aj,onRolesChange:am,onClose:()=>ae(!1),onConfirm:ax}),(0,b.jsx)(q,{open:H,recipeId:J?.id??"",recipeName:J?.name??"",teamId:L,setTeamId:M,installCron:N,setInstallCron:O,busy:P,error:R,onClose:()=>I(!1),onConfirm:av}),(0,b.jsx)(t,{open:T,recipeId:V?.id??"",recipeName:V?.name??"",agentId:X,setAgentId:Y,agentName:Z,setAgentName:$,existingRecipeIds:[...a,...c,...f].map(a=>a.id),existingAgentIds:g,busy:_,error:ab,onClose:()=>U(!1),onConfirm:aw})]})}a.s(["default",()=>x],55408)}];
2
2
 
3
3
  //# sourceMappingURL=src_app_recipes_recipes-client_tsx_8ed3ca94._.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/recipes/recipes-client.tsx","../../../../src/components/ScaffoldOverlay.tsx","../../../../src/lib/poll.ts","../../../../src/lib/use-slugified-id.ts","../../../../src/app/recipes/CreateModalShell.tsx","../../../../src/app/recipes/CreateTeamModal.tsx","../../../../src/app/recipes/CreateCustomTeamModal.tsx","../../../../src/app/recipes/CreateAgentModal.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useState } from \"react\";\nimport { ScaffoldOverlay, type ScaffoldOverlayStep } from \"@/components/ScaffoldOverlay\";\nimport { fetchJsonWithStatus } from \"@/lib/fetch-json\";\nimport { pollUntil } from \"@/lib/poll\";\nimport { fetchScaffold } from \"@/lib/scaffold-client\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { CreateTeamModal } from \"./CreateTeamModal\";\nimport { CreateCustomTeamModal } from \"./CreateCustomTeamModal\";\nimport { CreateAgentModal } from \"./CreateAgentModal\";\nimport { DeleteRecipeModal } from \"@/components/delete-modals\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype Recipe = {\n id: string;\n name: string;\n kind: \"agent\" | \"team\";\n source: \"builtin\" | \"workspace\";\n};\n\nfunction getEditLabel(isInstalledAgent: boolean, source: string): string {\n if (isInstalledAgent) return \"Edit agent\";\n if (source === \"builtin\") return \"View recipe\";\n return \"Edit recipe\";\n}\n\nfunction RecipesSection({\n title,\n items,\n onDelete,\n onCreateTeam,\n onCreateAgent,\n installedAgentIds,\n}: {\n title: string;\n items: Recipe[];\n onDelete?: (id: string) => void;\n onCreateTeam?: (r: Recipe) => void;\n onCreateAgent?: (r: Recipe) => void;\n installedAgentIds: string[];\n}) {\n return (\n <section>\n <h2 className=\"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">{title}</h2>\n\n {items.length === 0 ? (\n <div className=\"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]\">None yet.</div>\n ) : (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {items.map((r) => {\n const isInstalledAgent = r.kind === \"agent\" && installedAgentIds.includes(r.id);\n const editHref = isInstalledAgent\n ? `/agents/${encodeURIComponent(r.id)}`\n : `/recipes/${encodeURIComponent(r.id)}`;\n const editLabel = getEditLabel(isInstalledAgent, r.source);\n\n return (\n <div\n key={`${r.source}:${r.id}`}\n className=\"ck-glass flex flex-col gap-3 px-4 py-3\"\n >\n <div>\n <div className=\"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words\">\n {r.name}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{r.id}</span> • {r.kind} • {r.source}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {r.kind === \"team\" && onCreateTeam ? (\n <button\n type=\"button\"\n onClick={() => onCreateTeam(r)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create team\n </button>\n ) : null}\n\n {r.kind === \"agent\" && onCreateAgent ? (\n <button\n type=\"button\"\n onClick={() => onCreateAgent(r)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create agent\n </button>\n ) : null}\n\n <Link\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n href={editHref}\n >\n {editLabel}\n </Link>\n\n {onDelete ? (\n <button\n type=\"button\"\n onClick={() => onDelete(r.id)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Delete\n </button>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </section>\n );\n}\n\nexport default function RecipesClient({\n builtin,\n customTeamRecipes,\n customAgentRecipes,\n installedAgentIds,\n initialOpenCustomTeam = false,\n}: {\n builtin: Recipe[];\n customTeamRecipes: Recipe[];\n customAgentRecipes: Recipe[];\n installedAgentIds: string[];\n initialOpenCustomTeam?: boolean;\n}) {\n const toast = useToast();\n\n const [overlayOpen, setOverlayOpen] = useState(false);\n const [overlayStep, setOverlayStep] = useState<ScaffoldOverlayStep>(1);\n const router = useRouter();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [busy, setBusy] = useState(false);\n const [modalError, setModalError] = useState<string | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n const [createRecipe, setCreateRecipe] = useState<Recipe | null>(null);\n const [createTeamId, setCreateTeamId] = useState<string>(\"\");\n const [installCron, setInstallCron] = useState(true);\n const [createBusy, setCreateBusy] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const [createAgentOpen, setCreateAgentOpen] = useState(false);\n const [createAgentRecipe, setCreateAgentRecipe] = useState<Recipe | null>(null);\n const [createAgentId, setCreateAgentId] = useState<string>(\"\");\n const [createAgentName, setCreateAgentName] = useState<string>(\"\");\n const [createAgentBusy, setCreateAgentBusy] = useState(false);\n const [createAgentError, setCreateAgentError] = useState<string | null>(null);\n\n const [createCustomTeamOpen, setCreateCustomTeamOpen] = useState(initialOpenCustomTeam);\n const [createCustomTeamId, setCreateCustomTeamId] = useState<string>(\"\");\n const [createCustomTeamBusy, setCreateCustomTeamBusy] = useState(false);\n const [createCustomTeamError, setCreateCustomTeamError] = useState<string | null>(null);\n const [customTeamRoles, setCustomTeamRoles] = useState<Array<{ agentId: string; roleId: string; displayName: string }>>(\n [],\n );\n\n const onDelete = (id: string) => {\n setDeleteId(id);\n setModalError(null);\n setDeleteOpen(true);\n };\n\n const onCreateTeam = (r: Recipe) => {\n setCreateRecipe(r);\n setCreateTeamId(\"\");\n setInstallCron(true);\n setCreateError(null);\n setCreateOpen(true);\n };\n\n const onCreateAgent = (r: Recipe) => {\n setCreateAgentRecipe(r);\n setCreateAgentId(\"\");\n setCreateAgentName(\"\");\n setCreateAgentError(null);\n setCreateAgentOpen(true);\n };\n\n const onCreateCustomTeam = () => {\n setCreateCustomTeamId(\"\");\n setCustomTeamRoles([]);\n setCreateCustomTeamError(null);\n setCreateCustomTeamOpen(true);\n };\n\n async function confirmDelete() {\n setBusy(true);\n setModalError(null);\n try {\n const result = await fetchJsonWithStatus<{ ok?: boolean; error?: string }>(\"/api/recipes/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n if (!result.ok) {\n if (result.status === 409) {\n setModalError(result.error);\n return;\n }\n throw new Error(result.error);\n }\n if (!result.data.ok) {\n setModalError(result.data.error ?? \"Delete failed\");\n return;\n }\n toast.push({ kind: \"success\", message: `Deleted recipe: ${deleteId}` });\n setDeleteOpen(false);\n window.location.reload();\n } catch (e: unknown) {\n toast.push({ kind: \"error\", message: errorMessage(e) });\n } finally {\n setBusy(false);\n }\n }\n\n async function waitForKitchenHealthy(opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const result = await pollUntil<boolean>(\n async () => {\n try {\n const res = await fetch(\"/healthz\", { cache: \"no-store\" });\n return res.ok ? true : null;\n } catch {\n return null;\n }\n },\n { timeoutMs }\n );\n return result ?? false;\n }\n\n async function waitForTeamPageReady(teamId: string, opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const result = await pollUntil<boolean>(\n async () => {\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 recipesJson = (await recipesRes.json()) as { recipes?: Array<{ id?: unknown; kind?: unknown }> };\n const list = Array.isArray(recipesJson.recipes) ? recipesJson.recipes : [];\n const hasRecipe = list.some((r) => String(r.id ?? \"\") === teamId && String(r.kind ?? \"\") === \"team\");\n\n const metaJson = (await metaRes.json()) as { ok?: boolean; missing?: boolean };\n const hasMeta = Boolean(metaRes.ok && metaJson.ok && !metaJson.missing);\n\n return hasRecipe && hasMeta ? true : null;\n } catch {\n return null;\n }\n },\n { timeoutMs }\n );\n return result ?? false;\n }\n\n async function attachTeamMeta(teamId: string, recipeId: string, recipeName: string) {\n const res = await fetchJsonWithStatus<{ ok?: boolean; error?: string }>(\"/api/teams/meta\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, recipeId, recipeName }),\n });\n if (!res.ok) throw new Error(res.error);\n if (!res.data.ok) throw new Error(res.data.error || \"Failed to attach team meta\");\n }\n\n function validateTeamIdForCreate(recipe: { id: string } | null, teamId: string): string | null {\n if (!recipe) return null;\n const t = teamId.trim();\n if (!t) return \"Team id is required.\";\n if (!t.endsWith(\"-team\")) return \"Team id must end with -team.\";\n if (t === recipe.id) return `Team id cannot be the same as the recipe id (${recipe.id}). Choose a new team id.`;\n return null;\n }\n\n async function scaffoldWithOverlay(opts: {\n kind: \"team\" | \"agent\";\n recipeId: string;\n teamId?: string;\n agentId?: string;\n name?: string;\n cronInstallChoice?: \"yes\" | \"no\";\n setBusy: (v: boolean) => void;\n setError: (v: string | null) => void;\n setModalOpen: (v: boolean) => void;\n setOverlayOpen: (v: boolean) => void;\n setOverlayStep: React.Dispatch<React.SetStateAction<ScaffoldOverlayStep>>;\n successMessage: string;\n navigateTo: string;\n waitBeforeNavigate?: () => Promise<unknown>;\n }) {\n const {\n kind,\n recipeId,\n teamId,\n agentId,\n name,\n cronInstallChoice,\n setBusy,\n setError,\n setModalOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage,\n navigateTo,\n waitBeforeNavigate,\n } = opts;\n\n setBusy(true);\n setError(null);\n setModalOpen(false);\n setOverlayOpen(true);\n setOverlayStep(1);\n\n let serveTimer: ReturnType<typeof setTimeout> | null = null;\n\n try {\n const body =\n kind === \"team\"\n ? { kind: \"team\" as const, recipeId, teamId: teamId!, cronInstallChoice }\n : { kind: \"agent\" as const, recipeId, agentId: agentId!, name };\n const { res, json } = await fetchScaffold(body);\n if (!res.ok || !(json as { ok?: boolean }).ok)\n throw new Error(\n String((json as { error?: string }).error || (kind === \"team\" ? \"Create team failed\" : \"Create agent failed\"))\n );\n\n setOverlayStep(2);\n\n serveTimer = setTimeout(() => {\n setOverlayStep((prev) => (prev < 3 ? 3 : prev));\n }, 20_000);\n\n const stderr = typeof (json as { stderr?: unknown }).stderr === \"string\" ? (json as { stderr: string }).stderr : \"\";\n\n if (/Failed to start CLI:/i.test(stderr) || /\\bError: /i.test(stderr)) {\n throw new Error(stderr.trim() || \"Scaffold failed\");\n }\n\n if (/Restart required:/i.test(stderr)) {\n setOverlayStep(3);\n try {\n await fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // best-effort\n }\n await waitForKitchenHealthy({ timeoutMs: 60_000 });\n }\n\n if (waitBeforeNavigate) {\n await waitBeforeNavigate();\n }\n\n if (serveTimer) clearTimeout(serveTimer);\n\n toast.push({ kind: \"success\", message: successMessage });\n setModalOpen(false);\n\n router.push(navigateTo);\n\n setTimeout(() => setOverlayOpen(false), 500);\n } catch (e: unknown) {\n if (serveTimer) clearTimeout(serveTimer);\n setOverlayOpen(false);\n const msg = errorMessage(e);\n setError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setBusy(false);\n }\n }\n\n async function confirmCreateTeam() {\n const recipe = createRecipe;\n const err = validateTeamIdForCreate(recipe, createTeamId);\n if (err) {\n setCreateError(err);\n return;\n }\n if (!recipe) return;\n\n const t = createTeamId.trim();\n await scaffoldWithOverlay({\n kind: \"team\",\n recipeId: recipe.id,\n teamId: t,\n cronInstallChoice: installCron ? \"yes\" : \"no\",\n setBusy: setCreateBusy,\n setError: setCreateError,\n setModalOpen: setCreateOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created team: ${t}`,\n navigateTo: `/teams/${encodeURIComponent(t)}`,\n waitBeforeNavigate: () => waitForTeamPageReady(t, { timeoutMs: 60_000 }),\n });\n }\n\n async function confirmCreateAgent() {\n const recipe = createAgentRecipe;\n if (!recipe) return;\n\n const a = createAgentId.trim();\n if (!a) {\n setCreateAgentError(\"Agent id is required.\");\n return;\n }\n if (a === recipe.id) {\n setCreateAgentError(`Agent id cannot be the same as the recipe id (${recipe.id}). Choose a new agent id.`);\n return;\n }\n\n await scaffoldWithOverlay({\n kind: \"agent\",\n recipeId: recipe.id,\n agentId: a,\n name: createAgentName.trim() || undefined,\n setBusy: setCreateAgentBusy,\n setError: setCreateAgentError,\n setModalOpen: setCreateAgentOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created agent: ${a}`,\n navigateTo: `/agents/${encodeURIComponent(a)}`,\n });\n }\n\n async function confirmCreateCustomTeam() {\n const teamId = createCustomTeamId.trim();\n if (!teamId) {\n setCreateCustomTeamError(\"Team id is required.\");\n return;\n }\n const recipeId = teamId.endsWith(\"-team\") ? teamId.slice(0, -\"-team\".length) : teamId;\n if (!recipeId) {\n setCreateCustomTeamError(\"Team id is invalid.\");\n return;\n }\n if (customTeamRoles.length < 1) {\n setCreateCustomTeamError(\"Select at least one agent.\");\n return;\n }\n\n setCreateCustomTeamError(null);\n\n try {\n setCreateCustomTeamBusy(true);\n const createRes = await fetchJsonWithStatus<{ ok?: boolean; error?: string; recipeId?: string }>(\n \"/api/recipes/custom-team\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n recipeId,\n teamId,\n roles: customTeamRoles.map((r) => ({ roleId: r.roleId, displayName: r.displayName })),\n }),\n },\n );\n setCreateCustomTeamBusy(false);\n\n if (!createRes.ok) {\n throw new Error(createRes.error);\n }\n if (!createRes.data.ok) {\n throw new Error(createRes.data.error || \"Failed to create custom team recipe\");\n }\n\n await scaffoldWithOverlay({\n kind: \"team\",\n recipeId,\n teamId,\n cronInstallChoice: \"no\",\n setBusy: setCreateCustomTeamBusy,\n setError: setCreateCustomTeamError,\n setModalOpen: setCreateCustomTeamOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created team: ${teamId}`,\n navigateTo: `/teams/${encodeURIComponent(teamId)}`,\n waitBeforeNavigate: async () => {\n // Some scaffold paths may not persist team.json (meta) immediately.\n // Ensure it exists so the team editor loads reliably.\n await attachTeamMeta(teamId, recipeId, \"Custom Team\");\n await waitForTeamPageReady(teamId, { timeoutMs: 60_000 });\n },\n });\n } catch (e: unknown) {\n setCreateCustomTeamBusy(false);\n const msg = errorMessage(e);\n setCreateCustomTeamError(msg);\n toast.push({ kind: \"error\", message: msg });\n }\n }\n\n return (\n <>\n <ScaffoldOverlay\n open={overlayOpen}\n step={overlayStep}\n onDismiss={() => {\n setOverlayOpen(false);\n }}\n />\n <div className=\"mt-8 space-y-10\">\n <section>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n <div>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Custom recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n Workspace recipes (editable) — stored under <code className=\"font-mono\">~/.openclaw/workspace/recipes/</code>.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onCreateCustomTeam}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create custom team\n </button>\n </div>\n\n <div className=\"mt-4 space-y-8\">\n <RecipesSection\n title={`Teams (${customTeamRecipes.length})`}\n items={customTeamRecipes}\n onDelete={onDelete}\n onCreateTeam={onCreateTeam}\n installedAgentIds={installedAgentIds}\n />\n <RecipesSection\n title={`Agents (${customAgentRecipes.length})`}\n items={customAgentRecipes}\n onDelete={onDelete}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Builtin recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">Bundled recipes shipped with the plugin.</p>\n\n <div className=\"mt-4\">\n <RecipesSection\n title={`All (${builtin.length})`}\n items={builtin}\n onCreateTeam={onCreateTeam}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n </div>\n\n <DeleteRecipeModal\n open={deleteOpen}\n recipeId={deleteId}\n busy={busy}\n error={modalError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <CreateCustomTeamModal\n open={createCustomTeamOpen}\n teamId={createCustomTeamId}\n setTeamId={setCreateCustomTeamId}\n busy={createCustomTeamBusy}\n error={createCustomTeamError}\n onRolesChange={setCustomTeamRoles}\n onClose={() => setCreateCustomTeamOpen(false)}\n onConfirm={confirmCreateCustomTeam}\n />\n\n <CreateTeamModal\n open={createOpen}\n recipeId={createRecipe?.id ?? \"\"}\n recipeName={createRecipe?.name ?? \"\"}\n teamId={createTeamId}\n setTeamId={setCreateTeamId}\n installCron={installCron}\n setInstallCron={setInstallCron}\n busy={createBusy}\n error={createError}\n onClose={() => setCreateOpen(false)}\n onConfirm={confirmCreateTeam}\n />\n\n <CreateAgentModal\n open={createAgentOpen}\n recipeId={createAgentRecipe?.id ?? \"\"}\n recipeName={createAgentRecipe?.name ?? \"\"}\n agentId={createAgentId}\n setAgentId={setCreateAgentId}\n agentName={createAgentName}\n setAgentName={setCreateAgentName}\n existingRecipeIds={[...builtin, ...customTeamRecipes, ...customAgentRecipes].map((r) => r.id)}\n existingAgentIds={installedAgentIds}\n busy={createAgentBusy}\n error={createAgentError}\n onClose={() => setCreateAgentOpen(false)}\n onConfirm={confirmCreateAgent}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport type ScaffoldOverlayStep = 1 | 2 | 3;\n\nconst stepLabel: Record<ScaffoldOverlayStep, string> = {\n 1: \"Ordering team…\",\n 2: \"Cooking up agents…\",\n 3: \"Serving them up hot…\",\n};\n\nfunction getStepCircleClass(done: boolean, active: boolean): string {\n if (done) return \"bg-emerald-400\";\n if (active) return \"bg-[var(--ck-accent-red)] animate-pulse\";\n return \"bg-white/20\";\n}\n\nexport function ScaffoldOverlay({\n open,\n step,\n onDismiss,\n}: {\n open: boolean;\n step: ScaffoldOverlayStep;\n onDismiss?: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n {/* Slightly transparent full-screen overlay so we hide the app while still showing a hint of context. */}\n <div className=\"fixed inset-0 bg-white/90 dark:bg-black/90 pointer-events-none\" />\n\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onDismiss();\n }}\n className=\"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-glass-strong)]\"\n aria-label=\"Dismiss loading overlay\"\n title=\"Dismiss\"\n >\n Esc\n </button>\n ) : null}\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <div className=\"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-2xl font-semibold text-[color:var(--ck-text-primary)]\">Claw Kitchen</div>\n <div className=\"mt-3 text-base text-[color:var(--ck-text-secondary)]\">Hang tight — we’re updating your OpenClaw install.</div>\n\n <div className=\"mt-8 space-y-4 text-base\">\n {[1, 2, 3].map((n) => {\n const s = n as ScaffoldOverlayStep;\n const active = s === step;\n const done = s < step;\n return (\n <div key={s} className=\"flex items-center gap-4\">\n <div className={\"h-4 w-4 rounded-full \" + getStepCircleClass(done, active)} />\n <div className={done ? \"text-[color:var(--ck-text-secondary)] line-through\" : \"text-[color:var(--ck-text-primary)]\"}>\n {stepLabel[s]}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Details removed — avoid noisy/scrolling stderr in the primary UX. */}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","/**\n * Polls until check returns a non-null value or timeout. Returns the value or null on timeout.\n */\nexport async function pollUntil<T>(\n check: () => Promise<T | null>,\n opts: { timeoutMs: number; intervalMs?: number }\n): Promise<T | null> {\n const intervalMs = opts.intervalMs ?? 500;\n const started = Date.now();\n\n while (Date.now() - started < opts.timeoutMs) {\n const result = await check();\n if (result !== null) return result;\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n\n return null;\n}\n","\"use client\";\n\nimport { useEffect, useMemo } from \"react\";\nimport { slugifyId } from \"@/lib/slugify\";\n\n/** Manages name -> slugified id with touch tracking. Resets on modal close. */\nexport function useSlugifiedId(opts: {\n open: boolean;\n name: string;\n setName: (v: string) => void;\n id: string;\n setId: (v: string) => void;\n idTouched: boolean;\n setIdTouched: (v: boolean) => void;\n slugify?: (s: string, maxLen?: number) => string;\n}): { derivedId: string; effectiveId: string } {\n const { open, name, setName, id, setId, idTouched, setIdTouched, slugify = slugifyId } = opts;\n\n const derivedId = useMemo(() => slugify(name), [name, slugify]);\n const effectiveId = idTouched ? id : derivedId;\n\n useEffect(() => {\n if (!open) return;\n if (!idTouched) setId(derivedId);\n }, [derivedId, open, idTouched, setId]);\n\n useEffect(() => {\n if (open) return;\n setIdTouched(false);\n setName(\"\");\n setId(\"\");\n }, [open, setIdTouched, setName, setId]);\n\n return { derivedId, effectiveId };\n}\n","\"use client\";\n\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\n\nexport function CreateModalShell({\n open,\n title,\n recipeId,\n recipeName,\n children,\n error,\n busy,\n canConfirm,\n onClose,\n onConfirm,\n confirmLabel,\n}: {\n open: boolean;\n title: string;\n recipeId: string;\n recipeName: string;\n children: React.ReactNode;\n error?: string | null;\n busy?: boolean;\n canConfirm: boolean;\n onClose: () => void;\n onConfirm: () => void;\n confirmLabel: string;\n}) {\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title={title}\n error={error}\n confirmLabel={confirmLabel}\n confirmBusyLabel=\"Creating…\"\n confirmDisabled={!canConfirm}\n busy={busy}\n onConfirm={onConfirm}\n >\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Create a new {title.toLowerCase().replace(\"create \", \"\")} from recipe{\" \"}\n <code className=\"font-mono\">{recipeId}</code>\n {recipeName ? (\n <>\n {\" \"}(<span className=\"font-medium\">{recipeName}</span>)\n </>\n ) : null}\n .\n </p>\n {children}\n </ConfirmationModal>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSlugifiedId } from \"@/lib/use-slugified-id\";\nimport { CreateModalShell } from \"./CreateModalShell\";\n\nexport function CreateTeamModal({\n open,\n recipeId,\n recipeName,\n teamId,\n setTeamId,\n installCron,\n setInstallCron,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n teamId: string;\n setTeamId: (v: string) => void;\n installCron: boolean;\n setInstallCron: (v: boolean) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [teamName, setTeamName] = useState(\"\");\n const [idTouched, setIdTouched] = useState(false);\n\n const { effectiveId } = useSlugifiedId({\n open,\n name: teamName,\n setName: setTeamName,\n id: teamId,\n setId: setTeamId,\n idTouched,\n setIdTouched,\n });\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create team\"\n recipeId={recipeId}\n recipeName={recipeName}\n error={error}\n busy={busy}\n canConfirm={!!effectiveId.trim()}\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create team\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team name</label>\n <input\n value={teamName}\n onChange={(e) => setTeamName(e.target.value)}\n placeholder=\"e.g. Crypto Team\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setTeamId(e.target.value);\n }}\n placeholder=\"e.g. my-team\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This will scaffold ~/.openclaw/workspace-&lt;teamId&gt; and add the team to config.\n </div>\n </div>\n\n <label className=\"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={installCron} onChange={(e) => setInstallCron(e.target.checked)} />\n Install cron jobs from this recipe\n </label>\n </CreateModalShell>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { CreateModalShell } from \"./CreateModalShell\";\nimport { fetchJsonWithStatus } from \"@/lib/fetch-json\";\n\ntype LocalAgentCatalogItem =\n | {\n kind: \"team-role\";\n recipeId: string;\n recipeName?: string;\n roleId: string;\n roleName?: string;\n }\n | {\n kind: \"single-agent\";\n recipeId: string;\n recipeName?: string;\n description?: string;\n };\n\ntype SelectedRole = { agentId: string; roleId: string; displayName: string };\n\nfunction defaultRoleIdFromAgentId(agentId: string) {\n // Strip any existing team prefix if present; keep it sluggy.\n const id = agentId.split(\"/\").pop() || agentId;\n const last = id.split(\"-\").slice(-1)[0] || id;\n return last.toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\");\n}\n\nfunction normalizeTeamIdInput(v: string) {\n // UX: when the user types spaces, turn them into dashes (live).\n // Also keep it lowercase to match id rules.\n return v.toLowerCase().replace(/\\s+/g, \"-\");\n}\n\nfunction isValidId(id: string) {\n return /^[a-z0-9][a-z0-9_-]{1,62}$/.test(id);\n}\n\nfunction isValidTeamId(id: string) {\n // OpenClaw scaffold-team constraint.\n return isValidId(id) && id.endsWith(\"-team\");\n}\n\nexport function CreateCustomTeamModal({\n open,\n teamId,\n setTeamId,\n busy,\n error,\n onClose,\n onConfirm,\n onRolesChange,\n}: {\n open: boolean;\n teamId: string;\n setTeamId: (v: string) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n onRolesChange: (roles: SelectedRole[]) => void;\n}) {\n const [catalog, setCatalog] = useState<LocalAgentCatalogItem[]>([]);\n const [catalogError, setCatalogError] = useState<string | null>(null);\n const [catalogQuery, setCatalogQuery] = useState<string>(\"\");\n const [selected, setSelected] = useState<Record<string, SelectedRole>>({});\n\n const [previewMd, setPreviewMd] = useState<string | null>(null);\n const [previewPath, setPreviewPath] = useState<string | null>(null);\n const [previewError, setPreviewError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n const res = await fetchJsonWithStatus<{ ok?: boolean; items?: LocalAgentCatalogItem[]; error?: string }>(\n \"/api/recipes/local-agent-catalog\",\n { cache: \"no-store\" },\n );\n if (cancelled) return;\n if (!res.ok) {\n setCatalogError(res.error || \"Failed to load local agent catalog\");\n return;\n }\n if (!res.data.ok) {\n setCatalogError(res.data.error || \"Failed to load local agent catalog\");\n return;\n }\n setCatalog(Array.isArray(res.data.items) ? res.data.items : []);\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n const [availability, setAvailability] = useState<\n | { state: \"unknown\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string }\n >({ state: \"unknown\" });\n\n const agentChoices = useMemo(() => {\n const needle = catalogQuery.trim().toLowerCase();\n\n const list = catalog.map((it) => {\n if (it.kind === \"team-role\") {\n const key = `team:${it.recipeId}:${it.roleId}`;\n const recipeLabel = it.recipeName || it.recipeId;\n const roleLabel = it.roleName ? `${it.roleName} (${it.roleId})` : it.roleId;\n return {\n id: key,\n label: `${recipeLabel} → ${roleLabel}`,\n roleId: it.roleId,\n displayName: it.roleName || `${recipeLabel} ${it.roleId}`,\n haystack: `${it.recipeId} ${it.recipeName || \"\"} ${it.roleId} ${it.roleName || \"\"}`.toLowerCase(),\n };\n }\n\n const key = `agent:${it.recipeId}`;\n const recipeLabel = it.recipeName || it.recipeId;\n const descriptionSuffix = it.description ? ` — ${it.description}` : \"\";\n return {\n id: key,\n label: `${recipeLabel} (agent recipe: ${it.recipeId})${descriptionSuffix}`,\n roleId: defaultRoleIdFromAgentId(it.recipeId),\n displayName: recipeLabel,\n haystack: `${it.recipeId} ${it.recipeName || \"\"} ${it.description || \"\"}`.toLowerCase(),\n };\n });\n\n const filtered = needle ? list.filter((x) => x.haystack.includes(needle)) : list;\n\n return filtered\n .slice()\n .sort((a, b) => a.label.localeCompare(b.label))\n .map(({ haystack: _unusedHaystack, ...rest }) => rest);\n }, [catalog, catalogQuery]);\n\n const roles = useMemo(() => Object.values(selected), [selected]);\n\n const teamIdTrimmed = teamId.trim();\n const teamIdError = useMemo(() => {\n if (!open) return null;\n if (!teamIdTrimmed) return \"Team id is required.\";\n if (!isValidId(teamIdTrimmed)) {\n return \"Invalid team id. Use lowercase letters/numbers with - or _ (2-63 chars).\";\n }\n if (!teamIdTrimmed.endsWith(\"-team\")) {\n return \"Team id must end with -team.\";\n }\n if (availability.state === \"taken\") {\n return `Team id is already taken: ${teamIdTrimmed}`;\n }\n return null;\n }, [open, teamIdTrimmed, availability.state]);\n\n const roleErrors = useMemo(() => {\n const errors = new Map<string, string>();\n for (const r of roles) {\n const roleId = String(r.roleId ?? \"\").trim();\n if (!roleId) {\n errors.set(r.agentId, \"Role id is required.\");\n continue;\n }\n if (!isValidId(roleId)) {\n errors.set(r.agentId, \"Invalid role id (lowercase letters/numbers with - or _).\" );\n }\n }\n return errors;\n }, [roles]);\n\n const canConfirm =\n !teamIdError &&\n availability.state !== \"checking\" &&\n availability.state !== \"unknown\" &&\n roles.length > 0 &&\n roleErrors.size === 0;\n\n useEffect(() => {\n if (!open) return;\n onRolesChange(roles);\n }, [open, roles, onRolesChange]);\n\n // Team id availability check (debounced).\n useEffect(() => {\n if (!open) return;\n\n let cancelled = false;\n const t = setTimeout(async () => {\n if (!teamIdTrimmed || !isValidTeamId(teamIdTrimmed)) {\n setAvailability({ state: \"unknown\" });\n return;\n }\n\n setAvailability({ state: \"checking\" });\n\n const res = await fetchJsonWithStatus<{ ok?: boolean; available?: boolean; reason?: string; error?: string }>(\n `/api/ids/check?kind=team&id=${encodeURIComponent(teamIdTrimmed)}`,\n { cache: \"no-store\" },\n );\n\n if (cancelled) return;\n\n if (!res.ok) {\n setAvailability({ state: \"unknown\" });\n return;\n }\n\n if (res.data.ok && res.data.available === true) {\n setAvailability({ state: \"available\" });\n return;\n }\n\n setAvailability({ state: \"taken\", reason: res.data.reason });\n }, 250);\n\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [open, teamIdTrimmed]);\n\n // Best-effort preview (debounced).\n useEffect(() => {\n if (!open) return;\n if (!canConfirm) return;\n\n let cancelled = false;\n const t = setTimeout(async () => {\n const baseRecipeId = teamIdTrimmed.endsWith(\"-team\") ? teamIdTrimmed.slice(0, -\"-team\".length) : teamIdTrimmed;\n\n const res = await fetchJsonWithStatus<{\n ok?: boolean;\n error?: string;\n md?: string;\n filePath?: string;\n }>(\"/api/recipes/custom-team\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n dryRun: true,\n recipeId: baseRecipeId,\n teamId: teamIdTrimmed,\n roles: roles.map((r) => ({ roleId: r.roleId, displayName: r.displayName })),\n }),\n });\n\n if (cancelled) return;\n\n if (!res.ok) {\n setPreviewError(res.error);\n setPreviewMd(null);\n setPreviewPath(null);\n return;\n }\n if (!res.data.ok) {\n setPreviewError(res.data.error || \"Failed to generate preview\");\n setPreviewMd(null);\n setPreviewPath(null);\n return;\n }\n\n setPreviewError(null);\n setPreviewMd(typeof res.data.md === \"string\" ? res.data.md : null);\n setPreviewPath(typeof res.data.filePath === \"string\" ? res.data.filePath : null);\n }, 250);\n\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [open, canConfirm, teamIdTrimmed, roles]);\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create custom team\"\n recipeId={\"(new recipe)\"}\n recipeName={\"Custom Team\"}\n error={error || catalogError}\n busy={busy}\n canConfirm={canConfirm}\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create team\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={teamId}\n onChange={(e) => setTeamId(normalizeTeamIdInput(e.target.value))}\n placeholder=\"e.g. my-team\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n {teamIdError ? <div className=\"mt-2 text-xs text-red-300\">{teamIdError}</div> : null}\n {!teamIdError && teamIdTrimmed ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {availability.state === \"checking\" ? \"Checking availability…\" : null}\n {availability.state === \"available\" ? \"Available.\" : null}\n </div>\n ) : null}\n </div>\n\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Select agents</div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n MVP: this creates new team roles that mirror the selected agents&apos; names. You can edit the\n resulting team recipe later.\n </div>\n\n <div className=\"mt-3\">\n <input\n value={catalogQuery}\n onChange={(e) => setCatalogQuery(e.target.value)}\n placeholder=\"Search local roles/agents (recipe id, name, role)\"\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n />\n\n <div className=\"mt-3 max-h-[220px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3\">\n {catalogError ? <div className=\"text-sm text-red-300\">{catalogError}</div> : null}\n {!catalogError && agentChoices.length === 0 ? (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No local roles/agents found.</div>\n ) : null}\n {!catalogError && agentChoices.length ? (\n <div className=\"space-y-2\">\n {agentChoices.map((a) => {\n const checked = !!selected[a.id];\n return (\n <label key={a.id} className=\"flex items-start gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => {\n const next = { ...selected };\n if (e.target.checked) {\n next[a.id] = {\n agentId: a.id,\n roleId: a.roleId,\n displayName: a.displayName,\n };\n } else {\n delete next[a.id];\n }\n setSelected(next);\n }}\n />\n <span className=\"min-w-0 break-words\">{a.label}</span>\n </label>\n );\n })}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n\n {roles.length ? (\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Role mapping</div>\n <div className=\"mt-3 space-y-3\">\n {roles.map((r) => {\n const roleErr = roleErrors.get(r.agentId);\n return (\n <div key={r.agentId} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{r.agentId}</div>\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Role id</label>\n <input\n value={r.roleId}\n onChange={(e) => {\n setSelected((prev) => ({\n ...prev,\n [r.agentId]: { ...prev[r.agentId], roleId: e.target.value },\n }));\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n {roleErr ? <div className=\"mt-1 text-xs text-red-300\">{roleErr}</div> : null}\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Display name</label>\n <input\n value={r.displayName}\n onChange={(e) => {\n setSelected((prev) => ({\n ...prev,\n [r.agentId]: { ...prev[r.agentId], displayName: e.target.value },\n }));\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n ) : null}\n\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Preview</div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Generated recipe preview (best-effort). This is what will be written to\n <code className=\"ml-1\">~/.openclaw/workspace/recipes/&lt;teamId&gt;.md</code>.\n </div>\n {canConfirm && previewError ? <div className=\"mt-2 text-xs text-red-300\">{previewError}</div> : null}\n {canConfirm && previewPath ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Target path: <code>{previewPath}</code>\n </div>\n ) : null}\n <pre className=\"mt-3 max-h-[260px] overflow-auto whitespace-pre-wrap rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-3 text-xs text-[color:var(--ck-text-secondary)]\">\n {canConfirm ? previewMd || \"(Loading preview…)\" : \"(Select a valid team id and at least one agent to preview.)\"}\n </pre>\n </div>\n </CreateModalShell>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { useSlugifiedId } from \"@/lib/use-slugified-id\";\nimport { CreateModalShell } from \"./CreateModalShell\";\n\nfunction getAvailabilityBorderClass(state: string): string {\n if (state === \"available\") return \"border-emerald-400/50\";\n if (state === \"taken\") return \"border-red-400/60\";\n return \"border-white/10\";\n}\n\nfunction getAvailabilityHint(state: string): string {\n if (state === \"taken\") return \"That id is already taken.\";\n if (state === \"available\") return \"Id is available.\";\n return \"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config.\";\n}\n\ntype Availability =\n | { state: \"empty\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string };\n\n/** Sync availability from local arrays (no fetch). Returns null when API check needed. */\nfunction syncAvailability(\n v: string,\n existingRecipeIds: string[],\n existingAgentIds: string[]\n): Availability | null {\n if (!v) return { state: \"empty\" };\n if (existingRecipeIds.includes(v)) return { state: \"taken\", reason: \"recipe-id-collision\" };\n if (existingAgentIds.includes(v)) return { state: \"taken\", reason: \"agent-exists\" };\n return null;\n}\n\nexport function CreateAgentModal({\n open,\n recipeId,\n recipeName,\n agentId,\n setAgentId,\n agentName,\n setAgentName,\n existingRecipeIds,\n existingAgentIds,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n agentId: string;\n setAgentId: (v: string) => void;\n agentName: string;\n setAgentName: (v: string) => void;\n existingRecipeIds: string[];\n existingAgentIds: string[];\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [idTouched, setIdTouched] = useState(false);\n const [apiAvailability, setApiAvailability] = useState<Availability | null>(null);\n\n const { effectiveId } = useSlugifiedId({\n open,\n name: agentName,\n setName: setAgentName,\n id: agentId,\n setId: setAgentId,\n idTouched,\n setIdTouched,\n });\n\n const v = String(effectiveId ?? \"\").trim();\n const syncAvail = useMemo(\n () => (open ? syncAvailability(v, existingRecipeIds, existingAgentIds) : { state: \"empty\" as const }),\n [open, v, existingRecipeIds, existingAgentIds]\n );\n\n const availability: Availability = syncAvail ?? apiAvailability ?? { state: \"available\" };\n\n useEffect(() => {\n if (!open || syncAvail !== null) return;\n const t = setTimeout(() => {\n void (async () => {\n setApiAvailability({ state: \"checking\" });\n try {\n const json = await fetchJson<{ ok?: boolean; available?: boolean; reason?: string }>(\n `/api/ids/check?kind=agent&id=${encodeURIComponent(v)}`,\n { cache: \"no-store\" }\n );\n if (json.available) setApiAvailability({ state: \"available\" });\n else setApiAvailability({ state: \"taken\", reason: json.reason });\n } catch {\n setApiAvailability({ state: \"available\" });\n }\n })();\n }, 250);\n return () => clearTimeout(t);\n }, [open, syncAvail, v]);\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create agent\"\n recipeId={recipeId}\n recipeName={recipeName}\n error={error}\n busy={busy}\n canConfirm={\n !!effectiveId.trim() &&\n availability.state !== \"taken\" &&\n availability.state !== \"checking\"\n }\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create agent\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent name</label>\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\n placeholder=\"e.g. Crypto Onchain\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setAgentId(e.target.value);\n }}\n placeholder=\"e.g. crypto-onchain\"\n className={\n \"mt-2 w-full rounded-[var(--ck-radius-sm)] border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] \" +\n getAvailabilityBorderClass(availability.state)\n }\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {getAvailabilityHint(availability.state)}\n </div>\n </div>\n </CreateModalShell>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/app/recipes/recipes-client.tsx","../../../../src/components/ScaffoldOverlay.tsx","../../../../src/lib/poll.ts","../../../../src/lib/use-slugified-id.ts","../../../../src/app/recipes/CreateModalShell.tsx","../../../../src/app/recipes/CreateTeamModal.tsx","../../../../src/app/recipes/CreateCustomTeamModal.tsx","../../../../src/app/recipes/CreateAgentModal.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"next/link\";\nimport { useRouter } from \"next/navigation\";\nimport { useState } from \"react\";\nimport { ScaffoldOverlay, type ScaffoldOverlayStep } from \"@/components/ScaffoldOverlay\";\nimport { fetchJsonWithStatus } from \"@/lib/fetch-json\";\nimport { pollUntil } from \"@/lib/poll\";\nimport { fetchScaffold } from \"@/lib/scaffold-client\";\nimport { useToast } from \"@/components/ToastProvider\";\nimport { CreateTeamModal } from \"./CreateTeamModal\";\nimport { CreateCustomTeamModal } from \"./CreateCustomTeamModal\";\nimport { CreateAgentModal } from \"./CreateAgentModal\";\nimport { DeleteRecipeModal } from \"@/components/delete-modals\";\nimport { errorMessage } from \"@/lib/errors\";\n\ntype Recipe = {\n id: string;\n name: string;\n kind: \"agent\" | \"team\";\n source: \"builtin\" | \"workspace\";\n};\n\nfunction getEditLabel(isInstalledAgent: boolean, source: string): string {\n if (isInstalledAgent) return \"Edit agent\";\n if (source === \"builtin\") return \"View recipe\";\n return \"Edit recipe\";\n}\n\nfunction RecipesSection({\n title,\n items,\n onDelete,\n onCreateTeam,\n onCreateAgent,\n installedAgentIds,\n}: {\n title: string;\n items: Recipe[];\n onDelete?: (id: string) => void;\n onCreateTeam?: (r: Recipe) => void;\n onCreateAgent?: (r: Recipe) => void;\n installedAgentIds: string[];\n}) {\n return (\n <section>\n <h2 className=\"text-lg font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">{title}</h2>\n\n {items.length === 0 ? (\n <div className=\"mt-3 ck-glass px-4 py-3 text-sm text-[color:var(--ck-text-secondary)]\">None yet.</div>\n ) : (\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {items.map((r) => {\n const isInstalledAgent = r.kind === \"agent\" && installedAgentIds.includes(r.id);\n const editHref = isInstalledAgent\n ? `/agents/${encodeURIComponent(r.id)}`\n : `/recipes/${encodeURIComponent(r.id)}`;\n const editLabel = getEditLabel(isInstalledAgent, r.source);\n\n return (\n <div\n key={`${r.source}:${r.id}`}\n className=\"ck-glass flex flex-col gap-3 px-4 py-3\"\n >\n <div>\n <div className=\"font-medium text-[color:var(--ck-text-primary)] whitespace-normal break-words\">\n {r.name}\n </div>\n <div className=\"mt-1 text-xs text-[color:var(--ck-text-secondary)]\">\n <span className=\"font-mono\">{r.id}</span> • {r.kind} • {r.source}\n </div>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {r.kind === \"team\" && onCreateTeam ? (\n <button\n type=\"button\"\n onClick={() => onCreateTeam(r)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create team\n </button>\n ) : null}\n\n {r.kind === \"agent\" && onCreateAgent ? (\n <button\n type=\"button\"\n onClick={() => onCreateAgent(r)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create agent\n </button>\n ) : null}\n\n <Link\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n href={editHref}\n >\n {editLabel}\n </Link>\n\n {onDelete ? (\n <button\n type=\"button\"\n onClick={() => onDelete(r.id)}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] hover:bg-white/10\"\n >\n Delete\n </button>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </section>\n );\n}\n\nexport default function RecipesClient({\n builtin,\n customTeamRecipes,\n customAgentRecipes,\n installedAgentIds,\n initialOpenCustomTeam = false,\n}: {\n builtin: Recipe[];\n customTeamRecipes: Recipe[];\n customAgentRecipes: Recipe[];\n installedAgentIds: string[];\n initialOpenCustomTeam?: boolean;\n}) {\n const toast = useToast();\n\n const [overlayOpen, setOverlayOpen] = useState(false);\n const [overlayStep, setOverlayStep] = useState<ScaffoldOverlayStep>(1);\n const router = useRouter();\n\n const [deleteOpen, setDeleteOpen] = useState(false);\n const [deleteId, setDeleteId] = useState<string>(\"\");\n const [busy, setBusy] = useState(false);\n const [modalError, setModalError] = useState<string | null>(null);\n\n const [createOpen, setCreateOpen] = useState(false);\n const [createRecipe, setCreateRecipe] = useState<Recipe | null>(null);\n const [createTeamId, setCreateTeamId] = useState<string>(\"\");\n const [installCron, setInstallCron] = useState(true);\n const [createBusy, setCreateBusy] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n\n const [createAgentOpen, setCreateAgentOpen] = useState(false);\n const [createAgentRecipe, setCreateAgentRecipe] = useState<Recipe | null>(null);\n const [createAgentId, setCreateAgentId] = useState<string>(\"\");\n const [createAgentName, setCreateAgentName] = useState<string>(\"\");\n const [createAgentBusy, setCreateAgentBusy] = useState(false);\n const [createAgentError, setCreateAgentError] = useState<string | null>(null);\n\n const [createCustomTeamOpen, setCreateCustomTeamOpen] = useState(initialOpenCustomTeam);\n const [createCustomTeamId, setCreateCustomTeamId] = useState<string>(\"\");\n const [createCustomTeamBusy, setCreateCustomTeamBusy] = useState(false);\n const [createCustomTeamError, setCreateCustomTeamError] = useState<string | null>(null);\n const [customTeamRoles, setCustomTeamRoles] = useState<Array<{ agentId: string; roleId: string; displayName: string }>>(\n [],\n );\n\n const onDelete = (id: string) => {\n setDeleteId(id);\n setModalError(null);\n setDeleteOpen(true);\n };\n\n const onCreateTeam = (r: Recipe) => {\n setCreateRecipe(r);\n setCreateTeamId(\"\");\n setInstallCron(true);\n setCreateError(null);\n setCreateOpen(true);\n };\n\n const onCreateAgent = (r: Recipe) => {\n setCreateAgentRecipe(r);\n setCreateAgentId(\"\");\n setCreateAgentName(\"\");\n setCreateAgentError(null);\n setCreateAgentOpen(true);\n };\n\n const onCreateCustomTeam = () => {\n setCreateCustomTeamId(\"\");\n setCustomTeamRoles([]);\n setCreateCustomTeamError(null);\n setCreateCustomTeamOpen(true);\n };\n\n async function confirmDelete() {\n setBusy(true);\n setModalError(null);\n try {\n const result = await fetchJsonWithStatus<{ ok?: boolean; error?: string }>(\"/api/recipes/delete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ id: deleteId }),\n });\n if (!result.ok) {\n if (result.status === 409) {\n setModalError(result.error);\n return;\n }\n throw new Error(result.error);\n }\n if (!result.data.ok) {\n setModalError(result.data.error ?? \"Delete failed\");\n return;\n }\n toast.push({ kind: \"success\", message: `Deleted recipe: ${deleteId}` });\n setDeleteOpen(false);\n window.location.reload();\n } catch (e: unknown) {\n toast.push({ kind: \"error\", message: errorMessage(e) });\n } finally {\n setBusy(false);\n }\n }\n\n async function waitForKitchenHealthy(opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const result = await pollUntil<boolean>(\n async () => {\n try {\n const res = await fetch(\"/healthz\", { cache: \"no-store\" });\n return res.ok ? true : null;\n } catch {\n return null;\n }\n },\n { timeoutMs }\n );\n return result ?? false;\n }\n\n async function waitForTeamPageReady(teamId: string, opts?: { timeoutMs?: number }) {\n const timeoutMs = opts?.timeoutMs ?? 30_000;\n const result = await pollUntil<boolean>(\n async () => {\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 recipesJson = (await recipesRes.json()) as { recipes?: Array<{ id?: unknown; kind?: unknown }> };\n const list = Array.isArray(recipesJson.recipes) ? recipesJson.recipes : [];\n const hasRecipe = list.some((r) => String(r.id ?? \"\") === teamId && String(r.kind ?? \"\") === \"team\");\n\n const metaJson = (await metaRes.json()) as { ok?: boolean; missing?: boolean };\n const hasMeta = Boolean(metaRes.ok && metaJson.ok && !metaJson.missing);\n\n return hasRecipe && hasMeta ? true : null;\n } catch {\n return null;\n }\n },\n { timeoutMs }\n );\n return result ?? false;\n }\n\n async function attachTeamMeta(teamId: string, recipeId: string, recipeName: string) {\n const res = await fetchJsonWithStatus<{ ok?: boolean; error?: string }>(\"/api/teams/meta\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ teamId, recipeId, recipeName }),\n });\n if (!res.ok) throw new Error(res.error);\n if (!res.data.ok) throw new Error(res.data.error || \"Failed to attach team meta\");\n }\n\n function validateTeamIdForCreate(recipe: { id: string } | null, teamId: string): string | null {\n if (!recipe) return null;\n const t = teamId.trim();\n if (!t) return \"Team id is required.\";\n if (!t.endsWith(\"-team\")) return \"Team id must end with -team.\";\n if (t === recipe.id) return `Team id cannot be the same as the recipe id (${recipe.id}). Choose a new team id.`;\n return null;\n }\n\n async function scaffoldWithOverlay(opts: {\n kind: \"team\" | \"agent\";\n recipeId: string;\n teamId?: string;\n agentId?: string;\n name?: string;\n cronInstallChoice?: \"yes\" | \"no\";\n setBusy: (v: boolean) => void;\n setError: (v: string | null) => void;\n setModalOpen: (v: boolean) => void;\n setOverlayOpen: (v: boolean) => void;\n setOverlayStep: React.Dispatch<React.SetStateAction<ScaffoldOverlayStep>>;\n successMessage: string;\n navigateTo: string;\n waitBeforeNavigate?: () => Promise<unknown>;\n }) {\n const {\n kind,\n recipeId,\n teamId,\n agentId,\n name,\n cronInstallChoice,\n setBusy,\n setError,\n setModalOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage,\n navigateTo,\n waitBeforeNavigate,\n } = opts;\n\n setBusy(true);\n setError(null);\n setModalOpen(false);\n setOverlayOpen(true);\n setOverlayStep(1);\n\n let serveTimer: ReturnType<typeof setTimeout> | null = null;\n\n try {\n const body =\n kind === \"team\"\n ? { kind: \"team\" as const, recipeId, teamId: teamId!, cronInstallChoice }\n : { kind: \"agent\" as const, recipeId, agentId: agentId!, name };\n const { res, json } = await fetchScaffold(body);\n if (!res.ok || !(json as { ok?: boolean }).ok)\n throw new Error(\n String((json as { error?: string }).error || (kind === \"team\" ? \"Create team failed\" : \"Create agent failed\"))\n );\n\n setOverlayStep(2);\n\n serveTimer = setTimeout(() => {\n setOverlayStep((prev) => (prev < 3 ? 3 : prev));\n }, 20_000);\n\n const stderr = typeof (json as { stderr?: unknown }).stderr === \"string\" ? (json as { stderr: string }).stderr : \"\";\n\n if (/Failed to start CLI:/i.test(stderr) || /\\bError: /i.test(stderr)) {\n throw new Error(stderr.trim() || \"Scaffold failed\");\n }\n\n if (/Restart required:/i.test(stderr)) {\n setOverlayStep(3);\n try {\n await fetch(\"/api/gateway/restart\", { method: \"POST\" });\n } catch {\n // best-effort\n }\n await waitForKitchenHealthy({ timeoutMs: 60_000 });\n }\n\n if (waitBeforeNavigate) {\n await waitBeforeNavigate();\n }\n\n if (serveTimer) clearTimeout(serveTimer);\n\n toast.push({ kind: \"success\", message: successMessage });\n setModalOpen(false);\n\n router.push(navigateTo);\n\n setTimeout(() => setOverlayOpen(false), 500);\n } catch (e: unknown) {\n if (serveTimer) clearTimeout(serveTimer);\n setOverlayOpen(false);\n const msg = errorMessage(e);\n setError(msg);\n toast.push({ kind: \"error\", message: msg });\n } finally {\n setBusy(false);\n }\n }\n\n async function confirmCreateTeam() {\n const recipe = createRecipe;\n const err = validateTeamIdForCreate(recipe, createTeamId);\n if (err) {\n setCreateError(err);\n return;\n }\n if (!recipe) return;\n\n const t = createTeamId.trim();\n await scaffoldWithOverlay({\n kind: \"team\",\n recipeId: recipe.id,\n teamId: t,\n cronInstallChoice: installCron ? \"yes\" : \"no\",\n setBusy: setCreateBusy,\n setError: setCreateError,\n setModalOpen: setCreateOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created team: ${t}`,\n navigateTo: `/teams/${encodeURIComponent(t)}`,\n waitBeforeNavigate: () => waitForTeamPageReady(t, { timeoutMs: 60_000 }),\n });\n }\n\n async function confirmCreateAgent() {\n const recipe = createAgentRecipe;\n if (!recipe) return;\n\n const a = createAgentId.trim();\n if (!a) {\n setCreateAgentError(\"Agent id is required.\");\n return;\n }\n if (a === recipe.id) {\n setCreateAgentError(`Agent id cannot be the same as the recipe id (${recipe.id}). Choose a new agent id.`);\n return;\n }\n\n await scaffoldWithOverlay({\n kind: \"agent\",\n recipeId: recipe.id,\n agentId: a,\n name: createAgentName.trim() || undefined,\n setBusy: setCreateAgentBusy,\n setError: setCreateAgentError,\n setModalOpen: setCreateAgentOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created agent: ${a}`,\n navigateTo: `/agents/${encodeURIComponent(a)}`,\n });\n }\n\n async function confirmCreateCustomTeam() {\n const teamId = createCustomTeamId.trim();\n if (!teamId) {\n setCreateCustomTeamError(\"Team id is required.\");\n return;\n }\n const recipeId = teamId.endsWith(\"-team\") ? teamId.slice(0, -\"-team\".length) : teamId;\n if (!recipeId) {\n setCreateCustomTeamError(\"Team id is invalid.\");\n return;\n }\n if (customTeamRoles.length < 1) {\n setCreateCustomTeamError(\"Select at least one agent.\");\n return;\n }\n\n setCreateCustomTeamError(null);\n\n try {\n setCreateCustomTeamBusy(true);\n const createRes = await fetchJsonWithStatus<{ ok?: boolean; error?: string; recipeId?: string }>(\n \"/api/recipes/custom-team\",\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n recipeId,\n teamId,\n roles: customTeamRoles.map((r) => ({ roleId: r.roleId, displayName: r.displayName })),\n }),\n },\n );\n setCreateCustomTeamBusy(false);\n\n if (!createRes.ok) {\n throw new Error(createRes.error);\n }\n if (!createRes.data.ok) {\n throw new Error(createRes.data.error || \"Failed to create custom team recipe\");\n }\n\n await scaffoldWithOverlay({\n kind: \"team\",\n recipeId,\n teamId,\n cronInstallChoice: \"no\",\n setBusy: setCreateCustomTeamBusy,\n setError: setCreateCustomTeamError,\n setModalOpen: setCreateCustomTeamOpen,\n setOverlayOpen,\n setOverlayStep,\n successMessage: `Created team: ${teamId}`,\n navigateTo: `/teams/${encodeURIComponent(teamId)}`,\n waitBeforeNavigate: async () => {\n // Some scaffold paths may not persist team.json (meta) immediately.\n // Ensure it exists so the team editor loads reliably.\n await attachTeamMeta(teamId, recipeId, \"Custom Team\");\n await waitForTeamPageReady(teamId, { timeoutMs: 60_000 });\n },\n });\n } catch (e: unknown) {\n setCreateCustomTeamBusy(false);\n const msg = errorMessage(e);\n setCreateCustomTeamError(msg);\n toast.push({ kind: \"error\", message: msg });\n }\n }\n\n return (\n <>\n <ScaffoldOverlay\n open={overlayOpen}\n step={overlayStep}\n onDismiss={() => {\n setOverlayOpen(false);\n }}\n />\n <div className=\"mt-8 space-y-10\">\n <section>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between\">\n <div>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Custom recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">\n Workspace recipes (editable) — stored under <code className=\"font-mono\">~/.openclaw/workspace/recipes/</code>.\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onCreateCustomTeam}\n className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-1.5 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] transition-colors hover:bg-white/10 active:bg-white/15\"\n >\n Create custom team\n </button>\n </div>\n\n <div className=\"mt-4 space-y-8\">\n <RecipesSection\n title={`Teams (${customTeamRecipes.length})`}\n items={customTeamRecipes}\n onDelete={onDelete}\n onCreateTeam={onCreateTeam}\n installedAgentIds={installedAgentIds}\n />\n <RecipesSection\n title={`Agents (${customAgentRecipes.length})`}\n items={customAgentRecipes}\n onDelete={onDelete}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n\n <section>\n <h2 className=\"text-xl font-semibold tracking-tight text-[color:var(--ck-text-primary)]\">Builtin recipes</h2>\n <p className=\"mt-1 text-sm text-[color:var(--ck-text-secondary)]\">Bundled recipes shipped with the plugin.</p>\n\n <div className=\"mt-4\">\n <RecipesSection\n title={`All (${builtin.length})`}\n items={builtin}\n onCreateTeam={onCreateTeam}\n onCreateAgent={onCreateAgent}\n installedAgentIds={installedAgentIds}\n />\n </div>\n </section>\n </div>\n\n <DeleteRecipeModal\n open={deleteOpen}\n recipeId={deleteId}\n busy={busy}\n error={modalError}\n onClose={() => setDeleteOpen(false)}\n onConfirm={confirmDelete}\n />\n\n <CreateCustomTeamModal\n open={createCustomTeamOpen}\n teamId={createCustomTeamId}\n setTeamId={setCreateCustomTeamId}\n busy={createCustomTeamBusy}\n error={createCustomTeamError}\n onRolesChange={setCustomTeamRoles}\n onClose={() => setCreateCustomTeamOpen(false)}\n onConfirm={confirmCreateCustomTeam}\n />\n\n <CreateTeamModal\n open={createOpen}\n recipeId={createRecipe?.id ?? \"\"}\n recipeName={createRecipe?.name ?? \"\"}\n teamId={createTeamId}\n setTeamId={setCreateTeamId}\n installCron={installCron}\n setInstallCron={setInstallCron}\n busy={createBusy}\n error={createError}\n onClose={() => setCreateOpen(false)}\n onConfirm={confirmCreateTeam}\n />\n\n <CreateAgentModal\n open={createAgentOpen}\n recipeId={createAgentRecipe?.id ?? \"\"}\n recipeName={createAgentRecipe?.name ?? \"\"}\n agentId={createAgentId}\n setAgentId={setCreateAgentId}\n agentName={createAgentName}\n setAgentName={setCreateAgentName}\n existingRecipeIds={[...builtin, ...customTeamRecipes, ...customAgentRecipes].map((r) => r.id)}\n existingAgentIds={installedAgentIds}\n busy={createAgentBusy}\n error={createAgentError}\n onClose={() => setCreateAgentOpen(false)}\n onConfirm={confirmCreateAgent}\n />\n </>\n );\n}\n","\"use client\";\n\nimport { createPortal } from \"react-dom\";\n\nexport type ScaffoldOverlayStep = 1 | 2 | 3;\n\nconst stepLabel: Record<ScaffoldOverlayStep, string> = {\n 1: \"Ordering team…\",\n 2: \"Cooking up agents…\",\n 3: \"Serving them up hot…\",\n};\n\nfunction getStepCircleClass(done: boolean, active: boolean): string {\n if (done) return \"bg-emerald-400\";\n if (active) return \"bg-[var(--ck-accent-red)] animate-pulse\";\n return \"bg-white/20\";\n}\n\nexport function ScaffoldOverlay({\n open,\n step,\n onDismiss,\n}: {\n open: boolean;\n step: ScaffoldOverlayStep;\n onDismiss?: () => void;\n}) {\n if (!open) return null;\n\n return createPortal(\n <div className=\"fixed inset-0 z-[9999]\">\n {/* Slightly transparent full-screen overlay so we hide the app while still showing a hint of context. */}\n <div className=\"fixed inset-0 bg-[color:var(--ck-bg-base)]/90 pointer-events-none\" />\n\n {onDismiss ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onDismiss();\n }}\n className=\"fixed right-4 top-4 z-[10000] rounded-full border border-white/10 bg-[color:var(--ck-bg-glass)] px-3 py-2 text-sm font-medium text-[color:var(--ck-text-primary)] shadow-[var(--ck-shadow-1)] hover:bg-[color:var(--ck-bg-glass-strong)]\"\n aria-label=\"Dismiss loading overlay\"\n title=\"Dismiss\"\n >\n Esc\n </button>\n ) : null}\n\n <div className=\"fixed inset-0 flex items-center justify-center p-6 sm:p-10\">\n <div className=\"w-full max-w-2xl rounded-2xl border border-white/10 bg-[color:var(--ck-bg-glass-strong)] p-8 sm:p-10 shadow-[var(--ck-shadow-2)]\">\n <div className=\"text-2xl font-semibold text-[color:var(--ck-text-primary)]\">Claw Kitchen</div>\n <div className=\"mt-3 text-base text-[color:var(--ck-text-secondary)]\">Hang tight — we’re updating your OpenClaw install.</div>\n\n <div className=\"mt-8 space-y-4 text-base\">\n {[1, 2, 3].map((n) => {\n const s = n as ScaffoldOverlayStep;\n const active = s === step;\n const done = s < step;\n return (\n <div key={s} className=\"flex items-center gap-4\">\n <div className={\"h-4 w-4 rounded-full \" + getStepCircleClass(done, active)} />\n <div className={done ? \"text-[color:var(--ck-text-secondary)] line-through\" : \"text-[color:var(--ck-text-primary)]\"}>\n {stepLabel[s]}\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Details removed — avoid noisy/scrolling stderr in the primary UX. */}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n","/**\n * Polls until check returns a non-null value or timeout. Returns the value or null on timeout.\n */\nexport async function pollUntil<T>(\n check: () => Promise<T | null>,\n opts: { timeoutMs: number; intervalMs?: number }\n): Promise<T | null> {\n const intervalMs = opts.intervalMs ?? 500;\n const started = Date.now();\n\n while (Date.now() - started < opts.timeoutMs) {\n const result = await check();\n if (result !== null) return result;\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n\n return null;\n}\n","\"use client\";\n\nimport { useEffect, useMemo } from \"react\";\nimport { slugifyId } from \"@/lib/slugify\";\n\n/** Manages name -> slugified id with touch tracking. Resets on modal close. */\nexport function useSlugifiedId(opts: {\n open: boolean;\n name: string;\n setName: (v: string) => void;\n id: string;\n setId: (v: string) => void;\n idTouched: boolean;\n setIdTouched: (v: boolean) => void;\n slugify?: (s: string, maxLen?: number) => string;\n}): { derivedId: string; effectiveId: string } {\n const { open, name, setName, id, setId, idTouched, setIdTouched, slugify = slugifyId } = opts;\n\n const derivedId = useMemo(() => slugify(name), [name, slugify]);\n const effectiveId = idTouched ? id : derivedId;\n\n useEffect(() => {\n if (!open) return;\n if (!idTouched) setId(derivedId);\n }, [derivedId, open, idTouched, setId]);\n\n useEffect(() => {\n if (open) return;\n setIdTouched(false);\n setName(\"\");\n setId(\"\");\n }, [open, setIdTouched, setName, setId]);\n\n return { derivedId, effectiveId };\n}\n","\"use client\";\n\nimport { ConfirmationModal } from \"@/components/ConfirmationModal\";\n\nexport function CreateModalShell({\n open,\n title,\n recipeId,\n recipeName,\n children,\n error,\n busy,\n canConfirm,\n onClose,\n onConfirm,\n confirmLabel,\n}: {\n open: boolean;\n title: string;\n recipeId: string;\n recipeName: string;\n children: React.ReactNode;\n error?: string | null;\n busy?: boolean;\n canConfirm: boolean;\n onClose: () => void;\n onConfirm: () => void;\n confirmLabel: string;\n}) {\n return (\n <ConfirmationModal\n open={open}\n onClose={onClose}\n title={title}\n error={error}\n confirmLabel={confirmLabel}\n confirmBusyLabel=\"Creating…\"\n confirmDisabled={!canConfirm}\n busy={busy}\n onConfirm={onConfirm}\n >\n <p className=\"mt-2 text-sm text-[color:var(--ck-text-secondary)]\">\n Create a new {title.toLowerCase().replace(\"create \", \"\")} from recipe{\" \"}\n <code className=\"font-mono\">{recipeId}</code>\n {recipeName ? (\n <>\n {\" \"}(<span className=\"font-medium\">{recipeName}</span>)\n </>\n ) : null}\n .\n </p>\n {children}\n </ConfirmationModal>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport { useSlugifiedId } from \"@/lib/use-slugified-id\";\nimport { CreateModalShell } from \"./CreateModalShell\";\n\nexport function CreateTeamModal({\n open,\n recipeId,\n recipeName,\n teamId,\n setTeamId,\n installCron,\n setInstallCron,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n teamId: string;\n setTeamId: (v: string) => void;\n installCron: boolean;\n setInstallCron: (v: boolean) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [teamName, setTeamName] = useState(\"\");\n const [idTouched, setIdTouched] = useState(false);\n\n const { effectiveId } = useSlugifiedId({\n open,\n name: teamName,\n setName: setTeamName,\n id: teamId,\n setId: setTeamId,\n idTouched,\n setIdTouched,\n });\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create team\"\n recipeId={recipeId}\n recipeName={recipeName}\n error={error}\n busy={busy}\n canConfirm={!!effectiveId.trim()}\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create team\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team name</label>\n <input\n value={teamName}\n onChange={(e) => setTeamName(e.target.value)}\n placeholder=\"e.g. Crypto Team\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setTeamId(e.target.value);\n }}\n placeholder=\"e.g. my-team\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n This will scaffold ~/.openclaw/workspace-&lt;teamId&gt; and add the team to config.\n </div>\n </div>\n\n <label className=\"mt-4 flex items-center gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input type=\"checkbox\" checked={installCron} onChange={(e) => setInstallCron(e.target.checked)} />\n Install cron jobs from this recipe\n </label>\n </CreateModalShell>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { CreateModalShell } from \"./CreateModalShell\";\nimport { fetchJsonWithStatus } from \"@/lib/fetch-json\";\n\ntype LocalAgentCatalogItem =\n | {\n kind: \"team-role\";\n recipeId: string;\n recipeName?: string;\n roleId: string;\n roleName?: string;\n }\n | {\n kind: \"single-agent\";\n recipeId: string;\n recipeName?: string;\n description?: string;\n };\n\ntype SelectedRole = { agentId: string; roleId: string; displayName: string };\n\nfunction defaultRoleIdFromAgentId(agentId: string) {\n // Strip any existing team prefix if present; keep it sluggy.\n const id = agentId.split(\"/\").pop() || agentId;\n const last = id.split(\"-\").slice(-1)[0] || id;\n return last.toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\");\n}\n\nfunction normalizeTeamIdInput(v: string) {\n // UX: when the user types spaces, turn them into dashes (live).\n // Also keep it lowercase to match id rules.\n return v.toLowerCase().replace(/\\s+/g, \"-\");\n}\n\nfunction isValidId(id: string) {\n return /^[a-z0-9][a-z0-9_-]{1,62}$/.test(id);\n}\n\nfunction isValidTeamId(id: string) {\n // OpenClaw scaffold-team constraint.\n return isValidId(id) && id.endsWith(\"-team\");\n}\n\nexport function CreateCustomTeamModal({\n open,\n teamId,\n setTeamId,\n busy,\n error,\n onClose,\n onConfirm,\n onRolesChange,\n}: {\n open: boolean;\n teamId: string;\n setTeamId: (v: string) => void;\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n onRolesChange: (roles: SelectedRole[]) => void;\n}) {\n const [catalog, setCatalog] = useState<LocalAgentCatalogItem[]>([]);\n const [catalogError, setCatalogError] = useState<string | null>(null);\n const [catalogQuery, setCatalogQuery] = useState<string>(\"\");\n const [selected, setSelected] = useState<Record<string, SelectedRole>>({});\n\n const [previewMd, setPreviewMd] = useState<string | null>(null);\n const [previewPath, setPreviewPath] = useState<string | null>(null);\n const [previewError, setPreviewError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n const res = await fetchJsonWithStatus<{ ok?: boolean; items?: LocalAgentCatalogItem[]; error?: string }>(\n \"/api/recipes/local-agent-catalog\",\n { cache: \"no-store\" },\n );\n if (cancelled) return;\n if (!res.ok) {\n setCatalogError(res.error || \"Failed to load local agent catalog\");\n return;\n }\n if (!res.data.ok) {\n setCatalogError(res.data.error || \"Failed to load local agent catalog\");\n return;\n }\n setCatalog(Array.isArray(res.data.items) ? res.data.items : []);\n })();\n\n return () => {\n cancelled = true;\n };\n }, []);\n\n const [availability, setAvailability] = useState<\n | { state: \"unknown\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string }\n >({ state: \"unknown\" });\n\n const agentChoices = useMemo(() => {\n const needle = catalogQuery.trim().toLowerCase();\n\n const list = catalog.map((it) => {\n if (it.kind === \"team-role\") {\n const key = `team:${it.recipeId}:${it.roleId}`;\n const recipeLabel = it.recipeName || it.recipeId;\n const roleLabel = it.roleName ? `${it.roleName} (${it.roleId})` : it.roleId;\n return {\n id: key,\n label: `${recipeLabel} → ${roleLabel}`,\n roleId: it.roleId,\n displayName: it.roleName || `${recipeLabel} ${it.roleId}`,\n haystack: `${it.recipeId} ${it.recipeName || \"\"} ${it.roleId} ${it.roleName || \"\"}`.toLowerCase(),\n };\n }\n\n const key = `agent:${it.recipeId}`;\n const recipeLabel = it.recipeName || it.recipeId;\n const descriptionSuffix = it.description ? ` — ${it.description}` : \"\";\n return {\n id: key,\n label: `${recipeLabel} (agent recipe: ${it.recipeId})${descriptionSuffix}`,\n roleId: defaultRoleIdFromAgentId(it.recipeId),\n displayName: recipeLabel,\n haystack: `${it.recipeId} ${it.recipeName || \"\"} ${it.description || \"\"}`.toLowerCase(),\n };\n });\n\n const filtered = needle ? list.filter((x) => x.haystack.includes(needle)) : list;\n\n return filtered\n .slice()\n .sort((a, b) => a.label.localeCompare(b.label))\n .map(({ haystack: _unusedHaystack, ...rest }) => rest);\n }, [catalog, catalogQuery]);\n\n const roles = useMemo(() => Object.values(selected), [selected]);\n\n const teamIdTrimmed = teamId.trim();\n const teamIdError = useMemo(() => {\n if (!open) return null;\n if (!teamIdTrimmed) return \"Team id is required.\";\n if (!isValidId(teamIdTrimmed)) {\n return \"Invalid team id. Use lowercase letters/numbers with - or _ (2-63 chars).\";\n }\n if (!teamIdTrimmed.endsWith(\"-team\")) {\n return \"Team id must end with -team.\";\n }\n if (availability.state === \"taken\") {\n return `Team id is already taken: ${teamIdTrimmed}`;\n }\n return null;\n }, [open, teamIdTrimmed, availability.state]);\n\n const roleErrors = useMemo(() => {\n const errors = new Map<string, string>();\n for (const r of roles) {\n const roleId = String(r.roleId ?? \"\").trim();\n if (!roleId) {\n errors.set(r.agentId, \"Role id is required.\");\n continue;\n }\n if (!isValidId(roleId)) {\n errors.set(r.agentId, \"Invalid role id (lowercase letters/numbers with - or _).\" );\n }\n }\n return errors;\n }, [roles]);\n\n const canConfirm =\n !teamIdError &&\n availability.state !== \"checking\" &&\n availability.state !== \"unknown\" &&\n roles.length > 0 &&\n roleErrors.size === 0;\n\n useEffect(() => {\n if (!open) return;\n onRolesChange(roles);\n }, [open, roles, onRolesChange]);\n\n // Team id availability check (debounced).\n useEffect(() => {\n if (!open) return;\n\n let cancelled = false;\n const t = setTimeout(async () => {\n if (!teamIdTrimmed || !isValidTeamId(teamIdTrimmed)) {\n setAvailability({ state: \"unknown\" });\n return;\n }\n\n setAvailability({ state: \"checking\" });\n\n const res = await fetchJsonWithStatus<{ ok?: boolean; available?: boolean; reason?: string; error?: string }>(\n `/api/ids/check?kind=team&id=${encodeURIComponent(teamIdTrimmed)}`,\n { cache: \"no-store\" },\n );\n\n if (cancelled) return;\n\n if (!res.ok) {\n setAvailability({ state: \"unknown\" });\n return;\n }\n\n if (res.data.ok && res.data.available === true) {\n setAvailability({ state: \"available\" });\n return;\n }\n\n setAvailability({ state: \"taken\", reason: res.data.reason });\n }, 250);\n\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [open, teamIdTrimmed]);\n\n // Best-effort preview (debounced).\n useEffect(() => {\n if (!open) return;\n if (!canConfirm) return;\n\n let cancelled = false;\n const t = setTimeout(async () => {\n const baseRecipeId = teamIdTrimmed.endsWith(\"-team\") ? teamIdTrimmed.slice(0, -\"-team\".length) : teamIdTrimmed;\n\n const res = await fetchJsonWithStatus<{\n ok?: boolean;\n error?: string;\n md?: string;\n filePath?: string;\n }>(\"/api/recipes/custom-team\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n dryRun: true,\n recipeId: baseRecipeId,\n teamId: teamIdTrimmed,\n roles: roles.map((r) => ({ roleId: r.roleId, displayName: r.displayName })),\n }),\n });\n\n if (cancelled) return;\n\n if (!res.ok) {\n setPreviewError(res.error);\n setPreviewMd(null);\n setPreviewPath(null);\n return;\n }\n if (!res.data.ok) {\n setPreviewError(res.data.error || \"Failed to generate preview\");\n setPreviewMd(null);\n setPreviewPath(null);\n return;\n }\n\n setPreviewError(null);\n setPreviewMd(typeof res.data.md === \"string\" ? res.data.md : null);\n setPreviewPath(typeof res.data.filePath === \"string\" ? res.data.filePath : null);\n }, 250);\n\n return () => {\n cancelled = true;\n clearTimeout(t);\n };\n }, [open, canConfirm, teamIdTrimmed, roles]);\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create custom team\"\n recipeId={\"(new recipe)\"}\n recipeName={\"Custom Team\"}\n error={error || catalogError}\n busy={busy}\n canConfirm={canConfirm}\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create team\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Team id</label>\n <input\n value={teamId}\n onChange={(e) => setTeamId(normalizeTeamIdInput(e.target.value))}\n placeholder=\"e.g. my-team\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n {teamIdError ? <div className=\"mt-2 text-xs text-red-300\">{teamIdError}</div> : null}\n {!teamIdError && teamIdTrimmed ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {availability.state === \"checking\" ? \"Checking availability…\" : null}\n {availability.state === \"available\" ? \"Available.\" : null}\n </div>\n ) : null}\n </div>\n\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Select agents</div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n MVP: this creates new team roles that mirror the selected agents&apos; names. You can edit the\n resulting team recipe later.\n </div>\n\n <div className=\"mt-3\">\n <input\n value={catalogQuery}\n onChange={(e) => setCatalogQuery(e.target.value)}\n placeholder=\"Search local roles/agents (recipe id, name, role)\"\n className=\"w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n />\n\n <div className=\"mt-3 max-h-[220px] overflow-auto rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3\">\n {catalogError ? <div className=\"text-sm text-red-300\">{catalogError}</div> : null}\n {!catalogError && agentChoices.length === 0 ? (\n <div className=\"text-sm text-[color:var(--ck-text-secondary)]\">No local roles/agents found.</div>\n ) : null}\n {!catalogError && agentChoices.length ? (\n <div className=\"space-y-2\">\n {agentChoices.map((a) => {\n const checked = !!selected[a.id];\n return (\n <label key={a.id} className=\"flex items-start gap-2 text-sm text-[color:var(--ck-text-secondary)]\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => {\n const next = { ...selected };\n if (e.target.checked) {\n next[a.id] = {\n agentId: a.id,\n roleId: a.roleId,\n displayName: a.displayName,\n };\n } else {\n delete next[a.id];\n }\n setSelected(next);\n }}\n />\n <span className=\"min-w-0 break-words\">{a.label}</span>\n </label>\n );\n })}\n </div>\n ) : null}\n </div>\n </div>\n </div>\n\n {roles.length ? (\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Role mapping</div>\n <div className=\"mt-3 space-y-3\">\n {roles.map((r) => {\n const roleErr = roleErrors.get(r.agentId);\n return (\n <div key={r.agentId} className=\"rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 p-3\">\n <div className=\"text-xs text-[color:var(--ck-text-tertiary)]\">{r.agentId}</div>\n\n <div className=\"mt-3 grid grid-cols-1 gap-3 sm:grid-cols-2\">\n <div>\n <label className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Role id</label>\n <input\n value={r.roleId}\n onChange={(e) => {\n setSelected((prev) => ({\n ...prev,\n [r.agentId]: { ...prev[r.agentId], roleId: e.target.value },\n }));\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n {roleErr ? <div className=\"mt-1 text-xs text-red-300\">{roleErr}</div> : null}\n </div>\n\n <div>\n <label className=\"text-xs font-medium text-[color:var(--ck-text-secondary)]\">Display name</label>\n <input\n value={r.displayName}\n onChange={(e) => {\n setSelected((prev) => ({\n ...prev,\n [r.agentId]: { ...prev[r.agentId], displayName: e.target.value },\n }));\n }}\n className=\"mt-1 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)]\"\n />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n ) : null}\n\n <div className=\"mt-6\">\n <div className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Preview</div>\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Generated recipe preview (best-effort). This is what will be written to\n <code className=\"ml-1\">~/.openclaw/workspace/recipes/&lt;teamId&gt;.md</code>.\n </div>\n {canConfirm && previewError ? <div className=\"mt-2 text-xs text-red-300\">{previewError}</div> : null}\n {canConfirm && previewPath ? (\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n Target path: <code>{previewPath}</code>\n </div>\n ) : null}\n <pre className=\"mt-3 max-h-[260px] overflow-auto whitespace-pre-wrap rounded-[var(--ck-radius-sm)] border border-white/10 bg-black/30 p-3 text-xs text-[color:var(--ck-text-secondary)]\">\n {canConfirm ? previewMd || \"(Loading preview…)\" : \"(Select a valid team id and at least one agent to preview.)\"}\n </pre>\n </div>\n </CreateModalShell>\n );\n}\n","\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport { fetchJson } from \"@/lib/fetch-json\";\nimport { useSlugifiedId } from \"@/lib/use-slugified-id\";\nimport { CreateModalShell } from \"./CreateModalShell\";\n\nfunction getAvailabilityBorderClass(state: string): string {\n if (state === \"available\") return \"border-emerald-400/50\";\n if (state === \"taken\") return \"border-red-400/60\";\n return \"border-white/10\";\n}\n\nfunction getAvailabilityHint(state: string): string {\n if (state === \"taken\") return \"That id is already taken.\";\n if (state === \"available\") return \"Id is available.\";\n return \"This will scaffold ~/.openclaw/workspace/agents/<agentId> and add the agent to config.\";\n}\n\ntype Availability =\n | { state: \"empty\" }\n | { state: \"checking\" }\n | { state: \"available\" }\n | { state: \"taken\"; reason?: string };\n\n/** Sync availability from local arrays (no fetch). Returns null when API check needed. */\nfunction syncAvailability(\n v: string,\n existingRecipeIds: string[],\n existingAgentIds: string[]\n): Availability | null {\n if (!v) return { state: \"empty\" };\n if (existingRecipeIds.includes(v)) return { state: \"taken\", reason: \"recipe-id-collision\" };\n if (existingAgentIds.includes(v)) return { state: \"taken\", reason: \"agent-exists\" };\n return null;\n}\n\nexport function CreateAgentModal({\n open,\n recipeId,\n recipeName,\n agentId,\n setAgentId,\n agentName,\n setAgentName,\n existingRecipeIds,\n existingAgentIds,\n busy,\n error,\n onClose,\n onConfirm,\n}: {\n open: boolean;\n recipeId: string;\n recipeName: string;\n agentId: string;\n setAgentId: (v: string) => void;\n agentName: string;\n setAgentName: (v: string) => void;\n existingRecipeIds: string[];\n existingAgentIds: string[];\n busy?: boolean;\n error?: string | null;\n onClose: () => void;\n onConfirm: () => void;\n}) {\n const [idTouched, setIdTouched] = useState(false);\n const [apiAvailability, setApiAvailability] = useState<Availability | null>(null);\n\n const { effectiveId } = useSlugifiedId({\n open,\n name: agentName,\n setName: setAgentName,\n id: agentId,\n setId: setAgentId,\n idTouched,\n setIdTouched,\n });\n\n const v = String(effectiveId ?? \"\").trim();\n const syncAvail = useMemo(\n () => (open ? syncAvailability(v, existingRecipeIds, existingAgentIds) : { state: \"empty\" as const }),\n [open, v, existingRecipeIds, existingAgentIds]\n );\n\n const availability: Availability = syncAvail ?? apiAvailability ?? { state: \"available\" };\n\n useEffect(() => {\n if (!open || syncAvail !== null) return;\n const t = setTimeout(() => {\n void (async () => {\n setApiAvailability({ state: \"checking\" });\n try {\n const json = await fetchJson<{ ok?: boolean; available?: boolean; reason?: string }>(\n `/api/ids/check?kind=agent&id=${encodeURIComponent(v)}`,\n { cache: \"no-store\" }\n );\n if (json.available) setApiAvailability({ state: \"available\" });\n else setApiAvailability({ state: \"taken\", reason: json.reason });\n } catch {\n setApiAvailability({ state: \"available\" });\n }\n })();\n }, 250);\n return () => clearTimeout(t);\n }, [open, syncAvail, v]);\n\n return (\n <CreateModalShell\n open={open}\n title=\"Create agent\"\n recipeId={recipeId}\n recipeName={recipeName}\n error={error}\n busy={busy}\n canConfirm={\n !!effectiveId.trim() &&\n availability.state !== \"taken\" &&\n availability.state !== \"checking\"\n }\n onClose={onClose}\n onConfirm={onConfirm}\n confirmLabel=\"Create agent\"\n >\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent name</label>\n <input\n value={agentName}\n onChange={(e) => setAgentName(e.target.value)}\n placeholder=\"e.g. Crypto Onchain\"\n className=\"mt-2 w-full rounded-[var(--ck-radius-sm)] border border-white/10 bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)]\"\n autoFocus\n />\n </div>\n\n <div className=\"mt-4\">\n <label className=\"text-sm font-medium text-[color:var(--ck-text-primary)]\">Agent id</label>\n <input\n value={effectiveId}\n onChange={(e) => {\n setIdTouched(true);\n setAgentId(e.target.value);\n }}\n placeholder=\"e.g. crypto-onchain\"\n className={\n \"mt-2 w-full rounded-[var(--ck-radius-sm)] border bg-white/5 px-3 py-2 text-sm text-[color:var(--ck-text-primary)] placeholder:text-[color:var(--ck-text-tertiary)] \" +\n getAvailabilityBorderClass(availability.state)\n }\n />\n <div className=\"mt-2 text-xs text-[color:var(--ck-text-tertiary)]\">\n {getAvailabilityHint(availability.state)}\n </div>\n </div>\n </CreateModalShell>\n );\n}\n"],"names":[],"mappings":"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"}