- `,_g=({secrets:t=[],onApprove:e,onBack:n,loading:s,error:o})=>{let[r,i]=y(()=>{let u={};for(let p of t)u[p.configPath]={selected:p.confidence==="high",envVarName:p.suggestedEnvVar||""};return u}),a=q(u=>{i(p=>({...p,[u]:{...p[u],selected:!p[u]?.selected}}))},[]),l=q((u,p)=>{i(f=>({...f,[u]:{...f[u],envVarName:p}}))},[]),c=Object.values(r).filter(u=>u.selected).length,d=()=>{let u=ka(t.map(p=>({...p,confidence:r[p.configPath]?.selected?"high":"medium",suggestedEnvVar:r[p.configPath]?.envVarName||p.suggestedEnvVar})));e(u)};return s?Pn`
+ `,Ag=({secrets:t=[],onApprove:e,onBack:n,loading:s,error:o})=>{let[r,i]=y(()=>{let u={};for(let p of t)u[p.configPath]={selected:p.confidence==="high",envVarName:p.suggestedEnvVar||""};return u}),a=q(u=>{i(p=>({...p,[u]:{...p[u],selected:!p[u]?.selected}}))},[]),l=q((u,p)=>{i(f=>({...f,[u]:{...f[u],envVarName:p}}))},[]),c=Object.values(r).filter(u=>u.selected).length,d=()=>{let u=ka(t.map(p=>({...p,confidence:r[p.configPath]?.selected?"high":"medium",suggestedEnvVar:r[p.configPath]?.envVarName||p.suggestedEnvVar})));e(u)};return s?Pn`
- `};var Tg=P.bind(T),Pg=[{label:"\u{1F6E1}\uFE0F Safety tip",text:"Be careful what you give access to. Read access is always safer than write access."},{label:"\u{1F9E0} Best practice",text:"Trust but verify. Your agent may not always know what it's doing, so check the results."},{label:"\u{1F4A1} Idea",text:"Ask your agent to create a morning briefing for you."},{label:"\u{1F9E0} Best practice",text:"Ask your agent to review its own code and make sure it's doing what you want it to do."},{label:"\u{1F4A1} Idea",text:"Tell your agent to review the latest news and provide a summary."},{label:"\u{1F6E1}\uFE0F Safety tip",text:"Be incredibly careful installing skills from the internet - they may contain malicious code."}],Rg=({error:t,loading:e,onRetry:n,onBack:s})=>{let[o,r]=y(0);if(L(()=>{if(t||!e)return;let a=setInterval(()=>{r(l=>(l+1)%Pg.length)},5200);return()=>clearInterval(a)},[t,e]),t)return Tg`
+ `};var Pg=P.bind(T),Rg=[{label:"\u{1F6E1}\uFE0F Safety tip",text:"Be careful what you give access to. Read access is always safer than write access."},{label:"\u{1F9E0} Best practice",text:"Trust but verify. Your agent may not always know what it's doing, so check the results."},{label:"\u{1F4A1} Idea",text:"Ask your agent to create a morning briefing for you."},{label:"\u{1F9E0} Best practice",text:"Ask your agent to review its own code and make sure it's doing what you want it to do."},{label:"\u{1F4A1} Idea",text:"Tell your agent to review the latest news and provide a summary."},{label:"\u{1F6E1}\uFE0F Safety tip",text:"Be incredibly careful installing skills from the internet - they may contain malicious code."}],Lg=({error:t,loading:e,onRetry:n,onBack:s})=>{let[o,r]=y(0);if(L(()=>{if(t||!e)return;let a=setInterval(()=>{r(l=>(l+1)%Rg.length)},5200);return()=>clearInterval(a)},[t,e]),t)return Pg`
-`;var Js=P.bind(T),$S={telegram:"TELEGRAM_BOT_TOKEN",discord:"DISCORD_BOT_TOKEN",slack:"SLACK_BOT_TOKEN"},wS={slack:"SLACK_APP_TOKEN"},kS=["app_mentions:read","channels:history","channels:read","chat:write","groups:history","im:history","im:read","im:write","mpim:history","reactions:read","reactions:write","users:read"],SS="https://docs.openclaw.ai/channels/slack",CS=t=>String(t||"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),_S=({provider:t,accountId:e})=>{let n=$S[String(t||"").trim()]||"",s=String(e||"").trim();return n?!s||s==="default"?n:`${n}_${s.replace(/-/g,"_").toUpperCase()}`:""},MS=t=>/^\*+$/.test(String(t||"").trim()),qr=({visible:t=!1,loading:e=!1,createLoadingLabel:n="Creating...",agents:s=[],existingChannels:o=[],mode:r="create",account:i=null,initialAgentId:a="",initialProvider:l="",onClose:c=()=>{},onSubmit:d=async()=>{}})=>{let u=r==="edit",[p,f]=y("telegram"),[g,m]=y(""),[h,b]=y(""),[x,v]=y(""),[w,$]=y(""),[S,C]=y(""),[_,k]=y(""),[A,O]=y(!1),[D,z]=y(!1);L(()=>{if(!t)return;let K=u?String(i?.provider||"").trim()||"telegram":bs.includes(l)?l:bs[0]||"telegram",j=Rt(K).label||"Channel",X=o.find(xe=>String(xe?.channel||"").trim()===String(K||"").trim())||null,de=Array.isArray(X?.accounts)&&X.accounts.length>0,le=u?String(i?.name||"").trim()||j:de?"":j,ie=u?String(i?.ownerAgentId||"").trim()||String(a||"").trim()||String(s[0]?.id||"").trim():String(a||"").trim()||String(s[0]?.id||"").trim();f(K),m(le);let ne=u?(()=>{let xe=String(i?.token||"").trim();return MS(xe)?"":xe})():"";b(ne),v(ne),$(""),C(ie),k(""),O(u)},[t,a,l,s,o,u,i]);let E=F(()=>o.find(K=>String(K?.channel||"").trim()===String(p||"").trim())||null,[o,p]),M=F(()=>Array.isArray(E?.accounts)&&E.accounts.length>0,[E]);L(()=>{if(A)return;let K=Rt(p).label||"Channel";if(!u&&M){m("");return}m(K)},[p,M,A,u]);let R=String(p||"").trim()==="discord"||String(p||"").trim()==="slack",B=String(p||"").trim()==="slack",I=F(()=>u?String(i?.id||"").trim()||"default":R||!M?"default":CS(g),[g,M,u,i,R]),U=F(()=>_S({provider:p,accountId:I}),[p,I]),W=F(()=>Array.isArray(E?.accounts)&&E.accounts.some(K=>String(K?.id||"").trim()===String(I||"").trim()),[E,I]);L(()=>{if(!t||!u)return;let K=!1;return(async()=>{z(!0);try{let X=await Vm({provider:p,accountId:I});if(K)return;let de=String(X?.token||""),le=String(X?.appToken||"");b(de),v(de),$(le)}catch{}finally{K||z(!1)}})(),()=>{K=!0}},[t,u,p,I]);let G=!!String(p||"").trim()&&!!String(g||"").trim()&&!!String(I||"").trim()&&!!String(S||"").trim()&&(u||!!String(h||"").trim())&&(u||!B||!!String(w||"").trim())&&(u||!W)&&!D;if(!t)return null;let se=async()=>{if(!String(g||"").trim()){k("Name is required");return}if(!String(I||"").trim()){k("Channel id could not be derived from the name");return}if(!u&&!String(h||"").trim()){k("Token is required");return}if(!u&&B&&!String(w||"").trim()){k("App Token is required for Slack");return}if(!String(S||"").trim()){k("Agent is required");return}if(!u&&W){k("That channel id is already configured for this provider");return}k("");let K=String(h||"").trim(),j=K&&K!==String(x||"").trim(),X=String(w||"").trim();await d({provider:p,name:String(g||"").trim(),accountId:I,agentId:S,...j?{token:K}:{},...B&&X?{appToken:X}:{}})};return Js`
- <${De}
+ `:null);var wd=new Map,qs=new Map,kb=()=>Date.now(),wS=(t,e)=>t?kb()-Number(t.fetchedAt||0){let e=String(t||"");return e?wd.get(e)?.data??null:null},La=(t="",e=null)=>{let n=String(t||"");return n&&wd.set(n,{data:e,fetchedAt:kb()}),e};var Sb=async(t,e,{maxAgeMs:n=15e3,force:s=!1,staleWhileRevalidate:o=!0,onRevalidate:r=null}={})=>{let i=String(t||"");if(!i||typeof e!="function")return e();let a=wd.get(i);if(!s&&wS(a,n))return a.data;if(!s&&o&&a){if(!qs.has(i)){let c=Promise.resolve().then(()=>e()).then(d=>(La(i,d),typeof r=="function"&&r(d),d)).finally(()=>{qs.delete(i)});qs.set(i,c)}return a.data}if(qs.has(i))return qs.get(i);let l=Promise.resolve().then(()=>e()).then(c=>(La(i,c),c)).finally(()=>{qs.delete(i)});return qs.set(i,l),l};var ct=(t,e,{enabled:n=!0,maxAgeMs:s=15e3,staleWhileRevalidate:o=!0}={})=>{let r=F(()=>String(t||""),[t]),i=F(()=>gs(r),[r]),[a,l]=y(i),[c,d]=y(i===null),[u,p]=y(null);L(()=>{l(gs(r))},[r]);let f=q(async({force:g=!1}={})=>{if(!n)return gs(r);gs(r)===null&&d(!0);try{let m=await Sb(r,e,{maxAgeMs:s,force:g,staleWhileRevalidate:o,onRevalidate:h=>{l(h),p(null)}});return l(m),p(null),m}catch(m){throw p(m),m}finally{d(!1)}},[n,e,s,r,o]);return L(()=>{n&&f().catch(()=>{})},[n,f]),{data:a,error:u,loading:c,refresh:f}};var Js=({channelId:t,account:e={},providerLabel:n=""})=>{let s=t?t.charAt(0).toUpperCase()+t.slice(1):"Channel",o=String(n||"").trim()||s,r=String(e?.name||"").trim();if(r)return r;let i=String(e?.id||"").trim();return!i||i==="default"?o:`${o} ${i}`},bs=({accountId:t,boundAgentId:e})=>String(t||"").trim()==="default"&&!String(e||"").trim();var Ea=async({payload:t={},onPhase:e=()=>{}})=>{if(e("Loading..."),typeof window?.EventSource!="function")return jm(t);let n=await zm(t),s=String(n?.operationId||"").trim();if(!s)throw new Error("Could not start channel creation operation");return new Promise((o,r)=>{let i=!1,a="",l=0,c=null,d=null,u={restarting:1200},p=()=>{d&&(clearTimeout(d),d=null)},f=({phase:h="",label:b=""}={})=>{let x=String(h||"").trim(),v=String(b||"").trim();if(!v)return;let w=Number(u[a]||0),$=l>0?Date.now()-l:0;if(w>0&&x&&x!==a&&${d=null;let S=c;c=null,S&&f(S)},w-$);return}p(),c=null,e(v),a=x,l=Date.now()},g=()=>{p(),m()},m=Um({operationId:s,onMessage:h=>{let b=String(h?.event||"").trim();if(b==="phase"){f({phase:String(h?.data?.phase||"").trim(),label:String(h?.data?.label||"").trim()});return}if(b==="done"){if(i)return;i=!0,g(),o(h?.data||{});return}if(b==="error"){if(i)return;i=!0,g(),r(new Error(String(h?.data?.error||"Could not create channel")))}},onError:()=>{i||(i=!0,g(),r(new Error("Channel operation stream disconnected")))}})})};var kS=new Set(["discord","slack","whatsapp"]),SS=({configuredChannelMap:t,provider:e})=>{let n=t instanceof Map?t.get(String(e||"").trim()):null;return Array.isArray(n?.accounts)&&n.accounts.length>0},CS=(t="")=>kS.has(String(t||"").trim()),Ia=({configuredChannelMap:t=new Map,provider:e=""}={})=>CS(e)?SS({configuredChannelMap:t,provider:e}):!1;var Rn=P.bind(T),_S={telegram:"TELEGRAM_BOT_TOKEN",discord:"DISCORD_BOT_TOKEN",slack:"SLACK_BOT_TOKEN",whatsapp:"WHATSAPP_OWNER_NUMBER"},AS={slack:"SLACK_APP_TOKEN"},MS=["app_mentions:read","channels:history","channels:read","chat:write","groups:history","im:history","im:read","im:write","mpim:history","reactions:read","reactions:write","users:read"],TS="https://docs.openclaw.ai/channels/slack",PS=t=>String(t||"").toLowerCase().trim().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),RS=({provider:t,accountId:e})=>{let n=_S[String(t||"").trim()]||"",s=String(e||"").trim();return n?!s||s==="default"?n:`${n}_${s.replace(/-/g,"_").toUpperCase()}`:""},LS=t=>/^\*+$/.test(String(t||"").trim()),qr=({visible:t=!1,loading:e=!1,createLoadingLabel:n="Creating...",agents:s=[],existingChannels:o=[],mode:r="create",account:i=null,initialAgentId:a="",initialProvider:l="",onClose:c=()=>{},onSubmit:d=async()=>{}})=>{let u=r==="edit",[p,f]=y("telegram"),[g,m]=y(""),[h,b]=y(""),[x,v]=y(""),[w,$]=y(""),[S,C]=y(""),[_,k]=y(""),[A,D]=y(!1),[N,U]=y(!1);L(()=>{if(!t)return;let Z=u?String(i?.provider||"").trim()||"telegram":xs.includes(l)?l:xs[0]||"telegram",ue=Rt(Z).label||"Channel",re=o.find(ce=>String(ce?.channel||"").trim()===String(Z||"").trim())||null,oe=Array.isArray(re?.accounts)&&re.accounts.length>0,ne=u?String(i?.name||"").trim()||ue:oe?"":ue,me=u?String(i?.ownerAgentId||"").trim()||String(a||"").trim()||String(s[0]?.id||"").trim():String(a||"").trim()||String(s[0]?.id||"").trim();f(Z),m(ne);let pe=u?(()=>{let ce=String(i?.token||"").trim();return LS(ce)?"":ce})():"";b(pe),v(pe),$(""),C(me),k(""),D(u)},[t,a,l,s,o,u,i]);let O=F(()=>o.find(Z=>String(Z?.channel||"").trim()===String(p||"").trim())||null,[o,p]),M=F(()=>Array.isArray(O?.accounts)&&O.accounts.length>0,[O]);L(()=>{if(A)return;let Z=Rt(p).label||"Channel";if(!u&&M){m("");return}m(Z)},[p,M,A,u]);let R=String(p||"").trim(),B=R==="discord"||R==="slack"||R==="whatsapp",E=R==="slack",G=R==="whatsapp",H=F(()=>u?String(i?.id||"").trim()||"default":B||!M?"default":PS(g),[g,M,u,i,B]),z=F(()=>RS({provider:p,accountId:H}),[p,H]),te=F(()=>Array.isArray(O?.accounts)&&O.accounts.some(Z=>String(Z?.id||"").trim()===String(H||"").trim()),[O,H]);L(()=>{if(!t||!u)return;let Z=!1;return(async()=>{U(!0);try{let re=await Vm({provider:p,accountId:H});if(Z)return;let oe=String(re?.token||""),ne=String(re?.appToken||"");b(oe),v(oe),$(ne)}catch{}finally{Z||U(!1)}})(),()=>{Z=!0}},[t,u,p,H]);let K=!!String(p||"").trim()&&!!String(g||"").trim()&&!!String(H||"").trim()&&!!String(S||"").trim()&&(u||!!String(h||"").trim())&&(u||!E||!!String(w||"").trim())&&(u||!te)&&!N;if(!t)return null;let V=async()=>{if(!String(g||"").trim()){k("Name is required");return}if(!String(H||"").trim()){k("Channel id could not be derived from the name");return}if(!u&&!String(h||"").trim()){k("Token is required");return}if(!u&&E&&!String(w||"").trim()){k("App Token is required for Slack");return}if(!String(S||"").trim()){k("Agent is required");return}if(!u&&te){k("That channel id is already configured for this provider");return}k("");let Z=String(h||"").trim(),ue=Z&&Z!==String(x||"").trim(),re=String(w||"").trim();await d({provider:p,name:String(g||"").trim(),accountId:H,agentId:S,...ue?{token:Z}:{},...E&&re?{appToken:re}:{}})};return Rn`
+ <${Te}
visible=${t}
onClose=${c}
panelClassName="bg-modal border border-border rounded-xl p-6 max-w-lg w-full space-y-4"
>
- <${Ne}
+ <${Pe}
title=${u?"Edit Channel":`Add ${Rt(p).label||"Channel"} Channel`}
- actions=${Js`
+ actions=${Rn`
- <${nt} className="w-3.5 h-3.5 text-body" />
+ <${Ze} className="w-3.5 h-3.5 text-body" />
`}
/>
@@ -1224,7 +1274,7 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,Gc,jc,zc,Xf,oa
{O(!0),m(K.target.value)}}
+ onInput=${Z=>{D(!0),m(Z.target.value)}}
placeholder=${Rt(p).label||"Channel"}
class="w-full bg-field border border-border rounded-lg px-3 py-2 text-sm text-body outline-none focus:border-fg-muted"
/>
@@ -1234,41 +1284,51 @@ import"./chunks/chunk-72ZECFVW.js";var Tr,Se,qf,Pr,hs,Uf,Jf,Zf,Yf,Gc,jc,zc,Xf,oa
Id
- ${u?"Channel id is fixed after creation.":R?`${Rt(p).label} supports one channel account and uses the default id.`:M?"Derived from the channel name.":"First account uses the default id for this provider."}
+ ${u?"Channel id is fixed after creation.":B?`${Rt(p).label} supports one channel account and uses the default id.`:M?"Derived from the channel name.":"First account uses the default id for this provider."}
`}tablecell(t){let e=this.parser.parseInline(t.tokens),n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+`${n}>
-`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${Ln(t,!0)}`}br(t){return" "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:n}){let s=this.parser.parseInline(n),o=rx(t);if(o===null)return s;t=o;let r='"+s+"",r}image({href:t,title:e,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let o=rx(t);if(o===null)return Ln(n);t=o;let r=`",r}text(t){return"tokens"in t&&t.tokens?this.parser.parseInline(t.tokens):"escaped"in t&&t.escaped?t.text:Ln(t.text)}},Jd=class{strong({text:t}){return t}em({text:t}){return t}codespan({text:t}){return t}del({text:t}){return t}html({text:t}){return t}text({text:t}){return t}link({text:t}){return""+t}image({text:t}){return""+t}br(){return""}},yn=class Hd{options;renderer;textRenderer;constructor(e){this.options=e||Qs,this.options.renderer=this.options.renderer||new Xa,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Jd}static parse(e,n){return new Hd(n).parse(e)}static parseInline(e,n){return new Hd(n).parseInline(e)}parse(e,n=!0){let s="";for(let o=0;o{let i=o[r].flat(1/0);n=n.concat(this.walkTokens(i,e))}):o.tokens&&(n=n.concat(this.walkTokens(o.tokens,e)))}}return n}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(o=>{if(!o.name)throw new Error("extension name required");if("renderer"in o){let r=e.renderers[o.name];r?e.renderers[o.name]=function(...i){let a=o.renderer.apply(this,i);return a===!1&&(a=r.apply(this,i)),a}:e.renderers[o.name]=o.renderer}if("tokenizer"in o){if(!o.level||o.level!=="block"&&o.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let r=e[o.level];r?r.unshift(o.tokenizer):e[o.level]=[o.tokenizer],o.start&&(o.level==="block"?e.startBlock?e.startBlock.push(o.start):e.startBlock=[o.start]:o.level==="inline"&&(e.startInline?e.startInline.push(o.start):e.startInline=[o.start]))}"childTokens"in o&&o.childTokens&&(e.childTokens[o.name]=o.childTokens)}),s.extensions=e),n.renderer){let o=this.defaults.renderer||new Xa(this.defaults);for(let r in n.renderer){if(!(r in o))throw new Error(`renderer '${r}' does not exist`);if(["options","parser"].includes(r))continue;let i=r,a=n.renderer[i],l=o[i];o[i]=(...c)=>{let d=a.apply(o,c);return d===!1&&(d=l.apply(o,c)),d||""}}s.renderer=o}if(n.tokenizer){let o=this.defaults.tokenizer||new Ya(this.defaults);for(let r in n.tokenizer){if(!(r in o))throw new Error(`tokenizer '${r}' does not exist`);if(["options","rules","lexer"].includes(r))continue;let i=r,a=n.tokenizer[i],l=o[i];o[i]=(...c)=>{let d=a.apply(o,c);return d===!1&&(d=l.apply(o,c)),d}}s.tokenizer=o}if(n.hooks){let o=this.defaults.hooks||new ei;for(let r in n.hooks){if(!(r in o))throw new Error(`hook '${r}' does not exist`);if(["options","block"].includes(r))continue;let i=r,a=n.hooks[i],l=o[i];ei.passThroughHooks.has(r)?o[i]=c=>{if(this.defaults.async&&ei.passThroughHooksRespectAsync.has(r))return(async()=>{let u=await a.call(o,c);return l.call(o,u)})();let d=a.call(o,c);return l.call(o,d)}:o[i]=(...c)=>{if(this.defaults.async)return(async()=>{let u=await a.apply(o,c);return u===!1&&(u=await l.apply(o,c)),u})();let d=a.apply(o,c);return d===!1&&(d=l.apply(o,c)),d}}s.hooks=o}if(n.walkTokens){let o=this.defaults.walkTokens,r=n.walkTokens;s.walkTokens=function(i){let a=[];return a.push(r.call(this,i)),o&&(a=a.concat(o.call(this,i))),a}}this.defaults={...this.defaults,...s}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return xn.lex(t,e??this.defaults)}parser(t,e){return yn.parse(t,e??this.defaults)}parseMarkdown(t){return(e,n)=>{let s={...n},o={...this.defaults,...s},r=this.onError(!!o.silent,!!o.async);if(this.defaults.async===!0&&s.async===!1)return r(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return r(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return r(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(o.hooks&&(o.hooks.options=o,o.hooks.block=t),o.async)return(async()=>{let i=o.hooks?await o.hooks.preprocess(e):e,a=await(o.hooks?await o.hooks.provideLexer():t?xn.lex:xn.lexInline)(i,o),l=o.hooks?await o.hooks.processAllTokens(a):a;o.walkTokens&&await Promise.all(this.walkTokens(l,o.walkTokens));let c=await(o.hooks?await o.hooks.provideParser():t?yn.parse:yn.parseInline)(l,o);return o.hooks?await o.hooks.postprocess(c):c})().catch(r);try{o.hooks&&(e=o.hooks.preprocess(e));let i=(o.hooks?o.hooks.provideLexer():t?xn.lex:xn.lexInline)(e,o);o.hooks&&(i=o.hooks.processAllTokens(i)),o.walkTokens&&this.walkTokens(i,o.walkTokens);let a=(o.hooks?o.hooks.provideParser():t?yn.parse:yn.parseInline)(i,o);return o.hooks&&(a=o.hooks.postprocess(a)),a}catch(i){return r(i)}}}onError(t,e){return n=>{if(n.message+=`
-Please report this to https://github.com/markedjs/marked.`,t){let s="
An error occurred:
"+Ln(n.message+"",!0)+"
";return e?Promise.resolve(s):s}if(e)return Promise.reject(n);throw n}}},Xs=new HC;function Le(t,e){return Xs.parse(t,e)}Le.options=Le.setOptions=function(t){return Xs.setOptions(t),Le.defaults=Xs.defaults,lx(Le.defaults),Le};Le.getDefaults=Wd;Le.defaults=Qs;Le.use=function(...t){return Xs.use(...t),Le.defaults=Xs.defaults,lx(Le.defaults),Le};Le.walkTokens=function(t,e){return Xs.walkTokens(t,e)};Le.parseInline=Xs.parseInline;Le.Parser=yn;Le.parser=yn.parse;Le.Renderer=Xa;Le.TextRenderer=Jd;Le.Lexer=xn;Le.lexer=xn.lex;Le.Tokenizer=Ya;Le.Hooks=ei;Le.parse=Le;var LD=Le.options,ED=Le.setOptions,ID=Le.use,DD=Le.walkTokens,ND=Le.parseInline;var OD=yn.parse,BD=xn.lex;var Vo=P.bind(T),WC=t=>{let e=String(t||"").trim();return e?e.startsWith("v")?e:`v${e}`:""},VC=t=>{let e=Date.parse(String(t||""));if(!Number.isFinite(e))return"";try{return new Intl.DateTimeFormat(void 0,{dateStyle:"medium",timeStyle:"short"}).format(new Date(e))}catch{return""}},jC=t=>t?`https://github.com/chrysb/alphaclaw/releases/tag/${encodeURIComponent(t)}`:"https://github.com/chrysb/alphaclaw/releases",yx=({visible:t=!1,onClose:e=()=>{},version:n="",onUpdate:s=()=>{},updating:o=!1})=>{let r=F(()=>WC(n),[n]),[i,a]=y(!1),[l,c]=y(""),[d,u]=y(null);L(()=>{if(!t)return;let x=!0;return(async()=>{a(!0),c("");try{let w=await bm(r);if(!x)return;if(!w?.ok){c(w?.error||"Could not load release notes"),u(null);return}u(w)}catch(w){if(!x)return;c(w?.message||"Could not load release notes"),u(null)}finally{if(!x)return;a(!1)}})(),()=>{x=!1}},[t,r]);let p=String(d?.tag||r||"").trim(),f=String(d?.htmlUrl||"").trim()||jC(p),g=p?`Update to ${p}`:"Update now",m=VC(d?.publishedAt),h=String(d?.body||"").trim(),b=F(()=>Le.parse(h,{gfm:!0,breaks:!0}),[h]);return Vo`
- <${De}
+`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${En(t,!0)}`}br(t){return" "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:n}){let s=this.parser.parseInline(n),o=lx(t);if(o===null)return s;t=o;let r='"+s+"",r}image({href:t,title:e,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let o=lx(t);if(o===null)return En(n);t=o;let r=`",r}text(t){return"tokens"in t&&t.tokens?this.parser.parseInline(t.tokens):"escaped"in t&&t.escaped?t.text:En(t.text)}},Jd=class{strong({text:t}){return t}em({text:t}){return t}codespan({text:t}){return t}del({text:t}){return t}html({text:t}){return t}text({text:t}){return t}link({text:t}){return""+t}image({text:t}){return""+t}br(){return""}},yn=class Hd{options;renderer;textRenderer;constructor(e){this.options=e||Qs,this.options.renderer=this.options.renderer||new Xa,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Jd}static parse(e,n){return new Hd(n).parse(e)}static parseInline(e,n){return new Hd(n).parseInline(e)}parse(e,n=!0){let s="";for(let o=0;o{let i=o[r].flat(1/0);n=n.concat(this.walkTokens(i,e))}):o.tokens&&(n=n.concat(this.walkTokens(o.tokens,e)))}}return n}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(o=>{if(!o.name)throw new Error("extension name required");if("renderer"in o){let r=e.renderers[o.name];r?e.renderers[o.name]=function(...i){let a=o.renderer.apply(this,i);return a===!1&&(a=r.apply(this,i)),a}:e.renderers[o.name]=o.renderer}if("tokenizer"in o){if(!o.level||o.level!=="block"&&o.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let r=e[o.level];r?r.unshift(o.tokenizer):e[o.level]=[o.tokenizer],o.start&&(o.level==="block"?e.startBlock?e.startBlock.push(o.start):e.startBlock=[o.start]:o.level==="inline"&&(e.startInline?e.startInline.push(o.start):e.startInline=[o.start]))}"childTokens"in o&&o.childTokens&&(e.childTokens[o.name]=o.childTokens)}),s.extensions=e),n.renderer){let o=this.defaults.renderer||new Xa(this.defaults);for(let r in n.renderer){if(!(r in o))throw new Error(`renderer '${r}' does not exist`);if(["options","parser"].includes(r))continue;let i=r,a=n.renderer[i],l=o[i];o[i]=(...c)=>{let d=a.apply(o,c);return d===!1&&(d=l.apply(o,c)),d||""}}s.renderer=o}if(n.tokenizer){let o=this.defaults.tokenizer||new Ya(this.defaults);for(let r in n.tokenizer){if(!(r in o))throw new Error(`tokenizer '${r}' does not exist`);if(["options","rules","lexer"].includes(r))continue;let i=r,a=n.tokenizer[i],l=o[i];o[i]=(...c)=>{let d=a.apply(o,c);return d===!1&&(d=l.apply(o,c)),d}}s.tokenizer=o}if(n.hooks){let o=this.defaults.hooks||new ei;for(let r in n.hooks){if(!(r in o))throw new Error(`hook '${r}' does not exist`);if(["options","block"].includes(r))continue;let i=r,a=n.hooks[i],l=o[i];ei.passThroughHooks.has(r)?o[i]=c=>{if(this.defaults.async&&ei.passThroughHooksRespectAsync.has(r))return(async()=>{let u=await a.call(o,c);return l.call(o,u)})();let d=a.call(o,c);return l.call(o,d)}:o[i]=(...c)=>{if(this.defaults.async)return(async()=>{let u=await a.apply(o,c);return u===!1&&(u=await l.apply(o,c)),u})();let d=a.apply(o,c);return d===!1&&(d=l.apply(o,c)),d}}s.hooks=o}if(n.walkTokens){let o=this.defaults.walkTokens,r=n.walkTokens;s.walkTokens=function(i){let a=[];return a.push(r.call(this,i)),o&&(a=a.concat(o.call(this,i))),a}}this.defaults={...this.defaults,...s}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return xn.lex(t,e??this.defaults)}parser(t,e){return yn.parse(t,e??this.defaults)}parseMarkdown(t){return(e,n)=>{let s={...n},o={...this.defaults,...s},r=this.onError(!!o.silent,!!o.async);if(this.defaults.async===!0&&s.async===!1)return r(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return r(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return r(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(o.hooks&&(o.hooks.options=o,o.hooks.block=t),o.async)return(async()=>{let i=o.hooks?await o.hooks.preprocess(e):e,a=await(o.hooks?await o.hooks.provideLexer():t?xn.lex:xn.lexInline)(i,o),l=o.hooks?await o.hooks.processAllTokens(a):a;o.walkTokens&&await Promise.all(this.walkTokens(l,o.walkTokens));let c=await(o.hooks?await o.hooks.provideParser():t?yn.parse:yn.parseInline)(l,o);return o.hooks?await o.hooks.postprocess(c):c})().catch(r);try{o.hooks&&(e=o.hooks.preprocess(e));let i=(o.hooks?o.hooks.provideLexer():t?xn.lex:xn.lexInline)(e,o);o.hooks&&(i=o.hooks.processAllTokens(i)),o.walkTokens&&this.walkTokens(i,o.walkTokens);let a=(o.hooks?o.hooks.provideParser():t?yn.parse:yn.parseInline)(i,o);return o.hooks&&(a=o.hooks.postprocess(a)),a}catch(i){return r(i)}}}onError(t,e){return n=>{if(n.message+=`
+Please report this to https://github.com/markedjs/marked.`,t){let s="
The pairing request will appear here — it may take a few moments
`}
-
`}var Nx=P.bind(T),to=(t,e)=>{let n=String(t||"").trim(),s=String(e||"").trim()||"default";return n?`${n}:${s}`:""},a2=t=>{window.dispatchEvent(new CustomEvent("alphaclaw:pairings-changed",{detail:{agentId:String(t||"").trim()}}))},Ox=({agent:t={}})=>{let[e,n]=y([]),[s,o]=y([]),[r,i]=y(!0),[a,l]=y(!1),c=ee(null),d=ee([]),u=String(t?.id||"").trim(),p=!!t?.default,{data:f,loading:g,refresh:m}=ct(`/api/agents/${encodeURIComponent(String(u||""))}/bindings`,()=>Gm(t.id),{enabled:!!u,maxAgeMs:3e4}),{data:h,loading:b,refresh:x}=ct("/api/channels/accounts",To,{maxAgeMs:3e4}),v=q(async()=>{i(!0);try{let[M,R]=await Promise.all([m({force:!0}),x({force:!0})]);n(Array.isArray(M?.bindings)?M.bindings:[]),o(Array.isArray(R?.channels)?R.channels:[])}catch{n([]),o([])}finally{i(!1)}},[m,x]);L(()=>{n(Array.isArray(f?.bindings)?f.bindings:[]),o(Array.isArray(h?.channels)?h.channels:[]),i(!!(g||b))},[g,f,b,h]),L(()=>{let M=R=>{String(R?.detail?.agentId||"").trim()===u&&v()};return window.addEventListener("alphaclaw:agent-bindings-changed",M),()=>{window.removeEventListener("alphaclaw:agent-bindings-changed",M)}},[u,v]),L(()=>()=>{c.current&&clearTimeout(c.current);for(let M of d.current)clearTimeout(M);d.current=[]},[]);let w=F(()=>{let M=new Map;for(let R of e){let B=String(R?.match?.channel||"").trim();if(!B)continue;let I=String(R?.match?.accountId||"").trim()||"default",U=to(B,I);U&&M.set(U,{channel:B,accountId:I})}for(let R of s){let B=String(R?.channel||"").trim(),U=(Array.isArray(R?.accounts)?R.accounts:[]).find(W=>String(W?.id||"").trim()==="default");if(p&&B&&U&&!String(U?.boundAgentId||"").trim()){let W=to(B,"default");M.set(W,{channel:B,accountId:"default"})}}return Array.from(M.values())},[e,s,p]),$=F(()=>Array.from(new Set(w.map(M=>M.channel))).filter(Boolean),[w]),S=F(()=>new Set(w.map(M=>to(M.channel,M.accountId)).filter(Boolean)),[w]),C=F(()=>{let M=new Map;for(let R of s){let B=String(R?.channel||"").trim(),I=Array.isArray(R?.accounts)?R.accounts:[];for(let U of I){let W=String(U?.id||"").trim()||"default",G=to(B,W);if(!G)continue;let se=String(U?.name||"").trim();M.set(G,se||W)}}return M},[s]),_=F(()=>{let M={};for(let R of w){let B=String(R?.channel||"").trim();if(!B)continue;let I=to(B,R?.accountId),U=s.find(G=>String(G?.channel||"").trim()===B)?.accounts?.find(G=>(String(G?.id||"").trim()||"default")===(String(R?.accountId||"").trim()||"default")),W=String(U?.status||"").trim()||"configured";(!M[B]||W!=="paired")&&(M[B]={status:W==="paired"?"paired":"configured",accountName:C.get(I)||""})}return M},[C,s,w]),k=F(()=>Object.values(_).some(M=>String(M?.status||"").trim()!=="paired"),[_]),A=Re(async()=>{let M=await Co();return(Array.isArray(M?.pending)?M.pending:[]).filter(B=>S.has(to(String(B?.channel||"").trim(),String(B?.accountId||"").trim()||"default"))).map(B=>{let I=to(B?.channel,B?.accountId);return{...B,accountName:C.get(I)||""}})},3e3,{enabled:k&&w.length>0,cacheKey:`/api/pairings?agent=${encodeURIComponent(u)}`}),O=A.data||[],D=q(()=>{l(!0),c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{l(!1),c.current=null},2800);for(let R of d.current)clearTimeout(R);d.current=[];let M=()=>{A.refresh(),v(),a2(u)};M(),d.current.push(setTimeout(M,500)),d.current.push(setTimeout(M,2e3))},[u,v,A]),z=async(M,R,B="")=>{try{await _o(M,R,B),D()}catch(I){N(I.message||"Could not approve pairing","error")}},E=async(M,R,B="")=>{try{await Mo(M,R,B),D()}catch(I){N(I.message||"Could not reject pairing","error")}};return r?Nx`
+
`}var Fx=P.bind(T),to=(t,e)=>{let n=String(t||"").trim(),s=String(e||"").trim()||"default";return n?`${n}:${s}`:""},p2=t=>{window.dispatchEvent(new CustomEvent("alphaclaw:pairings-changed",{detail:{agentId:String(t||"").trim()}}))},Hx=({agent:t={}})=>{let[e,n]=y([]),[s,o]=y([]),[r,i]=y(!0),[a,l]=y(!1),c=ee(null),d=ee([]),u=String(t?.id||"").trim(),p=!!t?.default,{data:f,loading:g,refresh:m}=ct(`/api/agents/${encodeURIComponent(String(u||""))}/bindings`,()=>qm(t.id),{enabled:!!u,maxAgeMs:3e4}),{data:h,loading:b,refresh:x}=ct("/api/channels/accounts",To,{maxAgeMs:3e4}),v=q(async()=>{i(!0);try{let[M,R]=await Promise.all([m({force:!0}),x({force:!0})]);n(Array.isArray(M?.bindings)?M.bindings:[]),o(Array.isArray(R?.channels)?R.channels:[])}catch{n([]),o([])}finally{i(!1)}},[m,x]);L(()=>{n(Array.isArray(f?.bindings)?f.bindings:[]),o(Array.isArray(h?.channels)?h.channels:[]),i(!!(g||b))},[g,f,b,h]),L(()=>{let M=R=>{String(R?.detail?.agentId||"").trim()===u&&v()};return window.addEventListener("alphaclaw:agent-bindings-changed",M),()=>{window.removeEventListener("alphaclaw:agent-bindings-changed",M)}},[u,v]),L(()=>()=>{c.current&&clearTimeout(c.current);for(let M of d.current)clearTimeout(M);d.current=[]},[]);let w=F(()=>{let M=new Map;for(let R of e){let B=String(R?.match?.channel||"").trim();if(!B)continue;let E=String(R?.match?.accountId||"").trim()||"default",G=to(B,E);G&&M.set(G,{channel:B,accountId:E})}for(let R of s){let B=String(R?.channel||"").trim(),G=(Array.isArray(R?.accounts)?R.accounts:[]).find(H=>String(H?.id||"").trim()==="default");if(p&&B&&G&&!String(G?.boundAgentId||"").trim()){let H=to(B,"default");M.set(H,{channel:B,accountId:"default"})}}return Array.from(M.values())},[e,s,p]),$=F(()=>Array.from(new Set(w.map(M=>M.channel))).filter(Boolean),[w]),S=F(()=>new Set(w.map(M=>to(M.channel,M.accountId)).filter(Boolean)),[w]),C=F(()=>{let M=new Map;for(let R of s){let B=String(R?.channel||"").trim(),E=Array.isArray(R?.accounts)?R.accounts:[];for(let G of E){let H=String(G?.id||"").trim()||"default",z=to(B,H);if(!z)continue;let te=String(G?.name||"").trim();M.set(z,te||H)}}return M},[s]),_=F(()=>{let M={};for(let R of w){let B=String(R?.channel||"").trim();if(!B)continue;let E=to(B,R?.accountId),G=s.find(z=>String(z?.channel||"").trim()===B)?.accounts?.find(z=>(String(z?.id||"").trim()||"default")===(String(R?.accountId||"").trim()||"default")),H=String(G?.status||"").trim()||"configured";(!M[B]||H!=="paired")&&(M[B]={status:H==="paired"?"paired":"configured",accountName:C.get(E)||""})}return M},[C,s,w]),k=F(()=>Object.values(_).some(M=>String(M?.status||"").trim()!=="paired"),[_]),A=Ee(async()=>{let M=await Co();return(Array.isArray(M?.pending)?M.pending:[]).filter(B=>S.has(to(String(B?.channel||"").trim(),String(B?.accountId||"").trim()||"default"))).map(B=>{let E=to(B?.channel,B?.accountId);return{...B,accountName:C.get(E)||""}})},3e3,{enabled:k&&w.length>0,cacheKey:`/api/pairings?agent=${encodeURIComponent(u)}`}),D=A.data||[],N=q(()=>{l(!0),c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{l(!1),c.current=null},2800);for(let R of d.current)clearTimeout(R);d.current=[];let M=()=>{A.refresh(),v(),p2(u)};M(),d.current.push(setTimeout(M,500)),d.current.push(setTimeout(M,2e3))},[u,v,A]),U=async(M,R,B="")=>{try{await _o(M,R,B),N()}catch(E){I(E.message||"Could not approve pairing","error")}},O=async(M,R,B="")=>{try{await Ao(M,R,B),N()}catch(E){I(E.message||"Could not reject pairing","error")}};return r?Fx`
`}
@@ -3234,7 +3310,7 @@ Please report this to https://github.com/markedjs/marked.`,t){let s="
An error
${Xd(x)}
- ${x.key===i?sn`<${ae} tone="cyan">Primary${ae}>`:sn`
+ ${x.key===i?sn`<${le} tone="cyan">Primary${le}>`:sn`
c(x.key)}
@@ -3271,7 +3347,7 @@ Please report this to https://github.com/markedjs/marked.`,t){let s="
An error
`:null}
- `};var jx=["minimal","messaging","coding","full"],il={minimal:"Minimal",messaging:"Messaging",coding:"Coding",full:"Full"},Qd=[{id:"read",label:"Read files",profiles:["coding"],section:"filesystem"},{id:"edit",label:"Edit files",profiles:["coding"],section:"filesystem"},{id:"write",label:"Write files",profiles:["coding"],section:"filesystem"},{id:"apply_patch",label:"Apply patches",help:"Make targeted patch edits, mainly for OpenAI-compatible patch workflows.",profiles:["coding"],section:"filesystem"},{id:"exec",label:"Run commands",help:"Execute shell commands inside the agent environment.",profiles:["coding"],section:"execution"},{id:"process",label:"Manage processes",help:"Inspect and control long-running background processes.",profiles:["coding"],section:"execution"},{id:"message",label:"Send messages",help:"Send outbound messages through configured messaging channels.",profiles:["messaging"],section:"communication"},{id:"tts",label:"Text-to-speech",help:"Convert text responses into generated speech audio.",profiles:[],section:"communication"},{id:"browser",label:"Control browser",help:"Drive a browser for page navigation and interactive web tasks.",profiles:[],section:"web"},{id:"web_search",label:"Search the web",help:"Run web searches to discover external information.",profiles:[],section:"web"},{id:"web_fetch",label:"Fetch URLs",help:"Fetch and read webpage content from a specific URL.",profiles:[],section:"web"},{id:"memory_search",label:"Semantic search",help:"Search memory semantically to find related notes and prior context.",profiles:["coding"],section:"memory"},{id:"memory_get",label:"Read memories",help:"Read stored memory files and saved context entries.",profiles:["coding"],section:"memory"},{id:"agents_list",label:"List agents",help:"List known agent IDs that can be targeted in multi-agent flows.",profiles:[],section:"multiagent"},{id:"sessions_spawn",label:"Spawn sessions",help:"Start a new background session/run; this is the base primitive used by sub-agent workflows.",profiles:["coding"],section:"multiagent"},{id:"sessions_send",label:"Send to session",help:"Send messages or tasks into an existing running session.",profiles:["coding","messaging"],section:"multiagent"},{id:"sessions_list",label:"List sessions",help:"List active or recent sessions available to the agent.",profiles:["coding","messaging"],section:"multiagent"},{id:"sessions_history",label:"Session history",help:"Read the transcript and prior exchanges from a session.",profiles:["coding","messaging"],section:"multiagent"},{id:"session_status",label:"Session status",help:"Check whether a session is running and inspect runtime health/state.",profiles:["minimal","coding","messaging"],section:"multiagent"},{id:"subagents",label:"Sub-agents",help:"Launch specialized delegated agents (higher-level orchestration built on session spawning).",profiles:["coding"],section:"multiagent"},{id:"cron",label:"Scheduled jobs",help:"Create and manage scheduled automation jobs.",profiles:["coding"],section:"scheduling"},{id:"gateway",label:"Gateway control",help:"Inspect and control the running Gateway service (status, health, and control actions like restart).",profiles:[],section:"scheduling"},{id:"image",label:"Generate images",help:"Generate or analyze images with image-capable model tools.",profiles:["coding"],section:"creative"},{id:"canvas",label:"Visual canvas",help:"Control the Canvas panel (present, navigate, eval, snapshot). Primarily a macOS app capability when a canvas-capable node is connected.",profiles:[],section:"creative"},{id:"nodes",label:"Node workflows",help:"Use paired device/node capabilities (for example canvas, camera, notifications, and system actions).",profiles:[],section:"creative"}],zx=[{id:"filesystem",label:"Filesystem",description:"Read, edit, and write files"},{id:"execution",label:"Execution",description:"Run shell commands and scripts"},{id:"communication",label:"Communication",description:"Send messages across Telegram, Slack, Discord"},{id:"web",label:"Web & Browser",description:"Browse pages, search the web, fetch URLs"},{id:"memory",label:"Memory",description:"Semantic search and retrieval across the agent's stored knowledge"},{id:"multiagent",label:"Multi-Agent",description:"List agents, spawn sessions, send messages between agents. Orchestrate sub-agents."},{id:"scheduling",label:"Scheduling",description:"Create and manage scheduled jobs"},{id:"creative",label:"Creative",description:"Generate images, visual canvas, node-based workflows"}];var ii=t=>t==="full"?Qd.map(e=>e.id):Qd.filter(e=>e.profiles.includes(t)).map(e=>e.id),Ux=({profile:t="full",alsoAllow:e=[],deny:n=[]})=>{let s=new Set(ii(t)),o=new Set(e),r=new Set(n);return Qd.map(i=>{let a=s.has(i.id),l=r.has(i.id),c=o.has(i.id);return{...i,enabled:l?!1:a||c,inProfile:a,isDenied:l,isAlsoAllowed:c}})},Kx=({profile:t,toolStates:e})=>{let n=new Set(ii(t)),s=[],o=[];for(let i of e){let a=n.has(i.id);i.enabled&&!a?s.push(i.id):!i.enabled&&a&&o.push(i.id)}let r={profile:t};return s.length&&(r.alsoAllow=s),o.length&&(r.deny=o),r};var f2=P.bind(T),Gx=({profile:t="full",enabledCount:e=0,totalCount:n=0,onSwitchToTools:s=()=>{}})=>{let o=il[t]||t;return f2`
+ `};var Kx=["minimal","messaging","coding","full"],il={minimal:"Minimal",messaging:"Messaging",coding:"Coding",full:"Full"},Qd=[{id:"read",label:"Read files",profiles:["coding"],section:"filesystem"},{id:"edit",label:"Edit files",profiles:["coding"],section:"filesystem"},{id:"write",label:"Write files",profiles:["coding"],section:"filesystem"},{id:"apply_patch",label:"Apply patches",help:"Make targeted patch edits, mainly for OpenAI-compatible patch workflows.",profiles:["coding"],section:"filesystem"},{id:"exec",label:"Run commands",help:"Execute shell commands inside the agent environment.",profiles:["coding"],section:"execution"},{id:"process",label:"Manage processes",help:"Inspect and control long-running background processes.",profiles:["coding"],section:"execution"},{id:"message",label:"Send messages",help:"Send outbound messages through configured messaging channels.",profiles:["messaging"],section:"communication"},{id:"tts",label:"Text-to-speech",help:"Convert text responses into generated speech audio.",profiles:[],section:"communication"},{id:"browser",label:"Control browser",help:"Drive a browser for page navigation and interactive web tasks.",profiles:[],section:"web"},{id:"web_search",label:"Search the web",help:"Run web searches to discover external information.",profiles:[],section:"web"},{id:"web_fetch",label:"Fetch URLs",help:"Fetch and read webpage content from a specific URL.",profiles:[],section:"web"},{id:"memory_search",label:"Semantic search",help:"Search memory semantically to find related notes and prior context.",profiles:["coding"],section:"memory"},{id:"memory_get",label:"Read memories",help:"Read stored memory files and saved context entries.",profiles:["coding"],section:"memory"},{id:"agents_list",label:"List agents",help:"List known agent IDs that can be targeted in multi-agent flows.",profiles:[],section:"multiagent"},{id:"sessions_spawn",label:"Spawn sessions",help:"Start a new background session/run; this is the base primitive used by sub-agent workflows.",profiles:["coding"],section:"multiagent"},{id:"sessions_send",label:"Send to session",help:"Send messages or tasks into an existing running session.",profiles:["coding","messaging"],section:"multiagent"},{id:"sessions_list",label:"List sessions",help:"List active or recent sessions available to the agent.",profiles:["coding","messaging"],section:"multiagent"},{id:"sessions_history",label:"Session history",help:"Read the transcript and prior exchanges from a session.",profiles:["coding","messaging"],section:"multiagent"},{id:"session_status",label:"Session status",help:"Check whether a session is running and inspect runtime health/state.",profiles:["minimal","coding","messaging"],section:"multiagent"},{id:"subagents",label:"Sub-agents",help:"Launch specialized delegated agents (higher-level orchestration built on session spawning).",profiles:["coding"],section:"multiagent"},{id:"cron",label:"Scheduled jobs",help:"Create and manage scheduled automation jobs.",profiles:["coding"],section:"scheduling"},{id:"gateway",label:"Gateway control",help:"Inspect and control the running Gateway service (status, health, and control actions like restart).",profiles:[],section:"scheduling"},{id:"image",label:"Generate images",help:"Generate or analyze images with image-capable model tools.",profiles:["coding"],section:"creative"},{id:"canvas",label:"Visual canvas",help:"Control the Canvas panel (present, navigate, eval, snapshot). Primarily a macOS app capability when a canvas-capable node is connected.",profiles:[],section:"creative"},{id:"nodes",label:"Node workflows",help:"Use paired device/node capabilities (for example canvas, camera, notifications, and system actions).",profiles:[],section:"creative"}],Gx=[{id:"filesystem",label:"Filesystem",description:"Read, edit, and write files"},{id:"execution",label:"Execution",description:"Run shell commands and scripts"},{id:"communication",label:"Communication",description:"Send messages across Telegram, Slack, Discord"},{id:"web",label:"Web & Browser",description:"Browse pages, search the web, fetch URLs"},{id:"memory",label:"Memory",description:"Semantic search and retrieval across the agent's stored knowledge"},{id:"multiagent",label:"Multi-Agent",description:"List agents, spawn sessions, send messages between agents. Orchestrate sub-agents."},{id:"scheduling",label:"Scheduling",description:"Create and manage scheduled jobs"},{id:"creative",label:"Creative",description:"Generate images, visual canvas, node-based workflows"}];var ii=t=>t==="full"?Qd.map(e=>e.id):Qd.filter(e=>e.profiles.includes(t)).map(e=>e.id),qx=({profile:t="full",alsoAllow:e=[],deny:n=[]})=>{let s=new Set(ii(t)),o=new Set(e),r=new Set(n);return Qd.map(i=>{let a=s.has(i.id),l=r.has(i.id),c=o.has(i.id);return{...i,enabled:l?!1:a||c,inProfile:a,isDenied:l,isAlsoAllowed:c}})},Jx=({profile:t,toolStates:e})=>{let n=new Set(ii(t)),s=[],o=[];for(let i of e){let a=n.has(i.id);i.enabled&&!a?s.push(i.id):!i.enabled&&a&&o.push(i.id)}let r={profile:t};return s.length&&(r.alsoAllow=s),o.length&&(r.deny=o),r};var x2=P.bind(T),Zx=({profile:t="full",enabledCount:e=0,totalCount:n=0,onSwitchToTools:s=()=>{}})=>{let o=il[t]||t;return x2`
- <${x2}
+ <${k2}
key=${l.id}
section=${l}
toolStates=${s||[]}
@@ -3437,7 +3513,7 @@ Please report this to https://github.com/markedjs/marked.`,t){let s="
An error
`)}
- `};var tu=(t=[],e=[])=>{let n={};for(let s of t)n[s]=!0;for(let s of e)n[s]=!1;return n},nu=({profile:t="full",alsoAllow:e=[],deny:n=[]}={})=>({profile:String(t||"full"),alsoAllow:[...Array.isArray(e)?e:[]].map(String).filter(Boolean).sort(),deny:[...Array.isArray(n)?n:[]].map(String).filter(Boolean).sort()}),ey=({agent:t={}}={})=>{let e=t.tools||{},n=nu(e),s=n.profile,o=n.alsoAllow,r=n.deny,[i,a]=y(s),[l,c]=y(()=>tu(o,r)),[d,u]=y(n),p=JSON.stringify([t.id,e]),f=ee(p);L(()=>{f.current!==p&&(f.current=p,a(s),c(tu(o,r)),u(n))},[p,s,o,r,n]);let g=F(()=>{let $=new Set(ii(i)),S=[],C=[];for(let[_,k]of Object.entries(l))k&&!$.has(_)?S.push(_):!k&&$.has(_)&&C.push(_);return Ux({profile:i,alsoAllow:S,deny:C})},[i,l]),m=F(()=>Kx({profile:i,toolStates:g}),[i,g]),h=F(()=>{let $=nu(m);return JSON.stringify(d)!==JSON.stringify($)},[d,m]),b=q($=>{a($),c({})},[]),x=q(($,S)=>{c(C=>{let _={...C};return new Set(ii(i)).has($)===S?delete _[$]:_[$]=S,_})},[i]),v=q(()=>{a(d.profile);let $={};for(let S of d.alsoAllow)$[S]=!0;for(let S of d.deny)$[S]=!1;c($)},[d]),w=q(($={})=>{let S=nu($);u(S),a(S.profile),c(tu(S.alsoAllow,S.deny))},[]);return{profile:i,toolStates:g,toolsConfig:m,dirty:h,setProfile:b,toggleTool:x,reset:v,markSaved:w}};var Ko=P.bind(T),y2=[{label:"Overview",value:"overview"},{label:"Tools",value:"tools"}],v2=({className:t="w-3.5 h-3.5"})=>Ko`
+ `};var tu=(t=[],e=[])=>{let n={};for(let s of t)n[s]=!0;for(let s of e)n[s]=!1;return n},nu=({profile:t="full",alsoAllow:e=[],deny:n=[]}={})=>({profile:String(t||"full"),alsoAllow:[...Array.isArray(e)?e:[]].map(String).filter(Boolean).sort(),deny:[...Array.isArray(n)?n:[]].map(String).filter(Boolean).sort()}),sy=({agent:t={}}={})=>{let e=t.tools||{},n=nu(e),s=n.profile,o=n.alsoAllow,r=n.deny,[i,a]=y(s),[l,c]=y(()=>tu(o,r)),[d,u]=y(n),p=JSON.stringify([t.id,e]),f=ee(p);L(()=>{f.current!==p&&(f.current=p,a(s),c(tu(o,r)),u(n))},[p,s,o,r,n]);let g=F(()=>{let $=new Set(ii(i)),S=[],C=[];for(let[_,k]of Object.entries(l))k&&!$.has(_)?S.push(_):!k&&$.has(_)&&C.push(_);return qx({profile:i,alsoAllow:S,deny:C})},[i,l]),m=F(()=>Jx({profile:i,toolStates:g}),[i,g]),h=F(()=>{let $=nu(m);return JSON.stringify(d)!==JSON.stringify($)},[d,m]),b=q($=>{a($),c({})},[]),x=q(($,S)=>{c(C=>{let _={...C};return new Set(ii(i)).has($)===S?delete _[$]:_[$]=S,_})},[i]),v=q(()=>{a(d.profile);let $={};for(let S of d.alsoAllow)$[S]=!0;for(let S of d.deny)$[S]=!1;c($)},[d]),w=q(($={})=>{let S=nu($);u(S),a(S.profile),c(tu(S.alsoAllow,S.deny))},[]);return{profile:i,toolStates:g,toolsConfig:m,dirty:h,setProfile:b,toggleTool:x,reset:v,markSaved:w}};var Ko=P.bind(T),S2=[{label:"Overview",value:"overview"},{label:"Tools",value:"tools"}],C2=({className:t="w-3.5 h-3.5"})=>Ko`
-`,ty=({agent:t=null,agents:e=[],activeTab:n="overview",saving:s=!1,onUpdateAgent:o=async()=>{},onSetLocation:r=()=>{},onSelectTab:i=()=>{},onEdit:a=()=>{},onDelete:l=()=>{},onSetDefault:c=()=>{},onOpenWorkspace:d=()=>{}})=>{let u=ey({agent:t||{}}),[p,f]=y(!1),g=q(async()=>{if(t){f(!0);try{let b=await o(t.id,{tools:u.toolsConfig},"Tool access updated");u.markSaved(b?.tools||u.toolsConfig)}catch{}finally{f(!1)}}},[t,u.toolsConfig,u.markSaved,o]),m=s||p,h=F(()=>({profile:u.profile,enabledCount:(u.toolStates||[]).filter(b=>b.enabled).length,totalCount:(u.toolStates||[]).length}),[u.profile,u.toolStates]);return t?Ko`
+`,oy=({agent:t=null,agents:e=[],activeTab:n="overview",saving:s=!1,onUpdateAgent:o=async()=>{},onSetLocation:r=()=>{},onSelectTab:i=()=>{},onEdit:a=()=>{},onDelete:l=()=>{},onSetDefault:c=()=>{},onOpenWorkspace:d=()=>{}})=>{let u=sy({agent:t||{}}),[p,f]=y(!1),g=q(async()=>{if(t){f(!0);try{let b=await o(t.id,{tools:u.toolsConfig},"Tool access updated");u.markSaved(b?.tools||u.toolsConfig)}catch{}finally{f(!1)}}},[t,u.toolsConfig,u.markSaved,o]),m=s||p,h=F(()=>({profile:u.profile,enabledCount:(u.toolStates||[]).filter(b=>b.enabled).length,totalCount:(u.toolStates||[]).length}),[u.profile,u.toolStates]);return t?Ko`
@@ -3464,16 +3540,16 @@ Please report this to https://github.com/markedjs/marked.`,t){let s="