agentbuttons
Advanced tools
+2
-1
@@ -1,2 +0,3 @@ | ||
| 'use strict';var claudebuttons=require('claudebuttons'),hermesbuttons=require('hermesbuttons'),clawbuttons=require('clawbuttons');var i="agentpreferences",h=24,g=["claude-code","cowork","hermes","hermes-skill","openclaw","ironclaw","nanoclaw","zeroclaw","openharness","claudeclaw"],E=new Set(g);function C(){return typeof document<"u"}function u(){if(!C())return null;let e=document.cookie.split(";").map(r=>r.trim()).find(r=>r.startsWith(`${i}=`));if(!e)return null;let t=e.slice(i.length+1);if(!t)return null;try{let r=decodeURIComponent(t),n=JSON.parse(r);return !n||typeof n!="object"||!Array.isArray(n.order)?null:{order:n.order.filter(a=>typeof a=="string"&&a.length>0)}}catch{return null}}function A(e){if(!C())return;let t=e.order.slice(0,24),r=JSON.stringify({order:t}),n=new Date;n.setFullYear(n.getFullYear()+1),document.cookie=`${i}=${encodeURIComponent(r)}; Path=/; SameSite=Lax; Expires=${n.toUTCString()}`;}function _(e){if(!e||typeof e!="string")return;let r=u()?.order.filter(n=>n!==e)??[];A({order:[e,...r]});}function p(e){if(!e||!e.trim())return [];let t=[],r=new Set;for(let n of e.split(",")){let s=n.trim().toLowerCase();!s||!E.has(s)||r.has(s)||(r.add(s),t.push(s));}return t}function d(e,t){if(e.length===0)return null;let r=new Set(e);if(t){for(let n of t)if(r.has(n))return n}return e[0]}var P={"claude-code":"claude-code-button",cowork:"cowork-button",hermes:"hermes-button","hermes-skill":"hermes-skill-button",openclaw:"openclaw-button",ironclaw:"ironclaw-button",nanoclaw:"nanoclaw-button",zeroclaw:"zeroclaw-button",openharness:"openharness-button",claudeclaw:"claudeclaw-button"};function m(e){return P[e]??null}var T=["command","theme","variant","size","shape","popup","prompt-flag","popup-title","popup-description","auto-launch"];function f(e,t){for(let r of T)e.hasAttribute(r)&&t.setAttribute(r,e.getAttribute(r)??"");}var o=class extends HTMLElement{constructor(){super(...arguments);this._child=null;this._rendered=false;}connectedCallback(){this.render();}attributeChangedCallback(){this._rendered&&this.render();}render(){let r=p(this.getAttribute("agents")),n=u()?.order,s=d(r,n),a=s?m(s):null;if(s?this.setAttribute("data-resolved-agent",s):this.removeAttribute("data-resolved-agent"),this._child&&(this.removeChild(this._child),this._child=null),!a||!s){this._rendered=true;return}let c=document.createElement(a);f(this,c),this.appendChild(c),this._child=c,this._rendered=true;}};o.observedAttributes=["agents","command","theme","variant","size","shape","popup","prompt-flag","popup-title","popup-description","auto-launch"];function l(e="preferred-button"){typeof customElements>"u"||customElements.get(e)||customElements.define(e,o);}l();function S(e){let t=document.createElement("preferred-button");return t.setAttribute("agents",e.agents),t.setAttribute("command",e.command),e.theme&&t.setAttribute("theme",e.theme),e.variant&&t.setAttribute("variant",e.variant),e.size&&t.setAttribute("size",e.size),e.shape&&t.setAttribute("shape",e.shape),e.popup===false&&t.setAttribute("popup","false"),e.promptFlag===false&&t.setAttribute("prompt-flag","false"),e.popupTitle&&t.setAttribute("popup-title",e.popupTitle),e.popupDescription&&t.setAttribute("popup-description",e.popupDescription),e.autoLaunch===true&&t.setAttribute("auto-launch","true"),t}function k(){claudebuttons.register(),hermesbuttons.register(),clawbuttons.register(),l();}function v(){Promise.all([import('claudebuttons').then(e=>e.injectStructuredData()),import('hermesbuttons').then(e=>e.injectStructuredData()),import('clawbuttons').then(e=>e.injectStructuredData())]);}Object.defineProperty(exports,"CLAUDE_ALT_BRAND_COLOR",{enumerable:true,get:function(){return claudebuttons.ALT_BRAND_COLOR}});Object.defineProperty(exports,"CLAUDE_BRAND_COLOR",{enumerable:true,get:function(){return claudebuttons.BRAND_COLOR}});Object.defineProperty(exports,"CLAUDE_CODE_ICON",{enumerable:true,get:function(){return claudebuttons.CLAUDE_CODE_ICON}});Object.defineProperty(exports,"COWORK_ICON",{enumerable:true,get:function(){return claudebuttons.COWORK_ICON}});Object.defineProperty(exports,"ClaudeCodeButton",{enumerable:true,get:function(){return claudebuttons.ClaudeCodeButton}});Object.defineProperty(exports,"ClaudePopupDialog",{enumerable:true,get:function(){return claudebuttons.ClaudePopupDialog}});Object.defineProperty(exports,"CoworkButton",{enumerable:true,get:function(){return claudebuttons.CoworkButton}});Object.defineProperty(exports,"claudeThemes",{enumerable:true,get:function(){return claudebuttons.themes}});Object.defineProperty(exports,"createClaudeCodeButton",{enumerable:true,get:function(){return claudebuttons.createClaudeCodeButton}});Object.defineProperty(exports,"createCoworkButton",{enumerable:true,get:function(){return claudebuttons.createCoworkButton}});Object.defineProperty(exports,"discoverClaudeButtons",{enumerable:true,get:function(){return claudebuttons.discoverButtons}});Object.defineProperty(exports,"generateClaudeStructuredData",{enumerable:true,get:function(){return claudebuttons.generateStructuredData}});Object.defineProperty(exports,"injectClaudeStructuredData",{enumerable:true,get:function(){return claudebuttons.injectStructuredData}});Object.defineProperty(exports,"isDesktopAppLinkSupported",{enumerable:true,get:function(){return claudebuttons.isDesktopAppLinkSupported}});Object.defineProperty(exports,"isMobileOrTabletDevice",{enumerable:true,get:function(){return claudebuttons.isMobileOrTabletDevice}});Object.defineProperty(exports,"isRestrictedEmbeddedBrowser",{enumerable:true,get:function(){return claudebuttons.isRestrictedEmbeddedBrowser}});Object.defineProperty(exports,"registerClaude",{enumerable:true,get:function(){return claudebuttons.register}});Object.defineProperty(exports,"registerClaudeCodeButton",{enumerable:true,get:function(){return claudebuttons.registerClaudeCodeButton}});Object.defineProperty(exports,"registerCoworkButton",{enumerable:true,get:function(){return claudebuttons.registerCoworkButton}});Object.defineProperty(exports,"resolveClaudeTheme",{enumerable:true,get:function(){return claudebuttons.resolveTheme}});Object.defineProperty(exports,"showClaudePopup",{enumerable:true,get:function(){return claudebuttons.showPopup}});Object.defineProperty(exports,"HERMES_ALT_BRAND_COLOR",{enumerable:true,get:function(){return hermesbuttons.ALT_BRAND_COLOR}});Object.defineProperty(exports,"HERMES_BRAND_COLOR",{enumerable:true,get:function(){return hermesbuttons.BRAND_COLOR}});Object.defineProperty(exports,"HERMES_ICON",{enumerable:true,get:function(){return hermesbuttons.HERMES_ICON}});Object.defineProperty(exports,"HERMES_SKILL_ICON",{enumerable:true,get:function(){return hermesbuttons.HERMES_SKILL_ICON}});Object.defineProperty(exports,"HermesButton",{enumerable:true,get:function(){return hermesbuttons.HermesButton}});Object.defineProperty(exports,"HermesPopupDialog",{enumerable:true,get:function(){return hermesbuttons.HermesPopupDialog}});Object.defineProperty(exports,"HermesSkillButton",{enumerable:true,get:function(){return hermesbuttons.HermesSkillButton}});Object.defineProperty(exports,"createHermesButton",{enumerable:true,get:function(){return hermesbuttons.createHermesButton}});Object.defineProperty(exports,"createHermesSkillButton",{enumerable:true,get:function(){return hermesbuttons.createHermesSkillButton}});Object.defineProperty(exports,"discoverHermesButtons",{enumerable:true,get:function(){return hermesbuttons.discoverButtons}});Object.defineProperty(exports,"generateHermesStructuredData",{enumerable:true,get:function(){return hermesbuttons.generateStructuredData}});Object.defineProperty(exports,"hermesThemes",{enumerable:true,get:function(){return hermesbuttons.themes}});Object.defineProperty(exports,"injectHermesStructuredData",{enumerable:true,get:function(){return hermesbuttons.injectStructuredData}});Object.defineProperty(exports,"registerHermes",{enumerable:true,get:function(){return hermesbuttons.register}});Object.defineProperty(exports,"registerHermesButton",{enumerable:true,get:function(){return hermesbuttons.registerHermesButton}});Object.defineProperty(exports,"registerHermesSkillButton",{enumerable:true,get:function(){return hermesbuttons.registerHermesSkillButton}});Object.defineProperty(exports,"resolveHermesTheme",{enumerable:true,get:function(){return hermesbuttons.resolveTheme}});Object.defineProperty(exports,"showHermesPopup",{enumerable:true,get:function(){return hermesbuttons.showPopup}});Object.defineProperty(exports,"CLAUDECLAW_ICON",{enumerable:true,get:function(){return clawbuttons.CLAUDECLAW_ICON}});Object.defineProperty(exports,"CLAW_DEFAULT_BRAND_COLOR",{enumerable:true,get:function(){return clawbuttons.DEFAULT_BRAND_COLOR}});Object.defineProperty(exports,"CLAW_HERMES_ICON",{enumerable:true,get:function(){return clawbuttons.HERMES_ICON}});Object.defineProperty(exports,"ClawPopupDialog",{enumerable:true,get:function(){return clawbuttons.ClawPopupDialog}});Object.defineProperty(exports,"HARNESSES",{enumerable:true,get:function(){return clawbuttons.HARNESSES}});Object.defineProperty(exports,"HARNESS_IDS",{enumerable:true,get:function(){return clawbuttons.HARNESS_IDS}});Object.defineProperty(exports,"IRONCLAW_ICON",{enumerable:true,get:function(){return clawbuttons.IRONCLAW_ICON}});Object.defineProperty(exports,"NANOCLAW_ICON",{enumerable:true,get:function(){return clawbuttons.NANOCLAW_ICON}});Object.defineProperty(exports,"OPENCLAW_ICON",{enumerable:true,get:function(){return clawbuttons.OPENCLAW_ICON}});Object.defineProperty(exports,"OPENHARNESS_ICON",{enumerable:true,get:function(){return clawbuttons.OPENHARNESS_ICON}});Object.defineProperty(exports,"ZEROCLAW_ICON",{enumerable:true,get:function(){return clawbuttons.ZEROCLAW_ICON}});Object.defineProperty(exports,"createClawButton",{enumerable:true,get:function(){return clawbuttons.createButton}});Object.defineProperty(exports,"createClawButtonClass",{enumerable:true,get:function(){return clawbuttons.createClawButtonClass}});Object.defineProperty(exports,"discoverClawButtons",{enumerable:true,get:function(){return clawbuttons.discoverButtons}});Object.defineProperty(exports,"generateClawStructuredData",{enumerable:true,get:function(){return clawbuttons.generateStructuredData}});Object.defineProperty(exports,"getBrandColor",{enumerable:true,get:function(){return clawbuttons.getBrandColor}});Object.defineProperty(exports,"getButtonClass",{enumerable:true,get:function(){return clawbuttons.getButtonClass}});Object.defineProperty(exports,"getClawThemes",{enumerable:true,get:function(){return clawbuttons.getThemes}});Object.defineProperty(exports,"getHarness",{enumerable:true,get:function(){return clawbuttons.getHarness}});Object.defineProperty(exports,"getIcon",{enumerable:true,get:function(){return clawbuttons.getIcon}});Object.defineProperty(exports,"injectClawStructuredData",{enumerable:true,get:function(){return clawbuttons.injectStructuredData}});Object.defineProperty(exports,"registerAllClawButtons",{enumerable:true,get:function(){return clawbuttons.registerAllButtons}});Object.defineProperty(exports,"registerClaw",{enumerable:true,get:function(){return clawbuttons.register}});Object.defineProperty(exports,"registerHarnessButton",{enumerable:true,get:function(){return clawbuttons.registerHarnessButton}});Object.defineProperty(exports,"resolveClawTheme",{enumerable:true,get:function(){return clawbuttons.resolveTheme}});Object.defineProperty(exports,"showClawPopup",{enumerable:true,get:function(){return clawbuttons.showPopup}});exports.AGENT_PREFERENCES_COOKIE_NAME=i;exports.MAX_AGENT_PREFERENCE_ENTRIES=h;exports.PreferredButton=o;exports.SUPPORTED_PREFERRED_AGENT_IDS=g;exports.agentIdToCustomElementTag=m;exports.createPreferredButton=S;exports.forwardAgentButtonAttributes=f;exports.injectAllStructuredData=v;exports.parsePreferredAgentsAttribute=p;exports.pickPreferredAgentId=d;exports.readAgentPreferences=u;exports.recordAgentPreference=_;exports.register=k;exports.registerPreferredButton=l;exports.writeAgentPreferences=A;//# sourceMappingURL=index.js.map | ||
| 'use strict';var claudebuttons=require('claudebuttons'),hermesbuttons=require('hermesbuttons'),clawbuttons=require('clawbuttons');var i="agentpreferences",_=24,g=["claude-code","cowork","hermes","hermes-skill","openclaw","ironclaw","nanoclaw","zeroclaw","openharness","claudeclaw"],w=new Set(g);function h(){return typeof document<"u"}function u(){if(!h())return null;let e=document.cookie.split(";").map(r=>r.trim()).find(r=>r.startsWith(`${i}=`));if(!e)return null;let t=e.slice(i.length+1);if(!t)return null;try{let r=decodeURIComponent(t),n=JSON.parse(r);return !n||typeof n!="object"||!Array.isArray(n.order)?null:{order:n.order.filter(s=>typeof s=="string"&&s.length>0)}}catch{return null}}function C(e){if(!h())return;let t=e.order.slice(0,24),r=JSON.stringify({order:t}),n=new Date;n.setFullYear(n.getFullYear()+1),document.cookie=`${i}=${encodeURIComponent(r)}; Path=/; SameSite=Lax; Expires=${n.toUTCString()}`;}function P(e){if(!e||typeof e!="string")return;let r=u()?.order.filter(n=>n!==e)??[];C({order:[e,...r]});}function p(e){if(!e||!e.trim())return [];let t=[],r=new Set;for(let n of e.split(",")){let o=n.trim().toLowerCase();!o||!w.has(o)||r.has(o)||(r.add(o),t.push(o));}return t}function d(e,t){if(e.length===0)return null;let r=new Set(e);if(t){for(let n of t)if(r.has(n))return n}return e[0]}var S={"claude-code":"claude-code-button",cowork:"cowork-button",hermes:"hermes-button","hermes-skill":"hermes-skill-button",openclaw:"openclaw-button",ironclaw:"ironclaw-button",nanoclaw:"nanoclaw-button",zeroclaw:"zeroclaw-button",openharness:"openharness-button",claudeclaw:"claudeclaw-button"};function f(e){return S[e]??null}var T=["command","theme","variant","size","shape","popup","prompt-flag","popup-title","popup-description","auto-launch"];function m(e,t){for(let r of T)e.hasAttribute(r)&&t.setAttribute(r,e.getAttribute(r)??"");}var a=class extends HTMLElement{constructor(){super(...arguments);this._child=null;this._rendered=false;}connectedCallback(){this.render();}attributeChangedCallback(){this._rendered&&this.render();}render(){let r=p(this.getAttribute("agents")),n=u()?.order,o=d(r,n),s=o?f(o):null;if(o?this.setAttribute("data-resolved-agent",o):this.removeAttribute("data-resolved-agent"),this._child&&(this.removeChild(this._child),this._child=null),!s||!o){this._rendered=true;return}let c=document.createElement(s);m(this,c),this.appendChild(c),this._child=c,this._rendered=true;}};a.observedAttributes=["agents","command","theme","variant","size","shape","popup","prompt-flag","popup-title","popup-description","auto-launch"];function l(e="preferred-button"){typeof customElements>"u"||customElements.get(e)||customElements.define(e,a);}l();function O(e){let t=document.createElement("preferred-button");return t.setAttribute("agents",e.agents),t.setAttribute("command",e.command),e.theme&&t.setAttribute("theme",e.theme),e.variant&&t.setAttribute("variant",e.variant),e.size&&t.setAttribute("size",e.size),e.shape&&t.setAttribute("shape",e.shape),e.popup===false&&t.setAttribute("popup","false"),e.promptFlag===false&&t.setAttribute("prompt-flag","false"),e.popupTitle&&t.setAttribute("popup-title",e.popupTitle),e.popupDescription&&t.setAttribute("popup-description",e.popupDescription),e.autoLaunch===true&&t.setAttribute("auto-launch","true"),t}var A="https://agentbuttons.vercel.app/api/ping",E=false;function R(){if(E||typeof window>"u"||typeof navigator>"u")return;let e=window.location?.origin;if(!(!e||e==="null"||e.startsWith("file:"))){E=true;try{let t=JSON.stringify({origin:e}),r=new Blob([t],{type:"text/plain"});typeof navigator.sendBeacon=="function"?navigator.sendBeacon(A,r):fetch(A,{method:"POST",body:t,keepalive:!0}).catch(()=>{});}catch{}}}if(typeof window<"u")try{R();}catch{}function z(){claudebuttons.register(),hermesbuttons.register(),clawbuttons.register(),l();}function F(){Promise.all([import('claudebuttons').then(e=>e.injectStructuredData()),import('hermesbuttons').then(e=>e.injectStructuredData()),import('clawbuttons').then(e=>e.injectStructuredData())]);} | ||
| Object.defineProperty(exports,"CLAUDE_ALT_BRAND_COLOR",{enumerable:true,get:function(){return claudebuttons.ALT_BRAND_COLOR}});Object.defineProperty(exports,"CLAUDE_BRAND_COLOR",{enumerable:true,get:function(){return claudebuttons.BRAND_COLOR}});Object.defineProperty(exports,"CLAUDE_CODE_ICON",{enumerable:true,get:function(){return claudebuttons.CLAUDE_CODE_ICON}});Object.defineProperty(exports,"COWORK_ICON",{enumerable:true,get:function(){return claudebuttons.COWORK_ICON}});Object.defineProperty(exports,"ClaudeCodeButton",{enumerable:true,get:function(){return claudebuttons.ClaudeCodeButton}});Object.defineProperty(exports,"ClaudePopupDialog",{enumerable:true,get:function(){return claudebuttons.ClaudePopupDialog}});Object.defineProperty(exports,"CoworkButton",{enumerable:true,get:function(){return claudebuttons.CoworkButton}});Object.defineProperty(exports,"claudeThemes",{enumerable:true,get:function(){return claudebuttons.themes}});Object.defineProperty(exports,"createClaudeCodeButton",{enumerable:true,get:function(){return claudebuttons.createClaudeCodeButton}});Object.defineProperty(exports,"createCoworkButton",{enumerable:true,get:function(){return claudebuttons.createCoworkButton}});Object.defineProperty(exports,"discoverClaudeButtons",{enumerable:true,get:function(){return claudebuttons.discoverButtons}});Object.defineProperty(exports,"generateClaudeStructuredData",{enumerable:true,get:function(){return claudebuttons.generateStructuredData}});Object.defineProperty(exports,"injectClaudeStructuredData",{enumerable:true,get:function(){return claudebuttons.injectStructuredData}});Object.defineProperty(exports,"isDesktopAppLinkSupported",{enumerable:true,get:function(){return claudebuttons.isDesktopAppLinkSupported}});Object.defineProperty(exports,"isMobileOrTabletDevice",{enumerable:true,get:function(){return claudebuttons.isMobileOrTabletDevice}});Object.defineProperty(exports,"isRestrictedEmbeddedBrowser",{enumerable:true,get:function(){return claudebuttons.isRestrictedEmbeddedBrowser}});Object.defineProperty(exports,"registerClaude",{enumerable:true,get:function(){return claudebuttons.register}});Object.defineProperty(exports,"registerClaudeCodeButton",{enumerable:true,get:function(){return claudebuttons.registerClaudeCodeButton}});Object.defineProperty(exports,"registerCoworkButton",{enumerable:true,get:function(){return claudebuttons.registerCoworkButton}});Object.defineProperty(exports,"resolveClaudeTheme",{enumerable:true,get:function(){return claudebuttons.resolveTheme}});Object.defineProperty(exports,"showClaudePopup",{enumerable:true,get:function(){return claudebuttons.showPopup}});Object.defineProperty(exports,"HERMES_ALT_BRAND_COLOR",{enumerable:true,get:function(){return hermesbuttons.ALT_BRAND_COLOR}});Object.defineProperty(exports,"HERMES_BRAND_COLOR",{enumerable:true,get:function(){return hermesbuttons.BRAND_COLOR}});Object.defineProperty(exports,"HERMES_ICON",{enumerable:true,get:function(){return hermesbuttons.HERMES_ICON}});Object.defineProperty(exports,"HERMES_SKILL_ICON",{enumerable:true,get:function(){return hermesbuttons.HERMES_SKILL_ICON}});Object.defineProperty(exports,"HermesButton",{enumerable:true,get:function(){return hermesbuttons.HermesButton}});Object.defineProperty(exports,"HermesPopupDialog",{enumerable:true,get:function(){return hermesbuttons.HermesPopupDialog}});Object.defineProperty(exports,"HermesSkillButton",{enumerable:true,get:function(){return hermesbuttons.HermesSkillButton}});Object.defineProperty(exports,"createHermesButton",{enumerable:true,get:function(){return hermesbuttons.createHermesButton}});Object.defineProperty(exports,"createHermesSkillButton",{enumerable:true,get:function(){return hermesbuttons.createHermesSkillButton}});Object.defineProperty(exports,"discoverHermesButtons",{enumerable:true,get:function(){return hermesbuttons.discoverButtons}});Object.defineProperty(exports,"generateHermesStructuredData",{enumerable:true,get:function(){return hermesbuttons.generateStructuredData}});Object.defineProperty(exports,"hermesThemes",{enumerable:true,get:function(){return hermesbuttons.themes}});Object.defineProperty(exports,"injectHermesStructuredData",{enumerable:true,get:function(){return hermesbuttons.injectStructuredData}});Object.defineProperty(exports,"registerHermes",{enumerable:true,get:function(){return hermesbuttons.register}});Object.defineProperty(exports,"registerHermesButton",{enumerable:true,get:function(){return hermesbuttons.registerHermesButton}});Object.defineProperty(exports,"registerHermesSkillButton",{enumerable:true,get:function(){return hermesbuttons.registerHermesSkillButton}});Object.defineProperty(exports,"resolveHermesTheme",{enumerable:true,get:function(){return hermesbuttons.resolveTheme}});Object.defineProperty(exports,"showHermesPopup",{enumerable:true,get:function(){return hermesbuttons.showPopup}});Object.defineProperty(exports,"CLAUDECLAW_ICON",{enumerable:true,get:function(){return clawbuttons.CLAUDECLAW_ICON}});Object.defineProperty(exports,"CLAW_DEFAULT_BRAND_COLOR",{enumerable:true,get:function(){return clawbuttons.DEFAULT_BRAND_COLOR}});Object.defineProperty(exports,"CLAW_HERMES_ICON",{enumerable:true,get:function(){return clawbuttons.HERMES_ICON}});Object.defineProperty(exports,"ClawPopupDialog",{enumerable:true,get:function(){return clawbuttons.ClawPopupDialog}});Object.defineProperty(exports,"HARNESSES",{enumerable:true,get:function(){return clawbuttons.HARNESSES}});Object.defineProperty(exports,"HARNESS_IDS",{enumerable:true,get:function(){return clawbuttons.HARNESS_IDS}});Object.defineProperty(exports,"IRONCLAW_ICON",{enumerable:true,get:function(){return clawbuttons.IRONCLAW_ICON}});Object.defineProperty(exports,"NANOCLAW_ICON",{enumerable:true,get:function(){return clawbuttons.NANOCLAW_ICON}});Object.defineProperty(exports,"OPENCLAW_ICON",{enumerable:true,get:function(){return clawbuttons.OPENCLAW_ICON}});Object.defineProperty(exports,"OPENHARNESS_ICON",{enumerable:true,get:function(){return clawbuttons.OPENHARNESS_ICON}});Object.defineProperty(exports,"ZEROCLAW_ICON",{enumerable:true,get:function(){return clawbuttons.ZEROCLAW_ICON}});Object.defineProperty(exports,"createClawButton",{enumerable:true,get:function(){return clawbuttons.createButton}});Object.defineProperty(exports,"createClawButtonClass",{enumerable:true,get:function(){return clawbuttons.createClawButtonClass}});Object.defineProperty(exports,"discoverClawButtons",{enumerable:true,get:function(){return clawbuttons.discoverButtons}});Object.defineProperty(exports,"generateClawStructuredData",{enumerable:true,get:function(){return clawbuttons.generateStructuredData}});Object.defineProperty(exports,"getBrandColor",{enumerable:true,get:function(){return clawbuttons.getBrandColor}});Object.defineProperty(exports,"getButtonClass",{enumerable:true,get:function(){return clawbuttons.getButtonClass}});Object.defineProperty(exports,"getClawThemes",{enumerable:true,get:function(){return clawbuttons.getThemes}});Object.defineProperty(exports,"getHarness",{enumerable:true,get:function(){return clawbuttons.getHarness}});Object.defineProperty(exports,"getIcon",{enumerable:true,get:function(){return clawbuttons.getIcon}});Object.defineProperty(exports,"injectClawStructuredData",{enumerable:true,get:function(){return clawbuttons.injectStructuredData}});Object.defineProperty(exports,"registerAllClawButtons",{enumerable:true,get:function(){return clawbuttons.registerAllButtons}});Object.defineProperty(exports,"registerClaw",{enumerable:true,get:function(){return clawbuttons.register}});Object.defineProperty(exports,"registerHarnessButton",{enumerable:true,get:function(){return clawbuttons.registerHarnessButton}});Object.defineProperty(exports,"resolveClawTheme",{enumerable:true,get:function(){return clawbuttons.resolveTheme}});Object.defineProperty(exports,"showClawPopup",{enumerable:true,get:function(){return clawbuttons.showPopup}});exports.AGENT_PREFERENCES_COOKIE_NAME=i;exports.MAX_AGENT_PREFERENCE_ENTRIES=_;exports.PreferredButton=a;exports.SUPPORTED_PREFERRED_AGENT_IDS=g;exports.agentIdToCustomElementTag=f;exports.createPreferredButton=O;exports.forwardAgentButtonAttributes=m;exports.injectAllStructuredData=F;exports.parsePreferredAgentsAttribute=p;exports.pickPreferredAgentId=d;exports.readAgentPreferences=u;exports.recordAgentPreference=P;exports.register=z;exports.registerPreferredButton=l;exports.writeAgentPreferences=C;//# sourceMappingURL=index.js.map | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/agent-preferences.ts","../src/preferred-button.ts","../src/index.ts"],"names":["AGENT_PREFERENCES_COOKIE_NAME","MAX_AGENT_PREFERENCE_ENTRIES","SUPPORTED_PREFERRED_AGENT_IDS","KNOWN","isBrowser","readAgentPreferences","match","p","value","decoded","data","x","writeAgentPreferences","payload","order","json","expires","recordAgentPreference","agentId","base","id","parsePreferredAgentsAttribute","out","seen","raw","pickPreferredAgentId","developerOrder","cookieOrder","allowed","AGENT_TO_TAG","agentIdToCustomElementTag","FORWARD_ATTR_NAMES","forwardAgentButtonAttributes","from","to","name","PreferredButton","picked","tag","el","registerPreferredButton","tagName","createPreferredButton","options","register","_registerClaude","_registerHermes","_registerClaw","injectAllStructuredData","m"],"mappings":"sIAIaA,CAAAA,CAAgC,kBAAA,CAEhCC,EAA+B,EAAA,CAE/BC,CAAAA,CAAgC,CAC3C,aAAA,CACA,QAAA,CACA,QAAA,CACA,cAAA,CACA,UAAA,CACA,UAAA,CACA,WACA,UAAA,CACA,aAAA,CACA,YACF,CAAA,CASMC,CAAAA,CAAQ,IAAI,GAAA,CAAYD,CAA6B,EAE3D,SAASE,CAAAA,EAAqB,CAC5B,OAAO,OAAO,SAAa,GAC7B,CAEO,SAASC,CAAAA,EAAuD,CACrE,GAAI,CAACD,CAAAA,EAAU,CAAG,OAAO,IAAA,CACzB,IAAME,EAAQ,QAAA,CAAS,MAAA,CACpB,MAAM,GAAG,CAAA,CACT,IAAKC,CAAAA,EAAMA,CAAAA,CAAE,MAAM,CAAA,CACnB,KAAMA,CAAAA,EAAMA,CAAAA,CAAE,WAAW,CAAA,EAAGP,CAA6B,CAAA,CAAA,CAAG,CAAC,CAAA,CAChE,GAAI,CAACM,CAAAA,CAAO,OAAO,KACnB,IAAME,CAAAA,CAAQF,EAAM,KAAA,CAAMN,CAAAA,CAA8B,OAAS,CAAC,CAAA,CAClE,GAAI,CAACQ,CAAAA,CAAO,OAAO,IAAA,CACnB,GAAI,CACF,IAAMC,CAAAA,CAAU,kBAAA,CAAmBD,CAAK,CAAA,CAClCE,CAAAA,CAAO,KAAK,KAAA,CAAMD,CAAO,EAC/B,OAAI,CAACC,GAAQ,OAAOA,CAAAA,EAAS,UAAY,CAAC,KAAA,CAAM,QAASA,CAAAA,CAAiC,KAAK,EACtF,IAAA,CAKF,CAAE,MAHMA,CAAAA,CAAiC,KAAA,CAAM,MAAA,CACnDC,CAAAA,EAAmB,OAAOA,CAAAA,EAAM,UAAYA,CAAAA,CAAE,MAAA,CAAS,CAC1D,CACe,CACjB,MAAQ,CACN,OAAO,IACT,CACF,CAEO,SAASC,CAAAA,CAAsBC,CAAAA,CAAwC,CAC5E,GAAI,CAACT,GAAU,CAAG,OAClB,IAAMU,CAAAA,CAAQD,CAAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,CAAG,EAA4B,EAC3DE,CAAAA,CAAO,IAAA,CAAK,UAAU,CAAE,KAAA,CAAAD,CAAM,CAAC,CAAA,CAC/BE,EAAU,IAAI,IAAA,CACpBA,EAAQ,WAAA,CAAYA,CAAAA,CAAQ,aAAY,CAAI,CAAC,CAAA,CAC7C,QAAA,CAAS,MAAA,CAAS,CAAA,EAAGhB,CAA6B,CAAA,CAAA,EAAI,kBAAA,CAAmBe,CAAI,CAAC,CAAA,gCAAA,EAAmCC,EAAQ,WAAA,EAAa,GACxI,CAEO,SAASC,EAAsBC,CAAAA,CAAuB,CAC3D,GAAI,CAACA,CAAAA,EAAW,OAAOA,CAAAA,EAAY,QAAA,CAAU,OAE7C,IAAMC,CAAAA,CADOd,CAAAA,IACM,KAAA,CAAM,MAAA,CAAQe,GAAOA,CAAAA,GAAOF,CAAO,GAAK,EAAC,CAC5DN,EAAsB,CAAE,KAAA,CAAO,CAACM,CAAAA,CAAS,GAAGC,CAAI,CAAE,CAAC,EACrD,CAGO,SAASE,CAAAA,CAA8Bb,CAAAA,CAAgC,CAC5E,GAAI,CAACA,CAAAA,EAAS,CAACA,EAAM,IAAA,EAAK,CAAG,OAAO,EAAC,CACrC,IAAMc,CAAAA,CAAgB,GAChBC,CAAAA,CAAO,IAAI,IACjB,IAAA,IAAWC,CAAAA,IAAOhB,EAAM,KAAA,CAAM,GAAG,CAAA,CAAG,CAClC,IAAMY,CAAAA,CAAKI,EAAI,IAAA,EAAK,CAAE,aAAY,CAC9B,CAACJ,GAAM,CAACjB,CAAAA,CAAM,GAAA,CAAIiB,CAAE,CAAA,EAAKG,CAAAA,CAAK,IAAIH,CAAE,CAAA,GACxCG,EAAK,GAAA,CAAIH,CAAE,EACXE,CAAAA,CAAI,IAAA,CAAKF,CAAE,CAAA,EACb,CACA,OAAOE,CACT,CAMO,SAASG,EACdC,CAAAA,CACAC,CAAAA,CACe,CACf,GAAID,CAAAA,CAAe,SAAW,CAAA,CAAG,OAAO,KACxC,IAAME,CAAAA,CAAU,IAAI,GAAA,CAAIF,CAAc,EACtC,GAAIC,CAAAA,CAAAA,CACF,IAAA,IAAWP,CAAAA,IAAMO,CAAAA,CACf,GAAIC,EAAQ,GAAA,CAAIR,CAAE,EAAG,OAAOA,CAAAA,CAGhC,OAAOM,CAAAA,CAAe,CAAC,CACzB,CAEA,IAAMG,EAAuC,CAC3C,aAAA,CAAe,qBACf,MAAA,CAAQ,eAAA,CACR,OAAQ,eAAA,CACR,cAAA,CAAgB,qBAAA,CAChB,QAAA,CAAU,iBAAA,CACV,QAAA,CAAU,kBACV,QAAA,CAAU,iBAAA,CACV,SAAU,iBAAA,CACV,WAAA,CAAa,qBACb,UAAA,CAAY,mBACd,EAEO,SAASC,CAAAA,CAA0BZ,EAAgC,CACxE,OAAOW,EAAaX,CAAO,CAAA,EAAK,IAClC,CAEA,IAAMa,CAAAA,CAAqB,CACzB,SAAA,CACA,OAAA,CACA,UACA,MAAA,CACA,OAAA,CACA,QACA,aAAA,CACA,aAAA,CACA,oBACA,aACF,CAAA,CAGO,SAASC,CAAAA,CAA6BC,CAAAA,CAAmBC,EAAuB,CACrF,IAAA,IAAWC,KAAQJ,CAAAA,CACZE,CAAAA,CAAK,aAAaE,CAAI,CAAA,EAC3BD,CAAAA,CAAG,YAAA,CAAaC,CAAAA,CAAMF,CAAAA,CAAK,aAAaE,CAAI,CAAA,EAAK,EAAE,EAEvD,KCjIaC,CAAAA,CAAN,cAA8B,WAAY,CAA1C,WAAA,EAAA,CAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAeL,KAAQ,MAAA,CAA6B,IAAA,CACrC,KAAQ,SAAA,CAAY,MAAA,CAEpB,mBAAoB,CAClB,IAAA,CAAK,MAAA,GACP,CAEA,wBAAA,EAA2B,CACpB,IAAA,CAAK,SAAA,EACV,KAAK,MAAA,GACP,CAEQ,MAAA,EAAS,CACf,IAAMV,CAAAA,CAAiBL,CAAAA,CAA8B,KAAK,YAAA,CAAa,QAAQ,CAAC,CAAA,CAC1EM,CAAAA,CAActB,GAAqB,EAAG,KAAA,CACtCgC,CAAAA,CAASZ,CAAAA,CAAqBC,CAAAA,CAAgBC,CAAW,EACzDW,CAAAA,CAAMD,CAAAA,CAASP,EAA0BO,CAAM,CAAA,CAAI,KAazD,GAXIA,CAAAA,CACF,KAAK,YAAA,CAAa,qBAAA,CAAuBA,CAAM,CAAA,CAE/C,IAAA,CAAK,gBAAgB,qBAAqB,CAAA,CAGxC,KAAK,MAAA,GACP,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA,CAC5B,KAAK,MAAA,CAAS,IAAA,CAAA,CAGZ,CAACC,CAAAA,EAAO,CAACD,EAAQ,CACnB,IAAA,CAAK,SAAA,CAAY,IAAA,CACjB,MACF,CAEA,IAAME,CAAAA,CAAK,QAAA,CAAS,cAAcD,CAAG,CAAA,CACrCN,EAA6B,IAAA,CAAMO,CAAE,CAAA,CACrC,IAAA,CAAK,WAAA,CAAYA,CAAE,EACnB,IAAA,CAAK,MAAA,CAASA,EACd,IAAA,CAAK,SAAA,CAAY,KACnB,CACF,EAvDaH,EACJ,kBAAA,CAAqB,CAC1B,SACA,SAAA,CACA,OAAA,CACA,UACA,MAAA,CACA,OAAA,CACA,QACA,aAAA,CACA,aAAA,CACA,mBAAA,CACA,aACF,CAAA,CA4CK,SAASI,EAAwBC,CAAAA,CAAU,kBAAA,CAAoB,CAChE,OAAO,cAAA,CAAmB,KACzB,cAAA,CAAe,GAAA,CAAIA,CAAO,CAAA,EAC7B,cAAA,CAAe,OAAOA,CAAAA,CAASL,CAAe,EAElD,CAEAI,CAAAA,GAiBO,SAASE,CAAAA,CAAsBC,CAAAA,CAAkD,CACtF,IAAMJ,CAAAA,CAAK,SAAS,aAAA,CAAc,kBAAkB,EACpD,OAAAA,CAAAA,CAAG,aAAa,QAAA,CAAUI,CAAAA,CAAQ,MAAM,CAAA,CACxCJ,CAAAA,CAAG,aAAa,SAAA,CAAWI,CAAAA,CAAQ,OAAO,CAAA,CACtCA,CAAAA,CAAQ,OAAOJ,CAAAA,CAAG,YAAA,CAAa,OAAA,CAASI,CAAAA,CAAQ,KAAK,CAAA,CACrDA,EAAQ,OAAA,EAASJ,CAAAA,CAAG,aAAa,SAAA,CAAWI,CAAAA,CAAQ,OAAO,CAAA,CAC3DA,CAAAA,CAAQ,MAAMJ,CAAAA,CAAG,YAAA,CAAa,OAAQI,CAAAA,CAAQ,IAAI,EAClDA,CAAAA,CAAQ,KAAA,EAAOJ,EAAG,YAAA,CAAa,OAAA,CAASI,CAAAA,CAAQ,KAAK,CAAA,CACrDA,CAAAA,CAAQ,QAAU,KAAA,EAAOJ,CAAAA,CAAG,aAAa,OAAA,CAAS,OAAO,EACzDI,CAAAA,CAAQ,UAAA,GAAe,OAAOJ,CAAAA,CAAG,YAAA,CAAa,cAAe,OAAO,CAAA,CACpEI,EAAQ,UAAA,EAAYJ,CAAAA,CAAG,aAAa,aAAA,CAAeI,CAAAA,CAAQ,UAAU,CAAA,CACrEA,CAAAA,CAAQ,gBAAA,EAAkBJ,EAAG,YAAA,CAAa,mBAAA,CAAqBI,EAAQ,gBAAgB,CAAA,CACvFA,EAAQ,UAAA,GAAe,IAAA,EAAMJ,EAAG,YAAA,CAAa,aAAA,CAAe,MAAM,CAAA,CAC/DA,CACT,CCwCO,SAASK,CAAAA,EAAW,CACzBC,wBAAgB,CAChBC,sBAAAA,GACAC,oBAAAA,EAAc,CACdP,IACF,CAKO,SAASQ,CAAAA,EAA0B,CAExC,QAAQ,GAAA,CAAI,CACV,OAAO,eAAe,CAAA,CAAE,IAAA,CAAMC,GAAMA,CAAAA,CAAE,oBAAA,EAAsB,CAAA,CAC5D,OAAO,eAAe,CAAA,CAAE,IAAA,CAAMA,CAAAA,EAAMA,CAAAA,CAAE,oBAAA,EAAsB,EAC5D,OAAO,aAAa,EAAE,IAAA,CAAMA,CAAAA,EAAMA,EAAE,oBAAA,EAAsB,CAC5D,CAAC,EACH","file":"index.js","sourcesContent":["/**\n * Cross-site preference cookie for the agentbuttons family (same origin).\n * Name and JSON shape must match claudebuttons, hermesbuttons, and clawbuttons.\n */\nexport const AGENT_PREFERENCES_COOKIE_NAME = 'agentpreferences';\n\nexport const MAX_AGENT_PREFERENCE_ENTRIES = 24;\n\nexport const SUPPORTED_PREFERRED_AGENT_IDS = [\n 'claude-code',\n 'cowork',\n 'hermes',\n 'hermes-skill',\n 'openclaw',\n 'ironclaw',\n 'nanoclaw',\n 'zeroclaw',\n 'openharness',\n 'claudeclaw',\n] as const;\n\nexport type PreferredAgentId = (typeof SUPPORTED_PREFERRED_AGENT_IDS)[number];\n\nexport interface AgentPreferencesPayload {\n /** Most recently used agent ids first. */\n order: string[];\n}\n\nconst KNOWN = new Set<string>(SUPPORTED_PREFERRED_AGENT_IDS);\n\nfunction isBrowser(): boolean {\n return typeof document !== 'undefined';\n}\n\nexport function readAgentPreferences(): AgentPreferencesPayload | null {\n if (!isBrowser()) return null;\n const match = document.cookie\n .split(';')\n .map((p) => p.trim())\n .find((p) => p.startsWith(`${AGENT_PREFERENCES_COOKIE_NAME}=`));\n if (!match) return null;\n const value = match.slice(AGENT_PREFERENCES_COOKIE_NAME.length + 1);\n if (!value) return null;\n try {\n const decoded = decodeURIComponent(value);\n const data = JSON.parse(decoded) as unknown;\n if (!data || typeof data !== 'object' || !Array.isArray((data as AgentPreferencesPayload).order)) {\n return null;\n }\n const order = (data as AgentPreferencesPayload).order.filter(\n (x): x is string => typeof x === 'string' && x.length > 0,\n );\n return { order };\n } catch {\n return null;\n }\n}\n\nexport function writeAgentPreferences(payload: AgentPreferencesPayload): void {\n if (!isBrowser()) return;\n const order = payload.order.slice(0, MAX_AGENT_PREFERENCE_ENTRIES);\n const json = JSON.stringify({ order });\n const expires = new Date();\n expires.setFullYear(expires.getFullYear() + 1);\n document.cookie = `${AGENT_PREFERENCES_COOKIE_NAME}=${encodeURIComponent(json)}; Path=/; SameSite=Lax; Expires=${expires.toUTCString()}`;\n}\n\nexport function recordAgentPreference(agentId: string): void {\n if (!agentId || typeof agentId !== 'string') return;\n const prev = readAgentPreferences();\n const base = prev?.order.filter((id) => id !== agentId) ?? [];\n writeAgentPreferences({ order: [agentId, ...base] });\n}\n\n/** Parse a comma-separated `agents` attribute; unknown tokens are dropped. */\nexport function parsePreferredAgentsAttribute(value: string | null): string[] {\n if (!value || !value.trim()) return [];\n const out: string[] = [];\n const seen = new Set<string>();\n for (const raw of value.split(',')) {\n const id = raw.trim().toLowerCase();\n if (!id || !KNOWN.has(id) || seen.has(id)) continue;\n seen.add(id);\n out.push(id);\n }\n return out;\n}\n\n/**\n * Pick which agent to show: first cookie hit that appears in developerOrder,\n * else the first entry in developerOrder (developer default).\n */\nexport function pickPreferredAgentId(\n developerOrder: string[],\n cookieOrder: string[] | null | undefined,\n): string | null {\n if (developerOrder.length === 0) return null;\n const allowed = new Set(developerOrder);\n if (cookieOrder) {\n for (const id of cookieOrder) {\n if (allowed.has(id)) return id;\n }\n }\n return developerOrder[0];\n}\n\nconst AGENT_TO_TAG: Record<string, string> = {\n 'claude-code': 'claude-code-button',\n cowork: 'cowork-button',\n hermes: 'hermes-button',\n 'hermes-skill': 'hermes-skill-button',\n openclaw: 'openclaw-button',\n ironclaw: 'ironclaw-button',\n nanoclaw: 'nanoclaw-button',\n zeroclaw: 'zeroclaw-button',\n openharness: 'openharness-button',\n claudeclaw: 'claudeclaw-button',\n};\n\nexport function agentIdToCustomElementTag(agentId: string): string | null {\n return AGENT_TO_TAG[agentId] ?? null;\n}\n\nconst FORWARD_ATTR_NAMES = [\n 'command',\n 'theme',\n 'variant',\n 'size',\n 'shape',\n 'popup',\n 'prompt-flag',\n 'popup-title',\n 'popup-description',\n 'auto-launch',\n] as const;\n\n/** Copy shared presentation attributes from a preferred-button host onto a child agent button. */\nexport function forwardAgentButtonAttributes(from: HTMLElement, to: HTMLElement): void {\n for (const name of FORWARD_ATTR_NAMES) {\n if (!from.hasAttribute(name)) continue;\n to.setAttribute(name, from.getAttribute(name) ?? '');\n }\n}\n","import {\n readAgentPreferences,\n parsePreferredAgentsAttribute,\n pickPreferredAgentId,\n agentIdToCustomElementTag,\n forwardAgentButtonAttributes,\n} from './agent-preferences';\n\n/**\n * Renders a single agent button chosen from the `agents` list.\n * If the `agentpreferences` cookie exists (written by any family button on copy),\n * the first matching id in that cookie wins; otherwise the first id in `agents` is used.\n */\nexport class PreferredButton extends HTMLElement {\n static observedAttributes = [\n 'agents',\n 'command',\n 'theme',\n 'variant',\n 'size',\n 'shape',\n 'popup',\n 'prompt-flag',\n 'popup-title',\n 'popup-description',\n 'auto-launch',\n ];\n\n private _child: HTMLElement | null = null;\n private _rendered = false;\n\n connectedCallback() {\n this.render();\n }\n\n attributeChangedCallback() {\n if (!this._rendered) return;\n this.render();\n }\n\n private render() {\n const developerOrder = parsePreferredAgentsAttribute(this.getAttribute('agents'));\n const cookieOrder = readAgentPreferences()?.order;\n const picked = pickPreferredAgentId(developerOrder, cookieOrder);\n const tag = picked ? agentIdToCustomElementTag(picked) : null;\n\n if (picked) {\n this.setAttribute('data-resolved-agent', picked);\n } else {\n this.removeAttribute('data-resolved-agent');\n }\n\n if (this._child) {\n this.removeChild(this._child);\n this._child = null;\n }\n\n if (!tag || !picked) {\n this._rendered = true;\n return;\n }\n\n const el = document.createElement(tag) as HTMLElement;\n forwardAgentButtonAttributes(this, el);\n this.appendChild(el);\n this._child = el;\n this._rendered = true;\n }\n}\n\nexport function registerPreferredButton(tagName = 'preferred-button') {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, PreferredButton);\n }\n}\n\nregisterPreferredButton();\n\nexport interface PreferredButtonOptions {\n /** Comma-separated agent ids, developer priority order (e.g. claude-code,hermes,openclaw). */\n agents: string;\n command: string;\n theme?: string;\n variant?: string;\n size?: string;\n shape?: string;\n popup?: boolean;\n promptFlag?: boolean;\n popupTitle?: string;\n popupDescription?: string;\n autoLaunch?: boolean;\n}\n\nexport function createPreferredButton(options: PreferredButtonOptions): PreferredButton {\n const el = document.createElement('preferred-button') as PreferredButton;\n el.setAttribute('agents', options.agents);\n el.setAttribute('command', options.command);\n if (options.theme) el.setAttribute('theme', options.theme);\n if (options.variant) el.setAttribute('variant', options.variant);\n if (options.size) el.setAttribute('size', options.size);\n if (options.shape) el.setAttribute('shape', options.shape);\n if (options.popup === false) el.setAttribute('popup', 'false');\n if (options.promptFlag === false) el.setAttribute('prompt-flag', 'false');\n if (options.popupTitle) el.setAttribute('popup-title', options.popupTitle);\n if (options.popupDescription) el.setAttribute('popup-description', options.popupDescription);\n if (options.autoLaunch === true) el.setAttribute('auto-launch', 'true');\n return el;\n}\n","// ── Claude Code buttons ─────────────────────────────────────────────\nexport {\n ClaudeCodeButton,\n createClaudeCodeButton,\n registerClaudeCodeButton,\n CoworkButton,\n createCoworkButton,\n registerCoworkButton,\n ClaudePopupDialog,\n showPopup as showClaudePopup,\n CLAUDE_CODE_ICON,\n COWORK_ICON,\n themes as claudeThemes,\n resolveTheme as resolveClaudeTheme,\n BRAND_COLOR as CLAUDE_BRAND_COLOR,\n ALT_BRAND_COLOR as CLAUDE_ALT_BRAND_COLOR,\n isDesktopAppLinkSupported,\n isRestrictedEmbeddedBrowser,\n isMobileOrTabletDevice,\n discoverButtons as discoverClaudeButtons,\n generateStructuredData as generateClaudeStructuredData,\n injectStructuredData as injectClaudeStructuredData,\n register as registerClaude,\n} from 'claudebuttons';\n\nexport type {\n Theme as ClaudeTheme,\n Size as ClaudeSize,\n Variant as ClaudeVariant,\n Shape as ClaudeShape,\n ClaudeCodeButtonOptions,\n CoworkButtonOptions,\n PopupOptions as ClaudePopupOptions,\n ThemeTokens as ClaudeThemeTokens,\n ButtonMetadata as ClaudeButtonMetadata,\n} from 'claudebuttons';\n\n// ── Hermes Agent buttons ────────────────────────────────────────────\nexport {\n HermesButton,\n createHermesButton,\n registerHermesButton,\n HermesSkillButton,\n createHermesSkillButton,\n registerHermesSkillButton,\n HermesPopupDialog,\n showPopup as showHermesPopup,\n HERMES_ICON,\n HERMES_SKILL_ICON,\n themes as hermesThemes,\n resolveTheme as resolveHermesTheme,\n BRAND_COLOR as HERMES_BRAND_COLOR,\n ALT_BRAND_COLOR as HERMES_ALT_BRAND_COLOR,\n discoverButtons as discoverHermesButtons,\n generateStructuredData as generateHermesStructuredData,\n injectStructuredData as injectHermesStructuredData,\n register as registerHermes,\n} from 'hermesbuttons';\n\nexport type {\n Theme as HermesTheme,\n Size as HermesSize,\n Variant as HermesVariant,\n Shape as HermesShape,\n HermesButtonOptions,\n HermesSkillButtonOptions,\n PopupOptions as HermesPopupOptions,\n ThemeTokens as HermesThemeTokens,\n ButtonMetadata as HermesButtonMetadata,\n} from 'hermesbuttons';\n\n// ── OpenClaw-style harness buttons (OpenClaw, IronClaw, etc.) ───────\nexport {\n createClawButtonClass,\n getButtonClass,\n registerHarnessButton,\n registerAllButtons as registerAllClawButtons,\n createButton as createClawButton,\n ClawPopupDialog,\n showPopup as showClawPopup,\n OPENCLAW_ICON,\n HERMES_ICON as CLAW_HERMES_ICON,\n IRONCLAW_ICON,\n NANOCLAW_ICON,\n ZEROCLAW_ICON,\n OPENHARNESS_ICON,\n CLAUDECLAW_ICON,\n getIcon,\n getThemes as getClawThemes,\n resolveTheme as resolveClawTheme,\n DEFAULT_BRAND_COLOR as CLAW_DEFAULT_BRAND_COLOR,\n getBrandColor,\n HARNESSES,\n HARNESS_IDS,\n getHarness,\n discoverButtons as discoverClawButtons,\n generateStructuredData as generateClawStructuredData,\n injectStructuredData as injectClawStructuredData,\n register as registerClaw,\n} from 'clawbuttons';\n\nexport type {\n Theme as ClawTheme,\n Size as ClawSize,\n Variant as ClawVariant,\n Shape as ClawShape,\n HarnessId,\n HarnessConfig,\n ClawButtonOptions,\n PopupOptions as ClawPopupOptions,\n ThemeTokens as ClawThemeTokens,\n ButtonMetadata as ClawButtonMetadata,\n} from 'clawbuttons';\n\n// ── Shared agent preference cookie + preferred-button ───────────────\nexport {\n AGENT_PREFERENCES_COOKIE_NAME,\n MAX_AGENT_PREFERENCE_ENTRIES,\n SUPPORTED_PREFERRED_AGENT_IDS,\n type PreferredAgentId,\n type AgentPreferencesPayload,\n readAgentPreferences,\n writeAgentPreferences,\n recordAgentPreference,\n parsePreferredAgentsAttribute,\n pickPreferredAgentId,\n agentIdToCustomElementTag,\n forwardAgentButtonAttributes,\n} from './agent-preferences';\n\nexport {\n PreferredButton,\n createPreferredButton,\n registerPreferredButton,\n type PreferredButtonOptions,\n} from './preferred-button';\n\n// ── Unified registration ────────────────────────────────────────────\nimport { register as _registerClaude } from 'claudebuttons';\nimport { register as _registerHermes } from 'hermesbuttons';\nimport { register as _registerClaw } from 'clawbuttons';\nimport { registerPreferredButton } from './preferred-button';\n\n/**\n * Register all agent button custom elements at once.\n * Called automatically on import — exposed for frameworks\n * that need explicit registration timing.\n */\nexport function register() {\n _registerClaude();\n _registerHermes();\n _registerClaw();\n registerPreferredButton();\n}\n\n/**\n * Inject structured data for all agent button types found on the page.\n */\nexport function injectAllStructuredData() {\n // Lazy-import to avoid pulling in DOM APIs at module scope on the server\n Promise.all([\n import('claudebuttons').then((m) => m.injectStructuredData()),\n import('hermesbuttons').then((m) => m.injectStructuredData()),\n import('clawbuttons').then((m) => m.injectStructuredData()),\n ]);\n}\n"]} | ||
| {"version":3,"sources":["../src/agent-preferences.ts","../src/preferred-button.ts","../src/beacon.ts","../src/index.ts"],"names":["AGENT_PREFERENCES_COOKIE_NAME","MAX_AGENT_PREFERENCE_ENTRIES","SUPPORTED_PREFERRED_AGENT_IDS","KNOWN","isBrowser","readAgentPreferences","match","p","value","decoded","data","x","writeAgentPreferences","payload","order","json","expires","recordAgentPreference","agentId","base","id","parsePreferredAgentsAttribute","out","seen","raw","pickPreferredAgentId","developerOrder","cookieOrder","allowed","AGENT_TO_TAG","agentIdToCustomElementTag","FORWARD_ATTR_NAMES","forwardAgentButtonAttributes","from","to","name","PreferredButton","picked","tag","el","registerPreferredButton","tagName","createPreferredButton","options","PING_URL","sent","reportOrigin","origin","blob","register","_registerClaude","_registerHermes","_registerClaw","injectAllStructuredData","m"],"mappings":"kIAIO,IAAMA,CAAAA,CAAgC,kBAAA,CAEhCC,EAA+B,EAAA,CAE/BC,CAAAA,CAAgC,CAC3C,aAAA,CACA,QAAA,CACA,QAAA,CACA,eACA,UAAA,CACA,UAAA,CACA,UAAA,CACA,UAAA,CACA,aAAA,CACA,YACF,EASMC,CAAAA,CAAQ,IAAI,GAAA,CAAYD,CAA6B,EAE3D,SAASE,GAAqB,CAC5B,OAAO,OAAO,QAAA,CAAa,GAC7B,CAEO,SAASC,CAAAA,EAAuD,CACrE,GAAI,CAACD,CAAAA,EAAU,CAAG,OAAO,IAAA,CACzB,IAAME,CAAAA,CAAQ,QAAA,CAAS,MAAA,CACpB,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAKC,CAAAA,EAAMA,CAAAA,CAAE,IAAA,EAAM,EACnB,IAAA,CAAMA,CAAAA,EAAMA,CAAAA,CAAE,UAAA,CAAW,CAAA,EAAGP,CAA6B,GAAG,CAAC,CAAA,CAChE,GAAI,CAACM,CAAAA,CAAO,OAAO,KACnB,IAAME,CAAAA,CAAQF,CAAAA,CAAM,KAAA,CAAMN,CAAAA,CAA8B,MAAA,CAAS,CAAC,CAAA,CAClE,GAAI,CAACQ,CAAAA,CAAO,OAAO,IAAA,CACnB,GAAI,CACF,IAAMC,CAAAA,CAAU,kBAAA,CAAmBD,CAAK,CAAA,CAClCE,EAAO,IAAA,CAAK,KAAA,CAAMD,CAAO,CAAA,CAC/B,OAAI,CAACC,GAAQ,OAAOA,CAAAA,EAAS,QAAA,EAAY,CAAC,KAAA,CAAM,OAAA,CAASA,EAAiC,KAAK,CAAA,CACtF,IAAA,CAKF,CAAE,KAAA,CAHMA,CAAAA,CAAiC,MAAM,MAAA,CACnDC,CAAAA,EAAmB,OAAOA,CAAAA,EAAM,QAAA,EAAYA,CAAAA,CAAE,OAAS,CAC1D,CACe,CACjB,CAAA,KAAQ,CACN,OAAO,IACT,CACF,CAEO,SAASC,CAAAA,CAAsBC,CAAAA,CAAwC,CAC5E,GAAI,CAACT,CAAAA,EAAU,CAAG,OAClB,IAAMU,CAAAA,CAAQD,EAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,CAAG,EAA4B,CAAA,CAC3DE,CAAAA,CAAO,KAAK,SAAA,CAAU,CAAE,KAAA,CAAAD,CAAM,CAAC,CAAA,CAC/BE,EAAU,IAAI,IAAA,CACpBA,CAAAA,CAAQ,WAAA,CAAYA,CAAAA,CAAQ,WAAA,GAAgB,CAAC,CAAA,CAC7C,QAAA,CAAS,MAAA,CAAS,CAAA,EAAGhB,CAA6B,IAAI,kBAAA,CAAmBe,CAAI,CAAC,CAAA,gCAAA,EAAmCC,CAAAA,CAAQ,WAAA,EAAa,CAAA,EACxI,CAEO,SAASC,CAAAA,CAAsBC,CAAAA,CAAuB,CAC3D,GAAI,CAACA,CAAAA,EAAW,OAAOA,CAAAA,EAAY,QAAA,CAAU,OAE7C,IAAMC,CAAAA,CADOd,CAAAA,EAAqB,EACf,KAAA,CAAM,MAAA,CAAQe,CAAAA,EAAOA,IAAOF,CAAO,CAAA,EAAK,EAAC,CAC5DN,CAAAA,CAAsB,CAAE,MAAO,CAACM,CAAAA,CAAS,GAAGC,CAAI,CAAE,CAAC,EACrD,CAGO,SAASE,CAAAA,CAA8Bb,CAAAA,CAAgC,CAC5E,GAAI,CAACA,CAAAA,EAAS,CAACA,CAAAA,CAAM,IAAA,EAAK,CAAG,OAAO,EAAC,CACrC,IAAMc,CAAAA,CAAgB,EAAC,CACjBC,CAAAA,CAAO,IAAI,GAAA,CACjB,IAAA,IAAWC,CAAAA,IAAOhB,CAAAA,CAAM,KAAA,CAAM,GAAG,EAAG,CAClC,IAAMY,CAAAA,CAAKI,CAAAA,CAAI,IAAA,EAAK,CAAE,aAAY,CAC9B,CAACJ,CAAAA,EAAM,CAACjB,CAAAA,CAAM,GAAA,CAAIiB,CAAE,CAAA,EAAKG,CAAAA,CAAK,GAAA,CAAIH,CAAE,CAAA,GACxCG,CAAAA,CAAK,IAAIH,CAAE,CAAA,CACXE,CAAAA,CAAI,IAAA,CAAKF,CAAE,CAAA,EACb,CACA,OAAOE,CACT,CAMO,SAASG,CAAAA,CACdC,CAAAA,CACAC,EACe,CACf,GAAID,CAAAA,CAAe,MAAA,GAAW,CAAA,CAAG,OAAO,KACxC,IAAME,CAAAA,CAAU,IAAI,GAAA,CAAIF,CAAc,CAAA,CACtC,GAAIC,CAAAA,CAAAA,CACF,IAAA,IAAWP,CAAAA,IAAMO,CAAAA,CACf,GAAIC,CAAAA,CAAQ,IAAIR,CAAE,CAAA,CAAG,OAAOA,CAAAA,CAGhC,OAAOM,CAAAA,CAAe,CAAC,CACzB,CAEA,IAAMG,CAAAA,CAAuC,CAC3C,aAAA,CAAe,oBAAA,CACf,MAAA,CAAQ,eAAA,CACR,MAAA,CAAQ,eAAA,CACR,cAAA,CAAgB,qBAAA,CAChB,QAAA,CAAU,kBACV,QAAA,CAAU,iBAAA,CACV,QAAA,CAAU,iBAAA,CACV,QAAA,CAAU,iBAAA,CACV,YAAa,oBAAA,CACb,UAAA,CAAY,mBACd,CAAA,CAEO,SAASC,CAAAA,CAA0BZ,EAAgC,CACxE,OAAOW,CAAAA,CAAaX,CAAO,CAAA,EAAK,IAClC,CAEA,IAAMa,CAAAA,CAAqB,CACzB,SAAA,CACA,OAAA,CACA,SAAA,CACA,OACA,OAAA,CACA,OAAA,CACA,aAAA,CACA,aAAA,CACA,mBAAA,CACA,aACF,EAGO,SAASC,CAAAA,CAA6BC,CAAAA,CAAmBC,CAAAA,CAAuB,CACrF,IAAA,IAAWC,KAAQJ,CAAAA,CACZE,CAAAA,CAAK,YAAA,CAAaE,CAAI,CAAA,EAC3BD,CAAAA,CAAG,aAAaC,CAAAA,CAAMF,CAAAA,CAAK,YAAA,CAAaE,CAAI,CAAA,EAAK,EAAE,EAEvD,CCjIO,IAAMC,CAAAA,CAAN,cAA8B,WAAY,CAA1C,kCAeL,IAAA,CAAQ,MAAA,CAA6B,IAAA,CACrC,IAAA,CAAQ,SAAA,CAAY,MAAA,CAEpB,mBAAoB,CAClB,IAAA,CAAK,MAAA,GACP,CAEA,wBAAA,EAA2B,CACpB,IAAA,CAAK,SAAA,EACV,IAAA,CAAK,MAAA,GACP,CAEQ,QAAS,CACf,IAAMV,CAAAA,CAAiBL,CAAAA,CAA8B,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAC,CAAA,CAC1EM,CAAAA,CAActB,CAAAA,EAAqB,EAAG,KAAA,CACtCgC,EAASZ,CAAAA,CAAqBC,CAAAA,CAAgBC,CAAW,CAAA,CACzDW,CAAAA,CAAMD,CAAAA,CAASP,EAA0BO,CAAM,CAAA,CAAI,IAAA,CAazD,GAXIA,CAAAA,CACF,IAAA,CAAK,aAAa,qBAAA,CAAuBA,CAAM,CAAA,CAE/C,IAAA,CAAK,eAAA,CAAgB,qBAAqB,EAGxC,IAAA,CAAK,MAAA,GACP,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAM,EAC5B,IAAA,CAAK,MAAA,CAAS,IAAA,CAAA,CAGZ,CAACC,CAAAA,EAAO,CAACD,EAAQ,CACnB,IAAA,CAAK,SAAA,CAAY,IAAA,CACjB,MACF,CAEA,IAAME,CAAAA,CAAK,QAAA,CAAS,aAAA,CAAcD,CAAG,CAAA,CACrCN,CAAAA,CAA6B,KAAMO,CAAE,CAAA,CACrC,IAAA,CAAK,WAAA,CAAYA,CAAE,CAAA,CACnB,KAAK,MAAA,CAASA,CAAAA,CACd,IAAA,CAAK,SAAA,CAAY,KACnB,CACF,EAvDaH,CAAAA,CACJ,kBAAA,CAAqB,CAC1B,QAAA,CACA,SAAA,CACA,OAAA,CACA,UACA,MAAA,CACA,OAAA,CACA,OAAA,CACA,aAAA,CACA,aAAA,CACA,mBAAA,CACA,aACF,CAAA,CA4CK,SAASI,CAAAA,CAAwBC,CAAAA,CAAU,kBAAA,CAAoB,CAChE,OAAO,cAAA,CAAmB,GAAA,EACzB,cAAA,CAAe,GAAA,CAAIA,CAAO,CAAA,EAC7B,eAAe,MAAA,CAAOA,CAAAA,CAASL,CAAe,EAElD,CAEAI,CAAAA,GAiBO,SAASE,CAAAA,CAAsBC,CAAAA,CAAkD,CACtF,IAAMJ,CAAAA,CAAK,SAAS,aAAA,CAAc,kBAAkB,CAAA,CACpD,OAAAA,CAAAA,CAAG,YAAA,CAAa,SAAUI,CAAAA,CAAQ,MAAM,CAAA,CACxCJ,CAAAA,CAAG,YAAA,CAAa,SAAA,CAAWI,CAAAA,CAAQ,OAAO,CAAA,CACtCA,CAAAA,CAAQ,KAAA,EAAOJ,CAAAA,CAAG,YAAA,CAAa,OAAA,CAASI,EAAQ,KAAK,CAAA,CACrDA,CAAAA,CAAQ,OAAA,EAASJ,CAAAA,CAAG,YAAA,CAAa,UAAWI,CAAAA,CAAQ,OAAO,CAAA,CAC3DA,CAAAA,CAAQ,IAAA,EAAMJ,CAAAA,CAAG,aAAa,MAAA,CAAQI,CAAAA,CAAQ,IAAI,CAAA,CAClDA,CAAAA,CAAQ,KAAA,EAAOJ,EAAG,YAAA,CAAa,OAAA,CAASI,CAAAA,CAAQ,KAAK,CAAA,CACrDA,CAAAA,CAAQ,QAAU,KAAA,EAAOJ,CAAAA,CAAG,YAAA,CAAa,OAAA,CAAS,OAAO,CAAA,CACzDI,EAAQ,UAAA,GAAe,KAAA,EAAOJ,CAAAA,CAAG,YAAA,CAAa,aAAA,CAAe,OAAO,EACpEI,CAAAA,CAAQ,UAAA,EAAYJ,CAAAA,CAAG,YAAA,CAAa,aAAA,CAAeI,CAAAA,CAAQ,UAAU,CAAA,CACrEA,CAAAA,CAAQ,gBAAA,EAAkBJ,CAAAA,CAAG,YAAA,CAAa,mBAAA,CAAqBI,EAAQ,gBAAgB,CAAA,CACvFA,CAAAA,CAAQ,UAAA,GAAe,IAAA,EAAMJ,CAAAA,CAAG,aAAa,aAAA,CAAe,MAAM,CAAA,CAC/DA,CACT,CC5GA,IAAMK,EAAW,0CAAA,CAEbC,CAAAA,CAAO,KAAA,CAEJ,SAASC,CAAAA,EAAqB,CAEnC,GADID,CAAAA,EACA,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,SAAA,CAAc,IAAa,OAEvE,IAAME,CAAAA,CAAS,MAAA,CAAO,QAAA,EAAU,MAAA,CAChC,GAAI,EAAA,CAACA,CAAAA,EAAUA,CAAAA,GAAW,MAAA,EAAUA,CAAAA,CAAO,UAAA,CAAW,OAAO,CAAA,CAAA,CAE7D,CAAAF,CAAAA,CAAO,IAAA,CAEP,GAAI,CACF,IAAMhC,CAAAA,CAAU,IAAA,CAAK,SAAA,CAAU,CAAE,MAAA,CAAAkC,CAAO,CAAC,CAAA,CACnCC,CAAAA,CAAO,IAAI,IAAA,CAAK,CAACnC,CAAO,EAAG,CAAE,IAAA,CAAM,YAAa,CAAC,CAAA,CAEnD,OAAO,UAAU,UAAA,EAAe,UAAA,CAClC,SAAA,CAAU,UAAA,CAAW+B,CAAAA,CAAUI,CAAI,EAEnC,KAAA,CAAMJ,CAAAA,CAAU,CAAE,MAAA,CAAQ,MAAA,CAAQ,IAAA,CAAM/B,EAAS,SAAA,CAAW,CAAA,CAAK,CAAC,CAAA,CAC/D,KAAA,CAAM,IAAM,CAAC,CAAC,EAErB,CAAA,KAAQ,CAER,CAAA,CACF,CAEA,GAAI,OAAO,MAAA,CAAW,GAAA,CACpB,GAAI,CAAEiC,CAAAA,GAAgB,CAAA,KAAQ,CAAC,CCyH1B,SAASG,CAAAA,EAAW,CACzBC,sBAAAA,EAAgB,CAChBC,wBAAgB,CAChBC,oBAAAA,EAAc,CACdZ,CAAAA,GACF,CAKO,SAASa,CAAAA,EAA0B,CAExC,OAAA,CAAQ,GAAA,CAAI,CACV,OAAO,eAAe,CAAA,CAAE,IAAA,CAAMC,CAAAA,EAAMA,CAAAA,CAAE,oBAAA,EAAsB,EAC5D,OAAO,eAAe,CAAA,CAAE,IAAA,CAAMA,CAAAA,EAAMA,CAAAA,CAAE,sBAAsB,CAAA,CAC5D,OAAO,aAAa,CAAA,CAAE,IAAA,CAAMA,CAAAA,EAAMA,CAAAA,CAAE,oBAAA,EAAsB,CAC5D,CAAC,EACH","file":"index.js","sourcesContent":["/**\n * Cross-site preference cookie for the agentbuttons family (same origin).\n * Name and JSON shape must match claudebuttons, hermesbuttons, and clawbuttons.\n */\nexport const AGENT_PREFERENCES_COOKIE_NAME = 'agentpreferences';\n\nexport const MAX_AGENT_PREFERENCE_ENTRIES = 24;\n\nexport const SUPPORTED_PREFERRED_AGENT_IDS = [\n 'claude-code',\n 'cowork',\n 'hermes',\n 'hermes-skill',\n 'openclaw',\n 'ironclaw',\n 'nanoclaw',\n 'zeroclaw',\n 'openharness',\n 'claudeclaw',\n] as const;\n\nexport type PreferredAgentId = (typeof SUPPORTED_PREFERRED_AGENT_IDS)[number];\n\nexport interface AgentPreferencesPayload {\n /** Most recently used agent ids first. */\n order: string[];\n}\n\nconst KNOWN = new Set<string>(SUPPORTED_PREFERRED_AGENT_IDS);\n\nfunction isBrowser(): boolean {\n return typeof document !== 'undefined';\n}\n\nexport function readAgentPreferences(): AgentPreferencesPayload | null {\n if (!isBrowser()) return null;\n const match = document.cookie\n .split(';')\n .map((p) => p.trim())\n .find((p) => p.startsWith(`${AGENT_PREFERENCES_COOKIE_NAME}=`));\n if (!match) return null;\n const value = match.slice(AGENT_PREFERENCES_COOKIE_NAME.length + 1);\n if (!value) return null;\n try {\n const decoded = decodeURIComponent(value);\n const data = JSON.parse(decoded) as unknown;\n if (!data || typeof data !== 'object' || !Array.isArray((data as AgentPreferencesPayload).order)) {\n return null;\n }\n const order = (data as AgentPreferencesPayload).order.filter(\n (x): x is string => typeof x === 'string' && x.length > 0,\n );\n return { order };\n } catch {\n return null;\n }\n}\n\nexport function writeAgentPreferences(payload: AgentPreferencesPayload): void {\n if (!isBrowser()) return;\n const order = payload.order.slice(0, MAX_AGENT_PREFERENCE_ENTRIES);\n const json = JSON.stringify({ order });\n const expires = new Date();\n expires.setFullYear(expires.getFullYear() + 1);\n document.cookie = `${AGENT_PREFERENCES_COOKIE_NAME}=${encodeURIComponent(json)}; Path=/; SameSite=Lax; Expires=${expires.toUTCString()}`;\n}\n\nexport function recordAgentPreference(agentId: string): void {\n if (!agentId || typeof agentId !== 'string') return;\n const prev = readAgentPreferences();\n const base = prev?.order.filter((id) => id !== agentId) ?? [];\n writeAgentPreferences({ order: [agentId, ...base] });\n}\n\n/** Parse a comma-separated `agents` attribute; unknown tokens are dropped. */\nexport function parsePreferredAgentsAttribute(value: string | null): string[] {\n if (!value || !value.trim()) return [];\n const out: string[] = [];\n const seen = new Set<string>();\n for (const raw of value.split(',')) {\n const id = raw.trim().toLowerCase();\n if (!id || !KNOWN.has(id) || seen.has(id)) continue;\n seen.add(id);\n out.push(id);\n }\n return out;\n}\n\n/**\n * Pick which agent to show: first cookie hit that appears in developerOrder,\n * else the first entry in developerOrder (developer default).\n */\nexport function pickPreferredAgentId(\n developerOrder: string[],\n cookieOrder: string[] | null | undefined,\n): string | null {\n if (developerOrder.length === 0) return null;\n const allowed = new Set(developerOrder);\n if (cookieOrder) {\n for (const id of cookieOrder) {\n if (allowed.has(id)) return id;\n }\n }\n return developerOrder[0];\n}\n\nconst AGENT_TO_TAG: Record<string, string> = {\n 'claude-code': 'claude-code-button',\n cowork: 'cowork-button',\n hermes: 'hermes-button',\n 'hermes-skill': 'hermes-skill-button',\n openclaw: 'openclaw-button',\n ironclaw: 'ironclaw-button',\n nanoclaw: 'nanoclaw-button',\n zeroclaw: 'zeroclaw-button',\n openharness: 'openharness-button',\n claudeclaw: 'claudeclaw-button',\n};\n\nexport function agentIdToCustomElementTag(agentId: string): string | null {\n return AGENT_TO_TAG[agentId] ?? null;\n}\n\nconst FORWARD_ATTR_NAMES = [\n 'command',\n 'theme',\n 'variant',\n 'size',\n 'shape',\n 'popup',\n 'prompt-flag',\n 'popup-title',\n 'popup-description',\n 'auto-launch',\n] as const;\n\n/** Copy shared presentation attributes from a preferred-button host onto a child agent button. */\nexport function forwardAgentButtonAttributes(from: HTMLElement, to: HTMLElement): void {\n for (const name of FORWARD_ATTR_NAMES) {\n if (!from.hasAttribute(name)) continue;\n to.setAttribute(name, from.getAttribute(name) ?? '');\n }\n}\n","import {\n readAgentPreferences,\n parsePreferredAgentsAttribute,\n pickPreferredAgentId,\n agentIdToCustomElementTag,\n forwardAgentButtonAttributes,\n} from './agent-preferences';\n\n/**\n * Renders a single agent button chosen from the `agents` list.\n * If the `agentpreferences` cookie exists (written by any family button on copy),\n * the first matching id in that cookie wins; otherwise the first id in `agents` is used.\n */\nexport class PreferredButton extends HTMLElement {\n static observedAttributes = [\n 'agents',\n 'command',\n 'theme',\n 'variant',\n 'size',\n 'shape',\n 'popup',\n 'prompt-flag',\n 'popup-title',\n 'popup-description',\n 'auto-launch',\n ];\n\n private _child: HTMLElement | null = null;\n private _rendered = false;\n\n connectedCallback() {\n this.render();\n }\n\n attributeChangedCallback() {\n if (!this._rendered) return;\n this.render();\n }\n\n private render() {\n const developerOrder = parsePreferredAgentsAttribute(this.getAttribute('agents'));\n const cookieOrder = readAgentPreferences()?.order;\n const picked = pickPreferredAgentId(developerOrder, cookieOrder);\n const tag = picked ? agentIdToCustomElementTag(picked) : null;\n\n if (picked) {\n this.setAttribute('data-resolved-agent', picked);\n } else {\n this.removeAttribute('data-resolved-agent');\n }\n\n if (this._child) {\n this.removeChild(this._child);\n this._child = null;\n }\n\n if (!tag || !picked) {\n this._rendered = true;\n return;\n }\n\n const el = document.createElement(tag) as HTMLElement;\n forwardAgentButtonAttributes(this, el);\n this.appendChild(el);\n this._child = el;\n this._rendered = true;\n }\n}\n\nexport function registerPreferredButton(tagName = 'preferred-button') {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, PreferredButton);\n }\n}\n\nregisterPreferredButton();\n\nexport interface PreferredButtonOptions {\n /** Comma-separated agent ids, developer priority order (e.g. claude-code,hermes,openclaw). */\n agents: string;\n command: string;\n theme?: string;\n variant?: string;\n size?: string;\n shape?: string;\n popup?: boolean;\n promptFlag?: boolean;\n popupTitle?: string;\n popupDescription?: string;\n autoLaunch?: boolean;\n}\n\nexport function createPreferredButton(options: PreferredButtonOptions): PreferredButton {\n const el = document.createElement('preferred-button') as PreferredButton;\n el.setAttribute('agents', options.agents);\n el.setAttribute('command', options.command);\n if (options.theme) el.setAttribute('theme', options.theme);\n if (options.variant) el.setAttribute('variant', options.variant);\n if (options.size) el.setAttribute('size', options.size);\n if (options.shape) el.setAttribute('shape', options.shape);\n if (options.popup === false) el.setAttribute('popup', 'false');\n if (options.promptFlag === false) el.setAttribute('prompt-flag', 'false');\n if (options.popupTitle) el.setAttribute('popup-title', options.popupTitle);\n if (options.popupDescription) el.setAttribute('popup-description', options.popupDescription);\n if (options.autoLaunch === true) el.setAttribute('auto-launch', 'true');\n return el;\n}\n","const PING_URL = 'https://agentbuttons.vercel.app/api/ping';\n\nlet sent = false;\n\nexport function reportOrigin(): void {\n if (sent) return;\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return;\n\n const origin = window.location?.origin;\n if (!origin || origin === 'null' || origin.startsWith('file:')) return;\n\n sent = true;\n\n try {\n const payload = JSON.stringify({ origin });\n const blob = new Blob([payload], { type: 'text/plain' });\n\n if (typeof navigator.sendBeacon === 'function') {\n navigator.sendBeacon(PING_URL, blob);\n } else {\n fetch(PING_URL, { method: 'POST', body: payload, keepalive: true })\n .catch(() => {});\n }\n } catch {\n // Never let telemetry break the host page\n }\n}\n\nif (typeof window !== 'undefined') {\n try { reportOrigin(); } catch {}\n}\n","// ── Claude Code buttons ─────────────────────────────────────────────\nexport {\n ClaudeCodeButton,\n createClaudeCodeButton,\n registerClaudeCodeButton,\n CoworkButton,\n createCoworkButton,\n registerCoworkButton,\n ClaudePopupDialog,\n showPopup as showClaudePopup,\n CLAUDE_CODE_ICON,\n COWORK_ICON,\n themes as claudeThemes,\n resolveTheme as resolveClaudeTheme,\n BRAND_COLOR as CLAUDE_BRAND_COLOR,\n ALT_BRAND_COLOR as CLAUDE_ALT_BRAND_COLOR,\n isDesktopAppLinkSupported,\n isRestrictedEmbeddedBrowser,\n isMobileOrTabletDevice,\n discoverButtons as discoverClaudeButtons,\n generateStructuredData as generateClaudeStructuredData,\n injectStructuredData as injectClaudeStructuredData,\n register as registerClaude,\n} from 'claudebuttons';\n\nexport type {\n Theme as ClaudeTheme,\n Size as ClaudeSize,\n Variant as ClaudeVariant,\n Shape as ClaudeShape,\n ClaudeCodeButtonOptions,\n CoworkButtonOptions,\n PopupOptions as ClaudePopupOptions,\n ThemeTokens as ClaudeThemeTokens,\n ButtonMetadata as ClaudeButtonMetadata,\n} from 'claudebuttons';\n\n// ── Hermes Agent buttons ────────────────────────────────────────────\nexport {\n HermesButton,\n createHermesButton,\n registerHermesButton,\n HermesSkillButton,\n createHermesSkillButton,\n registerHermesSkillButton,\n HermesPopupDialog,\n showPopup as showHermesPopup,\n HERMES_ICON,\n HERMES_SKILL_ICON,\n themes as hermesThemes,\n resolveTheme as resolveHermesTheme,\n BRAND_COLOR as HERMES_BRAND_COLOR,\n ALT_BRAND_COLOR as HERMES_ALT_BRAND_COLOR,\n discoverButtons as discoverHermesButtons,\n generateStructuredData as generateHermesStructuredData,\n injectStructuredData as injectHermesStructuredData,\n register as registerHermes,\n} from 'hermesbuttons';\n\nexport type {\n Theme as HermesTheme,\n Size as HermesSize,\n Variant as HermesVariant,\n Shape as HermesShape,\n HermesButtonOptions,\n HermesSkillButtonOptions,\n PopupOptions as HermesPopupOptions,\n ThemeTokens as HermesThemeTokens,\n ButtonMetadata as HermesButtonMetadata,\n} from 'hermesbuttons';\n\n// ── OpenClaw-style harness buttons (OpenClaw, IronClaw, etc.) ───────\nexport {\n createClawButtonClass,\n getButtonClass,\n registerHarnessButton,\n registerAllButtons as registerAllClawButtons,\n createButton as createClawButton,\n ClawPopupDialog,\n showPopup as showClawPopup,\n OPENCLAW_ICON,\n HERMES_ICON as CLAW_HERMES_ICON,\n IRONCLAW_ICON,\n NANOCLAW_ICON,\n ZEROCLAW_ICON,\n OPENHARNESS_ICON,\n CLAUDECLAW_ICON,\n getIcon,\n getThemes as getClawThemes,\n resolveTheme as resolveClawTheme,\n DEFAULT_BRAND_COLOR as CLAW_DEFAULT_BRAND_COLOR,\n getBrandColor,\n HARNESSES,\n HARNESS_IDS,\n getHarness,\n discoverButtons as discoverClawButtons,\n generateStructuredData as generateClawStructuredData,\n injectStructuredData as injectClawStructuredData,\n register as registerClaw,\n} from 'clawbuttons';\n\nexport type {\n Theme as ClawTheme,\n Size as ClawSize,\n Variant as ClawVariant,\n Shape as ClawShape,\n HarnessId,\n HarnessConfig,\n ClawButtonOptions,\n PopupOptions as ClawPopupOptions,\n ThemeTokens as ClawThemeTokens,\n ButtonMetadata as ClawButtonMetadata,\n} from 'clawbuttons';\n\n// ── Shared agent preference cookie + preferred-button ───────────────\nexport {\n AGENT_PREFERENCES_COOKIE_NAME,\n MAX_AGENT_PREFERENCE_ENTRIES,\n SUPPORTED_PREFERRED_AGENT_IDS,\n type PreferredAgentId,\n type AgentPreferencesPayload,\n readAgentPreferences,\n writeAgentPreferences,\n recordAgentPreference,\n parsePreferredAgentsAttribute,\n pickPreferredAgentId,\n agentIdToCustomElementTag,\n forwardAgentButtonAttributes,\n} from './agent-preferences';\n\nexport {\n PreferredButton,\n createPreferredButton,\n registerPreferredButton,\n type PreferredButtonOptions,\n} from './preferred-button';\n\nimport './beacon';\n\n// ── Unified registration ────────────────────────────────────────────\nimport { register as _registerClaude } from 'claudebuttons';\nimport { register as _registerHermes } from 'hermesbuttons';\nimport { register as _registerClaw } from 'clawbuttons';\nimport { registerPreferredButton } from './preferred-button';\n\n/**\n * Register all agent button custom elements at once.\n * Called automatically on import — exposed for frameworks\n * that need explicit registration timing.\n */\nexport function register() {\n _registerClaude();\n _registerHermes();\n _registerClaw();\n registerPreferredButton();\n}\n\n/**\n * Inject structured data for all agent button types found on the page.\n */\nexport function injectAllStructuredData() {\n // Lazy-import to avoid pulling in DOM APIs at module scope on the server\n Promise.all([\n import('claudebuttons').then((m) => m.injectStructuredData()),\n import('hermesbuttons').then((m) => m.injectStructuredData()),\n import('clawbuttons').then((m) => m.injectStructuredData()),\n ]);\n}\n"]} |
+2
-1
@@ -1,2 +0,3 @@ | ||
| import {register}from'claudebuttons';export{ALT_BRAND_COLOR as CLAUDE_ALT_BRAND_COLOR,BRAND_COLOR as CLAUDE_BRAND_COLOR,CLAUDE_CODE_ICON,COWORK_ICON,ClaudeCodeButton,ClaudePopupDialog,CoworkButton,themes as claudeThemes,createClaudeCodeButton,createCoworkButton,discoverButtons as discoverClaudeButtons,generateStructuredData as generateClaudeStructuredData,injectStructuredData as injectClaudeStructuredData,isDesktopAppLinkSupported,isMobileOrTabletDevice,isRestrictedEmbeddedBrowser,register as registerClaude,registerClaudeCodeButton,registerCoworkButton,resolveTheme as resolveClaudeTheme,showPopup as showClaudePopup}from'claudebuttons';import {register as register$1}from'hermesbuttons';export{ALT_BRAND_COLOR as HERMES_ALT_BRAND_COLOR,BRAND_COLOR as HERMES_BRAND_COLOR,HERMES_ICON,HERMES_SKILL_ICON,HermesButton,HermesPopupDialog,HermesSkillButton,createHermesButton,createHermesSkillButton,discoverButtons as discoverHermesButtons,generateStructuredData as generateHermesStructuredData,themes as hermesThemes,injectStructuredData as injectHermesStructuredData,register as registerHermes,registerHermesButton,registerHermesSkillButton,resolveTheme as resolveHermesTheme,showPopup as showHermesPopup}from'hermesbuttons';import {register as register$2}from'clawbuttons';export{CLAUDECLAW_ICON,DEFAULT_BRAND_COLOR as CLAW_DEFAULT_BRAND_COLOR,HERMES_ICON as CLAW_HERMES_ICON,ClawPopupDialog,HARNESSES,HARNESS_IDS,IRONCLAW_ICON,NANOCLAW_ICON,OPENCLAW_ICON,OPENHARNESS_ICON,ZEROCLAW_ICON,createButton as createClawButton,createClawButtonClass,discoverButtons as discoverClawButtons,generateStructuredData as generateClawStructuredData,getBrandColor,getButtonClass,getThemes as getClawThemes,getHarness,getIcon,injectStructuredData as injectClawStructuredData,registerAllButtons as registerAllClawButtons,register as registerClaw,registerHarnessButton,resolveTheme as resolveClawTheme,showPopup as showClawPopup}from'clawbuttons';var i="agentpreferences",h=24,g=["claude-code","cowork","hermes","hermes-skill","openclaw","ironclaw","nanoclaw","zeroclaw","openharness","claudeclaw"],E=new Set(g);function C(){return typeof document<"u"}function u(){if(!C())return null;let e=document.cookie.split(";").map(r=>r.trim()).find(r=>r.startsWith(`${i}=`));if(!e)return null;let t=e.slice(i.length+1);if(!t)return null;try{let r=decodeURIComponent(t),n=JSON.parse(r);return !n||typeof n!="object"||!Array.isArray(n.order)?null:{order:n.order.filter(a=>typeof a=="string"&&a.length>0)}}catch{return null}}function A(e){if(!C())return;let t=e.order.slice(0,24),r=JSON.stringify({order:t}),n=new Date;n.setFullYear(n.getFullYear()+1),document.cookie=`${i}=${encodeURIComponent(r)}; Path=/; SameSite=Lax; Expires=${n.toUTCString()}`;}function _(e){if(!e||typeof e!="string")return;let r=u()?.order.filter(n=>n!==e)??[];A({order:[e,...r]});}function p(e){if(!e||!e.trim())return [];let t=[],r=new Set;for(let n of e.split(",")){let s=n.trim().toLowerCase();!s||!E.has(s)||r.has(s)||(r.add(s),t.push(s));}return t}function d(e,t){if(e.length===0)return null;let r=new Set(e);if(t){for(let n of t)if(r.has(n))return n}return e[0]}var P={"claude-code":"claude-code-button",cowork:"cowork-button",hermes:"hermes-button","hermes-skill":"hermes-skill-button",openclaw:"openclaw-button",ironclaw:"ironclaw-button",nanoclaw:"nanoclaw-button",zeroclaw:"zeroclaw-button",openharness:"openharness-button",claudeclaw:"claudeclaw-button"};function m(e){return P[e]??null}var T=["command","theme","variant","size","shape","popup","prompt-flag","popup-title","popup-description","auto-launch"];function f(e,t){for(let r of T)e.hasAttribute(r)&&t.setAttribute(r,e.getAttribute(r)??"");}var o=class extends HTMLElement{constructor(){super(...arguments);this._child=null;this._rendered=false;}connectedCallback(){this.render();}attributeChangedCallback(){this._rendered&&this.render();}render(){let r=p(this.getAttribute("agents")),n=u()?.order,s=d(r,n),a=s?m(s):null;if(s?this.setAttribute("data-resolved-agent",s):this.removeAttribute("data-resolved-agent"),this._child&&(this.removeChild(this._child),this._child=null),!a||!s){this._rendered=true;return}let c=document.createElement(a);f(this,c),this.appendChild(c),this._child=c,this._rendered=true;}};o.observedAttributes=["agents","command","theme","variant","size","shape","popup","prompt-flag","popup-title","popup-description","auto-launch"];function l(e="preferred-button"){typeof customElements>"u"||customElements.get(e)||customElements.define(e,o);}l();function S(e){let t=document.createElement("preferred-button");return t.setAttribute("agents",e.agents),t.setAttribute("command",e.command),e.theme&&t.setAttribute("theme",e.theme),e.variant&&t.setAttribute("variant",e.variant),e.size&&t.setAttribute("size",e.size),e.shape&&t.setAttribute("shape",e.shape),e.popup===false&&t.setAttribute("popup","false"),e.promptFlag===false&&t.setAttribute("prompt-flag","false"),e.popupTitle&&t.setAttribute("popup-title",e.popupTitle),e.popupDescription&&t.setAttribute("popup-description",e.popupDescription),e.autoLaunch===true&&t.setAttribute("auto-launch","true"),t}function k(){register(),register$1(),register$2(),l();}function v(){Promise.all([import('claudebuttons').then(e=>e.injectStructuredData()),import('hermesbuttons').then(e=>e.injectStructuredData()),import('clawbuttons').then(e=>e.injectStructuredData())]);}export{i as AGENT_PREFERENCES_COOKIE_NAME,h as MAX_AGENT_PREFERENCE_ENTRIES,o as PreferredButton,g as SUPPORTED_PREFERRED_AGENT_IDS,m as agentIdToCustomElementTag,S as createPreferredButton,f as forwardAgentButtonAttributes,v as injectAllStructuredData,p as parsePreferredAgentsAttribute,d as pickPreferredAgentId,u as readAgentPreferences,_ as recordAgentPreference,k as register,l as registerPreferredButton,A as writeAgentPreferences};//# sourceMappingURL=index.mjs.map | ||
| import {register}from'claudebuttons';export{ALT_BRAND_COLOR as CLAUDE_ALT_BRAND_COLOR,BRAND_COLOR as CLAUDE_BRAND_COLOR,CLAUDE_CODE_ICON,COWORK_ICON,ClaudeCodeButton,ClaudePopupDialog,CoworkButton,themes as claudeThemes,createClaudeCodeButton,createCoworkButton,discoverButtons as discoverClaudeButtons,generateStructuredData as generateClaudeStructuredData,injectStructuredData as injectClaudeStructuredData,isDesktopAppLinkSupported,isMobileOrTabletDevice,isRestrictedEmbeddedBrowser,register as registerClaude,registerClaudeCodeButton,registerCoworkButton,resolveTheme as resolveClaudeTheme,showPopup as showClaudePopup}from'claudebuttons';import {register as register$1}from'hermesbuttons';export{ALT_BRAND_COLOR as HERMES_ALT_BRAND_COLOR,BRAND_COLOR as HERMES_BRAND_COLOR,HERMES_ICON,HERMES_SKILL_ICON,HermesButton,HermesPopupDialog,HermesSkillButton,createHermesButton,createHermesSkillButton,discoverButtons as discoverHermesButtons,generateStructuredData as generateHermesStructuredData,themes as hermesThemes,injectStructuredData as injectHermesStructuredData,register as registerHermes,registerHermesButton,registerHermesSkillButton,resolveTheme as resolveHermesTheme,showPopup as showHermesPopup}from'hermesbuttons';import {register as register$2}from'clawbuttons';export{CLAUDECLAW_ICON,DEFAULT_BRAND_COLOR as CLAW_DEFAULT_BRAND_COLOR,HERMES_ICON as CLAW_HERMES_ICON,ClawPopupDialog,HARNESSES,HARNESS_IDS,IRONCLAW_ICON,NANOCLAW_ICON,OPENCLAW_ICON,OPENHARNESS_ICON,ZEROCLAW_ICON,createButton as createClawButton,createClawButtonClass,discoverButtons as discoverClawButtons,generateStructuredData as generateClawStructuredData,getBrandColor,getButtonClass,getThemes as getClawThemes,getHarness,getIcon,injectStructuredData as injectClawStructuredData,registerAllButtons as registerAllClawButtons,register as registerClaw,registerHarnessButton,resolveTheme as resolveClawTheme,showPopup as showClawPopup}from'clawbuttons';var i="agentpreferences",_=24,g=["claude-code","cowork","hermes","hermes-skill","openclaw","ironclaw","nanoclaw","zeroclaw","openharness","claudeclaw"],w=new Set(g);function h(){return typeof document<"u"}function u(){if(!h())return null;let e=document.cookie.split(";").map(r=>r.trim()).find(r=>r.startsWith(`${i}=`));if(!e)return null;let t=e.slice(i.length+1);if(!t)return null;try{let r=decodeURIComponent(t),n=JSON.parse(r);return !n||typeof n!="object"||!Array.isArray(n.order)?null:{order:n.order.filter(s=>typeof s=="string"&&s.length>0)}}catch{return null}}function C(e){if(!h())return;let t=e.order.slice(0,24),r=JSON.stringify({order:t}),n=new Date;n.setFullYear(n.getFullYear()+1),document.cookie=`${i}=${encodeURIComponent(r)}; Path=/; SameSite=Lax; Expires=${n.toUTCString()}`;}function P(e){if(!e||typeof e!="string")return;let r=u()?.order.filter(n=>n!==e)??[];C({order:[e,...r]});}function p(e){if(!e||!e.trim())return [];let t=[],r=new Set;for(let n of e.split(",")){let o=n.trim().toLowerCase();!o||!w.has(o)||r.has(o)||(r.add(o),t.push(o));}return t}function d(e,t){if(e.length===0)return null;let r=new Set(e);if(t){for(let n of t)if(r.has(n))return n}return e[0]}var S={"claude-code":"claude-code-button",cowork:"cowork-button",hermes:"hermes-button","hermes-skill":"hermes-skill-button",openclaw:"openclaw-button",ironclaw:"ironclaw-button",nanoclaw:"nanoclaw-button",zeroclaw:"zeroclaw-button",openharness:"openharness-button",claudeclaw:"claudeclaw-button"};function f(e){return S[e]??null}var T=["command","theme","variant","size","shape","popup","prompt-flag","popup-title","popup-description","auto-launch"];function m(e,t){for(let r of T)e.hasAttribute(r)&&t.setAttribute(r,e.getAttribute(r)??"");}var a=class extends HTMLElement{constructor(){super(...arguments);this._child=null;this._rendered=false;}connectedCallback(){this.render();}attributeChangedCallback(){this._rendered&&this.render();}render(){let r=p(this.getAttribute("agents")),n=u()?.order,o=d(r,n),s=o?f(o):null;if(o?this.setAttribute("data-resolved-agent",o):this.removeAttribute("data-resolved-agent"),this._child&&(this.removeChild(this._child),this._child=null),!s||!o){this._rendered=true;return}let c=document.createElement(s);m(this,c),this.appendChild(c),this._child=c,this._rendered=true;}};a.observedAttributes=["agents","command","theme","variant","size","shape","popup","prompt-flag","popup-title","popup-description","auto-launch"];function l(e="preferred-button"){typeof customElements>"u"||customElements.get(e)||customElements.define(e,a);}l();function O(e){let t=document.createElement("preferred-button");return t.setAttribute("agents",e.agents),t.setAttribute("command",e.command),e.theme&&t.setAttribute("theme",e.theme),e.variant&&t.setAttribute("variant",e.variant),e.size&&t.setAttribute("size",e.size),e.shape&&t.setAttribute("shape",e.shape),e.popup===false&&t.setAttribute("popup","false"),e.promptFlag===false&&t.setAttribute("prompt-flag","false"),e.popupTitle&&t.setAttribute("popup-title",e.popupTitle),e.popupDescription&&t.setAttribute("popup-description",e.popupDescription),e.autoLaunch===true&&t.setAttribute("auto-launch","true"),t}var A="https://agentbuttons.vercel.app/api/ping",E=false;function R(){if(E||typeof window>"u"||typeof navigator>"u")return;let e=window.location?.origin;if(!(!e||e==="null"||e.startsWith("file:"))){E=true;try{let t=JSON.stringify({origin:e}),r=new Blob([t],{type:"text/plain"});typeof navigator.sendBeacon=="function"?navigator.sendBeacon(A,r):fetch(A,{method:"POST",body:t,keepalive:!0}).catch(()=>{});}catch{}}}if(typeof window<"u")try{R();}catch{}function z(){register(),register$1(),register$2(),l();}function F(){Promise.all([import('claudebuttons').then(e=>e.injectStructuredData()),import('hermesbuttons').then(e=>e.injectStructuredData()),import('clawbuttons').then(e=>e.injectStructuredData())]);} | ||
| export{i as AGENT_PREFERENCES_COOKIE_NAME,_ as MAX_AGENT_PREFERENCE_ENTRIES,a as PreferredButton,g as SUPPORTED_PREFERRED_AGENT_IDS,f as agentIdToCustomElementTag,O as createPreferredButton,m as forwardAgentButtonAttributes,F as injectAllStructuredData,p as parsePreferredAgentsAttribute,d as pickPreferredAgentId,u as readAgentPreferences,P as recordAgentPreference,z as register,l as registerPreferredButton,C as writeAgentPreferences};//# sourceMappingURL=index.mjs.map | ||
| //# sourceMappingURL=index.mjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/agent-preferences.ts","../src/preferred-button.ts","../src/index.ts"],"names":["AGENT_PREFERENCES_COOKIE_NAME","MAX_AGENT_PREFERENCE_ENTRIES","SUPPORTED_PREFERRED_AGENT_IDS","KNOWN","isBrowser","readAgentPreferences","match","p","value","decoded","data","x","writeAgentPreferences","payload","order","json","expires","recordAgentPreference","agentId","base","id","parsePreferredAgentsAttribute","out","seen","raw","pickPreferredAgentId","developerOrder","cookieOrder","allowed","AGENT_TO_TAG","agentIdToCustomElementTag","FORWARD_ATTR_NAMES","forwardAgentButtonAttributes","from","to","name","PreferredButton","picked","tag","el","registerPreferredButton","tagName","createPreferredButton","options","register","_registerClaude","_registerHermes","_registerClaw","injectAllStructuredData","m"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Cross-site preference cookie for the agentbuttons family (same origin).\n * Name and JSON shape must match claudebuttons, hermesbuttons, and clawbuttons.\n */\nexport const AGENT_PREFERENCES_COOKIE_NAME = 'agentpreferences';\n\nexport const MAX_AGENT_PREFERENCE_ENTRIES = 24;\n\nexport const SUPPORTED_PREFERRED_AGENT_IDS = [\n 'claude-code',\n 'cowork',\n 'hermes',\n 'hermes-skill',\n 'openclaw',\n 'ironclaw',\n 'nanoclaw',\n 'zeroclaw',\n 'openharness',\n 'claudeclaw',\n] as const;\n\nexport type PreferredAgentId = (typeof SUPPORTED_PREFERRED_AGENT_IDS)[number];\n\nexport interface AgentPreferencesPayload {\n /** Most recently used agent ids first. */\n order: string[];\n}\n\nconst KNOWN = new Set<string>(SUPPORTED_PREFERRED_AGENT_IDS);\n\nfunction isBrowser(): boolean {\n return typeof document !== 'undefined';\n}\n\nexport function readAgentPreferences(): AgentPreferencesPayload | null {\n if (!isBrowser()) return null;\n const match = document.cookie\n .split(';')\n .map((p) => p.trim())\n .find((p) => p.startsWith(`${AGENT_PREFERENCES_COOKIE_NAME}=`));\n if (!match) return null;\n const value = match.slice(AGENT_PREFERENCES_COOKIE_NAME.length + 1);\n if (!value) return null;\n try {\n const decoded = decodeURIComponent(value);\n const data = JSON.parse(decoded) as unknown;\n if (!data || typeof data !== 'object' || !Array.isArray((data as AgentPreferencesPayload).order)) {\n return null;\n }\n const order = (data as AgentPreferencesPayload).order.filter(\n (x): x is string => typeof x === 'string' && x.length > 0,\n );\n return { order };\n } catch {\n return null;\n }\n}\n\nexport function writeAgentPreferences(payload: AgentPreferencesPayload): void {\n if (!isBrowser()) return;\n const order = payload.order.slice(0, MAX_AGENT_PREFERENCE_ENTRIES);\n const json = JSON.stringify({ order });\n const expires = new Date();\n expires.setFullYear(expires.getFullYear() + 1);\n document.cookie = `${AGENT_PREFERENCES_COOKIE_NAME}=${encodeURIComponent(json)}; Path=/; SameSite=Lax; Expires=${expires.toUTCString()}`;\n}\n\nexport function recordAgentPreference(agentId: string): void {\n if (!agentId || typeof agentId !== 'string') return;\n const prev = readAgentPreferences();\n const base = prev?.order.filter((id) => id !== agentId) ?? [];\n writeAgentPreferences({ order: [agentId, ...base] });\n}\n\n/** Parse a comma-separated `agents` attribute; unknown tokens are dropped. */\nexport function parsePreferredAgentsAttribute(value: string | null): string[] {\n if (!value || !value.trim()) return [];\n const out: string[] = [];\n const seen = new Set<string>();\n for (const raw of value.split(',')) {\n const id = raw.trim().toLowerCase();\n if (!id || !KNOWN.has(id) || seen.has(id)) continue;\n seen.add(id);\n out.push(id);\n }\n return out;\n}\n\n/**\n * Pick which agent to show: first cookie hit that appears in developerOrder,\n * else the first entry in developerOrder (developer default).\n */\nexport function pickPreferredAgentId(\n developerOrder: string[],\n cookieOrder: string[] | null | undefined,\n): string | null {\n if (developerOrder.length === 0) return null;\n const allowed = new Set(developerOrder);\n if (cookieOrder) {\n for (const id of cookieOrder) {\n if (allowed.has(id)) return id;\n }\n }\n return developerOrder[0];\n}\n\nconst AGENT_TO_TAG: Record<string, string> = {\n 'claude-code': 'claude-code-button',\n cowork: 'cowork-button',\n hermes: 'hermes-button',\n 'hermes-skill': 'hermes-skill-button',\n openclaw: 'openclaw-button',\n ironclaw: 'ironclaw-button',\n nanoclaw: 'nanoclaw-button',\n zeroclaw: 'zeroclaw-button',\n openharness: 'openharness-button',\n claudeclaw: 'claudeclaw-button',\n};\n\nexport function agentIdToCustomElementTag(agentId: string): string | null {\n return AGENT_TO_TAG[agentId] ?? null;\n}\n\nconst FORWARD_ATTR_NAMES = [\n 'command',\n 'theme',\n 'variant',\n 'size',\n 'shape',\n 'popup',\n 'prompt-flag',\n 'popup-title',\n 'popup-description',\n 'auto-launch',\n] as const;\n\n/** Copy shared presentation attributes from a preferred-button host onto a child agent button. */\nexport function forwardAgentButtonAttributes(from: HTMLElement, to: HTMLElement): void {\n for (const name of FORWARD_ATTR_NAMES) {\n if (!from.hasAttribute(name)) continue;\n to.setAttribute(name, from.getAttribute(name) ?? '');\n }\n}\n","import {\n readAgentPreferences,\n parsePreferredAgentsAttribute,\n pickPreferredAgentId,\n agentIdToCustomElementTag,\n forwardAgentButtonAttributes,\n} from './agent-preferences';\n\n/**\n * Renders a single agent button chosen from the `agents` list.\n * If the `agentpreferences` cookie exists (written by any family button on copy),\n * the first matching id in that cookie wins; otherwise the first id in `agents` is used.\n */\nexport class PreferredButton extends HTMLElement {\n static observedAttributes = [\n 'agents',\n 'command',\n 'theme',\n 'variant',\n 'size',\n 'shape',\n 'popup',\n 'prompt-flag',\n 'popup-title',\n 'popup-description',\n 'auto-launch',\n ];\n\n private _child: HTMLElement | null = null;\n private _rendered = false;\n\n connectedCallback() {\n this.render();\n }\n\n attributeChangedCallback() {\n if (!this._rendered) return;\n this.render();\n }\n\n private render() {\n const developerOrder = parsePreferredAgentsAttribute(this.getAttribute('agents'));\n const cookieOrder = readAgentPreferences()?.order;\n const picked = pickPreferredAgentId(developerOrder, cookieOrder);\n const tag = picked ? agentIdToCustomElementTag(picked) : null;\n\n if (picked) {\n this.setAttribute('data-resolved-agent', picked);\n } else {\n this.removeAttribute('data-resolved-agent');\n }\n\n if (this._child) {\n this.removeChild(this._child);\n this._child = null;\n }\n\n if (!tag || !picked) {\n this._rendered = true;\n return;\n }\n\n const el = document.createElement(tag) as HTMLElement;\n forwardAgentButtonAttributes(this, el);\n this.appendChild(el);\n this._child = el;\n this._rendered = true;\n }\n}\n\nexport function registerPreferredButton(tagName = 'preferred-button') {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, PreferredButton);\n }\n}\n\nregisterPreferredButton();\n\nexport interface PreferredButtonOptions {\n /** Comma-separated agent ids, developer priority order (e.g. claude-code,hermes,openclaw). */\n agents: string;\n command: string;\n theme?: string;\n variant?: string;\n size?: string;\n shape?: string;\n popup?: boolean;\n promptFlag?: boolean;\n popupTitle?: string;\n popupDescription?: string;\n autoLaunch?: boolean;\n}\n\nexport function createPreferredButton(options: PreferredButtonOptions): PreferredButton {\n const el = document.createElement('preferred-button') as PreferredButton;\n el.setAttribute('agents', options.agents);\n el.setAttribute('command', options.command);\n if (options.theme) el.setAttribute('theme', options.theme);\n if (options.variant) el.setAttribute('variant', options.variant);\n if (options.size) el.setAttribute('size', options.size);\n if (options.shape) el.setAttribute('shape', options.shape);\n if (options.popup === false) el.setAttribute('popup', 'false');\n if (options.promptFlag === false) el.setAttribute('prompt-flag', 'false');\n if (options.popupTitle) el.setAttribute('popup-title', options.popupTitle);\n if (options.popupDescription) el.setAttribute('popup-description', options.popupDescription);\n if (options.autoLaunch === true) el.setAttribute('auto-launch', 'true');\n return el;\n}\n","// ── Claude Code buttons ─────────────────────────────────────────────\nexport {\n ClaudeCodeButton,\n createClaudeCodeButton,\n registerClaudeCodeButton,\n CoworkButton,\n createCoworkButton,\n registerCoworkButton,\n ClaudePopupDialog,\n showPopup as showClaudePopup,\n CLAUDE_CODE_ICON,\n COWORK_ICON,\n themes as claudeThemes,\n resolveTheme as resolveClaudeTheme,\n BRAND_COLOR as CLAUDE_BRAND_COLOR,\n ALT_BRAND_COLOR as CLAUDE_ALT_BRAND_COLOR,\n isDesktopAppLinkSupported,\n isRestrictedEmbeddedBrowser,\n isMobileOrTabletDevice,\n discoverButtons as discoverClaudeButtons,\n generateStructuredData as generateClaudeStructuredData,\n injectStructuredData as injectClaudeStructuredData,\n register as registerClaude,\n} from 'claudebuttons';\n\nexport type {\n Theme as ClaudeTheme,\n Size as ClaudeSize,\n Variant as ClaudeVariant,\n Shape as ClaudeShape,\n ClaudeCodeButtonOptions,\n CoworkButtonOptions,\n PopupOptions as ClaudePopupOptions,\n ThemeTokens as ClaudeThemeTokens,\n ButtonMetadata as ClaudeButtonMetadata,\n} from 'claudebuttons';\n\n// ── Hermes Agent buttons ────────────────────────────────────────────\nexport {\n HermesButton,\n createHermesButton,\n registerHermesButton,\n HermesSkillButton,\n createHermesSkillButton,\n registerHermesSkillButton,\n HermesPopupDialog,\n showPopup as showHermesPopup,\n HERMES_ICON,\n HERMES_SKILL_ICON,\n themes as hermesThemes,\n resolveTheme as resolveHermesTheme,\n BRAND_COLOR as HERMES_BRAND_COLOR,\n ALT_BRAND_COLOR as HERMES_ALT_BRAND_COLOR,\n discoverButtons as discoverHermesButtons,\n generateStructuredData as generateHermesStructuredData,\n injectStructuredData as injectHermesStructuredData,\n register as registerHermes,\n} from 'hermesbuttons';\n\nexport type {\n Theme as HermesTheme,\n Size as HermesSize,\n Variant as HermesVariant,\n Shape as HermesShape,\n HermesButtonOptions,\n HermesSkillButtonOptions,\n PopupOptions as HermesPopupOptions,\n ThemeTokens as HermesThemeTokens,\n ButtonMetadata as HermesButtonMetadata,\n} from 'hermesbuttons';\n\n// ── OpenClaw-style harness buttons (OpenClaw, IronClaw, etc.) ───────\nexport {\n createClawButtonClass,\n getButtonClass,\n registerHarnessButton,\n registerAllButtons as registerAllClawButtons,\n createButton as createClawButton,\n ClawPopupDialog,\n showPopup as showClawPopup,\n OPENCLAW_ICON,\n HERMES_ICON as CLAW_HERMES_ICON,\n IRONCLAW_ICON,\n NANOCLAW_ICON,\n ZEROCLAW_ICON,\n OPENHARNESS_ICON,\n CLAUDECLAW_ICON,\n getIcon,\n getThemes as getClawThemes,\n resolveTheme as resolveClawTheme,\n DEFAULT_BRAND_COLOR as CLAW_DEFAULT_BRAND_COLOR,\n getBrandColor,\n HARNESSES,\n HARNESS_IDS,\n getHarness,\n discoverButtons as discoverClawButtons,\n generateStructuredData as generateClawStructuredData,\n injectStructuredData as injectClawStructuredData,\n register as registerClaw,\n} from 'clawbuttons';\n\nexport type {\n Theme as ClawTheme,\n Size as ClawSize,\n Variant as ClawVariant,\n Shape as ClawShape,\n HarnessId,\n HarnessConfig,\n ClawButtonOptions,\n PopupOptions as ClawPopupOptions,\n ThemeTokens as ClawThemeTokens,\n ButtonMetadata as ClawButtonMetadata,\n} from 'clawbuttons';\n\n// ── Shared agent preference cookie + preferred-button ───────────────\nexport {\n AGENT_PREFERENCES_COOKIE_NAME,\n MAX_AGENT_PREFERENCE_ENTRIES,\n SUPPORTED_PREFERRED_AGENT_IDS,\n type PreferredAgentId,\n type AgentPreferencesPayload,\n readAgentPreferences,\n writeAgentPreferences,\n recordAgentPreference,\n parsePreferredAgentsAttribute,\n pickPreferredAgentId,\n agentIdToCustomElementTag,\n forwardAgentButtonAttributes,\n} from './agent-preferences';\n\nexport {\n PreferredButton,\n createPreferredButton,\n registerPreferredButton,\n type PreferredButtonOptions,\n} from './preferred-button';\n\n// ── Unified registration ────────────────────────────────────────────\nimport { register as _registerClaude } from 'claudebuttons';\nimport { register as _registerHermes } from 'hermesbuttons';\nimport { register as _registerClaw } from 'clawbuttons';\nimport { registerPreferredButton } from './preferred-button';\n\n/**\n * Register all agent button custom elements at once.\n * Called automatically on import — exposed for frameworks\n * that need explicit registration timing.\n */\nexport function register() {\n _registerClaude();\n _registerHermes();\n _registerClaw();\n registerPreferredButton();\n}\n\n/**\n * Inject structured data for all agent button types found on the page.\n */\nexport function injectAllStructuredData() {\n // Lazy-import to avoid pulling in DOM APIs at module scope on the server\n Promise.all([\n import('claudebuttons').then((m) => m.injectStructuredData()),\n import('hermesbuttons').then((m) => m.injectStructuredData()),\n import('clawbuttons').then((m) => m.injectStructuredData()),\n ]);\n}\n"]} | ||
| {"version":3,"sources":["../src/agent-preferences.ts","../src/preferred-button.ts","../src/beacon.ts","../src/index.ts"],"names":["AGENT_PREFERENCES_COOKIE_NAME","MAX_AGENT_PREFERENCE_ENTRIES","SUPPORTED_PREFERRED_AGENT_IDS","KNOWN","isBrowser","readAgentPreferences","match","p","value","decoded","data","x","writeAgentPreferences","payload","order","json","expires","recordAgentPreference","agentId","base","id","parsePreferredAgentsAttribute","out","seen","raw","pickPreferredAgentId","developerOrder","cookieOrder","allowed","AGENT_TO_TAG","agentIdToCustomElementTag","FORWARD_ATTR_NAMES","forwardAgentButtonAttributes","from","to","name","PreferredButton","picked","tag","el","registerPreferredButton","tagName","createPreferredButton","options","PING_URL","sent","reportOrigin","origin","blob","register","_registerClaude","_registerHermes","_registerClaw","injectAllStructuredData","m"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Cross-site preference cookie for the agentbuttons family (same origin).\n * Name and JSON shape must match claudebuttons, hermesbuttons, and clawbuttons.\n */\nexport const AGENT_PREFERENCES_COOKIE_NAME = 'agentpreferences';\n\nexport const MAX_AGENT_PREFERENCE_ENTRIES = 24;\n\nexport const SUPPORTED_PREFERRED_AGENT_IDS = [\n 'claude-code',\n 'cowork',\n 'hermes',\n 'hermes-skill',\n 'openclaw',\n 'ironclaw',\n 'nanoclaw',\n 'zeroclaw',\n 'openharness',\n 'claudeclaw',\n] as const;\n\nexport type PreferredAgentId = (typeof SUPPORTED_PREFERRED_AGENT_IDS)[number];\n\nexport interface AgentPreferencesPayload {\n /** Most recently used agent ids first. */\n order: string[];\n}\n\nconst KNOWN = new Set<string>(SUPPORTED_PREFERRED_AGENT_IDS);\n\nfunction isBrowser(): boolean {\n return typeof document !== 'undefined';\n}\n\nexport function readAgentPreferences(): AgentPreferencesPayload | null {\n if (!isBrowser()) return null;\n const match = document.cookie\n .split(';')\n .map((p) => p.trim())\n .find((p) => p.startsWith(`${AGENT_PREFERENCES_COOKIE_NAME}=`));\n if (!match) return null;\n const value = match.slice(AGENT_PREFERENCES_COOKIE_NAME.length + 1);\n if (!value) return null;\n try {\n const decoded = decodeURIComponent(value);\n const data = JSON.parse(decoded) as unknown;\n if (!data || typeof data !== 'object' || !Array.isArray((data as AgentPreferencesPayload).order)) {\n return null;\n }\n const order = (data as AgentPreferencesPayload).order.filter(\n (x): x is string => typeof x === 'string' && x.length > 0,\n );\n return { order };\n } catch {\n return null;\n }\n}\n\nexport function writeAgentPreferences(payload: AgentPreferencesPayload): void {\n if (!isBrowser()) return;\n const order = payload.order.slice(0, MAX_AGENT_PREFERENCE_ENTRIES);\n const json = JSON.stringify({ order });\n const expires = new Date();\n expires.setFullYear(expires.getFullYear() + 1);\n document.cookie = `${AGENT_PREFERENCES_COOKIE_NAME}=${encodeURIComponent(json)}; Path=/; SameSite=Lax; Expires=${expires.toUTCString()}`;\n}\n\nexport function recordAgentPreference(agentId: string): void {\n if (!agentId || typeof agentId !== 'string') return;\n const prev = readAgentPreferences();\n const base = prev?.order.filter((id) => id !== agentId) ?? [];\n writeAgentPreferences({ order: [agentId, ...base] });\n}\n\n/** Parse a comma-separated `agents` attribute; unknown tokens are dropped. */\nexport function parsePreferredAgentsAttribute(value: string | null): string[] {\n if (!value || !value.trim()) return [];\n const out: string[] = [];\n const seen = new Set<string>();\n for (const raw of value.split(',')) {\n const id = raw.trim().toLowerCase();\n if (!id || !KNOWN.has(id) || seen.has(id)) continue;\n seen.add(id);\n out.push(id);\n }\n return out;\n}\n\n/**\n * Pick which agent to show: first cookie hit that appears in developerOrder,\n * else the first entry in developerOrder (developer default).\n */\nexport function pickPreferredAgentId(\n developerOrder: string[],\n cookieOrder: string[] | null | undefined,\n): string | null {\n if (developerOrder.length === 0) return null;\n const allowed = new Set(developerOrder);\n if (cookieOrder) {\n for (const id of cookieOrder) {\n if (allowed.has(id)) return id;\n }\n }\n return developerOrder[0];\n}\n\nconst AGENT_TO_TAG: Record<string, string> = {\n 'claude-code': 'claude-code-button',\n cowork: 'cowork-button',\n hermes: 'hermes-button',\n 'hermes-skill': 'hermes-skill-button',\n openclaw: 'openclaw-button',\n ironclaw: 'ironclaw-button',\n nanoclaw: 'nanoclaw-button',\n zeroclaw: 'zeroclaw-button',\n openharness: 'openharness-button',\n claudeclaw: 'claudeclaw-button',\n};\n\nexport function agentIdToCustomElementTag(agentId: string): string | null {\n return AGENT_TO_TAG[agentId] ?? null;\n}\n\nconst FORWARD_ATTR_NAMES = [\n 'command',\n 'theme',\n 'variant',\n 'size',\n 'shape',\n 'popup',\n 'prompt-flag',\n 'popup-title',\n 'popup-description',\n 'auto-launch',\n] as const;\n\n/** Copy shared presentation attributes from a preferred-button host onto a child agent button. */\nexport function forwardAgentButtonAttributes(from: HTMLElement, to: HTMLElement): void {\n for (const name of FORWARD_ATTR_NAMES) {\n if (!from.hasAttribute(name)) continue;\n to.setAttribute(name, from.getAttribute(name) ?? '');\n }\n}\n","import {\n readAgentPreferences,\n parsePreferredAgentsAttribute,\n pickPreferredAgentId,\n agentIdToCustomElementTag,\n forwardAgentButtonAttributes,\n} from './agent-preferences';\n\n/**\n * Renders a single agent button chosen from the `agents` list.\n * If the `agentpreferences` cookie exists (written by any family button on copy),\n * the first matching id in that cookie wins; otherwise the first id in `agents` is used.\n */\nexport class PreferredButton extends HTMLElement {\n static observedAttributes = [\n 'agents',\n 'command',\n 'theme',\n 'variant',\n 'size',\n 'shape',\n 'popup',\n 'prompt-flag',\n 'popup-title',\n 'popup-description',\n 'auto-launch',\n ];\n\n private _child: HTMLElement | null = null;\n private _rendered = false;\n\n connectedCallback() {\n this.render();\n }\n\n attributeChangedCallback() {\n if (!this._rendered) return;\n this.render();\n }\n\n private render() {\n const developerOrder = parsePreferredAgentsAttribute(this.getAttribute('agents'));\n const cookieOrder = readAgentPreferences()?.order;\n const picked = pickPreferredAgentId(developerOrder, cookieOrder);\n const tag = picked ? agentIdToCustomElementTag(picked) : null;\n\n if (picked) {\n this.setAttribute('data-resolved-agent', picked);\n } else {\n this.removeAttribute('data-resolved-agent');\n }\n\n if (this._child) {\n this.removeChild(this._child);\n this._child = null;\n }\n\n if (!tag || !picked) {\n this._rendered = true;\n return;\n }\n\n const el = document.createElement(tag) as HTMLElement;\n forwardAgentButtonAttributes(this, el);\n this.appendChild(el);\n this._child = el;\n this._rendered = true;\n }\n}\n\nexport function registerPreferredButton(tagName = 'preferred-button') {\n if (typeof customElements === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, PreferredButton);\n }\n}\n\nregisterPreferredButton();\n\nexport interface PreferredButtonOptions {\n /** Comma-separated agent ids, developer priority order (e.g. claude-code,hermes,openclaw). */\n agents: string;\n command: string;\n theme?: string;\n variant?: string;\n size?: string;\n shape?: string;\n popup?: boolean;\n promptFlag?: boolean;\n popupTitle?: string;\n popupDescription?: string;\n autoLaunch?: boolean;\n}\n\nexport function createPreferredButton(options: PreferredButtonOptions): PreferredButton {\n const el = document.createElement('preferred-button') as PreferredButton;\n el.setAttribute('agents', options.agents);\n el.setAttribute('command', options.command);\n if (options.theme) el.setAttribute('theme', options.theme);\n if (options.variant) el.setAttribute('variant', options.variant);\n if (options.size) el.setAttribute('size', options.size);\n if (options.shape) el.setAttribute('shape', options.shape);\n if (options.popup === false) el.setAttribute('popup', 'false');\n if (options.promptFlag === false) el.setAttribute('prompt-flag', 'false');\n if (options.popupTitle) el.setAttribute('popup-title', options.popupTitle);\n if (options.popupDescription) el.setAttribute('popup-description', options.popupDescription);\n if (options.autoLaunch === true) el.setAttribute('auto-launch', 'true');\n return el;\n}\n","const PING_URL = 'https://agentbuttons.vercel.app/api/ping';\n\nlet sent = false;\n\nexport function reportOrigin(): void {\n if (sent) return;\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return;\n\n const origin = window.location?.origin;\n if (!origin || origin === 'null' || origin.startsWith('file:')) return;\n\n sent = true;\n\n try {\n const payload = JSON.stringify({ origin });\n const blob = new Blob([payload], { type: 'text/plain' });\n\n if (typeof navigator.sendBeacon === 'function') {\n navigator.sendBeacon(PING_URL, blob);\n } else {\n fetch(PING_URL, { method: 'POST', body: payload, keepalive: true })\n .catch(() => {});\n }\n } catch {\n // Never let telemetry break the host page\n }\n}\n\nif (typeof window !== 'undefined') {\n try { reportOrigin(); } catch {}\n}\n","// ── Claude Code buttons ─────────────────────────────────────────────\nexport {\n ClaudeCodeButton,\n createClaudeCodeButton,\n registerClaudeCodeButton,\n CoworkButton,\n createCoworkButton,\n registerCoworkButton,\n ClaudePopupDialog,\n showPopup as showClaudePopup,\n CLAUDE_CODE_ICON,\n COWORK_ICON,\n themes as claudeThemes,\n resolveTheme as resolveClaudeTheme,\n BRAND_COLOR as CLAUDE_BRAND_COLOR,\n ALT_BRAND_COLOR as CLAUDE_ALT_BRAND_COLOR,\n isDesktopAppLinkSupported,\n isRestrictedEmbeddedBrowser,\n isMobileOrTabletDevice,\n discoverButtons as discoverClaudeButtons,\n generateStructuredData as generateClaudeStructuredData,\n injectStructuredData as injectClaudeStructuredData,\n register as registerClaude,\n} from 'claudebuttons';\n\nexport type {\n Theme as ClaudeTheme,\n Size as ClaudeSize,\n Variant as ClaudeVariant,\n Shape as ClaudeShape,\n ClaudeCodeButtonOptions,\n CoworkButtonOptions,\n PopupOptions as ClaudePopupOptions,\n ThemeTokens as ClaudeThemeTokens,\n ButtonMetadata as ClaudeButtonMetadata,\n} from 'claudebuttons';\n\n// ── Hermes Agent buttons ────────────────────────────────────────────\nexport {\n HermesButton,\n createHermesButton,\n registerHermesButton,\n HermesSkillButton,\n createHermesSkillButton,\n registerHermesSkillButton,\n HermesPopupDialog,\n showPopup as showHermesPopup,\n HERMES_ICON,\n HERMES_SKILL_ICON,\n themes as hermesThemes,\n resolveTheme as resolveHermesTheme,\n BRAND_COLOR as HERMES_BRAND_COLOR,\n ALT_BRAND_COLOR as HERMES_ALT_BRAND_COLOR,\n discoverButtons as discoverHermesButtons,\n generateStructuredData as generateHermesStructuredData,\n injectStructuredData as injectHermesStructuredData,\n register as registerHermes,\n} from 'hermesbuttons';\n\nexport type {\n Theme as HermesTheme,\n Size as HermesSize,\n Variant as HermesVariant,\n Shape as HermesShape,\n HermesButtonOptions,\n HermesSkillButtonOptions,\n PopupOptions as HermesPopupOptions,\n ThemeTokens as HermesThemeTokens,\n ButtonMetadata as HermesButtonMetadata,\n} from 'hermesbuttons';\n\n// ── OpenClaw-style harness buttons (OpenClaw, IronClaw, etc.) ───────\nexport {\n createClawButtonClass,\n getButtonClass,\n registerHarnessButton,\n registerAllButtons as registerAllClawButtons,\n createButton as createClawButton,\n ClawPopupDialog,\n showPopup as showClawPopup,\n OPENCLAW_ICON,\n HERMES_ICON as CLAW_HERMES_ICON,\n IRONCLAW_ICON,\n NANOCLAW_ICON,\n ZEROCLAW_ICON,\n OPENHARNESS_ICON,\n CLAUDECLAW_ICON,\n getIcon,\n getThemes as getClawThemes,\n resolveTheme as resolveClawTheme,\n DEFAULT_BRAND_COLOR as CLAW_DEFAULT_BRAND_COLOR,\n getBrandColor,\n HARNESSES,\n HARNESS_IDS,\n getHarness,\n discoverButtons as discoverClawButtons,\n generateStructuredData as generateClawStructuredData,\n injectStructuredData as injectClawStructuredData,\n register as registerClaw,\n} from 'clawbuttons';\n\nexport type {\n Theme as ClawTheme,\n Size as ClawSize,\n Variant as ClawVariant,\n Shape as ClawShape,\n HarnessId,\n HarnessConfig,\n ClawButtonOptions,\n PopupOptions as ClawPopupOptions,\n ThemeTokens as ClawThemeTokens,\n ButtonMetadata as ClawButtonMetadata,\n} from 'clawbuttons';\n\n// ── Shared agent preference cookie + preferred-button ───────────────\nexport {\n AGENT_PREFERENCES_COOKIE_NAME,\n MAX_AGENT_PREFERENCE_ENTRIES,\n SUPPORTED_PREFERRED_AGENT_IDS,\n type PreferredAgentId,\n type AgentPreferencesPayload,\n readAgentPreferences,\n writeAgentPreferences,\n recordAgentPreference,\n parsePreferredAgentsAttribute,\n pickPreferredAgentId,\n agentIdToCustomElementTag,\n forwardAgentButtonAttributes,\n} from './agent-preferences';\n\nexport {\n PreferredButton,\n createPreferredButton,\n registerPreferredButton,\n type PreferredButtonOptions,\n} from './preferred-button';\n\nimport './beacon';\n\n// ── Unified registration ────────────────────────────────────────────\nimport { register as _registerClaude } from 'claudebuttons';\nimport { register as _registerHermes } from 'hermesbuttons';\nimport { register as _registerClaw } from 'clawbuttons';\nimport { registerPreferredButton } from './preferred-button';\n\n/**\n * Register all agent button custom elements at once.\n * Called automatically on import — exposed for frameworks\n * that need explicit registration timing.\n */\nexport function register() {\n _registerClaude();\n _registerHermes();\n _registerClaw();\n registerPreferredButton();\n}\n\n/**\n * Inject structured data for all agent button types found on the page.\n */\nexport function injectAllStructuredData() {\n // Lazy-import to avoid pulling in DOM APIs at module scope on the server\n Promise.all([\n import('claudebuttons').then((m) => m.injectStructuredData()),\n import('hermesbuttons').then((m) => m.injectStructuredData()),\n import('clawbuttons').then((m) => m.injectStructuredData()),\n ]);\n}\n"]} |
+5
-4
| { | ||
| "name": "agentbuttons", | ||
| "version": "1.1.2", | ||
| "version": "1.1.3", | ||
| "description": "Drop-in buttons for every AI coding agent — Claude Code, Hermes, OpenClaw, IronClaw, and more. One import, every agent.", | ||
@@ -58,8 +58,9 @@ "main": "./dist/index.js", | ||
| "dependencies": { | ||
| "claudebuttons": "^1.2.6", | ||
| "clawbuttons": "^1.0.5", | ||
| "hermesbuttons": "^1.1.3" | ||
| "claudebuttons": "^1.2.7", | ||
| "clawbuttons": "^1.0.6", | ||
| "hermesbuttons": "^1.1.4" | ||
| }, | ||
| "devDependencies": { | ||
| "@types/react": "^19.2.14", | ||
| "@upstash/redis": "^1.37.0", | ||
| "tsup": "^8.4.0", | ||
@@ -66,0 +67,0 @@ "typescript": "^5.7.0" |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Network access
Supply chain riskThis module accesses the network.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
518281
-1.01%4
33.33%2691
-1.9%3
Infinity%Updated
Updated
Updated