@coinbase/cdp-cli 2.0.26 → 2.0.28

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/index.js CHANGED
@@ -42,7 +42,7 @@ if (-not [Win32.Cred]::CredWrite([ref]$cred, 0)) {
42
42
  [Runtime.InteropServices.Marshal]::FreeHGlobal($blob)`)}delete(t,r){try{bt(`[void][Win32.Cred]::CredDelete('${pe(xt(t,r))}', 1, 0)`)}catch{}}};var vt="cdp-cli",K,lr=!1;function Ue(){if(K!==void 0)return K;try{process.platform==="darwin"?K=new qe:process.platform==="linux"?K=new je:process.platform==="win32"?K=new Me:K=null}catch{lr||(process.stderr.write(`warning: OS keychain not accessible \u2014 secrets stored in keychain will not be available
43
43
  `),lr=!0),K=null}return K}function Q(e){let t=Ue();if(!t)return null;try{return t.get(vt,e)}catch{return null}}function fe(e,t){let r=Ue();if(!r)return!1;try{return r.set(vt,e,t),!0}catch{return!1}}function me(e){let t=Ue();if(t)try{t.delete(vt,e)}catch{}}function ur(){return Ue()!==null}var F=ir,pr=ar;function te(){if(process.env.CDP_CONFIG_DIR)return process.env.CDP_CONFIG_DIR;if(process.platform==="win32"){let e=process.env.APPDATA??Fe(dr(),"AppData","Roaming");return Fe(e,"cdp")}return Fe(dr(),".config","cdp")}function ge(){return Fe(te(),"config.json")}function W(e,t){if(e.url)return e.url;if(F[t])return F[t];let r=pr[t];if(r&&F[r])return F[r];let n={...F};for(let[s,a]of Object.entries(pr))F[a]&&(n[s]=F[a]);let o=Object.keys(n).find(s=>t.startsWith(s+"-"));return o?n[o]:""}function he(e){return Object.values(F).some(t=>e.startsWith(t.replace(/\/platform\/v2$/,"")))}function D(){let e={env:"",environments:{},history:{}},t=ge();try{let r=vo(t,"utf8"),n=JSON.parse(r);return e.env=n.env??"",e.environments=n.environments??{},e.history=n.history??{},n.settings&&(e.settings=n.settings),e}catch(r){if(r.code!=="ENOENT")throw r instanceof SyntaxError?new Error(`invalid config JSON: ${r.message}`):new Error(`reading config: ${r.message}`)}return e}function q(e){let t=te();So(t,{recursive:!0,mode:448});let r={env:e.env,environments:e.environments};Object.keys(e.history).length>0&&(r.history=e.history),e.settings&&(r.settings=e.settings),Eo(ge(),JSON.stringify(r,null,2)+`
44
44
  `,{mode:384})}function ye(e){return Q(`${e}:wallet`)}function Et(e,t){return fe(`${e}:wallet`,t)}function St(e){me(`${e}:wallet`)}function we(e,t){return t||process.env.CDP_ENV||e.env}function re(e,t){let r=we(e,t);if(!r)throw new Error("no environment configured. Run: cdp env <name>");let n={...e.environments[r]};if(!n.key_secret){let s=Q(r);s&&(n.key_secret=s)}if(!n.wallet_secret){let s=ye(r);s&&(n.wallet_secret=s)}if(process.env.CDP_KEY_ID&&(n.key_id=process.env.CDP_KEY_ID),process.env.CDP_KEY_SECRET&&(n.key_secret=process.env.CDP_KEY_SECRET,delete process.env.CDP_KEY_SECRET),process.env.CDP_WALLET_SECRET&&(n.wallet_secret=process.env.CDP_WALLET_SECRET,delete process.env.CDP_WALLET_SECRET),process.env.CDP_URL&&(n.url=process.env.CDP_URL,he(n.url)||process.stderr.write(`warning: CDP_URL overrides to non-standard endpoint: ${n.url}
45
- `)),!W(n,r))throw new Error(`no URL for environment "${r}". Set url in config or use a built-in env name`);if(n.key_id&&!n.key_secret)throw new Error(`API key secret for "${r}" is stored in the OS keychain but could not be retrieved. This typically occurs in sandboxed environments (e.g. Codex) \u2014 grant the environment access to the OS keychain.`);if(!n.key_id||!n.key_secret)throw new Error(`no API key for "${r}". Run: cdp env ${r} --key-id=...`);return{name:r,env:n}}var ko=["CDP_KEY_SECRET","CDP_KEY_ID","CDP_WALLET_SECRET"];function We(){let e={...process.env};for(let t of ko)delete e[t];return e}function fr(e){return process.env.CDP_NO_HISTORY?!1:e.settings?.history?.enabled!==!1}function kt(e,t,r){return e.history[t]?.[r]}function Pt(e){try{return JSON.parse(e)}catch{return e}}function mr(e,t,r,n){e.history[t]||(e.history[t]={}),e.history[t][r]={last_used:new Date().toISOString(),values:n}}function Je(e,t,r){if(t&&r)return e.history[t]?.[r]?(delete e.history[t][r],Object.keys(e.history[t]).length===0&&delete e.history[t],1):0;if(t){let o=Object.keys(e.history[t]??{}).length;return delete e.history[t],o}let n=Object.values(e.history).reduce((o,s)=>o+Object.keys(s).length,0);return e.history={},n}import{createSign as Er,createPrivateKey as Do,createHash as qo,sign as Lo,randomBytes as jo}from"node:crypto";import{readFileSync as Po,writeFileSync as Ro,mkdirSync as $o}from"node:fs";import{join as hr}from"node:path";var yr;yr="2.0.26";var H=yr,He=sr,Ao=`${Be}/${encodeURIComponent(He)}`,wr="version-check.json";function gr(e){let t=e.replace(/^v/,"").split("-")[0],[r,n,o]=t.split(".").map(Number);return{major:r??0,minor:n??0,patch:o??0}}function To(e,t){let r=gr(e),n=gr(t);return n.major!==r.major?n.major>r.major:n.minor!==r.minor?n.minor>r.minor:n.patch>r.patch}var Oo="https://registry.npmjs.org";function Io(e,t){let r=Be===Oo?"":` --registry ${Be}`;return`
45
+ `)),!W(n,r))throw new Error(`no URL for environment "${r}". Set url in config or use a built-in env name`);if(n.key_id&&!n.key_secret)throw new Error(`API key secret for "${r}" is stored in the OS keychain but could not be retrieved. This typically occurs in sandboxed environments (e.g. Codex) \u2014 grant the environment access to the OS keychain.`);if(!n.key_id||!n.key_secret)throw new Error(`no API key for "${r}". Run: cdp env ${r} --key-id=...`);return{name:r,env:n}}var ko=["CDP_KEY_SECRET","CDP_KEY_ID","CDP_WALLET_SECRET"];function We(){let e={...process.env};for(let t of ko)delete e[t];return e}function fr(e){return process.env.CDP_NO_HISTORY?!1:e.settings?.history?.enabled!==!1}function kt(e,t,r){return e.history[t]?.[r]}function Pt(e){try{return JSON.parse(e)}catch{return e}}function mr(e,t,r,n){e.history[t]||(e.history[t]={}),e.history[t][r]={last_used:new Date().toISOString(),values:n}}function Je(e,t,r){if(t&&r)return e.history[t]?.[r]?(delete e.history[t][r],Object.keys(e.history[t]).length===0&&delete e.history[t],1):0;if(t){let o=Object.keys(e.history[t]??{}).length;return delete e.history[t],o}let n=Object.values(e.history).reduce((o,s)=>o+Object.keys(s).length,0);return e.history={},n}import{createSign as Er,createPrivateKey as Do,createHash as qo,sign as Lo,randomBytes as jo}from"node:crypto";import{readFileSync as Po,writeFileSync as Ro,mkdirSync as $o}from"node:fs";import{join as hr}from"node:path";var yr;yr="2.0.28";var H=yr,He=sr,Ao=`${Be}/${encodeURIComponent(He)}`,wr="version-check.json";function gr(e){let t=e.replace(/^v/,"").split("-")[0],[r,n,o]=t.split(".").map(Number);return{major:r??0,minor:n??0,patch:o??0}}function To(e,t){let r=gr(e),n=gr(t);return n.major!==r.major?n.major>r.major:n.minor!==r.minor?n.minor>r.minor:n.patch>r.patch}var Oo="https://registry.npmjs.org";function Io(e,t){let r=Be===Oo?"":` --registry ${Be}`;return`
46
46
  Update available: ${e} \u2192 ${t}
47
47
  Run: npm i -g ${He}${r}
48
48
  `}var _o=1440*60*1e3;function xr(){return te()}function Co(){try{return JSON.parse(Po(hr(xr(),wr),"utf8"))}catch{return null}}function Bo(e){try{let t=xr();$o(t,{recursive:!0}),Ro(hr(t,wr),JSON.stringify(e))}catch{}}async function No(){try{let e=new AbortController,t=setTimeout(()=>e.abort(),3e3),r=await fetch(Ao,{signal:e.signal,headers:{Accept:"application/json"}});return clearTimeout(t),r.ok?(await r.json())?.["dist-tags"]?.latest??null:null}catch{return null}}async function br(){if(process.env.CI||process.env.CDP_NO_UPDATE_CHECK)return"";let e=Co();if(e&&Date.now()-e.checkedAt<_o)return"";let t=await No();return t?(Bo({checkedAt:Date.now(),latestVersion:t}),To(H,t)?Io(H,t):""):""}function $t(e){return Buffer.from(e).toString("base64url")}function Ve(e){return $t(Buffer.from(JSON.stringify(e)))}function Sr(){return jo(16).toString("hex")}function Mo(e){return e.includes("-----BEGIN EC PRIVATE KEY-----")}function Uo(e){try{return Buffer.from(e,"base64").length===64}catch{return!1}}function Fo(e,t,r,n,o){let s=Math.floor(Date.now()/1e3),a=Sr(),i={sub:e,iss:"cdp",nbf:s,iat:s,exp:s+120},l=`${r} ${n}${o}`;if(r&&n&&o&&(i.uris=[l]),Mo(t))return Wo(e,t,i,a);if(Uo(t))return Jo(e,t,i,a);throw new Error("invalid key format - must be either PEM EC key or base64 Ed25519 key")}function kr(e,t,r){let n=`${Ve(e)}.${Ve(t)}`,o=Er("SHA256");o.update(n);let s=o.sign(r);return`${n}.${$t(Ho(s))}`}function Wo(e,t,r,n){return kr({alg:"ES256",typ:"JWT",kid:e,nonce:n},r,t)}function Jo(e,t,r,n){let s=`${Ve({alg:"EdDSA",typ:"JWT",kid:e,nonce:n})}.${Ve(r)}`,a=Buffer.from(t,"base64"),i=Do({key:Buffer.concat([Buffer.from("302e020100300506032b657004220420","hex"),a.subarray(0,32)]),format:"der",type:"pkcs8"}),l=Lo(null,Buffer.from(s),i);return`${s}.${$t(l)}`}function Ho(e){let t=2;if(e[t]!==2)throw new Error("invalid DER signature");t++;let r=e[t];t++;let n=e.subarray(t,t+r);if(t+=r,e[t]!==2)throw new Error("invalid DER signature");t++;let o=e[t];t++;let s=e.subarray(t,t+o);return n=vr(n,32),s=vr(s,32),Buffer.concat([n,s])}function vr(e,t){if(e.length===t)return Buffer.from(e);if(e.length>t)return Buffer.from(e.subarray(e.length-t));let r=Buffer.alloc(t);return r.set(e,t-e.length),r}function Vo(e,t,r,n,o){let s=Math.floor(Date.now()/1e3),a=Sr(),l={uris:[`${t} ${r}${n}`],iat:s,nbf:s,jti:a};if(o&&o.length>0)try{let u=JSON.parse(new TextDecoder().decode(o));if(typeof u=="object"&&Object.keys(u).length>0){let d=Rt(u);l.reqHash=qo("sha256").update(JSON.stringify(d)).digest("hex")}}catch{}let c=Pr(e);return kr({alg:"ES256",typ:"JWT"},l,c)}function Pr(e){return`-----BEGIN PRIVATE KEY-----
package/dist/version.txt CHANGED
@@ -1 +1 @@
1
- 2.0.26
1
+ 2.0.28
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/cdp-cli",
3
- "version": "2.0.26",
3
+ "version": "2.0.28",
4
4
  "description": "CLI for the Coinbase Developer Platform API",
5
5
  "type": "module",
6
6
  "bin": {