opencrater 1.1.30 → 1.1.32

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'),f=require('fs'),z=require('os'),p=require('path'),child_process=require('child_process'),le=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 f__namespace=/*#__PURE__*/_interopNamespace(f);var z__namespace=/*#__PURE__*/_interopNamespace(z);var p__namespace=/*#__PURE__*/_interopNamespace(p);var le__namespace=/*#__PURE__*/_interopNamespace(le);var B=(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 fe(e=process.env){return p__namespace.join(z__namespace.homedir(),".config","opencrater")}function A(e=process.env){return p__namespace.join(fe(e),"state.json")}function T(){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)}var W=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function V(e){for(let t=0;;t++)try{return {text:f__namespace.readFileSync(e,"utf8")}}catch(n){let o=n.code??"";if(!(o==="ENOENT"||W.has(o)))return {locked:true};if(t>=4)return o==="ENOENT"?{missing:true}:{locked:true};try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(t+1));}catch{}}}function me(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 ge(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 he(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 ye(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 ke(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 Se(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 we(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 be(e){let t=T();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:me(n.cachedConfig),allowedPlacements:he(n.allowedPlacements),sessionTopics:ye(n.sessionTopics),integrations:ke(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:Se(n.computeRouting),computeCards:we(n.computeCards),configFetchedAt:y(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:ge(n.pool)}}function d(e=process.env){let t=A(e),n=V(t);if(n.text!==void 0)try{return be(JSON.parse(n.text))}catch{let o=T();try{O(o,e);}catch{}return o}if(n.missing){let o=T();try{O(o,e);}catch{}return o}return T()}function O(e,t=process.env,n={}){let o=A(t),r=p__namespace.dirname(o);f__namespace.mkdirSync(r,{recursive:true});let s=V(o),i=null;if(s.text!==void 0)try{i=JSON.parse(s.text);}catch{i=null;}if(i)typeof i.lastShownAt=="number"&&i.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:i.lastShownAt}),!n.allowClearToken&&typeof i.devToken=="string"&&e.devToken==null&&(e={...e,devToken:i.devToken}),typeof i.installId=="string"&&i.installId.length>0&&i.installId!==e.installId&&(e={...e,installId:i.installId});else if(!n.allowClearToken&&e.devToken==null&&s.text===void 0&&!s.missing)return;let l=p__namespace.join(r,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);f__namespace.writeFileSync(l,JSON.stringify(e,null,2)+`
3
- `,"utf8");for(let a=0;;a++)try{f__namespace.renameSync(l,o);return}catch(u){let c=u.code??"";if(a>=4||!W.has(c)){try{f__namespace.rmSync(l,{force:!0});}catch{}if(a>=4)return;throw u}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(a+1));}catch{}}}function w(e,t=process.env){let n={...d(t),...e};return O(n,t),n}var q={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 k=["claude_code","codex","gemini_cli","copilot_cli"];function b(e){return e.includes("opencrater-hook")}function ve(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ce(e,t){return b(e)&&new RegExp(`--package ['"]?${ve(t)}['"]?`).test(e)}function te(e,t){return t?Ce(e,t):b(e)&&!/--package\b/.test(e)}function Y(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var X='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',Q="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function F(e,t,n,o){let r=`--placement ${t}`;return n&&(r+=` --key ${Y(n)}`),o&&(r+=` --package ${Y(o)}`),r+=` --host ${e}`,`{ if [ -f ${X} ]; then node ${X} ${r}; else npx -y -p opencrater opencrater-hook ${r}; fi; } 2>/dev/null || true`}function oe(e,t,n,o){let r=`--placement ${t}`;return n&&(r+=` --key '${n}'`),o&&(r+=` --package '${o}'`),r+=` --host ${e}`,`try { if (Test-Path "${Q}") { node "${Q}" ${r} } else { npx -y -p opencrater opencrater-hook ${r} } } catch {}`}function Z(e,t,n,o){let r={type:"command",command:F(e,t,n,o)};return e==="codex"&&(r.commandWindows=oe(e,t,n,o)),r}function re(e,t){let n=z__namespace.homedir();switch(e){case "claude_code":{let o=t.CLAUDE_CONFIG_DIR;return o&&o.trim()!==""?o:p__namespace.join(n,".claude")}case "codex":{let o=t.CODEX_HOME;return o&&o.trim()!==""?o:p__namespace.join(n,".codex")}case "gemini_cli":return p__namespace.join(n,".gemini");case "copilot_cli":{let o=t.COPILOT_HOME;return o&&o.trim()!==""?o:p__namespace.join(n,".copilot")}default:return p__namespace.join(n,".opencrater-unknown")}}function N(e,t=process.env){let n=re(e,t);switch(e){case "claude_code":return p__namespace.join(n,"settings.json");case "codex":return p__namespace.join(n,"hooks.json");case "gemini_cli":return p__namespace.join(n,"settings.json");case "copilot_cli":return p__namespace.join(n,"hooks","hooks.json");default:return p__namespace.join(n,"hooks.json")}}var Oe={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"]};function Ae(e,t){if(e.length===0)return false;let n=(t.PATH??t.Path??"").split(p__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(f__namespace.existsSync(p__namespace.join(r,s+i)))return !0}catch{}return false}function Re(e,t=process.env){try{if(f__namespace.existsSync(re(e,t)))return !0}catch{}return Ae(Oe[e]??[],t)}function D(e=process.env){return k.filter(t=>Re(t,e))}function $(e){let t;try{t=f__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 L(e,t){let n=p__namespace.dirname(e);f__namespace.mkdirSync(n,{recursive:true});let o=p__namespace.join(n,`.${p__namespace.basename(e)}.${process.pid}.tmp`);f__namespace.writeFileSync(o,JSON.stringify(t,null,2)+`
4
- `,"utf8"),f__namespace.renameSync(o,e);}function Pe(e,t){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&te(n.command,t))}function Ee(e,t,n,o){let r=N(e),s=$(r),i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(o.every(a=>{let u=Z(e,a,t,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>Array.isArray(c.hooks)&&c.hooks.some(m=>m.command===u.command&&m.commandWindows===u.commandWindows))}))return "nochange";for(let a of o){let c=(Array.isArray(i[a])?i[a]:[]).filter(m=>!Pe(m,n));c.push({matcher:"",hooks:[Z(e,a,t,n)]}),i[a]=c;}return s.hooks=i,L(r,s),"wrote"}var ee=12;function Ie(e,t){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&te(n,t))}function xe(e,t,n,o){let r=N(e),s=$(r);typeof s.version!="number"&&(s.version=1);let i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(o.every(a=>{let u=F(e,a,t,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>c.bash===u&&c.timeoutSec===ee)}))return "nochange";for(let a of o){let c=(Array.isArray(i[a])?i[a]:[]).filter(m=>!Ie(m,n));c.push({type:"command",bash:F(e,a,t,n),powershell:oe(e,a,t,n),timeoutSec:ee}),i[a]=c;}return s.hooks=i,L(r,s),"wrote"}function _(e){return [...q[e]]}function G(e,t,n){let o=_(e);return o.length===0?"nochange":e==="copilot_cli"?xe(e,t,n,o):Ee(e,t,n,o)}function R(e,t,n=process.env){return D(n).map(o=>{try{let r=G(o,e,t);return {host:o,status:r,events:_(o)}}catch(r){return {host:o,status:"error",events:[],error:r.message}}})}function J(e=process.env){let t=[];for(let n of k){let o;try{o=$(N(n,e));}catch{continue}let r=o.hooks;if(!(!r||typeof r!="object"))for(let[s,i]of Object.entries(r))for(let l of Array.isArray(i)?i:[]){let a=l,u=Array.isArray(a.hooks)?a.hooks.find(g=>typeof g.command=="string"&&b(g.command))?.command:void 0,c=[a.bash,a.command,a.powershell].find(g=>typeof g=="string"&&b(g)),m=u??c;m&&t.push({host:n,event:s,command:m});}}return t}function se(e=process.env){let t=0;for(let n of k){let o=N(n,e),r;try{r=$(o);}catch{continue}let s=r.hooks;if(!s||typeof s!="object")continue;let i=s,l=false;for(let a of Object.keys(i)){let u=Array.isArray(i[a])?i[a]:[],c=u.filter(m=>{let g=m,K=Array.isArray(g.hooks)&&g.hooks.some(C=>typeof C.command=="string"&&b(C.command))||[g.bash,g.powershell,g.command].some(C=>typeof C=="string"&&b(C));return K&&t++,!K});c.length!==u.length&&(l=true,c.length>0?i[a]=c:delete i[a]);}if(l)try{let a=Object.keys(r).filter(c=>c!=="version"&&c!=="hooks"),u=n==="copilot_cli"||n==="codex";Object.keys(i).length===0&&a.length===0&&u?f__namespace.rmSync(o,{force:!0}):L(o,r);}catch{}}return t}var P="1.1.30";var Te="https://api.opencrater.to";function v(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:Te)).replace(/\/+$/,"")}function $e(){return p__namespace.join(z__namespace.homedir(),".config","opencrater","runtime")}function _e(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function j(e=$e()){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 je(){let e=process.env.OPENCRATER_WEB_ORIGIN;return e&&e.trim()!==""?e.replace(/\/$/,""):v().replace("//api.","//").replace(/\/$/,"")}function He(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 Me(e){let t=le__namespace.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>t.question(e,o=>(t.close(),n(o))))}function I(e){return `${Math.round(e/1e3).toLocaleString()} tokens`}async function x(e,t){try{let n=new URL(`${v()}/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 Ue(){let e=`${je()}/dev/link`;console.log("Sign in and generate a CLI token here (we tried to open it):"),console.log(` ${e}
5
- `),He(e);let t=(await Me("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 x(t,d().installId);if(!n)return console.error("Couldn't verify that token \u2014 check it and try again."),1;w({devToken:t}),console.log(`
6
- \u2713 Signed in as ${n.displayName}.`),console.log(` Compute balance: ${I(n.balanceMicroUsd)} \xB7 tier: ${n.trustTier}`);let o=R().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(j()?"\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 Be(){let e=d().devToken;if(!e)return console.error("Not signed in. Run: opencrater login"),1;let t=await x(e,d().installId);return t?(console.log(`Compute balance: ${I(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 Fe(){return O({...d(),devToken:null},process.env,{allowClearToken:true}),console.log("Signed out of the OpenCrater compute wallet on this machine."),0}async function De(e){let t=d().devToken;if(!t)return console.error("Not signed in. Run: opencrater login"),1;let n=await x(t,d().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=`${v().replace(/\/$/,"")}/gateway`,r=p__namespace.join(p__namespace.dirname(A()),"claude-gateway.settings.json");try{f__namespace.mkdirSync(p__namespace.dirname(r),{recursive:!0}),f__namespace.writeFileSync(r,JSON.stringify({apiKeyHelper:`echo ${t}`}),{mode:384});}catch(l){return console.error(`Couldn't write gateway settings: ${l.message}`),1}n&&console.log(`Launching Claude Code on OpenCrater compute \xB7 balance ${I(n.balanceMicroUsd)}`);let s={...process.env,ANTHROPIC_BASE_URL:o,OPENCRATER_ON_GATEWAY:"1"};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(l=>{i.on("exit",a=>l(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"),l(127);});})}async function Le(e){let t=d().devToken;if(!t)return console.error("Not signed in. Run: opencrater login"),1;let n=await x(t,d().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=`${v().replace(/\/$/,"")}/gateway/v1`;n&&console.log(`Launching Codex on OpenCrater compute \xB7 balance ${I(n.balanceMicroUsd)}`);let r={...process.env,OPENCRATER_TOKEN:t,OPENCRATER_ON_GATEWAY:"1"},s=["-c",'model_provider="opencrater"',"-c",'model_providers.opencrater.name="OpenCrater"',"-c",`model_providers.opencrater.base_url="${o}"`,"-c",'model_providers.opencrater.wire_api="responses"',"-c",'model_providers.opencrater.env_key="OPENCRATER_TOKEN"'],i=child_process.spawn("codex",[...s,...e],{stdio:"inherit",env:r,shell:process.platform==="win32"});return await new Promise(l=>{i.on("exit",a=>l(a??0)),i.on("error",a=>{console.error(`Couldn't launch codex: ${a.message}`),console.error("Is Codex installed? npm i -g @openai/codex"),l(127);});})}async function Ge(e){let t=d().devToken;if(!t)return console.error("Not signed in. Run: opencrater login"),1;let n=await x(t,d().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=`${v().replace(/\/$/,"")}/gateway/v1`;n&&console.log(`Launching Grok on OpenCrater compute \xB7 balance ${I(n.balanceMicroUsd)}`);let r={...process.env,GROK_MODELS_BASE_URL:o,XAI_API_KEY:t,OPENCRATER_ON_GATEWAY:"1"},i=e.some(a=>a==="-m"||a==="--model"||a.startsWith("--model="))?[]:["-m","x-ai/grok-build-0.1"],l=child_process.spawn("grok",[...i,...e],{stdio:"inherit",env:r,shell:process.platform==="win32"});return await new Promise(a=>{l.on("exit",u=>a(u??0)),l.on("error",u=>{console.error(`Couldn't launch grok: ${u.message}`),console.error("Is Grok installed? npm i -g @xai-official/grok"),a(127);});})}function ue(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 pe(e,t){let n=d();n.integrations.some(o=>o.key===e&&o.package===t)||w({integrations:[...n.integrations,{key:e,package:t}].slice(-32)});}function H(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 Je(){return w({optOut:true}),console.log("OpenCrater Blips are now OFF for this machine."),console.log("Re-enable any time with: npx opencrater on"),0}function Ke(e){let{flags:t}=ue(e),n=t.get("key"),o=t.get("package");return w({optOut:false}),n&&o?(pe(n,o),H(R(n,o),o),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(j()?"\u2713":"skipped (npm unavailable \u2014 hooks use npx fallback)")):d().devToken?(H(R()),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(j()?"\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 ze(){let e=d(),t=e.lastShownAt>0?new Date(e.lastShownAt).toISOString():"never";console.log(`opencrater v${P}`),console.log(` state file: ${A()}`),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: ${D().join(", ")||"(none)"}`),console.log(` integrations: ${e.integrations.map(o=>o.package).join(", ")||"(none)"}`);let n=J();return console.log(` wired hooks: ${n.length}`),0}function We(e){let{flags:t}=ue(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;pe(n,o);let r=t.get("host");if(r&&r!=="true"){if(!k.includes(r))return console.error(`Unknown host "${r}". Supported: ${k.join(", ")}`),1;let s=r;try{let i=G(s,n,o);H([{host:s,status:i,events:_(s)}],o);}catch(i){return console.error(`Could not wire ${s}: ${i.message}`),1}}else H(R(n,o),o);return console.log("Remove with: npx opencrater hooks uninstall"),0}function Ve(){let e=se();return w({integrations:[]}),console.log(e>0?`Removed ${e} OpenCrater hook${e===1?"":"s"} across all hosts.`:"No OpenCrater hooks installed."),0}function qe(){let e=J();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 ce(){return console.log(`opencrater v${P} \u2014 OpenCrater Blips
2
+ 'use strict';var crypto=require('crypto'),f=require('fs'),W=require('os'),u=require('path'),child_process=require('child_process'),le=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 f__namespace=/*#__PURE__*/_interopNamespace(f);var W__namespace=/*#__PURE__*/_interopNamespace(W);var u__namespace=/*#__PURE__*/_interopNamespace(u);var le__namespace=/*#__PURE__*/_interopNamespace(le);var F=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(o,n)=>(typeof require<"u"?require:o)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});function me(e=process.env){return u__namespace.join(W__namespace.homedir(),".config","opencrater")}function A(e=process.env){return u__namespace.join(me(e),"state.json")}function $(){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)}var V=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function q(e){for(let o=0;;o++)try{return {text:f__namespace.readFileSync(e,"utf8")}}catch(n){let t=n.code??"";if(!(t==="ENOENT"||V.has(t)))return {locked:true};if(o>=4)return t==="ENOENT"?{missing:true}:{locked:true};try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(o+1));}catch{}}}function fe(e){if(typeof e!="object"||e===null)return null;let o=e;return !y(o.minIntervalSeconds)||!y(o.serveTimeoutMs)||!y(o.preloadPoolSize)||typeof o.killSwitch!="boolean"?null:{minIntervalSeconds:o.minIntervalSeconds,serveTimeoutMs:o.serveTimeoutMs,preloadPoolSize:o.preloadPoolSize,killSwitch:o.killSwitch,displayDurationSeconds:y(o.displayDurationSeconds)?o.displayDurationSeconds:25,minSdkVersion:typeof o.minSdkVersion=="string"?o.minSdkVersion:""}}function ge(e){if(!Array.isArray(e))return [];let o=[];for(let n of e){if(typeof n!="object"||n===null)continue;let t=n,r=t.blip;if(!y(t.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"||o.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:t.renderBy});}return o}function he(e){if(typeof e!="object"||e===null||Array.isArray(e))return {};let o={};for(let[n,t]of Object.entries(e)){if(!Array.isArray(t))continue;let r=t.filter(s=>typeof s=="string"&&s.length<=64);o[n]=r.slice(0,64);}return o}function ye(e){if(!Array.isArray(e))return [];let o=[];for(let n of e){if(typeof n!="object"||n===null)continue;let t=n;if(!(typeof t.topic!="string"||!y(t.at))&&(o.push({topic:t.topic.slice(0,32),at:t.at}),o.length>=24))break}return o}function ke(e){if(!Array.isArray(e))return [];let o=[],n=new Set;for(let t of e){if(typeof t!="object"||t===null)continue;let r=t;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),o.push({key:r.key,package:r.package}),o.length>=32))break}return o}function Se(e){if(typeof e!="object"||e===null)return null;let o=e,n={};if(typeof o.savedEnv=="object"&&o.savedEnv!==null)for(let[t,r]of Object.entries(o.savedEnv))(typeof r=="string"||r===null)&&(n[t]=r);return {active:o.active===true,savedEnv:n}}function we(e){if(typeof e!="object"||e===null)return null;let o=e,n=t=>y(t)&&t>=0?t:0;return {turns:n(o.turns),lastLimitAt:n(o.lastLimitAt),lastDepletedAt:n(o.lastDepletedAt),lastBackupAt:n(o.lastBackupAt)}}function be(e){let o=$();if(typeof e!="object"||e===null)return o;let n=e;return {installId:typeof n.installId=="string"&&n.installId.length>0?n.installId:o.installId,lastShownAt:y(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:fe(n.cachedConfig),allowedPlacements:he(n.allowedPlacements),sessionTopics:ye(n.sessionTopics),integrations:ke(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:Se(n.computeRouting),computeCards:we(n.computeCards),configFetchedAt:y(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:ge(n.pool)}}function d(e=process.env){let o=A(e),n=q(o);if(n.text!==void 0)try{return be(JSON.parse(n.text))}catch{let t=$();try{O(t,e);}catch{}return t}if(n.missing){let t=$();try{O(t,e);}catch{}return t}return $()}function O(e,o=process.env,n={}){let t=A(o),r=u__namespace.dirname(t);f__namespace.mkdirSync(r,{recursive:true});let s=q(t),i=null;if(s.text!==void 0)try{i=JSON.parse(s.text);}catch{i=null;}if(i)typeof i.lastShownAt=="number"&&i.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:i.lastShownAt}),!n.allowClearToken&&typeof i.devToken=="string"&&e.devToken==null&&(e={...e,devToken:i.devToken}),typeof i.installId=="string"&&i.installId.length>0&&i.installId!==e.installId&&(e={...e,installId:i.installId});else if(!n.allowClearToken&&e.devToken==null&&s.text===void 0&&!s.missing)return;let l=u__namespace.join(r,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);f__namespace.writeFileSync(l,JSON.stringify(e,null,2)+`
3
+ `,"utf8");for(let a=0;;a++)try{f__namespace.renameSync(l,t);return}catch(p){let c=p.code??"";if(a>=4||!V.has(c)){try{f__namespace.rmSync(l,{force:!0});}catch{}if(a>=4)return;throw p}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(a+1));}catch{}}}function w(e,o=process.env){let n={...d(o),...e};return O(n,o),n}var Y={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"],grok_cli:["SessionStart","Stop","SessionEnd","Notification"],generic:["SessionStart","Stop"]};var k=["claude_code","codex","gemini_cli","copilot_cli","grok_cli"];function b(e){return e.includes("opencrater-hook")}function ve(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ce(e,o){return b(e)&&new RegExp(`--package ['"]?${ve(o)}['"]?`).test(e)}function oe(e,o){return o?Ce(e,o):b(e)&&!/--package\b/.test(e)}function X(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var Q='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',Z="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function T(e,o,n,t){let r=`--placement ${o}`;return n&&(r+=` --key ${X(n)}`),t&&(r+=` --package ${X(t)}`),r+=` --host ${e}`,`{ if [ -f ${Q} ]; then node ${Q} ${r}; else npx -y -p opencrater opencrater-hook ${r}; fi; } 2>/dev/null || true`}function Oe(e,o,n){if(process.platform!=="win32")return T("grok_cli",e,o,n);let t=`--placement ${e}`;o&&(t+=` --key ${o}`),n&&(t+=` --package ${n}`),t+=" --host grok_cli";let r='"%USERPROFILE%\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js"';return `if exist ${r} (node ${r} ${t}) else (npx -y -p opencrater opencrater-hook ${t})`}function te(e,o,n,t){let r=`--placement ${o}`;return n&&(r+=` --key '${n}'`),t&&(r+=` --package '${t}'`),r+=` --host ${e}`,`try { if (Test-Path "${Z}") { node "${Z}" ${r} } else { npx -y -p opencrater opencrater-hook ${r} } } catch {}`}function L(e,o,n,t){if(e==="grok_cli")return {type:"command",command:Oe(o,n,t),timeout:15};let r={type:"command",command:T(e,o,n,t)};return e==="codex"&&(r.commandWindows=te(e,o,n,t)),r}function re(e,o){let n=W__namespace.homedir();switch(e){case "claude_code":{let t=o.CLAUDE_CONFIG_DIR;return t&&t.trim()!==""?t:u__namespace.join(n,".claude")}case "codex":{let t=o.CODEX_HOME;return t&&t.trim()!==""?t:u__namespace.join(n,".codex")}case "gemini_cli":return u__namespace.join(n,".gemini");case "copilot_cli":{let t=o.COPILOT_HOME;return t&&t.trim()!==""?t:u__namespace.join(n,".copilot")}case "grok_cli":{let t=o.GROK_HOME;return t&&t.trim()!==""?t:u__namespace.join(n,".grok")}default:return u__namespace.join(n,".opencrater-unknown")}}function _(e,o=process.env){let n=re(e,o);switch(e){case "claude_code":return u__namespace.join(n,"settings.json");case "codex":return u__namespace.join(n,"hooks.json");case "gemini_cli":return u__namespace.join(n,"settings.json");case "copilot_cli":return u__namespace.join(n,"hooks","hooks.json");case "grok_cli":return u__namespace.join(n,"hooks","opencrater.json");default:return u__namespace.join(n,"hooks.json")}}var Ae={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"],grok_cli:["grok"]};function Re(e,o){if(e.length===0)return false;let n=(o.PATH??o.Path??"").split(u__namespace.delimiter).filter(Boolean),t=process.platform==="win32"?["",".exe",".cmd",".bat"]:[""];for(let r of n)for(let s of e)for(let i of t)try{if(f__namespace.existsSync(u__namespace.join(r,s+i)))return !0}catch{}return false}function Pe(e,o=process.env){try{if(f__namespace.existsSync(re(e,o)))return !0}catch{}return Re(Ae[e]??[],o)}function D(e=process.env){return k.filter(o=>Pe(o,e))}function N(e){let o;try{o=f__namespace.readFileSync(e,"utf8");}catch{return {}}let n=JSON.parse(o);if(typeof n!="object"||n===null||Array.isArray(n))throw new Error(`${e} is not a JSON object`);return n}function G(e,o){let n=u__namespace.dirname(e);f__namespace.mkdirSync(n,{recursive:true});let t=u__namespace.join(n,`.${u__namespace.basename(e)}.${process.pid}.tmp`);f__namespace.writeFileSync(t,JSON.stringify(o,null,2)+`
4
+ `,"utf8"),f__namespace.renameSync(t,e);}function Ee(e,o){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&oe(n.command,o))}function Ie(e,o,n,t){let r=_(e),s=N(r),i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(t.every(a=>{let p=L(e,a,o,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>Array.isArray(c.hooks)&&c.hooks.some(g=>g.command===p.command&&g.commandWindows===p.commandWindows))}))return "nochange";for(let a of t){let c=(Array.isArray(i[a])?i[a]:[]).filter(m=>!Ee(m,n)),g=e==="grok_cli"?{hooks:[L(e,a,o,n)]}:{matcher:"",hooks:[L(e,a,o,n)]};c.push(g),i[a]=c;}return s.hooks=i,G(r,s),"wrote"}var ee=12;function xe(e,o){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&oe(n,o))}function $e(e,o,n,t){let r=_(e),s=N(r);typeof s.version!="number"&&(s.version=1);let i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(t.every(a=>{let p=T(e,a,o,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>c.bash===p&&c.timeoutSec===ee)}))return "nochange";for(let a of t){let c=(Array.isArray(i[a])?i[a]:[]).filter(g=>!xe(g,n));c.push({type:"command",bash:T(e,a,o,n),powershell:te(e,a,o,n),timeoutSec:ee}),i[a]=c;}return s.hooks=i,G(r,s),"wrote"}function j(e){return [...Y[e]]}function J(e,o,n){let t=j(e);return t.length===0?"nochange":e==="copilot_cli"?$e(e,o,n,t):Ie(e,o,n,t)}function R(e,o,n=process.env){return D(n).map(t=>{try{let r=J(t,e,o);return {host:t,status:r,events:j(t)}}catch(r){return {host:t,status:"error",events:[],error:r.message}}})}function K(e=process.env){let o=[];for(let n of k){let t;try{t=N(_(n,e));}catch{continue}let r=t.hooks;if(!(!r||typeof r!="object"))for(let[s,i]of Object.entries(r))for(let l of Array.isArray(i)?i:[]){let a=l,p=Array.isArray(a.hooks)?a.hooks.find(m=>typeof m.command=="string"&&b(m.command))?.command:void 0,c=[a.bash,a.command,a.powershell].find(m=>typeof m=="string"&&b(m)),g=p??c;g&&o.push({host:n,event:s,command:g});}}return o}function se(e=process.env){let o=0;for(let n of k){let t=_(n,e),r;try{r=N(t);}catch{continue}let s=r.hooks;if(!s||typeof s!="object")continue;let i=s,l=false;for(let a of Object.keys(i)){let p=Array.isArray(i[a])?i[a]:[],c=p.filter(g=>{let m=g,z=Array.isArray(m.hooks)&&m.hooks.some(C=>typeof C.command=="string"&&b(C.command))||[m.bash,m.powershell,m.command].some(C=>typeof C=="string"&&b(C));return z&&o++,!z});c.length!==p.length&&(l=true,c.length>0?i[a]=c:delete i[a]);}if(l)try{let a=Object.keys(r).filter(c=>c!=="version"&&c!=="hooks"),p=n==="copilot_cli"||n==="codex";Object.keys(i).length===0&&a.length===0&&p?f__namespace.rmSync(t,{force:!0}):G(t,r);}catch{}}return o}var P="1.1.32";var Te="https://api.opencrater.to";function v(e,o=process.env){let n=o.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:Te)).replace(/\/+$/,"")}function Ne(){return u__namespace.join(W__namespace.homedir(),".config","opencrater","runtime")}function je(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function H(e=Ne()){if(process.env.VITEST||process.env.OPENCRATER_DISABLE_RUNTIME_PIN)return false;try{return child_process.spawnSync("npm",je(e),{stdio:"ignore",windowsHide:!0,shell:process.platform==="win32"}).status===0}catch{return false}}function He(){let e=process.env.OPENCRATER_WEB_ORIGIN;return e&&e.trim()!==""?e.replace(/\/$/,""):v().replace("//api.","//").replace(/\/$/,"")}function Me(e){try{let o=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";child_process.spawn(o,[e],{stdio:"ignore",detached:!0,shell:process.platform==="win32"}).unref();}catch{}}function Ue(e){let o=le__namespace.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>o.question(e,t=>(o.close(),n(t))))}function I(e){return `${Math.round(e/1e3).toLocaleString()} tokens`}async function x(e,o){try{let n=new URL(`${v()}/v1/dev/me`);o&&n.searchParams.set("installId",o);let t=await fetch(n,{headers:{authorization:`Bearer ${e}`}});return t.ok?await t.json():null}catch{return null}}async function Be(){let e=`${He()}/dev/link`;console.log("Sign in and generate a CLI token here (we tried to open it):"),console.log(` ${e}
5
+ `),Me(e);let o=(await Ue("Paste your token (ocd_\u2026): ")).trim();if(!o.startsWith("ocd_"))return console.error("That doesn't look like a token (should start with ocd_)."),1;let n=await x(o,d().installId);if(!n)return console.error("Couldn't verify that token \u2014 check it and try again."),1;w({devToken:o}),console.log(`
6
+ \u2713 Signed in as ${n.displayName}.`),console.log(` Compute balance: ${I(n.balanceMicroUsd)} \xB7 tier: ${n.trustTier}`);let t=R().filter(r=>r.status!=="error").map(r=>r.host);return t.length?(console.log(` Wired into: ${t.join(", ")}`),process.stdout.write(" Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(H()?"\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 Fe(){let e=d().devToken;if(!e)return console.error("Not signed in. Run: opencrater login"),1;let o=await x(e,d().installId);return o?(console.log(`Compute balance: ${I(o.balanceMicroUsd)}`),console.log(` signed in as: ${o.displayName} \xB7 tier: ${o.trustTier}`),0):(console.error("Couldn't reach OpenCrater (or your session expired \u2014 try: opencrater login)."),1)}function Le(){return O({...d(),devToken:null},process.env,{allowClearToken:true}),console.log("Signed out of the OpenCrater compute wallet on this machine."),0}async function De(e){let o=d().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await x(o,d().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 t=`${v().replace(/\/$/,"")}/gateway`,r=u__namespace.join(u__namespace.dirname(A()),"claude-gateway.settings.json");try{f__namespace.mkdirSync(u__namespace.dirname(r),{recursive:!0}),f__namespace.writeFileSync(r,JSON.stringify({apiKeyHelper:`echo ${o}`}),{mode:384});}catch(l){return console.error(`Couldn't write gateway settings: ${l.message}`),1}n&&console.log(`Launching Claude Code on OpenCrater compute \xB7 balance ${I(n.balanceMicroUsd)}`);let s={...process.env,ANTHROPIC_BASE_URL:t,OPENCRATER_ON_GATEWAY:"1"};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(l=>{i.on("exit",a=>l(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"),l(127);});})}async function Ge(e){let o=d().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await x(o,d().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 t=`${v().replace(/\/$/,"")}/gateway/v1`;n&&console.log(`Launching Codex on OpenCrater compute \xB7 balance ${I(n.balanceMicroUsd)}`);let r={...process.env,OPENCRATER_TOKEN:o,OPENCRATER_ON_GATEWAY:"1"},s=["-c",'model_provider="opencrater"',"-c",'model_providers.opencrater.name="OpenCrater"',"-c",`model_providers.opencrater.base_url="${t}"`,"-c",'model_providers.opencrater.wire_api="responses"',"-c",'model_providers.opencrater.env_key="OPENCRATER_TOKEN"'],i=child_process.spawn("codex",[...s,...e],{stdio:"inherit",env:r,shell:process.platform==="win32"});return await new Promise(l=>{i.on("exit",a=>l(a??0)),i.on("error",a=>{console.error(`Couldn't launch codex: ${a.message}`),console.error("Is Codex installed? npm i -g @openai/codex"),l(127);});})}async function Je(e){let o=d().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await x(o,d().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 t=`${v().replace(/\/$/,"")}/gateway/v1`;n&&console.log(`Launching Grok on OpenCrater compute \xB7 balance ${I(n.balanceMicroUsd)}`);let r={...process.env,GROK_MODELS_BASE_URL:t,XAI_API_KEY:o,OPENCRATER_ON_GATEWAY:"1"},i=e.some(a=>a==="-m"||a==="--model"||a.startsWith("--model="))?[]:["-m","x-ai/grok-build-0.1"],l=child_process.spawn("grok",[...i,...e],{stdio:"inherit",env:r,shell:process.platform==="win32"});return await new Promise(a=>{l.on("exit",p=>a(p??0)),l.on("error",p=>{console.error(`Couldn't launch grok: ${p.message}`),console.error("Is Grok installed? npm i -g @xai-official/grok"),a(127);});})}function ue(e){let o=new Map,n=[];for(let t=0;t<e.length;t++){let r=e[t];if(r!==void 0)if(r.startsWith("--")){let s=r.indexOf("=");if(s!==-1)o.set(r.slice(2,s),r.slice(s+1));else {let i=e[t+1];i!==void 0&&!i.startsWith("--")?(o.set(r.slice(2),i),t++):o.set(r.slice(2),"true");}}else n.push(r);}return {flags:o,rest:n}}function pe(e,o){let n=d();n.integrations.some(t=>t.key===e&&t.package===o)||w({integrations:[...n.integrations,{key:e,package:o}].slice(-32)});}function M(e,o){let n=o||"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 t of e)if(t.status==="error")console.log(` \u2717 ${t.host}: ${t.error}`);else {let r=t.status==="nochange"?" \u2014 already set up":"";console.log(` \u2022 ${t.host} (${t.events.join(", ")})${r}`);}}function Ke(){return w({optOut:true}),console.log("OpenCrater Blips are now OFF for this machine."),console.log("Re-enable any time with: npx opencrater on"),0}function ze(e){let{flags:o}=ue(e),n=o.get("key"),t=o.get("package");return w({optOut:false}),n&&t?(pe(n,t),M(R(n,t),t),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(H()?"\u2713":"skipped (npm unavailable \u2014 hooks use npx fallback)")):d().devToken?(M(R()),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(H()?"\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 We(){let e=d(),o=e.lastShownAt>0?new Date(e.lastShownAt).toISOString():"never";console.log(`opencrater v${P}`),console.log(` state file: ${A()}`),console.log(` install id: ${e.installId}`),console.log(` opted out: ${e.optOut?"yes":"no"}`),console.log(` last shown: ${o}`),console.log(` pooled Blips: ${e.pool.length}`),console.log(` hosts found: ${D().join(", ")||"(none)"}`),console.log(` integrations: ${e.integrations.map(t=>t.package).join(", ")||"(none)"}`);let n=K();return console.log(` wired hooks: ${n.length}`),0}function Ve(e){let{flags:o}=ue(e),n=o.get("key"),t=o.get("package");if(!n||!t)return console.error("Usage: opencrater hooks install --key <publisherKey> --package <name> [--host <host>]"),1;pe(n,t);let r=o.get("host");if(r&&r!=="true"){if(!k.includes(r))return console.error(`Unknown host "${r}". Supported: ${k.join(", ")}`),1;let s=r;try{let i=J(s,n,t);M([{host:s,status:i,events:j(s)}],t);}catch(i){return console.error(`Could not wire ${s}: ${i.message}`),1}}else M(R(n,t),t);return console.log("Remove with: npx opencrater hooks uninstall"),0}function qe(){let e=se();return w({integrations:[]}),console.log(e>0?`Removed ${e} OpenCrater hook${e===1?"":"s"} across all hosts.`:"No OpenCrater hooks installed."),0}function Ye(){let e=K();if(e.length===0)return console.log("No OpenCrater hooks installed."),0;for(let o of e)console.log(`${o.host} ${o.event}: ${o.command}`);return 0}function ce(){return console.log(`opencrater v${P} \u2014 OpenCrater Blips
7
7
 
8
8
  Usage:
9
9
  opencrater on [--key <ock_\u2026> --package <name>]
@@ -28,4 +28,4 @@ Usage:
28
28
  opencrater hooks list List installed OpenCrater hooks
29
29
 
30
30
  Hosts: ${k.join(", ")}
31
- Environment: OPENCRATER_DISABLE=1 disables everything; NO_COLOR respected.`),0}function Ye(e){let[t,...n]=e;switch(t){case "off":return Je();case "on":return Ke(n);case "login":return Ue();case "balance":return Be();case "logout":return Fe();case "claude":case "code":return De(n);case "codex":return Le(n);case "grok":return Ge(n);case "status":return ze();case "hooks":{let[o,...r]=n;switch(o){case "install":return We(r);case "uninstall":return Ve();case "list":return qe();default:return console.error("Usage: opencrater hooks <install|uninstall|list>"),1}}case "version":case "--version":case "-v":return console.log(P),0;case void 0:case "help":case "--help":case "-h":return ce();default:return console.error(`Unknown command: ${t}`),ce(),1}}typeof B<"u"&&typeof module<"u"&&B.main===module&&Promise.resolve().then(()=>Ye(process.argv.slice(2))).then(e=>{process.exitCode=e;}).catch(e=>{console.error(`opencrater: ${e.message}`),process.exitCode=1;});exports.runCli=Ye;
31
+ Environment: OPENCRATER_DISABLE=1 disables everything; NO_COLOR respected.`),0}function Xe(e){let[o,...n]=e;switch(o){case "off":return Ke();case "on":return ze(n);case "login":return Be();case "balance":return Fe();case "logout":return Le();case "claude":case "code":return De(n);case "codex":return Ge(n);case "grok":return Je(n);case "status":return We();case "hooks":{let[t,...r]=n;switch(t){case "install":return Ve(r);case "uninstall":return qe();case "list":return Ye();default:return console.error("Usage: opencrater hooks <install|uninstall|list>"),1}}case "version":case "--version":case "-v":return console.log(P),0;case void 0:case "help":case "--help":case "-h":return ce();default:return console.error(`Unknown command: ${o}`),ce(),1}}typeof F<"u"&&typeof module<"u"&&F.main===module&&Promise.resolve().then(()=>Xe(process.argv.slice(2))).then(e=>{process.exitCode=e;}).catch(e=>{console.error(`opencrater: ${e.message}`),process.exitCode=1;});exports.runCli=Xe;
package/dist/dismiss.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var fs=require('fs'),os=require('os'),t=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 t__namespace=/*#__PURE__*/_interopNamespace(t);var i=(n,o)=>()=>(n&&(o=n(n=0)),o);var c=(n,o)=>()=>(o||n((o={exports:{}}).exports,o),o.exports);var r=i(()=>{});var s=i(()=>{});function a(n,o=process.env){let e=o.OPENCRATER_API_ORIGIN;return (n??(e&&e.trim()!==""?e:p)).replace(/\/+$/,"")}var p,l=i(()=>{r();s();p="https://api.opencrater.to";});var S=c(()=>{l();async function f(){let n=t__namespace.join(os.homedir(),".config","opencrater"),o=t__namespace.join(n,"painter.lock"),e={};try{e=JSON.parse(fs.readFileSync(o,"utf8"));}catch{console.log("opencrater: no Blip is on screen.");return}try{fs.mkdirSync(n,{recursive:!0}),fs.writeFileSync(t__namespace.join(n,"dismiss.signal"),JSON.stringify({impressionId:e.impressionId,at:Date.now()}));}catch{}if(e.dismissUrl)try{await fetch(e.dismissUrl,{signal:AbortSignal.timeout(1e3)});}catch{}if(e.impressionId)try{await fetch(`${a()}/x/${e.impressionId}`,{signal:AbortSignal.timeout(2500)});}catch{}if(e.pid&&e.pid>1)try{process.kill(e.pid,"SIGTERM");}catch{}console.log("opencrater: Blip dismissed \u2014 feedback recorded."),console.log(" changed your mind? npx opencrater show");}f().finally(()=>{setTimeout(()=>process.exit(0),50).unref?.();});});var dismiss = S();
2
+ 'use strict';var fs=require('fs'),os=require('os'),t=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 t__namespace=/*#__PURE__*/_interopNamespace(t);var i=(o,n)=>()=>(o&&(n=o(o=0)),n);var c=(o,n)=>()=>(n||o((n={exports:{}}).exports,n),n.exports);var r=i(()=>{});var s=i(()=>{});function a(o,n=process.env){let e=n.OPENCRATER_API_ORIGIN;return (o??(e&&e.trim()!==""?e:p)).replace(/\/+$/,"")}var p,l=i(()=>{r();s();p="https://api.opencrater.to";});var S=c(()=>{l();async function f(){let o=t__namespace.join(os.homedir(),".config","opencrater"),n=t__namespace.join(o,"painter.lock"),e={};try{e=JSON.parse(fs.readFileSync(n,"utf8"));}catch{console.log("opencrater: no Blip is on screen.");return}try{fs.mkdirSync(o,{recursive:!0}),fs.writeFileSync(t__namespace.join(o,"dismiss.signal"),JSON.stringify({impressionId:e.impressionId,at:Date.now()}));}catch{}if(e.dismissUrl)try{await fetch(e.dismissUrl,{signal:AbortSignal.timeout(1e3)});}catch{}if(e.impressionId)try{await fetch(`${a()}/x/${e.impressionId}`,{signal:AbortSignal.timeout(2500)});}catch{}if(e.pid&&e.pid>1)try{process.kill(e.pid,"SIGTERM");}catch{}console.log("opencrater: Blip dismissed \u2014 feedback recorded."),console.log(" changed your mind? npx opencrater show");}f().finally(()=>{setTimeout(()=>process.exit(0),50).unref?.();});});var dismiss = S();
3
3
  module.exports=dismiss;
package/dist/hook.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var child_process=require('child_process'),p=require('fs'),T=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 p__namespace=/*#__PURE__*/_interopNamespace(p);var T__namespace=/*#__PURE__*/_interopNamespace(T);var g__namespace=/*#__PURE__*/_interopNamespace(g);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')});var $={minIntervalSeconds:600,serveTimeoutMs:2500,preloadPoolSize:3,killSwitch:false,displayDurationSeconds:25,minSdkVersion:""},de={claude_code:["SessionStart","Stop","SessionEnd","Notification"],codex:["Stop"],openclaw:[],gemini_cli:["AfterAgent","SessionStart","SessionEnd"],copilot_cli:["agentStop","sessionStart","sessionEnd","notification"],generic:["SessionStart","Stop"]},fe={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 O="1.1.30";var at="https://api.opencrater.to";function X(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return ((n&&n.trim()!==""?n:at)).replace(/\/+$/,"")}function h(...e){try{if(process.env.OPENCRATER_DEBUG!=="1")return;console.error("[opencrater]",...e);try{let t=x("os"),n=x("fs"),r=x("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 ct(e){let t=$;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 L(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 me(e,t){let n=e.host??"generic";return {publisherKey:e.publisherKey,packageName:e.packageName,placement:e.placement,host:n,sdkVersion:O,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 ge(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:ct(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 he(e,t){let n=await L(t.origin,"/v1/serve",me(e,t),t.timeoutMs);return ge(n)}async function ye(e,t,n){let r={...me(t,n),publisherKey:t.publisherKey??"",packageName:t.packageName??""},o=await L(n.origin,"/v1/dev/serve",r,n.timeoutMs,{authorization:`Bearer ${e}`});return ge(o)}function Se(e,t,n){return L(n.origin,"/v1/dev/impression",{impressionId:t},n.timeoutMs,{authorization:`Bearer ${e}`}).then(()=>{}).catch(()=>{})}function Z(e,t){return L(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}function be(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 ke(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function j(e){let t=be(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 D(e=process.env){return g__namespace.join(T__namespace.homedir(),".config","opencrater")}function F(e=process.env){return g__namespace.join(D(e),"state.json")}function U(){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)}var ve=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function Ce(e){for(let t=0;;t++)try{return {text:p__namespace.readFileSync(e,"utf8")}}catch(n){let r=n.code??"";if(!(r==="ENOENT"||ve.has(r)))return {locked:true};if(t>=4)return r==="ENOENT"?{missing:true}:{locked:true};try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(t+1));}catch{}}}function ut(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 pt(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 dt(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 ft(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 mt(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 gt(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 ht(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 yt(e){let t=U();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:ut(n.cachedConfig),allowedPlacements:dt(n.allowedPlacements),sessionTopics:ft(n.sessionTopics),integrations:mt(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:gt(n.computeRouting),computeCards:ht(n.computeCards),configFetchedAt:k(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:pt(n.pool)}}function Q(e=process.env){let t=F(e),n=Ce(t);if(n.text!==void 0)try{return yt(JSON.parse(n.text))}catch{let r=U();try{y(r,e);}catch{}return r}if(n.missing){let r=U();try{y(r,e);}catch{}return r}return U()}function y(e,t=process.env,n={}){let r=F(t),o=g__namespace.dirname(r);p__namespace.mkdirSync(o,{recursive:true});let i=Ce(r),s=null;if(i.text!==void 0)try{s=JSON.parse(i.text);}catch{s=null;}if(s)typeof s.lastShownAt=="number"&&s.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:s.lastShownAt}),!n.allowClearToken&&typeof s.devToken=="string"&&e.devToken==null&&(e={...e,devToken:s.devToken}),typeof s.installId=="string"&&s.installId.length>0&&s.installId!==e.installId&&(e={...e,installId:s.installId});else if(!n.allowClearToken&&e.devToken==null&&i.text===void 0&&!i.missing)return;let l=g__namespace.join(o,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);p__namespace.writeFileSync(l,JSON.stringify(e,null,2)+`
4
- `,"utf8");for(let a=0;;a++)try{p__namespace.renameSync(l,r);return}catch(c){let f=c.code??"";if(a>=4||!ve.has(f)){try{p__namespace.rmSync(l,{force:!0});}catch{}if(a>=4)return;throw c}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(a+1));}catch{}}}var St=300*1e3;function bt(){return g__namespace.join(D(),"blocked-ads.json")}function ee(){return g__namespace.join(D(),"recent-renders.json")}function kt(){return g__namespace.join(D(),"reported-ads.json")}function Ee(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 wt(e){try{let t=JSON.parse(p__namespace.readFileSync(bt(),"utf8"));return Ee(t&&typeof t=="object"?t:{},e)}catch{return {}}}function vt(){try{let e=JSON.parse(p__namespace.readFileSync(kt(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return {}}}function Ct(e){return e?vt()[e]!==void 0:false}function G(e,t=Date.now()){return e?wt(t)[e]!==void 0||Ct(e):false}function Te(e){try{let t=JSON.parse(p__namespace.readFileSync(ee(),"utf8"));return Ee(t&&typeof t=="object"?t:{},e)}catch{return {}}}function J(e,t=Date.now()){if(e)try{let n=Te(t);n[e]=t+St,p__namespace.mkdirSync(g__namespace.dirname(ee()),{recursive:!0}),p__namespace.writeFileSync(ee(),JSON.stringify(n));}catch{}}function K(e,t=Date.now()){return e?Te(t)[e]!==void 0:false}function Et(e,t){return e.filter(n=>n.renderBy>t)}function te(e,t){let n=Et(e.pool,t),r=n.shift();return {blip:r?r.blip:null,pool:n}}var Tt=["claude_code","codex","gemini_cli","copilot_cli"];function Pe(e){return e.includes("opencrater-hook")}function Rt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ot(e,t){return Pe(e)&&new RegExp(`--package ['"]?${Rt(t)}['"]?`).test(e)}function Ne(e,t){return t?Ot(e,t):Pe(e)&&!/--package\b/.test(e)}function Re(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var Oe='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',Ie="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function ne(e,t,n,r){let o=`--placement ${t}`;return n&&(o+=` --key ${Re(n)}`),r&&(o+=` --package ${Re(r)}`),o+=` --host ${e}`,`{ if [ -f ${Oe} ]; then node ${Oe} ${o}; else npx -y -p opencrater opencrater-hook ${o}; fi; } 2>/dev/null || true`}function Me(e,t,n,r){let o=`--placement ${t}`;return n&&(o+=` --key '${n}'`),r&&(o+=` --package '${r}'`),o+=` --host ${e}`,`try { if (Test-Path "${Ie}") { node "${Ie}" ${o} } else { npx -y -p opencrater opencrater-hook ${o} } } catch {}`}function _e(e,t,n,r){let o={type:"command",command:ne(e,t,n,r)};return e==="codex"&&(o.commandWindows=Me(e,t,n,r)),o}function $e(e,t){let n=T__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 Y(e,t=process.env){let n=$e(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 It={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"]};function _t(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(p__namespace.existsSync(g__namespace.join(o,i+s)))return !0}catch{}return false}function At(e,t=process.env){try{if(p__namespace.existsSync($e(e,t)))return !0}catch{}return _t(It[e]??[],t)}function oe(e=process.env){return Tt.filter(t=>At(t,e))}function De(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 He(e,t){let n=g__namespace.dirname(e);p__namespace.mkdirSync(n,{recursive:true});let r=g__namespace.join(n,`.${g__namespace.basename(e)}.${process.pid}.tmp`);p__namespace.writeFileSync(r,JSON.stringify(t,null,2)+`
5
- `,"utf8"),p__namespace.renameSync(r,e);}function xt(e,t){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&Ne(n.command,t))}function Pt(e,t,n,r){let o=Y(e),i=De(o),s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let c=_e(e,a,t,n);return (Array.isArray(s[a])?s[a]:[]).some(f=>Array.isArray(f.hooks)&&f.hooks.some(u=>u.command===c.command&&u.commandWindows===c.commandWindows))}))return "nochange";for(let a of r){let f=(Array.isArray(s[a])?s[a]:[]).filter(u=>!xt(u,n));f.push({matcher:"",hooks:[_e(e,a,t,n)]}),s[a]=f;}return i.hooks=s,He(o,i),"wrote"}var Ae=12;function Nt(e,t){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&Ne(n,t))}function Mt(e,t,n,r){let o=Y(e),i=De(o);typeof i.version!="number"&&(i.version=1);let s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let c=ne(e,a,t,n);return (Array.isArray(s[a])?s[a]:[]).some(f=>f.bash===c&&f.timeoutSec===Ae)}))return "nochange";for(let a of r){let f=(Array.isArray(s[a])?s[a]:[]).filter(u=>!Nt(u,n));f.push({type:"command",bash:ne(e,a,t,n),powershell:Me(e,a,t,n),timeoutSec:Ae}),s[a]=f;}return i.hooks=s,He(o,i),"wrote"}function Be(e){return [...fe[e]]}function $t(e,t,n){let r=Be(e);return r.length===0?"nochange":e==="copilot_cli"?Mt(e,t,n,r):Pt(e,t,n,r)}function re(e,t,n=process.env){return oe(n).map(r=>{try{let o=$t(r,e,t);return {host:r,status:o,events:Be(r)}}catch(o){return {host:r,status:"error",events:[],error:o.message}}})}function Ht(){return g__namespace.join(T__namespace.homedir(),".config","opencrater","runtime")}function Bt(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function ie(e=Ht()){child_process.spawn("npm",Bt(e),process.platform==="win32"?{detached:false,stdio:"ignore",windowsHide:true,shell:true}:{detached:true,stdio:"ignore"}).unref();}var Fe={atLimit:false,resetAt:null};function Ge(e,t=T__namespace.homedir()){try{if(e==="claude_code")return Lt(t);if(e==="codex")return jt(t)}catch{}return Fe}function Lt(e){let t=p__namespace.readFileSync(g__namespace.join(e,".claude.json"),"utf8"),n=JSON.parse(t),r=n.hasAvailableSubscription===false||n.cachedExtraUsageDisabledReason==="out_of_credits",o=null,l=n.cachedGrowthBookFeatures?.tengu_saffron_lattice?.planLimitsEndDate;if(typeof l=="string"){let a=Date.parse(l);Number.isFinite(a)&&(o=a);}return {atLimit:r,resetAt:o}}function jt(e){return p__namespace.accessSync(g__namespace.join(e,".codex","auth.json")),Fe}function Je(e,t){switch(e){case "gemini_cli":return t==="AfterAgent";case "copilot_cli":return t==="agentStop";default:return t==="Stop"}}var Ke=36e5,Ut=30*6e4,Ft=30*6e4,Gt=4*Ke,Jt=3,W="https://opencrater.to/dashboard";function M(e){return `${Math.round(e/1e3).toLocaleString()} tokens`}function Kt(e){switch(e){case "claude_code":return {name:"Claude Code",launch:"opencrater claude",resume:"opencrater claude -c"};case "codex":return {name:"Codex",launch:"opencrater codex",resume:"opencrater codex resume --last"};default:return null}}var z="opencrater claude";function Yt(e,t){return t<=0?0:Math.max(0,Math.min(100,Math.round(e/t*100)))}function Wt(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/Ke))}h`,o=new Date(e).toISOString().slice(0,10);return ` Your host limit resets in ${r} (${o}).`}function Ye(e){let{balanceMicroUsd:t,weeklyGrantMicroUsd:n,onGateway:r,turnEnd:o,hostName:i,host:s,cc:l,now:a}=e;if(t===null)return null;let c=Kt(i);if(t<=0)return a-(l.lastDepletedAt??0)<Ft?null:{kind:"depleted",card:{sponsorLabel:"OpenCrater",title:"Compute used up",body:`Keep coding in any CLI to earn more compute, then switch back to ${c?.name??"your plan"}.`+Wt(s.resetAt,a),url:W,cta:"Earn more"}};if(r){if(!o||(l.turns??0)%Jt!==0)return null;let f=n&&n>0?Yt(t,n):null,u=c?` (${c.name})`:"";return {kind:"hud",card:{sponsorLabel:"OpenCrater",title:"Running on OpenCrater compute",body:f!==null?`${f}% of your weekly compute left \u2014 ${M(t)} remaining.`:`${M(t)} of compute remaining this week${u}.`,url:W,cta:"Wallet"}}}return s.atLimit?a-(l.lastLimitAt??0)<Ut?null:{kind:"limit",card:{sponsorLabel:"OpenCrater",title:"Hit your limit? You've got compute",body:c?`${M(t)} of OpenCrater compute is ready. Continue this ${c.name} session now: ${c.resume}`:`${M(t)} of OpenCrater compute is ready. Run your coding agent on it: ${z}`,url:W,cta:c?c.resume:z}}:a-(l.lastBackupAt??0)>=Gt?{kind:"backup",card:{sponsorLabel:"OpenCrater",title:"Backup compute ready",body:c?`${M(t)} of OpenCrater compute waiting. When you hit your limit: ${c.resume}`:`${M(t)} of OpenCrater compute waiting. Spend it any time: ${z}`,url:W,cta:c?c.resume:z}}:null}var Xt=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function ae(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function Zt(e){return ae(e.OPENCRATER_DISABLE)||ae(e.TSN_DISABLE)}function Qt(e){return Xt.some(t=>ae(e[t]))}function q(e){return e?{...$,...e}:$}function Qe(e,t={}){if(Zt(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=q(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(Qt(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 en=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 tn(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 nn(e,t=12){let n=[];for(let r of e.slice(0,2e3).split(/\s+/))if(!(!r||tn(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)||en.has(i))&&!n.includes(i)&&(n.push(i),n.length>=t))return n}return n}function ce(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 nn(t.join(" "))}function le(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 et(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 sn=false,an=process.platform==="win32"?8e3:3200,cn=150,ue=250,ln=2800,it="claude_code";function un(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 pn(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 dn="\\\\.\\CONOUT$";function fn(e){return !e||e==="?"||e==="??"||e==="-"?null:e.startsWith("/")?e:`/dev/${e}`}function mn(e){let t=e.match(/^\s*(\d+)\s+(\S+)/);return t?{ppid:Number(t[1]),tty:t[2]}:null}function gn(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 hn(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 yn(e){try{let t=hn(p__namespace.readFileSync(`/proc/${e}/stat`,"utf8"));if(t)return {ppid:t.ppid,ttyPath:gn(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=mn(t);return n?{ppid:n.ppid,ttyPath:fn(n.tty)}:null}catch{return null}}function Sn(){if(process.platform==="win32")return {path:dn,ownerPid:null};let e=process.pid;for(let t=0;t<12&&e>1;t++){let n=yn(e);if(!n)return null;if(n.ttyPath)return {path:n.ttyPath,ownerPid:e};e=n.ppid;}return null}function bn(e){return e==="win32"?{detached:false,stdio:"ignore",windowsHide:false}:{detached:true,stdio:"ignore",windowsHide:false}}async function H(e,t,n,r,o){try{let i=g__namespace.join(__dirname,"paint.js"),s=q(t.cachedConfig),l=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:X(),durationMs:l*1e3,disclosure:!t.disclosureShown,host:it},c={...process.env,OPENCRATER_PAINT:JSON.stringify(a)};if(!c.OPENCRATER_TTY){let u=Sn();u&&(c.OPENCRATER_TTY=u.path,u.ownerPid!==null&&(c.OPENCRATER_HOST_PID=String(u.ownerPid)));}let f=child_process.spawn(process.execPath,[i],{...bn(process.platform),env:c});process.platform==="win32"?await new Promise(u=>{let d=!1,R=()=>{d||(d=!0,u());};f.on("exit",R),f.on("error",R),setTimeout(R,7500);}):f.unref();}catch{}return {...t,lastShownAt:Date.now(),disclosureShown:true}}function tt(e){if(process.platform!=="win32")return false;try{let t=g__namespace.join(T__namespace.homedir(),".config","opencrater","painter.lock"),n=JSON.parse(p__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 kn=8e3;function nt(){let e=g__namespace.join(T__namespace.homedir(),".config","opencrater","render.lock");try{let t=p__namespace.statSync(e);if(Date.now()-t.mtimeMs<kn)return !1;p__namespace.unlinkSync(e);}catch{}try{return p__namespace.mkdirSync(g__namespace.join(T__namespace.homedir(),".config","opencrater"),{recursive:!0}),p__namespace.writeFileSync(e,String(process.pid),{flag:"wx"}),!0}catch{return false}}function wn(e,t,n,r){if(!t)return true;let o=e.allowedPlacements[`${t}:${n}`];return o?o.includes(r):t==="opencrater"?de[n].includes(r):true}var vn=1440*60*1e3;function Cn(){try{let e=g__namespace.join(T__namespace.homedir(),".config","opencrater","runtime"),t=g__namespace.join(e,"node_modules","opencrater","dist","hook.js"),n=g__namespace.join(e,".last-update");if(p__namespace.existsSync(t)){try{if(Date.now()-p__namespace.statSync(n).mtimeMs<vn)return}catch{}try{p__namespace.writeFileSync(n,String(Date.now()));}catch{return}}else {let r=g__namespace.join(e,".installing");try{p__namespace.mkdirSync(e,{recursive:!0});let o=p__namespace.statSync(r);if(Date.now()-o.mtimeMs<600*1e3)return}catch{}p__namespace.writeFileSync(r,String(Date.now()));}ie(e);}catch{}}function ot(e,t){if(!t)return false;let n=s=>s.split(/[-+]/)[0].split(".").map(l=>parseInt(l,10)||0),r=n(e),o=n(t),i=Math.max(r.length,o.length);for(let s=0;s<i;s++){let l=r[s]??0,a=o[s]??0;if(l!==a)return l<a}return false}function rt(){try{let e=g__namespace.join(T__namespace.homedir(),".config","opencrater","runtime"),t=g__namespace.join(e,".last-update"),n=g__namespace.join(e,".force-update");try{if(Date.now()-p__namespace.statSync(n).mtimeMs<600*1e3)return}catch{}p__namespace.mkdirSync(e,{recursive:!0}),p__namespace.writeFileSync(n,String(Date.now()));try{p__namespace.rmSync(t,{force:!0});}catch{}ie(e);}catch{}}function En(){try{let e=g__namespace.join(T__namespace.homedir(),".config","opencrater");p__namespace.mkdirSync(e,{recursive:!0}),p__namespace.writeFileSync(g__namespace.join(e,"activity.signal"),String(Date.now()));}catch{}}var Tn=1440*60*1e3;function Rn(){try{let e=g__namespace.join(T__namespace.homedir(),".config","opencrater"),t=g__namespace.join(e,".last-host-check"),n=g__namespace.join(e,".known-hosts"),r=oe().sort(),o=[];try{let l=JSON.parse(p__namespace.readFileSync(n,"utf8"));Array.isArray(l)&&(o=l.filter(a=>typeof a=="string"));}catch{}if(!r.some(l=>!o.includes(l)))try{if(Date.now()-p__namespace.statSync(t).mtimeMs<Tn)return}catch{}p__namespace.mkdirSync(e,{recursive:!0});try{p__namespace.writeFileSync(t,String(Date.now()));}catch{return}let s=Q();try{p__namespace.writeFileSync(n,JSON.stringify(r));}catch{}if(s.optOut)return;if(s.devToken)try{re();}catch{}for(let l of s.integrations)try{re(l.key,l.package);}catch{}}catch{}}async function On(){let e=un(process.argv.slice(2));it=e.host,En(),Cn(),Rn();let t=await pn(cn),n={};if(t)try{n=JSON.parse(t);let d=n.hook_event_name;!e.placement&&typeof d=="string"&&(e.placement=d);}catch{}let r=e.placement??"SessionStart",o=Q();h(`state=${F()} devToken=${o.devToken?"present":"MISSING"}`,`host=${e.host} placement=${r}`);let i=Qe({env:process.env,state:o,now:Date.now()},{skipTTY:true});if(i!==null){if(i==="frequency"){let d=ce(n);d.length>0&&y({...o,sessionTopics:le(o.sessionTopics,d,Date.now())});}h("hook suppressed:",i);return}if(o={...o,sessionTopics:le(o.sessionTopics,ce(n),Date.now())},!wn(o,e.package,e.host,r)){y(o),h("hook gated: placement",r,"not selected for",e.package);return}let s=q(o.cachedConfig),l=X(),a={origin:l,timeoutMs:Math.min(s.serveTimeoutMs,ln),installId:o.installId,topics:et(o.sessionTopics,Date.now())};if(o.devToken){let d=await ye(o.devToken,{publisherKey:e.key??"",packageName:e.package??"",placement:r,host:e.host},a);if(d){if(o={...o,cachedConfig:d.config,configFetchedAt:Date.now()},ot(O,d.config.minSdkVersion)&&rt(),sn);let R=e.host??"claude_code",pe=Je(R,r),_=o.computeCards??{turns:0,lastLimitAt:0,lastDepletedAt:0,lastBackupAt:0};pe&&(_.turns+=1);let A=Ye({balanceMicroUsd:typeof d.computeBalanceMicroUsd=="number"?d.computeBalanceMicroUsd:null,weeklyGrantMicroUsd:typeof d.weeklyGrantMicroUsd=="number"?d.weeklyGrantMicroUsd:null,onGateway:(process.env.ANTHROPIC_BASE_URL??"").includes("/gateway")||process.env.OPENCRATER_ON_GATEWAY==="1",turnEnd:pe,hostName:R,host:Ge(R),cc:_,now:Date.now()}),st=(d.config.displayDurationSeconds??25)*1e3,v=d.fill&&d.blip&&!G(d.blip.campaignId)&&!K(d.blip.campaignId)?d.blip:null;if((A||v)&&!tt(st)&&nt())if(A){let C=Date.now();A.kind==="limit"?_.lastLimitAt=C:A.kind==="depleted"?_.lastDepletedAt=C:A.kind==="backup"&&(_.lastBackupAt=C),o=await H({...A.card,label:"OpenCrater"},o);}else v&&(J(v.campaignId),o=await H(j(v),o,v.creative,v.impressionId,v.campaignId),o.devToken&&await Promise.race([Se(o.devToken,v.impressionId,a),new Promise(C=>setTimeout(C,ue).unref?.())]));o={...o,computeCards:_};}y(o);return}let{blip:c,pool:f}=te(o,Date.now());for(;c&&(G(c.campaignId)||K(c.campaignId));)h("hook: pooled blip skipped \u2014 campaign inside a local cooldown"),{blip:c,pool:f}=te({pool:f},Date.now());if((c||e.key)&&tt((s.displayDurationSeconds??25)*1e3)){y(o),h("hook: a card is already on screen \u2014 not rendering another");return}if((c||e.key)&&!nt()){y(o),h("hook: render slot already claimed by a concurrent fire");return}if(c){J(c.campaignId),o=await H(j(c),{...o,pool:f},c.creative,c.impressionId,c.campaignId),y(o),await Promise.race([Z(c.impressionId,a),new Promise(d=>setTimeout(d,ue).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 u=await he({publisherKey:e.key,packageName:e.package,placement:r,host:e.host},a);if(!u){y(o);return}if(o={...o,cachedConfig:u.config,configFetchedAt:Date.now()},ot(O,u.config.minSdkVersion)&&(h(`SDK ${O} below floor ${u.config.minSdkVersion} \u2014 forcing runtime update`),rt()),e.package&&u.allowedPlacements&&(o={...o,allowedPlacements:{...o.allowedPlacements,[`${e.package}:${e.host}`]:u.allowedPlacements}}),u.fill&&u.blip){if(G(u.blip.campaignId)||K(u.blip.campaignId)){h("hook: served blip suppressed \u2014 campaign inside a local cooldown"),y(o);return}J(u.blip.campaignId),o=await H(j(u.blip),o,u.blip.creative,u.blip.impressionId,u.blip.campaignId),y(o),await Promise.race([Z(u.blip.impressionId,a),new Promise(d=>setTimeout(d,ue).unref?.())]);return}u.fallback&&(o=await H(ke(u.fallback),o)),y(o);}if(typeof x<"u"&&typeof module<"u"&&x.main===module){let e=setTimeout(()=>process.exit(0),an);On().catch(t=>h(`opencrater-hook v${O} error:`,t)).finally(()=>{clearTimeout(e),process.exit(0);});}
6
- exports.decodeTtyNr=gn;exports.painterSpawnOptions=bn;exports.parseProcStat=hn;exports.parsePsLine=mn;exports.resolveTtyPath=Sn;exports.ttyNameToDevPath=fn;
2
+ 'use strict';var child_process=require('child_process'),d=require('fs'),T=require('os'),m=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 d__namespace=/*#__PURE__*/_interopNamespace(d);var T__namespace=/*#__PURE__*/_interopNamespace(T);var m__namespace=/*#__PURE__*/_interopNamespace(m);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')});var M={minIntervalSeconds:600,serveTimeoutMs:2500,preloadPoolSize:3,killSwitch:false,displayDurationSeconds:25,minSdkVersion:""},fe={claude_code:["SessionStart","Stop","SessionEnd","Notification"],codex:["Stop"],openclaw:[],gemini_cli:["AfterAgent","SessionStart","SessionEnd"],copilot_cli:["agentStop","sessionStart","sessionEnd","notification"],grok_cli:["SessionStart","Stop","SessionEnd","Notification"],generic:["SessionStart","Stop"]},me={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"],grok_cli:["SessionStart","Stop","SessionEnd","Notification"],generic:["SessionStart","Stop"]};var O="1.1.32";var at="https://api.opencrater.to";function Z(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return ((n&&n.trim()!==""?n:at)).replace(/\/+$/,"")}function h(...e){try{if(process.env.OPENCRATER_DEBUG!=="1")return;console.error("[opencrater]",...e);try{let t=x("os"),n=x("fs"),r=x("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 j(e){return typeof e=="number"&&Number.isFinite(e)}function ct(e){let t=M;if(typeof e!="object"||e===null)return {...t};let n=e;return {minIntervalSeconds:j(n.minIntervalSeconds)?n.minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:j(n.serveTimeoutMs)?n.serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:j(n.preloadPoolSize)?n.preloadPoolSize:t.preloadPoolSize,killSwitch:n.killSwitch===true,displayDurationSeconds:j(n.displayDurationSeconds)?n.displayDurationSeconds:t.displayDurationSeconds,minSdkVersion:typeof n.minSdkVersion=="string"?n.minSdkVersion:t.minSdkVersion}}async function L(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 ge(e,t){let n=e.host??"generic";return {publisherKey:e.publisherKey,packageName:e.packageName,placement:e.placement,host:n,sdkVersion:O,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 he(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:ct(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 ye(e,t){let n=await L(t.origin,"/v1/serve",ge(e,t),t.timeoutMs);return he(n)}async function Se(e,t,n){let r={...ge(t,n),publisherKey:t.publisherKey??"",packageName:t.packageName??""},o=await L(n.origin,"/v1/dev/serve",r,n.timeoutMs,{authorization:`Bearer ${e}`});return he(o)}function be(e,t,n){return L(n.origin,"/v1/dev/impression",{impressionId:t},n.timeoutMs,{authorization:`Bearer ${e}`}).then(()=>{}).catch(()=>{})}function Q(e,t){return L(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}function ke(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 we(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function B(e){let t=ke(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 D(e=process.env){return m__namespace.join(T__namespace.homedir(),".config","opencrater")}function F(e=process.env){return m__namespace.join(D(e),"state.json")}function U(){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)}var Ee=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function Ce(e){for(let t=0;;t++)try{return {text:d__namespace.readFileSync(e,"utf8")}}catch(n){let r=n.code??"";if(!(r==="ENOENT"||Ee.has(r)))return {locked:true};if(t>=4)return r==="ENOENT"?{missing:true}:{locked:true};try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(t+1));}catch{}}}function ut(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 pt(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 dt(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 ft(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 mt(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 gt(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 ht(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 yt(e){let t=U();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:ut(n.cachedConfig),allowedPlacements:dt(n.allowedPlacements),sessionTopics:ft(n.sessionTopics),integrations:mt(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:gt(n.computeRouting),computeCards:ht(n.computeCards),configFetchedAt:k(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:pt(n.pool)}}function ee(e=process.env){let t=F(e),n=Ce(t);if(n.text!==void 0)try{return yt(JSON.parse(n.text))}catch{let r=U();try{y(r,e);}catch{}return r}if(n.missing){let r=U();try{y(r,e);}catch{}return r}return U()}function y(e,t=process.env,n={}){let r=F(t),o=m__namespace.dirname(r);d__namespace.mkdirSync(o,{recursive:true});let i=Ce(r),s=null;if(i.text!==void 0)try{s=JSON.parse(i.text);}catch{s=null;}if(s)typeof s.lastShownAt=="number"&&s.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:s.lastShownAt}),!n.allowClearToken&&typeof s.devToken=="string"&&e.devToken==null&&(e={...e,devToken:s.devToken}),typeof s.installId=="string"&&s.installId.length>0&&s.installId!==e.installId&&(e={...e,installId:s.installId});else if(!n.allowClearToken&&e.devToken==null&&i.text===void 0&&!i.missing)return;let l=m__namespace.join(o,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);d__namespace.writeFileSync(l,JSON.stringify(e,null,2)+`
4
+ `,"utf8");for(let a=0;;a++)try{d__namespace.renameSync(l,r);return}catch(c){let f=c.code??"";if(a>=4||!Ee.has(f)){try{d__namespace.rmSync(l,{force:!0});}catch{}if(a>=4)return;throw c}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(a+1));}catch{}}}var St=300*1e3;function bt(){return m__namespace.join(D(),"blocked-ads.json")}function te(){return m__namespace.join(D(),"recent-renders.json")}function kt(){return m__namespace.join(D(),"reported-ads.json")}function Te(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 wt(e){try{let t=JSON.parse(d__namespace.readFileSync(bt(),"utf8"));return Te(t&&typeof t=="object"?t:{},e)}catch{return {}}}function vt(){try{let e=JSON.parse(d__namespace.readFileSync(kt(),"utf8"));return e&&typeof e=="object"?e:{}}catch{return {}}}function Et(e){return e?vt()[e]!==void 0:false}function G(e,t=Date.now()){return e?wt(t)[e]!==void 0||Et(e):false}function Re(e){try{let t=JSON.parse(d__namespace.readFileSync(te(),"utf8"));return Te(t&&typeof t=="object"?t:{},e)}catch{return {}}}function J(e,t=Date.now()){if(e)try{let n=Re(t);n[e]=t+St,d__namespace.mkdirSync(m__namespace.dirname(te()),{recursive:!0}),d__namespace.writeFileSync(te(),JSON.stringify(n));}catch{}}function K(e,t=Date.now()){return e?Re(t)[e]!==void 0:false}function Ct(e,t){return e.filter(n=>n.renderBy>t)}function ne(e,t){let n=Ct(e.pool,t),r=n.shift();return {blip:r?r.blip:null,pool:n}}var Tt=["claude_code","codex","gemini_cli","copilot_cli","grok_cli"];function Pe(e){return e.includes("opencrater-hook")}function Rt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ot(e,t){return Pe(e)&&new RegExp(`--package ['"]?${Rt(t)}['"]?`).test(e)}function Ne(e,t){return t?Ot(e,t):Pe(e)&&!/--package\b/.test(e)}function Oe(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var _e='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',Ie="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function Y(e,t,n,r){let o=`--placement ${t}`;return n&&(o+=` --key ${Oe(n)}`),r&&(o+=` --package ${Oe(r)}`),o+=` --host ${e}`,`{ if [ -f ${_e} ]; then node ${_e} ${o}; else npx -y -p opencrater opencrater-hook ${o}; fi; } 2>/dev/null || true`}function _t(e,t,n){if(process.platform!=="win32")return Y("grok_cli",e,t,n);let r=`--placement ${e}`;t&&(r+=` --key ${t}`),n&&(r+=` --package ${n}`),r+=" --host grok_cli";let o='"%USERPROFILE%\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js"';return `if exist ${o} (node ${o} ${r}) else (npx -y -p opencrater opencrater-hook ${r})`}function $e(e,t,n,r){let o=`--placement ${t}`;return n&&(o+=` --key '${n}'`),r&&(o+=` --package '${r}'`),o+=` --host ${e}`,`try { if (Test-Path "${Ie}") { node "${Ie}" ${o} } else { npx -y -p opencrater opencrater-hook ${o} } } catch {}`}function oe(e,t,n,r){if(e==="grok_cli")return {type:"command",command:_t(t,n,r),timeout:15};let o={type:"command",command:Y(e,t,n,r)};return e==="codex"&&(o.commandWindows=$e(e,t,n,r)),o}function Me(e,t){let n=T__namespace.homedir();switch(e){case "claude_code":{let r=t.CLAUDE_CONFIG_DIR;return r&&r.trim()!==""?r:m__namespace.join(n,".claude")}case "codex":{let r=t.CODEX_HOME;return r&&r.trim()!==""?r:m__namespace.join(n,".codex")}case "gemini_cli":return m__namespace.join(n,".gemini");case "copilot_cli":{let r=t.COPILOT_HOME;return r&&r.trim()!==""?r:m__namespace.join(n,".copilot")}case "grok_cli":{let r=t.GROK_HOME;return r&&r.trim()!==""?r:m__namespace.join(n,".grok")}default:return m__namespace.join(n,".opencrater-unknown")}}function W(e,t=process.env){let n=Me(e,t);switch(e){case "claude_code":return m__namespace.join(n,"settings.json");case "codex":return m__namespace.join(n,"hooks.json");case "gemini_cli":return m__namespace.join(n,"settings.json");case "copilot_cli":return m__namespace.join(n,"hooks","hooks.json");case "grok_cli":return m__namespace.join(n,"hooks","opencrater.json");default:return m__namespace.join(n,"hooks.json")}}var It={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"],grok_cli:["grok"]};function At(e,t){if(e.length===0)return false;let n=(t.PATH??t.Path??"").split(m__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(d__namespace.existsSync(m__namespace.join(o,i+s)))return !0}catch{}return false}function xt(e,t=process.env){try{if(d__namespace.existsSync(Me(e,t)))return !0}catch{}return At(It[e]??[],t)}function re(e=process.env){return Tt.filter(t=>xt(t,e))}function De(e){let t;try{t=d__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 He(e,t){let n=m__namespace.dirname(e);d__namespace.mkdirSync(n,{recursive:true});let r=m__namespace.join(n,`.${m__namespace.basename(e)}.${process.pid}.tmp`);d__namespace.writeFileSync(r,JSON.stringify(t,null,2)+`
5
+ `,"utf8"),d__namespace.renameSync(r,e);}function Pt(e,t){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&Ne(n.command,t))}function Nt(e,t,n,r){let o=W(e),i=De(o),s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let c=oe(e,a,t,n);return (Array.isArray(s[a])?s[a]:[]).some(f=>Array.isArray(f.hooks)&&f.hooks.some(u=>u.command===c.command&&u.commandWindows===c.commandWindows))}))return "nochange";for(let a of r){let f=(Array.isArray(s[a])?s[a]:[]).filter(p=>!Pt(p,n)),u=e==="grok_cli"?{hooks:[oe(e,a,t,n)]}:{matcher:"",hooks:[oe(e,a,t,n)]};f.push(u),s[a]=f;}return i.hooks=s,He(o,i),"wrote"}var Ae=12;function $t(e,t){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&Ne(n,t))}function Mt(e,t,n,r){let o=W(e),i=De(o);typeof i.version!="number"&&(i.version=1);let s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let c=Y(e,a,t,n);return (Array.isArray(s[a])?s[a]:[]).some(f=>f.bash===c&&f.timeoutSec===Ae)}))return "nochange";for(let a of r){let f=(Array.isArray(s[a])?s[a]:[]).filter(u=>!$t(u,n));f.push({type:"command",bash:Y(e,a,t,n),powershell:$e(e,a,t,n),timeoutSec:Ae}),s[a]=f;}return i.hooks=s,He(o,i),"wrote"}function je(e){return [...me[e]]}function Dt(e,t,n){let r=je(e);return r.length===0?"nochange":e==="copilot_cli"?Mt(e,t,n,r):Nt(e,t,n,r)}function ie(e,t,n=process.env){return re(n).map(r=>{try{let o=Dt(r,e,t);return {host:r,status:o,events:je(r)}}catch(o){return {host:r,status:"error",events:[],error:o.message}}})}function jt(){return m__namespace.join(T__namespace.homedir(),".config","opencrater","runtime")}function Lt(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function se(e=jt()){child_process.spawn("npm",Lt(e),process.platform==="win32"?{detached:false,stdio:"ignore",windowsHide:true,shell:true}:{detached:true,stdio:"ignore"}).unref();}var Fe={atLimit:false,resetAt:null};function Ge(e,t=T__namespace.homedir()){try{if(e==="claude_code")return Bt(t);if(e==="codex")return Ut(t)}catch{}return Fe}function Bt(e){let t=d__namespace.readFileSync(m__namespace.join(e,".claude.json"),"utf8"),n=JSON.parse(t),r=n.hasAvailableSubscription===false||n.cachedExtraUsageDisabledReason==="out_of_credits",o=null,l=n.cachedGrowthBookFeatures?.tengu_saffron_lattice?.planLimitsEndDate;if(typeof l=="string"){let a=Date.parse(l);Number.isFinite(a)&&(o=a);}return {atLimit:r,resetAt:o}}function Ut(e){return d__namespace.accessSync(m__namespace.join(e,".codex","auth.json")),Fe}function Je(e,t){switch(e){case "gemini_cli":return t==="AfterAgent";case "copilot_cli":return t==="agentStop";default:return t==="Stop"}}var Ke=36e5,Ft=30*6e4,Gt=30*6e4,Jt=4*Ke,Kt=3,z="https://opencrater.to/dashboard";function $(e){return `${Math.round(e/1e3).toLocaleString()} tokens`}function Yt(e){switch(e){case "claude_code":return {name:"Claude Code",launch:"opencrater claude",resume:"opencrater claude -c"};case "codex":return {name:"Codex",launch:"opencrater codex",resume:"opencrater codex resume --last"};case "grok_cli":return {name:"Grok",launch:"opencrater grok",resume:"opencrater grok -c"};default:return null}}var V="opencrater claude";function Wt(e,t){return t<=0?0:Math.max(0,Math.min(100,Math.round(e/t*100)))}function zt(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/Ke))}h`,o=new Date(e).toISOString().slice(0,10);return ` Your host limit resets in ${r} (${o}).`}function Ye(e){let{balanceMicroUsd:t,weeklyGrantMicroUsd:n,onGateway:r,turnEnd:o,hostName:i,host:s,cc:l,now:a}=e;if(t===null)return null;let c=Yt(i);if(t<=0)return a-(l.lastDepletedAt??0)<Gt?null:{kind:"depleted",card:{sponsorLabel:"OpenCrater",title:"Compute used up",body:`Keep coding in any CLI to earn more compute, then switch back to ${c?.name??"your plan"}.`+zt(s.resetAt,a),url:z,cta:"Earn more"}};if(r){if(!o||(l.turns??0)%Kt!==0)return null;let f=n&&n>0?Wt(t,n):null,u=c?` (${c.name})`:"";return {kind:"hud",card:{sponsorLabel:"OpenCrater",title:"Running on OpenCrater compute",body:f!==null?`${f}% of your weekly compute left \u2014 ${$(t)} remaining.`:`${$(t)} of compute remaining this week${u}.`,url:z,cta:"Wallet"}}}return s.atLimit?a-(l.lastLimitAt??0)<Ft?null:{kind:"limit",card:{sponsorLabel:"OpenCrater",title:"Hit your limit? You've got compute",body:c?`${$(t)} of OpenCrater compute is ready. Continue this ${c.name} session now: ${c.resume}`:`${$(t)} of OpenCrater compute is ready. Run your coding agent on it: ${V}`,url:z,cta:c?c.resume:V}}:a-(l.lastBackupAt??0)>=Jt?{kind:"backup",card:{sponsorLabel:"OpenCrater",title:"Backup compute ready",body:c?`${$(t)} of OpenCrater compute waiting. When you hit your limit: ${c.resume}`:`${$(t)} of OpenCrater compute waiting. Spend it any time: ${V}`,url:z,cta:c?c.resume:V}}:null}var Zt=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function ce(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function Qt(e){return ce(e.OPENCRATER_DISABLE)||ce(e.TSN_DISABLE)}function en(e){return Zt.some(t=>ce(e[t]))}function X(e){return e?{...M,...e}:M}function Qe(e,t={}){if(Qt(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=X(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(en(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 tn=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 nn(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 on(e,t=12){let n=[];for(let r of e.slice(0,2e3).split(/\s+/))if(!(!r||nn(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)||tn.has(i))&&!n.includes(i)&&(n.push(i),n.length>=t))return n}return n}function le(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 on(t.join(" "))}function ue(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 et(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 an=false,cn=process.platform==="win32"?8e3:3200,ln=150,pe=250,un=2800,it="claude_code";function pn(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 dn(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 fn="\\\\.\\CONOUT$";function mn(e){return !e||e==="?"||e==="??"||e==="-"?null:e.startsWith("/")?e:`/dev/${e}`}function gn(e){let t=e.match(/^\s*(\d+)\s+(\S+)/);return t?{ppid:Number(t[1]),tty:t[2]}:null}function hn(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 yn(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 Sn(e){try{let t=yn(d__namespace.readFileSync(`/proc/${e}/stat`,"utf8"));if(t)return {ppid:t.ppid,ttyPath:hn(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=gn(t);return n?{ppid:n.ppid,ttyPath:mn(n.tty)}:null}catch{return null}}function bn(){if(process.platform==="win32")return {path:fn,ownerPid:null};let e=process.pid;for(let t=0;t<12&&e>1;t++){let n=Sn(e);if(!n)return null;if(n.ttyPath)return {path:n.ttyPath,ownerPid:e};e=n.ppid;}return null}function kn(e){return e==="win32"?{detached:false,stdio:"ignore",windowsHide:false}:{detached:true,stdio:"ignore",windowsHide:false}}async function H(e,t,n,r,o){try{let i=m__namespace.join(__dirname,"paint.js"),s=X(t.cachedConfig),l=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:Z(),durationMs:l*1e3,disclosure:!t.disclosureShown,host:it},c={...process.env,OPENCRATER_PAINT:JSON.stringify(a)};if(!c.OPENCRATER_TTY){let u=bn();u&&(c.OPENCRATER_TTY=u.path,u.ownerPid!==null&&(c.OPENCRATER_HOST_PID=String(u.ownerPid)));}let f=child_process.spawn(process.execPath,[i],{...kn(process.platform),env:c});process.platform==="win32"?await new Promise(u=>{let p=!1,R=()=>{p||(p=!0,u());};f.on("exit",R),f.on("error",R),setTimeout(R,7500);}):f.unref();}catch{}return {...t,lastShownAt:Date.now(),disclosureShown:true}}function tt(e){if(process.platform!=="win32")return false;try{let t=m__namespace.join(T__namespace.homedir(),".config","opencrater","painter.lock"),n=JSON.parse(d__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 wn=8e3;function nt(){let e=m__namespace.join(T__namespace.homedir(),".config","opencrater","render.lock");try{let t=d__namespace.statSync(e);if(Date.now()-t.mtimeMs<wn)return !1;d__namespace.unlinkSync(e);}catch{}try{return d__namespace.mkdirSync(m__namespace.join(T__namespace.homedir(),".config","opencrater"),{recursive:!0}),d__namespace.writeFileSync(e,String(process.pid),{flag:"wx"}),!0}catch{return false}}function vn(e,t,n,r){if(!t)return true;let o=e.allowedPlacements[`${t}:${n}`];return o?o.includes(r):t==="opencrater"?fe[n].includes(r):true}var En=1440*60*1e3;function Cn(){try{let e=m__namespace.join(T__namespace.homedir(),".config","opencrater","runtime"),t=m__namespace.join(e,"node_modules","opencrater","dist","hook.js"),n=m__namespace.join(e,".last-update");if(d__namespace.existsSync(t)){try{if(Date.now()-d__namespace.statSync(n).mtimeMs<En)return}catch{}try{d__namespace.writeFileSync(n,String(Date.now()));}catch{return}}else {let r=m__namespace.join(e,".installing");try{d__namespace.mkdirSync(e,{recursive:!0});let o=d__namespace.statSync(r);if(Date.now()-o.mtimeMs<600*1e3)return}catch{}d__namespace.writeFileSync(r,String(Date.now()));}se(e);}catch{}}function ot(e,t){if(!t)return false;let n=s=>s.split(/[-+]/)[0].split(".").map(l=>parseInt(l,10)||0),r=n(e),o=n(t),i=Math.max(r.length,o.length);for(let s=0;s<i;s++){let l=r[s]??0,a=o[s]??0;if(l!==a)return l<a}return false}function rt(){try{let e=m__namespace.join(T__namespace.homedir(),".config","opencrater","runtime"),t=m__namespace.join(e,".last-update"),n=m__namespace.join(e,".force-update");try{if(Date.now()-d__namespace.statSync(n).mtimeMs<600*1e3)return}catch{}d__namespace.mkdirSync(e,{recursive:!0}),d__namespace.writeFileSync(n,String(Date.now()));try{d__namespace.rmSync(t,{force:!0});}catch{}se(e);}catch{}}function Tn(){try{let e=m__namespace.join(T__namespace.homedir(),".config","opencrater");d__namespace.mkdirSync(e,{recursive:!0}),d__namespace.writeFileSync(m__namespace.join(e,"activity.signal"),String(Date.now()));}catch{}}var Rn=1440*60*1e3;function On(){try{let e=m__namespace.join(T__namespace.homedir(),".config","opencrater"),t=m__namespace.join(e,".last-host-check"),n=m__namespace.join(e,".known-hosts"),r=re().sort(),o=[];try{let l=JSON.parse(d__namespace.readFileSync(n,"utf8"));Array.isArray(l)&&(o=l.filter(a=>typeof a=="string"));}catch{}if(!r.some(l=>!o.includes(l)))try{if(Date.now()-d__namespace.statSync(t).mtimeMs<Rn)return}catch{}d__namespace.mkdirSync(e,{recursive:!0});try{d__namespace.writeFileSync(t,String(Date.now()));}catch{return}let s=ee();try{d__namespace.writeFileSync(n,JSON.stringify(r));}catch{}if(s.optOut)return;if(s.devToken)try{ie();}catch{}for(let l of s.integrations)try{ie(l.key,l.package);}catch{}}catch{}}async function _n(){let e=pn(process.argv.slice(2));it=e.host,Tn(),Cn(),On();let t=await dn(ln),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=ee();h(`state=${F()} devToken=${o.devToken?"present":"MISSING"}`,`host=${e.host} placement=${r}`);let i=Qe({env:process.env,state:o,now:Date.now()},{skipTTY:true});if(i!==null){if(i==="frequency"){let p=le(n);p.length>0&&y({...o,sessionTopics:ue(o.sessionTopics,p,Date.now())});}h("hook suppressed:",i);return}if(o={...o,sessionTopics:ue(o.sessionTopics,le(n),Date.now())},!vn(o,e.package,e.host,r)){y(o),h("hook gated: placement",r,"not selected for",e.package);return}let s=X(o.cachedConfig),l=Z(),a={origin:l,timeoutMs:Math.min(s.serveTimeoutMs,un),installId:o.installId,topics:et(o.sessionTopics,Date.now())};if(o.devToken){let p=await Se(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()},ot(O,p.config.minSdkVersion)&&rt(),an);let R=e.host??"claude_code",de=Je(R,r),I=o.computeCards??{turns:0,lastLimitAt:0,lastDepletedAt:0,lastBackupAt:0};de&&(I.turns+=1);let A=Ye({balanceMicroUsd:typeof p.computeBalanceMicroUsd=="number"?p.computeBalanceMicroUsd:null,weeklyGrantMicroUsd:typeof p.weeklyGrantMicroUsd=="number"?p.weeklyGrantMicroUsd:null,onGateway:(process.env.ANTHROPIC_BASE_URL??"").includes("/gateway")||process.env.OPENCRATER_ON_GATEWAY==="1",turnEnd:de,hostName:R,host:Ge(R),cc:I,now:Date.now()}),st=(p.config.displayDurationSeconds??25)*1e3,v=p.fill&&p.blip&&!G(p.blip.campaignId)&&!K(p.blip.campaignId)?p.blip:null;if((A||v)&&!tt(st)&&nt())if(A){let E=Date.now();A.kind==="limit"?I.lastLimitAt=E:A.kind==="depleted"?I.lastDepletedAt=E:A.kind==="backup"&&(I.lastBackupAt=E),o=await H({...A.card,label:"OpenCrater"},o);}else v&&(J(v.campaignId),o=await H(B(v),o,v.creative,v.impressionId,v.campaignId),o.devToken&&await Promise.race([be(o.devToken,v.impressionId,a),new Promise(E=>setTimeout(E,pe).unref?.())]));o={...o,computeCards:I};}y(o);return}let{blip:c,pool:f}=ne(o,Date.now());for(;c&&(G(c.campaignId)||K(c.campaignId));)h("hook: pooled blip skipped \u2014 campaign inside a local cooldown"),{blip:c,pool:f}=ne({pool:f},Date.now());if((c||e.key)&&tt((s.displayDurationSeconds??25)*1e3)){y(o),h("hook: a card is already on screen \u2014 not rendering another");return}if((c||e.key)&&!nt()){y(o),h("hook: render slot already claimed by a concurrent fire");return}if(c){J(c.campaignId),o=await H(B(c),{...o,pool:f},c.creative,c.impressionId,c.campaignId),y(o),await Promise.race([Q(c.impressionId,a),new Promise(p=>setTimeout(p,pe).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 u=await ye({publisherKey:e.key,packageName:e.package,placement:r,host:e.host},a);if(!u){y(o);return}if(o={...o,cachedConfig:u.config,configFetchedAt:Date.now()},ot(O,u.config.minSdkVersion)&&(h(`SDK ${O} below floor ${u.config.minSdkVersion} \u2014 forcing runtime update`),rt()),e.package&&u.allowedPlacements&&(o={...o,allowedPlacements:{...o.allowedPlacements,[`${e.package}:${e.host}`]:u.allowedPlacements}}),u.fill&&u.blip){if(G(u.blip.campaignId)||K(u.blip.campaignId)){h("hook: served blip suppressed \u2014 campaign inside a local cooldown"),y(o);return}J(u.blip.campaignId),o=await H(B(u.blip),o,u.blip.creative,u.blip.impressionId,u.blip.campaignId),y(o),await Promise.race([Q(u.blip.impressionId,a),new Promise(p=>setTimeout(p,pe).unref?.())]);return}u.fallback&&(o=await H(we(u.fallback),o)),y(o);}if(typeof x<"u"&&typeof module<"u"&&x.main===module){let e=setTimeout(()=>process.exit(0),cn);_n().catch(t=>h(`opencrater-hook v${O} error:`,t)).finally(()=>{clearTimeout(e),process.exit(0);});}
6
+ exports.decodeTtyNr=hn;exports.painterSpawnOptions=kn;exports.parseProcStat=yn;exports.parsePsLine=gn;exports.resolveTtyPath=bn;exports.ttyNameToDevPath=mn;
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  /** Host environment the SDK is running inside. */
2
- type Host = "claude_code" | "codex" | "openclaw" | "gemini_cli" | "copilot_cli" | "generic";
2
+ type Host = "claude_code" | "codex" | "openclaw" | "gemini_cli" | "copilot_cli" | "grok_cli" | "generic";
3
3
  /** Creative formats the serve API can return. Text always renders; rich
4
4
  * media degrades to the text fallback when the terminal can't display it. */
5
5
  type CreativeFormat = "text" | "logo" | "image" | "gif" | "video" | "audio";
@@ -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.30";
227
+ declare const SDK_VERSION = "1.1.32";
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
@@ -1,5 +1,5 @@
1
1
  /** Host environment the SDK is running inside. */
2
- type Host = "claude_code" | "codex" | "openclaw" | "gemini_cli" | "copilot_cli" | "generic";
2
+ type Host = "claude_code" | "codex" | "openclaw" | "gemini_cli" | "copilot_cli" | "grok_cli" | "generic";
3
3
  /** Creative formats the serve API can return. Text always renders; rich
4
4
  * media degrades to the text fallback when the terminal can't display it. */
5
5
  type CreativeFormat = "text" | "logo" | "image" | "gif" | "video" | "audio";
@@ -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.30";
227
+ declare const SDK_VERSION = "1.1.32";
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,6 +1,6 @@
1
- 'use strict';var crypto=require('crypto'),f=require('fs'),te=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 f__namespace=/*#__PURE__*/_interopNamespace(f);var te__namespace=/*#__PURE__*/_interopNamespace(te);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 se=["SessionStart","SessionEnd","Stop","PostToolUse","Notification"];var D="1.1.30";var ae="https://api.opencrater.to";function V(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:ae)).replace(/\/+$/,"")}function c(...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
- `);}catch{}}catch{}}function E(e){return typeof e=="number"&&Number.isFinite(e)}function W(e){let t=b;if(typeof e!="object"||e===null)return {...t};let n=e;return {minIntervalSeconds:E(n.minIntervalSeconds)?n.minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:E(n.serveTimeoutMs)?n.serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:E(n.preloadPoolSize)?n.preloadPoolSize:t.preloadPoolSize,killSwitch:n.killSwitch===true,displayDurationSeconds:E(n.displayDurationSeconds)?n.displayDurationSeconds:t.displayDurationSeconds,minSdkVersion:typeof n.minSdkVersion=="string"?n.minSdkVersion:t.minSdkVersion}}async function U(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():(c(`POST ${t} -> HTTP ${i.status}`),null)}catch(i){return c(`POST ${t} failed:`,i),null}}function q(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 le(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:W(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 j(e,t){let n=await U(t.origin,"/v1/serve",q(e,t),t.timeoutMs);return le(n)}async function J(e,t,n){let r=await U(n.origin,"/v1/serve/batch",{...q(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:W(o.config),...Array.isArray(o.allowedPlacements)?{allowedPlacements:o.allowedPlacements.filter(i=>typeof i=="string")}:{}}:null}function Y(e,t){return U(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}var ce=new RegExp("\x1B\\[[0-9;]*m|\x1B\\]8;;[^\x07\x1B]*(?:\x07|\x1B\\\\)","g"),k={dim:"\x1B[2m",bold:"\x1B[1m",reset:"\x1B[0m"},ue=60,pe=24,de="\u2139 This project is supported by Blips via OpenCrater. Opt out: `npx opencrater off` or OPENCRATER_DISABLE=1";function fe(e){return e.replace(ce,"").length}function y(e,t){return t<=0?"":e.length<=t?e:t===1?"\u2026":e.slice(0,t-1).trimEnd()+"\u2026"}function me(e,t,n){let r=e.split(/\s+/).filter(l=>l.length>0),o=[],i="";for(let l of r){let p=i===""?l:`${i} ${l}`;if(p.length<=t)i=p;else if(i!==""&&o.push(i),i=l.length>t?y(l,t):l,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,u=o[a];return u!==void 0&&s.length<r.join(" ").length&&(o[a]=y(`${u}\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 ge(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 X(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function g(e,t={}){let n=t.width??process.stdout.columns??80,o=Math.max(pe,Math.min(n,ue))-4,i=t.color??P(),s=t.hyperlinks??O(),a=(m,$)=>i?`${$}${m}${k.reset}`:m,u=e.label?y(e.label,o):e.sponsorLabel?y(`Sponsored Blips \xB7 ${e.sponsorLabel}`,o):"Sponsored Blips",l=[];l.push(a(u,k.dim)),e.title!==e.sponsorLabel&&l.push(a(y(e.title,o),k.bold));for(let m of me(e.body,o,2))l.push(m);let p="\u2192 ";if(s){let m=y(e.cta??e.url,o-p.length);l.push(p+a(ge(e.url,m),k.dim));}else e.cta&&l.push(y(e.cta,o)),l.push(p+a(y(e.url,o-p.length),k.dim));let R=`\u256D${"\u2500".repeat(o+2)}\u256E`,v=`\u2570${"\u2500".repeat(o+2)}\u256F`,N=l.map(m=>{let $=" ".repeat(Math.max(0,o-fe(m)));return `\u2502 ${m}${$} \u2502`}),h=[];return t.disclosure&&h.push(a(de,k.dim)),h.push(R,...N,v),h.join(`
1
+ 'use strict';var crypto=require('crypto'),f=require('fs'),te=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 f__namespace=/*#__PURE__*/_interopNamespace(f);var te__namespace=/*#__PURE__*/_interopNamespace(te);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 se=["SessionStart","SessionEnd","Stop","PostToolUse","Notification"];var D="1.1.32";var ae="https://api.opencrater.to";function V(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:ae)).replace(/\/+$/,"")}function c(...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
+ `);}catch{}}catch{}}function v(e){return typeof e=="number"&&Number.isFinite(e)}function W(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 U(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():(c(`POST ${t} -> HTTP ${i.status}`),null)}catch(i){return c(`POST ${t} failed:`,i),null}}function q(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 le(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:W(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 j(e,t){let n=await U(t.origin,"/v1/serve",q(e,t),t.timeoutMs);return le(n)}async function J(e,t,n){let r=await U(n.origin,"/v1/serve/batch",{...q(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:W(o.config),...Array.isArray(o.allowedPlacements)?{allowedPlacements:o.allowedPlacements.filter(i=>typeof i=="string")}:{}}:null}function Y(e,t){return U(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}var ce=new RegExp("\x1B\\[[0-9;]*m|\x1B\\]8;;[^\x07\x1B]*(?:\x07|\x1B\\\\)","g"),k={dim:"\x1B[2m",bold:"\x1B[1m",reset:"\x1B[0m"},ue=60,pe=24,de="\u2139 This project is supported by Blips via OpenCrater. Opt out: `npx opencrater off` or OPENCRATER_DISABLE=1";function fe(e){return e.replace(ce,"").length}function y(e,t){return t<=0?"":e.length<=t?e:t===1?"\u2026":e.slice(0,t-1).trimEnd()+"\u2026"}function me(e,t,n){let r=e.split(/\s+/).filter(l=>l.length>0),o=[],i="";for(let l of r){let p=i===""?l:`${i} ${l}`;if(p.length<=t)i=p;else if(i!==""&&o.push(i),i=l.length>t?y(l,t):l,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,u=o[a];return u!==void 0&&s.length<r.join(" ").length&&(o[a]=y(`${u}\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 ge(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 X(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function g(e,t={}){let n=t.width??process.stdout.columns??80,o=Math.max(pe,Math.min(n,ue))-4,i=t.color??P(),s=t.hyperlinks??O(),a=(m,$)=>i?`${$}${m}${k.reset}`:m,u=e.label?y(e.label,o):e.sponsorLabel?y(`Sponsored Blips \xB7 ${e.sponsorLabel}`,o):"Sponsored Blips",l=[];l.push(a(u,k.dim)),e.title!==e.sponsorLabel&&l.push(a(y(e.title,o),k.bold));for(let m of me(e.body,o,2))l.push(m);let p="\u2192 ";if(s){let m=y(e.cta??e.url,o-p.length);l.push(p+a(ge(e.url,m),k.dim));}else e.cta&&l.push(y(e.cta,o)),l.push(p+a(y(e.url,o-p.length),k.dim));let R=`\u256D${"\u2500".repeat(o+2)}\u256E`,E=`\u2570${"\u2500".repeat(o+2)}\u256F`,L=l.map(m=>{let $=" ".repeat(Math.max(0,o-fe(m)));return `\u2502 ${m}${$} \u2502`}),h=[];return t.disclosure&&h.push(a(de,k.dim)),h.push(R,...L,E),h.join(`
3
3
  `)+`
4
- `}function Z(e){return e!==void 0&&e!==""}function G(e=process.env,t=!!process.stdout.isTTY){if(!t)return "none";let n=e.TERM??"";if(Z(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"||Z(e.KITTY_WINDOW_ID)?"kitty":"none"}var w="\x1B",Se="\x07",ye=2e3,he=2*1024*1024,be=new Set(["image/png","image/jpeg","image/gif","image/webp"]),x=4096;async function ke(e,t=fetch,n={}){let r=n.timeoutMs??ye,o=n.maxBytes??he;try{let i=await t(e,{signal:AbortSignal.timeout(r)});if(!i.ok)return c(`media: HTTP ${i.status} for ${e}`),null;let s=(i.headers.get("content-type")??"").split(";")[0].trim().toLowerCase();if(!be.has(s))return c(`media: disallowed content-type "${s}" for ${e}`),null;let a=Number(i.headers.get("content-length")??"0");if(Number.isFinite(a)&&a>o)return c(`media: content-length ${a} exceeds ${o} for ${e}`),null;let u=i.body;if(u&&typeof u.getReader=="function"){let p=u.getReader(),R=[],v=0;for(;;){let{done:N,value:h}=await p.read();if(N)break;if(h!==void 0){if(v+=h.byteLength,v>o)return await p.cancel().catch(()=>{}),c(`media: stream exceeded ${o} bytes for ${e}`),null;R.push(h);}}return Buffer.concat(R)}let l=Buffer.from(await i.arrayBuffer());return l.byteLength>o?(c(`media: body ${l.byteLength} bytes exceeds ${o} for ${e}`),null):l}catch(i){return c(`media: fetch failed for ${e}:`,i),null}}function Ce(e){let t=e.toString("base64");return `${w}]1337;File=inline=1;size=${e.byteLength};width=auto:${t}${Se}`}function we(e){let t=e.toString("base64");if(t.length<=x)return `${w}_Gf=100,a=T;${t}${w}\\`;let n=[];for(let r=0;r<t.length;r+=x){let o=t.slice(r,r+x),s=`m=${r+x>=t.length?0:1}`,a=r===0?`f=100,a=T,${s}`:s;n.push(`${w}_G${a};${o}${w}\\`);}return n.join("")}function B(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 H(e,t={}){try{let n=e.creative;if(n.format!=="image"&&n.format!=="gif")return g(B(e),t);let r=t.protocol??G();if(r==="none"||n.mediaUrl===void 0||n.mediaUrl==="")return g(B(e),t);let o={};t.timeoutMs!==void 0&&(o.timeoutMs=t.timeoutMs),t.maxBytes!==void 0&&(o.maxBytes=t.maxBytes);let i=await ke(n.mediaUrl,t.fetchImpl??fetch,o);return i===null||i.byteLength===0?g(B(e),t):(r==="kitty"?we(i):Ce(i))+`
5
- `+g(A(e),t)}catch(n){return c("media: render failed, falling back to text:",n),g(A(e),t)}}function Te(e,t){return e.filter(n=>n.renderBy>t)}function Q(e,t,n=18e5){return e.filter(r=>r&&typeof r.impressionId=="string"&&typeof r.clickUrl=="string"&&r.creative&&typeof r.creative.title=="string").map(r=>({blip:r,renderBy:t+n}))}function ee(e,t){let n=Te(e.pool,t),r=n.shift();return {blip:r?r.blip:null,pool:n}}function Re(e=process.env){return C__namespace.join(te__namespace.homedir(),".config","opencrater")}function ne(e=process.env){return C__namespace.join(Re(e),"state.json")}function _(){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 S(e){return typeof e=="number"&&Number.isFinite(e)}var oe=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function re(e){for(let t=0;;t++)try{return {text:f__namespace.readFileSync(e,"utf8")}}catch(n){let r=n.code??"";if(!(r==="ENOENT"||oe.has(r)))return {locked:true};if(t>=4)return r==="ENOENT"?{missing:true}:{locked:true};try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(t+1));}catch{}}}function ve(e){if(typeof e!="object"||e===null)return null;let t=e;return !S(t.minIntervalSeconds)||!S(t.serveTimeoutMs)||!S(t.preloadPoolSize)||typeof t.killSwitch!="boolean"?null:{minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:t.preloadPoolSize,killSwitch:t.killSwitch,displayDurationSeconds:S(t.displayDurationSeconds)?t.displayDurationSeconds:25,minSdkVersion:typeof t.minSdkVersion=="string"?t.minSdkVersion:""}}function Ee(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(!S(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 Oe(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 Pe(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"||!S(r.at))&&(t.push({topic:r.topic.slice(0,32),at:r.at}),t.length>=24))break}return t}function Ae(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 xe(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 Be(e){if(typeof e!="object"||e===null)return null;let t=e,n=r=>S(r)&&r>=0?r:0;return {turns:n(t.turns),lastLimitAt:n(t.lastLimitAt),lastDepletedAt:n(t.lastDepletedAt),lastBackupAt:n(t.lastBackupAt)}}function _e(e){let t=_();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:S(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:ve(n.cachedConfig),allowedPlacements:Oe(n.allowedPlacements),sessionTopics:Pe(n.sessionTopics),integrations:Ae(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:xe(n.computeRouting),computeCards:Be(n.computeCards),configFetchedAt:S(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:Ee(n.pool)}}function T(e=process.env){let t=ne(e),n=re(t);if(n.text!==void 0)try{return _e(JSON.parse(n.text))}catch{let r=_();try{d(r,e);}catch{}return r}if(n.missing){let r=_();try{d(r,e);}catch{}return r}return _()}function d(e,t=process.env,n={}){let r=ne(t),o=C__namespace.dirname(r);f__namespace.mkdirSync(o,{recursive:true});let i=re(r),s=null;if(i.text!==void 0)try{s=JSON.parse(i.text);}catch{s=null;}if(s)typeof s.lastShownAt=="number"&&s.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:s.lastShownAt}),!n.allowClearToken&&typeof s.devToken=="string"&&e.devToken==null&&(e={...e,devToken:s.devToken}),typeof s.installId=="string"&&s.installId.length>0&&s.installId!==e.installId&&(e={...e,installId:s.installId});else if(!n.allowClearToken&&e.devToken==null&&i.text===void 0&&!i.missing)return;let a=C__namespace.join(o,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);f__namespace.writeFileSync(a,JSON.stringify(e,null,2)+`
6
- `,"utf8");for(let u=0;;u++)try{f__namespace.renameSync(a,r);return}catch(l){let p=l.code??"";if(u>=4||!oe.has(p)){try{f__namespace.rmSync(a,{force:!0});}catch{}if(u>=4)return;throw l}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(u+1));}catch{}}}var Me=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function z(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function Le(e){return z(e.OPENCRATER_DISABLE)||z(e.TSN_DISABLE)}function Ne(e){return Me.some(t=>z(e[t]))}function K(e){return e?{...b,...e}:b}function I(e,t={}){if(Le(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=K(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(Ne(e.env))return "ci";if(!t.skipTTY&&!e.isTTY)return "not_tty";if(!t.skipFrequency){let r=n.minIntervalSeconds*1e3;if(e.state.lastShownAt>0&&e.now-e.state.lastShownAt<r)return "frequency"}return null}async function M(e){try{return await e()}catch(t){return c("suppressed error:",t),null}}function L(e,t){let n=K(t.cachedConfig);return {origin:V(e.apiOrigin),timeoutMs:n.serveTimeoutMs,installId:t.installId,config:n}}function $e(e,t){let n=!t.disclosureShown,r=g(e,{width:process.stdout.columns??80,color:P(),hyperlinks:O(),disclosure:n});return process.stdout.write(r),{...t,lastShownAt:Date.now(),disclosureShown:true}}async function ie(e,t){let n=await H(e,{width:process.stdout.columns??80,color:P(),hyperlinks:O(),disclosure:!t.disclosureShown});return process.stdout.write(n),{...t,lastShownAt:Date.now(),disclosureShown:true}}async function Fe(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()},{skipFrequency:true});if(n!==null)return c("fetch suppressed:",n),null;let r=L(e,t),o=await j(e,r);return o?(d({...t,cachedConfig:o.config,configFetchedAt:Date.now()}),o.fill&&o.blip?o.blip:null):null}async function De(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()});if(n!==null)return c("suppressed:",n),false;let r=L(e,t),o=await j(e,r);return o?(t={...t,cachedConfig:o.config,configFetchedAt:Date.now()},o.fill&&o.blip?(t=await ie(o.blip,t),d(t),Y(o.blip.impressionId,r),true):o.fallback?(t=$e(X(o.fallback),t),d(t),true):(d(t),false)):false}async function Ue(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()},{skipTTY:true,skipFrequency:true});if(n!==null)return c("preload suppressed:",n),0;let r=L(e,t),o=Math.max(1,r.config.preloadPoolSize),i=await J(e,o,r);if(!i)return 0;let s=Date.now(),a=Q(i.blips,s);return d({...t,pool:a,cachedConfig:i.config,configFetchedAt:s}),a.length}async function je(e){let t=T(),n=Date.now(),r=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:n});if(r!==null)return c("renderFromPool suppressed:",r),false;let{blip:o,pool:i}=ee(t,n);if(!o)return d({...t,pool:i}),false;let s=await ie(o,{...t,pool:i});d(s);let a=L(e,t);return Y(o.impressionId,a),true}var pt={show(e){return M(()=>De(e)).then(t=>t??false)},fetch(e){return M(()=>Fe(e))},preload(e){return M(()=>Ue(e)).then(t=>t??0)},renderFromPool(e){return M(()=>je(e)).then(t=>t??false)}};exports.DEFAULT_CONFIG=b;exports.HOOK_CATALOG=se;exports.SDK_VERSION=D;exports.detectImageProtocol=G;exports.renderBlip=H;exports.renderCard=g;exports.sponsor=pt;exports.textCardForBlip=B;
4
+ `}function Z(e){return e!==void 0&&e!==""}function G(e=process.env,t=!!process.stdout.isTTY){if(!t)return "none";let n=e.TERM??"";if(Z(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"||Z(e.KITTY_WINDOW_ID)?"kitty":"none"}var w="\x1B",Se="\x07",ye=2e3,he=2*1024*1024,be=new Set(["image/png","image/jpeg","image/gif","image/webp"]),x=4096;async function ke(e,t=fetch,n={}){let r=n.timeoutMs??ye,o=n.maxBytes??he;try{let i=await t(e,{signal:AbortSignal.timeout(r)});if(!i.ok)return c(`media: HTTP ${i.status} for ${e}`),null;let s=(i.headers.get("content-type")??"").split(";")[0].trim().toLowerCase();if(!be.has(s))return c(`media: disallowed content-type "${s}" for ${e}`),null;let a=Number(i.headers.get("content-length")??"0");if(Number.isFinite(a)&&a>o)return c(`media: content-length ${a} exceeds ${o} for ${e}`),null;let u=i.body;if(u&&typeof u.getReader=="function"){let p=u.getReader(),R=[],E=0;for(;;){let{done:L,value:h}=await p.read();if(L)break;if(h!==void 0){if(E+=h.byteLength,E>o)return await p.cancel().catch(()=>{}),c(`media: stream exceeded ${o} bytes for ${e}`),null;R.push(h);}}return Buffer.concat(R)}let l=Buffer.from(await i.arrayBuffer());return l.byteLength>o?(c(`media: body ${l.byteLength} bytes exceeds ${o} for ${e}`),null):l}catch(i){return c(`media: fetch failed for ${e}:`,i),null}}function Ce(e){let t=e.toString("base64");return `${w}]1337;File=inline=1;size=${e.byteLength};width=auto:${t}${Se}`}function we(e){let t=e.toString("base64");if(t.length<=x)return `${w}_Gf=100,a=T;${t}${w}\\`;let n=[];for(let r=0;r<t.length;r+=x){let o=t.slice(r,r+x),s=`m=${r+x>=t.length?0:1}`,a=r===0?`f=100,a=T,${s}`:s;n.push(`${w}_G${a};${o}${w}\\`);}return n.join("")}function B(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 H(e,t={}){try{let n=e.creative;if(n.format!=="image"&&n.format!=="gif")return g(B(e),t);let r=t.protocol??G();if(r==="none"||n.mediaUrl===void 0||n.mediaUrl==="")return g(B(e),t);let o={};t.timeoutMs!==void 0&&(o.timeoutMs=t.timeoutMs),t.maxBytes!==void 0&&(o.maxBytes=t.maxBytes);let i=await ke(n.mediaUrl,t.fetchImpl??fetch,o);return i===null||i.byteLength===0?g(B(e),t):(r==="kitty"?we(i):Ce(i))+`
5
+ `+g(A(e),t)}catch(n){return c("media: render failed, falling back to text:",n),g(A(e),t)}}function Te(e,t){return e.filter(n=>n.renderBy>t)}function Q(e,t,n=18e5){return e.filter(r=>r&&typeof r.impressionId=="string"&&typeof r.clickUrl=="string"&&r.creative&&typeof r.creative.title=="string").map(r=>({blip:r,renderBy:t+n}))}function ee(e,t){let n=Te(e.pool,t),r=n.shift();return {blip:r?r.blip:null,pool:n}}function Re(e=process.env){return C__namespace.join(te__namespace.homedir(),".config","opencrater")}function ne(e=process.env){return C__namespace.join(Re(e),"state.json")}function _(){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 S(e){return typeof e=="number"&&Number.isFinite(e)}var oe=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function re(e){for(let t=0;;t++)try{return {text:f__namespace.readFileSync(e,"utf8")}}catch(n){let r=n.code??"";if(!(r==="ENOENT"||oe.has(r)))return {locked:true};if(t>=4)return r==="ENOENT"?{missing:true}:{locked:true};try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(t+1));}catch{}}}function Ee(e){if(typeof e!="object"||e===null)return null;let t=e;return !S(t.minIntervalSeconds)||!S(t.serveTimeoutMs)||!S(t.preloadPoolSize)||typeof t.killSwitch!="boolean"?null:{minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:t.preloadPoolSize,killSwitch:t.killSwitch,displayDurationSeconds:S(t.displayDurationSeconds)?t.displayDurationSeconds:25,minSdkVersion:typeof t.minSdkVersion=="string"?t.minSdkVersion:""}}function ve(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(!S(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 Oe(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 Pe(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"||!S(r.at))&&(t.push({topic:r.topic.slice(0,32),at:r.at}),t.length>=24))break}return t}function Ae(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 xe(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 Be(e){if(typeof e!="object"||e===null)return null;let t=e,n=r=>S(r)&&r>=0?r:0;return {turns:n(t.turns),lastLimitAt:n(t.lastLimitAt),lastDepletedAt:n(t.lastDepletedAt),lastBackupAt:n(t.lastBackupAt)}}function _e(e){let t=_();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:S(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:Ee(n.cachedConfig),allowedPlacements:Oe(n.allowedPlacements),sessionTopics:Pe(n.sessionTopics),integrations:Ae(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:xe(n.computeRouting),computeCards:Be(n.computeCards),configFetchedAt:S(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:ve(n.pool)}}function T(e=process.env){let t=ne(e),n=re(t);if(n.text!==void 0)try{return _e(JSON.parse(n.text))}catch{let r=_();try{d(r,e);}catch{}return r}if(n.missing){let r=_();try{d(r,e);}catch{}return r}return _()}function d(e,t=process.env,n={}){let r=ne(t),o=C__namespace.dirname(r);f__namespace.mkdirSync(o,{recursive:true});let i=re(r),s=null;if(i.text!==void 0)try{s=JSON.parse(i.text);}catch{s=null;}if(s)typeof s.lastShownAt=="number"&&s.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:s.lastShownAt}),!n.allowClearToken&&typeof s.devToken=="string"&&e.devToken==null&&(e={...e,devToken:s.devToken}),typeof s.installId=="string"&&s.installId.length>0&&s.installId!==e.installId&&(e={...e,installId:s.installId});else if(!n.allowClearToken&&e.devToken==null&&i.text===void 0&&!i.missing)return;let a=C__namespace.join(o,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);f__namespace.writeFileSync(a,JSON.stringify(e,null,2)+`
6
+ `,"utf8");for(let u=0;;u++)try{f__namespace.renameSync(a,r);return}catch(l){let p=l.code??"";if(u>=4||!oe.has(p)){try{f__namespace.rmSync(a,{force:!0});}catch{}if(u>=4)return;throw l}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(u+1));}catch{}}}var Me=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function z(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function Ne(e){return z(e.OPENCRATER_DISABLE)||z(e.TSN_DISABLE)}function Le(e){return Me.some(t=>z(e[t]))}function K(e){return e?{...b,...e}:b}function I(e,t={}){if(Ne(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=K(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(Le(e.env))return "ci";if(!t.skipTTY&&!e.isTTY)return "not_tty";if(!t.skipFrequency){let r=n.minIntervalSeconds*1e3;if(e.state.lastShownAt>0&&e.now-e.state.lastShownAt<r)return "frequency"}return null}async function M(e){try{return await e()}catch(t){return c("suppressed error:",t),null}}function N(e,t){let n=K(t.cachedConfig);return {origin:V(e.apiOrigin),timeoutMs:n.serveTimeoutMs,installId:t.installId,config:n}}function $e(e,t){let n=!t.disclosureShown,r=g(e,{width:process.stdout.columns??80,color:P(),hyperlinks:O(),disclosure:n});return process.stdout.write(r),{...t,lastShownAt:Date.now(),disclosureShown:true}}async function ie(e,t){let n=await H(e,{width:process.stdout.columns??80,color:P(),hyperlinks:O(),disclosure:!t.disclosureShown});return process.stdout.write(n),{...t,lastShownAt:Date.now(),disclosureShown:true}}async function Fe(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()},{skipFrequency:true});if(n!==null)return c("fetch suppressed:",n),null;let r=N(e,t),o=await j(e,r);return o?(d({...t,cachedConfig:o.config,configFetchedAt:Date.now()}),o.fill&&o.blip?o.blip:null):null}async function De(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()});if(n!==null)return c("suppressed:",n),false;let r=N(e,t),o=await j(e,r);return o?(t={...t,cachedConfig:o.config,configFetchedAt:Date.now()},o.fill&&o.blip?(t=await ie(o.blip,t),d(t),Y(o.blip.impressionId,r),true):o.fallback?(t=$e(X(o.fallback),t),d(t),true):(d(t),false)):false}async function Ue(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()},{skipTTY:true,skipFrequency:true});if(n!==null)return c("preload suppressed:",n),0;let r=N(e,t),o=Math.max(1,r.config.preloadPoolSize),i=await J(e,o,r);if(!i)return 0;let s=Date.now(),a=Q(i.blips,s);return d({...t,pool:a,cachedConfig:i.config,configFetchedAt:s}),a.length}async function je(e){let t=T(),n=Date.now(),r=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:n});if(r!==null)return c("renderFromPool suppressed:",r),false;let{blip:o,pool:i}=ee(t,n);if(!o)return d({...t,pool:i}),false;let s=await ie(o,{...t,pool:i});d(s);let a=N(e,t);return Y(o.impressionId,a),true}var pt={show(e){return M(()=>De(e)).then(t=>t??false)},fetch(e){return M(()=>Fe(e))},preload(e){return M(()=>Ue(e)).then(t=>t??0)},renderFromPool(e){return M(()=>je(e)).then(t=>t??false)}};exports.DEFAULT_CONFIG=b;exports.HOOK_CATALOG=se;exports.SDK_VERSION=D;exports.detectImageProtocol=G;exports.renderBlip=H;exports.renderCard=g;exports.sponsor=pt;exports.textCardForBlip=B;
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import {randomUUID}from'crypto';import*as f from'fs';import*as te 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 se=["SessionStart","SessionEnd","Stop","PostToolUse","Notification"];var D="1.1.30";var ae="https://api.opencrater.to";function V(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:ae)).replace(/\/+$/,"")}function c(...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
- `);}catch{}}catch{}}function E(e){return typeof e=="number"&&Number.isFinite(e)}function W(e){let t=b;if(typeof e!="object"||e===null)return {...t};let n=e;return {minIntervalSeconds:E(n.minIntervalSeconds)?n.minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:E(n.serveTimeoutMs)?n.serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:E(n.preloadPoolSize)?n.preloadPoolSize:t.preloadPoolSize,killSwitch:n.killSwitch===true,displayDurationSeconds:E(n.displayDurationSeconds)?n.displayDurationSeconds:t.displayDurationSeconds,minSdkVersion:typeof n.minSdkVersion=="string"?n.minSdkVersion:t.minSdkVersion}}async function U(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():(c(`POST ${t} -> HTTP ${i.status}`),null)}catch(i){return c(`POST ${t} failed:`,i),null}}function q(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 le(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:W(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 j(e,t){let n=await U(t.origin,"/v1/serve",q(e,t),t.timeoutMs);return le(n)}async function J(e,t,n){let r=await U(n.origin,"/v1/serve/batch",{...q(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:W(o.config),...Array.isArray(o.allowedPlacements)?{allowedPlacements:o.allowedPlacements.filter(i=>typeof i=="string")}:{}}:null}function Y(e,t){return U(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}var ce=new RegExp("\x1B\\[[0-9;]*m|\x1B\\]8;;[^\x07\x1B]*(?:\x07|\x1B\\\\)","g"),k={dim:"\x1B[2m",bold:"\x1B[1m",reset:"\x1B[0m"},ue=60,pe=24,de="\u2139 This project is supported by Blips via OpenCrater. Opt out: `npx opencrater off` or OPENCRATER_DISABLE=1";function fe(e){return e.replace(ce,"").length}function y(e,t){return t<=0?"":e.length<=t?e:t===1?"\u2026":e.slice(0,t-1).trimEnd()+"\u2026"}function me(e,t,n){let r=e.split(/\s+/).filter(l=>l.length>0),o=[],i="";for(let l of r){let p=i===""?l:`${i} ${l}`;if(p.length<=t)i=p;else if(i!==""&&o.push(i),i=l.length>t?y(l,t):l,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,u=o[a];return u!==void 0&&s.length<r.join(" ").length&&(o[a]=y(`${u}\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 ge(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 X(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function g(e,t={}){let n=t.width??process.stdout.columns??80,o=Math.max(pe,Math.min(n,ue))-4,i=t.color??P(),s=t.hyperlinks??O(),a=(m,$)=>i?`${$}${m}${k.reset}`:m,u=e.label?y(e.label,o):e.sponsorLabel?y(`Sponsored Blips \xB7 ${e.sponsorLabel}`,o):"Sponsored Blips",l=[];l.push(a(u,k.dim)),e.title!==e.sponsorLabel&&l.push(a(y(e.title,o),k.bold));for(let m of me(e.body,o,2))l.push(m);let p="\u2192 ";if(s){let m=y(e.cta??e.url,o-p.length);l.push(p+a(ge(e.url,m),k.dim));}else e.cta&&l.push(y(e.cta,o)),l.push(p+a(y(e.url,o-p.length),k.dim));let R=`\u256D${"\u2500".repeat(o+2)}\u256E`,v=`\u2570${"\u2500".repeat(o+2)}\u256F`,N=l.map(m=>{let $=" ".repeat(Math.max(0,o-fe(m)));return `\u2502 ${m}${$} \u2502`}),h=[];return t.disclosure&&h.push(a(de,k.dim)),h.push(R,...N,v),h.join(`
1
+ import {randomUUID}from'crypto';import*as f from'fs';import*as te 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 se=["SessionStart","SessionEnd","Stop","PostToolUse","Notification"];var D="1.1.32";var ae="https://api.opencrater.to";function V(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:ae)).replace(/\/+$/,"")}function c(...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
+ `);}catch{}}catch{}}function v(e){return typeof e=="number"&&Number.isFinite(e)}function W(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 U(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():(c(`POST ${t} -> HTTP ${i.status}`),null)}catch(i){return c(`POST ${t} failed:`,i),null}}function q(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 le(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:W(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 j(e,t){let n=await U(t.origin,"/v1/serve",q(e,t),t.timeoutMs);return le(n)}async function J(e,t,n){let r=await U(n.origin,"/v1/serve/batch",{...q(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:W(o.config),...Array.isArray(o.allowedPlacements)?{allowedPlacements:o.allowedPlacements.filter(i=>typeof i=="string")}:{}}:null}function Y(e,t){return U(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}var ce=new RegExp("\x1B\\[[0-9;]*m|\x1B\\]8;;[^\x07\x1B]*(?:\x07|\x1B\\\\)","g"),k={dim:"\x1B[2m",bold:"\x1B[1m",reset:"\x1B[0m"},ue=60,pe=24,de="\u2139 This project is supported by Blips via OpenCrater. Opt out: `npx opencrater off` or OPENCRATER_DISABLE=1";function fe(e){return e.replace(ce,"").length}function y(e,t){return t<=0?"":e.length<=t?e:t===1?"\u2026":e.slice(0,t-1).trimEnd()+"\u2026"}function me(e,t,n){let r=e.split(/\s+/).filter(l=>l.length>0),o=[],i="";for(let l of r){let p=i===""?l:`${i} ${l}`;if(p.length<=t)i=p;else if(i!==""&&o.push(i),i=l.length>t?y(l,t):l,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,u=o[a];return u!==void 0&&s.length<r.join(" ").length&&(o[a]=y(`${u}\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 ge(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 X(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function g(e,t={}){let n=t.width??process.stdout.columns??80,o=Math.max(pe,Math.min(n,ue))-4,i=t.color??P(),s=t.hyperlinks??O(),a=(m,$)=>i?`${$}${m}${k.reset}`:m,u=e.label?y(e.label,o):e.sponsorLabel?y(`Sponsored Blips \xB7 ${e.sponsorLabel}`,o):"Sponsored Blips",l=[];l.push(a(u,k.dim)),e.title!==e.sponsorLabel&&l.push(a(y(e.title,o),k.bold));for(let m of me(e.body,o,2))l.push(m);let p="\u2192 ";if(s){let m=y(e.cta??e.url,o-p.length);l.push(p+a(ge(e.url,m),k.dim));}else e.cta&&l.push(y(e.cta,o)),l.push(p+a(y(e.url,o-p.length),k.dim));let R=`\u256D${"\u2500".repeat(o+2)}\u256E`,E=`\u2570${"\u2500".repeat(o+2)}\u256F`,L=l.map(m=>{let $=" ".repeat(Math.max(0,o-fe(m)));return `\u2502 ${m}${$} \u2502`}),h=[];return t.disclosure&&h.push(a(de,k.dim)),h.push(R,...L,E),h.join(`
3
3
  `)+`
4
- `}function Z(e){return e!==void 0&&e!==""}function G(e=process.env,t=!!process.stdout.isTTY){if(!t)return "none";let n=e.TERM??"";if(Z(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"||Z(e.KITTY_WINDOW_ID)?"kitty":"none"}var w="\x1B",Se="\x07",ye=2e3,he=2*1024*1024,be=new Set(["image/png","image/jpeg","image/gif","image/webp"]),x=4096;async function ke(e,t=fetch,n={}){let r=n.timeoutMs??ye,o=n.maxBytes??he;try{let i=await t(e,{signal:AbortSignal.timeout(r)});if(!i.ok)return c(`media: HTTP ${i.status} for ${e}`),null;let s=(i.headers.get("content-type")??"").split(";")[0].trim().toLowerCase();if(!be.has(s))return c(`media: disallowed content-type "${s}" for ${e}`),null;let a=Number(i.headers.get("content-length")??"0");if(Number.isFinite(a)&&a>o)return c(`media: content-length ${a} exceeds ${o} for ${e}`),null;let u=i.body;if(u&&typeof u.getReader=="function"){let p=u.getReader(),R=[],v=0;for(;;){let{done:N,value:h}=await p.read();if(N)break;if(h!==void 0){if(v+=h.byteLength,v>o)return await p.cancel().catch(()=>{}),c(`media: stream exceeded ${o} bytes for ${e}`),null;R.push(h);}}return Buffer.concat(R)}let l=Buffer.from(await i.arrayBuffer());return l.byteLength>o?(c(`media: body ${l.byteLength} bytes exceeds ${o} for ${e}`),null):l}catch(i){return c(`media: fetch failed for ${e}:`,i),null}}function Ce(e){let t=e.toString("base64");return `${w}]1337;File=inline=1;size=${e.byteLength};width=auto:${t}${Se}`}function we(e){let t=e.toString("base64");if(t.length<=x)return `${w}_Gf=100,a=T;${t}${w}\\`;let n=[];for(let r=0;r<t.length;r+=x){let o=t.slice(r,r+x),s=`m=${r+x>=t.length?0:1}`,a=r===0?`f=100,a=T,${s}`:s;n.push(`${w}_G${a};${o}${w}\\`);}return n.join("")}function B(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 H(e,t={}){try{let n=e.creative;if(n.format!=="image"&&n.format!=="gif")return g(B(e),t);let r=t.protocol??G();if(r==="none"||n.mediaUrl===void 0||n.mediaUrl==="")return g(B(e),t);let o={};t.timeoutMs!==void 0&&(o.timeoutMs=t.timeoutMs),t.maxBytes!==void 0&&(o.maxBytes=t.maxBytes);let i=await ke(n.mediaUrl,t.fetchImpl??fetch,o);return i===null||i.byteLength===0?g(B(e),t):(r==="kitty"?we(i):Ce(i))+`
5
- `+g(A(e),t)}catch(n){return c("media: render failed, falling back to text:",n),g(A(e),t)}}function Te(e,t){return e.filter(n=>n.renderBy>t)}function Q(e,t,n=18e5){return e.filter(r=>r&&typeof r.impressionId=="string"&&typeof r.clickUrl=="string"&&r.creative&&typeof r.creative.title=="string").map(r=>({blip:r,renderBy:t+n}))}function ee(e,t){let n=Te(e.pool,t),r=n.shift();return {blip:r?r.blip:null,pool:n}}function Re(e=process.env){return C.join(te.homedir(),".config","opencrater")}function ne(e=process.env){return C.join(Re(e),"state.json")}function _(){return {installId:randomUUID(),lastShownAt:0,optOut:false,disclosureShown:false,cachedConfig:null,configFetchedAt:0,pool:[],allowedPlacements:{},sessionTopics:[],integrations:[],devToken:null,computeRouting:null,computeCards:null}}function S(e){return typeof e=="number"&&Number.isFinite(e)}var oe=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function re(e){for(let t=0;;t++)try{return {text:f.readFileSync(e,"utf8")}}catch(n){let r=n.code??"";if(!(r==="ENOENT"||oe.has(r)))return {locked:true};if(t>=4)return r==="ENOENT"?{missing:true}:{locked:true};try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(t+1));}catch{}}}function ve(e){if(typeof e!="object"||e===null)return null;let t=e;return !S(t.minIntervalSeconds)||!S(t.serveTimeoutMs)||!S(t.preloadPoolSize)||typeof t.killSwitch!="boolean"?null:{minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:t.preloadPoolSize,killSwitch:t.killSwitch,displayDurationSeconds:S(t.displayDurationSeconds)?t.displayDurationSeconds:25,minSdkVersion:typeof t.minSdkVersion=="string"?t.minSdkVersion:""}}function Ee(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(!S(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 Oe(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 Pe(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"||!S(r.at))&&(t.push({topic:r.topic.slice(0,32),at:r.at}),t.length>=24))break}return t}function Ae(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 xe(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 Be(e){if(typeof e!="object"||e===null)return null;let t=e,n=r=>S(r)&&r>=0?r:0;return {turns:n(t.turns),lastLimitAt:n(t.lastLimitAt),lastDepletedAt:n(t.lastDepletedAt),lastBackupAt:n(t.lastBackupAt)}}function _e(e){let t=_();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:S(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:ve(n.cachedConfig),allowedPlacements:Oe(n.allowedPlacements),sessionTopics:Pe(n.sessionTopics),integrations:Ae(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:xe(n.computeRouting),computeCards:Be(n.computeCards),configFetchedAt:S(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:Ee(n.pool)}}function T(e=process.env){let t=ne(e),n=re(t);if(n.text!==void 0)try{return _e(JSON.parse(n.text))}catch{let r=_();try{d(r,e);}catch{}return r}if(n.missing){let r=_();try{d(r,e);}catch{}return r}return _()}function d(e,t=process.env,n={}){let r=ne(t),o=C.dirname(r);f.mkdirSync(o,{recursive:true});let i=re(r),s=null;if(i.text!==void 0)try{s=JSON.parse(i.text);}catch{s=null;}if(s)typeof s.lastShownAt=="number"&&s.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:s.lastShownAt}),!n.allowClearToken&&typeof s.devToken=="string"&&e.devToken==null&&(e={...e,devToken:s.devToken}),typeof s.installId=="string"&&s.installId.length>0&&s.installId!==e.installId&&(e={...e,installId:s.installId});else if(!n.allowClearToken&&e.devToken==null&&i.text===void 0&&!i.missing)return;let a=C.join(o,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);f.writeFileSync(a,JSON.stringify(e,null,2)+`
6
- `,"utf8");for(let u=0;;u++)try{f.renameSync(a,r);return}catch(l){let p=l.code??"";if(u>=4||!oe.has(p)){try{f.rmSync(a,{force:!0});}catch{}if(u>=4)return;throw l}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(u+1));}catch{}}}var Me=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function z(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function Le(e){return z(e.OPENCRATER_DISABLE)||z(e.TSN_DISABLE)}function Ne(e){return Me.some(t=>z(e[t]))}function K(e){return e?{...b,...e}:b}function I(e,t={}){if(Le(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=K(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(Ne(e.env))return "ci";if(!t.skipTTY&&!e.isTTY)return "not_tty";if(!t.skipFrequency){let r=n.minIntervalSeconds*1e3;if(e.state.lastShownAt>0&&e.now-e.state.lastShownAt<r)return "frequency"}return null}async function M(e){try{return await e()}catch(t){return c("suppressed error:",t),null}}function L(e,t){let n=K(t.cachedConfig);return {origin:V(e.apiOrigin),timeoutMs:n.serveTimeoutMs,installId:t.installId,config:n}}function $e(e,t){let n=!t.disclosureShown,r=g(e,{width:process.stdout.columns??80,color:P(),hyperlinks:O(),disclosure:n});return process.stdout.write(r),{...t,lastShownAt:Date.now(),disclosureShown:true}}async function ie(e,t){let n=await H(e,{width:process.stdout.columns??80,color:P(),hyperlinks:O(),disclosure:!t.disclosureShown});return process.stdout.write(n),{...t,lastShownAt:Date.now(),disclosureShown:true}}async function Fe(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()},{skipFrequency:true});if(n!==null)return c("fetch suppressed:",n),null;let r=L(e,t),o=await j(e,r);return o?(d({...t,cachedConfig:o.config,configFetchedAt:Date.now()}),o.fill&&o.blip?o.blip:null):null}async function De(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()});if(n!==null)return c("suppressed:",n),false;let r=L(e,t),o=await j(e,r);return o?(t={...t,cachedConfig:o.config,configFetchedAt:Date.now()},o.fill&&o.blip?(t=await ie(o.blip,t),d(t),Y(o.blip.impressionId,r),true):o.fallback?(t=$e(X(o.fallback),t),d(t),true):(d(t),false)):false}async function Ue(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()},{skipTTY:true,skipFrequency:true});if(n!==null)return c("preload suppressed:",n),0;let r=L(e,t),o=Math.max(1,r.config.preloadPoolSize),i=await J(e,o,r);if(!i)return 0;let s=Date.now(),a=Q(i.blips,s);return d({...t,pool:a,cachedConfig:i.config,configFetchedAt:s}),a.length}async function je(e){let t=T(),n=Date.now(),r=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:n});if(r!==null)return c("renderFromPool suppressed:",r),false;let{blip:o,pool:i}=ee(t,n);if(!o)return d({...t,pool:i}),false;let s=await ie(o,{...t,pool:i});d(s);let a=L(e,t);return Y(o.impressionId,a),true}var pt={show(e){return M(()=>De(e)).then(t=>t??false)},fetch(e){return M(()=>Fe(e))},preload(e){return M(()=>Ue(e)).then(t=>t??0)},renderFromPool(e){return M(()=>je(e)).then(t=>t??false)}};export{b as DEFAULT_CONFIG,se as HOOK_CATALOG,D as SDK_VERSION,G as detectImageProtocol,H as renderBlip,g as renderCard,pt as sponsor,B as textCardForBlip};
4
+ `}function Z(e){return e!==void 0&&e!==""}function G(e=process.env,t=!!process.stdout.isTTY){if(!t)return "none";let n=e.TERM??"";if(Z(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"||Z(e.KITTY_WINDOW_ID)?"kitty":"none"}var w="\x1B",Se="\x07",ye=2e3,he=2*1024*1024,be=new Set(["image/png","image/jpeg","image/gif","image/webp"]),x=4096;async function ke(e,t=fetch,n={}){let r=n.timeoutMs??ye,o=n.maxBytes??he;try{let i=await t(e,{signal:AbortSignal.timeout(r)});if(!i.ok)return c(`media: HTTP ${i.status} for ${e}`),null;let s=(i.headers.get("content-type")??"").split(";")[0].trim().toLowerCase();if(!be.has(s))return c(`media: disallowed content-type "${s}" for ${e}`),null;let a=Number(i.headers.get("content-length")??"0");if(Number.isFinite(a)&&a>o)return c(`media: content-length ${a} exceeds ${o} for ${e}`),null;let u=i.body;if(u&&typeof u.getReader=="function"){let p=u.getReader(),R=[],E=0;for(;;){let{done:L,value:h}=await p.read();if(L)break;if(h!==void 0){if(E+=h.byteLength,E>o)return await p.cancel().catch(()=>{}),c(`media: stream exceeded ${o} bytes for ${e}`),null;R.push(h);}}return Buffer.concat(R)}let l=Buffer.from(await i.arrayBuffer());return l.byteLength>o?(c(`media: body ${l.byteLength} bytes exceeds ${o} for ${e}`),null):l}catch(i){return c(`media: fetch failed for ${e}:`,i),null}}function Ce(e){let t=e.toString("base64");return `${w}]1337;File=inline=1;size=${e.byteLength};width=auto:${t}${Se}`}function we(e){let t=e.toString("base64");if(t.length<=x)return `${w}_Gf=100,a=T;${t}${w}\\`;let n=[];for(let r=0;r<t.length;r+=x){let o=t.slice(r,r+x),s=`m=${r+x>=t.length?0:1}`,a=r===0?`f=100,a=T,${s}`:s;n.push(`${w}_G${a};${o}${w}\\`);}return n.join("")}function B(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 H(e,t={}){try{let n=e.creative;if(n.format!=="image"&&n.format!=="gif")return g(B(e),t);let r=t.protocol??G();if(r==="none"||n.mediaUrl===void 0||n.mediaUrl==="")return g(B(e),t);let o={};t.timeoutMs!==void 0&&(o.timeoutMs=t.timeoutMs),t.maxBytes!==void 0&&(o.maxBytes=t.maxBytes);let i=await ke(n.mediaUrl,t.fetchImpl??fetch,o);return i===null||i.byteLength===0?g(B(e),t):(r==="kitty"?we(i):Ce(i))+`
5
+ `+g(A(e),t)}catch(n){return c("media: render failed, falling back to text:",n),g(A(e),t)}}function Te(e,t){return e.filter(n=>n.renderBy>t)}function Q(e,t,n=18e5){return e.filter(r=>r&&typeof r.impressionId=="string"&&typeof r.clickUrl=="string"&&r.creative&&typeof r.creative.title=="string").map(r=>({blip:r,renderBy:t+n}))}function ee(e,t){let n=Te(e.pool,t),r=n.shift();return {blip:r?r.blip:null,pool:n}}function Re(e=process.env){return C.join(te.homedir(),".config","opencrater")}function ne(e=process.env){return C.join(Re(e),"state.json")}function _(){return {installId:randomUUID(),lastShownAt:0,optOut:false,disclosureShown:false,cachedConfig:null,configFetchedAt:0,pool:[],allowedPlacements:{},sessionTopics:[],integrations:[],devToken:null,computeRouting:null,computeCards:null}}function S(e){return typeof e=="number"&&Number.isFinite(e)}var oe=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function re(e){for(let t=0;;t++)try{return {text:f.readFileSync(e,"utf8")}}catch(n){let r=n.code??"";if(!(r==="ENOENT"||oe.has(r)))return {locked:true};if(t>=4)return r==="ENOENT"?{missing:true}:{locked:true};try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(t+1));}catch{}}}function Ee(e){if(typeof e!="object"||e===null)return null;let t=e;return !S(t.minIntervalSeconds)||!S(t.serveTimeoutMs)||!S(t.preloadPoolSize)||typeof t.killSwitch!="boolean"?null:{minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:t.preloadPoolSize,killSwitch:t.killSwitch,displayDurationSeconds:S(t.displayDurationSeconds)?t.displayDurationSeconds:25,minSdkVersion:typeof t.minSdkVersion=="string"?t.minSdkVersion:""}}function ve(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(!S(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 Oe(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 Pe(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"||!S(r.at))&&(t.push({topic:r.topic.slice(0,32),at:r.at}),t.length>=24))break}return t}function Ae(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 xe(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 Be(e){if(typeof e!="object"||e===null)return null;let t=e,n=r=>S(r)&&r>=0?r:0;return {turns:n(t.turns),lastLimitAt:n(t.lastLimitAt),lastDepletedAt:n(t.lastDepletedAt),lastBackupAt:n(t.lastBackupAt)}}function _e(e){let t=_();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:S(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:Ee(n.cachedConfig),allowedPlacements:Oe(n.allowedPlacements),sessionTopics:Pe(n.sessionTopics),integrations:Ae(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:xe(n.computeRouting),computeCards:Be(n.computeCards),configFetchedAt:S(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:ve(n.pool)}}function T(e=process.env){let t=ne(e),n=re(t);if(n.text!==void 0)try{return _e(JSON.parse(n.text))}catch{let r=_();try{d(r,e);}catch{}return r}if(n.missing){let r=_();try{d(r,e);}catch{}return r}return _()}function d(e,t=process.env,n={}){let r=ne(t),o=C.dirname(r);f.mkdirSync(o,{recursive:true});let i=re(r),s=null;if(i.text!==void 0)try{s=JSON.parse(i.text);}catch{s=null;}if(s)typeof s.lastShownAt=="number"&&s.lastShownAt>e.lastShownAt&&(e={...e,lastShownAt:s.lastShownAt}),!n.allowClearToken&&typeof s.devToken=="string"&&e.devToken==null&&(e={...e,devToken:s.devToken}),typeof s.installId=="string"&&s.installId.length>0&&s.installId!==e.installId&&(e={...e,installId:s.installId});else if(!n.allowClearToken&&e.devToken==null&&i.text===void 0&&!i.missing)return;let a=C.join(o,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);f.writeFileSync(a,JSON.stringify(e,null,2)+`
6
+ `,"utf8");for(let u=0;;u++)try{f.renameSync(a,r);return}catch(l){let p=l.code??"";if(u>=4||!oe.has(p)){try{f.rmSync(a,{force:!0});}catch{}if(u>=4)return;throw l}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(u+1));}catch{}}}var Me=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function z(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function Ne(e){return z(e.OPENCRATER_DISABLE)||z(e.TSN_DISABLE)}function Le(e){return Me.some(t=>z(e[t]))}function K(e){return e?{...b,...e}:b}function I(e,t={}){if(Ne(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=K(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(Le(e.env))return "ci";if(!t.skipTTY&&!e.isTTY)return "not_tty";if(!t.skipFrequency){let r=n.minIntervalSeconds*1e3;if(e.state.lastShownAt>0&&e.now-e.state.lastShownAt<r)return "frequency"}return null}async function M(e){try{return await e()}catch(t){return c("suppressed error:",t),null}}function N(e,t){let n=K(t.cachedConfig);return {origin:V(e.apiOrigin),timeoutMs:n.serveTimeoutMs,installId:t.installId,config:n}}function $e(e,t){let n=!t.disclosureShown,r=g(e,{width:process.stdout.columns??80,color:P(),hyperlinks:O(),disclosure:n});return process.stdout.write(r),{...t,lastShownAt:Date.now(),disclosureShown:true}}async function ie(e,t){let n=await H(e,{width:process.stdout.columns??80,color:P(),hyperlinks:O(),disclosure:!t.disclosureShown});return process.stdout.write(n),{...t,lastShownAt:Date.now(),disclosureShown:true}}async function Fe(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()},{skipFrequency:true});if(n!==null)return c("fetch suppressed:",n),null;let r=N(e,t),o=await j(e,r);return o?(d({...t,cachedConfig:o.config,configFetchedAt:Date.now()}),o.fill&&o.blip?o.blip:null):null}async function De(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()});if(n!==null)return c("suppressed:",n),false;let r=N(e,t),o=await j(e,r);return o?(t={...t,cachedConfig:o.config,configFetchedAt:Date.now()},o.fill&&o.blip?(t=await ie(o.blip,t),d(t),Y(o.blip.impressionId,r),true):o.fallback?(t=$e(X(o.fallback),t),d(t),true):(d(t),false)):false}async function Ue(e){let t=T(),n=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:Date.now()},{skipTTY:true,skipFrequency:true});if(n!==null)return c("preload suppressed:",n),0;let r=N(e,t),o=Math.max(1,r.config.preloadPoolSize),i=await J(e,o,r);if(!i)return 0;let s=Date.now(),a=Q(i.blips,s);return d({...t,pool:a,cachedConfig:i.config,configFetchedAt:s}),a.length}async function je(e){let t=T(),n=Date.now(),r=I({env:process.env,isTTY:!!process.stdout.isTTY,state:t,now:n});if(r!==null)return c("renderFromPool suppressed:",r),false;let{blip:o,pool:i}=ee(t,n);if(!o)return d({...t,pool:i}),false;let s=await ie(o,{...t,pool:i});d(s);let a=N(e,t);return Y(o.impressionId,a),true}var pt={show(e){return M(()=>De(e)).then(t=>t??false)},fetch(e){return M(()=>Fe(e))},preload(e){return M(()=>Ue(e)).then(t=>t??0)},renderFromPool(e){return M(()=>je(e)).then(t=>t??false)}};export{b as DEFAULT_CONFIG,se as HOOK_CATALOG,D as SDK_VERSION,G as detectImageProtocol,H as renderBlip,g as renderCard,pt as sponsor,B as textCardForBlip};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencrater",
3
- "version": "1.1.30",
3
+ "version": "1.1.32",
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",