opencrater 1.1.16 → 1.1.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var crypto=require('crypto'),p=require('fs'),L=require('os'),l=require('path'),child_process=require('child_process'),re=require('readline');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var p__namespace=/*#__PURE__*/_interopNamespace(p);var L__namespace=/*#__PURE__*/_interopNamespace(L);var l__namespace=/*#__PURE__*/_interopNamespace(l);var re__namespace=/*#__PURE__*/_interopNamespace(re);var x=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});function le(e=process.env){return l__namespace.join(L__namespace.homedir(),".config","opencrater")}function v(e=process.env){return l__namespace.join(le(e),"state.json")}function J(){return {installId:crypto.randomUUID(),lastShownAt:0,optOut:false,disclosureShown:false,cachedConfig:null,configFetchedAt:0,pool:[],allowedPlacements:{},sessionTopics:[],integrations:[],devToken:null,computeRouting:null,computeCards:null}}function h(e){return typeof e=="number"&&Number.isFinite(e)}function ue(e){if(typeof e!="object"||e===null)return null;let t=e;return !h(t.minIntervalSeconds)||!h(t.serveTimeoutMs)||!h(t.preloadPoolSize)||typeof t.killSwitch!="boolean"?null:{minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:t.preloadPoolSize,killSwitch:t.killSwitch,displayDurationSeconds:h(t.displayDurationSeconds)?t.displayDurationSeconds:25,minSdkVersion:typeof t.minSdkVersion=="string"?t.minSdkVersion:""}}function pe(e){if(!Array.isArray(e))return [];let t=[];for(let n of e){if(typeof n!="object"||n===null)continue;let o=n,r=o.blip;if(!h(o.renderBy)||typeof r!="object"||r===null||typeof r.impressionId!="string"||typeof r.clickUrl!="string"||typeof r.sponsorLabel!="string"||typeof r.creative!="object"||r.creative===null)continue;let s=r.creative;typeof s.title!="string"||typeof s.body!="string"||t.push({blip:{impressionId:r.impressionId,...typeof r.campaignId=="string"?{campaignId:r.campaignId}:{},clickUrl:r.clickUrl,sponsorLabel:r.sponsorLabel,creative:{format:"text",title:s.title,body:s.body,...typeof s.cta=="string"?{cta:s.cta}:{}}},renderBy:o.renderBy});}return t}function de(e){if(typeof e!="object"||e===null||Array.isArray(e))return {};let t={};for(let[n,o]of Object.entries(e)){if(!Array.isArray(o))continue;let r=o.filter(s=>typeof s=="string"&&s.length<=64);t[n]=r.slice(0,64);}return t}function fe(e){if(!Array.isArray(e))return [];let t=[];for(let n of e){if(typeof n!="object"||n===null)continue;let o=n;if(!(typeof o.topic!="string"||!h(o.at))&&(t.push({topic:o.topic.slice(0,32),at:o.at}),t.length>=24))break}return t}function ge(e){if(!Array.isArray(e))return [];let t=[],n=new Set;for(let o of e){if(typeof o!="object"||o===null)continue;let r=o;if(typeof r.key!="string"||typeof r.package!="string"||r.key===""||r.package==="")continue;let s=`${r.package}\0${r.key}`;if(!n.has(s)&&(n.add(s),t.push({key:r.key,package:r.package}),t.length>=32))break}return t}function me(e){if(typeof e!="object"||e===null)return null;let t=e,n={};if(typeof t.savedEnv=="object"&&t.savedEnv!==null)for(let[o,r]of Object.entries(t.savedEnv))(typeof r=="string"||r===null)&&(n[o]=r);return {active:t.active===true,savedEnv:n}}function he(e){if(typeof e!="object"||e===null)return null;let t=e,n=o=>h(o)&&o>=0?o:0;return {turns:n(t.turns),lastLimitAt:n(t.lastLimitAt),lastDepletedAt:n(t.lastDepletedAt),lastBackupAt:n(t.lastBackupAt)}}function ye(e){let t=J();if(typeof e!="object"||e===null)return t;let n=e;return {installId:typeof n.installId=="string"&&n.installId.length>0?n.installId:t.installId,lastShownAt:h(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:ue(n.cachedConfig),allowedPlacements:de(n.allowedPlacements),sessionTopics:fe(n.sessionTopics),integrations:ge(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:me(n.computeRouting),computeCards:he(n.computeCards),configFetchedAt:h(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:pe(n.pool)}}function y(e=process.env){let t=v(e);try{let n=p__namespace.readFileSync(t,"utf8"),o=JSON.parse(n);return ye(o)}catch{let n=J();try{z(n,e);}catch{}return n}}function z(e,t=process.env){let n=v(t),o=l__namespace.dirname(n);p__namespace.mkdirSync(o,{recursive:true});try{let i=JSON.parse(p__namespace.readFileSync(n,"utf8"));typeof i.lastShownAt=="number"&&i.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:i.lastShownAt});}catch{}let r=l__namespace.join(o,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);p__namespace.writeFileSync(r,JSON.stringify(e,null,2)+`
3
- `,"utf8");let s=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);for(let i=0;;i++)try{p__namespace.renameSync(r,n);return}catch(u){let a=u.code??"";if(i>=4||!s.has(a)){try{p__namespace.rmSync(r,{force:!0});}catch{}if(i>=4)return;throw u}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(i+1));}catch{}}}function k(e,t=process.env){let n={...y(t),...e};return z(n,t),n}var G={claude_code:["SessionStart","Stop","SessionEnd","Notification","UserPromptSubmit","SubagentStart","SubagentStop","StopFailure","PreToolUse","PostToolUse","PostToolUseFailure","PostToolBatch","PermissionRequest","PermissionDenied","UserPromptExpansion","PreCompact","PostCompact","TaskCreated","TaskCompleted","Setup","TeammateIdle","Elicitation","ElicitationResult","ConfigChange","InstructionsLoaded","WorktreeCreate","WorktreeRemove","CwdChanged","FileChanged","MessageDisplay"],codex:["Stop","SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PermissionRequest","PreCompact","PostCompact"],openclaw:[],gemini_cli:["AfterAgent","SessionStart","SessionEnd","Notification","BeforeAgent","BeforeModel","AfterModel","BeforeToolSelection","BeforeTool","AfterTool","PreCompress"],copilot_cli:["agentStop","sessionStart","sessionEnd","notification","userPromptSubmitted","preToolUse","postToolUse","permissionRequest","errorOccurred","subagentStart","subagentStop"],generic:["SessionStart","Stop"]};var S=["claude_code","codex","gemini_cli","copilot_cli"];function C(e){return e.includes("opencrater-hook")}function ke(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function X(e,t){return C(e)&&new RegExp(`--package ['"]?${ke(t)}['"]?`).test(e)}function K(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var V='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',q="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function N(e,t,n,o){let r=`--placement ${t} --key ${K(n)} --package ${K(o)} --host ${e}`;return `{ if [ -f ${V} ]; then node ${V} ${r}; else npx -y -p opencrater opencrater-hook ${r}; fi; } 2>/dev/null || true`}function Se(e,t,n,o){let r=`--placement ${t} --key '${n}' --package '${o}' --host ${e}`;return `try { if (Test-Path "${q}") { node "${q}" ${r} } else { npx -y -p opencrater opencrater-hook ${r} } } catch {}`}function W(e,t,n,o){return N(e,t,n,o)}function Q(e,t){let n=L__namespace.homedir();switch(e){case "claude_code":{let o=t.CLAUDE_CONFIG_DIR;return o&&o.trim()!==""?o:l__namespace.join(n,".claude")}case "codex":{let o=t.CODEX_HOME;return o&&o.trim()!==""?o:l__namespace.join(n,".codex")}case "gemini_cli":return l__namespace.join(n,".gemini");case "copilot_cli":{let o=t.COPILOT_HOME;return o&&o.trim()!==""?o:l__namespace.join(n,".copilot")}default:return l__namespace.join(n,".opencrater-unknown")}}function P(e,t=process.env){let n=Q(e,t);switch(e){case "claude_code":return l__namespace.join(n,"settings.json");case "codex":return l__namespace.join(n,"hooks.json");case "gemini_cli":return l__namespace.join(n,"settings.json");case "copilot_cli":return l__namespace.join(n,"hooks","hooks.json");default:return l__namespace.join(n,"hooks.json")}}var be={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"]};function we(e,t){if(e.length===0)return false;let n=(t.PATH??t.Path??"").split(l__namespace.delimiter).filter(Boolean),o=process.platform==="win32"?["",".exe",".cmd",".bat"]:[""];for(let r of n)for(let s of e)for(let i of o)try{if(p__namespace.existsSync(l__namespace.join(r,s+i)))return !0}catch{}return false}function ve(e,t=process.env){try{if(p__namespace.existsSync(Q(e,t)))return !0}catch{}return we(be[e]??[],t)}function T(e=process.env){return S.filter(t=>ve(t,e))}function R(e){let t;try{t=p__namespace.readFileSync(e,"utf8");}catch{return {}}let n=JSON.parse(t);if(typeof n!="object"||n===null||Array.isArray(n))throw new Error(`${e} is not a JSON object`);return n}function j(e,t){let n=l__namespace.dirname(e);p__namespace.mkdirSync(n,{recursive:true});let o=l__namespace.join(n,`.${l__namespace.basename(e)}.${process.pid}.tmp`);p__namespace.writeFileSync(o,JSON.stringify(t,null,2)+`
4
- `,"utf8"),p__namespace.renameSync(o,e);}function Ce(e,t){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&X(n.command,t))}function Oe(e,t,n,o){let r=P(e),s=R(r),i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(o.every(a=>{let d=W(e,a,t,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>Array.isArray(c.hooks)&&c.hooks.some(m=>m.command===d))}))return "nochange";for(let a of o){let c=(Array.isArray(i[a])?i[a]:[]).filter(m=>!Ce(m,n));c.push({matcher:"",hooks:[{type:"command",command:W(e,a,t,n)}]}),i[a]=c;}return s.hooks=i,j(r,s),"wrote"}function Ae(e,t){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&X(n,t))}function Pe(e,t,n,o){let r=P(e),s=R(r);typeof s.version!="number"&&(s.version=1);let i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(o.every(a=>{let d=N(e,a,t,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>c.bash===d)}))return "nochange";for(let a of o){let c=(Array.isArray(i[a])?i[a]:[]).filter(m=>!Ae(m,n));c.push({type:"command",bash:N(e,a,t,n),powershell:Se(e,a,t,n),timeoutSec:5}),i[a]=c;}return s.hooks=i,j(r,s),"wrote"}function E(e){return [...G[e]]}function H(e,t,n){let o=E(e);return o.length===0?"nochange":e==="copilot_cli"?Pe(e,t,n,o):Oe(e,t,n,o)}function _(e,t,n=process.env){return T(n).map(o=>{try{let r=H(o,e,t);return {host:o,status:r,events:E(o)}}catch(r){return {host:o,status:"error",events:[],error:r.message}}})}function F(e=process.env){let t=[];for(let n of S){let o;try{o=R(P(n,e));}catch{continue}let r=o.hooks;if(!(!r||typeof r!="object"))for(let[s,i]of Object.entries(r))for(let u of Array.isArray(i)?i:[]){let a=u,d=Array.isArray(a.hooks)?a.hooks.find(f=>typeof f.command=="string"&&C(f.command))?.command:void 0,c=[a.bash,a.command,a.powershell].find(f=>typeof f=="string"&&C(f)),m=d??c;m&&t.push({host:n,event:s,command:m});}}return t}function Z(e=process.env){let t=0;for(let n of S){let o=P(n,e),r;try{r=R(o);}catch{continue}let s=r.hooks;if(!s||typeof s!="object")continue;let i=s,u=false;for(let a of Object.keys(i)){let d=Array.isArray(i[a])?i[a]:[],c=d.filter(m=>{let f=m,D=Array.isArray(f.hooks)&&f.hooks.some(w=>typeof w.command=="string"&&C(w.command))||[f.bash,f.powershell,f.command].some(w=>typeof w=="string"&&C(w));return D&&t++,!D});c.length!==d.length&&(u=true,c.length>0?i[a]=c:delete i[a]);}if(u)try{let a=Object.keys(r).filter(c=>c!=="version"&&c!=="hooks"),d=n==="copilot_cli"||n==="codex";Object.keys(i).length===0&&a.length===0&&d?p__namespace.rmSync(o,{force:!0}):j(o,r);}catch{}}return t}var O="1.1.16";var Re="https://api.opencrater.to";function I(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:Re)).replace(/\/+$/,"")}function Ie(){return l__namespace.join(L__namespace.homedir(),".config","opencrater","runtime")}function $e(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function te(e=Ie()){if(process.env.VITEST||process.env.OPENCRATER_DISABLE_RUNTIME_PIN)return false;try{return child_process.spawnSync("npm",$e(e),{stdio:"ignore",windowsHide:!0,shell:process.platform==="win32"}).status===0}catch{return false}}function xe(){let e=process.env.OPENCRATER_WEB_ORIGIN;return e&&e.trim()!==""?e.replace(/\/$/,""):I().replace("//api.","//").replace(/\/$/,"")}function Ne(e){try{let t=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";child_process.spawn(t,[e],{stdio:"ignore",detached:!0,shell:process.platform==="win32"}).unref();}catch{}}function Te(e){let t=re__namespace.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>t.question(e,o=>(t.close(),n(o))))}function U(e){return `$${(e/1e6).toFixed(2)}`}async function B(e,t){try{let n=new URL(`${I()}/v1/dev/me`);t&&n.searchParams.set("installId",t);let o=await fetch(n,{headers:{authorization:`Bearer ${e}`}});return o.ok?await o.json():null}catch{return null}}async function je(){let e=`${xe()}/dev/link`;console.log("Sign in and generate a CLI token here (we tried to open it):"),console.log(` ${e}
5
- `),Ne(e);let t=(await Te("Paste your token (ocd_\u2026): ")).trim();if(!t.startsWith("ocd_"))return console.error("That doesn't look like a token (should start with ocd_)."),1;let n=await B(t,y().installId);return n?(k({devToken:t}),console.log(`
6
- \u2713 Signed in as ${n.displayName}.`),console.log(` Compute balance: ${U(n.balanceMicroUsd)} \xB7 tier: ${n.trustTier}`),console.log(" See Blips in your sessions to earn your weekly compute."),0):(console.error("Couldn't verify that token \u2014 check it and try again."),1)}async function He(){let e=y().devToken;if(!e)return console.error("Not signed in. Run: opencrater login"),1;let t=await B(e,y().installId);return t?(console.log(`Compute balance: ${U(t.balanceMicroUsd)}`),console.log(` signed in as: ${t.displayName} \xB7 tier: ${t.trustTier}`),0):(console.error("Couldn't reach OpenCrater (or your session expired \u2014 try: opencrater login)."),1)}function _e(){return k({devToken:null}),console.log("Signed out of the OpenCrater compute wallet on this machine."),0}async function Fe(e){let t=y().devToken;if(!t)return console.error("Not signed in. Run: opencrater login"),1;let n=await B(t,y().installId);if(n&&n.balanceMicroUsd<=0)return console.error("Your OpenCrater compute balance is empty \u2014 see Blips to earn more."),console.error("Check anytime with: opencrater balance"),1;let o=`${I().replace(/\/$/,"")}/gateway`,r=l__namespace.join(l__namespace.dirname(v()),"claude-gateway.settings.json");try{p__namespace.mkdirSync(l__namespace.dirname(r),{recursive:!0}),p__namespace.writeFileSync(r,JSON.stringify({apiKeyHelper:`echo ${t}`}),{mode:384});}catch(u){return console.error(`Couldn't write gateway settings: ${u.message}`),1}n&&console.log(`Launching Claude Code on OpenCrater compute \xB7 balance ${U(n.balanceMicroUsd)}`);let s={...process.env,ANTHROPIC_BASE_URL:o};delete s.ANTHROPIC_API_KEY;let i=child_process.spawn("claude",[...e,"--settings",r],{stdio:"inherit",env:s,shell:process.platform==="win32"});return await new Promise(u=>{i.on("exit",a=>u(a??0)),i.on("error",a=>{console.error(`Couldn't launch claude: ${a.message}`),console.error("Is Claude Code installed? https://claude.com/claude-code"),u(127);});})}function ie(e){let t=new Map,n=[];for(let o=0;o<e.length;o++){let r=e[o];if(r!==void 0)if(r.startsWith("--")){let s=r.indexOf("=");if(s!==-1)t.set(r.slice(2,s),r.slice(s+1));else {let i=e[o+1];i!==void 0&&!i.startsWith("--")?(t.set(r.slice(2),i),o++):t.set(r.slice(2),"true");}}else n.push(r);}return {flags:t,rest:n}}function ae(e,t){let n=y();n.integrations.some(o=>o.key===e&&o.package===t)||k({integrations:[...n.integrations,{key:e,package:t}].slice(-32)});}function M(e,t){if(e.length===0){console.log(`No supported AI CLIs detected yet \u2014 OpenCrater will wire ${t} automatically the moment you install one (it re-checks once a day).`);return}console.log(`OpenCrater wired ${t} into:`);for(let n of e)if(n.status==="error")console.log(` \u2717 ${n.host}: ${n.error}`);else {let o=n.status==="nochange"?" \u2014 already set up":"";console.log(` \u2022 ${n.host} (${n.events.join(", ")})${o}`);}}function Me(){return k({optOut:true}),console.log("OpenCrater Blips are now OFF for this machine."),console.log("Re-enable any time with: npx opencrater on"),0}function Ue(e){let{flags:t}=ie(e),n=t.get("key"),o=t.get("package");return k({optOut:false}),n&&o?(ae(n,o),M(_(n,o),o),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(te()?"\u2713":"skipped (npm unavailable \u2014 hooks use npx fallback)")):console.log("OpenCrater Blips are now ON for this machine."),console.log("Opt out any time with: npx opencrater off"),0}function Be(){let e=y(),t=e.lastShownAt>0?new Date(e.lastShownAt).toISOString():"never";console.log(`opencrater v${O}`),console.log(` state file: ${v()}`),console.log(` install id: ${e.installId}`),console.log(` opted out: ${e.optOut?"yes":"no"}`),console.log(` last shown: ${t}`),console.log(` pooled Blips: ${e.pool.length}`),console.log(` hosts found: ${T().join(", ")||"(none)"}`),console.log(` integrations: ${e.integrations.map(o=>o.package).join(", ")||"(none)"}`);let n=F();return console.log(` wired hooks: ${n.length}`),0}function De(e){let{flags:t}=ie(e),n=t.get("key"),o=t.get("package");if(!n||!o)return console.error("Usage: opencrater hooks install --key <publisherKey> --package <name> [--host <host>]"),1;ae(n,o);let r=t.get("host");if(r&&r!=="true"){if(!S.includes(r))return console.error(`Unknown host "${r}". Supported: ${S.join(", ")}`),1;let s=r;try{let i=H(s,n,o);M([{host:s,status:i,events:E(s)}],o);}catch(i){return console.error(`Could not wire ${s}: ${i.message}`),1}}else M(_(n,o),o);return console.log("Remove with: npx opencrater hooks uninstall"),0}function Le(){let e=Z();return k({integrations:[]}),console.log(e>0?`Removed ${e} OpenCrater hook${e===1?"":"s"} across all hosts.`:"No OpenCrater hooks installed."),0}function Je(){let e=F();if(e.length===0)return console.log("No OpenCrater hooks installed."),0;for(let t of e)console.log(`${t.host} ${t.event}: ${t.command}`);return 0}function oe(){return console.log(`opencrater v${O} \u2014 OpenCrater Blips
2
+ 'use strict';var crypto=require('crypto'),p=require('fs'),J=require('os'),l=require('path'),child_process=require('child_process'),re=require('readline');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var p__namespace=/*#__PURE__*/_interopNamespace(p);var J__namespace=/*#__PURE__*/_interopNamespace(J);var l__namespace=/*#__PURE__*/_interopNamespace(l);var re__namespace=/*#__PURE__*/_interopNamespace(re);var j=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});function le(e=process.env){return l__namespace.join(J__namespace.homedir(),".config","opencrater")}function C(e=process.env){return l__namespace.join(le(e),"state.json")}function z(){return {installId:crypto.randomUUID(),lastShownAt:0,optOut:false,disclosureShown:false,cachedConfig:null,configFetchedAt:0,pool:[],allowedPlacements:{},sessionTopics:[],integrations:[],devToken:null,computeRouting:null,computeCards:null}}function y(e){return typeof e=="number"&&Number.isFinite(e)}function ue(e){if(typeof e!="object"||e===null)return null;let t=e;return !y(t.minIntervalSeconds)||!y(t.serveTimeoutMs)||!y(t.preloadPoolSize)||typeof t.killSwitch!="boolean"?null:{minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:t.preloadPoolSize,killSwitch:t.killSwitch,displayDurationSeconds:y(t.displayDurationSeconds)?t.displayDurationSeconds:25,minSdkVersion:typeof t.minSdkVersion=="string"?t.minSdkVersion:""}}function pe(e){if(!Array.isArray(e))return [];let t=[];for(let n of e){if(typeof n!="object"||n===null)continue;let o=n,r=o.blip;if(!y(o.renderBy)||typeof r!="object"||r===null||typeof r.impressionId!="string"||typeof r.clickUrl!="string"||typeof r.sponsorLabel!="string"||typeof r.creative!="object"||r.creative===null)continue;let s=r.creative;typeof s.title!="string"||typeof s.body!="string"||t.push({blip:{impressionId:r.impressionId,...typeof r.campaignId=="string"?{campaignId:r.campaignId}:{},clickUrl:r.clickUrl,sponsorLabel:r.sponsorLabel,creative:{format:"text",title:s.title,body:s.body,...typeof s.cta=="string"?{cta:s.cta}:{}}},renderBy:o.renderBy});}return t}function de(e){if(typeof e!="object"||e===null||Array.isArray(e))return {};let t={};for(let[n,o]of Object.entries(e)){if(!Array.isArray(o))continue;let r=o.filter(s=>typeof s=="string"&&s.length<=64);t[n]=r.slice(0,64);}return t}function fe(e){if(!Array.isArray(e))return [];let t=[];for(let n of e){if(typeof n!="object"||n===null)continue;let o=n;if(!(typeof o.topic!="string"||!y(o.at))&&(t.push({topic:o.topic.slice(0,32),at:o.at}),t.length>=24))break}return t}function ge(e){if(!Array.isArray(e))return [];let t=[],n=new Set;for(let o of e){if(typeof o!="object"||o===null)continue;let r=o;if(typeof r.key!="string"||typeof r.package!="string"||r.key===""||r.package==="")continue;let s=`${r.package}\0${r.key}`;if(!n.has(s)&&(n.add(s),t.push({key:r.key,package:r.package}),t.length>=32))break}return t}function me(e){if(typeof e!="object"||e===null)return null;let t=e,n={};if(typeof t.savedEnv=="object"&&t.savedEnv!==null)for(let[o,r]of Object.entries(t.savedEnv))(typeof r=="string"||r===null)&&(n[o]=r);return {active:t.active===true,savedEnv:n}}function he(e){if(typeof e!="object"||e===null)return null;let t=e,n=o=>y(o)&&o>=0?o:0;return {turns:n(t.turns),lastLimitAt:n(t.lastLimitAt),lastDepletedAt:n(t.lastDepletedAt),lastBackupAt:n(t.lastBackupAt)}}function ye(e){let t=z();if(typeof e!="object"||e===null)return t;let n=e;return {installId:typeof n.installId=="string"&&n.installId.length>0?n.installId:t.installId,lastShownAt:y(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:ue(n.cachedConfig),allowedPlacements:de(n.allowedPlacements),sessionTopics:fe(n.sessionTopics),integrations:ge(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:me(n.computeRouting),computeCards:he(n.computeCards),configFetchedAt:y(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:pe(n.pool)}}function h(e=process.env){let t=C(e);try{let n=p__namespace.readFileSync(t,"utf8"),o=JSON.parse(n);return ye(o)}catch{let n=z();try{G(n,e);}catch{}return n}}function G(e,t=process.env){let n=C(t),o=l__namespace.dirname(n);p__namespace.mkdirSync(o,{recursive:true});try{let i=JSON.parse(p__namespace.readFileSync(n,"utf8"));typeof i.lastShownAt=="number"&&i.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:i.lastShownAt});}catch{}let r=l__namespace.join(o,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);p__namespace.writeFileSync(r,JSON.stringify(e,null,2)+`
3
+ `,"utf8");let s=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);for(let i=0;;i++)try{p__namespace.renameSync(r,n);return}catch(u){let a=u.code??"";if(i>=4||!s.has(a)){try{p__namespace.rmSync(r,{force:!0});}catch{}if(i>=4)return;throw u}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(i+1));}catch{}}}function k(e,t=process.env){let n={...h(t),...e};return G(n,t),n}var K={claude_code:["SessionStart","Stop","SessionEnd","Notification","UserPromptSubmit","SubagentStart","SubagentStop","StopFailure","PreToolUse","PostToolUse","PostToolUseFailure","PostToolBatch","PermissionRequest","PermissionDenied","UserPromptExpansion","PreCompact","PostCompact","TaskCreated","TaskCompleted","Setup","TeammateIdle","Elicitation","ElicitationResult","ConfigChange","InstructionsLoaded","WorktreeCreate","WorktreeRemove","CwdChanged","FileChanged","MessageDisplay"],codex:["Stop","SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PermissionRequest","PreCompact","PostCompact"],openclaw:[],gemini_cli:["AfterAgent","SessionStart","SessionEnd","Notification","BeforeAgent","BeforeModel","AfterModel","BeforeToolSelection","BeforeTool","AfterTool","PreCompress"],copilot_cli:["agentStop","sessionStart","sessionEnd","notification","userPromptSubmitted","preToolUse","postToolUse","permissionRequest","errorOccurred","subagentStart","subagentStop"],generic:["SessionStart","Stop"]};var S=["claude_code","codex","gemini_cli","copilot_cli"];function w(e){return e.includes("opencrater-hook")}function ke(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Se(e,t){return w(e)&&new RegExp(`--package ['"]?${ke(t)}['"]?`).test(e)}function Q(e,t){return t?Se(e,t):w(e)&&!/--package\b/.test(e)}function V(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var q='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',W="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function H(e,t,n,o){let r=`--placement ${t}`;return n&&(r+=` --key ${V(n)}`),o&&(r+=` --package ${V(o)}`),r+=` --host ${e}`,`{ if [ -f ${q} ]; then node ${q} ${r}; else npx -y -p opencrater opencrater-hook ${r}; fi; } 2>/dev/null || true`}function be(e,t,n,o){let r=`--placement ${t}`;return n&&(r+=` --key '${n}'`),o&&(r+=` --package '${o}'`),r+=` --host ${e}`,`try { if (Test-Path "${W}") { node "${W}" ${r} } else { npx -y -p opencrater opencrater-hook ${r} } } catch {}`}function Y(e,t,n,o){return H(e,t,n,o)}function Z(e,t){let n=J__namespace.homedir();switch(e){case "claude_code":{let o=t.CLAUDE_CONFIG_DIR;return o&&o.trim()!==""?o:l__namespace.join(n,".claude")}case "codex":{let o=t.CODEX_HOME;return o&&o.trim()!==""?o:l__namespace.join(n,".codex")}case "gemini_cli":return l__namespace.join(n,".gemini");case "copilot_cli":{let o=t.COPILOT_HOME;return o&&o.trim()!==""?o:l__namespace.join(n,".copilot")}default:return l__namespace.join(n,".opencrater-unknown")}}function R(e,t=process.env){let n=Z(e,t);switch(e){case "claude_code":return l__namespace.join(n,"settings.json");case "codex":return l__namespace.join(n,"hooks.json");case "gemini_cli":return l__namespace.join(n,"settings.json");case "copilot_cli":return l__namespace.join(n,"hooks","hooks.json");default:return l__namespace.join(n,"hooks.json")}}var we={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"]};function ve(e,t){if(e.length===0)return false;let n=(t.PATH??t.Path??"").split(l__namespace.delimiter).filter(Boolean),o=process.platform==="win32"?["",".exe",".cmd",".bat"]:[""];for(let r of n)for(let s of e)for(let i of o)try{if(p__namespace.existsSync(l__namespace.join(r,s+i)))return !0}catch{}return false}function Ce(e,t=process.env){try{if(p__namespace.existsSync(Z(e,t)))return !0}catch{}return ve(we[e]??[],t)}function _(e=process.env){return S.filter(t=>Ce(t,e))}function E(e){let t;try{t=p__namespace.readFileSync(e,"utf8");}catch{return {}}let n=JSON.parse(t);if(typeof n!="object"||n===null||Array.isArray(n))throw new Error(`${e} is not a JSON object`);return n}function M(e,t){let n=l__namespace.dirname(e);p__namespace.mkdirSync(n,{recursive:true});let o=l__namespace.join(n,`.${l__namespace.basename(e)}.${process.pid}.tmp`);p__namespace.writeFileSync(o,JSON.stringify(t,null,2)+`
4
+ `,"utf8"),p__namespace.renameSync(o,e);}function Oe(e,t){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&Q(n.command,t))}function Ae(e,t,n,o){let r=R(e),s=E(r),i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(o.every(a=>{let d=Y(e,a,t,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>Array.isArray(c.hooks)&&c.hooks.some(m=>m.command===d))}))return "nochange";for(let a of o){let c=(Array.isArray(i[a])?i[a]:[]).filter(m=>!Oe(m,n));c.push({matcher:"",hooks:[{type:"command",command:Y(e,a,t,n)}]}),i[a]=c;}return s.hooks=i,M(r,s),"wrote"}function Pe(e,t){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&Q(n,t))}function Re(e,t,n,o){let r=R(e),s=E(r);typeof s.version!="number"&&(s.version=1);let i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(o.every(a=>{let d=H(e,a,t,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>c.bash===d)}))return "nochange";for(let a of o){let c=(Array.isArray(i[a])?i[a]:[]).filter(m=>!Pe(m,n));c.push({type:"command",bash:H(e,a,t,n),powershell:be(e,a,t,n),timeoutSec:5}),i[a]=c;}return s.hooks=i,M(r,s),"wrote"}function I(e){return [...K[e]]}function U(e,t,n){let o=I(e);return o.length===0?"nochange":e==="copilot_cli"?Re(e,t,n,o):Ae(e,t,n,o)}function O(e,t,n=process.env){return _(n).map(o=>{try{let r=U(o,e,t);return {host:o,status:r,events:I(o)}}catch(r){return {host:o,status:"error",events:[],error:r.message}}})}function B(e=process.env){let t=[];for(let n of S){let o;try{o=E(R(n,e));}catch{continue}let r=o.hooks;if(!(!r||typeof r!="object"))for(let[s,i]of Object.entries(r))for(let u of Array.isArray(i)?i:[]){let a=u,d=Array.isArray(a.hooks)?a.hooks.find(f=>typeof f.command=="string"&&w(f.command))?.command:void 0,c=[a.bash,a.command,a.powershell].find(f=>typeof f=="string"&&w(f)),m=d??c;m&&t.push({host:n,event:s,command:m});}}return t}function ee(e=process.env){let t=0;for(let n of S){let o=R(n,e),r;try{r=E(o);}catch{continue}let s=r.hooks;if(!s||typeof s!="object")continue;let i=s,u=false;for(let a of Object.keys(i)){let d=Array.isArray(i[a])?i[a]:[],c=d.filter(m=>{let f=m,L=Array.isArray(f.hooks)&&f.hooks.some(v=>typeof v.command=="string"&&w(v.command))||[f.bash,f.powershell,f.command].some(v=>typeof v=="string"&&w(v));return L&&t++,!L});c.length!==d.length&&(u=true,c.length>0?i[a]=c:delete i[a]);}if(u)try{let a=Object.keys(r).filter(c=>c!=="version"&&c!=="hooks"),d=n==="copilot_cli"||n==="codex";Object.keys(i).length===0&&a.length===0&&d?p__namespace.rmSync(o,{force:!0}):M(o,r);}catch{}}return t}var A="1.1.17";var Ee="https://api.opencrater.to";function $(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:Ee)).replace(/\/+$/,"")}function $e(){return l__namespace.join(J__namespace.homedir(),".config","opencrater","runtime")}function xe(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function x(e=$e()){if(process.env.VITEST||process.env.OPENCRATER_DISABLE_RUNTIME_PIN)return false;try{return child_process.spawnSync("npm",xe(e),{stdio:"ignore",windowsHide:!0,shell:process.platform==="win32"}).status===0}catch{return false}}function Ne(){let e=process.env.OPENCRATER_WEB_ORIGIN;return e&&e.trim()!==""?e.replace(/\/$/,""):$().replace("//api.","//").replace(/\/$/,"")}function Te(e){try{let t=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";child_process.spawn(t,[e],{stdio:"ignore",detached:!0,shell:process.platform==="win32"}).unref();}catch{}}function je(e){let t=re__namespace.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>t.question(e,o=>(t.close(),n(o))))}function F(e){return `$${(e/1e6).toFixed(2)}`}async function D(e,t){try{let n=new URL(`${$()}/v1/dev/me`);t&&n.searchParams.set("installId",t);let o=await fetch(n,{headers:{authorization:`Bearer ${e}`}});return o.ok?await o.json():null}catch{return null}}async function He(){let e=`${Ne()}/dev/link`;console.log("Sign in and generate a CLI token here (we tried to open it):"),console.log(` ${e}
5
+ `),Te(e);let t=(await je("Paste your token (ocd_\u2026): ")).trim();if(!t.startsWith("ocd_"))return console.error("That doesn't look like a token (should start with ocd_)."),1;let n=await D(t,h().installId);if(!n)return console.error("Couldn't verify that token \u2014 check it and try again."),1;k({devToken:t}),console.log(`
6
+ \u2713 Signed in as ${n.displayName}.`),console.log(` Compute balance: ${F(n.balanceMicroUsd)} \xB7 tier: ${n.trustTier}`);let o=O().filter(r=>r.status!=="error").map(r=>r.host);return o.length?(console.log(` Wired into: ${o.join(", ")}`),process.stdout.write(" Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(x()?"\u2713":"skipped (hooks use npx fallback)")):console.log(" No supported AI CLIs detected yet \u2014 they'll wire automatically once you install one."),console.log(" See Blips in your sessions to earn your weekly compute."),0}async function _e(){let e=h().devToken;if(!e)return console.error("Not signed in. Run: opencrater login"),1;let t=await D(e,h().installId);return t?(console.log(`Compute balance: ${F(t.balanceMicroUsd)}`),console.log(` signed in as: ${t.displayName} \xB7 tier: ${t.trustTier}`),0):(console.error("Couldn't reach OpenCrater (or your session expired \u2014 try: opencrater login)."),1)}function Me(){return k({devToken:null}),console.log("Signed out of the OpenCrater compute wallet on this machine."),0}async function Ue(e){let t=h().devToken;if(!t)return console.error("Not signed in. Run: opencrater login"),1;let n=await D(t,h().installId);if(n&&n.balanceMicroUsd<=0)return console.error("Your OpenCrater compute balance is empty \u2014 see Blips to earn more."),console.error("Check anytime with: opencrater balance"),1;let o=`${$().replace(/\/$/,"")}/gateway`,r=l__namespace.join(l__namespace.dirname(C()),"claude-gateway.settings.json");try{p__namespace.mkdirSync(l__namespace.dirname(r),{recursive:!0}),p__namespace.writeFileSync(r,JSON.stringify({apiKeyHelper:`echo ${t}`}),{mode:384});}catch(u){return console.error(`Couldn't write gateway settings: ${u.message}`),1}n&&console.log(`Launching Claude Code on OpenCrater compute \xB7 balance ${F(n.balanceMicroUsd)}`);let s={...process.env,ANTHROPIC_BASE_URL:o};delete s.ANTHROPIC_API_KEY;let i=child_process.spawn("claude",[...e,"--settings",r],{stdio:"inherit",env:s,shell:process.platform==="win32"});return await new Promise(u=>{i.on("exit",a=>u(a??0)),i.on("error",a=>{console.error(`Couldn't launch claude: ${a.message}`),console.error("Is Claude Code installed? https://claude.com/claude-code"),u(127);});})}function ie(e){let t=new Map,n=[];for(let o=0;o<e.length;o++){let r=e[o];if(r!==void 0)if(r.startsWith("--")){let s=r.indexOf("=");if(s!==-1)t.set(r.slice(2,s),r.slice(s+1));else {let i=e[o+1];i!==void 0&&!i.startsWith("--")?(t.set(r.slice(2),i),o++):t.set(r.slice(2),"true");}}else n.push(r);}return {flags:t,rest:n}}function ae(e,t){let n=h();n.integrations.some(o=>o.key===e&&o.package===t)||k({integrations:[...n.integrations,{key:e,package:t}].slice(-32)});}function N(e,t){let n=t||"compute hooks";if(e.length===0){console.log(`No supported AI CLIs detected yet \u2014 OpenCrater will wire ${n} automatically the moment you install one (it re-checks on the next session).`);return}console.log(`OpenCrater wired ${n} into:`);for(let o of e)if(o.status==="error")console.log(` \u2717 ${o.host}: ${o.error}`);else {let r=o.status==="nochange"?" \u2014 already set up":"";console.log(` \u2022 ${o.host} (${o.events.join(", ")})${r}`);}}function Be(){return k({optOut:true}),console.log("OpenCrater Blips are now OFF for this machine."),console.log("Re-enable any time with: npx opencrater on"),0}function Fe(e){let{flags:t}=ie(e),n=t.get("key"),o=t.get("package");return k({optOut:false}),n&&o?(ae(n,o),N(O(n,o),o),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(x()?"\u2713":"skipped (npm unavailable \u2014 hooks use npx fallback)")):h().devToken?(N(O()),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(x()?"\u2713":"skipped (npm unavailable \u2014 hooks use npx fallback)")):(console.log("OpenCrater Blips are now ON for this machine."),console.log("Earn compute: run `opencrater login` (no package needed)."),console.log("Earn cash as a publisher: `opencrater on --key <key> --package <name>`.")),console.log("Opt out any time with: npx opencrater off"),0}function De(){let e=h(),t=e.lastShownAt>0?new Date(e.lastShownAt).toISOString():"never";console.log(`opencrater v${A}`),console.log(` state file: ${C()}`),console.log(` install id: ${e.installId}`),console.log(` opted out: ${e.optOut?"yes":"no"}`),console.log(` last shown: ${t}`),console.log(` pooled Blips: ${e.pool.length}`),console.log(` hosts found: ${_().join(", ")||"(none)"}`),console.log(` integrations: ${e.integrations.map(o=>o.package).join(", ")||"(none)"}`);let n=B();return console.log(` wired hooks: ${n.length}`),0}function Le(e){let{flags:t}=ie(e),n=t.get("key"),o=t.get("package");if(!n||!o)return console.error("Usage: opencrater hooks install --key <publisherKey> --package <name> [--host <host>]"),1;ae(n,o);let r=t.get("host");if(r&&r!=="true"){if(!S.includes(r))return console.error(`Unknown host "${r}". Supported: ${S.join(", ")}`),1;let s=r;try{let i=U(s,n,o);N([{host:s,status:i,events:I(s)}],o);}catch(i){return console.error(`Could not wire ${s}: ${i.message}`),1}}else N(O(n,o),o);return console.log("Remove with: npx opencrater hooks uninstall"),0}function Je(){let e=ee();return k({integrations:[]}),console.log(e>0?`Removed ${e} OpenCrater hook${e===1?"":"s"} across all hosts.`:"No OpenCrater hooks installed."),0}function ze(){let e=B();if(e.length===0)return console.log("No OpenCrater hooks installed."),0;for(let t of e)console.log(`${t.host} ${t.event}: ${t.command}`);return 0}function oe(){return console.log(`opencrater v${A} \u2014 OpenCrater Blips
7
7
 
8
8
  Usage:
9
9
  opencrater on [--key <ock_\u2026> --package <name>]
@@ -24,4 +24,4 @@ Usage:
24
24
  opencrater hooks list List installed OpenCrater hooks
25
25
 
26
26
  Hosts: ${S.join(", ")}
27
- Environment: OPENCRATER_DISABLE=1 disables everything; NO_COLOR respected.`),0}function ze(e){let[t,...n]=e;switch(t){case "off":return Me();case "on":return Ue(n);case "login":return je();case "balance":return He();case "logout":return _e();case "code":return Fe(n);case "status":return Be();case "hooks":{let[o,...r]=n;switch(o){case "install":return De(r);case "uninstall":return Le();case "list":return Je();default:return console.error("Usage: opencrater hooks <install|uninstall|list>"),1}}case "version":case "--version":case "-v":return console.log(O),0;case void 0:case "help":case "--help":case "-h":return oe();default:return console.error(`Unknown command: ${t}`),oe(),1}}typeof x<"u"&&typeof module<"u"&&x.main===module&&Promise.resolve().then(()=>ze(process.argv.slice(2))).then(e=>{process.exitCode=e;}).catch(e=>{console.error(`opencrater: ${e.message}`),process.exitCode=1;});exports.runCli=ze;
27
+ Environment: OPENCRATER_DISABLE=1 disables everything; NO_COLOR respected.`),0}function Ge(e){let[t,...n]=e;switch(t){case "off":return Be();case "on":return Fe(n);case "login":return He();case "balance":return _e();case "logout":return Me();case "code":return Ue(n);case "status":return De();case "hooks":{let[o,...r]=n;switch(o){case "install":return Le(r);case "uninstall":return Je();case "list":return ze();default:return console.error("Usage: opencrater hooks <install|uninstall|list>"),1}}case "version":case "--version":case "-v":return console.log(A),0;case void 0:case "help":case "--help":case "-h":return oe();default:return console.error(`Unknown command: ${t}`),oe(),1}}typeof j<"u"&&typeof module<"u"&&j.main===module&&Promise.resolve().then(()=>Ge(process.argv.slice(2))).then(e=>{process.exitCode=e;}).catch(e=>{console.error(`opencrater: ${e.message}`),process.exitCode=1;});exports.runCli=Ge;
package/dist/hook.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var child_process=require('child_process'),u=require('fs'),R=require('os'),g=require('path'),crypto=require('crypto');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var u__namespace=/*#__PURE__*/_interopNamespace(u);var R__namespace=/*#__PURE__*/_interopNamespace(R);var g__namespace=/*#__PURE__*/_interopNamespace(g);var P=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var M={minIntervalSeconds:600,serveTimeoutMs:2500,preloadPoolSize:3,killSwitch:false,displayDurationSeconds:25,minSdkVersion:""},ae={claude_code:["SessionStart","Stop","SessionEnd","Notification"],codex:["Stop"],openclaw:[],gemini_cli:["AfterAgent","SessionStart","SessionEnd"],copilot_cli:["agentStop","sessionStart","sessionEnd","notification"],generic:["SessionStart","Stop"]},ce={claude_code:["SessionStart","Stop","SessionEnd","Notification","UserPromptSubmit","SubagentStart","SubagentStop","StopFailure","PreToolUse","PostToolUse","PostToolUseFailure","PostToolBatch","PermissionRequest","PermissionDenied","UserPromptExpansion","PreCompact","PostCompact","TaskCreated","TaskCompleted","Setup","TeammateIdle","Elicitation","ElicitationResult","ConfigChange","InstructionsLoaded","WorktreeCreate","WorktreeRemove","CwdChanged","FileChanged","MessageDisplay"],codex:["Stop","SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PermissionRequest","PreCompact","PostCompact"],openclaw:[],gemini_cli:["AfterAgent","SessionStart","SessionEnd","Notification","BeforeAgent","BeforeModel","AfterModel","BeforeToolSelection","BeforeTool","AfterTool","PreCompress"],copilot_cli:["agentStop","sessionStart","sessionEnd","notification","userPromptSubmitted","preToolUse","postToolUse","permissionRequest","errorOccurred","subagentStart","subagentStop"],generic:["SessionStart","Stop"]};var E="1.1.16";var et="https://api.opencrater.to";function V(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return ((n&&n.trim()!==""?n:et)).replace(/\/+$/,"")}function h(...e){try{if(process.env.OPENCRATER_DEBUG!=="1")return;console.error("[opencrater]",...e);try{let t=P("os"),n=P("fs"),r=P("path");n.appendFileSync(r.join(t.homedir(),".config","opencrater","hook.log"),`${new Date().toISOString()} [opencrater] ${e.map(o=>String(o)).join(" ")}
3
- `);}catch{}}catch{}}function B(e){return typeof e=="number"&&Number.isFinite(e)}function tt(e){let t=M;if(typeof e!="object"||e===null)return {...t};let n=e;return {minIntervalSeconds:B(n.minIntervalSeconds)?n.minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:B(n.serveTimeoutMs)?n.serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:B(n.preloadPoolSize)?n.preloadPoolSize:t.preloadPoolSize,killSwitch:n.killSwitch===true,displayDurationSeconds:B(n.displayDurationSeconds)?n.displayDurationSeconds:t.displayDurationSeconds,minSdkVersion:typeof n.minSdkVersion=="string"?n.minSdkVersion:t.minSdkVersion}}async function j(e,t,n,r,o){try{let i=await fetch(`${e}${t}`,{method:"POST",headers:{"content-type":"application/json",...o??{}},body:JSON.stringify(n),signal:AbortSignal.timeout(r)});return i.ok?await i.json():(h(`POST ${t} -> HTTP ${i.status}`),null)}catch(i){return h(`POST ${t} failed:`,i),null}}function le(e,t){let n=e.host??"generic";return {publisherKey:e.publisherKey,packageName:e.packageName,placement:e.placement,host:n,sdkVersion:E,installId:t.installId,os:process.platform,termProgram:process.env.TERM_PROGRAM??void 0,topics:t.topics&&t.topics.length>0?t.topics:void 0}}function ue(e){if(typeof e!="object"||e===null)return null;let t=e;if(typeof t.fill!="boolean")return null;let n={fill:t.fill,fallback:t.fallback??null,config:tt(t.config),...Array.isArray(t.allowedPlacements)?{allowedPlacements:t.allowedPlacements.filter(r=>typeof r=="string")}:{}};return t.blip!==void 0&&t.blip!==null&&(n.blip=t.blip),typeof t.computeBalanceMicroUsd=="number"&&(n.computeBalanceMicroUsd=t.computeBalanceMicroUsd),typeof t.weeklyGrantMicroUsd=="number"&&(n.weeklyGrantMicroUsd=t.weeklyGrantMicroUsd),n}async function pe(e,t){let n=await j(t.origin,"/v1/serve",le(e,t),t.timeoutMs);return ue(n)}async function de(e,t,n){let r={...le(t,n),publisherKey:t.publisherKey??"",packageName:t.packageName??""},o=await j(n.origin,"/v1/dev/serve",r,n.timeoutMs,{authorization:`Bearer ${e}`});return ue(o)}function fe(e,t,n){return j(n.origin,"/v1/dev/impression",{impressionId:t},n.timeoutMs,{authorization:`Bearer ${e}`}).then(()=>{}).catch(()=>{})}function W(e,t){return j(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}function me(e){let t={sponsorLabel:e.sponsorLabel,title:e.creative.title,body:e.creative.body,url:e.clickUrl};return e.creative.cta!==void 0&&(t.cta=e.creative.cta),t}function ge(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function L(e){let t=me(e),n=e.creative;switch(n.format){case "image":case "gif":return {...t,body:n.textFallback??t.body};case "video":return {...t,body:n.textFallback??t.body,cta:t.cta??"\u25B6 Watch"};case "audio":return {...t,body:n.textFallback??t.body,cta:t.cta??"\u{1F50A} Listen"};default:return t}}function $(e=process.env){return g__namespace.join(R__namespace.homedir(),".config","opencrater")}function ye(e=process.env){return g__namespace.join($(e),"state.json")}function Se(){return {installId:crypto.randomUUID(),lastShownAt:0,optOut:false,disclosureShown:false,cachedConfig:null,configFetchedAt:0,pool:[],allowedPlacements:{},sessionTopics:[],integrations:[],devToken:null,computeRouting:null,computeCards:null}}function k(e){return typeof e=="number"&&Number.isFinite(e)}function ot(e){if(typeof e!="object"||e===null)return null;let t=e;return !k(t.minIntervalSeconds)||!k(t.serveTimeoutMs)||!k(t.preloadPoolSize)||typeof t.killSwitch!="boolean"?null:{minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:t.preloadPoolSize,killSwitch:t.killSwitch,displayDurationSeconds:k(t.displayDurationSeconds)?t.displayDurationSeconds:25,minSdkVersion:typeof t.minSdkVersion=="string"?t.minSdkVersion:""}}function rt(e){if(!Array.isArray(e))return [];let t=[];for(let n of e){if(typeof n!="object"||n===null)continue;let r=n,o=r.blip;if(!k(r.renderBy)||typeof o!="object"||o===null||typeof o.impressionId!="string"||typeof o.clickUrl!="string"||typeof o.sponsorLabel!="string"||typeof o.creative!="object"||o.creative===null)continue;let i=o.creative;typeof i.title!="string"||typeof i.body!="string"||t.push({blip:{impressionId:o.impressionId,...typeof o.campaignId=="string"?{campaignId:o.campaignId}:{},clickUrl:o.clickUrl,sponsorLabel:o.sponsorLabel,creative:{format:"text",title:i.title,body:i.body,...typeof i.cta=="string"?{cta:i.cta}:{}}},renderBy:r.renderBy});}return t}function it(e){if(typeof e!="object"||e===null||Array.isArray(e))return {};let t={};for(let[n,r]of Object.entries(e)){if(!Array.isArray(r))continue;let o=r.filter(i=>typeof i=="string"&&i.length<=64);t[n]=o.slice(0,64);}return t}function st(e){if(!Array.isArray(e))return [];let t=[];for(let n of e){if(typeof n!="object"||n===null)continue;let r=n;if(!(typeof r.topic!="string"||!k(r.at))&&(t.push({topic:r.topic.slice(0,32),at:r.at}),t.length>=24))break}return t}function at(e){if(!Array.isArray(e))return [];let t=[],n=new Set;for(let r of e){if(typeof r!="object"||r===null)continue;let o=r;if(typeof o.key!="string"||typeof o.package!="string"||o.key===""||o.package==="")continue;let i=`${o.package}\0${o.key}`;if(!n.has(i)&&(n.add(i),t.push({key:o.key,package:o.package}),t.length>=32))break}return t}function ct(e){if(typeof e!="object"||e===null)return null;let t=e,n={};if(typeof t.savedEnv=="object"&&t.savedEnv!==null)for(let[r,o]of Object.entries(t.savedEnv))(typeof o=="string"||o===null)&&(n[r]=o);return {active:t.active===true,savedEnv:n}}function lt(e){if(typeof e!="object"||e===null)return null;let t=e,n=r=>k(r)&&r>=0?r:0;return {turns:n(t.turns),lastLimitAt:n(t.lastLimitAt),lastDepletedAt:n(t.lastDepletedAt),lastBackupAt:n(t.lastBackupAt)}}function ut(e){let t=Se();if(typeof e!="object"||e===null)return t;let n=e;return {installId:typeof n.installId=="string"&&n.installId.length>0?n.installId:t.installId,lastShownAt:k(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:ot(n.cachedConfig),allowedPlacements:it(n.allowedPlacements),sessionTopics:st(n.sessionTopics),integrations:at(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:ct(n.computeRouting),computeCards:lt(n.computeCards),configFetchedAt:k(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:rt(n.pool)}}function q(e=process.env){let t=ye(e);try{let n=u__namespace.readFileSync(t,"utf8"),r=JSON.parse(n);return ut(r)}catch{let n=Se();try{y(n,e);}catch{}return n}}function y(e,t=process.env){let n=ye(t),r=g__namespace.dirname(n);u__namespace.mkdirSync(r,{recursive:true});try{let s=JSON.parse(u__namespace.readFileSync(n,"utf8"));typeof s.lastShownAt=="number"&&s.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:s.lastShownAt});}catch{}let o=g__namespace.join(r,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);u__namespace.writeFileSync(o,JSON.stringify(e,null,2)+`
4
- `,"utf8");let i=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);for(let s=0;;s++)try{u__namespace.renameSync(o,n);return}catch(c){let a=c.code??"";if(s>=4||!i.has(a)){try{u__namespace.rmSync(o,{force:!0});}catch{}if(s>=4)return;throw c}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(s+1));}catch{}}}var pt=300*1e3;function dt(){return g__namespace.join($(),"blocked-ads.json")}function X(){return g__namespace.join($(),"recent-renders.json")}function ft(){return g__namespace.join($(),"reported-ads.json")}function be(e,t){let n={};for(let[r,o]of Object.entries(e))typeof o=="number"&&Number.isFinite(o)&&o>t&&(n[r]=o);return n}function mt(e){try{let t=JSON.parse(u__namespace.readFileSync(dt(),"utf8"));return be(t&&typeof t=="object"?t:{},e)}catch{return {}}}function gt(){try{let e=JSON.parse(u__namespace.readFileSync(ft(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return {}}}function ht(e){return e?gt()[e]!==void 0:false}function H(e,t=Date.now()){return e?mt(t)[e]!==void 0||ht(e):false}function ke(e){try{let t=JSON.parse(u__namespace.readFileSync(X(),"utf8"));return be(t&&typeof t=="object"?t:{},e)}catch{return {}}}function U(e,t=Date.now()){if(e)try{let n=ke(t);n[e]=t+pt,u__namespace.mkdirSync(g__namespace.dirname(X()),{recursive:!0}),u__namespace.writeFileSync(X(),JSON.stringify(n));}catch{}}function F(e,t=Date.now()){return e?ke(t)[e]!==void 0:false}function yt(e,t){return e.filter(n=>n.renderBy>t)}function Z(e,t){let n=yt(e.pool,t),r=n.shift();return {blip:r?r.blip:null,pool:n}}var St=["claude_code","codex","gemini_cli","copilot_cli"];function bt(e){return e.includes("opencrater-hook")}function kt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Te(e,t){return bt(e)&&new RegExp(`--package ['"]?${kt(t)}['"]?`).test(e)}function we(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var ve='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',Ce="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function Q(e,t,n,r){let o=`--placement ${t} --key ${we(n)} --package ${we(r)} --host ${e}`;return `{ if [ -f ${ve} ]; then node ${ve} ${o}; else npx -y -p opencrater opencrater-hook ${o}; fi; } 2>/dev/null || true`}function wt(e,t,n,r){let o=`--placement ${t} --key '${n}' --package '${r}' --host ${e}`;return `try { if (Test-Path "${Ce}") { node "${Ce}" ${o} } else { npx -y -p opencrater opencrater-hook ${o} } } catch {}`}function Re(e,t,n,r){return Q(e,t,n,r)}function Oe(e,t){let n=R__namespace.homedir();switch(e){case "claude_code":{let r=t.CLAUDE_CONFIG_DIR;return r&&r.trim()!==""?r:g__namespace.join(n,".claude")}case "codex":{let r=t.CODEX_HOME;return r&&r.trim()!==""?r:g__namespace.join(n,".codex")}case "gemini_cli":return g__namespace.join(n,".gemini");case "copilot_cli":{let r=t.COPILOT_HOME;return r&&r.trim()!==""?r:g__namespace.join(n,".copilot")}default:return g__namespace.join(n,".opencrater-unknown")}}function J(e,t=process.env){let n=Oe(e,t);switch(e){case "claude_code":return g__namespace.join(n,"settings.json");case "codex":return g__namespace.join(n,"hooks.json");case "gemini_cli":return g__namespace.join(n,"settings.json");case "copilot_cli":return g__namespace.join(n,"hooks","hooks.json");default:return g__namespace.join(n,"hooks.json")}}var vt={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"]};function Ct(e,t){if(e.length===0)return false;let n=(t.PATH??t.Path??"").split(g__namespace.delimiter).filter(Boolean),r=process.platform==="win32"?["",".exe",".cmd",".bat"]:[""];for(let o of n)for(let i of e)for(let s of r)try{if(u__namespace.existsSync(g__namespace.join(o,i+s)))return !0}catch{}return false}function Rt(e,t=process.env){try{if(u__namespace.existsSync(Oe(e,t)))return !0}catch{}return Ct(vt[e]??[],t)}function ee(e=process.env){return St.filter(t=>Rt(t,e))}function _e(e){let t;try{t=u__namespace.readFileSync(e,"utf8");}catch{return {}}let n=JSON.parse(t);if(typeof n!="object"||n===null||Array.isArray(n))throw new Error(`${e} is not a JSON object`);return n}function Ie(e,t){let n=g__namespace.dirname(e);u__namespace.mkdirSync(n,{recursive:true});let r=g__namespace.join(n,`.${g__namespace.basename(e)}.${process.pid}.tmp`);u__namespace.writeFileSync(r,JSON.stringify(t,null,2)+`
5
- `,"utf8"),u__namespace.renameSync(r,e);}function Et(e,t){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&Te(n.command,t))}function Tt(e,t,n,r){let o=J(e),i=_e(o),s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let d=Re(e,a,t,n);return (Array.isArray(s[a])?s[a]:[]).some(f=>Array.isArray(f.hooks)&&f.hooks.some(l=>l.command===d))}))return "nochange";for(let a of r){let f=(Array.isArray(s[a])?s[a]:[]).filter(l=>!Et(l,n));f.push({matcher:"",hooks:[{type:"command",command:Re(e,a,t,n)}]}),s[a]=f;}return i.hooks=s,Ie(o,i),"wrote"}function Ot(e,t){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&Te(n,t))}function _t(e,t,n,r){let o=J(e),i=_e(o);typeof i.version!="number"&&(i.version=1);let s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let d=Q(e,a,t,n);return (Array.isArray(s[a])?s[a]:[]).some(f=>f.bash===d)}))return "nochange";for(let a of r){let f=(Array.isArray(s[a])?s[a]:[]).filter(l=>!Ot(l,n));f.push({type:"command",bash:Q(e,a,t,n),powershell:wt(e,a,t,n),timeoutSec:5}),s[a]=f;}return i.hooks=s,Ie(o,i),"wrote"}function Ae(e){return [...ce[e]]}function It(e,t,n){let r=Ae(e);return r.length===0?"nochange":e==="copilot_cli"?_t(e,t,n,r):Tt(e,t,n,r)}function Pe(e,t,n=process.env){return ee(n).map(r=>{try{let o=It(r,e,t);return {host:r,status:o,events:Ae(r)}}catch(o){return {host:r,status:"error",events:[],error:o.message}}})}function Pt(){return g__namespace.join(R__namespace.homedir(),".config","opencrater","runtime")}function xt(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function te(e=Pt()){child_process.spawn("npm",xt(e),process.platform==="win32"?{detached:false,stdio:"ignore",windowsHide:true,shell:true}:{detached:true,stdio:"ignore"}).unref();}var $e={atLimit:false,resetAt:null};function De(e,t=R__namespace.homedir()){try{if(e==="claude_code")return Nt(t);if(e==="codex")return Mt(t)}catch{}return $e}function Nt(e){let t=u__namespace.readFileSync(g__namespace.join(e,".claude.json"),"utf8"),n=JSON.parse(t),r=n.hasAvailableSubscription===false||n.cachedExtraUsageDisabledReason==="out_of_credits",o=null,c=n.cachedGrowthBookFeatures?.tengu_saffron_lattice?.planLimitsEndDate;if(typeof c=="string"){let a=Date.parse(c);Number.isFinite(a)&&(o=a);}return {atLimit:r,resetAt:o}}function Mt(e){return u__namespace.accessSync(g__namespace.join(e,".codex","auth.json")),$e}function Be(e,t){switch(e){case "gemini_cli":return t==="AfterAgent";case "copilot_cli":return t==="agentStop";default:return t==="Stop"}}var je=36e5,$t=30*6e4,Dt=30*6e4,Bt=4*je,jt=3,G="https://opencrater.to/dashboard";function K(e){return `$${(e/1e6).toFixed(2)}`}function Lt(e,t){return t<=0?0:Math.max(0,Math.min(100,Math.round(e/t*100)))}function Ht(e,t){if(!e||e<=t)return "";let n=e-t,r=n>=864e5?`${Math.floor(n/864e5)}d`:`${Math.max(1,Math.floor(n/je))}h`,o=new Date(e).toISOString().slice(0,10);return ` Your host limit resets in ${r} (${o}).`}function Le(e){let{balanceMicroUsd:t,weeklyGrantMicroUsd:n,onGateway:r,turnEnd:o,host:i,cc:s,now:c}=e;if(t===null)return null;if(t<=0)return c-(s.lastDepletedAt??0)<Dt?null:{kind:"depleted",card:{sponsorLabel:"OpenCrater",title:"Compute used up",body:"Keep coding in Codex / Copilot to earn more compute, then switch back to Claude Code."+Ht(i.resetAt,c),url:G,cta:"Earn more"}};if(r){if(!o||(s.turns??0)%jt!==0)return null;let a=n&&n>0?Lt(t,n):null;return {kind:"hud",card:{sponsorLabel:"OpenCrater",title:"Running on OpenCrater compute",body:a!==null?`${a}% of your weekly compute left \u2014 ${K(t)} remaining.`:`${K(t)} of compute remaining this week.`,url:G,cta:"Wallet"}}}return i.atLimit?c-(s.lastLimitAt??0)<$t?null:{kind:"limit",card:{sponsorLabel:"OpenCrater",title:"Hit your limit? You've got compute",body:`${K(t)} of OpenCrater compute is ready. Continue this session now: opencrater code -c`,url:G,cta:"opencrater code -c"}}:c-(s.lastBackupAt??0)>=Bt?{kind:"backup",card:{sponsorLabel:"OpenCrater",title:"Backup compute ready",body:`${K(t)} of OpenCrater compute waiting. When you hit your limit: opencrater code -c`,url:G,cta:"opencrater code -c"}}:null}var Gt=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function oe(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function Kt(e){return oe(e.OPENCRATER_DISABLE)||oe(e.TSN_DISABLE)}function Yt(e){return Gt.some(t=>oe(e[t]))}function z(e){return e?{...M,...e}:M}function Ye(e,t={}){if(Kt(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=z(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(Yt(e.env))return "ci";if(!t.skipTTY&&false);if(!t.skipFrequency){let r=n.minIntervalSeconds*1e3;if(e.state.lastShownAt>0&&e.now-e.state.lastShownAt<r)return "frequency"}return null}var zt=new Set(["the","and","for","but","not","you","all","any","can","this","that","with","have","will","your","from","they","what","when","where","how","why","make","fix","add","update","remove","create","delete","change","error","errors","bug","bugs","file","files","code","test","tests","run","running","build","please","help","want","need","should","would","could","into","about","then","here","there","now","new","use","using","used","work","working","works","check","show","see","look","get","set","let","lets","dont","cant","issue"]);function Vt(e){if(e.includes("/")||e.includes("\\")||e.includes("@")||e.includes("://"))return true;let t=e.toLowerCase();return !!(/^(sk|pk|rk|ock|ghp|gho|ghs|xox|akia|eyj|npm|glpat)[-_]/.test(t)||e.length>=16&&/^[0-9a-f]+$/i.test(e)||e.length>=20&&/^[A-Za-z0-9+/=_-]+$/.test(e)&&/[A-Z]/.test(e)&&/[0-9]/.test(e))}function Wt(e,t=12){let n=[];for(let r of e.slice(0,2e3).split(/\s+/))if(!(!r||Vt(r)))for(let o of r.split(/[^A-Za-z0-9+#.]+|(?<=[a-z0-9])(?=[A-Z])/)){let i=o.replace(/^[.]+|[.]+$/g,"").toLowerCase();if(!(i.length<3||i.length>24)&&!(/^\d+$/.test(i)||zt.has(i))&&!n.includes(i)&&(n.push(i),n.length>=t))return n}return n}function re(e){let t=[];typeof e.prompt=="string"&&t.push(e.prompt);let n=e.cwd;if(typeof n=="string"&&n.length>0){let r=n.replace(/[\\/]+$/,""),o=r.split(/[\\/]/).pop()??"",i=(process.env.HOME??process.env.USERPROFILE??"").replace(/[\\/]+$/,""),s=process.env.USER??process.env.USERNAME??"";r!==i&&o!==s&&o.length>0&&t.push(o.replace(/[-_]/g," "));}return Wt(t.join(" "))}function ie(e,t,n){let r=new Map;for(let{topic:o,at:i}of e)n-i<216e5&&r.set(o,i);for(let o of t)r.set(o,n);return [...r.entries()].map(([o,i])=>({topic:o,at:i})).sort((o,i)=>i.at-o.at).slice(0,24)}function ze(e,t){return e.filter(({at:n})=>t-n<216e5).sort((n,r)=>r.at-n.at).slice(0,12).map(({topic:n})=>n)}var Zt=false,Qt=process.platform==="win32"?8e3:3200,en=150,Ve=250,tn=2800;function nn(e){let t={host:"claude_code"};for(let n=0;n<e.length;n++){let r=e[n],o=e[n+1];switch(r){case "--placement":o!==void 0&&(t.placement=o,n++);break;case "--key":o!==void 0&&(t.key=o,n++);break;case "--package":o!==void 0&&(t.package=o,n++);break;case "--host":(o==="claude_code"||o==="codex"||o==="openclaw"||o==="gemini_cli"||o==="copilot_cli"||o==="generic")&&(t.host=o,n++);break;}}return t}function on(e){return new Promise(t=>{if(process.stdin.isTTY){t("");return}let n="",r=false,o=()=>{r||(r=true,t(n));},i=setTimeout(o,e);i.unref?.(),process.stdin.setEncoding("utf8"),process.stdin.on("data",s=>{n+=s;}),process.stdin.on("end",()=>{clearTimeout(i),o();}),process.stdin.on("error",()=>{clearTimeout(i),o();});})}var rn="\\\\.\\CONOUT$";function sn(e){return !e||e==="?"||e==="??"||e==="-"?null:e.startsWith("/")?e:`/dev/${e}`}function an(e){let t=e.match(/^\s*(\d+)\s+(\S+)/);return t?{ppid:Number(t[1]),tty:t[2]}:null}function cn(e){if(!Number.isInteger(e)||e<=0)return null;let t=e>>8&4095,n=e&255|e>>12&1048320;return t>=136&&t<=143?`/dev/pts/${(t-136)*256+n}`:t===4?n<64?`/dev/tty${n}`:`/dev/ttyS${n-64}`:null}function ln(e){let t=e.lastIndexOf(")");if(t<0)return null;let n=e.slice(t+1).trim().split(/\s+/),r=Number(n[1]),o=Number(n[4]);return !Number.isInteger(r)||!Number.isInteger(o)?null:{ppid:r,ttyNr:o}}function un(e){try{let t=ln(u__namespace.readFileSync(`/proc/${e}/stat`,"utf8"));if(t)return {ppid:t.ppid,ttyPath:cn(t.ttyNr)}}catch{}try{let t=child_process.spawnSync("ps",["-o","ppid=,tty=","-p",String(e)],{encoding:"utf8",timeout:1500}).stdout?.trim();if(!t)return null;let n=an(t);return n?{ppid:n.ppid,ttyPath:sn(n.tty)}:null}catch{return null}}function pn(){if(process.platform==="win32")return {path:rn,ownerPid:null};let e=process.pid;for(let t=0;t<12&&e>1;t++){let n=un(e);if(!n)return null;if(n.ttyPath)return {path:n.ttyPath,ownerPid:e};e=n.ppid;}return null}function dn(e){return e==="win32"?{detached:false,stdio:"ignore",windowsHide:false}:{detached:true,stdio:"ignore",windowsHide:false}}async function D(e,t,n,r,o){try{let i=g__namespace.join(__dirname,"paint.js"),s=z(t.cachedConfig),c=Math.min(Math.max(s.displayDurationSeconds??25,3),120),a={...e,format:n?.format,mediaUrl:n?.mediaUrl,mediaPixelUrl:n?.mediaPixelUrl,audioUrl:n?.audioUrl,impressionId:r,campaignId:o,apiOrigin:V(),durationMs:c*1e3,disclosure:!t.disclosureShown},d={...process.env,OPENCRATER_PAINT:JSON.stringify(a)};if(!d.OPENCRATER_TTY){let l=pn();l&&(d.OPENCRATER_TTY=l.path,l.ownerPid!==null&&(d.OPENCRATER_HOST_PID=String(l.ownerPid)));}let f=child_process.spawn(process.execPath,[i],{...dn(process.platform),env:d});process.platform==="win32"?await new Promise(l=>{let p=!1,O=()=>{p||(p=!0,l());};f.on("exit",O),f.on("error",O),setTimeout(O,7500);}):f.unref();}catch{}return {...t,lastShownAt:Date.now(),disclosureShown:true}}function We(e){if(process.platform!=="win32")return false;try{let t=g__namespace.join(R__namespace.homedir(),".config","opencrater","painter.lock"),n=JSON.parse(u__namespace.readFileSync(t,"utf8"));if(typeof n.startedAt!="number"||Date.now()-n.startedAt>e+1500)return !1;if(typeof n.pid=="number")try{process.kill(n.pid,0);}catch(r){if(r.code==="ESRCH")return !1}return !0}catch{return false}}var fn=8e3;function qe(){let e=g__namespace.join(R__namespace.homedir(),".config","opencrater","render.lock");try{let t=u__namespace.statSync(e);if(Date.now()-t.mtimeMs<fn)return !1;u__namespace.unlinkSync(e);}catch{}try{return u__namespace.mkdirSync(g__namespace.join(R__namespace.homedir(),".config","opencrater"),{recursive:!0}),u__namespace.writeFileSync(e,String(process.pid),{flag:"wx"}),!0}catch{return false}}function mn(e,t,n,r){if(!t)return true;let o=e.allowedPlacements[`${t}:${n}`];return o?o.includes(r):t==="opencrater"?ae[n].includes(r):true}var gn=1440*60*1e3;function hn(){try{let e=g__namespace.join(R__namespace.homedir(),".config","opencrater","runtime"),t=g__namespace.join(e,"node_modules","opencrater","dist","hook.js"),n=g__namespace.join(e,".last-update");if(u__namespace.existsSync(t)){try{if(Date.now()-u__namespace.statSync(n).mtimeMs<gn)return}catch{}try{u__namespace.writeFileSync(n,String(Date.now()));}catch{return}}else {let r=g__namespace.join(e,".installing");try{u__namespace.mkdirSync(e,{recursive:!0});let o=u__namespace.statSync(r);if(Date.now()-o.mtimeMs<600*1e3)return}catch{}u__namespace.writeFileSync(r,String(Date.now()));}te(e);}catch{}}function Xe(e,t){if(!t)return false;let n=s=>s.split(/[-+]/)[0].split(".").map(c=>parseInt(c,10)||0),r=n(e),o=n(t),i=Math.max(r.length,o.length);for(let s=0;s<i;s++){let c=r[s]??0,a=o[s]??0;if(c!==a)return c<a}return false}function Ze(){try{let e=g__namespace.join(R__namespace.homedir(),".config","opencrater","runtime"),t=g__namespace.join(e,".last-update"),n=g__namespace.join(e,".force-update");try{if(Date.now()-u__namespace.statSync(n).mtimeMs<600*1e3)return}catch{}u__namespace.mkdirSync(e,{recursive:!0}),u__namespace.writeFileSync(n,String(Date.now()));try{u__namespace.rmSync(t,{force:!0});}catch{}te(e);}catch{}}function yn(){try{let e=g__namespace.join(R__namespace.homedir(),".config","opencrater");u__namespace.mkdirSync(e,{recursive:!0}),u__namespace.writeFileSync(g__namespace.join(e,"activity.signal"),String(Date.now()));}catch{}}var Sn=1440*60*1e3;function bn(){try{let e=g__namespace.join(R__namespace.homedir(),".config","opencrater"),t=g__namespace.join(e,".last-host-check"),n=g__namespace.join(e,".known-hosts"),r=ee().sort(),o=[];try{let c=JSON.parse(u__namespace.readFileSync(n,"utf8"));Array.isArray(c)&&(o=c.filter(a=>typeof a=="string"));}catch{}if(!r.some(c=>!o.includes(c)))try{if(Date.now()-u__namespace.statSync(t).mtimeMs<Sn)return}catch{}u__namespace.mkdirSync(e,{recursive:!0});try{u__namespace.writeFileSync(t,String(Date.now()));}catch{return}let s=q();try{u__namespace.writeFileSync(n,JSON.stringify(r));}catch{}if(s.optOut||s.integrations.length===0)return;for(let c of s.integrations)try{Pe(c.key,c.package);}catch{}}catch{}}async function kn(){let e=nn(process.argv.slice(2));yn(),hn(),bn();let t=await on(en),n={};if(t)try{n=JSON.parse(t);let p=n.hook_event_name;!e.placement&&typeof p=="string"&&(e.placement=p);}catch{}let r=e.placement??"SessionStart",o=q(),i=Ye({env:process.env,state:o,now:Date.now()},{skipTTY:true});if(i!==null){if(i==="frequency"){let p=re(n);p.length>0&&y({...o,sessionTopics:ie(o.sessionTopics,p,Date.now())});}h("hook suppressed:",i);return}if(o={...o,sessionTopics:ie(o.sessionTopics,re(n),Date.now())},!mn(o,e.package,e.host,r)){y(o),h("hook gated: placement",r,"not selected for",e.package);return}let s=z(o.cachedConfig),c=V(),a={origin:c,timeoutMs:Math.min(s.serveTimeoutMs,tn),installId:o.installId,topics:ze(o.sessionTopics,Date.now())};if(o.devToken){let p=await de(o.devToken,{publisherKey:e.key??"",packageName:e.package??"",placement:r,host:e.host},a);if(p){if(o={...o,cachedConfig:p.config,configFetchedAt:Date.now()},Xe(E,p.config.minSdkVersion)&&Ze(),Zt);let O=e.host??"claude_code",se=Be(O,r),_=o.computeCards??{turns:0,lastLimitAt:0,lastDepletedAt:0,lastBackupAt:0};se&&(_.turns+=1);let I=Le({balanceMicroUsd:typeof p.computeBalanceMicroUsd=="number"?p.computeBalanceMicroUsd:null,weeklyGrantMicroUsd:typeof p.weeklyGrantMicroUsd=="number"?p.weeklyGrantMicroUsd:null,onGateway:(process.env.ANTHROPIC_BASE_URL??"").includes("/gateway"),turnEnd:se,host:De(O),cc:_,now:Date.now()}),Qe=(p.config.displayDurationSeconds??25)*1e3,v=p.fill&&p.blip&&!H(p.blip.campaignId)&&!F(p.blip.campaignId)?p.blip:null;if((I||v)&&!We(Qe)&&qe())if(I){let A=Date.now();I.kind==="limit"?_.lastLimitAt=A:I.kind==="depleted"?_.lastDepletedAt=A:I.kind==="backup"&&(_.lastBackupAt=A),o=await D({...I.card,label:"OpenCrater"},o);}else v&&(U(v.campaignId),o=await D(L(v),o,v.creative,v.impressionId,v.campaignId),o.devToken&&fe(o.devToken,v.impressionId,a));o={...o,computeCards:_};}y(o);return}let{blip:d,pool:f}=Z(o,Date.now());for(;d&&(H(d.campaignId)||F(d.campaignId));)h("hook: pooled blip skipped \u2014 campaign inside a local cooldown"),{blip:d,pool:f}=Z({pool:f},Date.now());if((d||e.key)&&We((s.displayDurationSeconds??25)*1e3)){y(o),h("hook: a card is already on screen \u2014 not rendering another");return}if((d||e.key)&&!qe()){y(o),h("hook: render slot already claimed by a concurrent fire");return}if(d){U(d.campaignId),o=await D(L(d),{...o,pool:f},d.creative,d.impressionId,d.campaignId),y(o),await Promise.race([W(d.impressionId,a),new Promise(p=>setTimeout(p,Ve).unref?.())]);return}if(f.length!==o.pool.length&&(o={...o,pool:f}),!e.key||!e.package){y(o),h("hook: pool empty and no --key/--package; nothing to render");return}let l=await pe({publisherKey:e.key,packageName:e.package,placement:r,host:e.host},a);if(!l){y(o);return}if(o={...o,cachedConfig:l.config,configFetchedAt:Date.now()},Xe(E,l.config.minSdkVersion)&&(h(`SDK ${E} below floor ${l.config.minSdkVersion} \u2014 forcing runtime update`),Ze()),e.package&&l.allowedPlacements&&(o={...o,allowedPlacements:{...o.allowedPlacements,[`${e.package}:${e.host}`]:l.allowedPlacements}}),l.fill&&l.blip){if(H(l.blip.campaignId)||F(l.blip.campaignId)){h("hook: served blip suppressed \u2014 campaign inside a local cooldown"),y(o);return}U(l.blip.campaignId),o=await D(L(l.blip),o,l.blip.creative,l.blip.impressionId,l.blip.campaignId),y(o),await Promise.race([W(l.blip.impressionId,a),new Promise(p=>setTimeout(p,Ve).unref?.())]);return}l.fallback&&(o=await D(ge(l.fallback),o)),y(o);}if(typeof P<"u"&&typeof module<"u"&&P.main===module){let e=setTimeout(()=>process.exit(0),Qt);kn().catch(t=>h(`opencrater-hook v${E} error:`,t)).finally(()=>{clearTimeout(e),process.exit(0);});}
6
- exports.decodeTtyNr=cn;exports.painterSpawnOptions=dn;exports.parseProcStat=ln;exports.parsePsLine=an;exports.resolveTtyPath=pn;exports.ttyNameToDevPath=sn;
2
+ 'use strict';var child_process=require('child_process'),u=require('fs'),R=require('os'),g=require('path'),crypto=require('crypto');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var u__namespace=/*#__PURE__*/_interopNamespace(u);var R__namespace=/*#__PURE__*/_interopNamespace(R);var g__namespace=/*#__PURE__*/_interopNamespace(g);var P=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var M={minIntervalSeconds:600,serveTimeoutMs:2500,preloadPoolSize:3,killSwitch:false,displayDurationSeconds:25,minSdkVersion:""},ce={claude_code:["SessionStart","Stop","SessionEnd","Notification"],codex:["Stop"],openclaw:[],gemini_cli:["AfterAgent","SessionStart","SessionEnd"],copilot_cli:["agentStop","sessionStart","sessionEnd","notification"],generic:["SessionStart","Stop"]},le={claude_code:["SessionStart","Stop","SessionEnd","Notification","UserPromptSubmit","SubagentStart","SubagentStop","StopFailure","PreToolUse","PostToolUse","PostToolUseFailure","PostToolBatch","PermissionRequest","PermissionDenied","UserPromptExpansion","PreCompact","PostCompact","TaskCreated","TaskCompleted","Setup","TeammateIdle","Elicitation","ElicitationResult","ConfigChange","InstructionsLoaded","WorktreeCreate","WorktreeRemove","CwdChanged","FileChanged","MessageDisplay"],codex:["Stop","SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","PermissionRequest","PreCompact","PostCompact"],openclaw:[],gemini_cli:["AfterAgent","SessionStart","SessionEnd","Notification","BeforeAgent","BeforeModel","AfterModel","BeforeToolSelection","BeforeTool","AfterTool","PreCompress"],copilot_cli:["agentStop","sessionStart","sessionEnd","notification","userPromptSubmitted","preToolUse","postToolUse","permissionRequest","errorOccurred","subagentStart","subagentStop"],generic:["SessionStart","Stop"]};var E="1.1.17";var tt="https://api.opencrater.to";function V(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return ((n&&n.trim()!==""?n:tt)).replace(/\/+$/,"")}function h(...e){try{if(process.env.OPENCRATER_DEBUG!=="1")return;console.error("[opencrater]",...e);try{let t=P("os"),n=P("fs"),r=P("path");n.appendFileSync(r.join(t.homedir(),".config","opencrater","hook.log"),`${new Date().toISOString()} [opencrater] ${e.map(o=>String(o)).join(" ")}
3
+ `);}catch{}}catch{}}function B(e){return typeof e=="number"&&Number.isFinite(e)}function nt(e){let t=M;if(typeof e!="object"||e===null)return {...t};let n=e;return {minIntervalSeconds:B(n.minIntervalSeconds)?n.minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:B(n.serveTimeoutMs)?n.serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:B(n.preloadPoolSize)?n.preloadPoolSize:t.preloadPoolSize,killSwitch:n.killSwitch===true,displayDurationSeconds:B(n.displayDurationSeconds)?n.displayDurationSeconds:t.displayDurationSeconds,minSdkVersion:typeof n.minSdkVersion=="string"?n.minSdkVersion:t.minSdkVersion}}async function j(e,t,n,r,o){try{let i=await fetch(`${e}${t}`,{method:"POST",headers:{"content-type":"application/json",...o??{}},body:JSON.stringify(n),signal:AbortSignal.timeout(r)});return i.ok?await i.json():(h(`POST ${t} -> HTTP ${i.status}`),null)}catch(i){return h(`POST ${t} failed:`,i),null}}function ue(e,t){let n=e.host??"generic";return {publisherKey:e.publisherKey,packageName:e.packageName,placement:e.placement,host:n,sdkVersion:E,installId:t.installId,os:process.platform,termProgram:process.env.TERM_PROGRAM??void 0,topics:t.topics&&t.topics.length>0?t.topics:void 0}}function pe(e){if(typeof e!="object"||e===null)return null;let t=e;if(typeof t.fill!="boolean")return null;let n={fill:t.fill,fallback:t.fallback??null,config:nt(t.config),...Array.isArray(t.allowedPlacements)?{allowedPlacements:t.allowedPlacements.filter(r=>typeof r=="string")}:{}};return t.blip!==void 0&&t.blip!==null&&(n.blip=t.blip),typeof t.computeBalanceMicroUsd=="number"&&(n.computeBalanceMicroUsd=t.computeBalanceMicroUsd),typeof t.weeklyGrantMicroUsd=="number"&&(n.weeklyGrantMicroUsd=t.weeklyGrantMicroUsd),n}async function de(e,t){let n=await j(t.origin,"/v1/serve",ue(e,t),t.timeoutMs);return pe(n)}async function fe(e,t,n){let r={...ue(t,n),publisherKey:t.publisherKey??"",packageName:t.packageName??""},o=await j(n.origin,"/v1/dev/serve",r,n.timeoutMs,{authorization:`Bearer ${e}`});return pe(o)}function me(e,t,n){return j(n.origin,"/v1/dev/impression",{impressionId:t},n.timeoutMs,{authorization:`Bearer ${e}`}).then(()=>{}).catch(()=>{})}function W(e,t){return j(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}function ge(e){let t={sponsorLabel:e.sponsorLabel,title:e.creative.title,body:e.creative.body,url:e.clickUrl};return e.creative.cta!==void 0&&(t.cta=e.creative.cta),t}function he(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function L(e){let t=ge(e),n=e.creative;switch(n.format){case "image":case "gif":return {...t,body:n.textFallback??t.body};case "video":return {...t,body:n.textFallback??t.body,cta:t.cta??"\u25B6 Watch"};case "audio":return {...t,body:n.textFallback??t.body,cta:t.cta??"\u{1F50A} Listen"};default:return t}}function $(e=process.env){return g__namespace.join(R__namespace.homedir(),".config","opencrater")}function Se(e=process.env){return g__namespace.join($(e),"state.json")}function be(){return {installId:crypto.randomUUID(),lastShownAt:0,optOut:false,disclosureShown:false,cachedConfig:null,configFetchedAt:0,pool:[],allowedPlacements:{},sessionTopics:[],integrations:[],devToken:null,computeRouting:null,computeCards:null}}function k(e){return typeof e=="number"&&Number.isFinite(e)}function rt(e){if(typeof e!="object"||e===null)return null;let t=e;return !k(t.minIntervalSeconds)||!k(t.serveTimeoutMs)||!k(t.preloadPoolSize)||typeof t.killSwitch!="boolean"?null:{minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:t.preloadPoolSize,killSwitch:t.killSwitch,displayDurationSeconds:k(t.displayDurationSeconds)?t.displayDurationSeconds:25,minSdkVersion:typeof t.minSdkVersion=="string"?t.minSdkVersion:""}}function it(e){if(!Array.isArray(e))return [];let t=[];for(let n of e){if(typeof n!="object"||n===null)continue;let r=n,o=r.blip;if(!k(r.renderBy)||typeof o!="object"||o===null||typeof o.impressionId!="string"||typeof o.clickUrl!="string"||typeof o.sponsorLabel!="string"||typeof o.creative!="object"||o.creative===null)continue;let i=o.creative;typeof i.title!="string"||typeof i.body!="string"||t.push({blip:{impressionId:o.impressionId,...typeof o.campaignId=="string"?{campaignId:o.campaignId}:{},clickUrl:o.clickUrl,sponsorLabel:o.sponsorLabel,creative:{format:"text",title:i.title,body:i.body,...typeof i.cta=="string"?{cta:i.cta}:{}}},renderBy:r.renderBy});}return t}function st(e){if(typeof e!="object"||e===null||Array.isArray(e))return {};let t={};for(let[n,r]of Object.entries(e)){if(!Array.isArray(r))continue;let o=r.filter(i=>typeof i=="string"&&i.length<=64);t[n]=o.slice(0,64);}return t}function at(e){if(!Array.isArray(e))return [];let t=[];for(let n of e){if(typeof n!="object"||n===null)continue;let r=n;if(!(typeof r.topic!="string"||!k(r.at))&&(t.push({topic:r.topic.slice(0,32),at:r.at}),t.length>=24))break}return t}function ct(e){if(!Array.isArray(e))return [];let t=[],n=new Set;for(let r of e){if(typeof r!="object"||r===null)continue;let o=r;if(typeof o.key!="string"||typeof o.package!="string"||o.key===""||o.package==="")continue;let i=`${o.package}\0${o.key}`;if(!n.has(i)&&(n.add(i),t.push({key:o.key,package:o.package}),t.length>=32))break}return t}function lt(e){if(typeof e!="object"||e===null)return null;let t=e,n={};if(typeof t.savedEnv=="object"&&t.savedEnv!==null)for(let[r,o]of Object.entries(t.savedEnv))(typeof o=="string"||o===null)&&(n[r]=o);return {active:t.active===true,savedEnv:n}}function ut(e){if(typeof e!="object"||e===null)return null;let t=e,n=r=>k(r)&&r>=0?r:0;return {turns:n(t.turns),lastLimitAt:n(t.lastLimitAt),lastDepletedAt:n(t.lastDepletedAt),lastBackupAt:n(t.lastBackupAt)}}function pt(e){let t=be();if(typeof e!="object"||e===null)return t;let n=e;return {installId:typeof n.installId=="string"&&n.installId.length>0?n.installId:t.installId,lastShownAt:k(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:rt(n.cachedConfig),allowedPlacements:st(n.allowedPlacements),sessionTopics:at(n.sessionTopics),integrations:ct(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:lt(n.computeRouting),computeCards:ut(n.computeCards),configFetchedAt:k(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:it(n.pool)}}function q(e=process.env){let t=Se(e);try{let n=u__namespace.readFileSync(t,"utf8"),r=JSON.parse(n);return pt(r)}catch{let n=be();try{y(n,e);}catch{}return n}}function y(e,t=process.env){let n=Se(t),r=g__namespace.dirname(n);u__namespace.mkdirSync(r,{recursive:true});try{let s=JSON.parse(u__namespace.readFileSync(n,"utf8"));typeof s.lastShownAt=="number"&&s.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:s.lastShownAt});}catch{}let o=g__namespace.join(r,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);u__namespace.writeFileSync(o,JSON.stringify(e,null,2)+`
4
+ `,"utf8");let i=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);for(let s=0;;s++)try{u__namespace.renameSync(o,n);return}catch(c){let a=c.code??"";if(s>=4||!i.has(a)){try{u__namespace.rmSync(o,{force:!0});}catch{}if(s>=4)return;throw c}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(s+1));}catch{}}}var dt=300*1e3;function ft(){return g__namespace.join($(),"blocked-ads.json")}function X(){return g__namespace.join($(),"recent-renders.json")}function mt(){return g__namespace.join($(),"reported-ads.json")}function ke(e,t){let n={};for(let[r,o]of Object.entries(e))typeof o=="number"&&Number.isFinite(o)&&o>t&&(n[r]=o);return n}function gt(e){try{let t=JSON.parse(u__namespace.readFileSync(ft(),"utf8"));return ke(t&&typeof t=="object"?t:{},e)}catch{return {}}}function ht(){try{let e=JSON.parse(u__namespace.readFileSync(mt(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return {}}}function yt(e){return e?ht()[e]!==void 0:false}function H(e,t=Date.now()){return e?gt(t)[e]!==void 0||yt(e):false}function we(e){try{let t=JSON.parse(u__namespace.readFileSync(X(),"utf8"));return ke(t&&typeof t=="object"?t:{},e)}catch{return {}}}function U(e,t=Date.now()){if(e)try{let n=we(t);n[e]=t+dt,u__namespace.mkdirSync(g__namespace.dirname(X()),{recursive:!0}),u__namespace.writeFileSync(X(),JSON.stringify(n));}catch{}}function F(e,t=Date.now()){return e?we(t)[e]!==void 0:false}function St(e,t){return e.filter(n=>n.renderBy>t)}function Z(e,t){let n=St(e.pool,t),r=n.shift();return {blip:r?r.blip:null,pool:n}}var bt=["claude_code","codex","gemini_cli","copilot_cli"];function Oe(e){return e.includes("opencrater-hook")}function kt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function wt(e,t){return Oe(e)&&new RegExp(`--package ['"]?${kt(t)}['"]?`).test(e)}function _e(e,t){return t?wt(e,t):Oe(e)&&!/--package\b/.test(e)}function ve(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var Ce='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',Re="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function Q(e,t,n,r){let o=`--placement ${t}`;return n&&(o+=` --key ${ve(n)}`),r&&(o+=` --package ${ve(r)}`),o+=` --host ${e}`,`{ if [ -f ${Ce} ]; then node ${Ce} ${o}; else npx -y -p opencrater opencrater-hook ${o}; fi; } 2>/dev/null || true`}function vt(e,t,n,r){let o=`--placement ${t}`;return n&&(o+=` --key '${n}'`),r&&(o+=` --package '${r}'`),o+=` --host ${e}`,`try { if (Test-Path "${Re}") { node "${Re}" ${o} } else { npx -y -p opencrater opencrater-hook ${o} } } catch {}`}function Ee(e,t,n,r){return Q(e,t,n,r)}function Ie(e,t){let n=R__namespace.homedir();switch(e){case "claude_code":{let r=t.CLAUDE_CONFIG_DIR;return r&&r.trim()!==""?r:g__namespace.join(n,".claude")}case "codex":{let r=t.CODEX_HOME;return r&&r.trim()!==""?r:g__namespace.join(n,".codex")}case "gemini_cli":return g__namespace.join(n,".gemini");case "copilot_cli":{let r=t.COPILOT_HOME;return r&&r.trim()!==""?r:g__namespace.join(n,".copilot")}default:return g__namespace.join(n,".opencrater-unknown")}}function J(e,t=process.env){let n=Ie(e,t);switch(e){case "claude_code":return g__namespace.join(n,"settings.json");case "codex":return g__namespace.join(n,"hooks.json");case "gemini_cli":return g__namespace.join(n,"settings.json");case "copilot_cli":return g__namespace.join(n,"hooks","hooks.json");default:return g__namespace.join(n,"hooks.json")}}var Ct={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"]};function Rt(e,t){if(e.length===0)return false;let n=(t.PATH??t.Path??"").split(g__namespace.delimiter).filter(Boolean),r=process.platform==="win32"?["",".exe",".cmd",".bat"]:[""];for(let o of n)for(let i of e)for(let s of r)try{if(u__namespace.existsSync(g__namespace.join(o,i+s)))return !0}catch{}return false}function Et(e,t=process.env){try{if(u__namespace.existsSync(Ie(e,t)))return !0}catch{}return Rt(Ct[e]??[],t)}function ee(e=process.env){return bt.filter(t=>Et(t,e))}function Ae(e){let t;try{t=u__namespace.readFileSync(e,"utf8");}catch{return {}}let n=JSON.parse(t);if(typeof n!="object"||n===null||Array.isArray(n))throw new Error(`${e} is not a JSON object`);return n}function Pe(e,t){let n=g__namespace.dirname(e);u__namespace.mkdirSync(n,{recursive:true});let r=g__namespace.join(n,`.${g__namespace.basename(e)}.${process.pid}.tmp`);u__namespace.writeFileSync(r,JSON.stringify(t,null,2)+`
5
+ `,"utf8"),u__namespace.renameSync(r,e);}function Tt(e,t){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&_e(n.command,t))}function Ot(e,t,n,r){let o=J(e),i=Ae(o),s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let d=Ee(e,a,t,n);return (Array.isArray(s[a])?s[a]:[]).some(f=>Array.isArray(f.hooks)&&f.hooks.some(l=>l.command===d))}))return "nochange";for(let a of r){let f=(Array.isArray(s[a])?s[a]:[]).filter(l=>!Tt(l,n));f.push({matcher:"",hooks:[{type:"command",command:Ee(e,a,t,n)}]}),s[a]=f;}return i.hooks=s,Pe(o,i),"wrote"}function _t(e,t){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&_e(n,t))}function It(e,t,n,r){let o=J(e),i=Ae(o);typeof i.version!="number"&&(i.version=1);let s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let d=Q(e,a,t,n);return (Array.isArray(s[a])?s[a]:[]).some(f=>f.bash===d)}))return "nochange";for(let a of r){let f=(Array.isArray(s[a])?s[a]:[]).filter(l=>!_t(l,n));f.push({type:"command",bash:Q(e,a,t,n),powershell:vt(e,a,t,n),timeoutSec:5}),s[a]=f;}return i.hooks=s,Pe(o,i),"wrote"}function xe(e){return [...le[e]]}function At(e,t,n){let r=xe(e);return r.length===0?"nochange":e==="copilot_cli"?It(e,t,n,r):Ot(e,t,n,r)}function te(e,t,n=process.env){return ee(n).map(r=>{try{let o=At(r,e,t);return {host:r,status:o,events:xe(r)}}catch(o){return {host:r,status:"error",events:[],error:o.message}}})}function xt(){return g__namespace.join(R__namespace.homedir(),".config","opencrater","runtime")}function Nt(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function ne(e=xt()){child_process.spawn("npm",Nt(e),process.platform==="win32"?{detached:false,stdio:"ignore",windowsHide:true,shell:true}:{detached:true,stdio:"ignore"}).unref();}var De={atLimit:false,resetAt:null};function Be(e,t=R__namespace.homedir()){try{if(e==="claude_code")return Mt(t);if(e==="codex")return $t(t)}catch{}return De}function Mt(e){let t=u__namespace.readFileSync(g__namespace.join(e,".claude.json"),"utf8"),n=JSON.parse(t),r=n.hasAvailableSubscription===false||n.cachedExtraUsageDisabledReason==="out_of_credits",o=null,c=n.cachedGrowthBookFeatures?.tengu_saffron_lattice?.planLimitsEndDate;if(typeof c=="string"){let a=Date.parse(c);Number.isFinite(a)&&(o=a);}return {atLimit:r,resetAt:o}}function $t(e){return u__namespace.accessSync(g__namespace.join(e,".codex","auth.json")),De}function je(e,t){switch(e){case "gemini_cli":return t==="AfterAgent";case "copilot_cli":return t==="agentStop";default:return t==="Stop"}}var Le=36e5,Dt=30*6e4,Bt=30*6e4,jt=4*Le,Lt=3,G="https://opencrater.to/dashboard";function K(e){return `$${(e/1e6).toFixed(2)}`}function Ht(e,t){return t<=0?0:Math.max(0,Math.min(100,Math.round(e/t*100)))}function Ut(e,t){if(!e||e<=t)return "";let n=e-t,r=n>=864e5?`${Math.floor(n/864e5)}d`:`${Math.max(1,Math.floor(n/Le))}h`,o=new Date(e).toISOString().slice(0,10);return ` Your host limit resets in ${r} (${o}).`}function He(e){let{balanceMicroUsd:t,weeklyGrantMicroUsd:n,onGateway:r,turnEnd:o,host:i,cc:s,now:c}=e;if(t===null)return null;if(t<=0)return c-(s.lastDepletedAt??0)<Bt?null:{kind:"depleted",card:{sponsorLabel:"OpenCrater",title:"Compute used up",body:"Keep coding in Codex / Copilot to earn more compute, then switch back to Claude Code."+Ut(i.resetAt,c),url:G,cta:"Earn more"}};if(r){if(!o||(s.turns??0)%Lt!==0)return null;let a=n&&n>0?Ht(t,n):null;return {kind:"hud",card:{sponsorLabel:"OpenCrater",title:"Running on OpenCrater compute",body:a!==null?`${a}% of your weekly compute left \u2014 ${K(t)} remaining.`:`${K(t)} of compute remaining this week.`,url:G,cta:"Wallet"}}}return i.atLimit?c-(s.lastLimitAt??0)<Dt?null:{kind:"limit",card:{sponsorLabel:"OpenCrater",title:"Hit your limit? You've got compute",body:`${K(t)} of OpenCrater compute is ready. Continue this session now: opencrater code -c`,url:G,cta:"opencrater code -c"}}:c-(s.lastBackupAt??0)>=jt?{kind:"backup",card:{sponsorLabel:"OpenCrater",title:"Backup compute ready",body:`${K(t)} of OpenCrater compute waiting. When you hit your limit: opencrater code -c`,url:G,cta:"opencrater code -c"}}:null}var Kt=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function re(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function Yt(e){return re(e.OPENCRATER_DISABLE)||re(e.TSN_DISABLE)}function zt(e){return Kt.some(t=>re(e[t]))}function z(e){return e?{...M,...e}:M}function ze(e,t={}){if(Yt(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=z(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(zt(e.env))return "ci";if(!t.skipTTY&&false);if(!t.skipFrequency){let r=n.minIntervalSeconds*1e3;if(e.state.lastShownAt>0&&e.now-e.state.lastShownAt<r)return "frequency"}return null}var Vt=new Set(["the","and","for","but","not","you","all","any","can","this","that","with","have","will","your","from","they","what","when","where","how","why","make","fix","add","update","remove","create","delete","change","error","errors","bug","bugs","file","files","code","test","tests","run","running","build","please","help","want","need","should","would","could","into","about","then","here","there","now","new","use","using","used","work","working","works","check","show","see","look","get","set","let","lets","dont","cant","issue"]);function Wt(e){if(e.includes("/")||e.includes("\\")||e.includes("@")||e.includes("://"))return true;let t=e.toLowerCase();return !!(/^(sk|pk|rk|ock|ghp|gho|ghs|xox|akia|eyj|npm|glpat)[-_]/.test(t)||e.length>=16&&/^[0-9a-f]+$/i.test(e)||e.length>=20&&/^[A-Za-z0-9+/=_-]+$/.test(e)&&/[A-Z]/.test(e)&&/[0-9]/.test(e))}function qt(e,t=12){let n=[];for(let r of e.slice(0,2e3).split(/\s+/))if(!(!r||Wt(r)))for(let o of r.split(/[^A-Za-z0-9+#.]+|(?<=[a-z0-9])(?=[A-Z])/)){let i=o.replace(/^[.]+|[.]+$/g,"").toLowerCase();if(!(i.length<3||i.length>24)&&!(/^\d+$/.test(i)||Vt.has(i))&&!n.includes(i)&&(n.push(i),n.length>=t))return n}return n}function ie(e){let t=[];typeof e.prompt=="string"&&t.push(e.prompt);let n=e.cwd;if(typeof n=="string"&&n.length>0){let r=n.replace(/[\\/]+$/,""),o=r.split(/[\\/]/).pop()??"",i=(process.env.HOME??process.env.USERPROFILE??"").replace(/[\\/]+$/,""),s=process.env.USER??process.env.USERNAME??"";r!==i&&o!==s&&o.length>0&&t.push(o.replace(/[-_]/g," "));}return qt(t.join(" "))}function se(e,t,n){let r=new Map;for(let{topic:o,at:i}of e)n-i<216e5&&r.set(o,i);for(let o of t)r.set(o,n);return [...r.entries()].map(([o,i])=>({topic:o,at:i})).sort((o,i)=>i.at-o.at).slice(0,24)}function Ve(e,t){return e.filter(({at:n})=>t-n<216e5).sort((n,r)=>r.at-n.at).slice(0,12).map(({topic:n})=>n)}var Qt=false,en=process.platform==="win32"?8e3:3200,tn=150,We=250,nn=2800;function on(e){let t={host:"claude_code"};for(let n=0;n<e.length;n++){let r=e[n],o=e[n+1];switch(r){case "--placement":o!==void 0&&(t.placement=o,n++);break;case "--key":o!==void 0&&(t.key=o,n++);break;case "--package":o!==void 0&&(t.package=o,n++);break;case "--host":(o==="claude_code"||o==="codex"||o==="openclaw"||o==="gemini_cli"||o==="copilot_cli"||o==="generic")&&(t.host=o,n++);break;}}return t}function rn(e){return new Promise(t=>{if(process.stdin.isTTY){t("");return}let n="",r=false,o=()=>{r||(r=true,t(n));},i=setTimeout(o,e);i.unref?.(),process.stdin.setEncoding("utf8"),process.stdin.on("data",s=>{n+=s;}),process.stdin.on("end",()=>{clearTimeout(i),o();}),process.stdin.on("error",()=>{clearTimeout(i),o();});})}var sn="\\\\.\\CONOUT$";function an(e){return !e||e==="?"||e==="??"||e==="-"?null:e.startsWith("/")?e:`/dev/${e}`}function cn(e){let t=e.match(/^\s*(\d+)\s+(\S+)/);return t?{ppid:Number(t[1]),tty:t[2]}:null}function ln(e){if(!Number.isInteger(e)||e<=0)return null;let t=e>>8&4095,n=e&255|e>>12&1048320;return t>=136&&t<=143?`/dev/pts/${(t-136)*256+n}`:t===4?n<64?`/dev/tty${n}`:`/dev/ttyS${n-64}`:null}function un(e){let t=e.lastIndexOf(")");if(t<0)return null;let n=e.slice(t+1).trim().split(/\s+/),r=Number(n[1]),o=Number(n[4]);return !Number.isInteger(r)||!Number.isInteger(o)?null:{ppid:r,ttyNr:o}}function pn(e){try{let t=un(u__namespace.readFileSync(`/proc/${e}/stat`,"utf8"));if(t)return {ppid:t.ppid,ttyPath:ln(t.ttyNr)}}catch{}try{let t=child_process.spawnSync("ps",["-o","ppid=,tty=","-p",String(e)],{encoding:"utf8",timeout:1500}).stdout?.trim();if(!t)return null;let n=cn(t);return n?{ppid:n.ppid,ttyPath:an(n.tty)}:null}catch{return null}}function dn(){if(process.platform==="win32")return {path:sn,ownerPid:null};let e=process.pid;for(let t=0;t<12&&e>1;t++){let n=pn(e);if(!n)return null;if(n.ttyPath)return {path:n.ttyPath,ownerPid:e};e=n.ppid;}return null}function fn(e){return e==="win32"?{detached:false,stdio:"ignore",windowsHide:false}:{detached:true,stdio:"ignore",windowsHide:false}}async function D(e,t,n,r,o){try{let i=g__namespace.join(__dirname,"paint.js"),s=z(t.cachedConfig),c=Math.min(Math.max(s.displayDurationSeconds??25,3),120),a={...e,format:n?.format,mediaUrl:n?.mediaUrl,mediaPixelUrl:n?.mediaPixelUrl,audioUrl:n?.audioUrl,impressionId:r,campaignId:o,apiOrigin:V(),durationMs:c*1e3,disclosure:!t.disclosureShown},d={...process.env,OPENCRATER_PAINT:JSON.stringify(a)};if(!d.OPENCRATER_TTY){let l=dn();l&&(d.OPENCRATER_TTY=l.path,l.ownerPid!==null&&(d.OPENCRATER_HOST_PID=String(l.ownerPid)));}let f=child_process.spawn(process.execPath,[i],{...fn(process.platform),env:d});process.platform==="win32"?await new Promise(l=>{let p=!1,O=()=>{p||(p=!0,l());};f.on("exit",O),f.on("error",O),setTimeout(O,7500);}):f.unref();}catch{}return {...t,lastShownAt:Date.now(),disclosureShown:true}}function qe(e){if(process.platform!=="win32")return false;try{let t=g__namespace.join(R__namespace.homedir(),".config","opencrater","painter.lock"),n=JSON.parse(u__namespace.readFileSync(t,"utf8"));if(typeof n.startedAt!="number"||Date.now()-n.startedAt>e+1500)return !1;if(typeof n.pid=="number")try{process.kill(n.pid,0);}catch(r){if(r.code==="ESRCH")return !1}return !0}catch{return false}}var mn=8e3;function Xe(){let e=g__namespace.join(R__namespace.homedir(),".config","opencrater","render.lock");try{let t=u__namespace.statSync(e);if(Date.now()-t.mtimeMs<mn)return !1;u__namespace.unlinkSync(e);}catch{}try{return u__namespace.mkdirSync(g__namespace.join(R__namespace.homedir(),".config","opencrater"),{recursive:!0}),u__namespace.writeFileSync(e,String(process.pid),{flag:"wx"}),!0}catch{return false}}function gn(e,t,n,r){if(!t)return true;let o=e.allowedPlacements[`${t}:${n}`];return o?o.includes(r):t==="opencrater"?ce[n].includes(r):true}var hn=1440*60*1e3;function yn(){try{let e=g__namespace.join(R__namespace.homedir(),".config","opencrater","runtime"),t=g__namespace.join(e,"node_modules","opencrater","dist","hook.js"),n=g__namespace.join(e,".last-update");if(u__namespace.existsSync(t)){try{if(Date.now()-u__namespace.statSync(n).mtimeMs<hn)return}catch{}try{u__namespace.writeFileSync(n,String(Date.now()));}catch{return}}else {let r=g__namespace.join(e,".installing");try{u__namespace.mkdirSync(e,{recursive:!0});let o=u__namespace.statSync(r);if(Date.now()-o.mtimeMs<600*1e3)return}catch{}u__namespace.writeFileSync(r,String(Date.now()));}ne(e);}catch{}}function Ze(e,t){if(!t)return false;let n=s=>s.split(/[-+]/)[0].split(".").map(c=>parseInt(c,10)||0),r=n(e),o=n(t),i=Math.max(r.length,o.length);for(let s=0;s<i;s++){let c=r[s]??0,a=o[s]??0;if(c!==a)return c<a}return false}function Qe(){try{let e=g__namespace.join(R__namespace.homedir(),".config","opencrater","runtime"),t=g__namespace.join(e,".last-update"),n=g__namespace.join(e,".force-update");try{if(Date.now()-u__namespace.statSync(n).mtimeMs<600*1e3)return}catch{}u__namespace.mkdirSync(e,{recursive:!0}),u__namespace.writeFileSync(n,String(Date.now()));try{u__namespace.rmSync(t,{force:!0});}catch{}ne(e);}catch{}}function Sn(){try{let e=g__namespace.join(R__namespace.homedir(),".config","opencrater");u__namespace.mkdirSync(e,{recursive:!0}),u__namespace.writeFileSync(g__namespace.join(e,"activity.signal"),String(Date.now()));}catch{}}var bn=1440*60*1e3;function kn(){try{let e=g__namespace.join(R__namespace.homedir(),".config","opencrater"),t=g__namespace.join(e,".last-host-check"),n=g__namespace.join(e,".known-hosts"),r=ee().sort(),o=[];try{let c=JSON.parse(u__namespace.readFileSync(n,"utf8"));Array.isArray(c)&&(o=c.filter(a=>typeof a=="string"));}catch{}if(!r.some(c=>!o.includes(c)))try{if(Date.now()-u__namespace.statSync(t).mtimeMs<bn)return}catch{}u__namespace.mkdirSync(e,{recursive:!0});try{u__namespace.writeFileSync(t,String(Date.now()));}catch{return}let s=q();try{u__namespace.writeFileSync(n,JSON.stringify(r));}catch{}if(s.optOut)return;if(s.devToken)try{te();}catch{}for(let c of s.integrations)try{te(c.key,c.package);}catch{}}catch{}}async function wn(){let e=on(process.argv.slice(2));Sn(),yn(),kn();let t=await rn(tn),n={};if(t)try{n=JSON.parse(t);let p=n.hook_event_name;!e.placement&&typeof p=="string"&&(e.placement=p);}catch{}let r=e.placement??"SessionStart",o=q(),i=ze({env:process.env,state:o,now:Date.now()},{skipTTY:true});if(i!==null){if(i==="frequency"){let p=ie(n);p.length>0&&y({...o,sessionTopics:se(o.sessionTopics,p,Date.now())});}h("hook suppressed:",i);return}if(o={...o,sessionTopics:se(o.sessionTopics,ie(n),Date.now())},!gn(o,e.package,e.host,r)){y(o),h("hook gated: placement",r,"not selected for",e.package);return}let s=z(o.cachedConfig),c=V(),a={origin:c,timeoutMs:Math.min(s.serveTimeoutMs,nn),installId:o.installId,topics:Ve(o.sessionTopics,Date.now())};if(o.devToken){let p=await fe(o.devToken,{publisherKey:e.key??"",packageName:e.package??"",placement:r,host:e.host},a);if(p){if(o={...o,cachedConfig:p.config,configFetchedAt:Date.now()},Ze(E,p.config.minSdkVersion)&&Qe(),Qt);let O=e.host??"claude_code",ae=je(O,r),_=o.computeCards??{turns:0,lastLimitAt:0,lastDepletedAt:0,lastBackupAt:0};ae&&(_.turns+=1);let I=He({balanceMicroUsd:typeof p.computeBalanceMicroUsd=="number"?p.computeBalanceMicroUsd:null,weeklyGrantMicroUsd:typeof p.weeklyGrantMicroUsd=="number"?p.weeklyGrantMicroUsd:null,onGateway:(process.env.ANTHROPIC_BASE_URL??"").includes("/gateway"),turnEnd:ae,host:Be(O),cc:_,now:Date.now()}),et=(p.config.displayDurationSeconds??25)*1e3,v=p.fill&&p.blip&&!H(p.blip.campaignId)&&!F(p.blip.campaignId)?p.blip:null;if((I||v)&&!qe(et)&&Xe())if(I){let A=Date.now();I.kind==="limit"?_.lastLimitAt=A:I.kind==="depleted"?_.lastDepletedAt=A:I.kind==="backup"&&(_.lastBackupAt=A),o=await D({...I.card,label:"OpenCrater"},o);}else v&&(U(v.campaignId),o=await D(L(v),o,v.creative,v.impressionId,v.campaignId),o.devToken&&me(o.devToken,v.impressionId,a));o={...o,computeCards:_};}y(o);return}let{blip:d,pool:f}=Z(o,Date.now());for(;d&&(H(d.campaignId)||F(d.campaignId));)h("hook: pooled blip skipped \u2014 campaign inside a local cooldown"),{blip:d,pool:f}=Z({pool:f},Date.now());if((d||e.key)&&qe((s.displayDurationSeconds??25)*1e3)){y(o),h("hook: a card is already on screen \u2014 not rendering another");return}if((d||e.key)&&!Xe()){y(o),h("hook: render slot already claimed by a concurrent fire");return}if(d){U(d.campaignId),o=await D(L(d),{...o,pool:f},d.creative,d.impressionId,d.campaignId),y(o),await Promise.race([W(d.impressionId,a),new Promise(p=>setTimeout(p,We).unref?.())]);return}if(f.length!==o.pool.length&&(o={...o,pool:f}),!e.key||!e.package){y(o),h("hook: pool empty and no --key/--package; nothing to render");return}let l=await de({publisherKey:e.key,packageName:e.package,placement:r,host:e.host},a);if(!l){y(o);return}if(o={...o,cachedConfig:l.config,configFetchedAt:Date.now()},Ze(E,l.config.minSdkVersion)&&(h(`SDK ${E} below floor ${l.config.minSdkVersion} \u2014 forcing runtime update`),Qe()),e.package&&l.allowedPlacements&&(o={...o,allowedPlacements:{...o.allowedPlacements,[`${e.package}:${e.host}`]:l.allowedPlacements}}),l.fill&&l.blip){if(H(l.blip.campaignId)||F(l.blip.campaignId)){h("hook: served blip suppressed \u2014 campaign inside a local cooldown"),y(o);return}U(l.blip.campaignId),o=await D(L(l.blip),o,l.blip.creative,l.blip.impressionId,l.blip.campaignId),y(o),await Promise.race([W(l.blip.impressionId,a),new Promise(p=>setTimeout(p,We).unref?.())]);return}l.fallback&&(o=await D(he(l.fallback),o)),y(o);}if(typeof P<"u"&&typeof module<"u"&&P.main===module){let e=setTimeout(()=>process.exit(0),en);wn().catch(t=>h(`opencrater-hook v${E} error:`,t)).finally(()=>{clearTimeout(e),process.exit(0);});}
6
+ exports.decodeTtyNr=ln;exports.painterSpawnOptions=fn;exports.parseProcStat=un;exports.parsePsLine=cn;exports.resolveTtyPath=dn;exports.ttyNameToDevPath=an;
package/dist/index.d.mts CHANGED
@@ -224,7 +224,7 @@ declare function renderBlip(blip: Blip, opts?: MediaRenderOptions): Promise<stri
224
224
 
225
225
  /** Keep in sync with package.json (bundled, so we avoid a runtime fs read).
226
226
  * AUTO-GENERATED by scripts/sync-version.mjs on `npm version`. */
227
- declare const SDK_VERSION = "1.1.16";
227
+ declare const SDK_VERSION = "1.1.17";
228
228
 
229
229
  /** Public API. Every method is fail-silent: it never throws. */
230
230
  declare const sponsor: {
package/dist/index.d.ts CHANGED
@@ -224,7 +224,7 @@ declare function renderBlip(blip: Blip, opts?: MediaRenderOptions): Promise<stri
224
224
 
225
225
  /** Keep in sync with package.json (bundled, so we avoid a runtime fs read).
226
226
  * AUTO-GENERATED by scripts/sync-version.mjs on `npm version`. */
227
- declare const SDK_VERSION = "1.1.16";
227
+ declare const SDK_VERSION = "1.1.17";
228
228
 
229
229
  /** Public API. Every method is fail-silent: it never throws. */
230
230
  declare const sponsor: {
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var crypto=require('crypto'),u=require('fs'),ee=require('os'),C=require('path');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var u__namespace=/*#__PURE__*/_interopNamespace(u);var ee__namespace=/*#__PURE__*/_interopNamespace(ee);var C__namespace=/*#__PURE__*/_interopNamespace(C);var F=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var b={minIntervalSeconds:600,serveTimeoutMs:2500,preloadPoolSize:3,killSwitch:false,displayDurationSeconds:25,minSdkVersion:""};var re=["SessionStart","SessionEnd","Stop","PostToolUse","Notification"];var D="1.1.16";var ie="https://api.opencrater.to";function K(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:ie)).replace(/\/+$/,"")}function l(...e){try{if(process.env.OPENCRATER_DEBUG!=="1")return;console.error("[opencrater]",...e);try{let t=F("os"),n=F("fs"),r=F("path");n.appendFileSync(r.join(t.homedir(),".config","opencrater","hook.log"),`${new Date().toISOString()} [opencrater] ${e.map(o=>String(o)).join(" ")}
1
+ 'use strict';var crypto=require('crypto'),u=require('fs'),ee=require('os'),C=require('path');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var u__namespace=/*#__PURE__*/_interopNamespace(u);var ee__namespace=/*#__PURE__*/_interopNamespace(ee);var C__namespace=/*#__PURE__*/_interopNamespace(C);var F=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var b={minIntervalSeconds:600,serveTimeoutMs:2500,preloadPoolSize:3,killSwitch:false,displayDurationSeconds:25,minSdkVersion:""};var re=["SessionStart","SessionEnd","Stop","PostToolUse","Notification"];var D="1.1.17";var ie="https://api.opencrater.to";function K(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:ie)).replace(/\/+$/,"")}function l(...e){try{if(process.env.OPENCRATER_DEBUG!=="1")return;console.error("[opencrater]",...e);try{let t=F("os"),n=F("fs"),r=F("path");n.appendFileSync(r.join(t.homedir(),".config","opencrater","hook.log"),`${new Date().toISOString()} [opencrater] ${e.map(o=>String(o)).join(" ")}
2
2
  `);}catch{}}catch{}}function v(e){return typeof e=="number"&&Number.isFinite(e)}function V(e){let t=b;if(typeof e!="object"||e===null)return {...t};let n=e;return {minIntervalSeconds:v(n.minIntervalSeconds)?n.minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:v(n.serveTimeoutMs)?n.serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:v(n.preloadPoolSize)?n.preloadPoolSize:t.preloadPoolSize,killSwitch:n.killSwitch===true,displayDurationSeconds:v(n.displayDurationSeconds)?n.displayDurationSeconds:t.displayDurationSeconds,minSdkVersion:typeof n.minSdkVersion=="string"?n.minSdkVersion:t.minSdkVersion}}async function N(e,t,n,r,o){try{let i=await fetch(`${e}${t}`,{method:"POST",headers:{"content-type":"application/json",...o??{}},body:JSON.stringify(n),signal:AbortSignal.timeout(r)});return i.ok?await i.json():(l(`POST ${t} -> HTTP ${i.status}`),null)}catch(i){return l(`POST ${t} failed:`,i),null}}function W(e,t){let n=e.host??"generic";return {publisherKey:e.publisherKey,packageName:e.packageName,placement:e.placement,host:n,sdkVersion:D,installId:t.installId,os:process.platform,termProgram:process.env.TERM_PROGRAM??void 0,topics:t.topics&&t.topics.length>0?t.topics:void 0}}function se(e){if(typeof e!="object"||e===null)return null;let t=e;if(typeof t.fill!="boolean")return null;let n={fill:t.fill,fallback:t.fallback??null,config:V(t.config),...Array.isArray(t.allowedPlacements)?{allowedPlacements:t.allowedPlacements.filter(r=>typeof r=="string")}:{}};return t.blip!==void 0&&t.blip!==null&&(n.blip=t.blip),typeof t.computeBalanceMicroUsd=="number"&&(n.computeBalanceMicroUsd=t.computeBalanceMicroUsd),typeof t.weeklyGrantMicroUsd=="number"&&(n.weeklyGrantMicroUsd=t.weeklyGrantMicroUsd),n}async function U(e,t){let n=await N(t.origin,"/v1/serve",W(e,t),t.timeoutMs);return se(n)}async function q(e,t,n){let r=await N(n.origin,"/v1/serve/batch",{...W(e,n),count:t},n.timeoutMs);if(typeof r!="object"||r===null)return null;let o=r;return Array.isArray(o.blips)?{blips:o.blips,fallback:o.fallback??null,config:V(o.config),...Array.isArray(o.allowedPlacements)?{allowedPlacements:o.allowedPlacements.filter(i=>typeof i=="string")}:{}}:null}function j(e,t){return N(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}var ae=new RegExp("\x1B\\[[0-9;]*m|\x1B\\]8;;[^\x07\x1B]*(?:\x07|\x1B\\\\)","g"),k={dim:"\x1B[2m",bold:"\x1B[1m",reset:"\x1B[0m"},ce=60,le=24,ue="\u2139 This project is supported by Blips via OpenCrater. Opt out: `npx opencrater off` or OPENCRATER_DISABLE=1";function pe(e){return e.replace(ae,"").length}function y(e,t){return t<=0?"":e.length<=t?e:t===1?"\u2026":e.slice(0,t-1).trimEnd()+"\u2026"}function fe(e,t,n){let r=e.split(/\s+/).filter(c=>c.length>0),o=[],i="";for(let c of r){let f=i===""?c:`${i} ${c}`;if(f.length<=t)i=f;else if(i!==""&&o.push(i),i=c.length>t?y(c,t):c,o.length>=n)break}i!==""&&o.length<n&&o.push(i),o.length>n&&(o.length=n);let s=o.join(" "),a=o.length-1,p=o[a];return p!==void 0&&s.length<r.join(" ").length&&(o[a]=y(`${p}\u2026`,t)),o}function O(e=process.env,t=!!process.stdout.isTTY){if(!t)return false;if(e.FORCE_HYPERLINK!==void 0&&e.FORCE_HYPERLINK!=="0")return true;let n=e.TERM_PROGRAM??"";return !!(["iTerm.app","WezTerm","ghostty","Hyper","vscode","Tabby"].includes(n)||e.KITTY_WINDOW_ID||e.WT_SESSION||Number(e.VTE_VERSION??"0")>=5e3)}function P(e=process.env,t=!!process.stdout.isTTY){return !(e.NO_COLOR!==void 0&&e.NO_COLOR!==""||!t||(e.TERM??"")==="dumb")}function de(e,t){return `\x1B]8;;${e}\x07${t}\x1B]8;;\x07`}function A(e){let t={sponsorLabel:e.sponsorLabel,title:e.creative.title,body:e.creative.body,url:e.clickUrl};return e.creative.cta!==void 0&&(t.cta=e.creative.cta),t}function J(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function m(e,t={}){let n=t.width??process.stdout.columns??80,o=Math.max(le,Math.min(n,ce))-4,i=t.color??P(),s=t.hyperlinks??O(),a=(d,$)=>i?`${$}${d}${k.reset}`:d,p=e.label?y(e.label,o):e.sponsorLabel?y(`Sponsored Blip \xB7 ${e.sponsorLabel}`,o):"Sponsored Blip",c=[];c.push(a(p,k.dim)),e.title!==e.sponsorLabel&&c.push(a(y(e.title,o),k.bold));for(let d of fe(e.body,o,2))c.push(d);let f="\u2192 ";if(s){let d=y(e.cta??e.url,o-f.length);c.push(f+a(de(e.url,d),k.dim));}else e.cta&&c.push(y(e.cta,o)),c.push(f+a(y(e.url,o-f.length),k.dim));let I=`\u256D${"\u2500".repeat(o+2)}\u256E`,E=`\u2570${"\u2500".repeat(o+2)}\u256F`,L=c.map(d=>{let $=" ".repeat(Math.max(0,o-pe(d)));return `\u2502 ${d}${$} \u2502`}),h=[];return t.disclosure&&h.push(a(ue,k.dim)),h.push(I,...L,E),h.join(`
3
3
  `)+`
4
4
  `}function X(e){return e!==void 0&&e!==""}function Y(e=process.env,t=!!process.stdout.isTTY){if(!t)return "none";let n=e.TERM??"";if(X(e.TMUX)||n.startsWith("tmux")||n.startsWith("screen"))return "none";let r=e.TERM_PROGRAM??"";return r==="iTerm.app"||e.LC_TERMINAL==="iTerm2"||r==="WezTerm"?"iterm2":n==="xterm-kitty"||X(e.KITTY_WINDOW_ID)?"kitty":"none"}var w="\x1B",me="\x07",ge=2e3,Se=2*1024*1024,ye=new Set(["image/png","image/jpeg","image/gif","image/webp"]),B=4096;async function he(e,t=fetch,n={}){let r=n.timeoutMs??ge,o=n.maxBytes??Se;try{let i=await t(e,{signal:AbortSignal.timeout(r)});if(!i.ok)return l(`media: HTTP ${i.status} for ${e}`),null;let s=(i.headers.get("content-type")??"").split(";")[0].trim().toLowerCase();if(!ye.has(s))return l(`media: disallowed content-type "${s}" for ${e}`),null;let a=Number(i.headers.get("content-length")??"0");if(Number.isFinite(a)&&a>o)return l(`media: content-length ${a} exceeds ${o} for ${e}`),null;let p=i.body;if(p&&typeof p.getReader=="function"){let f=p.getReader(),I=[],E=0;for(;;){let{done:L,value:h}=await f.read();if(L)break;if(h!==void 0){if(E+=h.byteLength,E>o)return await f.cancel().catch(()=>{}),l(`media: stream exceeded ${o} bytes for ${e}`),null;I.push(h);}}return Buffer.concat(I)}let c=Buffer.from(await i.arrayBuffer());return c.byteLength>o?(l(`media: body ${c.byteLength} bytes exceeds ${o} for ${e}`),null):c}catch(i){return l(`media: fetch failed for ${e}:`,i),null}}function be(e){let t=e.toString("base64");return `${w}]1337;File=inline=1;size=${e.byteLength};width=auto:${t}${me}`}function ke(e){let t=e.toString("base64");if(t.length<=B)return `${w}_Gf=100,a=T;${t}${w}\\`;let n=[];for(let r=0;r<t.length;r+=B){let o=t.slice(r,r+B),s=`m=${r+B>=t.length?0:1}`,a=r===0?`f=100,a=T,${s}`:s;n.push(`${w}_G${a};${o}${w}\\`);}return n.join("")}function x(e){let t=A(e),n=e.creative;switch(n.format){case "image":case "gif":return {...t,body:n.textFallback??t.body};case "video":return {...t,body:n.textFallback??t.body,cta:t.cta??"\u25B6 Watch"};case "audio":return {...t,body:n.textFallback??t.body,cta:t.cta??"\u{1F50A} Listen"};default:return t}}async function G(e,t={}){try{let n=e.creative;if(n.format!=="image"&&n.format!=="gif")return m(x(e),t);let r=t.protocol??Y();if(r==="none"||n.mediaUrl===void 0||n.mediaUrl==="")return m(x(e),t);let o={};t.timeoutMs!==void 0&&(o.timeoutMs=t.timeoutMs),t.maxBytes!==void 0&&(o.maxBytes=t.maxBytes);let i=await he(n.mediaUrl,t.fetchImpl??fetch,o);return i===null||i.byteLength===0?m(x(e),t):(r==="kitty"?ke(i):be(i))+`
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import {randomUUID}from'crypto';import*as u from'fs';import*as ee from'os';import*as C from'path';var F=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var b={minIntervalSeconds:600,serveTimeoutMs:2500,preloadPoolSize:3,killSwitch:false,displayDurationSeconds:25,minSdkVersion:""};var re=["SessionStart","SessionEnd","Stop","PostToolUse","Notification"];var D="1.1.16";var ie="https://api.opencrater.to";function K(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:ie)).replace(/\/+$/,"")}function l(...e){try{if(process.env.OPENCRATER_DEBUG!=="1")return;console.error("[opencrater]",...e);try{let t=F("os"),n=F("fs"),r=F("path");n.appendFileSync(r.join(t.homedir(),".config","opencrater","hook.log"),`${new Date().toISOString()} [opencrater] ${e.map(o=>String(o)).join(" ")}
1
+ import {randomUUID}from'crypto';import*as u from'fs';import*as ee from'os';import*as C from'path';var F=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var b={minIntervalSeconds:600,serveTimeoutMs:2500,preloadPoolSize:3,killSwitch:false,displayDurationSeconds:25,minSdkVersion:""};var re=["SessionStart","SessionEnd","Stop","PostToolUse","Notification"];var D="1.1.17";var ie="https://api.opencrater.to";function K(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:ie)).replace(/\/+$/,"")}function l(...e){try{if(process.env.OPENCRATER_DEBUG!=="1")return;console.error("[opencrater]",...e);try{let t=F("os"),n=F("fs"),r=F("path");n.appendFileSync(r.join(t.homedir(),".config","opencrater","hook.log"),`${new Date().toISOString()} [opencrater] ${e.map(o=>String(o)).join(" ")}
2
2
  `);}catch{}}catch{}}function v(e){return typeof e=="number"&&Number.isFinite(e)}function V(e){let t=b;if(typeof e!="object"||e===null)return {...t};let n=e;return {minIntervalSeconds:v(n.minIntervalSeconds)?n.minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:v(n.serveTimeoutMs)?n.serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:v(n.preloadPoolSize)?n.preloadPoolSize:t.preloadPoolSize,killSwitch:n.killSwitch===true,displayDurationSeconds:v(n.displayDurationSeconds)?n.displayDurationSeconds:t.displayDurationSeconds,minSdkVersion:typeof n.minSdkVersion=="string"?n.minSdkVersion:t.minSdkVersion}}async function N(e,t,n,r,o){try{let i=await fetch(`${e}${t}`,{method:"POST",headers:{"content-type":"application/json",...o??{}},body:JSON.stringify(n),signal:AbortSignal.timeout(r)});return i.ok?await i.json():(l(`POST ${t} -> HTTP ${i.status}`),null)}catch(i){return l(`POST ${t} failed:`,i),null}}function W(e,t){let n=e.host??"generic";return {publisherKey:e.publisherKey,packageName:e.packageName,placement:e.placement,host:n,sdkVersion:D,installId:t.installId,os:process.platform,termProgram:process.env.TERM_PROGRAM??void 0,topics:t.topics&&t.topics.length>0?t.topics:void 0}}function se(e){if(typeof e!="object"||e===null)return null;let t=e;if(typeof t.fill!="boolean")return null;let n={fill:t.fill,fallback:t.fallback??null,config:V(t.config),...Array.isArray(t.allowedPlacements)?{allowedPlacements:t.allowedPlacements.filter(r=>typeof r=="string")}:{}};return t.blip!==void 0&&t.blip!==null&&(n.blip=t.blip),typeof t.computeBalanceMicroUsd=="number"&&(n.computeBalanceMicroUsd=t.computeBalanceMicroUsd),typeof t.weeklyGrantMicroUsd=="number"&&(n.weeklyGrantMicroUsd=t.weeklyGrantMicroUsd),n}async function U(e,t){let n=await N(t.origin,"/v1/serve",W(e,t),t.timeoutMs);return se(n)}async function q(e,t,n){let r=await N(n.origin,"/v1/serve/batch",{...W(e,n),count:t},n.timeoutMs);if(typeof r!="object"||r===null)return null;let o=r;return Array.isArray(o.blips)?{blips:o.blips,fallback:o.fallback??null,config:V(o.config),...Array.isArray(o.allowedPlacements)?{allowedPlacements:o.allowedPlacements.filter(i=>typeof i=="string")}:{}}:null}function j(e,t){return N(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}var ae=new RegExp("\x1B\\[[0-9;]*m|\x1B\\]8;;[^\x07\x1B]*(?:\x07|\x1B\\\\)","g"),k={dim:"\x1B[2m",bold:"\x1B[1m",reset:"\x1B[0m"},ce=60,le=24,ue="\u2139 This project is supported by Blips via OpenCrater. Opt out: `npx opencrater off` or OPENCRATER_DISABLE=1";function pe(e){return e.replace(ae,"").length}function y(e,t){return t<=0?"":e.length<=t?e:t===1?"\u2026":e.slice(0,t-1).trimEnd()+"\u2026"}function fe(e,t,n){let r=e.split(/\s+/).filter(c=>c.length>0),o=[],i="";for(let c of r){let f=i===""?c:`${i} ${c}`;if(f.length<=t)i=f;else if(i!==""&&o.push(i),i=c.length>t?y(c,t):c,o.length>=n)break}i!==""&&o.length<n&&o.push(i),o.length>n&&(o.length=n);let s=o.join(" "),a=o.length-1,p=o[a];return p!==void 0&&s.length<r.join(" ").length&&(o[a]=y(`${p}\u2026`,t)),o}function O(e=process.env,t=!!process.stdout.isTTY){if(!t)return false;if(e.FORCE_HYPERLINK!==void 0&&e.FORCE_HYPERLINK!=="0")return true;let n=e.TERM_PROGRAM??"";return !!(["iTerm.app","WezTerm","ghostty","Hyper","vscode","Tabby"].includes(n)||e.KITTY_WINDOW_ID||e.WT_SESSION||Number(e.VTE_VERSION??"0")>=5e3)}function P(e=process.env,t=!!process.stdout.isTTY){return !(e.NO_COLOR!==void 0&&e.NO_COLOR!==""||!t||(e.TERM??"")==="dumb")}function de(e,t){return `\x1B]8;;${e}\x07${t}\x1B]8;;\x07`}function A(e){let t={sponsorLabel:e.sponsorLabel,title:e.creative.title,body:e.creative.body,url:e.clickUrl};return e.creative.cta!==void 0&&(t.cta=e.creative.cta),t}function J(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function m(e,t={}){let n=t.width??process.stdout.columns??80,o=Math.max(le,Math.min(n,ce))-4,i=t.color??P(),s=t.hyperlinks??O(),a=(d,$)=>i?`${$}${d}${k.reset}`:d,p=e.label?y(e.label,o):e.sponsorLabel?y(`Sponsored Blip \xB7 ${e.sponsorLabel}`,o):"Sponsored Blip",c=[];c.push(a(p,k.dim)),e.title!==e.sponsorLabel&&c.push(a(y(e.title,o),k.bold));for(let d of fe(e.body,o,2))c.push(d);let f="\u2192 ";if(s){let d=y(e.cta??e.url,o-f.length);c.push(f+a(de(e.url,d),k.dim));}else e.cta&&c.push(y(e.cta,o)),c.push(f+a(y(e.url,o-f.length),k.dim));let I=`\u256D${"\u2500".repeat(o+2)}\u256E`,E=`\u2570${"\u2500".repeat(o+2)}\u256F`,L=c.map(d=>{let $=" ".repeat(Math.max(0,o-pe(d)));return `\u2502 ${d}${$} \u2502`}),h=[];return t.disclosure&&h.push(a(ue,k.dim)),h.push(I,...L,E),h.join(`
3
3
  `)+`
4
4
  `}function X(e){return e!==void 0&&e!==""}function Y(e=process.env,t=!!process.stdout.isTTY){if(!t)return "none";let n=e.TERM??"";if(X(e.TMUX)||n.startsWith("tmux")||n.startsWith("screen"))return "none";let r=e.TERM_PROGRAM??"";return r==="iTerm.app"||e.LC_TERMINAL==="iTerm2"||r==="WezTerm"?"iterm2":n==="xterm-kitty"||X(e.KITTY_WINDOW_ID)?"kitty":"none"}var w="\x1B",me="\x07",ge=2e3,Se=2*1024*1024,ye=new Set(["image/png","image/jpeg","image/gif","image/webp"]),B=4096;async function he(e,t=fetch,n={}){let r=n.timeoutMs??ge,o=n.maxBytes??Se;try{let i=await t(e,{signal:AbortSignal.timeout(r)});if(!i.ok)return l(`media: HTTP ${i.status} for ${e}`),null;let s=(i.headers.get("content-type")??"").split(";")[0].trim().toLowerCase();if(!ye.has(s))return l(`media: disallowed content-type "${s}" for ${e}`),null;let a=Number(i.headers.get("content-length")??"0");if(Number.isFinite(a)&&a>o)return l(`media: content-length ${a} exceeds ${o} for ${e}`),null;let p=i.body;if(p&&typeof p.getReader=="function"){let f=p.getReader(),I=[],E=0;for(;;){let{done:L,value:h}=await f.read();if(L)break;if(h!==void 0){if(E+=h.byteLength,E>o)return await f.cancel().catch(()=>{}),l(`media: stream exceeded ${o} bytes for ${e}`),null;I.push(h);}}return Buffer.concat(I)}let c=Buffer.from(await i.arrayBuffer());return c.byteLength>o?(l(`media: body ${c.byteLength} bytes exceeds ${o} for ${e}`),null):c}catch(i){return l(`media: fetch failed for ${e}:`,i),null}}function be(e){let t=e.toString("base64");return `${w}]1337;File=inline=1;size=${e.byteLength};width=auto:${t}${me}`}function ke(e){let t=e.toString("base64");if(t.length<=B)return `${w}_Gf=100,a=T;${t}${w}\\`;let n=[];for(let r=0;r<t.length;r+=B){let o=t.slice(r,r+B),s=`m=${r+B>=t.length?0:1}`,a=r===0?`f=100,a=T,${s}`:s;n.push(`${w}_G${a};${o}${w}\\`);}return n.join("")}function x(e){let t=A(e),n=e.creative;switch(n.format){case "image":case "gif":return {...t,body:n.textFallback??t.body};case "video":return {...t,body:n.textFallback??t.body,cta:t.cta??"\u25B6 Watch"};case "audio":return {...t,body:n.textFallback??t.body,cta:t.cta??"\u{1F50A} Listen"};default:return t}}async function G(e,t={}){try{let n=e.creative;if(n.format!=="image"&&n.format!=="gif")return m(x(e),t);let r=t.protocol??Y();if(r==="none"||n.mediaUrl===void 0||n.mediaUrl==="")return m(x(e),t);let o={};t.timeoutMs!==void 0&&(o.timeoutMs=t.timeoutMs),t.maxBytes!==void 0&&(o.maxBytes=t.maxBytes);let i=await he(n.mediaUrl,t.fetchImpl??fetch,o);return i===null||i.byteLength===0?m(x(e),t):(r==="kitty"?ke(i):be(i))+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencrater",
3
- "version": "1.1.16",
3
+ "version": "1.1.17",
4
4
  "description": "OpenCrater — sponsor cards for AI coding terminals (Claude Code, Codex, Gemini CLI, Copilot CLI). One command, auto-wires every host, opt out anytime.",
5
5
  "keywords": [
6
6
  "opencrater",