opencrater 1.1.37 → 1.1.38

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,20 +1,24 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var crypto=require('crypto'),d=require('fs'),N=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 d__namespace=/*#__PURE__*/_interopNamespace(d);var N__namespace=/*#__PURE__*/_interopNamespace(N);var u__namespace=/*#__PURE__*/_interopNamespace(u);var le__namespace=/*#__PURE__*/_interopNamespace(le);var D=(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(N__namespace.homedir(),".config","opencrater")}function b(e=process.env){return u__namespace.join(me(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 k(e){return typeof e=="number"&&Number.isFinite(e)}var Y=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function X(e){for(let o=0;;o++)try{return {text:d__namespace.readFileSync(e,"utf8")}}catch(n){let t=n.code??"";if(!(t==="ENOENT"||Y.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 !k(o.minIntervalSeconds)||!k(o.serveTimeoutMs)||!k(o.preloadPoolSize)||typeof o.killSwitch!="boolean"?null:{minIntervalSeconds:o.minIntervalSeconds,serveTimeoutMs:o.serveTimeoutMs,preloadPoolSize:o.preloadPoolSize,killSwitch:o.killSwitch,displayDurationSeconds:k(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(!k(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 ke(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"||!k(t.at))&&(o.push({topic:t.topic.slice(0,32),at:t.at}),o.length>=24))break}return o}function ye(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=>k(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=T();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:k(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:ke(n.sessionTopics),integrations:ye(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:Se(n.computeRouting),computeCards:we(n.computeCards),configFetchedAt:k(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:ge(n.pool)}}function m(e=process.env){let o=b(e),n=X(o);if(n.text!==void 0)try{return be(JSON.parse(n.text))}catch{let t=T();try{E(t,e);}catch{}return t}if(n.missing){let t=T();try{E(t,e);}catch{}return t}return T()}function E(e,o=process.env,n={}){let t=b(o),r=u__namespace.dirname(t);d__namespace.mkdirSync(r,{recursive:true});let s=X(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 p=u__namespace.join(r,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);d__namespace.writeFileSync(p,JSON.stringify(e,null,2)+`
3
- `,"utf8");for(let a=0;;a++)try{d__namespace.renameSync(p,t);return}catch(l){let c=l.code??"";if(a>=4||!Y.has(c)){try{d__namespace.rmSync(p,{force:!0});}catch{}if(a>=4)return;throw l}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(a+1));}catch{}}}function v(e,o=process.env){let n={...m(o),...e};return E(n,o),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"],grok_cli:["SessionStart","Stop","SessionEnd","Notification"],generic:["SessionStart","Stop"]};var S=["claude_code","codex","gemini_cli","copilot_cli","grok_cli"];function C(e){return e.includes("opencrater-hook")||/opencrater[\\/][^"']*hook\.js/.test(e)}function ve(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ce(e,o){return C(e)&&new RegExp(`--package ['"]?${ve(o)}['"]?`).test(e)}function te(e,o){return o?Ce(e,o):C(e)&&!/--package\b/.test(e)}function Z(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var ee='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',ne="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function P(e,o,n,t){let r=`--placement ${o}`;return n&&(r+=` --key ${Z(n)}`),t&&(r+=` --package ${Z(t)}`),r+=` --host ${e}`,`{ if [ -f ${ee} ]; then node ${ee} ${r}; else npx -y -p opencrater opencrater-hook ${r}; fi; } 2>/dev/null || true`}function Oe(e,o,n){if(process.platform!=="win32")return P("grok_cli",e,o,n);let t=`--placement ${e}`;o&&(t+=` --key ${o}`),n&&(t+=` --package ${n}`),t+=" --host grok_cli";let r=`${N__namespace.homedir()}\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js`;return `try { if (Test-Path "${r}") { node "${r}" ${t} } else { npx -y -p opencrater opencrater-hook ${t} } } catch {}`}function re(e,o,n,t){let r=`--placement ${o}`;return n&&(r+=` --key '${n}'`),t&&(r+=` --package '${t}'`),r+=` --host ${e}`,`try { if (Test-Path "${ne}") { node "${ne}" ${r} } else { npx -y -p opencrater opencrater-hook ${r} } } catch {}`}function Re(e,o,n){if(process.platform!=="win32")return P("claude_code",e,o,n);let t=`--placement ${e}`;return o&&(t+=` --key ${o}`),n&&(t+=` --package ${n}`),t+=" --host claude_code",`node "${`${N__namespace.homedir()}\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js`}" ${t}; exit 0`}function L(e,o,n,t){if(e==="grok_cli")return {type:"command",command:Oe(o,n,t),timeout:15};let s={type:"command",command:e==="claude_code"?Re(o,n,t):P(e,o,n,t)};return e==="codex"&&(s.commandWindows=re(e,o,n,t)),s}function G(e,o){let n=N__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 j(e,o=process.env){let n=G(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 Ee(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(d__namespace.existsSync(u__namespace.join(r,s+i)))return !0}catch{}return false}function Pe(e,o=process.env){try{if(d__namespace.existsSync(G(e,o)))return !0}catch{}return Ee(Ae[e]??[],o)}function J(e=process.env){return S.filter(o=>Pe(o,e))}function H(e){let o;try{o=d__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 K(e,o){let n=u__namespace.dirname(e);d__namespace.mkdirSync(n,{recursive:true});let t=u__namespace.join(n,`.${u__namespace.basename(e)}.${process.pid}.tmp`);d__namespace.writeFileSync(t,JSON.stringify(o,null,2)+`
4
- `,"utf8"),d__namespace.renameSync(t,e);}function $e(e,o){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&te(n.command,o))}function xe(e,o,n,t){let r=j(e),s=H(r),i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(t.every(a=>{let l=L(e,a,o,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>Array.isArray(c.hooks)&&c.hooks.some(g=>g.command===l.command&&g.commandWindows===l.commandWindows))}))return "nochange";for(let a of t){let c=(Array.isArray(i[a])?i[a]:[]).filter(f=>!$e(f,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,K(r,s),"wrote"}var oe=12;function _e(e,o){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&te(n,o))}function Ie(e,o,n,t){let r=j(e),s=H(r);typeof s.version!="number"&&(s.version=1);let i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(t.every(a=>{let l=P(e,a,o,n);return (Array.isArray(i[a])?i[a]:[]).some(c=>c.bash===l&&c.timeoutSec===oe)}))return "nochange";for(let a of t){let c=(Array.isArray(i[a])?i[a]:[]).filter(g=>!_e(g,n));c.push({type:"command",bash:P(e,a,o,n),powershell:re(e,a,o,n),timeoutSec:oe}),i[a]=c;}return s.hooks=i,K(r,s),"wrote"}function M(e){return [...Q[e]]}function Te(e){let o=e;for(let n of ["claude","cursor"]){if(new RegExp(`^\\s*\\[compat\\.${n}\\]`,"m").test(o))continue;let t=o.length===0?"":o.endsWith(`
2
+ 'use strict';var crypto=require('crypto'),d=require('fs'),N=require('os'),c=require('path'),child_process=require('child_process'),ue=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 d__namespace=/*#__PURE__*/_interopNamespace(d);var N__namespace=/*#__PURE__*/_interopNamespace(N);var c__namespace=/*#__PURE__*/_interopNamespace(c);var ue__namespace=/*#__PURE__*/_interopNamespace(ue);var L=(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 fe(e=process.env){return c__namespace.join(N__namespace.homedir(),".config","opencrater")}function E(e=process.env){return c__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 k(e){return typeof e=="number"&&Number.isFinite(e)}var Y=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function X(e){for(let o=0;;o++)try{return {text:d__namespace.readFileSync(e,"utf8")}}catch(n){let t=n.code??"";if(!(t==="ENOENT"||Y.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 ge(e){if(typeof e!="object"||e===null)return null;let o=e;return !k(o.minIntervalSeconds)||!k(o.serveTimeoutMs)||!k(o.preloadPoolSize)||typeof o.killSwitch!="boolean"?null:{minIntervalSeconds:o.minIntervalSeconds,serveTimeoutMs:o.serveTimeoutMs,preloadPoolSize:o.preloadPoolSize,killSwitch:o.killSwitch,displayDurationSeconds:k(o.displayDurationSeconds)?o.displayDurationSeconds:25,minSdkVersion:typeof o.minSdkVersion=="string"?o.minSdkVersion:""}}function he(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(!k(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 ke(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"||!k(t.at))&&(o.push({topic:t.topic.slice(0,32),at:t.at}),o.length>=24))break}return o}function Se(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 we(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 be(e){if(typeof e!="object"||e===null)return null;let o=e,n=t=>k(t)&&t>=0?t:0;return {turns:n(o.turns),lastLimitAt:n(o.lastLimitAt),lastDepletedAt:n(o.lastDepletedAt),lastBackupAt:n(o.lastBackupAt)}}function ve(e){let o=T();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:k(n.lastShownAt)&&n.lastShownAt>=0?n.lastShownAt:0,optOut:n.optOut===true,disclosureShown:n.disclosureShown===true,cachedConfig:ge(n.cachedConfig),allowedPlacements:ke(n.allowedPlacements),sessionTopics:ye(n.sessionTopics),integrations:Se(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:we(n.computeRouting),computeCards:be(n.computeCards),configFetchedAt:k(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:he(n.pool)}}function m(e=process.env){let o=E(e),n=X(o);if(n.text!==void 0)try{return ve(JSON.parse(n.text))}catch{let t=T();try{A(t,e);}catch{}return t}if(n.missing){let t=T();try{A(t,e);}catch{}return t}return T()}function A(e,o=process.env,n={}){let t=E(o),r=c__namespace.dirname(t);d__namespace.mkdirSync(r,{recursive:true});let s=X(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 u=c__namespace.join(r,`.state.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);d__namespace.writeFileSync(u,JSON.stringify(e,null,2)+`
3
+ `,"utf8");for(let a=0;;a++)try{d__namespace.renameSync(u,t);return}catch(p){let l=p.code??"";if(a>=4||!Y.has(l)){try{d__namespace.rmSync(u,{force:!0});}catch{}if(a>=4)return;throw p}try{Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,15*(a+1));}catch{}}}function v(e,o=process.env){let n={...m(o),...e};return A(n,o),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"],grok_cli:["SessionStart","Stop","SessionEnd","Notification"],generic:["SessionStart","Stop"]};var w=["claude_code","codex","gemini_cli","copilot_cli","grok_cli"];function C(e){return e.includes("opencrater-hook")||/opencrater[\\/][^"']*hook\.js/.test(e)}function Ce(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Oe(e,o){return C(e)&&new RegExp(`--package ['"]?${Ce(o)}['"]?`).test(e)}function te(e,o){return o?Oe(e,o):C(e)&&!/--package\b/.test(e)}function Z(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var ee='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',ne="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function P(e,o,n,t){let r=`--placement ${o}`;return n&&(r+=` --key ${Z(n)}`),t&&(r+=` --package ${Z(t)}`),r+=` --host ${e}`,`{ if [ -f ${ee} ]; then node ${ee} ${r}; else npx -y -p opencrater opencrater-hook ${r}; fi; } 2>/dev/null || true`}function Re(e,o,n){if(process.platform!=="win32")return P("grok_cli",e,o,n);let t=`--placement ${e}`;o&&(t+=` --key ${o}`),n&&(t+=` --package ${n}`),t+=" --host grok_cli";let r=`${N__namespace.homedir()}\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js`;return `try { if (Test-Path "${r}") { node "${r}" ${t} } else { npx -y -p opencrater opencrater-hook ${t} } } catch {}`}function re(e,o,n,t){let r=`--placement ${o}`;return n&&(r+=` --key '${n}'`),t&&(r+=` --package '${t}'`),r+=` --host ${e}`,`try { if (Test-Path "${ne}") { node "${ne}" ${r} } else { npx -y -p opencrater opencrater-hook ${r} } } catch {}`}function Ae(e,o,n){if(process.platform!=="win32")return P("claude_code",e,o,n);let t=`--placement ${e}`;return o&&(t+=` --key ${o}`),n&&(t+=` --package ${n}`),t+=" --host claude_code",`node "${`${N__namespace.homedir()}\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js`}" ${t}; exit 0`}function G(e,o,n,t){if(e==="grok_cli")return {type:"command",command:Re(o,n,t),timeout:15};let s={type:"command",command:e==="claude_code"?Ae(o,n,t):P(e,o,n,t)};return e==="codex"&&(s.commandWindows=re(e,o,n,t)),s}function J(e,o){let n=N__namespace.homedir();switch(e){case "claude_code":{let t=o.CLAUDE_CONFIG_DIR;return t&&t.trim()!==""?t:c__namespace.join(n,".claude")}case "codex":{let t=o.CODEX_HOME;return t&&t.trim()!==""?t:c__namespace.join(n,".codex")}case "gemini_cli":return c__namespace.join(n,".gemini");case "copilot_cli":{let t=o.COPILOT_HOME;return t&&t.trim()!==""?t:c__namespace.join(n,".copilot")}case "grok_cli":{let t=o.GROK_HOME;return t&&t.trim()!==""?t:c__namespace.join(n,".grok")}default:return c__namespace.join(n,".opencrater-unknown")}}function j(e,o=process.env){let n=J(e,o);switch(e){case "claude_code":return c__namespace.join(n,"settings.json");case "codex":return c__namespace.join(n,"hooks.json");case "gemini_cli":return c__namespace.join(n,"settings.json");case "copilot_cli":return c__namespace.join(n,"hooks","hooks.json");case "grok_cli":return c__namespace.join(n,"hooks","opencrater.json");default:return c__namespace.join(n,"hooks.json")}}var Ee={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"],grok_cli:["grok"]};function Pe(e,o){if(e.length===0)return false;let n=(o.PATH??o.Path??"").split(c__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(d__namespace.existsSync(c__namespace.join(r,s+i)))return !0}catch{}return false}function $e(e,o=process.env){try{if(d__namespace.existsSync(J(e,o)))return !0}catch{}return Pe(Ee[e]??[],o)}function K(e=process.env){return w.filter(o=>$e(o,e))}function H(e){let o;try{o=d__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 z(e,o){let n=c__namespace.dirname(e);d__namespace.mkdirSync(n,{recursive:true});let t=c__namespace.join(n,`.${c__namespace.basename(e)}.${process.pid}.tmp`);d__namespace.writeFileSync(t,JSON.stringify(o,null,2)+`
4
+ `,"utf8"),d__namespace.renameSync(t,e);}function _e(e,o){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&te(n.command,o))}function xe(e,o,n,t){let r=j(e),s=H(r),i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(t.every(a=>{let p=G(e,a,o,n);return (Array.isArray(i[a])?i[a]:[]).some(l=>Array.isArray(l.hooks)&&l.hooks.some(g=>g.command===p.command&&g.commandWindows===p.commandWindows))}))return "nochange";for(let a of t){let l=(Array.isArray(i[a])?i[a]:[]).filter(f=>!_e(f,n)),g=e==="grok_cli"?{hooks:[G(e,a,o,n)]}:{matcher:"",hooks:[G(e,a,o,n)]};l.push(g),i[a]=l;}return s.hooks=i,z(r,s),"wrote"}var oe=12;function Ie(e,o){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&te(n,o))}function Te(e,o,n,t){let r=j(e),s=H(r);typeof s.version!="number"&&(s.version=1);let i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(t.every(a=>{let p=P(e,a,o,n);return (Array.isArray(i[a])?i[a]:[]).some(l=>l.bash===p&&l.timeoutSec===oe)}))return "nochange";for(let a of t){let l=(Array.isArray(i[a])?i[a]:[]).filter(g=>!Ie(g,n));l.push({type:"command",bash:P(e,a,o,n),powershell:re(e,a,o,n),timeoutSec:oe}),i[a]=l;}return s.hooks=i,z(r,s),"wrote"}function M(e){return [...Q[e]]}function Ne(e){let o=e;for(let n of ["claude","cursor"]){if(new RegExp(`^\\s*\\[compat\\.${n}\\]`,"m").test(o))continue;let t=o.length===0?"":o.endsWith(`
5
5
  `)?`
6
6
  `:`
7
7
 
8
8
  `;o+=`${t}[compat.${n}]
9
9
  hooks = false
10
- `;}return o}function Ne(e){try{let o=u__namespace.join(G("grok_cli",e),"config.toml"),n="";try{n=d__namespace.readFileSync(o,"utf8");}catch{}let t=Te(n);if(t===n)return;d__namespace.mkdirSync(u__namespace.dirname(o),{recursive:!0}),d__namespace.writeFileSync(o,t,"utf8");}catch{}}function z(e,o,n){let t=M(e);return t.length===0?"nochange":(e==="grok_cli"&&Ne(process.env),e==="copilot_cli"?Ie(e,o,n,t):xe(e,o,n,t))}function $(e,o,n=process.env){return J(n).map(t=>{try{let r=z(t,e,o);return {host:t,status:r,events:M(t)}}catch(r){return {host:t,status:"error",events:[],error:r.message}}})}function W(e=process.env){let o=[];for(let n of S){let t;try{t=H(j(n,e));}catch{continue}let r=t.hooks;if(!(!r||typeof r!="object"))for(let[s,i]of Object.entries(r))for(let p of Array.isArray(i)?i:[]){let a=p,l=Array.isArray(a.hooks)?a.hooks.find(f=>typeof f.command=="string"&&C(f.command))?.command:void 0,c=[a.bash,a.command,a.powershell].find(f=>typeof f=="string"&&C(f)),g=l??c;g&&o.push({host:n,event:s,command:g});}}return o}function se(e=process.env){let o=0;for(let n of S){let t=j(n,e),r;try{r=H(t);}catch{continue}let s=r.hooks;if(!s||typeof s!="object")continue;let i=s,p=false;for(let a of Object.keys(i)){let l=Array.isArray(i[a])?i[a]:[],c=l.filter(g=>{let f=g,V=Array.isArray(f.hooks)&&f.hooks.some(A=>typeof A.command=="string"&&C(A.command))||[f.bash,f.powershell,f.command].some(A=>typeof A=="string"&&C(A));return V&&o++,!V});c.length!==l.length&&(p=true,c.length>0?i[a]=c:delete i[a]);}if(p)try{let a=Object.keys(r).filter(c=>c!=="version"&&c!=="hooks"),l=n==="copilot_cli"||n==="codex";Object.keys(i).length===0&&a.length===0&&l?d__namespace.rmSync(t,{force:!0}):K(t,r);}catch{}}return o}var x="1.1.37";var je="https://api.opencrater.to";function O(e,o=process.env){let n=o.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:je)).replace(/\/+$/,"")}function Me(){return u__namespace.join(N__namespace.homedir(),".config","opencrater","runtime")}function Ue(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function U(e=Me()){if(process.env.VITEST||process.env.OPENCRATER_DISABLE_RUNTIME_PIN)return false;try{return child_process.spawnSync("npm",Ue(e),{stdio:"ignore",windowsHide:!0,shell:process.platform==="win32"}).status===0}catch{return false}}function Be(){let e=process.env.OPENCRATER_WEB_ORIGIN;return e&&e.trim()!==""?e.replace(/\/$/,""):O().replace("//api.","//").replace(/\/$/,"")}function Fe(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 De(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 _(e){return `${Math.round(e/1e3).toLocaleString()} tokens`}async function I(e,o){try{let n=new URL(`${O()}/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 Le(){let e=`${Be()}/dev/link`;console.log("Sign in and generate a CLI token here (we tried to open it):"),console.log(` ${e}
11
- `),Fe(e);let o=(await De("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 I(o,m().installId);if(!n)return console.error("Couldn't verify that token \u2014 check it and try again."),1;v({devToken:o}),console.log(`
12
- \u2713 Signed in as ${n.displayName}.`),console.log(` Compute balance: ${_(n.balanceMicroUsd)} \xB7 tier: ${n.trustTier}`);let t=$().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(U()?"\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 Ge(){let e=m().devToken;if(!e)return console.error("Not signed in. Run: opencrater login"),1;let o=await I(e,m().installId);return o?(console.log(`Compute balance: ${_(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 Je(){return E({...m(),devToken:null},process.env,{allowClearToken:true}),console.log("Signed out of the OpenCrater compute wallet on this machine."),0}async function Ke(e){let o=m().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await I(o,m().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=`${O().replace(/\/$/,"")}/gateway`,r=u__namespace.join(u__namespace.dirname(b()),"claude-gateway.settings.json");try{d__namespace.mkdirSync(u__namespace.dirname(r),{recursive:!0}),d__namespace.writeFileSync(r,JSON.stringify({apiKeyHelper:`echo ${o}`}),{mode:384});}catch(p){return console.error(`Couldn't write gateway settings: ${p.message}`),1}n&&console.log(`Launching Claude Code on OpenCrater compute \xB7 balance ${_(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(p=>{i.on("exit",a=>p(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"),p(127);});})}async function ze(e){let o=m().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await I(o,m().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=`${O().replace(/\/$/,"")}/gateway/v1`;n&&console.log(`Launching Codex on OpenCrater compute \xB7 balance ${_(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(p=>{i.on("exit",a=>p(a??0)),i.on("error",a=>{console.error(`Couldn't launch codex: ${a.message}`),console.error("Is Codex installed? npm i -g @openai/codex"),p(127);});})}async function We(e){let o=m().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await I(o,m().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=`${O().replace(/\/$/,"")}/gateway/v1`;n&&console.log(`Launching Grok on OpenCrater compute \xB7 balance ${_(n.balanceMicroUsd)}`);let r=u__namespace.join(u__namespace.dirname(b()),"grok-home");try{d__namespace.mkdirSync(r,{recursive:!0}),d__namespace.writeFileSync(u__namespace.join(r,"config.toml"),`[model.opencrater]
10
+ `;}return o}function je(e){try{let o=c__namespace.join(J("grok_cli",e),"config.toml"),n="";try{n=d__namespace.readFileSync(o,"utf8");}catch{}let t=Ne(n);if(t===n)return;d__namespace.mkdirSync(c__namespace.dirname(o),{recursive:!0}),d__namespace.writeFileSync(o,t,"utf8");}catch{}}function U(e,o,n){let t=M(e);return t.length===0?"nochange":(e==="grok_cli"&&je(process.env),e==="copilot_cli"?Te(e,o,n,t):xe(e,o,n,t))}function $(e,o,n=process.env){return K(n).map(t=>{try{let r=U(t,e,o);return {host:t,status:r,events:M(t)}}catch(r){return {host:t,status:"error",events:[],error:r.message}}})}function W(e=process.env){let o=[];for(let n of w){let t;try{t=H(j(n,e));}catch{continue}let r=t.hooks;if(!(!r||typeof r!="object"))for(let[s,i]of Object.entries(r))for(let u of Array.isArray(i)?i:[]){let a=u,p=Array.isArray(a.hooks)?a.hooks.find(f=>typeof f.command=="string"&&C(f.command))?.command:void 0,l=[a.bash,a.command,a.powershell].find(f=>typeof f=="string"&&C(f)),g=p??l;g&&o.push({host:n,event:s,command:g});}}return o}function se(e=process.env){let o=0;for(let n of w){let t=j(n,e),r;try{r=H(t);}catch{continue}let s=r.hooks;if(!s||typeof s!="object")continue;let i=s,u=false;for(let a of Object.keys(i)){let p=Array.isArray(i[a])?i[a]:[],l=p.filter(g=>{let f=g,V=Array.isArray(f.hooks)&&f.hooks.some(R=>typeof R.command=="string"&&C(R.command))||[f.bash,f.powershell,f.command].some(R=>typeof R=="string"&&C(R));return V&&o++,!V});l.length!==p.length&&(u=true,l.length>0?i[a]=l:delete i[a]);}if(u)try{let a=Object.keys(r).filter(l=>l!=="version"&&l!=="hooks"),p=n==="copilot_cli"||n==="codex";Object.keys(i).length===0&&a.length===0&&p?d__namespace.rmSync(t,{force:!0}):z(t,r);}catch{}}return o}var _="1.1.38";var He="https://api.opencrater.to";function O(e,o=process.env){let n=o.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:He)).replace(/\/+$/,"")}function Ue(){return c__namespace.join(N__namespace.homedir(),".config","opencrater","runtime")}function Be(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function B(e=Ue()){if(process.env.VITEST||process.env.OPENCRATER_DISABLE_RUNTIME_PIN)return false;try{return child_process.spawnSync("npm",Be(e),{stdio:"ignore",windowsHide:!0,shell:process.platform==="win32"}).status===0}catch{return false}}function Fe(){let e=process.env.OPENCRATER_WEB_ORIGIN;return e&&e.trim()!==""?e.replace(/\/$/,""):O().replace("//api.","//").replace(/\/$/,"")}function De(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 Le(e){let o=ue__namespace.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>o.question(e,t=>(o.close(),n(t))))}function x(e){return `${Math.round(e/1e3).toLocaleString()} tokens`}async function I(e,o){try{let n=new URL(`${O()}/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 Ge(){let e=`${Fe()}/dev/link`;console.log("Sign in and generate a CLI token here (we tried to open it):"),console.log(` ${e}
11
+ `),De(e);let o=(await Le("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 I(o,m().installId);if(!n)return console.error("Couldn't verify that token \u2014 check it and try again."),1;v({devToken:o}),console.log(`
12
+ \u2713 Signed in as ${n.displayName}.`),console.log(` Compute balance: ${x(n.balanceMicroUsd)} \xB7 tier: ${n.trustTier}`);let t=$().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(B()?"\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 Je(){let e=m().devToken;if(!e)return console.error("Not signed in. Run: opencrater login"),1;let o=await I(e,m().installId);return o?(console.log(`Compute balance: ${x(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 Ke(){return A({...m(),devToken:null},process.env,{allowClearToken:true}),console.log("Signed out of the OpenCrater compute wallet on this machine."),0}async function ze(e){let o=m().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await I(o,m().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=`${O().replace(/\/$/,"")}/gateway`,r=c__namespace.join(c__namespace.dirname(E()),"claude-gateway.settings.json");try{d__namespace.mkdirSync(c__namespace.dirname(r),{recursive:!0}),d__namespace.writeFileSync(r,JSON.stringify({apiKeyHelper:`echo ${o}`}),{mode:384});}catch(u){return console.error(`Couldn't write gateway settings: ${u.message}`),1}n&&console.log(`Launching Claude Code on OpenCrater compute \xB7 balance ${x(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(u=>{i.on("exit",a=>u(a??0)),i.on("error",a=>{console.error(`Couldn't launch claude: ${a.message}`),console.error("Is Claude Code installed? https://claude.com/claude-code"),u(127);});})}async function We(e){let o=m().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await I(o,m().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=`${O().replace(/\/$/,"")}/gateway/v1`;n&&console.log(`Launching Codex on OpenCrater compute \xB7 balance ${x(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(u=>{i.on("exit",a=>u(a??0)),i.on("error",a=>{console.error(`Couldn't launch codex: ${a.message}`),console.error("Is Codex installed? npm i -g @openai/codex"),u(127);});})}function Ve(){let e=process.env.GROK_HOME;return e&&e.trim()!==""?e:c__namespace.join(N__namespace.homedir(),".grok")}function qe(e){let o=c__namespace.join(Ve(),"config.toml"),n="";try{n=d__namespace.readFileSync(o,"utf8");}catch{}if(/^\s*\[model\.opencrater\]/m.test(n))return;let t=n.length===0?"":n.endsWith(`
13
+ `)?`
14
+ `:`
15
+
16
+ `;n+=`${t}[model.opencrater]
13
17
  model = "x-ai/grok-build-0.1"
14
- base_url = "${t}"
18
+ base_url = "${e}"
15
19
  name = "OpenCrater Compute"
16
20
  env_key = "OPENCRATER_TOKEN"
17
- `,{mode:384});}catch(l){return console.error(`Couldn't set up Grok compute home: ${l.message}`),1}let s={...process.env,GROK_HOME:r,OPENCRATER_TOKEN:o,OPENCRATER_ON_GATEWAY:"1"};delete s.GROK_MODELS_BASE_URL;let p=e.some(l=>l==="-m"||l==="--model"||l.startsWith("--model="))?[]:["-m","opencrater"],a=child_process.spawn("grok",[...p,...e],{stdio:"inherit",env:s,shell:process.platform==="win32"});return await new Promise(l=>{a.on("exit",c=>l(c??0)),a.on("error",c=>{console.error(`Couldn't launch grok: ${c.message}`),console.error("Is Grok installed? npm i -g @xai-official/grok"),l(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=m();n.integrations.some(t=>t.key===e&&t.package===o)||v({integrations:[...n.integrations,{key:e,package:o}].slice(-32)});}function B(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 Ve(){return v({optOut:true}),console.log("OpenCrater Blips are now OFF for this machine."),console.log("Re-enable any time with: npx opencrater on"),0}function qe(e){let{flags:o}=ue(e),n=o.get("key"),t=o.get("package");return v({optOut:false}),n&&t?(pe(n,t),B($(n,t),t),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(U()?"\u2713":"skipped (npm unavailable \u2014 hooks use npx fallback)")):m().devToken?(B($()),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(U()?"\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 Ye(){let e=m(),o=e.lastShownAt>0?new Date(e.lastShownAt).toISOString():"never";console.log(`opencrater v${x}`),console.log(` state file: ${b()}`),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: ${J().join(", ")||"(none)"}`),console.log(` integrations: ${e.integrations.map(t=>t.package).join(", ")||"(none)"}`);let n=W();return console.log(` wired hooks: ${n.length}`),0}function Xe(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(!S.includes(r))return console.error(`Unknown host "${r}". Supported: ${S.join(", ")}`),1;let s=r;try{let i=z(s,n,t);B([{host:s,status:i,events:M(s)}],t);}catch(i){return console.error(`Could not wire ${s}: ${i.message}`),1}}else B($(n,t),t);return console.log("Remove with: npx opencrater hooks uninstall"),0}function Qe(){let e=se();return v({integrations:[]}),console.log(e>0?`Removed ${e} OpenCrater hook${e===1?"":"s"} across all hosts.`:"No OpenCrater hooks installed."),0}function Ze(){let e=W();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${x} \u2014 OpenCrater Blips
21
+ `,d__namespace.mkdirSync(c__namespace.dirname(o),{recursive:true}),d__namespace.writeFileSync(o,n,"utf8");}async function Ye(e){let o=m().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await I(o,m().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=`${O().replace(/\/$/,"")}/gateway/v1`;n&&console.log(`Launching Grok on OpenCrater compute \xB7 balance ${x(n.balanceMicroUsd)}`);try{U("grok_cli");}catch{}try{qe(t);}catch(a){return console.error(`Couldn't configure the Grok compute model: ${a.message}`),1}let r={...process.env,OPENCRATER_TOKEN:o,OPENCRATER_ON_GATEWAY:"1"};delete r.GROK_MODELS_BASE_URL,delete r.GROK_HOME;let i=e.some(a=>a==="-m"||a==="--model"||a.startsWith("--model="))?[]:["-m","opencrater"],u=child_process.spawn("grok",[...i,...e],{stdio:"inherit",env:r,shell:process.platform==="win32"});return await new Promise(a=>{u.on("exit",p=>a(p??0)),u.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 pe(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 de(e,o){let n=m();n.integrations.some(t=>t.key===e&&t.package===o)||v({integrations:[...n.integrations,{key:e,package:o}].slice(-32)});}function F(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 Xe(){return v({optOut:true}),console.log("OpenCrater Blips are now OFF for this machine."),console.log("Re-enable any time with: npx opencrater on"),0}function Qe(e){let{flags:o}=pe(e),n=o.get("key"),t=o.get("package");return v({optOut:false}),n&&t?(de(n,t),F($(n,t),t),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(B()?"\u2713":"skipped (npm unavailable \u2014 hooks use npx fallback)")):m().devToken?(F($()),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(B()?"\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=m(),o=e.lastShownAt>0?new Date(e.lastShownAt).toISOString():"never";console.log(`opencrater v${_}`),console.log(` state file: ${E()}`),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: ${K().join(", ")||"(none)"}`),console.log(` integrations: ${e.integrations.map(t=>t.package).join(", ")||"(none)"}`);let n=W();return console.log(` wired hooks: ${n.length}`),0}function en(e){let{flags:o}=pe(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;de(n,t);let r=o.get("host");if(r&&r!=="true"){if(!w.includes(r))return console.error(`Unknown host "${r}". Supported: ${w.join(", ")}`),1;let s=r;try{let i=U(s,n,t);F([{host:s,status:i,events:M(s)}],t);}catch(i){return console.error(`Could not wire ${s}: ${i.message}`),1}}else F($(n,t),t);return console.log("Remove with: npx opencrater hooks uninstall"),0}function nn(){let e=se();return v({integrations:[]}),console.log(e>0?`Removed ${e} OpenCrater hook${e===1?"":"s"} across all hosts.`:"No OpenCrater hooks installed."),0}function on(){let e=W();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${_} \u2014 OpenCrater Blips
18
22
 
19
23
  Usage:
20
24
  opencrater on [--key <ock_\u2026> --package <name>]
@@ -38,5 +42,5 @@ Usage:
38
42
  opencrater hooks uninstall Remove all OpenCrater hooks (every host)
39
43
  opencrater hooks list List installed OpenCrater hooks
40
44
 
41
- Hosts: ${S.join(", ")}
42
- Environment: OPENCRATER_DISABLE=1 disables everything; NO_COLOR respected.`),0}function en(e){let[o,...n]=e;switch(o){case "off":return Ve();case "on":return qe(n);case "login":return Le();case "balance":return Ge();case "logout":return Je();case "claude":case "code":return Ke(n);case "codex":return ze(n);case "grok":return We(n);case "status":return Ye();case "hooks":{let[t,...r]=n;switch(t){case "install":return Xe(r);case "uninstall":return Qe();case "list":return Ze();default:return console.error("Usage: opencrater hooks <install|uninstall|list>"),1}}case "version":case "--version":case "-v":return console.log(x),0;case void 0:case "help":case "--help":case "-h":return ce();default:return console.error(`Unknown command: ${o}`),ce(),1}}typeof D<"u"&&typeof module<"u"&&D.main===module&&Promise.resolve().then(()=>en(process.argv.slice(2))).then(e=>{process.exitCode=e;}).catch(e=>{console.error(`opencrater: ${e.message}`),process.exitCode=1;});exports.runCli=en;
45
+ Hosts: ${w.join(", ")}
46
+ Environment: OPENCRATER_DISABLE=1 disables everything; NO_COLOR respected.`),0}function tn(e){let[o,...n]=e;switch(o){case "off":return Xe();case "on":return Qe(n);case "login":return Ge();case "balance":return Je();case "logout":return Ke();case "claude":case "code":return ze(n);case "codex":return We(n);case "grok":return Ye(n);case "status":return Ze();case "hooks":{let[t,...r]=n;switch(t){case "install":return en(r);case "uninstall":return nn();case "list":return on();default:return console.error("Usage: opencrater hooks <install|uninstall|list>"),1}}case "version":case "--version":case "-v":return console.log(_),0;case void 0:case "help":case "--help":case "-h":return ce();default:return console.error(`Unknown command: ${o}`),ce(),1}}typeof L<"u"&&typeof module<"u"&&L.main===module&&Promise.resolve().then(()=>tn(process.argv.slice(2))).then(e=>{process.exitCode=e;}).catch(e=>{console.error(`opencrater: ${e.message}`),process.exitCode=1;});exports.runCli=tn;
package/dist/hook.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
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:""},he={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"]},ye={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 _="1.1.37";var at="https://api.opencrater.to";function Q(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return ((n&&n.trim()!==""?n:at)).replace(/\/+$/,"")}function y(...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(" ")}
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:""},he={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"]},ye={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 _="1.1.38";var at="https://api.opencrater.to";function Q(e,t=process.env){let n=t.OPENCRATER_API_ORIGIN;return ((n&&n.trim()!==""?n:at)).replace(/\/+$/,"")}function y(...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
3
  `);}catch{}}catch{}}function B(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: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():(y(`POST ${t} -> HTTP ${i.status}`),null)}catch(i){return y(`POST ${t} failed:`,i),null}}function Se(e,t){let n=e.host??"generic";return {publisherKey:e.publisherKey,packageName:e.packageName,placement:e.placement,host:n,sdkVersion:_,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 be(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 ke(e,t){let n=await L(t.origin,"/v1/serve",Se(e,t),t.timeoutMs);return be(n)}async function we(e,t,n){let r={...Se(t,n),publisherKey:t.publisherKey??"",packageName:t.packageName??""},o=await L(n.origin,"/v1/dev/serve",r,n.timeoutMs,{authorization:`Bearer ${e}`});return be(o)}function ve(e,t,n){return L(n.origin,"/v1/dev/impression",{impressionId:t},n.timeoutMs,{authorization:`Bearer ${e}`}).then(()=>{}).catch(()=>{})}function ee(e,t){return L(t.origin,"/v1/events/impression",{impressionId:e},t.timeoutMs).then(()=>{}).catch(()=>{})}function Ce(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 Ee(e){return {sponsorLabel:"",title:e.title,body:e.body,url:e.url}}function U(e){let t=Ce(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 G(e=process.env){return m__namespace.join(D(e),"state.json")}function F(){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 Re=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function _e(e){for(let t=0;;t++)try{return {text:d__namespace.readFileSync(e,"utf8")}}catch(n){let r=n.code??"";if(!(r==="ENOENT"||Re.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=F();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 te(e=process.env){let t=G(e),n=_e(t);if(n.text!==void 0)try{return yt(JSON.parse(n.text))}catch{let r=F();try{S(r,e);}catch{}return r}if(n.missing){let r=F();try{S(r,e);}catch{}return r}return F()}function S(e,t=process.env,n={}){let r=G(t),o=m__namespace.dirname(r);d__namespace.mkdirSync(o,{recursive:true});let i=_e(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
4
  `,"utf8");for(let a=0;;a++)try{d__namespace.renameSync(l,r);return}catch(c){let f=c.code??"";if(a>=4||!Re.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 ne(){return m__namespace.join(D(),"recent-renders.json")}function kt(){return m__namespace.join(D(),"reported-ads.json")}function Oe(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 Oe(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 Ct(e){return e?vt()[e]!==void 0:false}function J(e,t=Date.now()){return e?wt(t)[e]!==void 0||Ct(e):false}function Ie(e){try{let t=JSON.parse(d__namespace.readFileSync(ne(),"utf8"));return Oe(t&&typeof t=="object"?t:{},e)}catch{return {}}}function K(e,t=Date.now()){if(e)try{let n=Ie(t);n[e]=t+St,d__namespace.mkdirSync(m__namespace.dirname(ne()),{recursive:!0}),d__namespace.writeFileSync(ne(),JSON.stringify(n));}catch{}}function Y(e,t=Date.now()){return e?Ie(t)[e]!==void 0:false}function Et(e,t){return e.filter(n=>n.renderBy>t)}function oe(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","grok_cli"];function $e(e){return e.includes("opencrater-hook")||/opencrater[\\/][^"']*hook\.js/.test(e)}function Rt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function _t(e,t){return $e(e)&&new RegExp(`--package ['"]?${Rt(t)}['"]?`).test(e)}function Me(e,t){return t?_t(e,t):$e(e)&&!/--package\b/.test(e)}function Ae(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var xe='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',Pe="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function H(e,t,n,r){let o=`--placement ${t}`;return n&&(o+=` --key ${Ae(n)}`),r&&(o+=` --package ${Ae(r)}`),o+=` --host ${e}`,`{ if [ -f ${xe} ]; then node ${xe} ${o}; else npx -y -p opencrater opencrater-hook ${o}; fi; } 2>/dev/null || true`}function Ot(e,t,n){if(process.platform!=="win32")return H("grok_cli",e,t,n);let r=`--placement ${e}`;t&&(r+=` --key ${t}`),n&&(r+=` --package ${n}`),r+=" --host grok_cli";let o=`${T__namespace.homedir()}\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js`;return `try { if (Test-Path "${o}") { node "${o}" ${r} } else { npx -y -p opencrater opencrater-hook ${r} } } catch {}`}function De(e,t,n,r){let o=`--placement ${t}`;return n&&(o+=` --key '${n}'`),r&&(o+=` --package '${r}'`),o+=` --host ${e}`,`try { if (Test-Path "${Pe}") { node "${Pe}" ${o} } else { npx -y -p opencrater opencrater-hook ${o} } } catch {}`}function It(e,t,n){if(process.platform!=="win32")return H("claude_code",e,t,n);let r=`--placement ${e}`;return t&&(r+=` --key ${t}`),n&&(r+=` --package ${n}`),r+=" --host claude_code",`node "${`${T__namespace.homedir()}\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js`}" ${r}; exit 0`}function re(e,t,n,r){if(e==="grok_cli")return {type:"command",command:Ot(t,n,r),timeout:15};let i={type:"command",command:e==="claude_code"?It(t,n,r):H(e,t,n,r)};return e==="codex"&&(i.commandWindows=De(e,t,n,r)),i}function ie(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 V(e,t=process.env){let n=ie(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 At={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"],grok_cli:["grok"]};function xt(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 Pt(e,t=process.env){try{if(d__namespace.existsSync(ie(e,t)))return !0}catch{}return xt(At[e]??[],t)}function se(e=process.env){return Tt.filter(t=>Pt(t,e))}function He(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 je(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
5
  `,"utf8"),d__namespace.renameSync(r,e);}function Nt(e,t){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&Me(n.command,t))}function $t(e,t,n,r){let o=V(e),i=He(o),s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let c=re(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=>!Nt(p,n)),u=e==="grok_cli"?{hooks:[re(e,a,t,n)]}:{matcher:"",hooks:[re(e,a,t,n)]};f.push(u),s[a]=f;}return i.hooks=s,je(o,i),"wrote"}var Ne=12;function Mt(e,t){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&Me(n,t))}function Dt(e,t,n,r){let o=V(e),i=He(o);typeof i.version!="number"&&(i.version=1);let s=i.hooks&&typeof i.hooks=="object"?i.hooks:{};if(r.every(a=>{let c=H(e,a,t,n);return (Array.isArray(s[a])?s[a]:[]).some(f=>f.bash===c&&f.timeoutSec===Ne)}))return "nochange";for(let a of r){let f=(Array.isArray(s[a])?s[a]:[]).filter(u=>!Mt(u,n));f.push({type:"command",bash:H(e,a,t,n),powershell:De(e,a,t,n),timeoutSec:Ne}),s[a]=f;}return i.hooks=s,je(o,i),"wrote"}function Be(e){return [...ye[e]]}function Ht(e){let t=e;for(let n of ["claude","cursor"]){if(new RegExp(`^\\s*\\[compat\\.${n}\\]`,"m").test(t))continue;let r=t.length===0?"":t.endsWith(`
package/dist/index.d.mts CHANGED
@@ -224,7 +224,7 @@ declare function renderBlip(blip: Blip, opts?: MediaRenderOptions): Promise<stri
224
224
 
225
225
  /** Keep in sync with package.json (bundled, so we avoid a runtime fs read).
226
226
  * AUTO-GENERATED by scripts/sync-version.mjs on `npm version`. */
227
- declare const SDK_VERSION = "1.1.37";
227
+ declare const SDK_VERSION = "1.1.38";
228
228
 
229
229
  /** Public API. Every method is fail-silent: it never throws. */
230
230
  declare const sponsor: {
package/dist/index.d.ts CHANGED
@@ -224,7 +224,7 @@ declare function renderBlip(blip: Blip, opts?: MediaRenderOptions): Promise<stri
224
224
 
225
225
  /** Keep in sync with package.json (bundled, so we avoid a runtime fs read).
226
226
  * AUTO-GENERATED by scripts/sync-version.mjs on `npm version`. */
227
- declare const SDK_VERSION = "1.1.37";
227
+ declare const SDK_VERSION = "1.1.38";
228
228
 
229
229
  /** Public API. Every method is fail-silent: it never throws. */
230
230
  declare const sponsor: {
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var crypto=require('crypto'),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.37";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(" ")}
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.38";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
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
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))+`
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
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.37";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(" ")}
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.38";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
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
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))+`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencrater",
3
- "version": "1.1.37",
3
+ "version": "1.1.38",
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",