opencrater 1.1.38 → 1.1.39
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 +9 -9
- package/dist/dismiss.js +1 -1
- package/dist/hook.js +5 -5
- package/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';var crypto=require('crypto'),d=require('fs'),
|
|
3
|
-
`,"utf8");for(let a=0;;a++)try{d__namespace.renameSync(u,t);return}catch(p){let l=p.code??"";if(a>=4||!
|
|
4
|
-
`,"utf8"),d__namespace.renameSync(t,e);}function
|
|
2
|
+
'use strict';var crypto=require('crypto'),d=require('fs'),j=require('os'),c=require('path'),child_process=require('child_process'),pe=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 j__namespace=/*#__PURE__*/_interopNamespace(j);var c__namespace=/*#__PURE__*/_interopNamespace(c);var pe__namespace=/*#__PURE__*/_interopNamespace(pe);var G=(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 ge(e=process.env){return c__namespace.join(j__namespace.homedir(),".config","opencrater")}function P(e=process.env){return c__namespace.join(ge(e),"state.json")}function N(){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 X=new Set(["EPERM","EACCES","EBUSY","EEXIST"]);function Q(e){for(let o=0;;o++)try{return {text:d__namespace.readFileSync(e,"utf8")}}catch(n){let t=n.code??"";if(!(t==="ENOENT"||X.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 he(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 ke(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 ye(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 Se(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 be(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 ve(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 Ce(e){let o=N();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:he(n.cachedConfig),allowedPlacements:ye(n.allowedPlacements),sessionTopics:Se(n.sessionTopics),integrations:be(n.integrations),devToken:typeof n.devToken=="string"?n.devToken:null,computeRouting:we(n.computeRouting),computeCards:ve(n.computeCards),configFetchedAt:k(n.configFetchedAt)&&n.configFetchedAt>=0?n.configFetchedAt:0,pool:ke(n.pool)}}function f(e=process.env){let o=P(e),n=Q(o);if(n.text!==void 0)try{return Ce(JSON.parse(n.text))}catch{let t=N();try{E(t,e);}catch{}return t}if(n.missing){let t=N();try{E(t,e);}catch{}return t}return N()}function E(e,o=process.env,n={}){let t=P(o),r=c__namespace.dirname(t);d__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 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||!X.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={...f(o),...e};return E(n,o),n}var Z={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 b=["claude_code","codex","gemini_cli","copilot_cli","grok_cli"];function C(e){return e.includes("opencrater-hook")||/opencrater[\\/][^"']*hook\.js/.test(e)}function Oe(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Re(e,o){return C(e)&&new RegExp(`--package ['"]?${Oe(o)}['"]?`).test(e)}function re(e,o){return o?Re(e,o):C(e)&&!/--package\b/.test(e)}function ee(e){return /^[A-Za-z0-9@_./:-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}var ne='"$HOME/.config/opencrater/runtime/node_modules/opencrater/dist/hook.js"',oe="$env:USERPROFILE\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js";function $(e,o,n,t){let r=`--placement ${o}`;return n&&(r+=` --key ${ee(n)}`),t&&(r+=` --package ${ee(t)}`),r+=` --host ${e}`,`{ if [ -f ${ne} ]; then node ${ne} ${r}; else npx -y -p opencrater opencrater-hook ${r}; fi; } 2>/dev/null || true`}function Ae(e,o,n){if(process.platform!=="win32")return $("grok_cli",e,o,n);let t=`--placement ${e}`;o&&(t+=` --key ${o}`),n&&(t+=` --package ${n}`),t+=" --host grok_cli";let r=`${j__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 se(e,o,n,t){let r=`--placement ${o}`;return n&&(r+=` --key '${n}'`),t&&(r+=` --package '${t}'`),r+=` --host ${e}`,`try { if (Test-Path "${oe}") { node "${oe}" ${r} } else { npx -y -p opencrater opencrater-hook ${r} } } catch {}`}function Ee(e,o,n){if(process.platform!=="win32")return $("claude_code",e,o,n);let t=`--placement ${e}`;return o&&(t+=` --key ${o}`),n&&(t+=` --package ${n}`),t+=" --host claude_code",`node "${`${j__namespace.homedir()}\\.config\\opencrater\\runtime\\node_modules\\opencrater\\dist\\hook.js`}" ${t}; exit 0`}function J(e,o,n,t){if(e==="grok_cli")return {type:"command",command:Ae(o,n,t),timeout:15};let s={type:"command",command:e==="claude_code"?Ee(o,n,t):$(e,o,n,t)};return e==="codex"&&(s.commandWindows=se(e,o,n,t)),s}function K(e,o){let n=j__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 H(e,o=process.env){let n=K(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 Pe={claude_code:["claude"],codex:["codex"],gemini_cli:["gemini"],copilot_cli:["copilot"],grok_cli:["grok"]};function $e(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(K(e,o)))return !0}catch{}return $e(Pe[e]??[],o)}function z(e=process.env){return b.filter(o=>_e(o,e))}function M(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 W(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 xe(e,o){return Array.isArray(e.hooks)&&e.hooks.some(n=>typeof n.command=="string"&&re(n.command,o))}function Ie(e,o,n,t){let r=H(e),s=M(r),i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(t.every(a=>{let p=J(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(m=>!xe(m,n)),g=e==="grok_cli"?{hooks:[J(e,a,o,n)]}:{matcher:"",hooks:[J(e,a,o,n)]};l.push(g),i[a]=l;}return s.hooks=i,W(r,s),"wrote"}var te=12;function Te(e,o){return [e.bash,e.powershell,e.command].some(n=>typeof n=="string"&&re(n,o))}function Ne(e,o,n,t){let r=H(e),s=M(r);typeof s.version!="number"&&(s.version=1);let i=s.hooks&&typeof s.hooks=="object"?s.hooks:{};if(t.every(a=>{let p=$(e,a,o,n);return (Array.isArray(i[a])?i[a]:[]).some(l=>l.bash===p&&l.timeoutSec===te)}))return "nochange";for(let a of t){let l=(Array.isArray(i[a])?i[a]:[]).filter(g=>!Te(g,n));l.push({type:"command",bash:$(e,a,o,n),powershell:se(e,a,o,n),timeoutSec:te}),i[a]=l;}return s.hooks=i,W(r,s),"wrote"}function U(e){return [...Z[e]]}function je(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
|
|
11
|
-
`),
|
|
12
|
-
\u2713 Signed in as ${n.displayName}.`),console.log(` Compute balance: ${
|
|
10
|
+
`;}return o}function He(e){try{let o=c__namespace.join(K("grok_cli",e),"config.toml"),n="";try{n=d__namespace.readFileSync(o,"utf8");}catch{}let t=je(n);if(t===n)return;d__namespace.mkdirSync(c__namespace.dirname(o),{recursive:!0}),d__namespace.writeFileSync(o,t,"utf8");}catch{}}function B(e,o,n){let t=U(e);return t.length===0?"nochange":(e==="grok_cli"&&He(process.env),e==="copilot_cli"?Ne(e,o,n,t):Ie(e,o,n,t))}function _(e,o,n=process.env){return z(n).map(t=>{try{let r=B(t,e,o);return {host:t,status:r,events:U(t)}}catch(r){return {host:t,status:"error",events:[],error:r.message}}})}function V(e=process.env){let o=[];for(let n of b){let t;try{t=M(H(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(m=>typeof m.command=="string"&&C(m.command))?.command:void 0,l=[a.bash,a.command,a.powershell].find(m=>typeof m=="string"&&C(m)),g=p??l;g&&o.push({host:n,event:s,command:g});}}return o}function ie(e=process.env){let o=0;for(let n of b){let t=H(n,e),r;try{r=M(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 m=g,q=Array.isArray(m.hooks)&&m.hooks.some(A=>typeof A.command=="string"&&C(A.command))||[m.bash,m.powershell,m.command].some(A=>typeof A=="string"&&C(A));return q&&o++,!q});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}):W(t,r);}catch{}}return o}var x="1.1.39";var Me="https://api.opencrater.to";function O(e,o=process.env){let n=o.OPENCRATER_API_ORIGIN;return (e??(n&&n.trim()!==""?n:Me)).replace(/\/+$/,"")}function Be(){return c__namespace.join(j__namespace.homedir(),".config","opencrater","runtime")}function Fe(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function F(e=Be()){if(process.env.VITEST||process.env.OPENCRATER_DISABLE_RUNTIME_PIN)return false;try{return child_process.spawnSync("npm",Fe(e),{stdio:"ignore",windowsHide:!0,shell:process.platform==="win32"}).status===0}catch{return false}}function De(){let e=process.env.OPENCRATER_WEB_ORIGIN;return e&&e.trim()!==""?e.replace(/\/$/,""):O().replace("//api.","//").replace(/\/$/,"")}function Le(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 Ge(e){let o=pe__namespace.createInterface({input:process.stdin,output:process.stdout});return new Promise(n=>o.question(e,t=>(o.close(),n(t))))}function R(e){return `${Math.round(e/1e3).toLocaleString()} tokens`}function I(e){let o=e?.pendingMicroUsd??0;return o>0?` \xB7 +${R(o)} pending`:""}async function T(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 Je(){let e=`${De()}/dev/link`;console.log("Sign in and generate a CLI token here (we tried to open it):"),console.log(` ${e}
|
|
11
|
+
`),Le(e);let o=(await Ge("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 T(o,f().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: ${R(n.balanceMicroUsd)}${I(n)} \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(F()?"\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 Ke(){let e=f().devToken;if(!e)return console.error("Not signed in. Run: opencrater login"),1;let o=await T(e,f().installId);return o?(console.log(`Compute balance: ${R(o.balanceMicroUsd)}${I(o)}`),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 ze(){return E({...f(),devToken:null},process.env,{allowClearToken:true}),console.log("Signed out of the OpenCrater compute wallet on this machine."),0}async function We(e){let o=f().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await T(o,f().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(P()),"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 ${R(n.balanceMicroUsd)}${I(n)}`);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 Ve(e){let o=f().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await T(o,f().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 ${R(n.balanceMicroUsd)}${I(n)}`);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 qe(){let e=process.env.GROK_HOME;return e&&e.trim()!==""?e:c__namespace.join(j__namespace.homedir(),".grok")}function Ye(e){let o=c__namespace.join(qe(),"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
13
|
`)?`
|
|
14
14
|
`:`
|
|
15
15
|
|
|
@@ -18,7 +18,7 @@ model = "x-ai/grok-build-0.1"
|
|
|
18
18
|
base_url = "${e}"
|
|
19
19
|
name = "OpenCrater Compute"
|
|
20
20
|
env_key = "OPENCRATER_TOKEN"
|
|
21
|
-
`,d__namespace.mkdirSync(c__namespace.dirname(o),{recursive:true}),d__namespace.writeFileSync(o,n,"utf8");}async function
|
|
21
|
+
`,d__namespace.mkdirSync(c__namespace.dirname(o),{recursive:true}),d__namespace.writeFileSync(o,n,"utf8");}async function Xe(e){let o=f().devToken;if(!o)return console.error("Not signed in. Run: opencrater login"),1;let n=await T(o,f().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 ${R(n.balanceMicroUsd)}${I(n)}`);try{B("grok_cli");}catch{}try{Ye(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 de(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 fe(e,o){let n=f();n.integrations.some(t=>t.key===e&&t.package===o)||v({integrations:[...n.integrations,{key:e,package:o}].slice(-32)});}function D(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 Qe(){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 Ze(e){let{flags:o}=de(e),n=o.get("key"),t=o.get("package");return v({optOut:false}),n&&t?(fe(n,t),D(_(n,t),t),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(F()?"\u2713":"skipped (npm unavailable \u2014 hooks use npx fallback)")):f().devToken?(D(_()),process.stdout.write("Pinning fast runtime (one-time, ~15s)\u2026 "),console.log(F()?"\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 en(){let e=f(),o=e.lastShownAt>0?new Date(e.lastShownAt).toISOString():"never";console.log(`opencrater v${x}`),console.log(` state file: ${P()}`),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: ${z().join(", ")||"(none)"}`),console.log(` integrations: ${e.integrations.map(t=>t.package).join(", ")||"(none)"}`);let n=V();return console.log(` wired hooks: ${n.length}`),0}function nn(e){let{flags:o}=de(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;fe(n,t);let r=o.get("host");if(r&&r!=="true"){if(!b.includes(r))return console.error(`Unknown host "${r}". Supported: ${b.join(", ")}`),1;let s=r;try{let i=B(s,n,t);D([{host:s,status:i,events:U(s)}],t);}catch(i){return console.error(`Could not wire ${s}: ${i.message}`),1}}else D(_(n,t),t);return console.log("Remove with: npx opencrater hooks uninstall"),0}function on(){let e=ie();return v({integrations:[]}),console.log(e>0?`Removed ${e} OpenCrater hook${e===1?"":"s"} across all hosts.`:"No OpenCrater hooks installed."),0}function tn(){let e=V();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 le(){return console.log(`opencrater v${x} \u2014 OpenCrater Blips
|
|
22
22
|
|
|
23
23
|
Usage:
|
|
24
24
|
opencrater on [--key <ock_\u2026> --package <name>]
|
|
@@ -42,5 +42,5 @@ Usage:
|
|
|
42
42
|
opencrater hooks uninstall Remove all OpenCrater hooks (every host)
|
|
43
43
|
opencrater hooks list List installed OpenCrater hooks
|
|
44
44
|
|
|
45
|
-
Hosts: ${
|
|
46
|
-
Environment: OPENCRATER_DISABLE=1 disables everything; NO_COLOR respected.`),0}function
|
|
45
|
+
Hosts: ${b.join(", ")}
|
|
46
|
+
Environment: OPENCRATER_DISABLE=1 disables everything; NO_COLOR respected.`),0}function rn(e){let[o,...n]=e;switch(o){case "off":return Qe();case "on":return Ze(n);case "login":return Je();case "balance":return Ke();case "logout":return ze();case "claude":case "code":return We(n);case "codex":return Ve(n);case "grok":return Xe(n);case "status":return en();case "hooks":{let[t,...r]=n;switch(t){case "install":return nn(r);case "uninstall":return on();case "list":return tn();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 le();default:return console.error(`Unknown command: ${o}`),le(),1}}typeof G<"u"&&typeof module<"u"&&G.main===module&&Promise.resolve().then(()=>rn(process.argv.slice(2))).then(e=>{process.exitCode=e;}).catch(e=>{console.error(`opencrater: ${e.message}`),process.exitCode=1;});exports.runCli=rn;
|
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=(o
|
|
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();
|
|
3
3
|
module.exports=dismiss;
|
package/dist/hook.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
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.
|
|
3
|
-
`);}catch{}}catch{}}function
|
|
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.39";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
|
+
`);}catch{}}catch{}}function U(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:U(n.minIntervalSeconds)?n.minIntervalSeconds:t.minIntervalSeconds,serveTimeoutMs:U(n.serveTimeoutMs)?n.serveTimeoutMs:t.serveTimeoutMs,preloadPoolSize:U(n.preloadPoolSize)?n.preloadPoolSize:t.preloadPoolSize,killSwitch:n.killSwitch===true,displayDurationSeconds:U(n.displayDurationSeconds)?n.displayDurationSeconds:t.displayDurationSeconds,minSdkVersion:typeof n.minSdkVersion=="string"?n.minSdkVersion:t.minSdkVersion}}async function B(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),typeof t.pendingMicroUsd=="number"&&(n.pendingMicroUsd=t.pendingMicroUsd),n}async function ke(e,t){let n=await B(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 B(n.origin,"/v1/dev/serve",r,n.timeoutMs,{authorization:`Bearer ${e}`});return be(o)}function ve(e,t,n){return B(n.origin,"/v1/dev/impression",{impressionId:t},n.timeoutMs,{authorization:`Bearer ${e}`}).then(()=>{}).catch(()=>{})}function ee(e,t){return B(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 L(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
|
-
`,"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
|
|
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 Ue(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(`
|
|
6
6
|
`)?`
|
|
7
7
|
`:`
|
|
8
8
|
|
|
9
9
|
`;t+=`${r}[compat.${n}]
|
|
10
10
|
hooks = false
|
|
11
|
-
`;}return t}function jt(e){try{let t=m__namespace.join(ie("grok_cli",e),"config.toml"),n="";try{n=d__namespace.readFileSync(t,"utf8");}catch{}let r=Ht(n);if(r===n)return;d__namespace.mkdirSync(m__namespace.dirname(t),{recursive:!0}),d__namespace.writeFileSync(t,r,"utf8");}catch{}}function Bt(e,t,n){let r=Be(e);return r.length===0?"nochange":(e==="grok_cli"&&jt(process.env),e==="copilot_cli"?Dt(e,t,n,r):$t(e,t,n,r))}function ae(e,t,n=process.env){return se(n).map(r=>{try{let o=Bt(r,e,t);return {host:r,status:o,events:Be(r)}}catch(o){return {host:r,status:"error",events:[],error:o.message}}})}function Ut(){return m__namespace.join(T__namespace.homedir(),".config","opencrater","runtime")}function Ft(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function ce(e=Ut()){child_process.spawn("npm",Ft(e),process.platform==="win32"?{detached:false,stdio:"ignore",windowsHide:true,shell:true}:{detached:true,stdio:"ignore"}).unref();}var Ge={atLimit:false,resetAt:null};function Je(e,t=T__namespace.homedir()){try{if(e==="claude_code")return Gt(t);if(e==="codex")return Jt(t)}catch{}return Ge}function Gt(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 Jt(e){return d__namespace.accessSync(m__namespace.join(e,".codex","auth.json")),Ge}function Ke(e,t){switch(e){case "gemini_cli":return t==="AfterAgent";case "copilot_cli":return t==="agentStop";default:return t==="Stop"}}var Ye=36e5,Kt=30*6e4,Yt=30*6e4,Wt=4*Ye,Vt=3,z="https://opencrater.to/dashboard";function $(e){return `${Math.round(e/1e3).toLocaleString()} tokens`}function zt(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 q="opencrater claude";function qt(e,t){return t<=0?0:Math.max(0,Math.min(100,Math.round(e/t*100)))}function Xt(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/Ye))}h`,o=new Date(e).toISOString().slice(0,10);return ` Your host limit resets in ${r} (${o}).`}function We(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=zt(i);if(t<=0)return a-(l.lastDepletedAt??0)<Yt?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"}.`+Xt(s.resetAt,a),url:z,cta:"Earn more"}};if(r){if(!o||(l.turns??0)%Vt!==0)return null;let f=n&&n>0?qt(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)<Kt?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: ${q}`,url:z,cta:c?c.resume:q}}:a-(l.lastBackupAt??0)>=Wt?{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: ${q}`,url:z,cta:c?c.resume:q}}:null}var tn=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function ue(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function nn(e){return ue(e.OPENCRATER_DISABLE)||ue(e.TSN_DISABLE)}function on(e){return tn.some(t=>ue(e[t]))}function Z(e){return e?{...M,...e}:M}function et(e,t={}){if(nn(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=Z(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(on(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 rn=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 sn(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 an(e,t=12){let n=[];for(let r of e.slice(0,2e3).split(/\s+/))if(!(!r||sn(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)||rn.has(i))&&!n.includes(i)&&(n.push(i),n.length>=t))return n}return n}function pe(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 an(t.join(" "))}function de(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 tt(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 un=false,pn=process.platform==="win32"?8e3:3200,dn=150,fe=250,fn=2800,me="claude_code";function mn(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==="grok_cli"||o==="generic")&&(t.host=o,n++);break;}}return t}function gn(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 hn="\\\\.\\CONOUT$";function yn(e){return !e||e==="?"||e==="??"||e==="-"?null:e.startsWith("/")?e:`/dev/${e}`}function Sn(e){let t=e.match(/^\s*(\d+)\s+(\S+)/);return t?{ppid:Number(t[1]),tty:t[2]}:null}function bn(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 kn(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 wn(e){try{let t=kn(d__namespace.readFileSync(`/proc/${e}/stat`,"utf8"));if(t)return {ppid:t.ppid,ttyPath:bn(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=Sn(t);return n?{ppid:n.ppid,ttyPath:yn(n.tty)}:null}catch{return null}}function vn(){if(process.platform==="win32")return {path:hn,ownerPid:null};let e=process.pid;for(let t=0;t<12&&e>1;t++){let n=wn(e);if(!n)return null;if(n.ttyPath)return {path:n.ttyPath,ownerPid:e};e=n.ppid;}return null}function Cn(e){return e==="win32"?{detached:false,stdio:"ignore",windowsHide:false}:{detached:true,stdio:"ignore",windowsHide:false}}async function j(e,t,n,r,o){try{let i=m__namespace.join(__dirname,"paint.js"),s=Z(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:Q(),durationMs:l*1e3,disclosure:!t.disclosureShown,host:me},c={...process.env,OPENCRATER_PAINT:JSON.stringify(a)};if(!c.OPENCRATER_TTY){let u=vn();u&&(c.OPENCRATER_TTY=u.path,u.ownerPid!==null&&(c.OPENCRATER_HOST_PID=String(u.ownerPid)));}let f=child_process.spawn(process.execPath,[i],{...Cn(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 nt(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 En=8e3;function ot(){let e=m__namespace.join(T__namespace.homedir(),".config","opencrater","render.lock");try{let t=d__namespace.statSync(e);if(Date.now()-t.mtimeMs<En)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 Tn(e,t,n,r){if(!t)return true;let o=e.allowedPlacements[`${t}:${n}`];return o?o.includes(r):t==="opencrater"?he[n].includes(r):true}var Rn=1440*60*1e3;function _n(){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<Rn)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()));}ce(e);}catch{}}function rt(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 it(){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{}ce(e);}catch{}}function On(){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 In=1440*60*1e3;function An(){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=se().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<In)return}catch{}d__namespace.mkdirSync(e,{recursive:!0});try{d__namespace.writeFileSync(t,String(Date.now()));}catch{return}let s=te();try{d__namespace.writeFileSync(n,JSON.stringify(r));}catch{}if(s.optOut)return;if(s.devToken)try{ae();}catch{}for(let l of s.integrations)try{ae(l.key,l.package);}catch{}}catch{}}async function xn(){let e=mn(process.argv.slice(2));if(me=e.host,process.env.GROK_HOOK_EVENT&&me!=="grok_cli")return;On(),_n(),An();let t=await gn(dn),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=te();y(`state=${G()} devToken=${o.devToken?"present":"MISSING"}`,`host=${e.host} placement=${r}`);let i=et({env:process.env,state:o,now:Date.now()},{skipTTY:true});if(i!==null){if(i==="frequency"){let p=pe(n);p.length>0&&S({...o,sessionTopics:de(o.sessionTopics,p,Date.now())});}y("hook suppressed:",i);return}if(o={...o,sessionTopics:de(o.sessionTopics,pe(n),Date.now())},!Tn(o,e.package,e.host,r)){S(o),y("hook gated: placement",r,"not selected for",e.package);return}let s=Z(o.cachedConfig),l=Q(),a={origin:l,timeoutMs:Math.min(s.serveTimeoutMs,fn),installId:o.installId,topics:tt(o.sessionTopics,Date.now())};if(o.devToken){let p=await we(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()},rt(_,p.config.minSdkVersion)&&it(),un);let R=e.host??"claude_code",ge=Ke(R,r),I=o.computeCards??{turns:0,lastLimitAt:0,lastDepletedAt:0,lastBackupAt:0};ge&&(I.turns+=1);let A=We({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:ge,hostName:R,host:Je(R),cc:I,now:Date.now()}),st=(p.config.displayDurationSeconds??25)*1e3,v=p.fill&&p.blip&&!J(p.blip.campaignId)&&!Y(p.blip.campaignId)?p.blip:null;if((A||v)&&!nt(st)&&ot())if(A){let C=Date.now();A.kind==="limit"?I.lastLimitAt=C:A.kind==="depleted"?I.lastDepletedAt=C:A.kind==="backup"&&(I.lastBackupAt=C),o=await j({...A.card,label:"OpenCrater"},o);}else v&&(K(v.campaignId),o=await j(U(v),o,v.creative,v.impressionId,v.campaignId),o.devToken&&await Promise.race([ve(o.devToken,v.impressionId,a),new Promise(C=>setTimeout(C,fe).unref?.())]));o={...o,computeCards:I};}S(o);return}let{blip:c,pool:f}=oe(o,Date.now());for(;c&&(J(c.campaignId)||Y(c.campaignId));)y("hook: pooled blip skipped \u2014 campaign inside a local cooldown"),{blip:c,pool:f}=oe({pool:f},Date.now());if((c||e.key)&&nt((s.displayDurationSeconds??25)*1e3)){S(o),y("hook: a card is already on screen \u2014 not rendering another");return}if((c||e.key)&&!ot()){S(o),y("hook: render slot already claimed by a concurrent fire");return}if(c){K(c.campaignId),o=await j(U(c),{...o,pool:f},c.creative,c.impressionId,c.campaignId),S(o),await Promise.race([ee(c.impressionId,a),new Promise(p=>setTimeout(p,fe).unref?.())]);return}if(f.length!==o.pool.length&&(o={...o,pool:f}),!e.key||!e.package){S(o),y("hook: pool empty and no --key/--package; nothing to render");return}let u=await ke({publisherKey:e.key,packageName:e.package,placement:r,host:e.host},a);if(!u){S(o);return}if(o={...o,cachedConfig:u.config,configFetchedAt:Date.now()},rt(_,u.config.minSdkVersion)&&(y(`SDK ${_} below floor ${u.config.minSdkVersion} \u2014 forcing runtime update`),it()),e.package&&u.allowedPlacements&&(o={...o,allowedPlacements:{...o.allowedPlacements,[`${e.package}:${e.host}`]:u.allowedPlacements}}),u.fill&&u.blip){if(J(u.blip.campaignId)||Y(u.blip.campaignId)){y("hook: served blip suppressed \u2014 campaign inside a local cooldown"),S(o);return}K(u.blip.campaignId),o=await j(U(u.blip),o,u.blip.creative,u.blip.impressionId,u.blip.campaignId),S(o),await Promise.race([ee(u.blip.impressionId,a),new Promise(p=>setTimeout(p,fe).unref?.())]);return}u.fallback&&(o=await j(Ee(u.fallback),o)),S(o);}if(typeof x<"u"&&typeof module<"u"&&x.main===module){let e=setTimeout(()=>process.exit(0),pn);xn().catch(t=>y(`opencrater-hook v${_} error:`,t)).finally(()=>{clearTimeout(e),process.exit(0);});}
|
|
12
|
-
exports.decodeTtyNr=
|
|
11
|
+
`;}return t}function jt(e){try{let t=m__namespace.join(ie("grok_cli",e),"config.toml"),n="";try{n=d__namespace.readFileSync(t,"utf8");}catch{}let r=Ht(n);if(r===n)return;d__namespace.mkdirSync(m__namespace.dirname(t),{recursive:!0}),d__namespace.writeFileSync(t,r,"utf8");}catch{}}function Ut(e,t,n){let r=Ue(e);return r.length===0?"nochange":(e==="grok_cli"&&jt(process.env),e==="copilot_cli"?Dt(e,t,n,r):$t(e,t,n,r))}function ae(e,t,n=process.env){return se(n).map(r=>{try{let o=Ut(r,e,t);return {host:r,status:o,events:Ue(r)}}catch(o){return {host:r,status:"error",events:[],error:o.message}}})}function Lt(){return m__namespace.join(T__namespace.homedir(),".config","opencrater","runtime")}function Ft(e){return ["install","--prefix",e,"opencrater@latest","--silent","--no-audit","--no-fund"]}function ce(e=Lt()){child_process.spawn("npm",Ft(e),process.platform==="win32"?{detached:false,stdio:"ignore",windowsHide:true,shell:true}:{detached:true,stdio:"ignore"}).unref();}var Ge={atLimit:false,resetAt:null};function Je(e,t=T__namespace.homedir()){try{if(e==="claude_code")return Gt(t);if(e==="codex")return Jt(t)}catch{}return Ge}function Gt(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 Jt(e){return d__namespace.accessSync(m__namespace.join(e,".codex","auth.json")),Ge}function Ke(e,t){switch(e){case "gemini_cli":return t==="AfterAgent";case "copilot_cli":return t==="agentStop";default:return t==="Stop"}}var Ye=36e5,Kt=30*6e4,Yt=30*6e4,Wt=4*Ye,Vt=3,z="https://opencrater.to/dashboard";function $(e){return `${Math.round(e/1e3).toLocaleString()} tokens`}function zt(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 q="opencrater claude";function qt(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/Ye))}h`,o=new Date(e).toISOString().slice(0,10);return ` Your host limit resets in ${r} (${o}).`}function We(e){let{balanceMicroUsd:t,pendingMicroUsd:n,onGateway:r,turnEnd:o,hostName:i,host:s,cc:l,now:a}=e;if(t===null)return null;let c=zt(i),f=n&&n>0?` (+${$(n)} pending)`:"";return t<=0?a-(l.lastDepletedAt??0)<Yt?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"}.`+qt(s.resetAt,a),url:z,cta:"Earn more"}}:r?!o||(l.turns??0)%Vt!==0?null:{kind:"hud",card:{sponsorLabel:"OpenCrater",title:"Running on OpenCrater compute",body:`${$(t)} compute available${f}.`,url:z,cta:"Wallet"}}:s.atLimit?a-(l.lastLimitAt??0)<Kt?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: ${q}`,url:z,cta:c?c.resume:q}}:a-(l.lastBackupAt??0)>=Wt?{kind:"backup",card:{sponsorLabel:"OpenCrater",title:"Backup compute ready",body:c?`${$(t)} of OpenCrater compute waiting${f}. When you hit your limit: ${c.resume}`:`${$(t)} of OpenCrater compute waiting${f}. Spend it any time: ${q}`,url:z,cta:c?c.resume:q}}:null}var en=["CI","CONTINUOUS_INTEGRATION","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","TRAVIS","BUILDKITE","JENKINS_URL","TEAMCITY_VERSION","TF_BUILD","APPVEYOR","CODEBUILD_BUILD_ID","DRONE","NETLIFY","VERCEL"];function ue(e){return e!==void 0&&e!==""&&e!=="0"&&e.toLowerCase()!=="false"}function tn(e){return ue(e.OPENCRATER_DISABLE)||ue(e.TSN_DISABLE)}function nn(e){return en.some(t=>ue(e[t]))}function Z(e){return e?{...M,...e}:M}function et(e,t={}){if(tn(e.env))return "env_disabled";if(e.state.optOut)return "opt_out";let n=Z(e.state.cachedConfig);if(n.killSwitch)return "kill_switch";if(nn(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 on=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 rn(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 sn(e,t=12){let n=[];for(let r of e.slice(0,2e3).split(/\s+/))if(!(!r||rn(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)||on.has(i))&&!n.includes(i)&&(n.push(i),n.length>=t))return n}return n}function pe(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 sn(t.join(" "))}function de(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 tt(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 ln=false,un=process.platform==="win32"?8e3:3200,pn=150,fe=250,dn=2800,me="claude_code";function fn(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==="grok_cli"||o==="generic")&&(t.host=o,n++);break;}}return t}function mn(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 gn="\\\\.\\CONOUT$";function hn(e){return !e||e==="?"||e==="??"||e==="-"?null:e.startsWith("/")?e:`/dev/${e}`}function yn(e){let t=e.match(/^\s*(\d+)\s+(\S+)/);return t?{ppid:Number(t[1]),tty:t[2]}:null}function Sn(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 bn(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 kn(e){try{let t=bn(d__namespace.readFileSync(`/proc/${e}/stat`,"utf8"));if(t)return {ppid:t.ppid,ttyPath:Sn(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=yn(t);return n?{ppid:n.ppid,ttyPath:hn(n.tty)}:null}catch{return null}}function wn(){if(process.platform==="win32")return {path:gn,ownerPid:null};let e=process.pid;for(let t=0;t<12&&e>1;t++){let n=kn(e);if(!n)return null;if(n.ttyPath)return {path:n.ttyPath,ownerPid:e};e=n.ppid;}return null}function vn(e){return e==="win32"?{detached:false,stdio:"ignore",windowsHide:false}:{detached:true,stdio:"ignore",windowsHide:false}}async function j(e,t,n,r,o){try{let i=m__namespace.join(__dirname,"paint.js"),s=Z(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:Q(),durationMs:l*1e3,disclosure:!t.disclosureShown,host:me},c={...process.env,OPENCRATER_PAINT:JSON.stringify(a)};if(!c.OPENCRATER_TTY){let u=wn();u&&(c.OPENCRATER_TTY=u.path,u.ownerPid!==null&&(c.OPENCRATER_HOST_PID=String(u.ownerPid)));}let f=child_process.spawn(process.execPath,[i],{...vn(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 nt(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 Cn=8e3;function ot(){let e=m__namespace.join(T__namespace.homedir(),".config","opencrater","render.lock");try{let t=d__namespace.statSync(e);if(Date.now()-t.mtimeMs<Cn)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 En(e,t,n,r){if(!t)return true;let o=e.allowedPlacements[`${t}:${n}`];return o?o.includes(r):t==="opencrater"?he[n].includes(r):true}var Tn=1440*60*1e3;function Rn(){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<Tn)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()));}ce(e);}catch{}}function rt(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 it(){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{}ce(e);}catch{}}function _n(){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 On=1440*60*1e3;function In(){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=se().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<On)return}catch{}d__namespace.mkdirSync(e,{recursive:!0});try{d__namespace.writeFileSync(t,String(Date.now()));}catch{return}let s=te();try{d__namespace.writeFileSync(n,JSON.stringify(r));}catch{}if(s.optOut)return;if(s.devToken)try{ae();}catch{}for(let l of s.integrations)try{ae(l.key,l.package);}catch{}}catch{}}async function An(){let e=fn(process.argv.slice(2));if(me=e.host,process.env.GROK_HOOK_EVENT&&me!=="grok_cli")return;_n(),Rn(),In();let t=await mn(pn),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=te();y(`state=${G()} devToken=${o.devToken?"present":"MISSING"}`,`host=${e.host} placement=${r}`);let i=et({env:process.env,state:o,now:Date.now()},{skipTTY:true});if(i!==null){if(i==="frequency"){let p=pe(n);p.length>0&&S({...o,sessionTopics:de(o.sessionTopics,p,Date.now())});}y("hook suppressed:",i);return}if(o={...o,sessionTopics:de(o.sessionTopics,pe(n),Date.now())},!En(o,e.package,e.host,r)){S(o),y("hook gated: placement",r,"not selected for",e.package);return}let s=Z(o.cachedConfig),l=Q(),a={origin:l,timeoutMs:Math.min(s.serveTimeoutMs,dn),installId:o.installId,topics:tt(o.sessionTopics,Date.now())};if(o.devToken){let p=await we(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()},rt(_,p.config.minSdkVersion)&&it(),ln);let R=e.host??"claude_code",ge=Ke(R,r),I=o.computeCards??{turns:0,lastLimitAt:0,lastDepletedAt:0,lastBackupAt:0};ge&&(I.turns+=1);let A=We({balanceMicroUsd:typeof p.computeBalanceMicroUsd=="number"?p.computeBalanceMicroUsd:null,weeklyGrantMicroUsd:typeof p.weeklyGrantMicroUsd=="number"?p.weeklyGrantMicroUsd:null,pendingMicroUsd:typeof p.pendingMicroUsd=="number"?p.pendingMicroUsd:null,onGateway:(process.env.ANTHROPIC_BASE_URL??"").includes("/gateway")||process.env.OPENCRATER_ON_GATEWAY==="1",turnEnd:ge,hostName:R,host:Je(R),cc:I,now:Date.now()}),st=(p.config.displayDurationSeconds??25)*1e3,v=p.fill&&p.blip&&!J(p.blip.campaignId)&&!Y(p.blip.campaignId)?p.blip:null;if((A||v)&&!nt(st)&&ot())if(A){let C=Date.now();A.kind==="limit"?I.lastLimitAt=C:A.kind==="depleted"?I.lastDepletedAt=C:A.kind==="backup"&&(I.lastBackupAt=C),o=await j({...A.card,label:"OpenCrater"},o);}else v&&(K(v.campaignId),o=await j(L(v),o,v.creative,v.impressionId,v.campaignId),o.devToken&&await Promise.race([ve(o.devToken,v.impressionId,a),new Promise(C=>setTimeout(C,fe).unref?.())]));o={...o,computeCards:I};}S(o);return}let{blip:c,pool:f}=oe(o,Date.now());for(;c&&(J(c.campaignId)||Y(c.campaignId));)y("hook: pooled blip skipped \u2014 campaign inside a local cooldown"),{blip:c,pool:f}=oe({pool:f},Date.now());if((c||e.key)&&nt((s.displayDurationSeconds??25)*1e3)){S(o),y("hook: a card is already on screen \u2014 not rendering another");return}if((c||e.key)&&!ot()){S(o),y("hook: render slot already claimed by a concurrent fire");return}if(c){K(c.campaignId),o=await j(L(c),{...o,pool:f},c.creative,c.impressionId,c.campaignId),S(o),await Promise.race([ee(c.impressionId,a),new Promise(p=>setTimeout(p,fe).unref?.())]);return}if(f.length!==o.pool.length&&(o={...o,pool:f}),!e.key||!e.package){S(o),y("hook: pool empty and no --key/--package; nothing to render");return}let u=await ke({publisherKey:e.key,packageName:e.package,placement:r,host:e.host},a);if(!u){S(o);return}if(o={...o,cachedConfig:u.config,configFetchedAt:Date.now()},rt(_,u.config.minSdkVersion)&&(y(`SDK ${_} below floor ${u.config.minSdkVersion} \u2014 forcing runtime update`),it()),e.package&&u.allowedPlacements&&(o={...o,allowedPlacements:{...o.allowedPlacements,[`${e.package}:${e.host}`]:u.allowedPlacements}}),u.fill&&u.blip){if(J(u.blip.campaignId)||Y(u.blip.campaignId)){y("hook: served blip suppressed \u2014 campaign inside a local cooldown"),S(o);return}K(u.blip.campaignId),o=await j(L(u.blip),o,u.blip.creative,u.blip.impressionId,u.blip.campaignId),S(o),await Promise.race([ee(u.blip.impressionId,a),new Promise(p=>setTimeout(p,fe).unref?.())]);return}u.fallback&&(o=await j(Ee(u.fallback),o)),S(o);}if(typeof x<"u"&&typeof module<"u"&&x.main===module){let e=setTimeout(()=>process.exit(0),un);An().catch(t=>y(`opencrater-hook v${_} error:`,t)).finally(()=>{clearTimeout(e),process.exit(0);});}
|
|
12
|
+
exports.decodeTtyNr=Sn;exports.painterSpawnOptions=vn;exports.parseArgs=fn;exports.parseProcStat=bn;exports.parsePsLine=yn;exports.resolveTtyPath=wn;exports.ttyNameToDevPath=hn;
|
package/dist/index.d.mts
CHANGED
|
@@ -62,6 +62,9 @@ interface ServeResponse {
|
|
|
62
62
|
computeBalanceMicroUsd?: number;
|
|
63
63
|
/** Dev-mode only: total compute granted this week (micro-USD) — HUD % denominator. */
|
|
64
64
|
weeklyGrantMicroUsd?: number;
|
|
65
|
+
/** Dev-mode only: compute earned since the last payout (micro-USD) — shown as
|
|
66
|
+
* "pending" (becomes spendable at the next weekly grant). */
|
|
67
|
+
pendingMicroUsd?: number;
|
|
65
68
|
}
|
|
66
69
|
/** Response of POST /v1/serve/batch. */
|
|
67
70
|
interface BatchResponse {
|
|
@@ -224,7 +227,7 @@ declare function renderBlip(blip: Blip, opts?: MediaRenderOptions): Promise<stri
|
|
|
224
227
|
|
|
225
228
|
/** Keep in sync with package.json (bundled, so we avoid a runtime fs read).
|
|
226
229
|
* AUTO-GENERATED by scripts/sync-version.mjs on `npm version`. */
|
|
227
|
-
declare const SDK_VERSION = "1.1.
|
|
230
|
+
declare const SDK_VERSION = "1.1.39";
|
|
228
231
|
|
|
229
232
|
/** Public API. Every method is fail-silent: it never throws. */
|
|
230
233
|
declare const sponsor: {
|
package/dist/index.d.ts
CHANGED
|
@@ -62,6 +62,9 @@ interface ServeResponse {
|
|
|
62
62
|
computeBalanceMicroUsd?: number;
|
|
63
63
|
/** Dev-mode only: total compute granted this week (micro-USD) — HUD % denominator. */
|
|
64
64
|
weeklyGrantMicroUsd?: number;
|
|
65
|
+
/** Dev-mode only: compute earned since the last payout (micro-USD) — shown as
|
|
66
|
+
* "pending" (becomes spendable at the next weekly grant). */
|
|
67
|
+
pendingMicroUsd?: number;
|
|
65
68
|
}
|
|
66
69
|
/** Response of POST /v1/serve/batch. */
|
|
67
70
|
interface BatchResponse {
|
|
@@ -224,7 +227,7 @@ declare function renderBlip(blip: Blip, opts?: MediaRenderOptions): Promise<stri
|
|
|
224
227
|
|
|
225
228
|
/** Keep in sync with package.json (bundled, so we avoid a runtime fs read).
|
|
226
229
|
* AUTO-GENERATED by scripts/sync-version.mjs on `npm version`. */
|
|
227
|
-
declare const SDK_VERSION = "1.1.
|
|
230
|
+
declare const SDK_VERSION = "1.1.39";
|
|
228
231
|
|
|
229
232
|
/** Public API. Every method is fail-silent: it never throws. */
|
|
230
233
|
declare const sponsor: {
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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.
|
|
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(`
|
|
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.39";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),typeof t.pendingMicroUsd=="number"&&(n.pendingMicroUsd=t.pendingMicroUsd),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))+`
|
|
5
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)+`
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
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.
|
|
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(`
|
|
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.39";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),typeof t.pendingMicroUsd=="number"&&(n.pendingMicroUsd=t.pendingMicroUsd),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))+`
|
|
5
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)+`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencrater",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.39",
|
|
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",
|