domani-cli 0.4.85 → 0.4.86
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/domani.cjs +2 -2
- package/package.json +1 -1
package/dist/domani.cjs
CHANGED
|
@@ -25,7 +25,7 @@ Expecting one of '${i.join("', '")}'`);return this._lifeCycleHooks[t]?this._life
|
|
|
25
25
|
`),this._exit(0,"commander.version",t)}),this}description(t,n){return t===void 0&&n===void 0?this._description:(this._description=t,n&&(this._argsDescription=n),this)}summary(t){return t===void 0?this._summary:(this._summary=t,this)}alias(t){if(t===void 0)return this._aliases[0];let n=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(n=this.commands[this.commands.length-1]),t===n._name)throw new Error("Command alias can't be the same as its name");let i=this.parent?._findCommand(t);if(i){let s=[i.name()].concat(i.aliases()).join("|");throw new Error(`cannot add alias '${t}' to command '${this.name()}' as already have command '${s}'`)}return n._aliases.push(t),this}aliases(t){return t===void 0?this._aliases:(t.forEach(n=>this.alias(n)),this)}usage(t){if(t===void 0){if(this._usage)return this._usage;let n=this.registeredArguments.map(i=>el(i));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?n:[]).join(" ")}return this._usage=t,this}name(t){return t===void 0?this._name:(this._name=t,this)}nameFromFilename(t){return this._name=kt.basename(t,kt.extname(t)),this}executableDir(t){return t===void 0?this._executableDir:(this._executableDir=t,this)}helpInformation(t){let n=this.createHelp(),i=this._getOutputContext(t);n.prepareContext({error:i.error,helpWidth:i.helpWidth,outputHasColors:i.hasColors});let s=n.formatHelp(this,n);return i.hasColors?s:this._outputConfiguration.stripColor(s)}_getOutputContext(t){t=t||{};let n=!!t.error,i,s,r;return n?(i=a=>this._outputConfiguration.writeErr(a),s=this._outputConfiguration.getErrHasColors(),r=this._outputConfiguration.getErrHelpWidth()):(i=a=>this._outputConfiguration.writeOut(a),s=this._outputConfiguration.getOutHasColors(),r=this._outputConfiguration.getOutHelpWidth()),{error:n,write:a=>(s||(a=this._outputConfiguration.stripColor(a)),i(a)),hasColors:s,helpWidth:r}}outputHelp(t){let n;typeof t=="function"&&(n=t,t=void 0);let i=this._getOutputContext(t),s={error:i.error,write:i.write,command:this};this._getCommandAndAncestors().reverse().forEach(o=>o.emit("beforeAllHelp",s)),this.emit("beforeHelp",s);let r=this.helpInformation({error:i.error});if(n&&(r=n(r),typeof r!="string"&&!Buffer.isBuffer(r)))throw new Error("outputHelp callback must return a string or a Buffer");i.write(r),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",s),this._getCommandAndAncestors().forEach(o=>o.emit("afterAllHelp",s))}helpOption(t,n){return typeof t=="boolean"?(t?this._helpOption=this._helpOption??void 0:this._helpOption=null,this):(t=t??"-h, --help",n=n??"display help for command",this._helpOption=this.createOption(t,n),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(t){return this._helpOption=t,this}help(t){this.outputHelp(t);let n=Number(se.exitCode??0);n===0&&t&&typeof t!="function"&&t.error&&(n=1),this._exit(n,"commander.help","(outputHelp)")}addHelpText(t,n){let i=["beforeAll","before","after","afterAll"];if(!i.includes(t))throw new Error(`Unexpected value for position to addHelpText.
|
|
26
26
|
Expecting one of '${i.join("', '")}'`);let s=`${t}Help`;return this.on(s,r=>{let o;typeof n=="function"?o=n({error:r.error,command:r.command}):o=n,o&&r.write(`${o}
|
|
27
27
|
`)}),this}_outputHelpIfRequested(t){let n=this._getHelpOption();n&&t.find(s=>n.is(s))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function qr(e){return e.map(t=>{if(!t.startsWith("--inspect"))return t;let n,i="127.0.0.1",s="9229",r;return(r=t.match(/^(--inspect(-brk)?)$/))!==null?n=r[1]:(r=t.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(n=r[1],/^\d+$/.test(r[3])?s=r[3]:i=r[3]):(r=t.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(n=r[1],i=r[3],s=r[4]),n&&s!=="0"?`${n}=${i}:${parseInt(s)+1}`:t})}function cs(){if(se.env.NO_COLOR||se.env.FORCE_COLOR==="0"||se.env.FORCE_COLOR==="false")return!1;if(se.env.FORCE_COLOR||se.env.CLICOLOR_FORCE!==void 0)return!0}us.Command=ls;us.useColor=cs});var Wr=_t(Qe=>{var{Argument:Fr}=ti(),{Command:ms}=Mr(),{CommanderError:sl,InvalidArgumentError:Lr}=jn(),{Help:rl}=ns(),{Option:Vr}=os();Qe.program=new ms;Qe.createCommand=e=>new ms(e);Qe.createOption=(e,t)=>new Vr(e,t);Qe.createArgument=(e,t)=>new Fr(e,t);Qe.Command=ms;Qe.Option=Vr;Qe.Argument=Fr;Qe.Help=rl;Qe.CommanderError=sl;Qe.InvalidArgumentError=Lr;Qe.InvalidOptionArgumentError=Lr});var Et,ii=je(()=>{Et={mailProductName:"Mailzero",domaniProductName:"Domani",mailProductHost:"mailzero.run"}});var F=_t((df,fs)=>{var ri=process||{},Br=ri.argv||[],si=ri.env||{},al=!(si.NO_COLOR||Br.includes("--no-color"))&&(!!si.FORCE_COLOR||Br.includes("--color")||ri.platform==="win32"||(ri.stdout||{}).isTTY&&si.TERM!=="dumb"||!!si.CI),dl=(e,t,n=e)=>i=>{let s=""+i,r=s.indexOf(t,e.length);return~r?e+ll(s,t,n,r)+t:e+s+t},ll=(e,t,n,i)=>{let s="",r=0;do s+=e.substring(r,i)+n,r=i+t.length,i=e.indexOf(t,r);while(~i);return s+e.substring(r)},Gr=(e=al)=>{let t=e?dl:()=>String;return{isColorSupported:e,reset:t("\x1B[0m","\x1B[0m"),bold:t("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:t("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:t("\x1B[3m","\x1B[23m"),underline:t("\x1B[4m","\x1B[24m"),inverse:t("\x1B[7m","\x1B[27m"),hidden:t("\x1B[8m","\x1B[28m"),strikethrough:t("\x1B[9m","\x1B[29m"),black:t("\x1B[30m","\x1B[39m"),red:t("\x1B[31m","\x1B[39m"),green:t("\x1B[32m","\x1B[39m"),yellow:t("\x1B[33m","\x1B[39m"),blue:t("\x1B[34m","\x1B[39m"),magenta:t("\x1B[35m","\x1B[39m"),cyan:t("\x1B[36m","\x1B[39m"),white:t("\x1B[37m","\x1B[39m"),gray:t("\x1B[90m","\x1B[39m"),bgBlack:t("\x1B[40m","\x1B[49m"),bgRed:t("\x1B[41m","\x1B[49m"),bgGreen:t("\x1B[42m","\x1B[49m"),bgYellow:t("\x1B[43m","\x1B[49m"),bgBlue:t("\x1B[44m","\x1B[49m"),bgMagenta:t("\x1B[45m","\x1B[49m"),bgCyan:t("\x1B[46m","\x1B[49m"),bgWhite:t("\x1B[47m","\x1B[49m"),blackBright:t("\x1B[90m","\x1B[39m"),redBright:t("\x1B[91m","\x1B[39m"),greenBright:t("\x1B[92m","\x1B[39m"),yellowBright:t("\x1B[93m","\x1B[39m"),blueBright:t("\x1B[94m","\x1B[39m"),magentaBright:t("\x1B[95m","\x1B[39m"),cyanBright:t("\x1B[96m","\x1B[39m"),whiteBright:t("\x1B[97m","\x1B[39m"),bgBlackBright:t("\x1B[100m","\x1B[49m"),bgRedBright:t("\x1B[101m","\x1B[49m"),bgGreenBright:t("\x1B[102m","\x1B[49m"),bgYellowBright:t("\x1B[103m","\x1B[49m"),bgBlueBright:t("\x1B[104m","\x1B[49m"),bgMagentaBright:t("\x1B[105m","\x1B[49m"),bgCyanBright:t("\x1B[106m","\x1B[49m"),bgWhiteBright:t("\x1B[107m","\x1B[49m")}};fs.exports=Gr();fs.exports.createColors=Gr});var cn,Sn,On=je(()=>{"use strict";cn="domani.run",Sn=`https://${cn}`});function Ht(e,t,n){try{let i=(0,Kr.spawnSync)(e,t,{encoding:"utf-8",input:n,timeout:3e3,stdio:["pipe","pipe","ignore"]});return{ok:i.status===0,stdout:(i.stdout||"").trim()}}catch{return{ok:!1,stdout:""}}}function zr(){return oi.available()}function Yr(e,t={}){if(!t.refresh&&Cn.has(e))return Cn.get(e)??void 0;let n=oi.get(e);return Cn.set(e,n??null),n}function Xr(e,t){let n=oi.set(e,t);return n&&Cn.set(e,t),n}function ai(e){oi.delete(e),Cn.set(e,null)}var Kr,un,cl,oi,Cn,ps=je(()=>{"use strict";Kr=require("child_process"),un="domani-cli";cl={available(){return process.platform==="darwin"?!0:process.platform==="linux"?Ht("secret-tool",["--help"]).ok:!1},get(e){if(process.platform==="darwin"){let t=Ht("security",["find-generic-password","-s",un,"-a",e,"-w"]);return t.ok&&t.stdout?t.stdout:void 0}if(process.platform==="linux"){let t=Ht("secret-tool",["lookup","service",un,"account",e]);return t.ok&&t.stdout?t.stdout:void 0}},set(e,t){return process.platform==="darwin"?Ht("security",["add-generic-password","-U","-s",un,"-a",e,"-w",t]).ok:process.platform==="linux"?Ht("secret-tool",["store",`--label=domani CLI token (${e})`,"service",un,"account",e],t+`
|
|
28
|
-
`).ok:!1},delete(e){process.platform==="darwin"?Ht("security",["delete-generic-password","-s",un,"-a",e]):process.platform==="linux"&&Ht("secret-tool",["clear","service",un,"account",e])}},oi=cl,Cn=new Map});function An(){return process.env.DOMANI_CONFIG_DIR||In.default.join(Zr.default.homedir(),".domani")}function Qr(){return In.default.join(An(),"config.json")}function eo(e){hs=e}function li(e){return ml.test(e)}function Be(){let e;try{e=JSON.parse(Jt.default.readFileSync(Qr(),"utf-8"))}catch{return{}}if(!e||typeof e!="object")return{};let{token:t,email:n,token_in_keychain:i,...s}=e,r={...s,accounts:{...e.accounts??{}}};return!e.accounts&&(t||n||i)&&(r.accounts={[gs]:{email:n,api_url:e.api_url,...t?{token:t}:{},...i?{token_in_keychain:i}:{}}},r.active_account=gs),r}function bs(e){Jt.default.mkdirSync(An(),{recursive:!0,mode:448}),Jt.default.writeFileSync(Qr(),JSON.stringify(e,null,2),{mode:384})}function to(e){ys=e}function Rn(){return process.env.DOMANI_API_KEY?{source:"api_key_env"}:Pt()}function Pt(){if(ys)return{name:ys,source:"flag"};if(process.env.DOMANI_ACCOUNT)return{name:process.env.DOMANI_ACCOUNT,source:"env"};let e=Be().active_account;return e?{name:e,source:"active"}:{source:"none"}}function mn(){return Pt().name??gs}function no(e){return Be().accounts?.[e]}function rt(){let e=Be().accounts??{};return Object.keys(e).sort().map(t=>({name:t,...e[t]}))}function ws(e,t={}){let n=no(e);if(n){if(n.token)return n.token;if(n.token_in_keychain)return Yr(e,{refresh:t.refreshKeychain})}}function ci(e,t){let n=Be(),i=zr()&&Xr(e,t.token)?{email:t.email,api_url:t.api_url,token_in_keychain:!0}:{email:t.email,api_url:t.api_url,token:t.token};n.accounts={...n.accounts??{},[e]:i},(!n.active_account||!n.accounts[n.active_account])&&(n.active_account=e),bs(n)}function io(e){let t=Be(),n=t.accounts?.[e];if(n)return n.token_in_keychain&&ai(e),delete t.accounts[e],t.active_account===e&&delete t.active_account,bs(t),n}function so(e){let t=Be();return t.accounts?.[e]?(t.active_account=e,bs(t),!0):!1}function xt(){let e=Rn();if(e.source==="api_key_env")return"DOMANI_API_KEY";if(!e.name)return;let t=no(e.name)?.email;return rt().length<=1&&e.source==="active"?t:t?`${e.name} (${t})`:e.name}function Ge(){if(hs)return hs;let e=Be(),{name:t}=Pt();return t&&e.accounts?.[t]?.api_url||e.api_url||Sn}function ot(e={}){if(process.env.DOMANI_API_KEY)return process.env.DOMANI_API_KEY;let{name:t}=Pt();return t?ws(t,e):void 0}function fl(){try{let e=Jt.default.readFileSync(In.default.join(An(),"version-check.json"),"utf-8");return JSON.parse(e)}catch{return null}}function pl(e){try{Jt.default.mkdirSync(An(),{recursive:!0,mode:448}),Jt.default.writeFileSync(In.default.join(An(),"version-check.json"),JSON.stringify(e),{mode:384})}catch{}}function di(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]||0)>(i[s]||0))return 1;if((n[s]||0)<(i[s]||0))return-1}return 0}async function ro(){let e=fl();if(e&&Date.now()-e.checkedAt<ul)return di(e.version,Ie)>0?{update:e.version,forced:di(Ie,e.min)<0}:null;try{let t=Ge(),n=await fetch(`${t}/api/cli/version`,{signal:AbortSignal.timeout(3e3)});if(!n.ok)return null;let i=await n.json();if(pl({version:i.version,min:i.min,checkedAt:Date.now()}),di(i.version,Ie)>0)return{update:i.version,forced:di(Ie,i.min)<0}}catch{}return null}var Jt,In,Zr,hs,ul,gs,ml,ys,vs,Ie,De=je(()=>{"use strict";Jt=N(require("fs"),1),In=N(require("path"),1),Zr=N(require("os"),1);On();ps();ul=1440*60*1e3,gs="default",ml=/^[a-z0-9][a-z0-9._-]{0,62}$/i;vs=process.stdout.isTTY??!1,Ie="0.4.
|
|
28
|
+
`).ok:!1},delete(e){process.platform==="darwin"?Ht("security",["delete-generic-password","-s",un,"-a",e]):process.platform==="linux"&&Ht("secret-tool",["clear","service",un,"account",e])}},oi=cl,Cn=new Map});function An(){return process.env.DOMANI_CONFIG_DIR||In.default.join(Zr.default.homedir(),".domani")}function Qr(){return In.default.join(An(),"config.json")}function eo(e){hs=e}function li(e){return ml.test(e)}function Be(){let e;try{e=JSON.parse(Jt.default.readFileSync(Qr(),"utf-8"))}catch{return{}}if(!e||typeof e!="object")return{};let{token:t,email:n,token_in_keychain:i,...s}=e,r={...s,accounts:{...e.accounts??{}}};return!e.accounts&&(t||n||i)&&(r.accounts={[gs]:{email:n,api_url:e.api_url,...t?{token:t}:{},...i?{token_in_keychain:i}:{}}},r.active_account=gs),r}function bs(e){Jt.default.mkdirSync(An(),{recursive:!0,mode:448}),Jt.default.writeFileSync(Qr(),JSON.stringify(e,null,2),{mode:384})}function to(e){ys=e}function Rn(){return process.env.DOMANI_API_KEY?{source:"api_key_env"}:Pt()}function Pt(){if(ys)return{name:ys,source:"flag"};if(process.env.DOMANI_ACCOUNT)return{name:process.env.DOMANI_ACCOUNT,source:"env"};let e=Be().active_account;return e?{name:e,source:"active"}:{source:"none"}}function mn(){return Pt().name??gs}function no(e){return Be().accounts?.[e]}function rt(){let e=Be().accounts??{};return Object.keys(e).sort().map(t=>({name:t,...e[t]}))}function ws(e,t={}){let n=no(e);if(n){if(n.token)return n.token;if(n.token_in_keychain)return Yr(e,{refresh:t.refreshKeychain})}}function ci(e,t){let n=Be(),i=zr()&&Xr(e,t.token)?{email:t.email,api_url:t.api_url,token_in_keychain:!0}:{email:t.email,api_url:t.api_url,token:t.token};n.accounts={...n.accounts??{},[e]:i},(!n.active_account||!n.accounts[n.active_account])&&(n.active_account=e),bs(n)}function io(e){let t=Be(),n=t.accounts?.[e];if(n)return n.token_in_keychain&&ai(e),delete t.accounts[e],t.active_account===e&&delete t.active_account,bs(t),n}function so(e){let t=Be();return t.accounts?.[e]?(t.active_account=e,bs(t),!0):!1}function xt(){let e=Rn();if(e.source==="api_key_env")return"DOMANI_API_KEY";if(!e.name)return;let t=no(e.name)?.email;return rt().length<=1&&e.source==="active"?t:t?`${e.name} (${t})`:e.name}function Ge(){if(hs)return hs;let e=Be(),{name:t}=Pt();return t&&e.accounts?.[t]?.api_url||e.api_url||Sn}function ot(e={}){if(process.env.DOMANI_API_KEY)return process.env.DOMANI_API_KEY;let{name:t}=Pt();return t?ws(t,e):void 0}function fl(){try{let e=Jt.default.readFileSync(In.default.join(An(),"version-check.json"),"utf-8");return JSON.parse(e)}catch{return null}}function pl(e){try{Jt.default.mkdirSync(An(),{recursive:!0,mode:448}),Jt.default.writeFileSync(In.default.join(An(),"version-check.json"),JSON.stringify(e),{mode:384})}catch{}}function di(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]||0)>(i[s]||0))return 1;if((n[s]||0)<(i[s]||0))return-1}return 0}async function ro(){let e=fl();if(e&&Date.now()-e.checkedAt<ul)return di(e.version,Ie)>0?{update:e.version,forced:di(Ie,e.min)<0}:null;try{let t=Ge(),n=await fetch(`${t}/api/cli/version`,{signal:AbortSignal.timeout(3e3)});if(!n.ok)return null;let i=await n.json();if(pl({version:i.version,min:i.min,checkedAt:Date.now()}),di(i.version,Ie)>0)return{update:i.version,forced:di(Ie,i.min)<0}}catch{}return null}var Jt,In,Zr,hs,ul,gs,ml,ys,vs,Ie,De=je(()=>{"use strict";Jt=N(require("fs"),1),In=N(require("path"),1),Zr=N(require("os"),1);On();ps();ul=1440*60*1e3,gs="default",ml=/^[a-z0-9][a-z0-9._-]{0,62}$/i;vs=process.stdout.isTTY??!1,Ie="0.4.86"});var _s=_t((pf,oo)=>{"use strict";var $s={to(e,t){return t?`\x1B[${t+1};${e+1}H`:`\x1B[${e+1}G`},move(e,t){let n="";return e<0?n+=`\x1B[${-e}D`:e>0&&(n+=`\x1B[${e}C`),t<0?n+=`\x1B[${-t}A`:t>0&&(n+=`\x1B[${t}B`),n},up:(e=1)=>`\x1B[${e}A`,down:(e=1)=>`\x1B[${e}B`,forward:(e=1)=>`\x1B[${e}C`,backward:(e=1)=>`\x1B[${e}D`,nextLine:(e=1)=>"\x1B[E".repeat(e),prevLine:(e=1)=>"\x1B[F".repeat(e),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},hl={up:(e=1)=>"\x1B[S".repeat(e),down:(e=1)=>"\x1B[T".repeat(e)},gl={screen:"\x1B[2J",up:(e=1)=>"\x1B[1J".repeat(e),down:(e=1)=>"\x1B[J".repeat(e),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(e){let t="";for(let n=0;n<e;n++)t+=this.line+(n<e-1?$s.up():"");return e&&(t+=$s.left),t}};oo.exports={cursor:$s,scroll:hl,erase:gl,beep:"\x07"}});function jt(e,t,n){if(!n.some(o=>!o.disabled))return e;let i=e+t,s=Math.max(n.length-1,0),r=i<0?s:i>s?0:i;return n[r].disabled?jt(r,t<0?-1:1,n):r}function Os(e,t,n){return String(e).normalize().replaceAll(`\r
|
|
29
29
|
`,`
|
|
30
30
|
`).split(`
|
|
31
31
|
`).map(i=>Cl(i,t,n)).join(`
|
|
@@ -176,7 +176,7 @@ ${a}`:""}`}default:{let o=t?`${h.default.cyan(D)} `:"",a=t?h.default.cyan(Re):"
|
|
|
176
176
|
${a}
|
|
177
177
|
`}}}}).prompt()});function bc(e){return!!(e.json||!Te)}function j(e,t=50){console.log(),console.log(` ${J.default.bold(e)}`),console.log(` ${J.default.dim("\u2500".repeat(t))}`)}function c(e,t,n=2){let i=" ".repeat(n);console.log(`${i}${J.default.dim(e.padEnd(16))} ${t}`)}function l(){console.log()}function _e(e){console.log(` ${J.default.dim(e)}`)}function A(e,t){console.log(` ${J.default.dim(e)} ${J.default.cyan(t)}`)}function Vo(e){return e.split(/(https?:\/\/[^\s]+)/g).map(n=>/^https?:\/\//.test(n)?`\x1B]8;;${n}\x1B\\${J.default.underline(J.default.cyan(n))}\x1B]8;;\x1B\\`:J.default.dim(n)).join("")}function Qs(e,t){console.error(` ${y.error} ${J.default.red(e)}`),t&&console.error(` ${Vo(t)}`)}function O(e=!0){return e?Un():wc}function Wo(e){return e.replace(vc,"")}function Ri(e,t){let n=Wo(e).length,i=Math.max(0,t-n);return e+" ".repeat(i)}function B(e,t,n){let i=n||e.map((o,a)=>{let d=t.reduce((f,m)=>Math.max(f,Wo(m[a]||"").length),0);return Math.max(o.length,d)+2}),s=e.map((o,a)=>J.default.dim(o.padEnd(i[a]))).join(" "),r=i.map(o=>J.default.dim("\u2500".repeat(o))).join(" ");console.log(` ${s}`),console.log(` ${r}`);for(let o of t){let a=o.map((d,f)=>Ri(d,i[f])).join(" ");console.log(` ${a}`)}}function $c(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function Zs(e){if(Array.isArray(e))return e.map(Zs);if(e&&typeof e=="object"&&!(e instanceof Date)){let t={};for(let[n,i]of Object.entries(e))t[$c(n)]=Zs(i);return t}return e}function b(e,t){let n=Zs(e);if(!t){console.log(JSON.stringify(n,null,2));return}let i=t.split(",").map(s=>s.trim()).filter(Boolean);if(Array.isArray(n)){let s=n.map(r=>Mo(r,i));console.log(JSON.stringify(s,null,2))}else console.log(JSON.stringify(n&&typeof n=="object"?Mo(n,i):n,null,2))}function Mo(e,t){let n={};for(let i of t)i in e&&(n[i]=e[i]);if(Object.keys(n).length===0){for(let[i,s]of Object.entries(e))if(Array.isArray(s)&&s.length>0&&typeof s[0]=="object"){let r=s.map(o=>{let a={};for(let d of t)d in o&&(a[d]=o[d]);return a});Object.keys(r[0]).length>0&&(n[i]=r)}}return n}function St(e){return!!(e.yes||bc(e))}function Ut(){let e=xt();return e?` as ${J.default.bold(e)}`:""}function G(e,t,n,i){if(n){b({dry_run:!0,action:e,...t},i);return}console.log(),console.log(` ${J.default.yellow("\u25B8 DRY RUN")} ${J.default.dim("- no changes made")}`),console.log(` ${J.default.dim("Action:")} ${J.default.bold(e)}`);for(let[s,r]of Object.entries(t))r!=null&&(Array.isArray(r)?console.log(` ${J.default.dim(s+":")} ${r.map(String).join(", ")}`):console.log(typeof r=="object"?` ${J.default.dim(s+":")} ${JSON.stringify(r)}`:` ${J.default.dim(s+":")} ${String(r)}`));console.log()}function kc(e,t,n){return t===401||t===403?"auth_required":t===402||n?"payment_required":t===404?"not_found":t===409?"conflict":t===422?"validation_error":t===429?"rate_limited":/contact/i.test(e)?"contact_required":"error"}function u(e,t){let n=e||`Request failed${t?.status?` (${t.status})`:""}`,i=t?.code||kc(n,t?.status,t?.fixUrl),s=t?.fixCommand||_c[i];if(t?.json){let r={error:n,code:i,...t.data};t.hint&&(r.hint=t.hint),s&&(r.fix_command=s),t.fixUrl&&(r.fix_url=t.fixUrl),b(r,t.fields)}else Qs(n,t?.hint),s?console.error(` ${J.default.dim("Or run:")} ${J.default.cyan(s)}`):t?.fixUrl&&console.error(` ${Vo(`Add a payment method at ${t.fixUrl}`)}`);process.exit(1)}function Le(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";(0,Lo.execFile)(t,[e])}function Ot(e){return new Promise(t=>setTimeout(t,e))}function Qt(e,t,n,i=!0){let s=process.stdout.isTTY??!1;if(!i)return{start(){},markDone(){},stop(){}};let r=0,o=null,a=2+t.length;function d(){let g=" "+e.map((w,_)=>J.default.dim(w.padEnd(n[_]))).join(" "),v=" "+n.map(w=>J.default.dim("\u2500".repeat(w))).join(" "),k=[g,v];for(let w of t){let _=w.status==="done"?w.icon??y.success:J.default.cyan(Fo[r%Fo.length]),S=w.cells.map((C,R)=>Ri(C,n[R])).join(" ");k.push(` ${_} ${S}`)}return k}let f=!1,m=()=>process.stdout.write("\x1B[?25h");function p(){let g=d();if(f&&s){process.stdout.write(`\x1B[${a}A`);for(let v of g)process.stdout.write(`\x1B[2K${v}
|
|
178
178
|
`)}else{for(let v of g)console.log(v);f=!0}}return{start(){s&&(process.stdout.write("\x1B[?25l"),process.on("exit",m)),p(),s&&(o=setInterval(()=>{r++,p()},80))},markDone(g,v){t[g].status="done",v!==void 0&&(t[g].icon=v),s&&p()},stop(){o&&clearInterval(o);for(let g of t)g.status="done";p(),s&&(process.stdout.write("\x1B[?25h"),process.removeListener("exit",m))}}}var J,Lo,Te,y,$,wc,vc,_c,Fo,V=je(()=>{"use strict";J=N(F(),1),Lo=require("child_process");De();qe();Te=process.stdout.isTTY??!1;y={success:J.default.green("\u2713"),error:J.default.red("\u2717"),warning:J.default.yellow("!"),info:J.default.cyan("\u25CF"),arrow:J.default.dim("\u2192"),dot:J.default.dim("\xB7"),dash:J.default.dim("\u2500")},$={domain:e=>J.default.bold(J.default.white(e)),price:e=>J.default.green(`$${e}`),label:e=>J.default.dim(e),value:e=>J.default.white(e),dim:e=>J.default.dim(e),bold:e=>J.default.bold(e),success:e=>J.default.green(e),error:e=>J.default.red(e),warn:e=>J.default.yellow(e),cyan:e=>J.default.cyan(e),url:e=>`\x1B]8;;${e}\x1B\\${J.default.underline(J.default.cyan(e))}\x1B]8;;\x1B\\`};wc={start:()=>{},stop:()=>{},message:()=>{}};vc=/\x1b\]8;;[^\x1b]*\x1b\\|\x1b\[[0-9;]*m/g;_c={auth_required:"domani login",payment_required:"domani card add",contact_required:"domani contact set"};Fo=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]});function Ho(e){return typeof e=="string"&&["pro","agent","fleet","scale","mail_solo","mail_team","mail_business"].includes(e)}function Jo(e){return Ho(e.plan)||Array.isArray(e.workspace_plans)&&e.workspace_plans.some(Ho)}async function Bo(){if(tr)return;let e=process.argv.includes("--json")||!vs,t=Ge(),n=ot();try{let r=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${n}`}})).json();if(Jo(r)){tr=!0;return}}catch{}e&&(console.log(JSON.stringify({error:"Paid plan required",code:"upgrade_required",hint:"Upgrade at https://domani.run/settings",fix_command:"domani upgrade"},null,2)),process.exit(1)),l(),console.log(` ${Se.default.dim("This feature requires a")} ${Se.default.bold("paid plan")} ${Se.default.dim(`(including an active ${Et.mailProductName} workspace plan or legacy Pro subscription).`)}`),console.log(` ${Se.default.dim("Opening pricing page")} ${y.arrow} ${Se.default.cyan("domani.run/pricing")}`),Le(`${t.replace("http://localhost:3000","https://domani.run")}/pricing`),l();let i=O(!0);i.start("Waiting for upgrade...");for(let s=0;s<120;s++){await new Promise(r=>setTimeout(r,5e3));try{let o=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${n}`}})).json();if(Jo(o)){tr=!0,i.stop(`${y.success} Paid plan active! Continuing...`),l();return}}catch{}}i.stop("Timed out"),console.error(` ${Se.default.red("\u2717")} No upgrade detected. Visit ${Se.default.cyan("domani.run/settings")} to upgrade.`),process.exit(1)}async function Go(){if(er||ot()){er=!0;return}let e=process.argv.includes("--json")||!vs,{source:t}=Pt(),n=mn(),i=t==="flag"||t==="env"?`domani login --account ${n}`:"domani login";e&&(console.log(JSON.stringify({error:t==="flag"||t==="env"?`Not logged in to the CLI account "${n}"`:"Not logged in",code:"auth_required",hint:`Run '${i}' or set DOMANI_API_KEY environment variable`,fix_command:i},null,2)),process.exit(1)),l(),console.log(` ${Se.default.dim("You're not logged in.")} Starting authentication...`),l();let s=Ge(),r=O(!0);r.start("Requesting auth code");let o;try{o=await fetch(`${s}/api/auth/cli`,{method:"POST",headers:{"Content-Type":"application/json"}})}catch{r.stop("Failed"),console.error(` ${Se.default.red("\u2717")} Could not reach ${s}. Check your connection.`),process.exit(1)}if(!o.ok){r.stop("Failed");let f=`Server error (${o.status})`;try{let m=await o.json();f=m.error||m.message||f}catch{}console.error(` ${Se.default.red("\u2717")} ${f}`),process.exit(1)}let a,d;try{({code:a,auth_url:d}=await o.json())}catch{r.stop("Failed"),console.error(` ${Se.default.red("\u2717")} Invalid response from server.`),process.exit(1)}r.stop(`${y.success} Auth code ready`),l(),console.log(` ${Se.default.dim("Verification code:")} ${Se.default.bold(Se.default.cyan(a))}`),console.log(` ${Se.default.dim("Opening browser")} ${y.arrow} ${$.url(d)}`),Le(d),l(),r.start("Waiting for browser approval");for(let f=0;f<120;f++){await new Promise(g=>setTimeout(g,5e3));let m=await fetch(`${s}/api/auth/cli/poll?code=${a}`).catch(()=>null);if(!m||!m.ok&&m.status!==202)continue;let p=await m.json().catch(()=>({}));if(p.status==="complete"){ci(n,{token:p.token,email:p.email,api_url:s}),er=!0,r.stop(`${y.success} Logged in as ${Se.default.bold(p.email)}`),l();return}}r.stop("Timed out"),console.error(` ${Se.default.red("\u2717")} No approval received. Run ${Se.default.cyan("domani login")} to try again.`),process.exit(1)}var Se,er,tr,nr=je(()=>{"use strict";Se=N(F(),1);ii();De();V();er=!1,tr=!1});function Xo(e){return e.json=async()=>{let t=await e.clone().text();try{return JSON.parse(t)}catch{let n=t.trim().slice(0,120);return e.ok?(Object.defineProperty(e,"ok",{value:!1}),{error:`Unexpected non-JSON response (HTTP ${e.status})`,hint:`The server replied but not with JSON${n?` (got: "${n}")`:""}. This is usually transient (deploy or proxy) - retry in a few seconds.`}):{error:`Server error (${e.status})`,hint:"The server returned an unexpected response. Try again later."}}},e}async function x(e,t={},n=!1){let i=ot(),s=`${Ge()}${e}`,r=await fetch(s,{...t,headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json","User-Agent":`domani-cli/${Ie}`,...t.headers}});if(!n){let o=await r.clone().text();try{if(JSON.parse(o).code==="UPGRADE_REQUIRED")return await Bo(),x(e,t,!0)}catch{}}return Xo(r)}async function ke(e,t={}){let n=`${Ge()}${e}`,i=ot(),s=await fetch(n,{...t,headers:{"Content-Type":"application/json","User-Agent":`domani-cli/${Ie}`,...i?{Authorization:`Bearer ${i}`}:{},...t.headers}});return Xo(s)}var K=je(()=>{"use strict";De();nr()});function Mt(){return{ok:!0}}function Ct(e,t,n){return{ok:!1,error:{message:e,code:t,hint:n}}}function na(e){return Oc.test(e)?Ct("Input contains control characters","invalid_input","Remove non-printable characters from the input"):Mt()}function Ec(e){return Cc.test(e)?Ct("Input contains path traversal","invalid_input","Domain names cannot contain '../' or '..\\'"):Mt()}function Pc(e){return Ac.test(e)?Ct("Input contains query string or fragment","invalid_input","Remove '?' or '#' from the domain name"):Mt()}function Dc(e){return Ic.test(e)?Ct("Input contains percent-encoded characters","invalid_input","Use plain text, not URL-encoded values (e.g. 'example.com' not 'example%2Ecom')"):Mt()}function ia(e){if(!e)return Ct("Domain name is required","validation_error");if(e.length>ta)return Ct(`Domain name too long (${e.length} chars, max ${ta})`,"validation_error");for(let t of[na,Ec,Pc,Dc]){let n=t(e);if(!n.ok)return n}return Rc.test(e)?Mt():Ct(`Invalid domain name: ${e}`,"validation_error","Domain names can only contain letters, digits, hyphens, and dots")}function Nc(e){if(!e)return Ct("TLD is required","validation_error");let t=na(e);return t.ok?Tc.test(e)?Mt():Ct(`Invalid TLD: ${e}`,"validation_error","TLDs contain only letters (e.g. 'com', '.dev', 'ai')"):t}function Uc(e){for(let t of e){let n=ia(t);if(!n.ok)return n}return Mt()}function qc(e){for(let t of e){let n=Nc(t);if(!n.ok)return n}return Mt()}function Y(e,t){let n=ia(e);n.ok||u(n.error.message,{code:n.error.code,hint:n.error.hint,json:t?.json,fields:t?.fields})}function sa(e,t){let n=Uc(e);n.ok||u(n.error.message,{code:n.error.code,hint:n.error.hint,json:t?.json,fields:t?.fields})}function Ti(e,t){let n=qc(e);n.ok||u(n.error.message,{code:n.error.code,hint:n.error.hint,json:t?.json,fields:t?.fields})}var Oc,Cc,Ac,Ic,Rc,Tc,ta,we=je(()=>{"use strict";V();Oc=/[\x00-\x08\x0b\x0c\x0e-\x1f]/,Cc=/\.\.[/\\]/,Ac=/[?#]/,Ic=/%[0-9a-fA-F]{2}/,Rc=/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*\.?$/,Tc=/^\.?[a-zA-Z]{2,63}$/,ta=253});function sr(e,t){return t!==void 0&&Math.round(t*100)!==Math.round(e*100)}function tt(e,t){return sr(e,t)?`$${e.toFixed(2)} first year, then $${t.toFixed(2)}/yr`:`$${e.toFixed(2)}/yr`}var Ei=je(()=>{"use strict"});function qn(e){return Math.round(e*100)/100}function Ft(e){return e.code==="PRICE_ABOVE_MAX"&&typeof e.price=="number"?e.price:void 0}function rr(e){return`Nothing was charged. Re-run with --max-price ${e.toFixed(2)} to accept the new price.`}function Mc(e){return typeof e.renewal_price=="number"&&e.renewal_price>0?e.renewal_price:void 0}async function Mn(e,t,n,i,s){let r=Mc(n);St(s)&&u(n.error??`The price is now $${e.toFixed(2)}, above $${t.toFixed(2)}. Nothing was charged.`,{code:"price_above_max",hint:rr(e),data:{price:e,...typeof n.listed_price=="number"?{listed_price:n.listed_price}:{},...r!==void 0?{renewal_price:r}:{}},json:s.json,fields:s.fields});let o=r!==void 0?`, then ${$.price(r.toFixed(2))}/year to renew`:"",a=await We({message:`The price changed: ${$.price(e.toFixed(2))} instead of ${$.price(t.toFixed(2))}${o}. Nothing was charged. ${i} for ${$.price(e.toFixed(2))}?`});if(!a||typeof a=="symbol"){console.log(` ${ra.default.dim("Cancelled.")}`);return}return e}function en(e,t){if(e===void 0)return;let n=Number(e);return(!Number.isFinite(n)||n<=0)&&u(`--max-price must be a positive amount in USD, got "${e}"`,{code:"validation_error",json:t.json,fields:t.fields}),n}var ra,Pi=je(()=>{"use strict";qe();ra=N(F(),1);V()});async function ge(){Te||u("Missing required argument: domain",{hint:"Pass the domain as an argument, e.g. 'domani settings example.com'",code:"missing_argument",json:!0});let e=O(!0);e.start("Loading your domains");let t=await x("/api/domains"),n=await t.json();t.ok||(e.stop("Failed"),Qs(n.error,n.hint),process.exit(1));let i=n.domains||[];i.length===0&&(e.stop("No domains"),l(),console.log(` ${or.default.dim("No domains yet.")} Use: ${or.default.cyan("domani buy <domain>")}`),l(),process.exit(0)),e.stop(`${i.length} domain(s)`);let s=await dt({message:"Which domain?",options:i.map(r=>({value:r.domain,label:r.domain,hint:r.status!=="active"?r.status:void 0}))});return ae(s)&&process.exit(0),s}var or,nt=je(()=>{"use strict";K();qe();or=N(F(),1);V()});var aa={};ln(aa,{connect:()=>ar});async function ar(e,t,n){e||(e=await ge()),Y(e,n);let i;if(t&&!n.provider?t.includes(".")?i=t:n.provider=t:i=t,!i&&!n.provider&&!n.list&&n.dryRun)return G("connect",{domain:e,note:"No provider specified. Pass --provider <name> to connect."},n.json,n.fields);if(!i&&!n.provider&&!n.list){let s=O(!n.json);s.start(`Loading providers for ${$.domain(e)}`);let r=await x(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop("Providers loaded"),n.json){b(o,n.fields);return}let a=[];for(let w of["hosting","email"]){let _=o.providers?.[w]||[];for(let S of _)a.push({value:`${w}:${S.name}`,label:S.name,hint:w})}a.length===0&&u("No providers available",{code:"not_found",json:n.json,fields:n.fields});let d=await dt({message:"Choose a provider",options:a});ae(d)&&process.exit(0);let[f,m]=d.split(":"),g=(o.providers?.[f]||[]).find(w=>w.name===m),v;if(g&&g.methods.length>1){let w=await dt({message:"Choose a method",options:g.methods.map(_=>({value:_.name,label:_.name,hint:_.default?"default":void 0}))});ae(w)&&process.exit(0),v=w}let k;if(f==="hosting"&&g?.requires_target){g.notes?.setup&&_e(g.notes.setup);let w=await Ue({message:"Target hostname or IP"});ae(w)&&process.exit(0),k=w.trim()}return oa(e,{target:k,provider:m,method:v,dryRun:n.dryRun,json:!1})}if(n.list){let s=O(!n.json);s.start(`Loading providers for ${$.domain(e)}`);let r=await x(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop("Providers loaded"),n.json){b(o,n.fields);return}j(`Providers for ${$.domain(o.domain)}`);for(let a of["hosting","email"]){let d=o.providers?.[a];if(d?.length){l(),console.log(` ${me.default.bold(a.toUpperCase())}`);for(let f of d){let m=f.methods.map(p=>p.default?me.default.green(`${p.name} (default)`):me.default.dim(p.name)).join(me.default.dim(", "));console.log(` ${me.default.cyan(f.name.padEnd(20))} ${m}`)}}}l();return}return oa(e,n)}async function oa(e,t){let n={};if(t.target&&(n.target=t.target),t.provider&&(n.provider=t.provider),t.method&&(n.method=t.method),t.dryRun)return G("connect",{domain:e,...n},t.json,t.fields);let i=O(!t.json);i.start(`Connecting ${$.domain(e)}`);let s=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify(n)}),r=await s.json();s.ok||(i.stop("Connection failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}));let o=r.status==="manual_setup_required";if(i.stop(o?`${y.success} DNS instructions for ${me.default.cyan(r.provider)}`:`${y.success} Connected to ${me.default.cyan(r.provider)}`),t.json){b(r,t.fields);return}if(j(o?`Add these records at your registrar for ${$.domain(r.domain)}`:`Connected ${$.domain(r.domain)}`),c("Provider",me.default.cyan(r.provider)),c("Method",r.method),r.records?.length){let a=[8,22,40];l(),console.log(` ${me.default.bold("DNS Records")}`);let d=["Type","Name","Value"].map((m,p)=>me.default.dim(m.padEnd(a[p]))).join(" "),f=a.map(m=>me.default.dim("\u2500".repeat(m))).join(" ");console.log(` ${d}`),console.log(` ${f}`);for(let m of r.records){let p=m.record,g=m.status!=="already_set";process.stdout.isTTY&&g&&await Ot(50);let k=[me.default.yellow(p.type),p.name,me.default.cyan(p.value)+(p.priority?me.default.dim(` pri=${p.priority}`):"")].map((S,C)=>Ri(S,a[C])).join(" "),w=m.status==="already_set"?me.default.dim("\u2713"):m.status==="updated"?me.default.yellow("\u21BA"):m.status==="pending"?me.default.yellow("\u2192"):y.success,_=m.status==="already_set"?me.default.dim(" already set"):m.status==="updated"?me.default.dim(" updated"):m.status==="pending"?me.default.dim(" add this"):"";console.log(` ${w} ${k}${_}`)}}l(),r.next_steps?.length?(console.log(` ${me.default.bold("Next steps")}`),r.next_steps.forEach((a,d)=>{console.log(` ${me.default.dim(`${d+1}.`)} ${a}`)})):r.hint&&console.log(` ${me.default.dim(r.hint)}`),r.docs&&console.log(` ${me.default.dim("Docs:")} ${$.url(r.docs)}`),l()}var me,dr=je(()=>{"use strict";K();me=N(F(),1);qe();V();we();nt()});function tn(e,t=process.env){if(e.clearHeaders&&(e.authorizationEnv||e.apiKeyEnv))throw new Error("--clear-headers cannot be combined with header environment options");if(e.clearHeaders)return{};let n={},i=[["Authorization",e.authorizationEnv],["X-API-Key",e.apiKeyEnv]];for(let[s,r]of i){if(!r)continue;let o=t[r];if(!o)throw new Error(`Environment variable ${r} is not set`);n[s]=o}return Object.keys(n).length>0?n:void 0}function nn(e){return e?Object.keys(e):[]}var Di=je(()=>{"use strict"});var va={};ln(va,{buildSendBody:()=>fa,contactsQuery:()=>ha,email:()=>Fn,inboxQuery:()=>ya,parseRecipients:()=>Ui,recipientField:()=>qi,resolveDomainArg:()=>lr,systemLocale:()=>ma});function Vc(e){return[T.default.yellow(e.type),e.name,T.default.cyan(e.value)+(e.priority?T.default.dim(` pri=${e.priority}`):"")]}function ur(e){return Lc[e]||e}function Ui(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function qi(e){if(e.length!==0)return e.length===1?e[0]:e}function Wc(e,t){if(e&&e.includes("@")){let[n,i]=e.split("@",2);!t.slug&&n&&(t.slug=n),!t.domain&&i&&(t.domain=i)}}function lr(e,t){if(t.domain)return t.domain;if(e&&!e.includes("@"))return e}async function it(e){return e.domain?(Y(e.domain,e),e.domain):ge()}async function Fn(e,t,n){if(e&&e.includes(".")&&!Fc.includes(e))return n.check?la(e,!!n.json,n.fields):t?ca(e,t,!!n.json,n.fields):ba(e,!!n.json,n.fields);if(Wc(t,n),n.body&&!n.text&&(n.text=n.body),n.title&&!n.subject&&(n.subject=n.title),n.from&&n.from.includes("@")){let[i,s]=n.from.split("@",2);!n.slug&&i&&(n.slug=i),!n.domain&&s&&(n.domain=s)}switch(e){case void 0:return da(n);case"list":return da(n);case"inbox":return yu(n);case"folders":return bu(n);case"archive":case"trash":case"restore":case"read":case"unread":case"star":case"unstar":return wu(e,n);case"setup":return n.domain=lr(t,n),ru(n);case"status":return n.domain=lr(t,n),ou(n);case"remove":return au(n);case"create":return du(n);case"delete":return lu(n);case"send":return cu(n);case"webhook":return vu(n);case"webhook-test":return $u(n);case"forward":return _u(n);case"work":return eu(n);case"triage":return tu(n);case"note":return nu(n);case"notes":return iu(n);case"activity":return su(n);case"changes":return Gc(n);case"search":return Kc(t,n);case"threads":return zc(n);case"thread":return Yc(t,n);case"label":return Xc(n);case"facts":return Zc(t,n);case"extract":return Qc(t,n);case"coordination":return Hc(n);case"presence":return Jc(n);case"release-presence":return Bc(n);case"escalate":return uu(n);case"remind":return mu(n);case"contacts":return fu(n);case"contact-add":return pu(n);case"contact-remove":return hu(n);case"tone":return gu(n);case"check":return la(n.domain||await ge(),!!n.json,n.fields);case"connect":return ca(n.domain||await ge(),t||void 0,!!n.json,n.fields);default:u(`Unknown action: ${e}`,{hint:"Actions: list, inbox, folders, archive, trash, restore, read, unread, star, unstar, create, delete, send, forward, webhook, webhook-test, work, triage, notes, note, activity, changes, coordination, presence, release-presence, setup, status, check, connect",code:"validation_error",json:n.json,fields:n.fields})}}function mr(e){let t=e.mailboxIds?.split(",").map(n=>n.trim()).filter(Boolean)[0];return(!t||!e.threadKey)&&u("Mailbox ID and thread key required",{hint:"Pass --mailbox-ids mb_1 --thread-key 'jmap:thread_1'",code:"validation_error",json:e.json,fields:e.fields}),{mailboxId:t,threadKey:e.threadKey}}async function Hc(e){let{mailboxId:t,threadKey:n}=mr(e),i=new URLSearchParams({mailbox_id:t,thread_key:n}),s=await x(`/api/email/collaboration/coordination?${i}`),r=await s.json();if(s.ok||u(r.error||"Could not read coordination",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return b(r,e.fields);j("Conversation Coordination"),c("Conversation",r.conversation_id),c("Reply version",String(r.reply_version)),c("Presence",String(r.presence?.length||0)),c("Compose lease",r.compose_lease?.holder?.label||"none")}async function Jc(e){let{mailboxId:t,threadKey:n}=mr(e);e.clientId||u("Client ID required",{hint:"Pass a stable --client-id for this agent process or app installation",code:"validation_error",json:e.json,fields:e.fields});let i=e.mode||"viewing";["viewing","composing"].includes(i)||u("Mode must be viewing or composing",{code:"validation_error",json:e.json,fields:e.fields});let s=await x("/api/email/collaboration/coordination",{method:"PUT",body:JSON.stringify({mailbox_id:t,thread_key:n,client_id:e.clientId,mode:i,acquire_lease:e.acquireLease!==!1})}),r=await s.json();if(s.ok||u(r.error||"Could not heartbeat presence",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return b(r,e.fields);j("Conversation Presence"),c("Mode",i),c("Reply version",String(r.reply_version)),c("Lease ID",r.compose_lease?.lease_id||"none"),c("Expires",r.compose_lease?.expires_at||r.presence?.find(o=>o.client_id===e.clientId)?.expires_at||"unknown")}async function Bc(e){let{mailboxId:t,threadKey:n}=mr(e);e.clientId||u("Client ID required",{hint:"Pass the same --client-id used for presence",code:"validation_error",json:e.json,fields:e.fields});let i=await x("/api/email/collaboration/coordination",{method:"DELETE",body:JSON.stringify({mailbox_id:t,thread_key:n,client_id:e.clientId,lease_id:e.leaseId})}),s=await i.json();if(i.ok||u(s.error||"Could not release presence",{code:s.code||"api_error",json:e.json,fields:e.fields}),e.json)return b(s,e.fields);j("Conversation Presence"),c("Released",e.clientId),c("Remaining presence",String(s.presence?.length||0))}async function Gc(e){let t=e.mailboxIds?.split(",").map(r=>r.trim()).filter(Boolean)[0];t||u("Mailbox ID required",{hint:"Usage: domani email changes --mailbox-ids mb_1 [--cursor <opaque>]",code:"validation_error",json:e.json,fields:e.fields});let n=new URLSearchParams({mailbox_id:t});e.cursor&&n.set("cursor",e.cursor),e.limit&&n.set("limit",e.limit);let i=await x(`/api/email/changes?${n}`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);if(j("Mailbox Changes"),s.requires_full_sync){c("Full sync","Required"),c("Baseline cursor",s.next_cursor),_e("Take a bounded mailbox snapshot, then call this command again with --cursor to replay concurrent changes.");return}s.changes.length?B(["Sequence","Type","Resource","Created"],s.changes.map(r=>[r.sequence,r.type,`${r.resource_type}:${r.resource_id||"-"}`,r.created_at]),[12,32,40,24]):console.log(` ${T.default.dim("No changes since this cursor.")}`),c("Next cursor",s.next_cursor),s.has_more&&_e("More changes are available; call again with the next cursor.")}function Ni(e){return(e||"").split(",").map(t=>t.trim()).filter(Boolean)}async function Kc(e,t){let n=(t.query||(e&&!e.includes("@")?e:void 0)||"").trim();n||u("Query required",{hint:'Usage: domani email search "the invoice from tucows" [--from hi@myapp.dev] [--mode hybrid|semantic|keyword] [--limit 10] [--label billing]',code:"validation_error",json:t.json,fields:t.fields});let i=new URLSearchParams({q:n});t.mode&&i.set("mode",t.mode),t.limit&&i.set("limit",t.limit),t.slug&&t.domain&&i.set("mailbox",`${t.slug}@${t.domain}`),t.folder&&i.set("folder",t.folder),t.since&&i.set("since",t.since),t.until&&i.set("until",t.until),t.label&&i.set("label",t.label);let s=await x(`/api/emails/search?${i}`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);if(j(`Search: ${n}`),!r.results.length){console.log(` ${T.default.dim(r.hint||"No mail matches this search.")}`);return}B(["Why","From","Subject","Mailbox","Message"],r.results.map(o=>[o.why,o.message.from.slice(0,28),(o.message.subject||"").slice(0,44),o.message.mailbox.slice(0,28),o.message.id]),[8,30,46,30,28]),_e(`${r.results.length} result${r.results.length===1?"":"s"} in ${r.took_ms} ms, mode ${r.mode}. Open one with: domani email thread <thread_id> --from <mailbox>`)}async function zc(e){let{address:t}=Lt(e,"Usage: domani email threads --from hi@myapp.dev [--folder inbox] [--since <iso>] [--limit 25] [--cursor <cursor>] [--label billing]"),n=new URLSearchParams;e.folder&&n.set("folder",e.folder),e.since&&n.set("since",e.since),e.limit&&n.set("limit",e.limit),e.cursor&&n.set("cursor",e.cursor),e.label&&n.set("label",e.label);let i=n.toString(),s=await x(`/api/emails/${encodeURIComponent(t)}/threads${i?`?${i}`:""}`),r=await s.json();if(s.ok||u(r.error||r.message,{code:r.code,hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json)return b(r,e.fields);if(j(`Threads in ${t}`),!r.threads.length){console.log(` ${T.default.dim("No conversations here.")}`);return}B(["Messages","Unread","Subject","With","Last","Thread"],r.threads.map(o=>[String(o.message_count),String(o.unread_count),(o.subject||"").slice(0,40),o.participants.filter(a=>a!==t).join(", ").slice(0,30),o.last_message_at.slice(0,16),o.id]),[9,7,42,32,17,28]),r.next_cursor&&c("Next cursor",r.next_cursor)}async function Yc(e,t){let n=t.threadId||(e&&!e.includes("@")?e:void 0),{address:i}=Lt(t,"Usage: domani email thread <thread_id> --from hi@myapp.dev");n||u("Thread ID required",{hint:"Usage: domani email thread <thread_id> --from hi@myapp.dev",code:"validation_error",json:t.json,fields:t.fields});let s=await x(`/api/emails/${encodeURIComponent(i)}/threads/${encodeURIComponent(n)}`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);j(r.subject||"Conversation"),c("Messages",String(r.message_count)),c("Unread",String(r.unread_count)),c("With",r.participants.join(", "));for(let o of r.messages)console.log(`
|
|
179
|
-
${T.default.bold(o.direction==="out"?"\u2192":"\u2190")} ${o.from} ${T.default.dim(o.created_at.slice(0,16))}${o.labels?.length?` ${T.default.dim(`[${o.labels.join(", ")}]`)}`:""} ${T.default.dim(o.id)}`),o.text&&console.log(` ${o.text.replace(/\s+/g," ").trim().slice(0,300)}`)}async function Xc(e){let{address:t}=Lt(e,"Usage: domani email label --from hi@myapp.dev --message-ids m1,m2 --add billing[,urgent] [--remove old] | --set a,b"),n=Ni(e.messageIds),i=Ni(e.add),s=Ni(e.remove),r=e.set===void 0?void 0:Ni(e.set);(!n.length||!i.length&&!s.length&&r===void 0)&&u("Message IDs and labels required",{hint:"Usage: domani email label --from hi@myapp.dev --message-ids m1,m2 --add billing[,urgent] [--remove old] | --set a,b",code:"validation_error",json:e.json,fields:e.fields});let o={message_ids:n,action:"label",idempotency_key:e.idempotencyKey||(0,cr.randomUUID)()};i.length&&(o.add=i),s.length&&(o.remove=s),r!==void 0&&(o.set=r);let a=await x(`/api/emails/${encodeURIComponent(t)}/messages/actions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}),d=await a.json();if(a.ok||u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields}),e.json)return b(d,e.fields);let f=d.results||[];j("Labels"),B(["Message","Result"],f.map(m=>[m.message_id,m.ok?m.changed?"updated":"unchanged":m.error?.message||"failed"]),[30,40])}async function Zc(e,t){let n=t.messageIds||(e&&!e.includes("@")?e:void 0),{address:i}=Lt(t,"Usage: domani email facts <message_id> --from hi@myapp.dev");n||u("Message ID required",{hint:"Usage: domani email facts <message_id> --from hi@myapp.dev",code:"validation_error",json:t.json,fields:t.fields});let s=await x(`/api/emails/${encodeURIComponent(i)}/messages/${encodeURIComponent(n)}/facts`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);if(j("Facts"),!r.analysed){c("Analysed","no"),c("Reason",r.reason),_e(r.reason==="not_enabled"?"Enable the mailbox in the assistant: domani assistant set --enable --mailboxes <id>":"The analysis has not happened yet; try again in a minute.");return}c("Analysis",`${r.analysis.id} (${r.analysis.generated_at.slice(0,16)}, ${r.analysis.coverage})`),r.facts.length?B(["Subject","Predicate","Value","Basis"],r.facts.map(o=>[(o.subject||"").slice(0,28),(o.predicate||"").slice(0,28),`${o.value?.value??o.object??""}${o.value?.currency?` ${o.value.currency}`:""}`.slice(0,32),o.basis||""]),[30,30,34,18]):console.log(` ${T.default.dim("No claim recorded.")}`);for(let o of r.commitments)c("Promised",`${o.who}: ${o.what}`);for(let o of r.expectations)c("Awaited",`${o.who}: ${o.what}`)}async function Qc(e,t){let n=t.messageIds||(e&&!e.includes("@")?e:void 0),i=`Usage: domani email extract <message_id> --from hi@myapp.dev --schema '{"type":"object","properties":{"total":{"type":"number"}}}' [--instructions "amounts in EUR"] (or --schema @fields.json)`,{address:s}=Lt(t,i);(!n||!t.schema)&&u("Message ID and --schema required",{hint:i,code:"validation_error",json:t.json,fields:t.fields});let r;try{let d=t.schema.startsWith("@")?(0,ua.readFileSync)(t.schema.slice(1),"utf8"):t.schema;r=JSON.parse(d)}catch(d){u("Schema must be JSON (inline or @file)",{hint:d instanceof Error?d.message:String(d),code:"validation_error",json:t.json,fields:t.fields})}let o=await x(`/api/emails/${encodeURIComponent(s)}/messages/${encodeURIComponent(n)}/extract`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({schema:r,...t.instructions?{instructions:t.instructions}:{}})}),a=await o.json();if(o.ok||u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields}),t.json)return b(a,t.fields);j("Extraction"),c("Confidence",String(a.confidence)),c("Cached",a.cached?"yes":"no"),c("Model",a.model);for(let[d,f]of Object.entries(a.data))c(d,f===null?T.default.dim("null"):typeof f=="object"?JSON.stringify(f):String(f));for(let d of a.evidence_quotes)console.log(` ${T.default.dim(`"${d.slice(0,120)}"`)}`)}async function eu(e){let t=(e.mailboxIds||"").split(",").map(r=>r.trim()).filter(Boolean);t.length||u("Mailbox IDs required",{hint:"Usage: domani email work --mailbox-ids mb_1,mb_2",code:"validation_error",json:e.json,fields:e.fields});let n=new URLSearchParams({mailbox_ids:t.join(",")});e.status&&n.set("status",e.status),e.assigned&&n.set("assigned",e.assigned),e.limit&&n.set("limit",e.limit);let i=await x(`/api/email/work-queue?${n}`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);if(j("Shared Inbox Work"),!s.items.length)return console.log(` ${T.default.dim("No conversations match this queue.")}`);B(["Thread","Status","Assignee","Subject"],s.items.map(r=>[r.thread_key,r.status,r.assignee?.label||"Unassigned",r.subject||"(no subject)"]),[28,10,28,48]),s.partial&&_e("This is a bounded snapshot. Increase --limit or use the API scan_limit when you need a wider queue.")}async function tu(e){(!e.mailboxIds||!e.threadKey)&&u("Mailbox ID and thread key required",{hint:"Usage: domani email triage --mailbox-ids mb_1 --thread-key <key> --status closed",code:"validation_error",json:e.json,fields:e.fields});let t=e.assigneeId&&e.assigneeType?{type:e.assigneeType,id:e.assigneeId}:void 0,n=await x("/api/email/collaboration",{method:"PATCH",body:JSON.stringify({mailbox_id:e.mailboxIds.split(",")[0],thread_key:e.threadKey,thread_aliases:e.threadAliases?.split(",").map(s=>s.trim()).filter(Boolean),status:e.status,assignee:t,version:e.ifVersion?Number.parseInt(e.ifVersion,10):void 0})}),i=await n.json();if(n.ok||u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields}),e.json)return b(i,e.fields);j("Conversation Updated"),c("Status",i.status),c("Assignee",i.assignee?.label||"Unassigned"),c("Version",i.version)}async function nu(e){(!e.conversationId||!e.note)&&u("Conversation ID and note required",{hint:'Usage: domani email note --conversation-id conv_1 --note "Waiting for finance"',code:"validation_error",json:e.json,fields:e.fields});let t=await x(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/notes`,{method:"POST",body:JSON.stringify({body:e.note})}),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);console.log(`${y.success} Private note added`)}async function iu(e){e.conversationId||u("Conversation ID required",{hint:"Usage: domani email notes --conversation-id conv_1",code:"validation_error",json:e.json,fields:e.fields});let t=await x(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/notes`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);if(j("Private Notes"),!n.notes.length)return console.log(` ${T.default.dim("No private notes yet.")}`);B(["Author","Created","Note"],n.notes.map(i=>[i.author.label,i.created_at,i.body]),[28,24,64])}async function su(e){e.conversationId||u("Conversation ID required",{hint:"Usage: domani email activity --conversation-id conv_1",code:"validation_error",json:e.json,fields:e.fields});let t=await x(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/activity`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);if(j("Conversation Activity"),!n.activity.length)return console.log(` ${T.default.dim("No activity yet.")}`);B(["Type","Actor","Created"],n.activity.map(i=>[i.type,i.actor.label,i.created_at]),[36,32,24])}async function ru(e){let t=await it(e);if(e.dryRun)return G("email_setup",{domain:t},e.json,e.fields);let n=O(!e.json);n.start(`Setting up email on ${$.domain(t)}`);let i=await x(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"POST"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Email ${s.status==="already_configured"?"already configured":"configured"}`),e.json){b(s,e.fields);return}if(s.records?.length){l(),j(`Email DNS Records ${$.domain(t)}`);let r=s.records.map(o=>[T.default.yellow(o.type),o.name,o.value.length>40?o.value.slice(0,40)+"...":o.value,o.status==="verified"||o.status==="created"?T.default.green(o.status):T.default.yellow(o.status)]);B(["Type","Name","Value","Status"],r,[8,28,44,12])}l(),s.hint&&_e(s.hint),A("Check status:",`domani email status --domain ${t}`),l()}async function ou(e){let t=await it(e),n=O(!e.json);n.start(`Checking email status for ${$.domain(t)}`);let i=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Status loaded`),e.json){b(s,e.fields);return}if(j(`Email ${$.domain(t)}`),c("Enabled",s.enabled?T.default.green("yes"):T.default.dim("no")),s.enabled&&(c("Verified",s.verified?T.default.green("yes"):T.default.yellow("pending")),c("Mailboxes",String(s.mailbox_count))),l(),!s.enabled)A("Set up email:",`domani email setup --domain ${t}`),l();else if(!s.verified&&s.records?.length){console.log(` ${T.default.yellow("!")} Add these DNS records to verify:`);for(let r of s.records)console.log(` ${T.default.yellow(r.type)} ${r.name} ${T.default.dim("\u2192")} ${r.value.length>50?r.value.slice(0,50)+"...":r.value}`);l()}}async function au(e){let t=await it(e);if(e.dryRun)return G("email_remove",{domain:t},e.json,e.fields);let n=O(!e.json);n.start(`Removing email from ${$.domain(t)}`);let i=await x(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"DELETE"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Email disabled`),e.json){b(s,e.fields);return}s.mailboxes_deleted>0&&console.log(` ${T.default.dim(`${s.mailboxes_deleted} mailbox(es) deleted.`)}`),l()}async function da(e){let t=O(!e.json);t.start("Loading mailboxes");let n=e.domain?`?domain=${encodeURIComponent(e.domain)}`:"",i=await x(`/api/emails${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.mailboxes||[];if(t.stop(`${y.success} ${r.length} mailbox(es)`),e.json){b(s,e.fields);return}if(r.length===0){l(),console.log(` ${T.default.dim("No mailboxes.")}`),l(),A("Create one:","domani email create hello@example.com"),l();return}l(),j("Mailboxes");let o=r.map(a=>[T.default.cyan(a.address),String(a.message_count),a.webhook_url?$.url(a.webhook_url):T.default.dim("-"),T.default.dim(new Date(a.created_at).toLocaleDateString())]);B(["Address","Messages","Webhook","Created"],o,[32,10,36,14]),l()}async function du(e){let t=await it(e);if(e.dryRun)return G("email_create_mailbox",{domain:t,slug:e.slug,workspace_id:e.workspace},e.json,e.fields);let n=e.slug;if(!n&&!e.json){let f=await Ue({message:`Email handle for @${t}:`,placeholder:"hello"});ae(f)&&process.exit(0),n=f}n||u("Slug required",{hint:`Usage: domani email create hello@${t}`,code:"validation_error",json:e.json,fields:e.fields});let i=`${n}@${t}`,s=O(!e.json);s.start("Creating mailbox");let r=await x("/api/emails",{method:"POST",body:JSON.stringify({address:i,workspace_id:e.workspace})}),o=await r.json();if(r.status===202&&!e.json){s.stop("");let f=o.txt_record,m=o.email_records||[],p=[{type:"TXT",name:f?.name||"@",value:f?.value||"",note:"ownership proof"},...m];l(),console.log(" Add these records at your DNS provider:"),l();for(let S of p){let C=S.priority!==void 0?` ${T.default.dim(`priority: ${S.priority}`)}`:"",R=S.note?` ${T.default.dim(`(${S.note})`)}`:"";console.log(` ${T.default.yellow(S.type)} ${T.default.bold(S.name)}${C}${R}`),console.log(` ${T.default.dim("\u2192")} ${T.default.cyan(S.value)}`),l()}_e("DNS propagation typically takes 5-30 minutes. Checking automatically..."),l();let g=p.map(S=>({cells:[T.default.yellow(S.type),S.name,S.note?T.default.dim(`(${S.note})`):""],status:"pending"})),v=Qt(["Type","Name",""],g,[6,24,16]);v.start();let k=0;for(;r.status===202&&k<60;)await Ot(15e3),k++,r=await x("/api/emails",{method:"POST",body:JSON.stringify({address:i,workspace_id:e.workspace})}),o=await r.json(),r.status!==202&&!r.ok&&(v.stop(),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));r.status===202&&(v.stop(),u("TXT record not detected after 15 minutes.",{hint:`Check the record is set, then retry: domani email create ${i}`,code:"timeout",json:e.json,fields:e.fields})),v.markDone(0);let w=S=>`${S.type}:${S.name}`,_=new Map;p.slice(1).forEach((S,C)=>_.set(w(S),C+1));for(let S=0;S<60;S++){await Ot(15e3);let C=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),R=await C.json();if(C.ok&&R.records){for(let M of R.records)if(M.status==="verified"||M.status==="created"){let H=_.get(w(M));H!==void 0&&v.markDone(H)}}if(C.ok&&R.verified)break}v.stop(),l()}if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),s.stop(`${y.success} ${T.default.cyan(o.address)} created`),e.json){b(o,e.fields);return}let a=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),d=await a.json();l(),a.ok&&d.verified?(A("Read inbox:",`domani email inbox ${o.address}`),A("Web inbox:",`${Sn}/inbox?address=${encodeURIComponent(o.address)}`)):(A("Check propagation:",`domani email status --domain ${t}`),A("Web inbox:",`${Sn}/inbox?address=${encodeURIComponent(o.address)}`)),l()}async function lu(e){let t=await it(e);if(e.slug||u("Slug required",{hint:"Usage: domani email delete hello@example.com",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return G("email_delete_mailbox",{domain:t,address:`${e.slug}@${t}`},e.json,e.fields);let n=O(!e.json);n.start(`Deleting ${e.slug}@${t}`);let i=encodeURIComponent(`${e.slug}@${t}`),s=await x(`/api/emails/${i}`,{method:"DELETE",body:JSON.stringify({confirm:!0})}),r=await s.json();if(s.ok||(n.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Mailbox deleted`),e.json){b(r,e.fields);return}console.log(` ${T.default.dim(`${r.address} and all messages deleted.`)}`),l()}function ma(){let e=Intl.DateTimeFormat().resolvedOptions();return{locale:e.locale,timeZone:e.timeZone}}function fa(e){let t={to:qi(Ui(e.to))},n=qi(Ui(e.cc)),i=qi(Ui(e.bcc));if(n&&(t.cc=n),i&&(t.bcc=i),e.subject&&(t.subject=e.subject),e.text&&(t.text=e.text),e.inReplyTo&&(t.in_reply_to=e.inReplyTo,e.quote!==!1)){let{locale:s,timeZone:r}=ma();t.quote_original={locale:s,time_zone:r}}return e.references&&(t.references=e.references),e.sendAt&&(t.send_at=e.sendAt),t}async function cu(e){let t=await it(e);if(e.slug||u("Slug required",{hint:'Usage: domani email send hello@example.com --to user@test.com --subject "Hi" --body "Hello"',code:"validation_error",json:e.json,fields:e.fields}),e.to||u("Recipient required",{hint:"Usage: domani email send hello@example.com --to user@test.com",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return G("email_send",{from:`${e.slug}@${t}`,to:e.to,subject:e.subject},e.json,e.fields);let n=O(!e.json);n.start(`Sending from ${e.slug}@${t}`);let i=fa(e),s=encodeURIComponent(`${e.slug}@${t}`),r=await x(`/api/emails/${s}/send`,{method:"POST",body:JSON.stringify(i)}),o=await r.json();if(!r.ok){n.stop("Failed");let d=o.code==="MONTHLY_LIMIT_EXCEEDED"?`Run ${T.default.cyan("domani upgrade")} to switch to Pro (10,000 emails/month).`:o.hint;u(o.error||o.message,{hint:d,status:r.status,json:e.json,fields:e.fields})}let a=Array.isArray(o.to)?o.to.join(", "):o.to;if(n.stop(o.status==="scheduled"?`${y.success} Scheduled for ${T.default.cyan(e.sendAt||"")} to ${T.default.cyan(a)} ${T.default.dim("(trash the message before then to cancel)")}`:`${y.success} Sent to ${T.default.cyan(a)}`),e.json){b(o,e.fields);return}}function Lt(e,t){return(!e.slug||!e.domain)&&u("Mailbox address required",{hint:t,code:"validation_error",json:e.json,fields:e.fields}),{domain:e.domain,slug:e.slug,address:`${e.slug}@${e.domain}`}}async function pa(e,t,n,i,s){let r=O(!n.json);r.start(i);let o=await x(e,{method:"POST",body:JSON.stringify(t)}),a=await o.json();o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:n.json,fields:n.fields})),r.stop(s(a)),n.json&&b(a,n.fields)}async function uu(e){let t='Usage: domani email escalate hello@example.com --message-id MSG_ID [--reason "refund over $500"] [--clear]',{address:n}=Lt(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let i={};e.reason&&(i.reason=e.reason),e.clear&&(i.clear=!0),await pa(`/api/emails/${encodeURIComponent(n)}/messages/${encodeURIComponent(e.messageId)}/escalate`,i,e,e.clear?"Clearing escalation":"Flagging for a human",s=>s.needs_human?`${y.success} Flagged for a human ${T.default.dim("(conversation held, email.escalated fired)")}`:`${y.success} Escalation cleared`)}async function mu(e){let t='Usage: domani email remind hello@example.com --message-id MSG_ID --at 2026-09-03T09:00:00Z [--note "chase the invoice"] [--clear]',{address:n}=Lt(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields}),!e.at&&!e.clear&&u("Reminder time required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let i={};e.at&&(i.remind_at=e.at),e.note&&(i.note=e.note),e.clear&&(i.clear=!0),await pa(`/api/emails/${encodeURIComponent(n)}/messages/${encodeURIComponent(e.messageId)}/remind`,i,e,e.clear?"Clearing reminder":"Setting follow-up reminder",s=>s.remind_at?`${y.success} Reminder set for ${T.default.cyan(String(s.remind_at))} ${T.default.dim("(fires only if still unanswered)")}`:`${y.success} Reminder cleared`)}function ha(e){let t=new URLSearchParams;e.q&&t.set("q",e.q),e.limit&&t.set("limit",e.limit),e.order&&t.set("order",e.order),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function fu(e){let t=await x(`/api/contacts${ha(e)}`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json){b(n,e.fields);return}let i=n.contacts||[];if(i.length===0){console.log(T.default.dim("No contacts yet. The address book fills itself as mail flows in and out."));return}for(let s of i){let r=s.name?` ${T.default.dim(s.name)}`:"",o=s.notes?` ${T.default.dim("-")} ${s.notes}`:"";console.log(`${T.default.cyan(s.address)}${r} ${T.default.dim(`(${s.message_count} msg${s.message_count!==1?"s":""}, last ${s.last_direction||"-"})`)}${o}`)}n.next_cursor&&console.log(T.default.dim(`More: --cursor ${n.next_cursor}`))}function ga(e,t){return e.slug&&e.domain?`${e.slug}@${e.domain}`:(u("Contact address required",{hint:t,code:"validation_error",json:e.json,fields:e.fields}),"")}async function pu(e){let n=ga(e,'Usage: domani email contact-add ada@example.com [--name "Ada"] [--notes "prefers short emails"]'),i={address:n};e.name!==void 0&&(i.name=e.name),e.notes!==void 0&&(i.notes=e.notes);let s=await x("/api/contacts",{method:"POST",body:JSON.stringify(i)}),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json){b(r,e.fields);return}console.log(`${y.success} Contact ${T.default.cyan(n)} saved.`)}async function hu(e){let n=ga(e,"Usage: domani email contact-remove ada@example.com"),i=await x(`/api/contacts/${encodeURIComponent(n)}`,{method:"DELETE"}),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json){b(s,e.fields);return}console.log(s.deleted?`${y.success} Contact ${T.default.cyan(n)} deleted.`:T.default.dim(`No contact ${n}.`))}async function gu(e){let t='Usage: domani email tone hello@example.com [--set "lowercase, friendly, sign as Ada"] [--clear]',{address:n}=Lt(e,t),i=encodeURIComponent(n);if(e.set===void 0&&!e.clear){let o=await x(`/api/emails/${i}`),a=await o.json();if(o.ok||u(a.error||a.message,{hint:a.hint,status:o.status,json:e.json,fields:e.fields}),e.json){b({address:n,tone_notes:a.tone_notes??null},e.fields);return}console.log(a.tone_notes?a.tone_notes:T.default.dim(`No tone notes on ${n}. Set them with --set.`));return}let s=await x(`/api/emails/${i}`,{method:"PATCH",body:JSON.stringify({tone_notes:e.clear?null:e.set})}),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json){b(r,e.fields);return}console.log(e.clear?`${y.success} Tone notes cleared on ${T.default.cyan(n)}.`:`${y.success} Tone notes set on ${T.default.cyan(n)}.`)}function ya(e){let t=new URLSearchParams;e.direction&&t.set("direction",e.direction),e.folder&&t.set("folder",e.folder),e.view&&t.set("view",e.view),e.limit&&t.set("limit",e.limit),e.since&&t.set("since",e.since),e.until&&t.set("until",e.until),e.label&&t.set("label",e.label),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function yu(e){let t=await it(e);e.slug||u("Slug required",{hint:"Usage: domani email inbox hello@example.com [--direction in|out] [--limit 20] [--cursor <next_cursor>]",code:"validation_error",json:e.json,fields:e.fields});let n=ya(e),i=O(!e.json);i.start(`Loading messages for ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),r=await x(`/api/emails/${s}/messages${n}`),o=await r.json();r.ok||(i.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));let a=o.messages||[];if(e.json){i.stop(`${y.success} ${a.length} message(s)`),b(o,e.fields);return}if(a.length===0){i.stop(`${T.default.dim("No messages")}`);return}let d=a.length>1?"s":"";i.stop(`${y.success} ${T.default.cyan(`${e.slug}@${t}`)} ${T.default.dim("\xB7 "+a.length+" message"+d)}`);for(let f of a){let m=f.direction==="in"?T.default.green("in "):T.default.dim("out"),p=f.direction==="in"?f.from:f.to,g=f.subject||"(no subject)",v=T.default.dim(new Date(f.created_at).toLocaleString()),k=g;if(f.text){let w=f.text.replace(/\s+/g," ").trim(),_=w.length>60?w.slice(0,60)+"\u2026":w;k=`${g} ${T.default.dim("- "+_)}`}console.log(` ${m} ${p.padEnd(30)} ${k} ${v}`)}o.next_cursor&&console.log(T.default.dim(`More: --cursor ${o.next_cursor}`))}async function bu(e){let t=await it(e);e.slug||u("Slug required",{hint:"Usage: domani email folders hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=encodeURIComponent(`${e.slug}@${t}`),i=await x(`/api/emails/${n}/folders`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);j(`Folders for ${e.slug}@${t}`);for(let r of s.folders||[])c(r.id,`${r.total} total, ${r.unread} unread`);for(let r of s.views||[])c(r.id,`${r.total} total, ${r.unread} unread`)}async function wu(e,t){let n=await it(t);t.slug||u("Slug required",{hint:`Usage: domani email ${e} hello@example.com --message-ids id1,id2`,code:"validation_error",json:t.json,fields:t.fields});let i=(t.messageIds||"").split(",").map(m=>m.trim()).filter(Boolean);i.length||u("Message IDs required",{hint:"Pass --message-ids id1,id2",code:"validation_error",json:t.json,fields:t.fields});let s={message_ids:i,idempotency_key:t.idempotencyKey||(0,cr.randomUUID)()};if((e==="archive"||e==="trash")&&Object.assign(s,{action:"move",destination:e==="archive"?"archive":"trash"}),e==="restore"&&(s.action="restore"),(e==="read"||e==="unread")&&Object.assign(s,{action:"mark_read",read:e==="read"}),(e==="star"||e==="unstar")&&Object.assign(s,{action:"star",starred:e==="star"}),t.dryRun)return G("email_messages_action",{address:`${t.slug}@${n}`,...s},t.json,t.fields);let r=encodeURIComponent(`${t.slug}@${n}`),o=await x(`/api/emails/${r}/messages/actions`,{method:"POST",body:JSON.stringify(s)}),a=await o.json();if(!o.ok&&o.status!==207&&u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields}),t.json)return b(a,t.fields);let d=(a.results||[]).filter(m=>m.ok).length,f=(a.results||[]).length-d;console.log(`${y.success} ${d} updated${f?T.default.yellow(`, ${f} failed`):""}`),a.operation_id&&(c("Operation",a.operation_id),c("Idempotency key",a.idempotency_key),a.idempotent_replay&&c("Receipt","replayed (no duplicate mutation)"))}async function vu(e){let t=await it(e);e.slug||u("Slug required",{hint:"Usage: domani email webhook hello@example.com --url https://...",code:"validation_error",json:e.json,fields:e.fields});let n=`${e.slug}@${t}`,i=encodeURIComponent(n),s;try{s=tn(e)}catch(a){u(a instanceof Error?a.message:"Invalid webhook headers",{hint:"Set the named environment variable, or remove the conflicting header option.",code:"validation_error",json:e.json,fields:e.fields})}let r;if(e.events!==void 0&&(r=e.events.split(",").map(a=>a.trim()).filter(Boolean),r.length===0&&u("--events needs at least one event",{hint:"Example: --events email.received,email.bounced,email.delivered",code:"validation_error",json:e.json,fields:e.fields}),e.url||u("--url is required when changing webhook events",{hint:"Pass the existing webhook URL together with --events.",code:"validation_error",json:e.json,fields:e.fields})),!e.url&&s!==void 0&&u("--url is required when changing webhook auth headers",{hint:"Pass the existing webhook URL with --authorization-env, --api-key-env, or --clear-headers.",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return G("email_webhook",{address:n,webhook_url:e.url||null,...r!==void 0?{events:r}:{},...s!==void 0?{header_names:nn(s)}:{}},e.json,e.fields);let o=O(!e.json);if(e.url){o.start(`Setting webhook for ${n}`);let a=await x(`/api/emails/${i}/webhook`,{method:"PUT",body:JSON.stringify({url:e.url,...s!==void 0?{headers:s}:{},...r!==void 0?{events:r}:{}})}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${y.success} Webhook set`),e.json){b(d,e.fields);return}j(`Mailbox ${d.address}`),c("Webhook",$.url(d.webhook_url)),c("Events",d.events?.join(", ")||T.default.dim("email.received")),c("Auth headers",d.header_names?.join(", ")||T.default.dim("none")),c("Signing secret",T.default.dim(d.signing_secret)),l()}else{o.start(`Removing webhook for ${n}`);let a=await x(`/api/emails/${i}/webhook`,{method:"DELETE"}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${y.success} Webhook removed`),e.json){b(d,e.fields);return}j(`Mailbox ${d.address}`),c("Webhook",T.default.dim("none")),l()}}async function $u(e){let t=await it(e);e.slug||u("Slug required",{hint:"Usage: domani email webhook-test hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=`${e.slug}@${t}`;if(e.dryRun)return G("email_webhook_test",{address:n},e.json,e.fields);let i=O(!e.json);i.start(`Testing webhook for ${n}`);let s=await x(`/api/emails/${encodeURIComponent(n)}/webhook/test`,{method:"POST"}),r=await s.json();if((!s.ok||!r.success)&&(i.stop("Failed"),u(r.error||r.message||"Webhook test failed",{hint:r.hint||"Check the endpoint and sender authentication, then retry.",status:s.status,json:e.json,fields:e.fields})),i.stop(`${y.success} Test delivered`),e.json)return b(r,e.fields);j(`Mailbox ${n}`),c("Delivery",T.default.green("successful")),typeof r.status=="number"&&c("Endpoint",`HTTP ${r.status}`),l()}async function _u(e){let t=await it(e);if(e.slug||u("Slug required",{hint:"Usage: domani email forward hello@example.com --forward-to me@gmail.com",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return G("email_forward",{address:`${e.slug}@${t}`,forward_to:e.forwardTo||null},e.json,e.fields);let n=O(!e.json),i=e.forwardTo||null;n.start(`Updating forward for ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),r=await x(`/api/emails/${s}`,{method:"PATCH",body:JSON.stringify({forward_to:i})}),o=await r.json();if(r.ok||(n.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Forward ${i?"set":"removed"}`),e.json){b(o,e.fields);return}j(`Mailbox ${o.address}`),c("Forward to",o.forward_to?T.default.cyan(o.forward_to):T.default.dim("none")),l()}async function la(e,t,n){let i=O(!t);i.start(`Checking email health for ${$.domain(e)}`);let s=await x(`/api/domains/${encodeURIComponent(e)}/email/check`),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop("Email health checked"),t){b(r,n);return}if(j(`Email Health ${$.domain(r.domain)}`),r.provider?c("Provider",T.default.cyan(ur(r.provider))):c("Provider",T.default.dim("unknown")),r.mx.configured?c("MX",`${y.success} ${T.default.green("propagated")} ${T.default.dim(`(${r.mx.records.length} record${r.mx.records.length!==1?"s":""})`)}`):c("MX",`${y.error} ${T.default.red("not configured")}`),r.spf.configured?c("SPF",`${y.success} ${T.default.green(r.spf.value)}`):c("SPF",`${y.error} ${T.default.red("missing")}`),r.dmarc.configured){let o=r.dmarc.value.length>50?r.dmarc.value.slice(0,50)+"...":r.dmarc.value;c("DMARC",`${y.success} ${T.default.green(o)}`)}else c("DMARC",`${y.error} ${T.default.red("missing")}`);r.dkim.configured?c("DKIM",`${y.success} ${T.default.green("found")} ${T.default.dim(`(${r.dkim.selectors.join(", ")})`)}`):c("DKIM",`${y.warning} ${T.default.yellow("not found")}`),l(),r.mx.configured?(!r.spf.configured||!r.dmarc.configured)&&(_e("SPF and DMARC protect against email spoofing. Re-run email setup to add them."),l()):(A("Set up email:",`domani email ${e} google`),l())}async function ca(e,t,n,i){return t?wa(e,t,n,i):ba(e,n,i)}async function ba(e,t,n){let i=O(!t);i.start("Loading email providers");let s=await x(`/api/domains/${encodeURIComponent(e)}/connect`),r=await s.json();s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop("Providers loaded");let o=r.providers?.email||[];o.length===0&&u("No email providers available",{code:"not_found",json:t,fields:n});let a=await dt({message:"Choose an email provider",options:o.map(d=>({value:d.name,label:ur(d.name)}))});return ae(a)&&process.exit(0),wa(e,a,t,n)}async function wa(e,t,n,i){if(n){let f=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),m=await f.json();f.ok||u(m.error||m.message,{hint:m.hint,status:f.status,json:n,fields:i}),b(m,i);return}let s=await x(`/api/domains/${encodeURIComponent(e)}/connect?provider=${encodeURIComponent(t)}`);if(!s.ok){let f=await s.json();u(f.error||f.message,{hint:f.hint,status:s.status,json:n,fields:i})}let r=await s.json(),o=r.preview?.records??[],a=r.preview?.provider??t,d=ur(a);if(j(`Email ${$.domain(e)}`),c("Provider",T.default.cyan(d)),o.length){l(),console.log(` ${T.default.bold("DNS Records")}`);let f=[8,24,40],m=Qt(["Type","Name","Value"],o.map(S=>({cells:Vc(S),status:"pending"})),f);m.start();let p=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),g=await p.json();p.ok||(m.stop(),l(),u(g.error||g.message,{hint:g.hint,status:p.status,json:n,fields:i}));let v=g.records||[];for(let S=0;S<o.length;S++)v.find(R=>R.record.type===o[S].type&&R.record.name===o[S].name&&R.record.value===o[S].value)?.status==="already_set"||await Ot(60),m.markDone(S);await Ot(80),m.stop();let k=v.filter(S=>S.status==="created"||S.status==="updated").length,w=v.filter(S=>S.status==="already_set").length,_;w===v.length?_=`All ${w} records already set`:w>0?_=`${k} created, ${w} already set`:_=`${k} DNS records set`,l(),console.log(` ${y.success} ${T.default.green(`Email configured - ${_}`)}`)}else{let f=O(!0);f.start("Setting DNS records");let m=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),p=await m.json();m.ok||(f.stop("Failed"),u(p.error||p.message,{hint:p.hint,status:m.status,json:n,fields:i})),f.stop(`${y.success} Email configured via ${T.default.cyan(d)}`)}l(),A("Verify propagation:",`domani email ${e} --check`),l()}var T,cr,ua,Fc,Lc,fr=je(()=>{"use strict";K();On();T=N(F(),1);qe();V();we();nt();cr=require("node:crypto"),ua=require("node:fs");Di();Fc=["setup","status","remove","list","create","delete","send","inbox","folders","archive","trash","restore","read","unread","star","unstar","webhook","forward","check","connect","work","triage","notes","note","activity","changes","coordination","presence","release-presence","escalate","remind","contacts","contact-add","contact-remove","tone","search","threads","thread","label","facts","extract"],Lc={"google-workspace":"Google Workspace",fastmail:"Fastmail",proton:"Proton Mail"}});var _a={};ln(_a,{dns:()=>hr,nextDnsRecords:()=>$a});function $a(e,t,n){let i=r=>r.type===t.type&&r.name===t.name;return n==="add"&&e.some(r=>i(r)&&r.value===t.value)?{kind:"unchanged"}:n==="add"&&t.type==="CNAME"&&e.some(i)?{kind:"cname_taken"}:{kind:"write",records:[...n==="add"?e:e.filter(r=>!i(r)),{...t,ttl:3600}]}}async function hr(e,t,n,i,s,r){e||(e=await ge()),Y(e,r);let o=r?.json??!1,a=r?.type||n,d=r?.name||i,f=r?.value||s;if(!t||t==="get"){let m=O(!o);m.start(`Loading DNS for ${$.domain(e)}`);let p=await x(`/api/domains/${encodeURIComponent(e)}/dns`),g=await p.json();if(p.ok||(m.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:p.status,json:o,fields:r?.fields})),m.stop(`${g.records.length} record(s)`),o){b(g,r?.fields);return}if(g.records.length===0){l(),console.log(` ${Oe.default.dim(`No DNS records for ${e}`)}`),l(),A("Auto-configure DNS:",`domani connect ${e}`),l();return}let v=[8,24,40,8];j(`DNS ${$.domain(e)}`,v.reduce((w,_)=>w+_,0)+v.length-1);let k=g.records.map(w=>{let _=w.priority?Oe.default.dim(` pri=${w.priority}`):"";return[Oe.default.yellow(w.type),w.name,Oe.default.cyan(w.value)+_,Oe.default.dim(String(w.ttl))]});B(["Type","Name","Value","TTL"],k,v),l();return}if(t==="set"||t==="add"){let m=t==="add";if((!a||!d||!f)&&u(`Missing arguments for dns ${t}`,{hint:`Usage: domani dns <domain> ${t} --type A --name www --value 1.2.3.4`,code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return G(m?"dns_add":"dns_set",{domain:e,record:{type:a.toUpperCase(),name:d,value:f,ttl:3600}},o,r?.fields);let p=O(!o);p.start(`${m?"Adding":"Setting"} ${Oe.default.yellow(a.toUpperCase())} record`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns`),v=await g.json();g.ok||(p.stop("Failed"),u(v.error||v.message||"Could not read the current DNS records; nothing was changed.",{hint:v.hint,status:g.status,json:o,fields:r?.fields}));let k=v.records??[],w=a.toUpperCase(),_=$a(k,{type:w,name:d,value:f},m?"add":"set");if(_.kind==="unchanged"){p.stop(`${y.success} ${Oe.default.yellow(w)} ${d} ${y.arrow} ${Oe.default.cyan(f)} already exists`),o&&b({records:k,unchanged:!0},r?.fields);return}_.kind==="cname_taken"&&(p.stop("Failed"),u(`${d} already has a CNAME record; a name can hold only one.`,{hint:`Replace it with: domani dns ${e} set --type CNAME --name ${d} --value ${f}`,code:"validation_error",json:o,fields:r?.fields}));let S=_.records,C=await x(`/api/domains/${encodeURIComponent(e)}/dns`,{method:"PUT",body:JSON.stringify({records:S})}),R=await C.json();C.ok||(p.stop("Failed"),u(R.error||R.message,{hint:R.hint,status:C.status,json:o,fields:r?.fields})),p.stop(`${y.success} ${Oe.default.yellow(a.toUpperCase())} ${d} ${y.arrow} ${Oe.default.cyan(f)}`),o?b(R,r?.fields):(l(),A("Check propagation:",`domani status ${e}`),l());return}if(t==="delete"){if((!a||!d)&&u("Missing arguments for dns delete",{hint:"Usage: domani dns <domain> delete --type A --name www",code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return G("dns_delete",{domain:e,record:{type:a.toUpperCase(),name:d}},o,r?.fields);let m=O(!o);m.start(`Deleting ${Oe.default.yellow(a.toUpperCase())} ${d}`);let p=await x(`/api/domains/${encodeURIComponent(e)}/dns?type=${encodeURIComponent(a.toUpperCase())}&name=${encodeURIComponent(d)}`,{method:"DELETE"}),g=await p.json();p.ok||(m.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:p.status,json:o,fields:r?.fields})),m.stop(`${y.success} Deleted ${Oe.default.yellow(a.toUpperCase())} ${d}`),o?b(g,r?.fields):(l(),A("Check propagation:",`domani status ${e}`),l());return}if(t==="snapshot"){if(r?.dryRun)return G("dns_snapshot",{domain:e},o,r?.fields);let m=O(!o);m.start(`Capturing DNS snapshot for ${$.domain(e)}`);let p=await x(`/api/domains/${encodeURIComponent(e)}/dns/snapshot`,{method:"POST"}),g=await p.json();p.ok||(m.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:p.status,json:o,fields:r?.fields}));let v=g.records?.length??0;if(m.stop(`${y.success} Captured ${v} record(s)`),o){b(g,r?.fields);return}let k=`${e}.dns.json`,w=(0,pr.resolve)(process.cwd(),k);(0,Mi.writeFileSync)(w,JSON.stringify(g,null,2)+`
|
|
179
|
+
${T.default.bold(o.direction==="out"?"\u2192":"\u2190")} ${o.from} ${T.default.dim(o.created_at.slice(0,16))}${o.labels?.length?` ${T.default.dim(`[${o.labels.join(", ")}]`)}`:""} ${T.default.dim(o.id)}`),o.text&&console.log(` ${o.text.replace(/\s+/g," ").trim().slice(0,300)}`)}async function Xc(e){let{address:t}=Lt(e,"Usage: domani email label --from hi@myapp.dev --message-ids m1,m2 --add billing[,urgent] [--remove old] | --set a,b"),n=Ni(e.messageIds),i=Ni(e.add),s=Ni(e.remove),r=e.set===void 0?void 0:Ni(e.set);(!n.length||!i.length&&!s.length&&r===void 0)&&u("Message IDs and labels required",{hint:"Usage: domani email label --from hi@myapp.dev --message-ids m1,m2 --add billing[,urgent] [--remove old] | --set a,b",code:"validation_error",json:e.json,fields:e.fields});let o={message_ids:n,action:"label",idempotency_key:e.idempotencyKey||(0,cr.randomUUID)()};i.length&&(o.add=i),s.length&&(o.remove=s),r!==void 0&&(o.set=r);let a=await x(`/api/emails/${encodeURIComponent(t)}/messages/actions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}),d=await a.json();if(a.ok||u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields}),e.json)return b(d,e.fields);let f=d.results||[];j("Labels"),B(["Message","Result"],f.map(m=>[m.message_id,m.ok?m.changed?"updated":"unchanged":m.error?.message||"failed"]),[30,40])}async function Zc(e,t){let n=t.messageIds||(e&&!e.includes("@")?e:void 0),{address:i}=Lt(t,"Usage: domani email facts <message_id> --from hi@myapp.dev");n||u("Message ID required",{hint:"Usage: domani email facts <message_id> --from hi@myapp.dev",code:"validation_error",json:t.json,fields:t.fields});let s=await x(`/api/emails/${encodeURIComponent(i)}/messages/${encodeURIComponent(n)}/facts`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);if(j("Facts"),!r.analysed){c("Analysed","no"),c("Reason",r.reason),_e(r.reason==="not_enabled"?"Enable the mailbox in the assistant: domani assistant set --enable --mailboxes <id>":"The analysis has not happened yet; try again in a minute.");return}c("Analysis",`${r.analysis.id} (${r.analysis.generated_at.slice(0,16)}, ${r.analysis.coverage})`),r.facts.length?B(["Subject","Predicate","Value","Basis"],r.facts.map(o=>[(o.subject||"").slice(0,28),(o.predicate||"").slice(0,28),`${o.value?.value??o.object??""}${o.value?.currency?` ${o.value.currency}`:""}`.slice(0,32),o.basis||""]),[30,30,34,18]):console.log(` ${T.default.dim("No claim recorded.")}`);for(let o of r.commitments)c("Promised",`${o.who}: ${o.what}`);for(let o of r.expectations)c("Awaited",`${o.who}: ${o.what}`)}async function Qc(e,t){let n=t.messageIds||(e&&!e.includes("@")?e:void 0),i=`Usage: domani email extract <message_id> --from hi@myapp.dev --schema '{"type":"object","properties":{"total":{"type":"number"}}}' [--instructions "amounts in EUR"] (or --schema @fields.json)`,{address:s}=Lt(t,i);(!n||!t.schema)&&u("Message ID and --schema required",{hint:i,code:"validation_error",json:t.json,fields:t.fields});let r;try{let d=t.schema.startsWith("@")?(0,ua.readFileSync)(t.schema.slice(1),"utf8"):t.schema;r=JSON.parse(d)}catch(d){u("Schema must be JSON (inline or @file)",{hint:d instanceof Error?d.message:String(d),code:"validation_error",json:t.json,fields:t.fields})}let o=await x(`/api/emails/${encodeURIComponent(s)}/messages/${encodeURIComponent(n)}/extract`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({schema:r,...t.instructions?{instructions:t.instructions}:{}})}),a=await o.json();if(o.ok||u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields}),t.json)return b(a,t.fields);j("Extraction"),c("Confidence",String(a.confidence)),c("Cached",a.cached?"yes":"no"),c("Model",a.model);for(let[d,f]of Object.entries(a.data))c(d,f===null?T.default.dim("null"):typeof f=="object"?JSON.stringify(f):String(f));for(let d of a.evidence_quotes)console.log(` ${T.default.dim(`"${d.slice(0,120)}"`)}`)}async function eu(e){let t=(e.mailboxIds||"").split(",").map(r=>r.trim()).filter(Boolean);t.length||u("Mailbox IDs required",{hint:"Usage: domani email work --mailbox-ids mb_1,mb_2",code:"validation_error",json:e.json,fields:e.fields});let n=new URLSearchParams({mailbox_ids:t.join(",")});e.status&&n.set("status",e.status),e.assigned&&n.set("assigned",e.assigned),e.limit&&n.set("limit",e.limit);let i=await x(`/api/email/work-queue?${n}`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);if(j("Shared Inbox Work"),!s.items.length)return console.log(` ${T.default.dim("No conversations match this queue.")}`);B(["Thread","Status","Assignee","Subject"],s.items.map(r=>[r.thread_key,r.status,r.assignee?.label||"Unassigned",r.subject||"(no subject)"]),[28,10,28,48]),s.partial&&_e("This is a bounded snapshot. Increase --limit or use the API scan_limit when you need a wider queue.")}async function tu(e){(!e.mailboxIds||!e.threadKey)&&u("Mailbox ID and thread key required",{hint:"Usage: domani email triage --mailbox-ids mb_1 --thread-key <key> --status closed",code:"validation_error",json:e.json,fields:e.fields});let t=e.assigneeId&&e.assigneeType?{type:e.assigneeType,id:e.assigneeId}:void 0,n=await x("/api/email/collaboration",{method:"PATCH",body:JSON.stringify({mailbox_id:e.mailboxIds.split(",")[0],thread_key:e.threadKey,thread_aliases:e.threadAliases?.split(",").map(s=>s.trim()).filter(Boolean),status:e.status,assignee:t,version:e.ifVersion?Number.parseInt(e.ifVersion,10):void 0})}),i=await n.json();if(n.ok||u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields}),e.json)return b(i,e.fields);j("Conversation Updated"),c("Status",i.status),c("Assignee",i.assignee?.label||"Unassigned"),c("Version",i.version)}async function nu(e){(!e.conversationId||!e.note)&&u("Conversation ID and note required",{hint:'Usage: domani email note --conversation-id conv_1 --note "Waiting for finance"',code:"validation_error",json:e.json,fields:e.fields});let t=await x(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/notes`,{method:"POST",body:JSON.stringify({body:e.note})}),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);console.log(`${y.success} Private note added`)}async function iu(e){e.conversationId||u("Conversation ID required",{hint:"Usage: domani email notes --conversation-id conv_1",code:"validation_error",json:e.json,fields:e.fields});let t=await x(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/notes`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);if(j("Private Notes"),!n.notes.length)return console.log(` ${T.default.dim("No private notes yet.")}`);B(["Author","Created","Note"],n.notes.map(i=>[i.author.label,i.created_at,i.body]),[28,24,64])}async function su(e){e.conversationId||u("Conversation ID required",{hint:"Usage: domani email activity --conversation-id conv_1",code:"validation_error",json:e.json,fields:e.fields});let t=await x(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/activity`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);if(j("Conversation Activity"),!n.activity.length)return console.log(` ${T.default.dim("No activity yet.")}`);B(["Type","Actor","Created"],n.activity.map(i=>[i.type,i.actor.label,i.created_at]),[36,32,24])}async function ru(e){let t=await it(e);if(e.dryRun)return G("email_setup",{domain:t},e.json,e.fields);let n=O(!e.json);n.start(`Setting up email on ${$.domain(t)}`);let i=await x(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"POST"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Email ${s.status==="already_configured"?"already configured":"configured"}`),e.json){b(s,e.fields);return}if(s.records?.length){l(),j(`Email DNS Records ${$.domain(t)}`);let r=s.records.map(o=>[T.default.yellow(o.type),o.name,o.value.length>40?o.value.slice(0,40)+"...":o.value,o.status==="verified"||o.status==="created"?T.default.green(o.status):T.default.yellow(o.status)]);B(["Type","Name","Value","Status"],r,[8,28,44,12])}l(),s.hint&&_e(s.hint),A("Check status:",`domani email status --domain ${t}`),l()}async function ou(e){let t=await it(e),n=O(!e.json);n.start(`Checking email status for ${$.domain(t)}`);let i=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Status loaded`),e.json){b(s,e.fields);return}if(j(`Email ${$.domain(t)}`),c("Enabled",s.enabled?T.default.green("yes"):T.default.dim("no")),s.enabled&&(c("Verified",s.verified?T.default.green("yes"):T.default.yellow("pending")),c("Mailboxes",String(s.mailbox_count))),l(),!s.enabled)A("Set up email:",`domani email setup --domain ${t}`),l();else if(!s.verified&&s.records?.length){console.log(` ${T.default.yellow("!")} Add these DNS records to verify:`);for(let r of s.records)console.log(` ${T.default.yellow(r.type)} ${r.name} ${T.default.dim("\u2192")} ${r.value.length>50?r.value.slice(0,50)+"...":r.value}`);l()}}async function au(e){let t=await it(e);if(e.dryRun)return G("email_remove",{domain:t},e.json,e.fields);let n=O(!e.json);n.start(`Removing email from ${$.domain(t)}`);let i=await x(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"DELETE"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Email disabled`),e.json){b(s,e.fields);return}s.mailboxes_deleted>0&&console.log(` ${T.default.dim(`${s.mailboxes_deleted} mailbox(es) deleted.`)}`),l()}async function da(e){let t=O(!e.json);t.start("Loading mailboxes");let n=e.domain?`?domain=${encodeURIComponent(e.domain)}`:"",i=await x(`/api/emails${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.mailboxes||[];if(t.stop(`${y.success} ${r.length} mailbox(es)`),e.json){b(s,e.fields);return}if(r.length===0){l(),console.log(` ${T.default.dim("No mailboxes.")}`),l(),A("Create one:","domani email create hello@example.com"),l();return}l(),j("Mailboxes");let o=r.map(a=>[T.default.cyan(a.address),String(a.message_count),a.webhook_url?$.url(a.webhook_url):T.default.dim("-"),T.default.dim(new Date(a.created_at).toLocaleDateString())]);B(["Address","Messages","Webhook","Created"],o,[32,10,36,14]),l()}async function du(e){let t=await it(e);if(e.dryRun)return G("email_create_mailbox",{domain:t,slug:e.slug,workspace_id:e.workspace},e.json,e.fields);let n=e.slug;if(!n&&!e.json){let f=await Ue({message:`Email handle for @${t}:`,placeholder:"hello"});ae(f)&&process.exit(0),n=f}n||u("Slug required",{hint:`Usage: domani email create hello@${t}`,code:"validation_error",json:e.json,fields:e.fields});let i=`${n}@${t}`,s=O(!e.json);s.start("Creating mailbox");let r=await x("/api/emails",{method:"POST",body:JSON.stringify({address:i,workspace_id:e.workspace})}),o=await r.json();if(r.status===202&&!e.json){s.stop("");let f=o.txt_record,m=o.email_records||[],p=[{type:"TXT",name:f?.name||"@",value:f?.value||"",note:"ownership proof"},...m];l(),console.log(" Add these records at your DNS provider:"),l();for(let S of p){let C=S.priority!==void 0?` ${T.default.dim(`priority: ${S.priority}`)}`:"",R=S.note?` ${T.default.dim(`(${S.note})`)}`:"";console.log(` ${T.default.yellow(S.type)} ${T.default.bold(S.name)}${C}${R}`),console.log(` ${T.default.dim("\u2192")} ${T.default.cyan(S.value)}`),l()}_e("DNS propagation typically takes 5-30 minutes. Checking automatically..."),l();let g=p.map(S=>({cells:[T.default.yellow(S.type),S.name,S.note?T.default.dim(`(${S.note})`):""],status:"pending"})),v=Qt(["Type","Name",""],g,[6,24,16]);v.start();let k=0;for(;r.status===202&&k<60;)await Ot(15e3),k++,r=await x("/api/emails",{method:"POST",body:JSON.stringify({address:i,workspace_id:e.workspace})}),o=await r.json(),r.status!==202&&!r.ok&&(v.stop(),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));r.status===202&&(v.stop(),u("TXT record not detected after 15 minutes.",{hint:`Check the record is set, then retry: domani email create ${i}`,code:"timeout",json:e.json,fields:e.fields})),v.markDone(0);let w=S=>`${S.type}:${S.name}`,_=new Map;p.slice(1).forEach((S,C)=>_.set(w(S),C+1));for(let S=0;S<60;S++){await Ot(15e3);let C=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),R=await C.json();if(C.ok&&R.records){for(let M of R.records)if(M.status==="verified"||M.status==="created"){let H=_.get(w(M));H!==void 0&&v.markDone(H)}}if(C.ok&&R.verified)break}v.stop(),l()}if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),s.stop(`${y.success} ${T.default.cyan(o.address)} created`),e.json){b(o,e.fields);return}let a=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),d=await a.json();l(),a.ok&&d.verified?(A("Read inbox:",`domani email inbox ${o.address}`),A("Web inbox:",`${Sn}/inbox?address=${encodeURIComponent(o.address)}`)):(A("Check propagation:",`domani email status --domain ${t}`),A("Web inbox:",`${Sn}/inbox?address=${encodeURIComponent(o.address)}`)),l()}async function lu(e){let t=await it(e);if(e.slug||u("Slug required",{hint:"Usage: domani email delete hello@example.com",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return G("email_delete_mailbox",{domain:t,address:`${e.slug}@${t}`},e.json,e.fields);let n=O(!e.json);n.start(`Deleting ${e.slug}@${t}`);let i=encodeURIComponent(`${e.slug}@${t}`),s=await x(`/api/emails/${i}`,{method:"DELETE",body:JSON.stringify({confirm:!0})}),r=await s.json();if(s.ok||(n.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Mailbox deleted`),e.json){b(r,e.fields);return}console.log(` ${T.default.dim(`${r.address} and all messages deleted.`)}`),l()}function ma(){let e=Intl.DateTimeFormat().resolvedOptions();return{locale:e.locale,timeZone:e.timeZone}}function fa(e){let t={to:qi(Ui(e.to))},n=qi(Ui(e.cc)),i=qi(Ui(e.bcc));if(n&&(t.cc=n),i&&(t.bcc=i),e.subject&&(t.subject=e.subject),e.text&&(t.text=e.text),e.inReplyTo)if(t.in_reply_to=e.inReplyTo,e.quote!==!1){let{locale:s,timeZone:r}=ma();t.quote_original={locale:s,time_zone:r}}else t.quote_original=!1;return e.references&&(t.references=e.references),e.sendAt&&(t.send_at=e.sendAt),t}async function cu(e){let t=await it(e);if(e.slug||u("Slug required",{hint:'Usage: domani email send hello@example.com --to user@test.com --subject "Hi" --body "Hello"',code:"validation_error",json:e.json,fields:e.fields}),e.to||u("Recipient required",{hint:"Usage: domani email send hello@example.com --to user@test.com",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return G("email_send",{from:`${e.slug}@${t}`,to:e.to,subject:e.subject},e.json,e.fields);let n=O(!e.json);n.start(`Sending from ${e.slug}@${t}`);let i=fa(e),s=encodeURIComponent(`${e.slug}@${t}`),r=await x(`/api/emails/${s}/send`,{method:"POST",body:JSON.stringify(i)}),o=await r.json();if(!r.ok){n.stop("Failed");let d=o.code==="MONTHLY_LIMIT_EXCEEDED"?`Run ${T.default.cyan("domani upgrade")} to switch to Pro (10,000 emails/month).`:o.hint;u(o.error||o.message,{hint:d,status:r.status,json:e.json,fields:e.fields})}let a=Array.isArray(o.to)?o.to.join(", "):o.to;if(n.stop(o.status==="scheduled"?`${y.success} Scheduled for ${T.default.cyan(e.sendAt||"")} to ${T.default.cyan(a)} ${T.default.dim("(trash the message before then to cancel)")}`:`${y.success} Sent to ${T.default.cyan(a)}`),e.json){b(o,e.fields);return}}function Lt(e,t){return(!e.slug||!e.domain)&&u("Mailbox address required",{hint:t,code:"validation_error",json:e.json,fields:e.fields}),{domain:e.domain,slug:e.slug,address:`${e.slug}@${e.domain}`}}async function pa(e,t,n,i,s){let r=O(!n.json);r.start(i);let o=await x(e,{method:"POST",body:JSON.stringify(t)}),a=await o.json();o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:n.json,fields:n.fields})),r.stop(s(a)),n.json&&b(a,n.fields)}async function uu(e){let t='Usage: domani email escalate hello@example.com --message-id MSG_ID [--reason "refund over $500"] [--clear]',{address:n}=Lt(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let i={};e.reason&&(i.reason=e.reason),e.clear&&(i.clear=!0),await pa(`/api/emails/${encodeURIComponent(n)}/messages/${encodeURIComponent(e.messageId)}/escalate`,i,e,e.clear?"Clearing escalation":"Flagging for a human",s=>s.needs_human?`${y.success} Flagged for a human ${T.default.dim("(conversation held, email.escalated fired)")}`:`${y.success} Escalation cleared`)}async function mu(e){let t='Usage: domani email remind hello@example.com --message-id MSG_ID --at 2026-09-03T09:00:00Z [--note "chase the invoice"] [--clear]',{address:n}=Lt(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields}),!e.at&&!e.clear&&u("Reminder time required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let i={};e.at&&(i.remind_at=e.at),e.note&&(i.note=e.note),e.clear&&(i.clear=!0),await pa(`/api/emails/${encodeURIComponent(n)}/messages/${encodeURIComponent(e.messageId)}/remind`,i,e,e.clear?"Clearing reminder":"Setting follow-up reminder",s=>s.remind_at?`${y.success} Reminder set for ${T.default.cyan(String(s.remind_at))} ${T.default.dim("(fires only if still unanswered)")}`:`${y.success} Reminder cleared`)}function ha(e){let t=new URLSearchParams;e.q&&t.set("q",e.q),e.limit&&t.set("limit",e.limit),e.order&&t.set("order",e.order),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function fu(e){let t=await x(`/api/contacts${ha(e)}`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json){b(n,e.fields);return}let i=n.contacts||[];if(i.length===0){console.log(T.default.dim("No contacts yet. The address book fills itself as mail flows in and out."));return}for(let s of i){let r=s.name?` ${T.default.dim(s.name)}`:"",o=s.notes?` ${T.default.dim("-")} ${s.notes}`:"";console.log(`${T.default.cyan(s.address)}${r} ${T.default.dim(`(${s.message_count} msg${s.message_count!==1?"s":""}, last ${s.last_direction||"-"})`)}${o}`)}n.next_cursor&&console.log(T.default.dim(`More: --cursor ${n.next_cursor}`))}function ga(e,t){return e.slug&&e.domain?`${e.slug}@${e.domain}`:(u("Contact address required",{hint:t,code:"validation_error",json:e.json,fields:e.fields}),"")}async function pu(e){let n=ga(e,'Usage: domani email contact-add ada@example.com [--name "Ada"] [--notes "prefers short emails"]'),i={address:n};e.name!==void 0&&(i.name=e.name),e.notes!==void 0&&(i.notes=e.notes);let s=await x("/api/contacts",{method:"POST",body:JSON.stringify(i)}),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json){b(r,e.fields);return}console.log(`${y.success} Contact ${T.default.cyan(n)} saved.`)}async function hu(e){let n=ga(e,"Usage: domani email contact-remove ada@example.com"),i=await x(`/api/contacts/${encodeURIComponent(n)}`,{method:"DELETE"}),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json){b(s,e.fields);return}console.log(s.deleted?`${y.success} Contact ${T.default.cyan(n)} deleted.`:T.default.dim(`No contact ${n}.`))}async function gu(e){let t='Usage: domani email tone hello@example.com [--set "lowercase, friendly, sign as Ada"] [--clear]',{address:n}=Lt(e,t),i=encodeURIComponent(n);if(e.set===void 0&&!e.clear){let o=await x(`/api/emails/${i}`),a=await o.json();if(o.ok||u(a.error||a.message,{hint:a.hint,status:o.status,json:e.json,fields:e.fields}),e.json){b({address:n,tone_notes:a.tone_notes??null},e.fields);return}console.log(a.tone_notes?a.tone_notes:T.default.dim(`No tone notes on ${n}. Set them with --set.`));return}let s=await x(`/api/emails/${i}`,{method:"PATCH",body:JSON.stringify({tone_notes:e.clear?null:e.set})}),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json){b(r,e.fields);return}console.log(e.clear?`${y.success} Tone notes cleared on ${T.default.cyan(n)}.`:`${y.success} Tone notes set on ${T.default.cyan(n)}.`)}function ya(e){let t=new URLSearchParams;e.direction&&t.set("direction",e.direction),e.folder&&t.set("folder",e.folder),e.view&&t.set("view",e.view),e.limit&&t.set("limit",e.limit),e.since&&t.set("since",e.since),e.until&&t.set("until",e.until),e.label&&t.set("label",e.label),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function yu(e){let t=await it(e);e.slug||u("Slug required",{hint:"Usage: domani email inbox hello@example.com [--direction in|out] [--limit 20] [--cursor <next_cursor>]",code:"validation_error",json:e.json,fields:e.fields});let n=ya(e),i=O(!e.json);i.start(`Loading messages for ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),r=await x(`/api/emails/${s}/messages${n}`),o=await r.json();r.ok||(i.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));let a=o.messages||[];if(e.json){i.stop(`${y.success} ${a.length} message(s)`),b(o,e.fields);return}if(a.length===0){i.stop(`${T.default.dim("No messages")}`);return}let d=a.length>1?"s":"";i.stop(`${y.success} ${T.default.cyan(`${e.slug}@${t}`)} ${T.default.dim("\xB7 "+a.length+" message"+d)}`);for(let f of a){let m=f.direction==="in"?T.default.green("in "):T.default.dim("out"),p=f.direction==="in"?f.from:f.to,g=f.subject||"(no subject)",v=T.default.dim(new Date(f.created_at).toLocaleString()),k=g;if(f.text){let w=f.text.replace(/\s+/g," ").trim(),_=w.length>60?w.slice(0,60)+"\u2026":w;k=`${g} ${T.default.dim("- "+_)}`}console.log(` ${m} ${p.padEnd(30)} ${k} ${v}`)}o.next_cursor&&console.log(T.default.dim(`More: --cursor ${o.next_cursor}`))}async function bu(e){let t=await it(e);e.slug||u("Slug required",{hint:"Usage: domani email folders hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=encodeURIComponent(`${e.slug}@${t}`),i=await x(`/api/emails/${n}/folders`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);j(`Folders for ${e.slug}@${t}`);for(let r of s.folders||[])c(r.id,`${r.total} total, ${r.unread} unread`);for(let r of s.views||[])c(r.id,`${r.total} total, ${r.unread} unread`)}async function wu(e,t){let n=await it(t);t.slug||u("Slug required",{hint:`Usage: domani email ${e} hello@example.com --message-ids id1,id2`,code:"validation_error",json:t.json,fields:t.fields});let i=(t.messageIds||"").split(",").map(m=>m.trim()).filter(Boolean);i.length||u("Message IDs required",{hint:"Pass --message-ids id1,id2",code:"validation_error",json:t.json,fields:t.fields});let s={message_ids:i,idempotency_key:t.idempotencyKey||(0,cr.randomUUID)()};if((e==="archive"||e==="trash")&&Object.assign(s,{action:"move",destination:e==="archive"?"archive":"trash"}),e==="restore"&&(s.action="restore"),(e==="read"||e==="unread")&&Object.assign(s,{action:"mark_read",read:e==="read"}),(e==="star"||e==="unstar")&&Object.assign(s,{action:"star",starred:e==="star"}),t.dryRun)return G("email_messages_action",{address:`${t.slug}@${n}`,...s},t.json,t.fields);let r=encodeURIComponent(`${t.slug}@${n}`),o=await x(`/api/emails/${r}/messages/actions`,{method:"POST",body:JSON.stringify(s)}),a=await o.json();if(!o.ok&&o.status!==207&&u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields}),t.json)return b(a,t.fields);let d=(a.results||[]).filter(m=>m.ok).length,f=(a.results||[]).length-d;console.log(`${y.success} ${d} updated${f?T.default.yellow(`, ${f} failed`):""}`),a.operation_id&&(c("Operation",a.operation_id),c("Idempotency key",a.idempotency_key),a.idempotent_replay&&c("Receipt","replayed (no duplicate mutation)"))}async function vu(e){let t=await it(e);e.slug||u("Slug required",{hint:"Usage: domani email webhook hello@example.com --url https://...",code:"validation_error",json:e.json,fields:e.fields});let n=`${e.slug}@${t}`,i=encodeURIComponent(n),s;try{s=tn(e)}catch(a){u(a instanceof Error?a.message:"Invalid webhook headers",{hint:"Set the named environment variable, or remove the conflicting header option.",code:"validation_error",json:e.json,fields:e.fields})}let r;if(e.events!==void 0&&(r=e.events.split(",").map(a=>a.trim()).filter(Boolean),r.length===0&&u("--events needs at least one event",{hint:"Example: --events email.received,email.bounced,email.delivered",code:"validation_error",json:e.json,fields:e.fields}),e.url||u("--url is required when changing webhook events",{hint:"Pass the existing webhook URL together with --events.",code:"validation_error",json:e.json,fields:e.fields})),!e.url&&s!==void 0&&u("--url is required when changing webhook auth headers",{hint:"Pass the existing webhook URL with --authorization-env, --api-key-env, or --clear-headers.",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return G("email_webhook",{address:n,webhook_url:e.url||null,...r!==void 0?{events:r}:{},...s!==void 0?{header_names:nn(s)}:{}},e.json,e.fields);let o=O(!e.json);if(e.url){o.start(`Setting webhook for ${n}`);let a=await x(`/api/emails/${i}/webhook`,{method:"PUT",body:JSON.stringify({url:e.url,...s!==void 0?{headers:s}:{},...r!==void 0?{events:r}:{}})}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${y.success} Webhook set`),e.json){b(d,e.fields);return}j(`Mailbox ${d.address}`),c("Webhook",$.url(d.webhook_url)),c("Events",d.events?.join(", ")||T.default.dim("email.received")),c("Auth headers",d.header_names?.join(", ")||T.default.dim("none")),c("Signing secret",T.default.dim(d.signing_secret)),l()}else{o.start(`Removing webhook for ${n}`);let a=await x(`/api/emails/${i}/webhook`,{method:"DELETE"}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${y.success} Webhook removed`),e.json){b(d,e.fields);return}j(`Mailbox ${d.address}`),c("Webhook",T.default.dim("none")),l()}}async function $u(e){let t=await it(e);e.slug||u("Slug required",{hint:"Usage: domani email webhook-test hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=`${e.slug}@${t}`;if(e.dryRun)return G("email_webhook_test",{address:n},e.json,e.fields);let i=O(!e.json);i.start(`Testing webhook for ${n}`);let s=await x(`/api/emails/${encodeURIComponent(n)}/webhook/test`,{method:"POST"}),r=await s.json();if((!s.ok||!r.success)&&(i.stop("Failed"),u(r.error||r.message||"Webhook test failed",{hint:r.hint||"Check the endpoint and sender authentication, then retry.",status:s.status,json:e.json,fields:e.fields})),i.stop(`${y.success} Test delivered`),e.json)return b(r,e.fields);j(`Mailbox ${n}`),c("Delivery",T.default.green("successful")),typeof r.status=="number"&&c("Endpoint",`HTTP ${r.status}`),l()}async function _u(e){let t=await it(e);if(e.slug||u("Slug required",{hint:"Usage: domani email forward hello@example.com --forward-to me@gmail.com",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return G("email_forward",{address:`${e.slug}@${t}`,forward_to:e.forwardTo||null},e.json,e.fields);let n=O(!e.json),i=e.forwardTo||null;n.start(`Updating forward for ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),r=await x(`/api/emails/${s}`,{method:"PATCH",body:JSON.stringify({forward_to:i})}),o=await r.json();if(r.ok||(n.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Forward ${i?"set":"removed"}`),e.json){b(o,e.fields);return}j(`Mailbox ${o.address}`),c("Forward to",o.forward_to?T.default.cyan(o.forward_to):T.default.dim("none")),l()}async function la(e,t,n){let i=O(!t);i.start(`Checking email health for ${$.domain(e)}`);let s=await x(`/api/domains/${encodeURIComponent(e)}/email/check`),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop("Email health checked"),t){b(r,n);return}if(j(`Email Health ${$.domain(r.domain)}`),r.provider?c("Provider",T.default.cyan(ur(r.provider))):c("Provider",T.default.dim("unknown")),r.mx.configured?c("MX",`${y.success} ${T.default.green("propagated")} ${T.default.dim(`(${r.mx.records.length} record${r.mx.records.length!==1?"s":""})`)}`):c("MX",`${y.error} ${T.default.red("not configured")}`),r.spf.configured?c("SPF",`${y.success} ${T.default.green(r.spf.value)}`):c("SPF",`${y.error} ${T.default.red("missing")}`),r.dmarc.configured){let o=r.dmarc.value.length>50?r.dmarc.value.slice(0,50)+"...":r.dmarc.value;c("DMARC",`${y.success} ${T.default.green(o)}`)}else c("DMARC",`${y.error} ${T.default.red("missing")}`);r.dkim.configured?c("DKIM",`${y.success} ${T.default.green("found")} ${T.default.dim(`(${r.dkim.selectors.join(", ")})`)}`):c("DKIM",`${y.warning} ${T.default.yellow("not found")}`),l(),r.mx.configured?(!r.spf.configured||!r.dmarc.configured)&&(_e("SPF and DMARC protect against email spoofing. Re-run email setup to add them."),l()):(A("Set up email:",`domani email ${e} google`),l())}async function ca(e,t,n,i){return t?wa(e,t,n,i):ba(e,n,i)}async function ba(e,t,n){let i=O(!t);i.start("Loading email providers");let s=await x(`/api/domains/${encodeURIComponent(e)}/connect`),r=await s.json();s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop("Providers loaded");let o=r.providers?.email||[];o.length===0&&u("No email providers available",{code:"not_found",json:t,fields:n});let a=await dt({message:"Choose an email provider",options:o.map(d=>({value:d.name,label:ur(d.name)}))});return ae(a)&&process.exit(0),wa(e,a,t,n)}async function wa(e,t,n,i){if(n){let f=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),m=await f.json();f.ok||u(m.error||m.message,{hint:m.hint,status:f.status,json:n,fields:i}),b(m,i);return}let s=await x(`/api/domains/${encodeURIComponent(e)}/connect?provider=${encodeURIComponent(t)}`);if(!s.ok){let f=await s.json();u(f.error||f.message,{hint:f.hint,status:s.status,json:n,fields:i})}let r=await s.json(),o=r.preview?.records??[],a=r.preview?.provider??t,d=ur(a);if(j(`Email ${$.domain(e)}`),c("Provider",T.default.cyan(d)),o.length){l(),console.log(` ${T.default.bold("DNS Records")}`);let f=[8,24,40],m=Qt(["Type","Name","Value"],o.map(S=>({cells:Vc(S),status:"pending"})),f);m.start();let p=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),g=await p.json();p.ok||(m.stop(),l(),u(g.error||g.message,{hint:g.hint,status:p.status,json:n,fields:i}));let v=g.records||[];for(let S=0;S<o.length;S++)v.find(R=>R.record.type===o[S].type&&R.record.name===o[S].name&&R.record.value===o[S].value)?.status==="already_set"||await Ot(60),m.markDone(S);await Ot(80),m.stop();let k=v.filter(S=>S.status==="created"||S.status==="updated").length,w=v.filter(S=>S.status==="already_set").length,_;w===v.length?_=`All ${w} records already set`:w>0?_=`${k} created, ${w} already set`:_=`${k} DNS records set`,l(),console.log(` ${y.success} ${T.default.green(`Email configured - ${_}`)}`)}else{let f=O(!0);f.start("Setting DNS records");let m=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),p=await m.json();m.ok||(f.stop("Failed"),u(p.error||p.message,{hint:p.hint,status:m.status,json:n,fields:i})),f.stop(`${y.success} Email configured via ${T.default.cyan(d)}`)}l(),A("Verify propagation:",`domani email ${e} --check`),l()}var T,cr,ua,Fc,Lc,fr=je(()=>{"use strict";K();On();T=N(F(),1);qe();V();we();nt();cr=require("node:crypto"),ua=require("node:fs");Di();Fc=["setup","status","remove","list","create","delete","send","inbox","folders","archive","trash","restore","read","unread","star","unstar","webhook","forward","check","connect","work","triage","notes","note","activity","changes","coordination","presence","release-presence","escalate","remind","contacts","contact-add","contact-remove","tone","search","threads","thread","label","facts","extract"],Lc={"google-workspace":"Google Workspace",fastmail:"Fastmail",proton:"Proton Mail"}});var _a={};ln(_a,{dns:()=>hr,nextDnsRecords:()=>$a});function $a(e,t,n){let i=r=>r.type===t.type&&r.name===t.name;return n==="add"&&e.some(r=>i(r)&&r.value===t.value)?{kind:"unchanged"}:n==="add"&&t.type==="CNAME"&&e.some(i)?{kind:"cname_taken"}:{kind:"write",records:[...n==="add"?e:e.filter(r=>!i(r)),{...t,ttl:3600}]}}async function hr(e,t,n,i,s,r){e||(e=await ge()),Y(e,r);let o=r?.json??!1,a=r?.type||n,d=r?.name||i,f=r?.value||s;if(!t||t==="get"){let m=O(!o);m.start(`Loading DNS for ${$.domain(e)}`);let p=await x(`/api/domains/${encodeURIComponent(e)}/dns`),g=await p.json();if(p.ok||(m.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:p.status,json:o,fields:r?.fields})),m.stop(`${g.records.length} record(s)`),o){b(g,r?.fields);return}if(g.records.length===0){l(),console.log(` ${Oe.default.dim(`No DNS records for ${e}`)}`),l(),A("Auto-configure DNS:",`domani connect ${e}`),l();return}let v=[8,24,40,8];j(`DNS ${$.domain(e)}`,v.reduce((w,_)=>w+_,0)+v.length-1);let k=g.records.map(w=>{let _=w.priority?Oe.default.dim(` pri=${w.priority}`):"";return[Oe.default.yellow(w.type),w.name,Oe.default.cyan(w.value)+_,Oe.default.dim(String(w.ttl))]});B(["Type","Name","Value","TTL"],k,v),l();return}if(t==="set"||t==="add"){let m=t==="add";if((!a||!d||!f)&&u(`Missing arguments for dns ${t}`,{hint:`Usage: domani dns <domain> ${t} --type A --name www --value 1.2.3.4`,code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return G(m?"dns_add":"dns_set",{domain:e,record:{type:a.toUpperCase(),name:d,value:f,ttl:3600}},o,r?.fields);let p=O(!o);p.start(`${m?"Adding":"Setting"} ${Oe.default.yellow(a.toUpperCase())} record`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns`),v=await g.json();g.ok||(p.stop("Failed"),u(v.error||v.message||"Could not read the current DNS records; nothing was changed.",{hint:v.hint,status:g.status,json:o,fields:r?.fields}));let k=v.records??[],w=a.toUpperCase(),_=$a(k,{type:w,name:d,value:f},m?"add":"set");if(_.kind==="unchanged"){p.stop(`${y.success} ${Oe.default.yellow(w)} ${d} ${y.arrow} ${Oe.default.cyan(f)} already exists`),o&&b({records:k,unchanged:!0},r?.fields);return}_.kind==="cname_taken"&&(p.stop("Failed"),u(`${d} already has a CNAME record; a name can hold only one.`,{hint:`Replace it with: domani dns ${e} set --type CNAME --name ${d} --value ${f}`,code:"validation_error",json:o,fields:r?.fields}));let S=_.records,C=await x(`/api/domains/${encodeURIComponent(e)}/dns`,{method:"PUT",body:JSON.stringify({records:S})}),R=await C.json();C.ok||(p.stop("Failed"),u(R.error||R.message,{hint:R.hint,status:C.status,json:o,fields:r?.fields})),p.stop(`${y.success} ${Oe.default.yellow(a.toUpperCase())} ${d} ${y.arrow} ${Oe.default.cyan(f)}`),o?b(R,r?.fields):(l(),A("Check propagation:",`domani status ${e}`),l());return}if(t==="delete"){if((!a||!d)&&u("Missing arguments for dns delete",{hint:"Usage: domani dns <domain> delete --type A --name www",code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return G("dns_delete",{domain:e,record:{type:a.toUpperCase(),name:d}},o,r?.fields);let m=O(!o);m.start(`Deleting ${Oe.default.yellow(a.toUpperCase())} ${d}`);let p=await x(`/api/domains/${encodeURIComponent(e)}/dns?type=${encodeURIComponent(a.toUpperCase())}&name=${encodeURIComponent(d)}`,{method:"DELETE"}),g=await p.json();p.ok||(m.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:p.status,json:o,fields:r?.fields})),m.stop(`${y.success} Deleted ${Oe.default.yellow(a.toUpperCase())} ${d}`),o?b(g,r?.fields):(l(),A("Check propagation:",`domani status ${e}`),l());return}if(t==="snapshot"){if(r?.dryRun)return G("dns_snapshot",{domain:e},o,r?.fields);let m=O(!o);m.start(`Capturing DNS snapshot for ${$.domain(e)}`);let p=await x(`/api/domains/${encodeURIComponent(e)}/dns/snapshot`,{method:"POST"}),g=await p.json();p.ok||(m.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:p.status,json:o,fields:r?.fields}));let v=g.records?.length??0;if(m.stop(`${y.success} Captured ${v} record(s)`),o){b(g,r?.fields);return}let k=`${e}.dns.json`,w=(0,pr.resolve)(process.cwd(),k);(0,Mi.writeFileSync)(w,JSON.stringify(g,null,2)+`
|
|
180
180
|
`),j("DNS Snapshot"),c("Domain",$.domain(g.domain)),c("Records",String(v)),c("Subdomains",String(g.subdomains?.length??0)),c("Sources",(g.sources||[]).join(", ")||"none"),c("Captured",g.capturedAt||g.captured_at||"now"),c("Saved to",Oe.default.cyan(k)),l(),A("Restore from this snapshot:",`domani dns ${e} restore --file ${k}`),l();return}if(t==="restore"){if(r?.dryRun)return G("dns_restore",{domain:e,source:r?.file||"server_backup"},o,r?.fields);let m=O(!o),p;if(r?.file){let k=(0,pr.resolve)(process.cwd(),r.file);k.startsWith(process.cwd())||u("File path must be within the current directory",{hint:`Got: ${r.file}`,code:"validation_error",json:o,fields:r?.fields});try{let w=(0,Mi.readFileSync)(k,"utf-8"),_=JSON.parse(w);p=JSON.stringify({snapshot:_}),m.start(`Restoring DNS for ${$.domain(e)} from ${Oe.default.cyan(r.file)}`)}catch(w){u(`Failed to read snapshot file: ${w instanceof Error?w.message:"unknown"}`,{hint:`Make sure ${r.file} exists and contains valid JSON.`,code:"validation_error",json:o,fields:r?.fields})}}else m.start(`Restoring DNS for ${$.domain(e)} from server backup`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns/restore`,{method:"POST",...p?{body:p}:{}}),v=await g.json();if(g.ok||(m.stop("Failed"),u(v.error||v.message,{hint:v.hint,status:g.status,json:o,fields:r?.fields})),m.stop(`${y.success} Restored DNS`),o){b(v,r?.fields);return}if(j("DNS Restored"),c("Domain",$.domain(v.domain)),c("Applied",Oe.default.green(String(v.applied??0))),c("Skipped",Oe.default.dim(String(v.skipped??0))),v.errors?.length>0){c("Errors",Oe.default.red(String(v.errors.length)));for(let k of v.errors)console.log(` ${Oe.default.red("\u2022")} ${k}`)}l(),A("Verify DNS records:",`domani dns ${e}`),l();return}u(`Unknown action: ${t}`,{hint:"Use 'get', 'set', 'add', 'delete', 'snapshot', or 'restore'.",code:"validation_error",json:o,fields:r?.fields})}var Oe,Mi,pr,gr=je(()=>{"use strict";K();Oe=N(F(),1);V();we();nt();Mi=require("node:fs"),pr=require("node:path")});var ka={};ln(ka,{status:()=>yr});function ku(e){return[lt.default.yellow(e.type),e.name,lt.default.cyan(e.value)+(e.priority?lt.default.dim(` pri=${e.priority}`):"")]}function xu(e){if(j(`Status ${$.domain(e.domain)}`),e.expires){let t=new Date(e.expires).toLocaleDateString(),n=e.days_until_expiry,i=n!=null&&n<30?lt.default.red:n!=null&&n<90?lt.default.yellow:lt.default.green;c("Expires",`${t} ${lt.default.dim("(")}${i(`${n} days`)}${lt.default.dim(")")}`)}}async function yr(e,t){if(e||(e=await ge()),Y(e,t),t.json){let p=await x(`/api/domains/${encodeURIComponent(e)}/status`),g=await p.json();p.ok||u(g.error||g.message,{hint:g.hint,status:p.status,json:t.json,fields:t.fields}),b(g,t.fields);return}let n=O(!0);n.start(`Checking ${$.domain(e)}`);let i;try{i=await x(`/api/domains/${encodeURIComponent(e)}/status`,{headers:{Accept:"text/event-stream"},signal:AbortSignal.timeout(t.timeout?parseInt(t.timeout,10)*1e3:3e4)})}catch{n.stop("Failed"),u("Request timed out",{hint:"The status check took too long. Try again.",code:"timeout",json:t.json,fields:t.fields})}if(!i.ok){n.stop("Failed");try{let p=await i.json();u(p.error||p.message,{hint:p.hint,status:i.status,json:t.json,fields:t.fields})}catch{u(`Server error (${i.status})`,{status:i.status,json:t.json,fields:t.fields})}}let s=i.body;s||(n.stop("Failed"),u("Empty response"));let r=new TextDecoder,o="",a=null,d=[],f=!1,m="";try{for await(let p of s){o+=r.decode(p,{stream:!0});let g=o.split(`
|
|
181
181
|
`);o=g.pop()??"";for(let v of g)if(v.startsWith("event: "))m=v.slice(7);else if(v.startsWith("data: ")){let k=JSON.parse(v.slice(6));if(m==="info"&&(n.stop("Status retrieved"),f=!0,xu(k)),m==="records")if(d=k,d.length>0){l(),console.log(` ${lt.default.bold("DNS Records")}`);let w=[8,10,34];a=Qt(["Type","Name","Value"],d.map(_=>({cells:ku(_),status:"pending"})),w),a.start()}else l(),c("DNS",lt.default.dim("no records")),A("Auto-configure DNS:",`domani connect ${e}`);if(m==="propagation"&&a){let{index:w,propagated:_}=k,S=_?y.success:`${y.warning}`;a.markDone(w,S)}m==="done"&&a&&a.stop(),m==="error"&&(f||n.stop("Failed"),a&&a.stop(),u(k.message||"Status check failed"))}}}catch{f||n.stop("Failed"),a&&a.stop(),u("Connection lost",{hint:"The status check was interrupted. Try again.",code:"connection_lost",json:t.json,fields:t.fields})}f||n.stop("Done"),l()}var lt,br=je(()=>{"use strict";K();lt=N(F(),1);V();we();nt()});var Ln={};ln(Ln,{buy:()=>vr});async function wr(e){let t=await dt({message:`What's next for ${Ce.default.cyan(e)}?`,options:[{value:"connect",label:"Connect to a service",hint:"domani connect"},{value:"email",label:"Set up email",hint:"domani email setup"},{value:"dns",label:"Configure DNS",hint:"domani dns"},{value:"status",label:"Check status & DNS propagation",hint:"domani status"},{value:"done",label:"Done"}]});if(ae(t)||t==="done"){l();return}if(l(),t==="connect"){let{connect:n}=await Promise.resolve().then(()=>(dr(),aa));await n(e,void 0,{})}else if(t==="email"){let n=await Ue({message:`Mailbox name for ${Ce.default.cyan(e)}`,placeholder:"e.g. hey, hello, contact"});if(ae(n)||!n){l();return}l();let{email:i}=await Promise.resolve().then(()=>(fr(),va));await i("create",void 0,{domain:e,slug:n})}else if(t==="dns"){let{dns:n}=await Promise.resolve().then(()=>(gr(),_a));await n(e)}else if(t==="status"){let{status:n}=await Promise.resolve().then(()=>(br(),ka));await n(e,{})}}async function xa(e,t,n){let i=O(!n.json);i.start("Purchasing");let s=await x("/api/domains/buy",{method:"POST",headers:{Accept:"text/event-stream"},body:JSON.stringify({domain:e,...t!==void 0?{max_price:t}:{}})});if(!s.ok||!s.body){let m=await s.json().catch(()=>({})),p=Ft(m);if(p!==void 0)return i.stop("Price changed - nothing was charged"),{refused:{price:p,error:m.error,renewal_price:m.renewal_price,listed_price:m.listed_price}};i.stop("Purchase failed"),u(m.error||m.message,{hint:m.hint,fixUrl:m.setup_url||m.payment_options?.card?.setup_url,status:s.status,json:n.json,fields:n.fields})}let r={},o=new TextDecoder,a="",d="";for await(let m of s.body){a+=o.decode(m,{stream:!0});let p=a.split(`
|
|
182
182
|
`);a=p.pop()??"";for(let g of p)if(g.startsWith("event: "))d=g.slice(7).trim();else if(g.startsWith("data: ")){let v=JSON.parse(g.slice(6));if(d==="checking")i.message(`Checking ${$.domain(v.domain)}`);else if(d==="payment")i.message(`Charging ${$.price(v.total)}`);else if(d==="registering")i.message(`Registering ${$.domain(v.domain)}`);else if(d==="registered")r=v;else if(d==="error"){let k=Ft(v);if(k!==void 0)return i.stop("Price changed - nothing was charged"),{refused:{price:k,error:v.error,renewal_price:v.renewal_price,listed_price:v.listed_price}};i.stop("Purchase failed"),u(v.error,{hint:v.hint,fixUrl:v.setup_url,status:s.status,json:n.json,fields:n.fields})}}}let f=r.expires?Ce.default.dim(` \xB7 expires ${new Date(r.expires).toLocaleDateString()}`):"";return i.stop(`${y.success} ${$.domain(r.domain)} is yours!${f}`),{registered:r}}async function ju(e,t){Y(e,t);let n=en(t.maxPrice,t),i;if(t.preChecked)i={available:!0,...t.preChecked};else{let a=O(!t.json);a.start(`Checking ${$.domain(e)}`);let d=await x(`/api/domains/search?q=${encodeURIComponent(e)}`);i=await d.json(),d.ok||(a.stop("Search failed"),u(i.error,{hint:i.hint,status:d.status,json:t.json,fields:t.fields})),i.available||(a.stop(`${y.error} ${$.domain(e)} is not available`),u(`${e} is not available`,{code:"not_available",json:t.json,fields:t.fields})),a.stop(`${y.success} ${$.domain(e)} ${y.dot} available ${y.dot} ${Ce.default.green(tt(i.price,i.renewal_price))}`)}let s=n??(typeof i.price=="number"?qn(i.price):void 0);if(t.dryRun)return G("buy",{domain:e,available:!0,price:i.price,...i.renewal_price!==void 0?{renewal_price:i.renewal_price}:{},currency:i.currency||"USD",max_price:s,acting_as:xt()},t.json,t.fields);if(!St(t)){let a=await We({message:`Purchase ${Ce.default.bold(e)} for ${Ce.default.green(tt(i.price,i.renewal_price))}${Ut()}?`});if(!a||typeof a=="symbol"){console.log(` ${Ce.default.dim("Cancelled.")}`);return}}let r=await xa(e,s,t);for(;"refused"in r;){let a=await Mn(r.refused.price,s??i.price,r.refused,"Buy",t);if(a===void 0)return;s=a,r=await xa(e,s,t)}let o=r.registered;if(t.json){b(o,t.fields);return}Te?await wr(o.domain):(A("Connect to a service:",`domani connect ${o.domain}`),A("Set up email:",`domani email setup ${o.domain}`),A("Configure DNS:",`domani dns ${o.domain}`),l())}async function Su(e,t){sa(e,t);let n=en(t.maxPrice,t),i=!!t.json,s=O(!i);s.start(`Checking ${e.length} domains`);let r=await Promise.all(e.map(async _=>{try{let S=await x(`/api/domains/search?q=${encodeURIComponent(_)}`),C=await S.json();return{domain:_,available:S.ok&&C.available,price:C.price,renewal_price:C.renewal_price}}catch{return{domain:_,available:!1,price:void 0,renewal_price:void 0}}})),o=r.filter(_=>_.available),a=r.filter(_=>!_.available);o.length===0&&(s.stop(`${y.error} None of the ${e.length} domains are available`),process.exit(1));let d=o.reduce((_,S)=>_+(S.price||0),0),f=o.reduce((_,S)=>_+(S.renewal_price??S.price??0),0),m=sr(d,f)?`, then ${$.price(f.toFixed(2))}/yr`:"";if(s.stop(`${y.success} ${o.length}/${e.length} available ${y.dot} ${$.price(d.toFixed(2))} total`),a.length>0)for(let _ of a)console.log(` ${y.error} ${$.domain(_.domain)} ${Ce.default.dim("not available")}`);let p=n??(o.every(_=>typeof _.price=="number")?qn(d):void 0);if(t.dryRun)return G("buy_bulk",{domains:o.map(_=>({domain:_.domain,price:_.price,..._.renewal_price!==void 0?{renewal_price:_.renewal_price}:{}})),unavailable:a.map(_=>_.domain),total_price:parseFloat(d.toFixed(2)),max_price:p,acting_as:xt()},t.json,t.fields);if(!St(t)){let _=await We({message:`Purchase ${Ce.default.bold(String(o.length))} domain${o.length>1?"s":""} for ${$.price(d.toFixed(2))}${m}${Ut()}?`});if(!_||typeof _=="symbol"){console.log(` ${Ce.default.dim("Cancelled.")}`);return}}l();let g,v;for(;;){let _=Qt(["Domain","Price"],o.map(R=>({cells:[$.domain(R.domain),R.price?Ce.default.green(tt(R.price,R.renewal_price)):""],status:"pending"})),[30,12],!i);_.start(),g=await x("/api/domains/buy",{method:"POST",body:JSON.stringify({domains:o.map(R=>R.domain),...p!==void 0?{max_price:p}:{}})}),v=await g.json();let S=g.ok?void 0:Ft(v);if(S===void 0){let R=new Set((v.results||[]).map(M=>M.domain));for(let M=0;M<o.length;M++){let H=o[M].domain.toLowerCase().trim();_.markDone(M,R.has(H)?y.success:y.error)}_.stop();break}for(let R=0;R<o.length;R++)_.markDone(R,Ce.default.dim("\xB7"));_.stop(),l();let C=await Mn(S,p??d,v,"Buy",t);if(C===void 0)return;p=C,l()}if(g.ok||u(v.error,{hint:v.hint,fixUrl:v.setup_url,status:g.status,json:t.json,fields:t.fields}),i){b(v,t.fields);return}l();let k=v.summary?.succeeded??0,w=v.summary?.failed??0;if(k>0&&console.log(` ${y.success} ${Ce.default.green(`${k} domain${k>1?"s":""} registered`)}`),w>0){console.log(` ${y.error} ${Ce.default.red(`${w} failed`)}`);for(let _ of v.errors||[])console.log(` ${Ce.default.dim("\u2500")} ${$.domain(_.domain)}: ${Ce.default.dim(_.error)}${_.hint?` ${Ce.default.dim(`(${_.hint})`)}`:""}`)}if(l(),k>0&&Te){let _=(v.results||[]).filter(S=>S.success).map(S=>S.domain);if(_.length===1)await wr(_[0]);else{let S=await dt({message:"Set up one of your new domains?",options:[..._.map(C=>({value:C,label:Ce.default.cyan(C)})),{value:"done",label:"Done"}]});!ae(S)&&S!=="done"?(l(),await wr(S)):l()}}else k>0&&(A("Connect to a service:","domani connect <domain>"),A("Set up email:","domani email setup <domain>"),l())}async function vr(e,t){let n=e.filter(Boolean);if(n.length===0){Te||u("Missing required argument: domain(s)",{hint:"Usage: domani buy <domain> [domain2 ...]",code:"missing_argument",json:t.json});let i=await Ue({message:"Domain to purchase",placeholder:"e.g. myapp.dev (space-separated for multiple)"});(ae(i)||!i)&&process.exit(0),n=i.split(/\s+/).filter(Boolean)}return n.length===1?ju(n[0],t):Su(n,t)}var Ce,yn=je(()=>{"use strict";K();qe();Ce=N(F(),1);V();De();we();Pi();Ei()});var Hr=N(Wr(),1),{program:zm,createCommand:Ym,createArgument:Xm,createOption:Zm,CommanderError:Qm,InvalidArgumentError:ef,InvalidOptionArgumentError:tf,Command:Jr,Argument:nf,Option:sf,Help:rf}=Hr.default;ii();var $t=N(F(),1);De();nr();V();On();De();var et=N(F(),1);V();var xc=new Set(["cli","mcp","plugin","skill","api"]);function jc(e){let t=e.scopes?.split(",").map(o=>o.trim()).filter(Boolean),n=e.mailboxes?.split(",").map(o=>o.trim().toLowerCase()).filter(Boolean),i=!!(t?.length||n?.length||e.label||e.expiresIn),s=e.surface||"cli";if(!xc.has(s))throw new RangeError("--surface must be one of: cli, mcp, plugin, skill, api");let r=e.expiresIn===void 0?void 0:Number(e.expiresIn);if(r!==void 0&&(!Number.isInteger(r)||r<3600||r>31536e3))throw new RangeError("--expires-in must be an integer between 3600 and 31536000 seconds");return{delegated:i,body:{...t?.length?{scopes:t}:{},...n?.length?{mailboxes:n}:{},...e.label?{label:e.label}:{},...r!==void 0?{expires_in:r}:{},surface:s,intent:"programmatic_access"}}}function Ko(e){return e!=="default"||rt().some(n=>n.name!==e)?` ${et.default.dim(`(account ${e})`)}`:""}async function zo(e){let t=Ge(),n=O(!e.json),i;try{i=jc(e)}catch(v){u(v instanceof Error?v.message:"Invalid login options",{code:"invalid_expires_in",json:e.json})}let{body:s,delegated:r}=i,o=mn(),a=ws(o);if(a&&!r){n.start("Checking session");try{let v=await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${a}`}});if(v.ok){let k=await v.json();n.stop(`Already logged in as ${et.default.bold(k.email)}${Ko(o)}`),e.json&&b({status:"already_logged_in",email:k.email,account:o});return}}catch{}n.stop("Session expired, re-authenticating"),l()}n.start("Requesting auth code");let d=await fetch(`${t}/api/auth/cli`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(!d.ok){n.stop("Failed to initiate login");try{let v=await d.json();u(v.error||v.message||`Server error (${d.status})`,{hint:v.hint,code:"login_failed",json:e.json})}catch{u(`Could not reach ${t}. Check your connection and try again.`,{code:"network_error",json:e.json})}}let{code:f,auth_url:m,expires_in:p}=await d.json();if(n.stop("Auth code received"),e.json){b({status:"awaiting_approval",code:f,auth_url:m,expires_in:p,account:o});return}l(),console.log(` ${et.default.dim("Verification code:")} ${et.default.bold(et.default.cyan(f))}`),e.open!==!1?(console.log(` ${et.default.dim("Opening browser")} ${y.arrow} ${$.url(m)}`),Le(m)):console.log(` ${et.default.dim("Open this URL to approve:")} ${$.url(m)}`),l(),n.start("Waiting for approval");let g=120;for(let v=0;v<g;v++){await new Promise(_=>setTimeout(_,5e3));let k=await fetch(`${t}/api/auth/cli/poll?code=${f}`);!k.ok&&k.status!==202&&(n.stop("Login failed"),u(`Server error (${k.status})`,{code:"login_failed"}));let w=await k.json();if(w.status==="complete"){ci(o,{token:w.token,email:w.email,api_url:t}),n.stop(`Logged in as ${et.default.bold(w.email)}${Ko(o)}`),l();let _=Be().active_account;if(_&&_!==o){console.log(` ${et.default.dim(`Commands still act as the active account "${_}".`)}`),A("Switch to this one:",`domani use ${o}`),A("Or use it once:",`domani --account ${o} me`),l();return}console.log(` ${et.default.bold("Get one real result:")}`),A("1. Create your free inbox:","domani email create YOUR_HANDLE@domani.run"),A("2. Connect your webhook:","domani email webhook YOUR_HANDLE@domani.run --url https://YOUR_AGENT/webhook"),A("3. Prove delivery:","domani email webhook-test YOUR_HANDLE@domani.run"),console.log(` ${et.default.dim("A custom domain can wait until this loop works.")}`),l();return}w.error&&(n.stop("Login failed"),u(w.error||w.message,{hint:w.hint,code:"login_failed"}))}n.stop("Login timed out"),u("No approval received within 10 minutes",{hint:"Run 'domani login' to try again",code:"timeout"})}De();var ir=N(F(),1);V();async function Yo(e){let t=mn(),n=io(t);if(!n){e.json?b({status:"not_logged_in",account:t}):console.log(` ${ir.default.dim(`Not logged in${t==="default"?"":` to the account "${t}"`}.`)}`);return}let i=rt().map(r=>r.name);if(e.json){b({status:"logged_out",account:t,email:n.email||null,remaining_accounts:i});return}let s=[n.email,i.length>0||t!=="default"?`account ${t}`:void 0].filter(Boolean).join(", ");console.log(` ${y.success} Logged out${s?` ${ir.default.dim(`(${s})`)}`:""}`),i.length>0&&!Be().active_account&&A("Pick the account to use next:",`domani use ${i[0]}`)}K();De();var qt=N(F(),1);V();async function Zo(e){let[t,n]=await Promise.all([x("/api/me"),x("/api/me/activation")]),i=await t.json();t.ok||u(i.error||i.message,{hint:i.hint,status:t.status,json:e.json,fields:e.fields});let s=n.ok?await n.json():null,r=Rn(),o={name:r.name??null,source:r.source};if(e.json){b({...i,activation:s,cli_account:o},e.fields);return}if(j("Account"),c("Email",qt.default.bold(i.email)),c("CLI account",r.source==="api_key_env"?qt.default.dim("DOMANI_API_KEY"):`${r.name??"-"}${r.source==="flag"?qt.default.dim(" (--account)"):r.source==="env"?qt.default.dim(" (DOMANI_ACCOUNT)"):""}`),c("Payment",i.has_payment_method?`${y.success} ${qt.default.green("active")}`:`${y.error} ${qt.default.dim("none")}`),c("Domains",String(i.domain_count)),c("API tokens",String(i.token_count)),c("Referral code",i.referral_code||qt.default.dim("-")),c("Created",new Date(i.created_at).toLocaleDateString()),s){c("Activation",s.status);let a=s.recommended_actions?.[0];a&&c("Next action",a.label)}l()}var pt=N(F(),1);De();V();var Sc={api_key_env:"DOMANI_API_KEY",flag:"--account",env:"DOMANI_ACCOUNT",active:"domani use",none:"none"};async function Qo(e){let t=rt(),n=Be().active_account??null,i=Rn();if(e.json){b({active:n,current:i.name??null,source:i.source,accounts:t.map(r=>({name:r.name,email:r.email??null,api_url:r.api_url??null,active:r.name===n,current:r.name===i.name}))});return}if(t.length===0){console.log(` ${pt.default.dim("No saved accounts.")}`),A("Log in:","domani login");return}j("Accounts");let s=Math.max(...t.map(r=>r.name.length));for(let r of t){let o=r.name===i.name?pt.default.green("*"):" ",a=[r.name===n?"active":void 0,r.name===i.name&&i.source!=="active"?`selected by ${Sc[i.source]}`:void 0].filter(Boolean);console.log(` ${o} ${pt.default.bold(r.name.padEnd(s))} ${r.email??pt.default.dim("unknown email")}${a.length?` ${pt.default.dim(a.join(", "))}`:""}`)}i.source==="api_key_env"&&(l(),console.log(` ${y.warning} ${pt.default.dim("DOMANI_API_KEY is set: every command uses that key, not these accounts.")}`)),l(),A("Switch:","domani use <name>"),A("Add one:","domani login --account <name>"),l()}async function ea(e,t){if(li(e)||u(`Invalid account name: ${e}`,{code:"validation_error",hint:"Use letters, digits, dot, dash or underscore",json:t.json}),!so(e)){let i=rt().map(s=>s.name);u(`No saved account named "${e}"`,{code:"account_not_found",hint:i.length?`Saved accounts: ${i.join(", ")}. Add one with 'domani login --account ${e}'`:`Log in with 'domani login --account ${e}'`,json:t.json})}let n=rt().find(i=>i.name===e)?.email??null;if(t.json){b({status:"switched",active:e,email:n});return}console.log(` ${y.success} Now using ${pt.default.bold(e)}${n?` ${pt.default.dim(`(${n})`)}`:""}`),process.env.DOMANI_ACCOUNT&&process.env.DOMANI_ACCOUNT!==e&&console.log(` ${y.warning} ${pt.default.dim(`DOMANI_ACCOUNT=${process.env.DOMANI_ACCOUNT} still overrides it in this shell.`)}`)}K();qe();var E=N(F(),1);V();we();Ei();function bn(e){return e.tld_kind==="alt_root"}function $r(e){return e.reason||`${e.domain} does not resolve in public DNS: its TLD is not in the DNS root zone (IANA). Domani does not offer it.`}function ht(e){return e.registry_status==="premium"||e.registry_status==="reserved"}function vn(e){return e.registry_status==="reserved"?"reserved":e.registry_price!==void 0?`premium $${e.registry_price.toFixed(2)}`:"premium"}function _r(e){if(e.reason)return e.reason;if(e.registry_status==="reserved")return`${e.domain} is reserved by the registry and cannot be registered.`;let t=e.registry_price!==void 0?`: the registry prices it at $${e.registry_price.toFixed(2)}`:" priced by the registry";return`${e.domain} is a premium name${t}. Premium names cannot be bought at the standard price.`}function sn(e,t){let n=e.findIndex(i=>i.domain===t);return n!==-1&&e.splice(n,1),n}var Ye=10,wn=200,Fi=["com","io","ai","dev","app","co","net","org","xyz","sh","me","cc","tech","run","cloud","so","gg","fm","tv","pro","one","inc","ltd","llc","biz","group","global","ventures","capital","fund","agency","store","shop","market","sale","deals","auction","trade","studio","design","art","space","style","fashion","luxury","brand","media","digital","site","online","live","show","world","zone","land","place","city","town","blog","news","social","chat","link","page","fun","lol","meme","wtf","tools","build","works","work","team","solutions","services","systems","network","software","music","video","photo","photos","game","games","club","stream","film","movie","pizza","coffee","beer","bar","pub","restaurant","cafe","kitchen","food","wine","health","care","clinic","dental","fitness","yoga","bio","life","lifestyle","finance","money","legal","law","cash","academy","university","education","training","courses","science","wiki","guide","us","uk","eu","ca","au","de","fr","it","es","nl","jp","sg","nz","mx","house","homes","realty","estate","garden","nyc","london","berlin","paris","guru","ninja","rocks","fail","party","vip","gold","black","pink","red","events","travel","sport","jobs","careers","consulting","energy","eco","green","support","help","info","new","now","today","day"],Li=null;async function ja(){if(Li)return Li;try{let e=await ke("/api/tlds?sort=price&order=asc&limit=1000");if(e.ok){let n=(await e.json()).tlds.map(i=>i.tld);if(n.length>0){let i=new Set(Fi),s=new Set(n),r=[...Fi.filter(o=>s.has(o)),...n.filter(o=>!i.has(o))];return Li=r,r}}}catch{}return Li=Fi,Fi}async function Ou(e,t,n,i,s){let r=[],o=[],a=Ye,d=0,f=!0,m=0,p=0,g=!1,v=!1,k=null,w="",_=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],S=0,C=setInterval(()=>{v||!f||(S=(S+1)%_.length,U())},80);function R(){m>0&&(process.stdout.write(`\x1B[${m}A\x1B[0J`),m=0)}function M(){if(f)return[];let I=Ye+p*Ye;return r.length>a||i&&I<s.length?["more","new","skip"]:["new","skip"]}function H(){return r.slice(0,a)}function ee(){let I=M();return Math.max(0,H().length+I.length-1)}let q=6;function U(){R();let I=[],W=H(),te=!f&&W.length===0&&o.length>0,X=te?o.slice(0,q):W,le=X.reduce((he,ne)=>Math.max(he,ne.domain.length),0),$e=M();for(let he=0;he<X.length;he++){let ne=X[he];if(te)I.push(`${E.default.dim("\u2502")} ${E.default.dim("\u2715")} ${E.default.dim(ne.domain.padEnd(le))} ${E.default.dim(ht(ne)?vn(ne):"taken")}`);else{let be=he===d,ut=be?E.default.green("\u25CF"):E.default.dim("\u25CB"),Tt=ne.domain.padEnd(le),kn=be?E.default.bold(E.default.cyan(Tt)):Tt,xn=ne.for_sale?E.default.cyan(`$${ne.for_sale.price} (for sale)`):E.default.dim(tt(ne.price,ne.renewal_price));I.push(`${E.default.dim("\u2502")} ${ut} ${kn} ${xn}`)}}if(te&&o.length>q&&I.push(`${E.default.dim("\u2502")} ${E.default.dim(`\u2026 and ${o.length-q} more taken`)}`),f){let he=w?E.default.dim(`checking ${w}\u2026`):E.default.dim("searching\u2026");I.push(`${E.default.dim("\u2502")} ${E.default.cyan(_[S])} ${he}`)}else{let he=Ye+p*Ye;i&&he>=s.length&&I.push(`${E.default.dim("\u2502")} ${E.default.dim(`All ${Math.min(he,s.length)} TLDs searched`)}`);for(let be=0;be<$e.length;be++){let kn=H().length+be===d?E.default.green("\u25CF"):E.default.dim("\u25CB"),xn=$e[be]==="more"?E.default.dim("More \u2192"):$e[be]==="new"?E.default.dim("New search \u2192"):E.default.dim("Skip");I.push(`${E.default.dim("\u2502")} ${kn} ${xn}`)}I.push(E.default.dim("\u2514"))}process.stdout.write(I.join(`
|
package/package.json
CHANGED