🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

agentbuttons

Package Overview
Dependencies
Maintainers
1
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

agentbuttons - npm Package Compare versions

Comparing version
1.1.2
to
1.1.3
+2
-1
dist/index.js

@@ -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":"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","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":"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","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"]}

@@ -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"]}
{
"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