@ciandt-flow/cli 1.7.0-beta.214 → 1.7.0-beta.215
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 +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -96,7 +96,7 @@ ${qn}
|
|
|
96
96
|
`)[0]:"unknown error",s=`Failed to store secret in Windows Credential Manager [service="${t}", account="${r}"]: ${i}`;throw Te.error(s),new Error(s)}}async deleteSecret(t,r){try{let n=Wn(t,r);Te.debug(`Deleting secret: target=${n}`);let o=vc(n),{stdout:i}=await Lr($r(o)),s=i.trim()==="True";return Te.debug(`CredDelete result: ${s}`),s}catch(n){let o=n instanceof Error?n.message.split(`
|
|
97
97
|
`)[0]:"unknown error";return Te.debug(`Failed to delete secret from Windows Credential Manager [service="${t}", account="${r}"]: ${o}`),false}}getStoragePath(){return "Windows Credential Manager (PowerShell)"}};var Pc=32,Ec="flow-plugins-cli-fallback",Yn="flow-plugins-cli-fallback",Tc={linux:"install secret-tool (e.g. sudo apt install libsecret-tools)",darwin:"ensure the Keychain is accessible (security binary must be available)",win32:"ensure Credential Manager is available (cmdkey must be in PATH)"};function Cc(){let e=`${Re.hostname()}${Re.userInfo().username}`;return At.scryptSync(e,Ec,Pc)}function kc(){let e=Cc(),t=new Vt(e),r=Jn(t);return new Xn({projectName:Yn,serialize:r.serialize,deserialize:r.deserialize})}var Mr=null;function Rr(){return Mr||(Mr=kc()),Mr}var se=class{warned=false;async getSecret(t,r){return Rr().get(`${t}:${r}`)??null}async setSecret(t,r,n){if(!this.warned){let o=Tc[process.platform]??"ensure the OS keyring is available";process.stderr.write(`\u26A0 Secure keyring unavailable. Credentials are stored in an encrypted file
|
|
98
98
|
using a machine-derived key. For stronger security, ${o}.
|
|
99
|
-
`),this.warned=true;}Rr().set(`${t}:${r}`,n);}async deleteSecret(t,r){let n=Rr(),o=`${t}:${r}`;return n.has(o)?(n.delete(o),true):false}getStoragePath(){return Rr().path}static hasExistingData(){try{let t=new Xn({projectName:Yn});return re.existsSync(t.path)}catch{return false}}static clearFallbackFile(){try{let t=new Xn({projectName:Yn});re.rmSync(t.path,{force:!0});}catch{}Mr=null;}};async function Zn(){if(se.hasExistingData())return new se;switch(process.platform){case "darwin":return await Lt.isAvailable()?new Lt:new se;case "linux":return await qe.isAvailable()?new qe:await qe.ensureInstalled()?new qe:new se;case "win32":return await Rt.isAvailable()?new Rt:new se;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var Ac=h("config:credentials"),Fe="flow-plugins-cli",Qn="credentials",eo="token-cache",to="user-info",Dr=null;async function Xe(){return Dr||(Dr=Zn()),Dr}function Nr(){Dr=null;}async function J(){let t=await(await Xe()).getSecret(Fe,Qn);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Ue(e){let{clientId:t,clientSecret:r,tenant:n}=e,o=[!t?.trim()&&"clientId",!r?.trim()&&"clientSecret",!n?.trim()&&"tenant"].filter(Boolean);if(o.length>0)throw Ac.error(`missing or empty fields: ${o.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await Xe()).setSecret(Fe,Qn,JSON.stringify(e));}async function Ai(){let e=await Xe();await e.deleteSecret(Fe,Qn),await e.deleteSecret(Fe,eo),await e.deleteSecret(Fe,to);}async function $i(){return (await Xe()).getStoragePath()}async function Li(e){await(await Xe()).setSecret(Fe,eo,JSON.stringify(e));}async function Fr(){let t=await(await Xe()).getSecret(Fe,eo);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Ur(e){await(await Xe()).setSecret(Fe,to,JSON.stringify(e));}async function Ri(){let t=await(await Xe()).getSecret(Fe,to);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Ye(){let e=await Fr();return e?new Date(e.expiresAt)>new Date:false}function jr(e){let t=e.split(".");if(t.length!==3)throw new Error(`Invalid JWT: expected 3 segments, got ${t.length}`);let r=t[1].replace(/-/g,"+").replace(/_/g,"/"),n=Buffer.from(r,"base64").toString("utf8");try{return JSON.parse(n)}catch{throw new Error("Invalid JWT: payload segment is not valid JSON")}}var Mi=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^100\.(6[4-9]|[7-9]\d|1[0-2][0-7])\./,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^0\.0\.0\.0$/,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i];function $c(e){if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).match(/^::(?:ffff:)?([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);if(!r)return null;let n=parseInt(r[1],16),o=parseInt(r[2],16);return `${n>>8&255}.${n&255}.${o>>8&255}.${o&255}`}function Lc(e){if(Mi.some(r=>r.test(e)))return true;let t=$c(e);return !!(t&&Mi.some(r=>r.test(t)))}function Rc(e,t){let r=process.env[e]??t;if(!r)throw new Error(`Missing required environment variable: ${e}`);return r}function Mt(e,t){let r=Rc(e,t),n;try{n=new URL(r);}catch{throw new Error(`${e} must be a valid URL. Got: "${r}"`)}let o=process.env.NODE_ENV==="development";if(!o&&n.protocol!=="https:")throw new Error(`${e} must be an HTTPS URL. Got protocol: "${n.protocol}"`);if(n.username||n.password)throw new Error(`${e} must not contain embedded credentials (user:pass@host is not allowed)`);if(!o&&Lc(n.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${n.hostname}"`);return r}var ro=h("api:auth");function Oc(e){if(!lt.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var _i={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};async function Dc(e){if(e instanceof HTTPError){let t=e.response.status;ro.error(`HTTP error during authentication [status=${t}]`);let r="";try{let n=await e.response.text(),o=JSON.parse(n);typeof o.error=="string"&&(r=o.error);}catch{}return r&&_i[r]?new Error(_i[r]):t===StatusCodes.UNAUTHORIZED||t===StatusCodes.FORBIDDEN||t===StatusCodes.INTERNAL_SERVER_ERROR?new Error("Invalid credentials"):t>=StatusCodes.BAD_REQUEST&&t<StatusCodes.INTERNAL_SERVER_ERROR?new Error("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}return e instanceof Error?(ro.debug(`Non-HTTP error during authentication: ${e.message}`),e):(ro.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function pt(e){let t=Mt("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");Oc(e.tenant);let r;try{r=await Mc.post(t,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(i){throw await Dc(i)}let n=r.expires_at??new Date(Date.now()+(r.expires_in??3600)*1e3).toISOString();await Ue(e),await Li({accessToken:r.access_token,expiresAt:n});let o=jr(r.access_token);await Ur({sub:o.sub,name:o.name,email:o.email});}var Oi=h("lib:tokenProvider");async function Ze(){if(await Ye()){let n=await Fr();if(n)return n.accessToken}Oi.debug("Token expired or missing, re-authenticating...");let t=await J();if(!t)throw new Error("Not authenticated. Run: flow auth login");se.clearFallbackFile(),Nr(),await pt(t);let r=await Fr();if(!r)throw new Error("Authentication succeeded but token was not persisted");return Oi.debug("Token refreshed successfully"),r.accessToken}var Br=h("api:metrics");function Di(){return Mt("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function Ni(e,t,r){return Mc.post(e,{json:t,headers:r})}async function Fc(e){let t=await Ri();if(t)return t;let r=jr(e),n={sub:r.sub,name:r.name,email:r.email};return await Ur(n),n}async function I(e,t){let r=await Ze(),n=await Fc(r),o=await J();if(!lt.test(o.tenant))throw new Error(`Invalid tenant value: "${o.tenant}"`);let i={action:e,booster:_n,metadata:{...t},success:true,tenant:o.tenant,timestamp:new Date().toISOString(),user:{id:n.sub,name:n.name,email:n.email}};try{await Ni(Di(),i,{Authorization:`Bearer ${r}`,FlowTenant:o.tenant}),Br.debug(`Metrics event sent: ${e}`);}catch(s){throw Br.warn(`Failed to send metrics event "${e}": ${String(s)}`),s}}async function Fi(e,t,r){try{let n=r&<.test(r)?r:"unknown",o={action:e,booster:_n,metadata:t,success:!0,tenant:n,timestamp:new Date().toISOString(),user:{id:"anonymous",name:"unknown",email:"unknown"}};await Ni(Di(),o,{FlowTenant:n}),Br.debug(`Anonymous metrics event sent: ${e}`);}catch(n){Br.warn(`Failed to send anonymous metrics event "${e}": ${String(n)}`);}}var x={CLI_SESSION_STARTED:"CLI_SESSION_STARTED",CLI_AUTH_FAILED:"CLI_AUTH_FAILED",CLI_STEP_COMPLETED:"CLI_STEP_COMPLETED",CLI_KIT_DISPLAYED:"CLI_KIT_DISPLAYED",CLI_KIT_ACCEPTED:"CLI_KIT_ACCEPTED",CLI_KIT_REJECTED:"CLI_KIT_REJECTED",CLI_ONBOARDING_COMPLETED:"CLI_ONBOARDING_COMPLETED",CLI_ONBOARDING_ABANDONED:"CLI_ONBOARDING_ABANDONED",CLI_CLAUDE_MD_ACCEPTED:"CLI_CLAUDE_MD_ACCEPTED",CLI_CLAUDE_MD_SKIPPED:"CLI_CLAUDE_MD_SKIPPED",CLI_TOOL_INSTALLED:"CLI_TOOL_INSTALLED",CLI_TOOL_UNINSTALLED:"CLI_TOOL_UNINSTALLED",CLI_TOOL_UPDATED:"CLI_TOOL_UPDATED",CLI_TOOL_ENABLED:"CLI_TOOL_ENABLED",CLI_TOOL_INSTALL_FAILED:"CLI_TOOL_INSTALL_FAILED",CLI_TOOL_DISABLED:"CLI_TOOL_DISABLED",CLI_CATALOG_VIEWED:"CLI_CATALOG_VIEWED",CLI_TUI_SESSION_ENDED:"CLI_TUI_SESSION_ENDED"};var Uc={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},Ce={...Uc};function Ui(e){let t=Date.now();Ce={sessionStart:t,stepStart:t,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function dt(e){Ce.currentStep=e,Ce.stepStart=Date.now();}function M(){return {...Ce}}function je(){return Ce.sessionStart===0?0:Date.now()-Ce.sessionStart}function mt(){return Ce.stepStart===0?0:Date.now()-Ce.stepStart}function ji(){Ce.tuiSessionStart=Date.now();}function Bi(){return Ce.tuiSessionStart===0?0:Date.now()-Ce.tuiSessionStart}var jc=3e3,Bc=h("abandonment");async function Kr(e){let{currentStep:t,sessionStart:r}=M();if(r===0)return;let n={last_step:t,trigger:e,duration_ms:je()};try{await Promise.race([I(x.CLI_ONBOARDING_ABANDONED,n),new Promise((o,i)=>setTimeout(()=>i(new Error("abandonment timeout")),jc))]);}catch(o){Bc.warn(`Abandonment event failed: ${String(o)}`);}}function Ki(e,t){return Promise.race([e,new Promise(r=>setTimeout(r,t))])}var Kc=3e3,Jc=h("session-end");async function Yt(e){let{activeTab:t,screen:r}=y.getState(),n=Bi(),i=[I(x.CLI_TUI_SESSION_ENDED,{duration_ms:n,active_tab:t,interface:"tui"})];r!=="main"&&i.push(Kr(e));try{await Ki(Promise.all(i).then(()=>{}),Kc);}catch(s){Jc.warn(`Session end event failed: ${String(s)}`);}}var zc=2e3;function Hi(){let{exit:e}=useApp(),t=useRef(false),r=useRef(null),n=y(s=>s.pendingExit),o=y(s=>s.setPendingExit),i=useCallback(()=>{if(t.current){r.current&&clearTimeout(r.current),Yt("double-ctrl-c").finally(()=>e());return}t.current=true,o(true),r.current=setTimeout(()=>{t.current=false,o(false);},zc);},[e,o]);return useInput((s,l)=>{l.ctrl&&s==="c"&&i();}),{pendingExit:n}}var Yc=16;function Gi({label:e,value:t,onChange:r,masked:n=false,isActive:o,error:i}){let s=useRef(t);useEffect(()=>{s.current=t;},[t]),useInput((a,c)=>{if(c.backspace){let u=s.current.slice(0,-1);s.current=u,r(u);}else if(a&&!c.ctrl&&!c.meta&&!c.escape&&!c.return&&!c.tab&&!c.upArrow&&!c.downArrow&&!c.leftArrow&&!c.rightArrow){let u=s.current+a;s.current=u,r(u);}},{isActive:o});let l=n?"\u2022".repeat(t.length):t;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u25B8 ":" "}),jsx(Text,{color:o?"white":"gray",bold:o,children:e.padEnd(Yc)}),jsx(Text,{color:o?"cyan":"gray",children:l}),o&&jsx(Text,{color:"cyan",children:"\u2588"})]}),i&&jsx(Box,{paddingLeft:3,children:jsxs(Text,{color:"red",children:["\u26A0 ",i]})})]})}var Se=create(e=>({credentials:null,isAuthenticated:false,justAuthenticated:false,setCredentials:t=>e({credentials:t,isAuthenticated:true}),clearCredentials:()=>e({credentials:null,isAuthenticated:false,justAuthenticated:false}),setJustAuthenticated:t=>e({justAuthenticated:t})}));function ft(){return W__default.join(Re__default.homedir(),".claude","settings.json")}function io(){let e=ft();if(!re__default.existsSync(e))return {status:"missing"};let t=re__default.readFileSync(e,"utf-8");try{let r=JSON.parse(t);return r===null||typeof r!="object"||Array.isArray(r)?{status:"malformed",raw:t}:{status:"ok",settings:r}}catch{return {status:"malformed",raw:t}}}function zi(e){let t=ft();re__default.mkdirSync(W__default.dirname(t),{recursive:true});let r=`${t}.tmp`;re__default.writeFileSync(r,JSON.stringify(e,null,2),"utf-8"),re__default.renameSync(r,t);}function Wi(e,t){let r=e.env&&typeof e.env=="object"&&!Array.isArray(e.env)?e.env:{};return {...e,env:{...r,ANTHROPIC_AUTH_TOKEN:t}}}function so(e){let t=e.env;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.ANTHROPIC_AUTH_TOKEN;return typeof r=="string"&&r.length>0?r:null}var tu=3600,gt=class extends Error{constructor(){super("~/.claude/settings.json contains invalid JSON"),this.name="MalformedSettingsError";}};function ru(e){return eu.sign({sub:e.clientId,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:tu})}function Jr(e,t={}){let r=io();if(r.status==="malformed"&&!t.allowOverwriteMalformed)throw new gt;let n=r.status==="ok"?r.settings:{},o=r.status==="ok"?so(r.settings):null,i=ru(e),s=Wi(n,i);return {jwt:i,merged:s,previousToken:o,hadExistingFile:r.status!=="missing"}}function Hr(e){zi(e.merged);}function qi(){let e=io();return e.status!=="ok"?false:so(e.settings)!==null}var iu=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8")),Be=iu.version;function p(e){return e==null?"":e.replace(/\x1b\[[0-9;:<=>?]*[ -/]*[@-~]/g,"").replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,"").replace(/\x1b./g,"").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")}function X(e){process.stdout.write(E.green(` \u2713 ${p(e)}
|
|
99
|
+
`),this.warned=true;}Rr().set(`${t}:${r}`,n);}async deleteSecret(t,r){let n=Rr(),o=`${t}:${r}`;return n.has(o)?(n.delete(o),true):false}getStoragePath(){return Rr().path}static hasExistingData(){try{let t=new Xn({projectName:Yn});return re.existsSync(t.path)}catch{return false}}static clearFallbackFile(){try{let t=new Xn({projectName:Yn});re.rmSync(t.path,{force:!0});}catch{}Mr=null;}};async function Zn(){if(se.hasExistingData())return new se;switch(process.platform){case "darwin":return await Lt.isAvailable()?new Lt:new se;case "linux":return await qe.isAvailable()?new qe:await qe.ensureInstalled()?new qe:new se;case "win32":return await Rt.isAvailable()?new Rt:new se;default:throw new Error(`Unsupported platform: ${process.platform}`)}}var Ac=h("config:credentials"),Fe="flow-plugins-cli",Qn="credentials",eo="token-cache",to="user-info",Dr=null;async function Xe(){return Dr||(Dr=Zn()),Dr}function Nr(){Dr=null;}async function J(){let t=await(await Xe()).getSecret(Fe,Qn);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Ue(e){let{clientId:t,clientSecret:r,tenant:n}=e,o=[!t?.trim()&&"clientId",!r?.trim()&&"clientSecret",!n?.trim()&&"tenant"].filter(Boolean);if(o.length>0)throw Ac.error(`missing or empty fields: ${o.join(", ")}`),new Error("Cannot save credentials: clientId, clientSecret, and tenant are required");await(await Xe()).setSecret(Fe,Qn,JSON.stringify(e));}async function Ai(){let e=await Xe();await e.deleteSecret(Fe,Qn),await e.deleteSecret(Fe,eo),await e.deleteSecret(Fe,to);}async function $i(){return (await Xe()).getStoragePath()}async function Li(e){await(await Xe()).setSecret(Fe,eo,JSON.stringify(e));}async function Fr(){let t=await(await Xe()).getSecret(Fe,eo);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Ur(e){await(await Xe()).setSecret(Fe,to,JSON.stringify(e));}async function Ri(){let t=await(await Xe()).getSecret(Fe,to);if(!t)return null;try{return JSON.parse(t)}catch{return null}}async function Ye(){let e=await Fr();return e?new Date(e.expiresAt)>new Date:false}function jr(e){let t=e.split(".");if(t.length!==3)throw new Error(`Invalid JWT: expected 3 segments, got ${t.length}`);let r=t[1].replace(/-/g,"+").replace(/_/g,"/"),n=Buffer.from(r,"base64").toString("utf8");try{return JSON.parse(n)}catch{throw new Error("Invalid JWT: payload segment is not valid JSON")}}var Mi=[/^localhost\.?$/i,/^127\./,/^10\./,/^172\.(1[6-9]|2\d|3[01])\./,/^192\.168\./,/^169\.254\./,/^100\.(6[4-9]|[7-9]\d|1[0-2][0-7])\./,/^::1$/,/^\[::1\]$/,/^\[::ffff:/i,/^0\.0\.0\.0$/,/^\[f[cd]/i,/^\[fe80:/i,/^metadata\.google\.internal\.?$/i,/^metadata\.azure\.internal\.?$/i];function $c(e){if(!e.startsWith("[")||!e.endsWith("]"))return null;let r=e.slice(1,-1).match(/^::(?:ffff:)?([0-9a-f]{1,4}):([0-9a-f]{1,4})$/i);if(!r)return null;let n=parseInt(r[1],16),o=parseInt(r[2],16);return `${n>>8&255}.${n&255}.${o>>8&255}.${o&255}`}function Lc(e){if(Mi.some(r=>r.test(e)))return true;let t=$c(e);return !!(t&&Mi.some(r=>r.test(t)))}function Rc(e,t){let r=process.env[e]??t;if(!r)throw new Error(`Missing required environment variable: ${e}`);return r}function Mt(e,t){let r=Rc(e,t),n;try{n=new URL(r);}catch{throw new Error(`${e} must be a valid URL. Got: "${r}"`)}let o=process.env.NODE_ENV==="development";if(!o&&n.protocol!=="https:")throw new Error(`${e} must be an HTTPS URL. Got protocol: "${n.protocol}"`);if(n.username||n.password)throw new Error(`${e} must not contain embedded credentials (user:pass@host is not allowed)`);if(!o&&Lc(n.hostname))throw new Error(`${e} must not point to a private/loopback address. Got: "${n.hostname}"`);return r}var ro=h("api:auth");function Oc(e){if(!lt.test(e))throw new Error(`Invalid tenant value: "${e}". Tenant must be lowercase alphanumeric and hyphens (1-64 chars).`)}var _i={INVALID_CLIENT_SECRET:"Invalid Client Secret \u2014 check the value and try again",INVALID_CLIENT_ID:"Invalid Client ID \u2014 check the value and try again",INVALID_TENANT:"Invalid Tenant \u2014 check the value and try again",TENANT_NOT_FOUND:"Tenant not found \u2014 verify the tenant identifier"};async function Dc(e){if(e instanceof HTTPError){let t=e.response.status;ro.error(`HTTP error during authentication [status=${t}]`);let r="";try{let n=await e.response.text(),o=JSON.parse(n);typeof o.error=="string"&&(r=o.error);}catch{}return r&&_i[r]?new Error(_i[r]):t===StatusCodes.UNAUTHORIZED||t===StatusCodes.FORBIDDEN||t===StatusCodes.INTERNAL_SERVER_ERROR?new Error("Invalid credentials"):t>=StatusCodes.BAD_REQUEST&&t<StatusCodes.INTERNAL_SERVER_ERROR?new Error("Authentication request was rejected"):new Error("Authentication service unavailable, please try again later")}return e instanceof Error?(ro.debug(`Non-HTTP error during authentication: ${e.message}`),e):(ro.debug("Unknown error during authentication"),new Error("Authentication failed"))}async function pt(e){let t=Mt("AUTH_ENGINE_URL","https://flow.ciandt.com/auth-engine-api/v2/api-key/token");Oc(e.tenant);let r;try{r=await Mc.post(t,{headers:{FlowTenant:e.tenant},json:{clientSecret:e.clientSecret}}).json();}catch(i){throw await Dc(i)}let n=r.expires_at??new Date(Date.now()+(r.expires_in??3600)*1e3).toISOString();await Ue(e),await Li({accessToken:r.access_token,expiresAt:n});let o=jr(r.access_token);await Ur({sub:o.sub,name:o.name,email:o.email});}var Oi=h("lib:tokenProvider");async function Ze(){if(await Ye()){let n=await Fr();if(n)return n.accessToken}Oi.debug("Token expired or missing, re-authenticating...");let t=await J();if(!t)throw new Error("Not authenticated. Run: flow auth login");se.clearFallbackFile(),Nr(),await pt(t);let r=await Fr();if(!r)throw new Error("Authentication succeeded but token was not persisted");return Oi.debug("Token refreshed successfully"),r.accessToken}var Br=h("api:metrics");function Di(){return Mt("METRICS_COLLECTOR_URL","https://flow.ciandt.com/metrics-collector-api/")+"log-event"}function Ni(e,t,r){return Mc.post(e,{json:t,headers:r})}async function Fc(e){let t=await Ri();if(t)return t;let r=jr(e),n={sub:r.sub,name:r.name,email:r.email};return await Ur(n),n}async function I(e,t){let r=await Ze(),n=await Fc(r),o=await J();if(!lt.test(o.tenant))throw new Error(`Invalid tenant value: "${o.tenant}"`);let i={action:e,booster:_n,metadata:{...t},success:true,tenant:o.tenant,timestamp:new Date().toISOString(),user:{id:n.sub,name:n.name,email:n.email}};try{await Ni(Di(),i,{Authorization:`Bearer ${r}`,FlowTenant:o.tenant}),Br.debug(`Metrics event sent: ${e}`);}catch(s){throw Br.warn(`Failed to send metrics event "${e}": ${String(s)}`),s}}async function Fi(e,t,r){try{let n=r&<.test(r)?r:"unknown",o={action:e,booster:_n,metadata:t,success:!0,tenant:n,timestamp:new Date().toISOString(),user:{id:"anonymous",name:"unknown",email:"unknown"}};await Ni(Di(),o,{FlowTenant:n}),Br.debug(`Anonymous metrics event sent: ${e}`);}catch(n){Br.warn(`Failed to send anonymous metrics event "${e}": ${String(n)}`);}}var x={CLI_SESSION_STARTED:"CLI_SESSION_STARTED",CLI_AUTH_FAILED:"CLI_AUTH_FAILED",CLI_STEP_COMPLETED:"CLI_STEP_COMPLETED",CLI_KIT_DISPLAYED:"CLI_KIT_DISPLAYED",CLI_KIT_ACCEPTED:"CLI_KIT_ACCEPTED",CLI_KIT_REJECTED:"CLI_KIT_REJECTED",CLI_ONBOARDING_COMPLETED:"CLI_ONBOARDING_COMPLETED",CLI_ONBOARDING_ABANDONED:"CLI_ONBOARDING_ABANDONED",CLI_CLAUDE_MD_ACCEPTED:"CLI_CLAUDE_MD_ACCEPTED",CLI_CLAUDE_MD_SKIPPED:"CLI_CLAUDE_MD_SKIPPED",CLI_TOOL_INSTALLED:"CLI_TOOL_INSTALLED",CLI_TOOL_UNINSTALLED:"CLI_TOOL_UNINSTALLED",CLI_TOOL_UPDATED:"CLI_TOOL_UPDATED",CLI_TOOL_ENABLED:"CLI_TOOL_ENABLED",CLI_TOOL_INSTALL_FAILED:"CLI_TOOL_INSTALL_FAILED",CLI_TOOL_DISABLED:"CLI_TOOL_DISABLED",CLI_CATALOG_VIEWED:"CLI_CATALOG_VIEWED",CLI_TUI_SESSION_ENDED:"CLI_TUI_SESSION_ENDED"};var Uc={sessionStart:0,stepStart:0,currentStep:"auth",interfaceType:"cli",tuiSessionStart:0},Ce={...Uc};function Ui(e){let t=Date.now();Ce={sessionStart:t,stepStart:t,currentStep:"auth",interfaceType:e,tuiSessionStart:0};}function dt(e){Ce.currentStep=e,Ce.stepStart=Date.now();}function M(){return {...Ce}}function je(){return Ce.sessionStart===0?0:Date.now()-Ce.sessionStart}function mt(){return Ce.stepStart===0?0:Date.now()-Ce.stepStart}function ji(){Ce.tuiSessionStart=Date.now();}function Bi(){return Ce.tuiSessionStart===0?0:Date.now()-Ce.tuiSessionStart}var jc=3e3,Bc=h("abandonment");async function Kr(e){let{currentStep:t,sessionStart:r}=M();if(r===0)return;let n={last_step:t,trigger:e,duration_ms:je()};try{await Promise.race([I(x.CLI_ONBOARDING_ABANDONED,n),new Promise((o,i)=>setTimeout(()=>i(new Error("abandonment timeout")),jc))]);}catch(o){Bc.warn(`Abandonment event failed: ${String(o)}`);}}function Ki(e,t){return Promise.race([e,new Promise(r=>setTimeout(r,t))])}var Kc=3e3,Jc=h("session-end");async function Yt(e){let{activeTab:t,screen:r}=y.getState(),n=Bi(),i=[I(x.CLI_TUI_SESSION_ENDED,{duration_ms:n,active_tab:t,interface:"tui"})];r!=="main"&&i.push(Kr(e));try{await Ki(Promise.all(i).then(()=>{}),Kc);}catch(s){Jc.warn(`Session end event failed: ${String(s)}`);}}var zc=2e3;function Hi(){let{exit:e}=useApp(),t=useRef(false),r=useRef(null),n=y(s=>s.pendingExit),o=y(s=>s.setPendingExit),i=useCallback(()=>{if(t.current){r.current&&clearTimeout(r.current),Yt("double-ctrl-c").finally(()=>e());return}t.current=true,o(true),r.current=setTimeout(()=>{t.current=false,o(false);},zc);},[e,o]);return useInput((s,l)=>{l.ctrl&&s==="c"&&i();}),{pendingExit:n}}var Yc=16;function Gi({label:e,value:t,onChange:r,masked:n=false,isActive:o,error:i}){let s=useRef(t);useEffect(()=>{s.current=t;},[t]),useInput((a,c)=>{if(c.backspace){let u=s.current.slice(0,-1);s.current=u,r(u);}else if(a&&!c.ctrl&&!c.meta&&!c.escape&&!c.return&&!c.tab&&!c.upArrow&&!c.downArrow&&!c.leftArrow&&!c.rightArrow){let u=s.current+a;s.current=u,r(u);}},{isActive:o});let l=n?"\u2022".repeat(t.length):t;return jsxs(Box,{flexDirection:"column",children:[jsxs(Box,{children:[jsx(Text,{color:o?"cyan":"gray",children:o?"\u25B8 ":" "}),jsx(Text,{color:o?"white":"gray",bold:o,children:e.padEnd(Yc)}),jsx(Text,{color:o?"cyan":"gray",children:l}),o&&jsx(Text,{color:"cyan",children:"\u2588"})]}),i&&jsx(Box,{paddingLeft:3,children:jsxs(Text,{color:"red",children:["\u26A0 ",i]})})]})}var Se=create(e=>({credentials:null,isAuthenticated:false,justAuthenticated:false,setCredentials:t=>e({credentials:t,isAuthenticated:true}),clearCredentials:()=>e({credentials:null,isAuthenticated:false,justAuthenticated:false}),setJustAuthenticated:t=>e({justAuthenticated:t})}));function ft(){return W__default.join(Re__default.homedir(),".claude","settings.json")}function io(){let e=ft();if(!re__default.existsSync(e))return {status:"missing"};let t=re__default.readFileSync(e,"utf-8");try{let r=JSON.parse(t);return r===null||typeof r!="object"||Array.isArray(r)?{status:"malformed",raw:t}:{status:"ok",settings:r}}catch{return {status:"malformed",raw:t}}}function zi(e){let t=ft();re__default.mkdirSync(W__default.dirname(t),{recursive:true});let r=`${t}.tmp`;re__default.writeFileSync(r,JSON.stringify(e,null,2),"utf-8"),re__default.renameSync(r,t);}function Wi(e,t){let r=e.env&&typeof e.env=="object"&&!Array.isArray(e.env)?e.env:{};return {...e,env:{...r,ANTHROPIC_AUTH_TOKEN:t}}}function so(e){let t=e.env;if(!t||typeof t!="object"||Array.isArray(t))return null;let r=t.ANTHROPIC_AUTH_TOKEN;return typeof r=="string"&&r.length>0?r:null}var tu=3600,gt=class extends Error{constructor(){super("~/.claude/settings.json contains invalid JSON"),this.name="MalformedSettingsError";}};function ru(e){return eu.sign({clientId:e.clientId,clientSecret:e.clientSecret,tenant:e.tenant},e.clientSecret,{algorithm:"HS256",expiresIn:tu})}function Jr(e,t={}){let r=io();if(r.status==="malformed"&&!t.allowOverwriteMalformed)throw new gt;let n=r.status==="ok"?r.settings:{},o=r.status==="ok"?so(r.settings):null,i=ru(e),s=Wi(n,i);return {jwt:i,merged:s,previousToken:o,hadExistingFile:r.status!=="missing"}}function Hr(e){zi(e.merged);}function qi(){let e=io();return e.status!=="ok"?false:so(e.settings)!==null}var iu=JSON.parse(readFileSync(join(import.meta.dirname,"..","package.json"),"utf8")),Be=iu.version;function p(e){return e==null?"":e.replace(/\x1b\[[0-9;:<=>?]*[ -/]*[@-~]/g,"").replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g,"").replace(/\x1b./g,"").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")}function X(e){process.stdout.write(E.green(` \u2713 ${p(e)}
|
|
100
100
|
`));}function P(e){process.stderr.write(E.red(` \u2717 ${p(e)}
|
|
101
101
|
`));}function w(e){process.stdout.write(E.cyan(` \u2139 ${p(e)}
|
|
102
102
|
`));}function Gr(e,t){let r=t.map(l=>l.map(p)),n=[e,...r],o=e.map((l,a)=>Math.max(...n.map(c=>(c[a]??"").length))),i=o.map(l=>"\u2500".repeat(l)).join(" "),s=l=>l.map((a,c)=>a.padEnd(o[c])).join(" ");process.stdout.write(`
|