domani-cli 0.4.58 → 0.4.59

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.
Files changed (2) hide show
  1. package/dist/domani.cjs +3 -3
  2. package/package.json +1 -1
package/dist/domani.cjs CHANGED
@@ -25,7 +25,7 @@ Expecting one of '${s.join("', '")}'`);return this._lifeCycleHooks[t]?this._life
25
25
  `),this._exit(0,"commander.version",t)}),this}description(t,i){return t===void 0&&i===void 0?this._description:(this._description=t,i&&(this._argsDescription=i),this)}summary(t){return t===void 0?this._summary:(this._summary=t,this)}alias(t){if(t===void 0)return this._aliases[0];let i=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(i=this.commands[this.commands.length-1]),t===i._name)throw new Error("Command alias can't be the same as its name");let s=this.parent?._findCommand(t);if(s){let n=[s.name()].concat(s.aliases()).join("|");throw new Error(`cannot add alias '${t}' to command '${this.name()}' as already have command '${n}'`)}return i._aliases.push(t),this}aliases(t){return t===void 0?this._aliases:(t.forEach(i=>this.alias(i)),this)}usage(t){if(t===void 0){if(this._usage)return this._usage;let i=this.registeredArguments.map(s=>Wa(s));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?i:[]).join(" ")}return this._usage=t,this}name(t){return t===void 0?this._name:(this._name=t,this)}nameFromFilename(t){return this._name=pt.basename(t,pt.extname(t)),this}executableDir(t){return t===void 0?this._executableDir:(this._executableDir=t,this)}helpInformation(t){let i=this.createHelp(),s=this._getOutputContext(t);i.prepareContext({error:s.error,helpWidth:s.helpWidth,outputHasColors:s.hasColors});let n=i.formatHelp(this,i);return s.hasColors?n:this._outputConfiguration.stripColor(n)}_getOutputContext(t){t=t||{};let i=!!t.error,s,n,r;return i?(s=a=>this._outputConfiguration.writeErr(a),n=this._outputConfiguration.getErrHasColors(),r=this._outputConfiguration.getErrHelpWidth()):(s=a=>this._outputConfiguration.writeOut(a),n=this._outputConfiguration.getOutHasColors(),r=this._outputConfiguration.getOutHelpWidth()),{error:i,write:a=>(n||(a=this._outputConfiguration.stripColor(a)),s(a)),hasColors:n,helpWidth:r}}outputHelp(t){let i;typeof t=="function"&&(i=t,t=void 0);let s=this._getOutputContext(t),n={error:s.error,write:s.write,command:this};this._getCommandAndAncestors().reverse().forEach(o=>o.emit("beforeAllHelp",n)),this.emit("beforeHelp",n);let r=this.helpInformation({error:s.error});if(i&&(r=i(r),typeof r!="string"&&!Buffer.isBuffer(r)))throw new Error("outputHelp callback must return a string or a Buffer");s.write(r),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",n),this._getCommandAndAncestors().forEach(o=>o.emit("afterAllHelp",n))}helpOption(t,i){return typeof t=="boolean"?(t?this._helpOption=this._helpOption??void 0:this._helpOption=null,this):(t=t??"-h, --help",i=i??"display help for command",this._helpOption=this.createOption(t,i),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 i=Number(ne.exitCode??0);i===0&&t&&typeof t!="function"&&t.error&&(i=1),this._exit(i,"commander.help","(outputHelp)")}addHelpText(t,i){let s=["beforeAll","before","after","afterAll"];if(!s.includes(t))throw new Error(`Unexpected value for position to addHelpText.
26
26
  Expecting one of '${s.join("', '")}'`);let n=`${t}Help`;return this.on(n,r=>{let o;typeof i=="function"?o=i({error:r.error,command:r.command}):o=i,o&&r.write(`${o}
27
27
  `)}),this}_outputHelpIfRequested(t){let i=this._getHelpOption();i&&t.find(n=>i.is(n))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function Bn(e){return e.map(t=>{if(!t.startsWith("--inspect"))return t;let i,s="127.0.0.1",n="9229",r;return(r=t.match(/^(--inspect(-brk)?)$/))!==null?i=r[1]:(r=t.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(i=r[1],/^\d+$/.test(r[3])?n=r[3]:s=r[3]):(r=t.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(i=r[1],s=r[3],n=r[4]),i&&n!=="0"?`${i}=${s}:${parseInt(n)+1}`:t})}function Is(){if(ne.env.NO_COLOR||ne.env.FORCE_COLOR==="0"||ne.env.FORCE_COLOR==="false")return!1;if(ne.env.FORCE_COLOR||ne.env.CLICOLOR_FORCE!==void 0)return!0}Rs.Command=Os;Rs.useColor=Is});var Xn=ft(ze=>{var{Argument:Kn}=ji(),{Command:As}=Gn(),{CommanderError:Ga,InvalidArgumentError:zn}=si(),{Help:Ka}=$s(),{Option:Yn}=js();ze.program=new As;ze.createCommand=e=>new As(e);ze.createOption=(e,t)=>new Yn(e,t);ze.createArgument=(e,t)=>new Kn(e,t);ze.Command=As;ze.Option=Yn;ze.Argument=Kn;ze.Help=Ka;ze.CommanderError=Ga;ze.InvalidArgumentError=zn;ze.InvalidOptionArgumentError=zn});var M=ft((xu,Es)=>{var Oi=process||{},er=Oi.argv||[],Ci=Oi.env||{},za=!(Ci.NO_COLOR||er.includes("--no-color"))&&(!!Ci.FORCE_COLOR||er.includes("--color")||Oi.platform==="win32"||(Oi.stdout||{}).isTTY&&Ci.TERM!=="dumb"||!!Ci.CI),Ya=(e,t,i=e)=>s=>{let n=""+s,r=n.indexOf(t,e.length);return~r?e+Xa(n,t,i,r)+t:e+n+t},Xa=(e,t,i,s)=>{let n="",r=0;do n+=e.substring(r,s)+i,r=s+t.length,s=e.indexOf(t,r);while(~s);return n+e.substring(r)},tr=(e=za)=>{let t=e?Ya:()=>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")}};Es.exports=tr();Es.exports.createColors=tr});var Jt,ni,ri=Ae(()=>{"use strict";Jt="domani.run",ni=`https://${Jt}`});function Ot(e,t,i){try{let s=(0,ir.spawnSync)(e,t,{encoding:"utf-8",input:i,timeout:3e3,stdio:["pipe","pipe","ignore"]});return{ok:s.status===0,stdout:(s.stdout||"").trim()}}catch{return{ok:!1,stdout:""}}}function sr(){return process.platform==="darwin"?!0:process.platform==="linux"?Ot("secret-tool",["--help"]).ok:!1}function nr(e={}){if(e.refresh&&(Bt=void 0),Bt!==void 0)return Bt??void 0;let t;if(process.platform==="darwin"){let i=Ot("security",["find-generic-password","-s",Gt,"-a",Kt,"-w"]);i.ok&&i.stdout&&(t=i.stdout)}else if(process.platform==="linux"){let i=Ot("secret-tool",["lookup","service",Gt,"account",Kt]);i.ok&&i.stdout&&(t=i.stdout)}return Bt=t??null,t}function rr(e){let t=!1;return process.platform==="darwin"?t=Ot("security",["add-generic-password","-U","-s",Gt,"-a",Kt,"-w",e]).ok:process.platform==="linux"&&(t=Ot("secret-tool",["store","--label=domani CLI token","service",Gt,"account",Kt],e+`
28
- `).ok),t&&(Bt=e),t}function or(){process.platform==="darwin"?Ot("security",["delete-generic-password","-s",Gt,"-a",Kt]):process.platform==="linux"&&Ot("secret-tool",["clear","service",Gt,"account",Kt]),Bt=null}var ir,Gt,Kt,Bt,ar=Ae(()=>{"use strict";ir=require("child_process"),Gt="domani-cli",Kt="default"});function cr(e){dr=e}function ht(){try{let e=_t.default.readFileSync(Ts,"utf-8");return JSON.parse(e)}catch{return{}}}function zt(e){e.token&&sr()&&rr(e.token)&&(e={...e,token:void 0,token_in_keychain:!0}),_t.default.mkdirSync(Ai,{recursive:!0,mode:448}),_t.default.writeFileSync(Ts,JSON.stringify(e,null,2),{mode:384})}function mr(){or();try{_t.default.unlinkSync(Ts)}catch{}}function Le(){return dr||ht().api_url||ni}function Ve(e={}){if(process.env.DOMANI_API_KEY)return process.env.DOMANI_API_KEY;let t=ht();if(t.token)return t.token;if(t.token_in_keychain)return nr({refresh:e.refreshKeychain})}function Qa(){try{let e=_t.default.readFileSync(ur,"utf-8");return JSON.parse(e)}catch{return null}}function el(e){try{_t.default.mkdirSync(Ai,{recursive:!0,mode:448}),_t.default.writeFileSync(ur,JSON.stringify(e),{mode:384})}catch{}}function Ii(e,t){let i=e.split(".").map(Number),s=t.split(".").map(Number);for(let n=0;n<3;n++){if((i[n]||0)>(s[n]||0))return 1;if((i[n]||0)<(s[n]||0))return-1}return 0}async function fr(){let e=Qa();if(e&&Date.now()-e.checkedAt<Za)return Ii(e.version,xe)>0?{update:e.version,forced:Ii(xe,e.min)<0}:null;try{let t=Le(),i=await fetch(`${t}/api/cli/version`,{signal:AbortSignal.timeout(3e3)});if(!i.ok)return null;let s=await i.json();if(el({version:s.version,min:s.min,checkedAt:Date.now()}),Ii(s.version,xe)>0)return{update:s.version,forced:Ii(xe,s.min)<0}}catch{}return null}var _t,Ri,lr,Ai,Ts,dr,ur,Za,Ps,xe,gt=Ae(()=>{"use strict";_t=D(require("fs"),1),Ri=D(require("path"),1),lr=D(require("os"),1);ri();ar();Ai=process.env.DOMANI_CONFIG_DIR||Ri.default.join(lr.default.homedir(),".domani"),Ts=Ri.default.join(Ai,"config.json");ur=Ri.default.join(Ai,"version-check.json"),Za=1440*60*1e3;Ps=process.stdout.isTTY??!1,xe="0.4.58"});var Ns=ft((Ru,pr)=>{"use strict";var Ds={to(e,t){return t?`\x1B[${t+1};${e+1}H`:`\x1B[${e+1}G`},move(e,t){let i="";return e<0?i+=`\x1B[${-e}D`:e>0&&(i+=`\x1B[${e}C`),t<0?i+=`\x1B[${-t}A`:t>0&&(i+=`\x1B[${t}B`),i},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"},tl={up:(e=1)=>"\x1B[S".repeat(e),down:(e=1)=>"\x1B[T".repeat(e)},il={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 i=0;i<e;i++)t+=this.line+(i<e-1?Ds.up():"");return e&&(t+=Ds.left),t}};pr.exports={cursor:Ds,scroll:tl,erase:il,beep:"\x07"}});function yt(e,t,i){if(!i.some(o=>!o.disabled))return e;let s=e+t,n=Math.max(i.length-1,0),r=s<0?n:s>n?0:s;return i[r].disabled?yt(r,t<0?-1:1,i):r}function Ls(e,t,i){return String(e).normalize().replaceAll(`\r
28
+ `).ok),t&&(Bt=e),t}function or(){process.platform==="darwin"?Ot("security",["delete-generic-password","-s",Gt,"-a",Kt]):process.platform==="linux"&&Ot("secret-tool",["clear","service",Gt,"account",Kt]),Bt=null}var ir,Gt,Kt,Bt,ar=Ae(()=>{"use strict";ir=require("child_process"),Gt="domani-cli",Kt="default"});function cr(e){dr=e}function ht(){try{let e=_t.default.readFileSync(Ts,"utf-8");return JSON.parse(e)}catch{return{}}}function zt(e){e.token&&sr()&&rr(e.token)&&(e={...e,token:void 0,token_in_keychain:!0}),_t.default.mkdirSync(Ai,{recursive:!0,mode:448}),_t.default.writeFileSync(Ts,JSON.stringify(e,null,2),{mode:384})}function mr(){or();try{_t.default.unlinkSync(Ts)}catch{}}function Le(){return dr||ht().api_url||ni}function Ve(e={}){if(process.env.DOMANI_API_KEY)return process.env.DOMANI_API_KEY;let t=ht();if(t.token)return t.token;if(t.token_in_keychain)return nr({refresh:e.refreshKeychain})}function Qa(){try{let e=_t.default.readFileSync(ur,"utf-8");return JSON.parse(e)}catch{return null}}function el(e){try{_t.default.mkdirSync(Ai,{recursive:!0,mode:448}),_t.default.writeFileSync(ur,JSON.stringify(e),{mode:384})}catch{}}function Ii(e,t){let i=e.split(".").map(Number),s=t.split(".").map(Number);for(let n=0;n<3;n++){if((i[n]||0)>(s[n]||0))return 1;if((i[n]||0)<(s[n]||0))return-1}return 0}async function fr(){let e=Qa();if(e&&Date.now()-e.checkedAt<Za)return Ii(e.version,xe)>0?{update:e.version,forced:Ii(xe,e.min)<0}:null;try{let t=Le(),i=await fetch(`${t}/api/cli/version`,{signal:AbortSignal.timeout(3e3)});if(!i.ok)return null;let s=await i.json();if(el({version:s.version,min:s.min,checkedAt:Date.now()}),Ii(s.version,xe)>0)return{update:s.version,forced:Ii(xe,s.min)<0}}catch{}return null}var _t,Ri,lr,Ai,Ts,dr,ur,Za,Ps,xe,gt=Ae(()=>{"use strict";_t=D(require("fs"),1),Ri=D(require("path"),1),lr=D(require("os"),1);ri();ar();Ai=process.env.DOMANI_CONFIG_DIR||Ri.default.join(lr.default.homedir(),".domani"),Ts=Ri.default.join(Ai,"config.json");ur=Ri.default.join(Ai,"version-check.json"),Za=1440*60*1e3;Ps=process.stdout.isTTY??!1,xe="0.4.59"});var Ns=ft((Ru,pr)=>{"use strict";var Ds={to(e,t){return t?`\x1B[${t+1};${e+1}H`:`\x1B[${e+1}G`},move(e,t){let i="";return e<0?i+=`\x1B[${-e}D`:e>0&&(i+=`\x1B[${e}C`),t<0?i+=`\x1B[${-t}A`:t>0&&(i+=`\x1B[${t}B`),i},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"},tl={up:(e=1)=>"\x1B[S".repeat(e),down:(e=1)=>"\x1B[T".repeat(e)},il={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 i=0;i<e;i++)t+=this.line+(i<e-1?Ds.up():"");return e&&(t+=Ds.left),t}};pr.exports={cursor:Ds,scroll:tl,erase:il,beep:"\x07"}});function yt(e,t,i){if(!i.some(o=>!o.disabled))return e;let s=e+t,n=Math.max(i.length-1,0),r=s<0?n:s>n?0:s;return i[r].disabled?yt(r,t<0?-1:1,i):r}function Ls(e,t,i){return String(e).normalize().replaceAll(`\r
29
29
  `,`
30
30
  `).split(`
31
31
  `).map(s=>pl(s,t,i)).join(`
@@ -175,7 +175,7 @@ ${l}${o}
175
175
  ${a}`:""}`}default:{let o=t?`${p.default.cyan(E)} `:"",a=t?p.default.cyan(je):"";return`${i}${o}${n}
176
176
  ${a}
177
177
  `}}}}).prompt()});function nd(e){return!!(e.json||!Se)}function S(e,t=50){console.log(),console.log(` ${J.default.bold(e)}`),console.log(` ${J.default.dim("\u2500".repeat(t))}`)}function c(e,t,i=2){let s=" ".repeat(i);console.log(`${s}${J.default.dim(e.padEnd(16))} ${t}`)}function d(){console.log()}function Xe(e){console.log(` ${J.default.dim(e)}`)}function I(e,t){console.log(` ${J.default.dim(e)} ${J.default.cyan(t)}`)}function zr(e){return e.split(/(https?:\/\/[^\s]+)/g).map(i=>/^https?:\/\//.test(i)?`\x1B]8;;${i}\x1B\\${J.default.underline(J.default.cyan(i))}\x1B]8;;\x1B\\`:J.default.dim(i)).join("")}function pn(e,t){console.error(` ${b.error} ${J.default.red(e)}`),t&&console.error(` ${zr(t)}`)}function C(e=!0){return e?ui():rd}function Yr(e){return e.replace(od,"")}function Zi(e,t){let i=Yr(e).length,s=Math.max(0,t-i);return e+" ".repeat(s)}function Z(e,t,i){let s=i||e.map((o,a)=>{let l=t.reduce((f,m)=>Math.max(f,Yr(m[a]||"").length),0);return Math.max(o.length,l)+2}),n=e.map((o,a)=>J.default.dim(o.padEnd(s[a]))).join(" "),r=s.map(o=>J.default.dim("\u2500".repeat(o))).join(" ");console.log(` ${n}`),console.log(` ${r}`);for(let o of t){let a=o.map((l,f)=>Zi(l,s[f])).join(" ");console.log(` ${a}`)}}function ad(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function fn(e){if(Array.isArray(e))return e.map(fn);if(e&&typeof e=="object"&&!(e instanceof Date)){let t={};for(let[i,s]of Object.entries(e))t[ad(i)]=fn(s);return t}return e}function w(e,t){let i=fn(e);if(!t){console.log(JSON.stringify(i,null,2));return}let s=t.split(",").map(n=>n.trim()).filter(Boolean);if(Array.isArray(i)){let n=i.map(r=>Br(r,s));console.log(JSON.stringify(n,null,2))}else console.log(JSON.stringify(i&&typeof i=="object"?Br(i,s):i,null,2))}function Br(e,t){let i={};for(let s of t)s in e&&(i[s]=e[s]);if(Object.keys(i).length===0){for(let[s,n]of Object.entries(e))if(Array.isArray(n)&&n.length>0&&typeof n[0]=="object"){let r=n.map(o=>{let a={};for(let l of t)l in o&&(a[l]=o[l]);return a});Object.keys(r[0]).length>0&&(i[s]=r)}}return i}function Nt(e){return!!(e.yes||nd(e))}function B(e,t,i,s){if(i){w({dry_run:!0,action:e,...t},s);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[n,r]of Object.entries(t))r!=null&&(Array.isArray(r)?console.log(` ${J.default.dim(n+":")} ${r.map(String).join(", ")}`):console.log(typeof r=="object"?` ${J.default.dim(n+":")} ${JSON.stringify(r)}`:` ${J.default.dim(n+":")} ${String(r)}`));console.log()}function dd(e,t,i){return t===401||t===403?"auth_required":t===402||i?"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 i=e||`Request failed${t?.status?` (${t.status})`:""}`,s=t?.code||dd(i,t?.status,t?.fixUrl),n=t?.fixCommand||ld[s];if(t?.json){let r={error:i,code:s};t.hint&&(r.hint=t.hint),n&&(r.fix_command=n),t.fixUrl&&(r.fix_url=t.fixUrl),w(r,t.fields)}else pn(i,t?.hint),n?console.error(` ${J.default.dim("Or run:")} ${J.default.cyan(n)}`):t?.fixUrl&&console.error(` ${zr(`Add a payment method at ${t.fixUrl}`)}`);process.exit(1)}function Je(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";(0,Kr.execFile)(t,[e])}function Ut(e){return new Promise(t=>setTimeout(t,e))}function qt(e,t,i,s=!0){let n=process.stdout.isTTY??!1;if(!s)return{start(){},markDone(){},stop(){}};let r=0,o=null,a=2+t.length;function l(){let y=" "+e.map((h,_)=>J.default.dim(h.padEnd(i[_]))).join(" "),k=" "+i.map(h=>J.default.dim("\u2500".repeat(h))).join(" "),$=[y,k];for(let h of t){let _=h.status==="done"?h.icon??b.success:J.default.cyan(Gr[r%Gr.length]),j=h.cells.map((O,A)=>Zi(O,i[A])).join(" ");$.push(` ${_} ${j}`)}return $}let f=!1,m=()=>process.stdout.write("\x1B[?25h");function g(){let y=l();if(f&&n){process.stdout.write(`\x1B[${a}A`);for(let k of y)process.stdout.write(`\x1B[2K${k}
178
- `)}else{for(let k of y)console.log(k);f=!0}}return{start(){n&&(process.stdout.write("\x1B[?25l"),process.on("exit",m)),g(),n&&(o=setInterval(()=>{r++,g()},80))},markDone(y,k){t[y].status="done",k!==void 0&&(t[y].icon=k),n&&g()},stop(){o&&clearInterval(o);for(let y of t)y.status="done";g(),n&&(process.stdout.write("\x1B[?25h"),process.removeListener("exit",m))}}}var J,Kr,Se,b,v,rd,od,ld,Gr,V=Ae(()=>{"use strict";J=D(M(),1),Kr=require("child_process");Ne();Se=process.stdout.isTTY??!1;b={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")},v={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\\`};rd={start:()=>{},stop:()=>{},message:()=>{}};od=/\x1b\]8;;[^\x1b]*\x1b\\|\x1b\[[0-9;]*m/g;ld={auth_required:"domani login",payment_required:"domani card add",contact_required:"domani contact set"};Gr=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]});function Xr(e){return typeof e=="string"&&["pro","agent","fleet","scale","mail_solo","mail_team","mail_business"].includes(e)}function Zr(e){return Xr(e.plan)||Array.isArray(e.workspace_plans)&&e.workspace_plans.some(Xr)}async function Qr(){if(gn)return;let e=process.argv.includes("--json")||!Ps,t=Le(),i=Ve();try{let r=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${i}`}})).json();if(Zr(r)){gn=!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)),d(),console.log(` ${ve.default.dim("This feature requires a")} ${ve.default.bold("paid plan")} ${ve.default.dim("(including an active Mailzero workspace plan or legacy Pro subscription).")}`),console.log(` ${ve.default.dim("Opening pricing page")} ${b.arrow} ${ve.default.cyan("domani.run/pricing")}`),Je(`${t.replace("http://localhost:3000","https://domani.run")}/pricing`),d();let s=C(!0);s.start("Waiting for upgrade...");for(let n=0;n<120;n++){await new Promise(r=>setTimeout(r,5e3));try{let o=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${i}`}})).json();if(Zr(o)){gn=!0,s.stop(`${b.success} Paid plan active! Continuing...`),d();return}}catch{}}s.stop("Timed out"),console.error(` ${ve.default.red("\u2717")} No upgrade detected. Visit ${ve.default.cyan("domani.run/settings")} to upgrade.`),process.exit(1)}async function eo(){if(hn||Ve()){hn=!0;return}(process.argv.includes("--json")||!Ps)&&(console.log(JSON.stringify({error:"Not logged in",code:"auth_required",hint:"Run 'domani login' or set DOMANI_API_KEY environment variable",fix_command:"domani login"},null,2)),process.exit(1)),d(),console.log(` ${ve.default.dim("You're not logged in.")} Starting authentication...`),d();let t=Le(),i=C(!0);i.start("Requesting auth code");let s;try{s=await fetch(`${t}/api/auth/cli`,{method:"POST",headers:{"Content-Type":"application/json"}})}catch{i.stop("Failed"),console.error(` ${ve.default.red("\u2717")} Could not reach ${t}. Check your connection.`),process.exit(1)}if(!s.ok){i.stop("Failed");let o=`Server error (${s.status})`;try{let a=await s.json();o=a.error||a.message||o}catch{}console.error(` ${ve.default.red("\u2717")} ${o}`),process.exit(1)}let n,r;try{({code:n,auth_url:r}=await s.json())}catch{i.stop("Failed"),console.error(` ${ve.default.red("\u2717")} Invalid response from server.`),process.exit(1)}i.stop(`${b.success} Auth code ready`),d(),console.log(` ${ve.default.dim("Verification code:")} ${ve.default.bold(ve.default.cyan(n))}`),console.log(` ${ve.default.dim("Opening browser")} ${b.arrow} ${v.url(r)}`),Je(r),d(),i.start("Waiting for browser approval");for(let o=0;o<120;o++){await new Promise(f=>setTimeout(f,5e3));let a=await fetch(`${t}/api/auth/cli/poll?code=${n}`).catch(()=>null);if(!a||!a.ok&&a.status!==202)continue;let l=await a.json().catch(()=>({}));if(l.status==="complete"){zt({...ht(),token:l.token,email:l.email,api_url:t}),hn=!0,i.stop(`${b.success} Logged in as ${ve.default.bold(l.email)}`),d();return}}i.stop("Timed out"),console.error(` ${ve.default.red("\u2717")} No approval received. Run ${ve.default.cyan("domani login")} to try again.`),process.exit(1)}var ve,hn,gn,yn=Ae(()=>{"use strict";ve=D(M(),1);gt();V();hn=!1,gn=!1});function so(e){return e.json=async()=>{let t=await e.clone().text();try{return JSON.parse(t)}catch{let i=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${i?` (got: "${i}")`:""}. 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={},i=!1){let s=Ve(),n=`${Le()}${e}`,r=await fetch(n,{...t,headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json","User-Agent":`domani-cli/${xe}`,...t.headers}});if(!i){let o=await r.clone().text();try{if(JSON.parse(o).code==="UPGRADE_REQUIRED")return await Qr(),x(e,t,!0)}catch{}}return so(r)}async function we(e,t={}){let i=`${Le()}${e}`,s=Ve(),n=await fetch(i,{...t,headers:{"Content-Type":"application/json","User-Agent":`domani-cli/${xe}`,...s?{Authorization:`Bearer ${s}`}:{},...t.headers}});return so(n)}var G=Ae(()=>{"use strict";gt();yn()});function St(){return{ok:!0}}function bt(e,t,i){return{ok:!1,error:{message:e,code:t,hint:i}}}function oo(e){return md.test(e)?bt("Input contains control characters","invalid_input","Remove non-printable characters from the input"):St()}function bd(e){return fd.test(e)?bt("Input contains path traversal","invalid_input","Domain names cannot contain '../' or '..\\'"):St()}function wd(e){return pd.test(e)?bt("Input contains query string or fragment","invalid_input","Remove '?' or '#' from the domain name"):St()}function vd(e){return hd.test(e)?bt("Input contains percent-encoded characters","invalid_input","Use plain text, not URL-encoded values (e.g. 'example.com' not 'example%2Ecom')"):St()}function ao(e){if(!e)return bt("Domain name is required","validation_error");if(e.length>ro)return bt(`Domain name too long (${e.length} chars, max ${ro})`,"validation_error");for(let t of[oo,bd,wd,vd]){let i=t(e);if(!i.ok)return i}return gd.test(e)?St():bt(`Invalid domain name: ${e}`,"validation_error","Domain names can only contain letters, digits, hyphens, and dots")}function $d(e){if(!e)return bt("TLD is required","validation_error");let t=oo(e);return t.ok?yd.test(e)?St():bt(`Invalid TLD: ${e}`,"validation_error","TLDs contain only letters (e.g. 'com', '.dev', 'ai')"):t}function kd(e){for(let t of e){let i=ao(t);if(!i.ok)return i}return St()}function _d(e){for(let t of e){let i=$d(t);if(!i.ok)return i}return St()}function z(e,t){let i=ao(e);i.ok||u(i.error.message,{code:i.error.code,hint:i.error.hint,json:t?.json,fields:t?.fields})}function lo(e,t){let i=kd(e);i.ok||u(i.error.message,{code:i.error.code,hint:i.error.hint,json:t?.json,fields:t?.fields})}function Qi(e,t){let i=_d(e);i.ok||u(i.error.message,{code:i.error.code,hint:i.error.hint,json:t?.json,fields:t?.fields})}var md,fd,pd,hd,gd,yd,ro,ge=Ae(()=>{"use strict";V();md=/[\x00-\x08\x0b\x0c\x0e-\x1f]/,fd=/\.\.[/\\]/,pd=/[?#]/,hd=/%[0-9a-fA-F]{2}/,gd=/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*\.?$/,yd=/^\.?[a-zA-Z]{2,63}$/,ro=253});async function fe(){Se||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=C(!0);e.start("Loading your domains");let t=await x("/api/domains"),i=await t.json();t.ok||(e.stop("Failed"),pn(i.error,i.hint),process.exit(1));let s=i.domains||[];s.length===0&&(e.stop("No domains"),d(),console.log(` ${wn.default.dim("No domains yet.")} Use: ${wn.default.cyan("domani buy <domain>")}`),d(),process.exit(0)),e.stop(`${s.length} domain(s)`);let n=await tt({message:"Which domain?",options:s.map(r=>({value:r.domain,label:r.domain,hint:r.status!=="active"?r.status:void 0}))});return le(n)&&process.exit(0),n}var wn,Ze=Ae(()=>{"use strict";G();Ne();wn=D(M(),1);V()});var uo={};Ht(uo,{connect:()=>vn});async function vn(e,t,i){e||(e=await fe()),z(e,i);let s;if(t&&!i.provider?t.includes(".")?s=t:i.provider=t:s=t,!s&&!i.provider&&!i.list&&i.dryRun)return B("connect",{domain:e,note:"No provider specified. Pass --provider <name> to connect."},i.json,i.fields);if(!s&&!i.provider&&!i.list){let n=C(!i.json);n.start(`Loading providers for ${v.domain(e)}`);let r=await x(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(n.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:i.json,fields:i.fields})),n.stop("Providers loaded"),i.json){w(o,i.fields);return}let a=[];for(let h of["hosting","email"]){let _=o.providers?.[h]||[];for(let j of _)a.push({value:`${h}:${j.name}`,label:j.name,hint:h})}a.length===0&&u("No providers available",{code:"not_found",json:i.json,fields:i.fields});let l=await tt({message:"Choose a provider",options:a});le(l)&&process.exit(0);let[f,m]=l.split(":"),y=(o.providers?.[f]||[]).find(h=>h.name===m),k;if(y&&y.methods.length>1){let h=await tt({message:"Choose a method",options:y.methods.map(_=>({value:_.name,label:_.name,hint:_.default?"default":void 0}))});le(h)&&process.exit(0),k=h}let $;if(f==="hosting"&&y?.requires_target){y.notes?.setup&&Xe(y.notes.setup);let h=await Te({message:"Target hostname or IP"});le(h)&&process.exit(0),$=h.trim()}return co(e,{target:$,provider:m,method:k,dryRun:i.dryRun,json:!1})}if(i.list){let n=C(!i.json);n.start(`Loading providers for ${v.domain(e)}`);let r=await x(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(n.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:i.json,fields:i.fields})),n.stop("Providers loaded"),i.json){w(o,i.fields);return}S(`Providers for ${v.domain(o.domain)}`);for(let a of["hosting","email"]){let l=o.providers?.[a];if(l?.length){d(),console.log(` ${ue.default.bold(a.toUpperCase())}`);for(let f of l){let m=f.methods.map(g=>g.default?ue.default.green(`${g.name} (default)`):ue.default.dim(g.name)).join(ue.default.dim(", "));console.log(` ${ue.default.cyan(f.name.padEnd(20))} ${m}`)}}}d();return}return co(e,i)}async function co(e,t){let i={};if(t.target&&(i.target=t.target),t.provider&&(i.provider=t.provider),t.method&&(i.method=t.method),t.dryRun)return B("connect",{domain:e,...i},t.json,t.fields);let s=C(!t.json);s.start(`Connecting ${v.domain(e)}`);let n=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify(i)}),r=await n.json();n.ok||(s.stop("Connection failed"),u(r.error||r.message,{hint:r.hint,status:n.status,json:t.json,fields:t.fields}));let o=r.status==="manual_setup_required";if(s.stop(o?`${b.success} DNS instructions for ${ue.default.cyan(r.provider)}`:`${b.success} Connected to ${ue.default.cyan(r.provider)}`),t.json){w(r,t.fields);return}if(S(o?`Add these records at your registrar for ${v.domain(r.domain)}`:`Connected ${v.domain(r.domain)}`),c("Provider",ue.default.cyan(r.provider)),c("Method",r.method),r.records?.length){let a=[8,22,40];d(),console.log(` ${ue.default.bold("DNS Records")}`);let l=["Type","Name","Value"].map((m,g)=>ue.default.dim(m.padEnd(a[g]))).join(" "),f=a.map(m=>ue.default.dim("\u2500".repeat(m))).join(" ");console.log(` ${l}`),console.log(` ${f}`);for(let m of r.records){let g=m.record,y=m.status!=="already_set";process.stdout.isTTY&&y&&await Ut(50);let $=[ue.default.yellow(g.type),g.name,ue.default.cyan(g.value)+(g.priority?ue.default.dim(` pri=${g.priority}`):"")].map((j,O)=>Zi(j,a[O])).join(" "),h=m.status==="already_set"?ue.default.dim("\u2713"):m.status==="updated"?ue.default.yellow("\u21BA"):m.status==="pending"?ue.default.yellow("\u2192"):b.success,_=m.status==="already_set"?ue.default.dim(" already set"):m.status==="updated"?ue.default.dim(" updated"):m.status==="pending"?ue.default.dim(" add this"):"";console.log(` ${h} ${$}${_}`)}}d(),r.next_steps?.length?(console.log(` ${ue.default.bold("Next steps")}`),r.next_steps.forEach((a,l)=>{console.log(` ${ue.default.dim(`${l+1}.`)} ${a}`)})):r.hint&&console.log(` ${ue.default.dim(r.hint)}`),r.docs&&console.log(` ${ue.default.dim("Docs:")} ${v.url(r.docs)}`),d()}var ue,$n=Ae(()=>{"use strict";G();ue=D(M(),1);Ne();V();ge();Ze()});function Ft(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 i={},s=[["Authorization",e.authorizationEnv],["X-API-Key",e.apiKeyEnv]];for(let[n,r]of s){if(!r)continue;let o=t[r];if(!o)throw new Error(`Environment variable ${r} is not set`);i[n]=o}return Object.keys(i).length>0?i:void 0}function Mt(e){return e?Object.keys(e):[]}var es=Ae(()=>{"use strict"});var vo={};Ht(vo,{email:()=>fi,parseRecipients:()=>ts,recipientField:()=>is});function Sd(e){return[R.default.yellow(e.type),e.name,R.default.cyan(e.value)+(e.priority?R.default.dim(` pri=${e.priority}`):"")]}function kn(e){return jd[e]||e}function ts(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function is(e){if(e.length!==0)return e.length===1?e[0]:e}function Cd(e,t){if(e&&e.includes("@")){let[i,s]=e.split("@",2);!t.slug&&i&&(t.slug=i),!t.domain&&s&&(t.domain=s)}}async function Qe(e){return e.domain?(z(e.domain,e),e.domain):fe()}async function fi(e,t,i){if(e&&e.includes(".")&&!xd.includes(e))return i.check?fo(e,!!i.json,i.fields):t?po(e,t,!!i.json,i.fields):bo(e,!!i.json,i.fields);if(Cd(t,i),i.body&&!i.text&&(i.text=i.body),i.title&&!i.subject&&(i.subject=i.title),i.from&&i.from.includes("@")){let[s,n]=i.from.split("@",2);!i.slug&&s&&(i.slug=s),!i.domain&&n&&(i.domain=n)}switch(e){case void 0:return mo(i);case"list":return mo(i);case"inbox":return zd(i);case"folders":return Yd(i);case"archive":case"trash":case"restore":case"read":case"unread":case"star":case"unstar":return Xd(e,i);case"setup":return Ud(i);case"status":return qd(i);case"remove":return Fd(i);case"create":return Md(i);case"delete":return Ld(i);case"send":return Vd(i);case"webhook":return Zd(i);case"webhook-test":return Qd(i);case"forward":return ec(i);case"work":return Ed(i);case"triage":return Td(i);case"note":return Pd(i);case"notes":return Dd(i);case"activity":return Nd(i);case"changes":return Ad(i);case"coordination":return Od(i);case"presence":return Id(i);case"release-presence":return Rd(i);case"escalate":return Wd(i);case"remind":return Hd(i);case"contacts":return Jd(i);case"contact-add":return Bd(i);case"contact-remove":return Gd(i);case"tone":return Kd(i);case"check":return fo(i.domain||await fe(),!!i.json,i.fields);case"connect":return po(i.domain||await fe(),t||void 0,!!i.json,i.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:i.json,fields:i.fields})}}function _n(e){let t=e.mailboxIds?.split(",").map(i=>i.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 Od(e){let{mailboxId:t,threadKey:i}=_n(e),s=new URLSearchParams({mailbox_id:t,thread_key:i}),n=await x(`/api/email/collaboration/coordination?${s}`),r=await n.json();if(n.ok||u(r.error||"Could not read coordination",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return w(r,e.fields);S("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 Id(e){let{mailboxId:t,threadKey:i}=_n(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 s=e.mode||"viewing";["viewing","composing"].includes(s)||u("Mode must be viewing or composing",{code:"validation_error",json:e.json,fields:e.fields});let n=await x("/api/email/collaboration/coordination",{method:"PUT",body:JSON.stringify({mailbox_id:t,thread_key:i,client_id:e.clientId,mode:s,acquire_lease:e.acquireLease!==!1})}),r=await n.json();if(n.ok||u(r.error||"Could not heartbeat presence",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return w(r,e.fields);S("Conversation Presence"),c("Mode",s),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 Rd(e){let{mailboxId:t,threadKey:i}=_n(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 s=await x("/api/email/collaboration/coordination",{method:"DELETE",body:JSON.stringify({mailbox_id:t,thread_key:i,client_id:e.clientId,lease_id:e.leaseId})}),n=await s.json();if(s.ok||u(n.error||"Could not release presence",{code:n.code||"api_error",json:e.json,fields:e.fields}),e.json)return w(n,e.fields);S("Conversation Presence"),c("Released",e.clientId),c("Remaining presence",String(n.presence?.length||0))}async function Ad(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 i=new URLSearchParams({mailbox_id:t});e.cursor&&i.set("cursor",e.cursor),e.limit&&i.set("limit",e.limit);let s=await x(`/api/email/changes?${i}`),n=await s.json();if(s.ok||u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}),e.json)return w(n,e.fields);if(S("Mailbox Changes"),n.requires_full_sync){c("Full sync","Required"),c("Baseline cursor",n.next_cursor),Xe("Take a bounded mailbox snapshot, then call this command again with --cursor to replay concurrent changes.");return}n.changes.length?Z(["Sequence","Type","Resource","Created"],n.changes.map(r=>[r.sequence,r.type,`${r.resource_type}:${r.resource_id||"-"}`,r.created_at]),[12,32,40,24]):console.log(` ${R.default.dim("No changes since this cursor.")}`),c("Next cursor",n.next_cursor),n.has_more&&Xe("More changes are available; call again with the next cursor.")}async function Ed(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 i=new URLSearchParams({mailbox_ids:t.join(",")});e.status&&i.set("status",e.status),e.assigned&&i.set("assigned",e.assigned),e.limit&&i.set("limit",e.limit);let s=await x(`/api/email/work-queue?${i}`),n=await s.json();if(s.ok||u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}),e.json)return w(n,e.fields);if(S("Shared Inbox Work"),!n.items.length)return console.log(` ${R.default.dim("No conversations match this queue.")}`);Z(["Thread","Status","Assignee","Subject"],n.items.map(r=>[r.thread_key,r.status,r.assignee?.label||"Unassigned",r.subject||"(no subject)"]),[28,10,28,48]),n.partial&&Xe("This is a bounded snapshot. Increase --limit or use the API scan_limit when you need a wider queue.")}async function Td(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,i=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(n=>n.trim()).filter(Boolean),status:e.status,assignee:t,version:e.ifVersion?Number.parseInt(e.ifVersion,10):void 0})}),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 w(s,e.fields);S("Conversation Updated"),c("Status",s.status),c("Assignee",s.assignee?.label||"Unassigned"),c("Version",s.version)}async function Pd(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})}),i=await t.json();if(t.ok||u(i.error||i.message,{hint:i.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return w(i,e.fields);console.log(`${b.success} Private note added`)}async function Dd(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`),i=await t.json();if(t.ok||u(i.error||i.message,{hint:i.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return w(i,e.fields);if(S("Private Notes"),!i.notes.length)return console.log(` ${R.default.dim("No private notes yet.")}`);Z(["Author","Created","Note"],i.notes.map(s=>[s.author.label,s.created_at,s.body]),[28,24,64])}async function Nd(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`),i=await t.json();if(t.ok||u(i.error||i.message,{hint:i.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return w(i,e.fields);if(S("Conversation Activity"),!i.activity.length)return console.log(` ${R.default.dim("No activity yet.")}`);Z(["Type","Actor","Created"],i.activity.map(s=>[s.type,s.actor.label,s.created_at]),[36,32,24])}async function Ud(e){let t=await Qe(e);if(e.dryRun)return B("email_setup",{domain:t},e.json,e.fields);let i=C(!e.json);i.start(`Setting up email on ${v.domain(t)}`);let s=await x(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"POST"}),n=await s.json();if(s.ok||(i.stop("Failed"),u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Email ${n.status==="already_configured"?"already configured":"configured"}`),e.json){w(n,e.fields);return}if(n.records?.length){d(),S(`Email DNS Records ${v.domain(t)}`);let r=n.records.map(o=>[R.default.yellow(o.type),o.name,o.value.length>40?o.value.slice(0,40)+"...":o.value,o.status==="verified"||o.status==="created"?R.default.green(o.status):R.default.yellow(o.status)]);Z(["Type","Name","Value","Status"],r,[8,28,44,12])}d(),n.hint&&Xe(n.hint),I("Check status:",`domani email status --domain ${t}`),d()}async function qd(e){let t=await Qe(e),i=C(!e.json);i.start(`Checking email status for ${v.domain(t)}`);let s=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),n=await s.json();if(s.ok||(i.stop("Failed"),u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Status loaded`),e.json){w(n,e.fields);return}if(S(`Email ${v.domain(t)}`),c("Enabled",n.enabled?R.default.green("yes"):R.default.dim("no")),n.enabled&&(c("Verified",n.verified?R.default.green("yes"):R.default.yellow("pending")),c("Mailboxes",String(n.mailbox_count))),d(),!n.enabled)I("Set up email:",`domani email setup --domain ${t}`),d();else if(!n.verified&&n.records?.length){console.log(` ${R.default.yellow("!")} Add these DNS records to verify:`);for(let r of n.records)console.log(` ${R.default.yellow(r.type)} ${r.name} ${R.default.dim("\u2192")} ${r.value.length>50?r.value.slice(0,50)+"...":r.value}`);d()}}async function Fd(e){let t=await Qe(e);if(e.dryRun)return B("email_remove",{domain:t},e.json,e.fields);let i=C(!e.json);i.start(`Removing email from ${v.domain(t)}`);let s=await x(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"DELETE"}),n=await s.json();if(s.ok||(i.stop("Failed"),u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Email disabled`),e.json){w(n,e.fields);return}n.mailboxes_deleted>0&&console.log(` ${R.default.dim(`${n.mailboxes_deleted} mailbox(es) deleted.`)}`),d()}async function mo(e){let t=C(!e.json);t.start("Loading mailboxes");let i=e.domain?`?domain=${encodeURIComponent(e.domain)}`:"",s=await x(`/api/emails${i}`),n=await s.json();s.ok||(t.stop("Failed"),u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}));let r=n.mailboxes||[];if(t.stop(`${b.success} ${r.length} mailbox(es)`),e.json){w(n,e.fields);return}if(r.length===0){d(),console.log(` ${R.default.dim("No mailboxes.")}`),d(),I("Create one:","domani email create hello@example.com"),d();return}d(),S("Mailboxes");let o=r.map(a=>[R.default.cyan(a.address),String(a.message_count),a.webhook_url?v.url(a.webhook_url):R.default.dim("-"),R.default.dim(new Date(a.created_at).toLocaleDateString())]);Z(["Address","Messages","Webhook","Created"],o,[32,10,36,14]),d()}async function Md(e){let t=await Qe(e);if(e.dryRun)return B("email_create_mailbox",{domain:t,slug:e.slug,workspace_id:e.workspace},e.json,e.fields);let i=e.slug;if(!i&&!e.json){let f=await Te({message:`Email handle for @${t}:`,placeholder:"hello"});le(f)&&process.exit(0),i=f}i||u("Slug required",{hint:`Usage: domani email create hello@${t}`,code:"validation_error",json:e.json,fields:e.fields});let s=`${i}@${t}`,n=C(!e.json);n.start("Creating mailbox");let r=await x("/api/emails",{method:"POST",body:JSON.stringify({address:s,workspace_id:e.workspace})}),o=await r.json();if(r.status===202&&!e.json){n.stop("");let f=o.txt_record,m=o.email_records||[],g=[{type:"TXT",name:f?.name||"@",value:f?.value||"",note:"ownership proof"},...m];d(),console.log(" Add these records at your DNS provider:"),d();for(let j of g){let O=j.priority!==void 0?` ${R.default.dim(`priority: ${j.priority}`)}`:"",A=j.note?` ${R.default.dim(`(${j.note})`)}`:"";console.log(` ${R.default.yellow(j.type)} ${R.default.bold(j.name)}${O}${A}`),console.log(` ${R.default.dim("\u2192")} ${R.default.cyan(j.value)}`),d()}Xe("DNS propagation typically takes 5\u201330 minutes. Checking automatically..."),d();let y=g.map(j=>({cells:[R.default.yellow(j.type),j.name,j.note?R.default.dim(`(${j.note})`):""],status:"pending"})),k=qt(["Type","Name",""],y,[6,24,16]);k.start();let $=0;for(;r.status===202&&$<60;)await Ut(15e3),$++,r=await x("/api/emails",{method:"POST",body:JSON.stringify({address:s,workspace_id:e.workspace})}),o=await r.json(),r.status!==202&&!r.ok&&(k.stop(),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));r.status===202&&(k.stop(),u("TXT record not detected after 15 minutes.",{hint:`Check the record is set, then retry: domani email create ${s}`,code:"timeout",json:e.json,fields:e.fields})),k.markDone(0);let h=j=>`${j.type}:${j.name}`,_=new Map;g.slice(1).forEach((j,O)=>_.set(h(j),O+1));for(let j=0;j<60;j++){await Ut(15e3);let O=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),A=await O.json();if(O.ok&&A.records){for(let L of A.records)if(L.status==="verified"||L.status==="created"){let H=_.get(h(L));H!==void 0&&k.markDone(H)}}if(O.ok&&A.verified)break}k.stop(),d()}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(`${b.success} ${R.default.cyan(o.address)} created`),e.json){w(o,e.fields);return}let a=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),l=await a.json();d(),a.ok&&l.verified?(I("Read inbox:",`domani email inbox ${o.address}`),I("Web inbox:",`${ni}/inbox?address=${encodeURIComponent(o.address)}`)):(I("Check propagation:",`domani email status --domain ${t}`),I("Web inbox:",`${ni}/inbox?address=${encodeURIComponent(o.address)}`)),d()}async function Ld(e){let t=await Qe(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 B("email_delete_mailbox",{domain:t,address:`${e.slug}@${t}`},e.json,e.fields);let i=C(!e.json);i.start(`Deleting ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),n=await x(`/api/emails/${s}`,{method:"DELETE",body:JSON.stringify({confirm:!0})}),r=await n.json();if(n.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:n.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Mailbox deleted`),e.json){w(r,e.fields);return}console.log(` ${R.default.dim(`${r.address} and all messages deleted.`)}`),d()}async function Vd(e){let t=await Qe(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 B("email_send",{from:`${e.slug}@${t}`,to:e.to,subject:e.subject},e.json,e.fields);let i=C(!e.json);i.start(`Sending from ${e.slug}@${t}`);let s={to:is(ts(e.to))},n=is(ts(e.cc)),r=is(ts(e.bcc));n&&(s.cc=n),r&&(s.bcc=r),e.subject&&(s.subject=e.subject),e.text&&(s.text=e.text),e.inReplyTo&&(s.in_reply_to=e.inReplyTo),e.references&&(s.references=e.references),e.sendAt&&(s.send_at=e.sendAt);let o=encodeURIComponent(`${e.slug}@${t}`),a=await x(`/api/emails/${o}/send`,{method:"POST",body:JSON.stringify(s)}),l=await a.json();if(!a.ok){i.stop("Failed");let m=l.code==="MONTHLY_LIMIT_EXCEEDED"?`Run ${R.default.cyan("domani upgrade")} to switch to Pro (10,000 emails/month).`:l.hint;u(l.error||l.message,{hint:m,status:a.status,json:e.json,fields:e.fields})}let f=Array.isArray(l.to)?l.to.join(", "):l.to;if(i.stop(l.status==="scheduled"?`${b.success} Scheduled for ${R.default.cyan(e.sendAt||"")} to ${R.default.cyan(f)} ${R.default.dim("(trash the message before then to cancel)")}`:`${b.success} Sent to ${R.default.cyan(f)}`),e.json){w(l,e.fields);return}}function xn(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 go(e,t,i,s,n){let r=C(!i.json);r.start(s);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:i.json,fields:i.fields})),r.stop(n(a)),i.json&&w(a,i.fields)}async function Wd(e){let t='Usage: domani email escalate hello@example.com --message-id MSG_ID [--reason "refund over $500"] [--clear]',{address:i}=xn(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let s={};e.reason&&(s.reason=e.reason),e.clear&&(s.clear=!0),await go(`/api/emails/${encodeURIComponent(i)}/messages/${encodeURIComponent(e.messageId)}/escalate`,s,e,e.clear?"Clearing escalation":"Flagging for a human",n=>n.needs_human?`${b.success} Flagged for a human ${R.default.dim("(conversation held, email.escalated fired)")}`:`${b.success} Escalation cleared`)}async function Hd(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:i}=xn(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 s={};e.at&&(s.remind_at=e.at),e.note&&(s.note=e.note),e.clear&&(s.clear=!0),await go(`/api/emails/${encodeURIComponent(i)}/messages/${encodeURIComponent(e.messageId)}/remind`,s,e,e.clear?"Clearing reminder":"Setting follow-up reminder",n=>n.remind_at?`${b.success} Reminder set for ${R.default.cyan(String(n.remind_at))} ${R.default.dim("(fires only if still unanswered)")}`:`${b.success} Reminder cleared`)}async function Jd(e){let t=new URLSearchParams;e.q&&t.set("q",e.q),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let i=await x(`/api/contacts${t.size?`?${t}`:""}`),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){w(s,e.fields);return}let n=s.contacts||[];if(n.length===0){console.log(R.default.dim("No contacts yet. The address book fills itself as mail flows in and out."));return}for(let r of n){let o=r.name?` ${R.default.dim(r.name)}`:"",a=r.notes?` ${R.default.dim("-")} ${r.notes}`:"";console.log(`${R.default.cyan(r.address)}${o} ${R.default.dim(`(${r.message_count} msg${r.message_count!==1?"s":""}, last ${r.last_direction||"-"})`)}${a}`)}s.next_cursor&&console.log(R.default.dim(`More: --cursor ${s.next_cursor}`))}function yo(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 Bd(e){let i=yo(e,'Usage: domani email contact-add ada@example.com [--name "Ada"] [--notes "prefers short emails"]'),s={address:i};e.name!==void 0&&(s.name=e.name),e.notes!==void 0&&(s.notes=e.notes);let n=await x("/api/contacts",{method:"POST",body:JSON.stringify(s)}),r=await n.json();if(n.ok||u(r.error||r.message,{hint:r.hint,status:n.status,json:e.json,fields:e.fields}),e.json){w(r,e.fields);return}console.log(`${b.success} Contact ${R.default.cyan(i)} saved.`)}async function Gd(e){let i=yo(e,"Usage: domani email contact-remove ada@example.com"),s=await x(`/api/contacts/${encodeURIComponent(i)}`,{method:"DELETE"}),n=await s.json();if(s.ok||u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}),e.json){w(n,e.fields);return}console.log(n.deleted?`${b.success} Contact ${R.default.cyan(i)} deleted.`:R.default.dim(`No contact ${i}.`))}async function Kd(e){let t='Usage: domani email tone hello@example.com [--set "lowercase, friendly, sign as Ada"] [--clear]',{address:i}=xn(e,t),s=encodeURIComponent(i);if(e.set===void 0&&!e.clear){let o=await x(`/api/emails/${s}`),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){w({address:i,tone_notes:a.tone_notes??null},e.fields);return}console.log(a.tone_notes?a.tone_notes:R.default.dim(`No tone notes on ${i}. Set them with --set.`));return}let n=await x(`/api/emails/${s}`,{method:"PATCH",body:JSON.stringify({tone_notes:e.clear?null:e.set})}),r=await n.json();if(n.ok||u(r.error||r.message,{hint:r.hint,status:n.status,json:e.json,fields:e.fields}),e.json){w(r,e.fields);return}console.log(e.clear?`${b.success} Tone notes cleared on ${R.default.cyan(i)}.`:`${b.success} Tone notes set on ${R.default.cyan(i)}.`)}async function zd(e){let t=await Qe(e);e.slug||u("Slug required",{hint:"Usage: domani email inbox hello@example.com [--direction in|out] [--limit 20]",code:"validation_error",json:e.json,fields:e.fields});let i=new URLSearchParams;e.direction&&i.set("direction",e.direction),e.folder&&i.set("folder",e.folder),e.view&&i.set("view",e.view),e.limit&&i.set("limit",e.limit);let s=i.toString()?`?${i}`:"",n=C(!e.json);n.start(`Loading messages for ${e.slug}@${t}`);let r=encodeURIComponent(`${e.slug}@${t}`),o=await x(`/api/emails/${r}/messages${s}`),a=await o.json();o.ok||(n.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:e.json,fields:e.fields}));let l=a.messages||[];if(e.json){n.stop(`${b.success} ${l.length} message(s)`),w(a,e.fields);return}if(l.length===0){n.stop(`${R.default.dim("No messages")}`);return}let f=l.length>1?"s":"";n.stop(`${b.success} ${R.default.cyan(`${e.slug}@${t}`)} ${R.default.dim("\xB7 "+l.length+" message"+f)}`);for(let m of l){let g=m.direction==="in"?R.default.green("in "):R.default.dim("out"),y=m.direction==="in"?m.from:m.to,k=m.subject||"(no subject)",$=R.default.dim(new Date(m.created_at).toLocaleString()),h=k;if(m.text){let _=m.text.replace(/\s+/g," ").trim(),j=_.length>60?_.slice(0,60)+"\u2026":_;h=`${k} ${R.default.dim("- "+j)}`}console.log(` ${g} ${y.padEnd(30)} ${h} ${$}`)}a.next_cursor&&console.log(` ${R.default.dim("\u2026 more available, use --limit to paginate")}`)}async function Yd(e){let t=await Qe(e);e.slug||u("Slug required",{hint:"Usage: domani email folders hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let i=encodeURIComponent(`${e.slug}@${t}`),s=await x(`/api/emails/${i}/folders`),n=await s.json();if(s.ok||u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}),e.json)return w(n,e.fields);S(`Folders for ${e.slug}@${t}`);for(let r of n.folders||[])c(r.id,`${r.total} total, ${r.unread} unread`);for(let r of n.views||[])c(r.id,`${r.total} total, ${r.unread} unread`)}async function Xd(e,t){let i=await Qe(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 s=(t.messageIds||"").split(",").map(m=>m.trim()).filter(Boolean);s.length||u("Message IDs required",{hint:"Pass --message-ids id1,id2",code:"validation_error",json:t.json,fields:t.fields});let n={message_ids:s,idempotency_key:t.idempotencyKey||(0,ho.randomUUID)()};if((e==="archive"||e==="trash")&&Object.assign(n,{action:"move",destination:e==="archive"?"archive":"trash"}),e==="restore"&&(n.action="restore"),(e==="read"||e==="unread")&&Object.assign(n,{action:"mark_read",read:e==="read"}),(e==="star"||e==="unstar")&&Object.assign(n,{action:"star",starred:e==="star"}),t.dryRun)return B("email_messages_action",{address:`${t.slug}@${i}`,...n},t.json,t.fields);let r=encodeURIComponent(`${t.slug}@${i}`),o=await x(`/api/emails/${r}/messages/actions`,{method:"POST",body:JSON.stringify(n)}),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 w(a,t.fields);let l=(a.results||[]).filter(m=>m.ok).length,f=(a.results||[]).length-l;console.log(`${b.success} ${l} updated${f?R.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 Zd(e){let t=await Qe(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 i=`${e.slug}@${t}`,s=encodeURIComponent(i),n;try{n=Ft(e)}catch(o){u(o instanceof Error?o.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})}if(!e.url&&n!==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 B("email_webhook",{address:i,webhook_url:e.url||null,...n!==void 0?{header_names:Mt(n)}:{}},e.json,e.fields);let r=C(!e.json);if(e.url){r.start(`Setting webhook for ${i}`);let o=await x(`/api/emails/${s}/webhook`,{method:"PUT",body:JSON.stringify({url:e.url,...n!==void 0?{headers:n}:{}})}),a=await o.json();if(o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:e.json,fields:e.fields})),r.stop(`${b.success} Webhook set`),e.json){w(a,e.fields);return}S(`Mailbox ${a.address}`),c("Webhook",v.url(a.webhook_url)),c("Auth headers",a.header_names?.join(", ")||R.default.dim("none")),c("Signing secret",R.default.dim(a.signing_secret)),d()}else{r.start(`Removing webhook for ${i}`);let o=await x(`/api/emails/${s}/webhook`,{method:"DELETE"}),a=await o.json();if(o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:e.json,fields:e.fields})),r.stop(`${b.success} Webhook removed`),e.json){w(a,e.fields);return}S(`Mailbox ${a.address}`),c("Webhook",R.default.dim("none")),d()}}async function Qd(e){let t=await Qe(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 i=`${e.slug}@${t}`;if(e.dryRun)return B("email_webhook_test",{address:i},e.json,e.fields);let s=C(!e.json);s.start(`Testing webhook for ${i}`);let n=await x(`/api/emails/${encodeURIComponent(i)}/webhook/test`,{method:"POST"}),r=await n.json();if((!n.ok||!r.success)&&(s.stop("Failed"),u(r.error||r.message||"Webhook test failed",{hint:r.hint||"Check the endpoint and sender authentication, then retry.",status:n.status,json:e.json,fields:e.fields})),s.stop(`${b.success} Test delivered`),e.json)return w(r,e.fields);S(`Mailbox ${i}`),c("Delivery",R.default.green("successful")),typeof r.status=="number"&&c("Endpoint",`HTTP ${r.status}`),d()}async function ec(e){let t=await Qe(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 B("email_forward",{address:`${e.slug}@${t}`,forward_to:e.forwardTo||null},e.json,e.fields);let i=C(!e.json),s=e.forwardTo||null;i.start(`Updating forward for ${e.slug}@${t}`);let n=encodeURIComponent(`${e.slug}@${t}`),r=await x(`/api/emails/${n}`,{method:"PATCH",body:JSON.stringify({forward_to:s})}),o=await r.json();if(r.ok||(i.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Forward ${s?"set":"removed"}`),e.json){w(o,e.fields);return}S(`Mailbox ${o.address}`),c("Forward to",o.forward_to?R.default.cyan(o.forward_to):R.default.dim("none")),d()}async function fo(e,t,i){let s=C(!t);s.start(`Checking email health for ${v.domain(e)}`);let n=await x(`/api/domains/${encodeURIComponent(e)}/email/check`),r=await n.json();if(n.ok||(s.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:n.status,json:t,fields:i})),s.stop("Email health checked"),t){w(r,i);return}if(S(`Email Health ${v.domain(r.domain)}`),r.provider?c("Provider",R.default.cyan(kn(r.provider))):c("Provider",R.default.dim("unknown")),r.mx.configured?c("MX",`${b.success} ${R.default.green("propagated")} ${R.default.dim(`(${r.mx.records.length} record${r.mx.records.length!==1?"s":""})`)}`):c("MX",`${b.error} ${R.default.red("not configured")}`),r.spf.configured?c("SPF",`${b.success} ${R.default.green(r.spf.value)}`):c("SPF",`${b.error} ${R.default.red("missing")}`),r.dmarc.configured){let o=r.dmarc.value.length>50?r.dmarc.value.slice(0,50)+"...":r.dmarc.value;c("DMARC",`${b.success} ${R.default.green(o)}`)}else c("DMARC",`${b.error} ${R.default.red("missing")}`);r.dkim.configured?c("DKIM",`${b.success} ${R.default.green("found")} ${R.default.dim(`(${r.dkim.selectors.join(", ")})`)}`):c("DKIM",`${b.warning} ${R.default.yellow("not found")}`),d(),r.mx.configured?(!r.spf.configured||!r.dmarc.configured)&&(Xe("SPF and DMARC protect against email spoofing. Re-run email setup to add them."),d()):(I("Set up email:",`domani email ${e} google`),d())}async function po(e,t,i,s){return t?wo(e,t,i,s):bo(e,i,s)}async function bo(e,t,i){let s=C(!t);s.start("Loading email providers");let n=await x(`/api/domains/${encodeURIComponent(e)}/connect`),r=await n.json();n.ok||(s.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:n.status,json:t,fields:i})),s.stop("Providers loaded");let o=r.providers?.email||[];o.length===0&&u("No email providers available",{code:"not_found",json:t,fields:i});let a=await tt({message:"Choose an email provider",options:o.map(l=>({value:l.name,label:kn(l.name)}))});return le(a)&&process.exit(0),wo(e,a,t,i)}async function wo(e,t,i,s){if(i){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:i,fields:s}),w(m,s);return}let n=await x(`/api/domains/${encodeURIComponent(e)}/connect?provider=${encodeURIComponent(t)}`);if(!n.ok){let f=await n.json();u(f.error||f.message,{hint:f.hint,status:n.status,json:i,fields:s})}let r=await n.json(),o=r.preview?.records??[],a=r.preview?.provider??t,l=kn(a);if(S(`Email ${v.domain(e)}`),c("Provider",R.default.cyan(l)),o.length){d(),console.log(` ${R.default.bold("DNS Records")}`);let f=[8,24,40],m=qt(["Type","Name","Value"],o.map(j=>({cells:Sd(j),status:"pending"})),f);m.start();let g=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),y=await g.json();g.ok||(m.stop(),d(),u(y.error||y.message,{hint:y.hint,status:g.status,json:i,fields:s}));let k=y.records||[];for(let j=0;j<o.length;j++)k.find(A=>A.record.type===o[j].type&&A.record.name===o[j].name&&A.record.value===o[j].value)?.status==="already_set"||await Ut(60),m.markDone(j);await Ut(80),m.stop();let $=k.filter(j=>j.status==="created"||j.status==="updated").length,h=k.filter(j=>j.status==="already_set").length,_;h===k.length?_=`All ${h} records already set`:h>0?_=`${$} created, ${h} already set`:_=`${$} DNS records set`,d(),console.log(` ${b.success} ${R.default.green(`Email configured - ${_}`)}`)}else{let f=C(!0);f.start("Setting DNS records");let m=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),g=await m.json();m.ok||(f.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:m.status,json:i,fields:s})),f.stop(`${b.success} Email configured via ${R.default.cyan(l)}`)}d(),I("Verify propagation:",`domani email ${e} --check`),d()}var R,ho,xd,jd,jn=Ae(()=>{"use strict";G();ri();R=D(M(),1);Ne();V();ge();Ze();ho=require("node:crypto");es();xd=["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"],jd={"google-workspace":"Google Workspace",fastmail:"Fastmail",proton:"Proton Mail"}});var $o={};Ht($o,{dns:()=>Cn});async function Cn(e,t,i,s,n,r){e||(e=await fe()),z(e,r);let o=r?.json??!1,a=r?.type||i,l=r?.name||s,f=r?.value||n;if(!t||t==="get"){let m=C(!o);m.start(`Loading DNS for ${v.domain(e)}`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns`),y=await g.json();if(g.ok||(m.stop("Failed"),u(y.error||y.message,{hint:y.hint,status:g.status,json:o,fields:r?.fields})),m.stop(`${y.records.length} record(s)`),o){w(y,r?.fields);return}if(y.records.length===0){d(),console.log(` ${Ce.default.dim(`No DNS records for ${e}`)}`),d(),I("Auto-configure DNS:",`domani connect ${e}`),d();return}let k=[8,24,40,8];S(`DNS ${v.domain(e)}`,k.reduce((h,_)=>h+_,0)+k.length-1);let $=y.records.map(h=>{let _=h.priority?Ce.default.dim(` pri=${h.priority}`):"";return[Ce.default.yellow(h.type),h.name,Ce.default.cyan(h.value)+_,Ce.default.dim(String(h.ttl))]});Z(["Type","Name","Value","TTL"],$,k),d();return}if(t==="set"){if((!a||!l||!f)&&u("Missing arguments for dns set",{hint:"Usage: domani dns <domain> set --type A --name www --value 1.2.3.4",code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return B("dns_set",{domain:e,record:{type:a.toUpperCase(),name:l,value:f,ttl:3600}},o,r?.fields);let m=C(!o);m.start(`Setting ${Ce.default.yellow(a.toUpperCase())} record`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns`),y=await g.json(),$=(g.ok?y.records:[]).filter(j=>!(j.type===a.toUpperCase()&&j.name===l));$.push({type:a.toUpperCase(),name:l,value:f,ttl:3600});let h=await x(`/api/domains/${encodeURIComponent(e)}/dns`,{method:"PUT",body:JSON.stringify({records:$})}),_=await h.json();h.ok||(m.stop("Failed"),u(_.error||_.message,{hint:_.hint,status:h.status,json:o,fields:r?.fields})),m.stop(`${b.success} ${Ce.default.yellow(a.toUpperCase())} ${l} ${b.arrow} ${Ce.default.cyan(f)}`),o?w(_,r?.fields):(d(),I("Check propagation:",`domani status ${e}`),d());return}if(t==="delete"){if((!a||!l)&&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 B("dns_delete",{domain:e,record:{type:a.toUpperCase(),name:l}},o,r?.fields);let m=C(!o);m.start(`Deleting ${Ce.default.yellow(a.toUpperCase())} ${l}`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns?type=${encodeURIComponent(a.toUpperCase())}&name=${encodeURIComponent(l)}`,{method:"DELETE"}),y=await g.json();g.ok||(m.stop("Failed"),u(y.error||y.message,{hint:y.hint,status:g.status,json:o,fields:r?.fields})),m.stop(`${b.success} Deleted ${Ce.default.yellow(a.toUpperCase())} ${l}`),o?w(y,r?.fields):(d(),I("Check propagation:",`domani status ${e}`),d());return}if(t==="snapshot"){if(r?.dryRun)return B("dns_snapshot",{domain:e},o,r?.fields);let m=C(!o);m.start(`Capturing DNS snapshot for ${v.domain(e)}`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns/snapshot`,{method:"POST"}),y=await g.json();g.ok||(m.stop("Failed"),u(y.error||y.message,{hint:y.hint,status:g.status,json:o,fields:r?.fields}));let k=y.records?.length??0;if(m.stop(`${b.success} Captured ${k} record(s)`),o){w(y,r?.fields);return}let $=`${e}.dns.json`,h=(0,Sn.resolve)(process.cwd(),$);(0,ss.writeFileSync)(h,JSON.stringify(y,null,2)+`
178
+ `)}else{for(let k of y)console.log(k);f=!0}}return{start(){n&&(process.stdout.write("\x1B[?25l"),process.on("exit",m)),g(),n&&(o=setInterval(()=>{r++,g()},80))},markDone(y,k){t[y].status="done",k!==void 0&&(t[y].icon=k),n&&g()},stop(){o&&clearInterval(o);for(let y of t)y.status="done";g(),n&&(process.stdout.write("\x1B[?25h"),process.removeListener("exit",m))}}}var J,Kr,Se,b,v,rd,od,ld,Gr,V=Ae(()=>{"use strict";J=D(M(),1),Kr=require("child_process");Ne();Se=process.stdout.isTTY??!1;b={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")},v={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\\`};rd={start:()=>{},stop:()=>{},message:()=>{}};od=/\x1b\]8;;[^\x1b]*\x1b\\|\x1b\[[0-9;]*m/g;ld={auth_required:"domani login",payment_required:"domani card add",contact_required:"domani contact set"};Gr=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]});function Xr(e){return typeof e=="string"&&["pro","agent","fleet","scale","mail_solo","mail_team","mail_business"].includes(e)}function Zr(e){return Xr(e.plan)||Array.isArray(e.workspace_plans)&&e.workspace_plans.some(Xr)}async function Qr(){if(gn)return;let e=process.argv.includes("--json")||!Ps,t=Le(),i=Ve();try{let r=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${i}`}})).json();if(Zr(r)){gn=!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)),d(),console.log(` ${ve.default.dim("This feature requires a")} ${ve.default.bold("paid plan")} ${ve.default.dim("(including an active Mailzero workspace plan or legacy Pro subscription).")}`),console.log(` ${ve.default.dim("Opening pricing page")} ${b.arrow} ${ve.default.cyan("domani.run/pricing")}`),Je(`${t.replace("http://localhost:3000","https://domani.run")}/pricing`),d();let s=C(!0);s.start("Waiting for upgrade...");for(let n=0;n<120;n++){await new Promise(r=>setTimeout(r,5e3));try{let o=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${i}`}})).json();if(Zr(o)){gn=!0,s.stop(`${b.success} Paid plan active! Continuing...`),d();return}}catch{}}s.stop("Timed out"),console.error(` ${ve.default.red("\u2717")} No upgrade detected. Visit ${ve.default.cyan("domani.run/settings")} to upgrade.`),process.exit(1)}async function eo(){if(hn||Ve()){hn=!0;return}(process.argv.includes("--json")||!Ps)&&(console.log(JSON.stringify({error:"Not logged in",code:"auth_required",hint:"Run 'domani login' or set DOMANI_API_KEY environment variable",fix_command:"domani login"},null,2)),process.exit(1)),d(),console.log(` ${ve.default.dim("You're not logged in.")} Starting authentication...`),d();let t=Le(),i=C(!0);i.start("Requesting auth code");let s;try{s=await fetch(`${t}/api/auth/cli`,{method:"POST",headers:{"Content-Type":"application/json"}})}catch{i.stop("Failed"),console.error(` ${ve.default.red("\u2717")} Could not reach ${t}. Check your connection.`),process.exit(1)}if(!s.ok){i.stop("Failed");let o=`Server error (${s.status})`;try{let a=await s.json();o=a.error||a.message||o}catch{}console.error(` ${ve.default.red("\u2717")} ${o}`),process.exit(1)}let n,r;try{({code:n,auth_url:r}=await s.json())}catch{i.stop("Failed"),console.error(` ${ve.default.red("\u2717")} Invalid response from server.`),process.exit(1)}i.stop(`${b.success} Auth code ready`),d(),console.log(` ${ve.default.dim("Verification code:")} ${ve.default.bold(ve.default.cyan(n))}`),console.log(` ${ve.default.dim("Opening browser")} ${b.arrow} ${v.url(r)}`),Je(r),d(),i.start("Waiting for browser approval");for(let o=0;o<120;o++){await new Promise(f=>setTimeout(f,5e3));let a=await fetch(`${t}/api/auth/cli/poll?code=${n}`).catch(()=>null);if(!a||!a.ok&&a.status!==202)continue;let l=await a.json().catch(()=>({}));if(l.status==="complete"){zt({...ht(),token:l.token,email:l.email,api_url:t}),hn=!0,i.stop(`${b.success} Logged in as ${ve.default.bold(l.email)}`),d();return}}i.stop("Timed out"),console.error(` ${ve.default.red("\u2717")} No approval received. Run ${ve.default.cyan("domani login")} to try again.`),process.exit(1)}var ve,hn,gn,yn=Ae(()=>{"use strict";ve=D(M(),1);gt();V();hn=!1,gn=!1});function so(e){return e.json=async()=>{let t=await e.clone().text();try{return JSON.parse(t)}catch{let i=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${i?` (got: "${i}")`:""}. 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={},i=!1){let s=Ve(),n=`${Le()}${e}`,r=await fetch(n,{...t,headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json","User-Agent":`domani-cli/${xe}`,...t.headers}});if(!i){let o=await r.clone().text();try{if(JSON.parse(o).code==="UPGRADE_REQUIRED")return await Qr(),x(e,t,!0)}catch{}}return so(r)}async function we(e,t={}){let i=`${Le()}${e}`,s=Ve(),n=await fetch(i,{...t,headers:{"Content-Type":"application/json","User-Agent":`domani-cli/${xe}`,...s?{Authorization:`Bearer ${s}`}:{},...t.headers}});return so(n)}var G=Ae(()=>{"use strict";gt();yn()});function St(){return{ok:!0}}function bt(e,t,i){return{ok:!1,error:{message:e,code:t,hint:i}}}function oo(e){return md.test(e)?bt("Input contains control characters","invalid_input","Remove non-printable characters from the input"):St()}function bd(e){return fd.test(e)?bt("Input contains path traversal","invalid_input","Domain names cannot contain '../' or '..\\'"):St()}function wd(e){return pd.test(e)?bt("Input contains query string or fragment","invalid_input","Remove '?' or '#' from the domain name"):St()}function vd(e){return hd.test(e)?bt("Input contains percent-encoded characters","invalid_input","Use plain text, not URL-encoded values (e.g. 'example.com' not 'example%2Ecom')"):St()}function ao(e){if(!e)return bt("Domain name is required","validation_error");if(e.length>ro)return bt(`Domain name too long (${e.length} chars, max ${ro})`,"validation_error");for(let t of[oo,bd,wd,vd]){let i=t(e);if(!i.ok)return i}return gd.test(e)?St():bt(`Invalid domain name: ${e}`,"validation_error","Domain names can only contain letters, digits, hyphens, and dots")}function $d(e){if(!e)return bt("TLD is required","validation_error");let t=oo(e);return t.ok?yd.test(e)?St():bt(`Invalid TLD: ${e}`,"validation_error","TLDs contain only letters (e.g. 'com', '.dev', 'ai')"):t}function kd(e){for(let t of e){let i=ao(t);if(!i.ok)return i}return St()}function _d(e){for(let t of e){let i=$d(t);if(!i.ok)return i}return St()}function z(e,t){let i=ao(e);i.ok||u(i.error.message,{code:i.error.code,hint:i.error.hint,json:t?.json,fields:t?.fields})}function lo(e,t){let i=kd(e);i.ok||u(i.error.message,{code:i.error.code,hint:i.error.hint,json:t?.json,fields:t?.fields})}function Qi(e,t){let i=_d(e);i.ok||u(i.error.message,{code:i.error.code,hint:i.error.hint,json:t?.json,fields:t?.fields})}var md,fd,pd,hd,gd,yd,ro,ge=Ae(()=>{"use strict";V();md=/[\x00-\x08\x0b\x0c\x0e-\x1f]/,fd=/\.\.[/\\]/,pd=/[?#]/,hd=/%[0-9a-fA-F]{2}/,gd=/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*\.?$/,yd=/^\.?[a-zA-Z]{2,63}$/,ro=253});async function fe(){Se||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=C(!0);e.start("Loading your domains");let t=await x("/api/domains"),i=await t.json();t.ok||(e.stop("Failed"),pn(i.error,i.hint),process.exit(1));let s=i.domains||[];s.length===0&&(e.stop("No domains"),d(),console.log(` ${wn.default.dim("No domains yet.")} Use: ${wn.default.cyan("domani buy <domain>")}`),d(),process.exit(0)),e.stop(`${s.length} domain(s)`);let n=await tt({message:"Which domain?",options:s.map(r=>({value:r.domain,label:r.domain,hint:r.status!=="active"?r.status:void 0}))});return le(n)&&process.exit(0),n}var wn,Ze=Ae(()=>{"use strict";G();Ne();wn=D(M(),1);V()});var uo={};Ht(uo,{connect:()=>vn});async function vn(e,t,i){e||(e=await fe()),z(e,i);let s;if(t&&!i.provider?t.includes(".")?s=t:i.provider=t:s=t,!s&&!i.provider&&!i.list&&i.dryRun)return B("connect",{domain:e,note:"No provider specified. Pass --provider <name> to connect."},i.json,i.fields);if(!s&&!i.provider&&!i.list){let n=C(!i.json);n.start(`Loading providers for ${v.domain(e)}`);let r=await x(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(n.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:i.json,fields:i.fields})),n.stop("Providers loaded"),i.json){w(o,i.fields);return}let a=[];for(let h of["hosting","email"]){let _=o.providers?.[h]||[];for(let j of _)a.push({value:`${h}:${j.name}`,label:j.name,hint:h})}a.length===0&&u("No providers available",{code:"not_found",json:i.json,fields:i.fields});let l=await tt({message:"Choose a provider",options:a});le(l)&&process.exit(0);let[f,m]=l.split(":"),y=(o.providers?.[f]||[]).find(h=>h.name===m),k;if(y&&y.methods.length>1){let h=await tt({message:"Choose a method",options:y.methods.map(_=>({value:_.name,label:_.name,hint:_.default?"default":void 0}))});le(h)&&process.exit(0),k=h}let $;if(f==="hosting"&&y?.requires_target){y.notes?.setup&&Xe(y.notes.setup);let h=await Te({message:"Target hostname or IP"});le(h)&&process.exit(0),$=h.trim()}return co(e,{target:$,provider:m,method:k,dryRun:i.dryRun,json:!1})}if(i.list){let n=C(!i.json);n.start(`Loading providers for ${v.domain(e)}`);let r=await x(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(n.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:i.json,fields:i.fields})),n.stop("Providers loaded"),i.json){w(o,i.fields);return}S(`Providers for ${v.domain(o.domain)}`);for(let a of["hosting","email"]){let l=o.providers?.[a];if(l?.length){d(),console.log(` ${ue.default.bold(a.toUpperCase())}`);for(let f of l){let m=f.methods.map(g=>g.default?ue.default.green(`${g.name} (default)`):ue.default.dim(g.name)).join(ue.default.dim(", "));console.log(` ${ue.default.cyan(f.name.padEnd(20))} ${m}`)}}}d();return}return co(e,i)}async function co(e,t){let i={};if(t.target&&(i.target=t.target),t.provider&&(i.provider=t.provider),t.method&&(i.method=t.method),t.dryRun)return B("connect",{domain:e,...i},t.json,t.fields);let s=C(!t.json);s.start(`Connecting ${v.domain(e)}`);let n=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify(i)}),r=await n.json();n.ok||(s.stop("Connection failed"),u(r.error||r.message,{hint:r.hint,status:n.status,json:t.json,fields:t.fields}));let o=r.status==="manual_setup_required";if(s.stop(o?`${b.success} DNS instructions for ${ue.default.cyan(r.provider)}`:`${b.success} Connected to ${ue.default.cyan(r.provider)}`),t.json){w(r,t.fields);return}if(S(o?`Add these records at your registrar for ${v.domain(r.domain)}`:`Connected ${v.domain(r.domain)}`),c("Provider",ue.default.cyan(r.provider)),c("Method",r.method),r.records?.length){let a=[8,22,40];d(),console.log(` ${ue.default.bold("DNS Records")}`);let l=["Type","Name","Value"].map((m,g)=>ue.default.dim(m.padEnd(a[g]))).join(" "),f=a.map(m=>ue.default.dim("\u2500".repeat(m))).join(" ");console.log(` ${l}`),console.log(` ${f}`);for(let m of r.records){let g=m.record,y=m.status!=="already_set";process.stdout.isTTY&&y&&await Ut(50);let $=[ue.default.yellow(g.type),g.name,ue.default.cyan(g.value)+(g.priority?ue.default.dim(` pri=${g.priority}`):"")].map((j,O)=>Zi(j,a[O])).join(" "),h=m.status==="already_set"?ue.default.dim("\u2713"):m.status==="updated"?ue.default.yellow("\u21BA"):m.status==="pending"?ue.default.yellow("\u2192"):b.success,_=m.status==="already_set"?ue.default.dim(" already set"):m.status==="updated"?ue.default.dim(" updated"):m.status==="pending"?ue.default.dim(" add this"):"";console.log(` ${h} ${$}${_}`)}}d(),r.next_steps?.length?(console.log(` ${ue.default.bold("Next steps")}`),r.next_steps.forEach((a,l)=>{console.log(` ${ue.default.dim(`${l+1}.`)} ${a}`)})):r.hint&&console.log(` ${ue.default.dim(r.hint)}`),r.docs&&console.log(` ${ue.default.dim("Docs:")} ${v.url(r.docs)}`),d()}var ue,$n=Ae(()=>{"use strict";G();ue=D(M(),1);Ne();V();ge();Ze()});function Ft(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 i={},s=[["Authorization",e.authorizationEnv],["X-API-Key",e.apiKeyEnv]];for(let[n,r]of s){if(!r)continue;let o=t[r];if(!o)throw new Error(`Environment variable ${r} is not set`);i[n]=o}return Object.keys(i).length>0?i:void 0}function Mt(e){return e?Object.keys(e):[]}var es=Ae(()=>{"use strict"});var vo={};Ht(vo,{email:()=>fi,parseRecipients:()=>ts,recipientField:()=>is});function Sd(e){return[R.default.yellow(e.type),e.name,R.default.cyan(e.value)+(e.priority?R.default.dim(` pri=${e.priority}`):"")]}function kn(e){return jd[e]||e}function ts(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function is(e){if(e.length!==0)return e.length===1?e[0]:e}function Cd(e,t){if(e&&e.includes("@")){let[i,s]=e.split("@",2);!t.slug&&i&&(t.slug=i),!t.domain&&s&&(t.domain=s)}}async function Qe(e){return e.domain?(z(e.domain,e),e.domain):fe()}async function fi(e,t,i){if(e&&e.includes(".")&&!xd.includes(e))return i.check?fo(e,!!i.json,i.fields):t?po(e,t,!!i.json,i.fields):bo(e,!!i.json,i.fields);if(Cd(t,i),i.body&&!i.text&&(i.text=i.body),i.title&&!i.subject&&(i.subject=i.title),i.from&&i.from.includes("@")){let[s,n]=i.from.split("@",2);!i.slug&&s&&(i.slug=s),!i.domain&&n&&(i.domain=n)}switch(e){case void 0:return mo(i);case"list":return mo(i);case"inbox":return zd(i);case"folders":return Yd(i);case"archive":case"trash":case"restore":case"read":case"unread":case"star":case"unstar":return Xd(e,i);case"setup":return Ud(i);case"status":return qd(i);case"remove":return Fd(i);case"create":return Md(i);case"delete":return Ld(i);case"send":return Vd(i);case"webhook":return Zd(i);case"webhook-test":return Qd(i);case"forward":return ec(i);case"work":return Ed(i);case"triage":return Td(i);case"note":return Pd(i);case"notes":return Dd(i);case"activity":return Nd(i);case"changes":return Ad(i);case"coordination":return Od(i);case"presence":return Id(i);case"release-presence":return Rd(i);case"escalate":return Wd(i);case"remind":return Hd(i);case"contacts":return Jd(i);case"contact-add":return Bd(i);case"contact-remove":return Gd(i);case"tone":return Kd(i);case"check":return fo(i.domain||await fe(),!!i.json,i.fields);case"connect":return po(i.domain||await fe(),t||void 0,!!i.json,i.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:i.json,fields:i.fields})}}function _n(e){let t=e.mailboxIds?.split(",").map(i=>i.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 Od(e){let{mailboxId:t,threadKey:i}=_n(e),s=new URLSearchParams({mailbox_id:t,thread_key:i}),n=await x(`/api/email/collaboration/coordination?${s}`),r=await n.json();if(n.ok||u(r.error||"Could not read coordination",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return w(r,e.fields);S("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 Id(e){let{mailboxId:t,threadKey:i}=_n(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 s=e.mode||"viewing";["viewing","composing"].includes(s)||u("Mode must be viewing or composing",{code:"validation_error",json:e.json,fields:e.fields});let n=await x("/api/email/collaboration/coordination",{method:"PUT",body:JSON.stringify({mailbox_id:t,thread_key:i,client_id:e.clientId,mode:s,acquire_lease:e.acquireLease!==!1})}),r=await n.json();if(n.ok||u(r.error||"Could not heartbeat presence",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return w(r,e.fields);S("Conversation Presence"),c("Mode",s),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 Rd(e){let{mailboxId:t,threadKey:i}=_n(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 s=await x("/api/email/collaboration/coordination",{method:"DELETE",body:JSON.stringify({mailbox_id:t,thread_key:i,client_id:e.clientId,lease_id:e.leaseId})}),n=await s.json();if(s.ok||u(n.error||"Could not release presence",{code:n.code||"api_error",json:e.json,fields:e.fields}),e.json)return w(n,e.fields);S("Conversation Presence"),c("Released",e.clientId),c("Remaining presence",String(n.presence?.length||0))}async function Ad(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 i=new URLSearchParams({mailbox_id:t});e.cursor&&i.set("cursor",e.cursor),e.limit&&i.set("limit",e.limit);let s=await x(`/api/email/changes?${i}`),n=await s.json();if(s.ok||u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}),e.json)return w(n,e.fields);if(S("Mailbox Changes"),n.requires_full_sync){c("Full sync","Required"),c("Baseline cursor",n.next_cursor),Xe("Take a bounded mailbox snapshot, then call this command again with --cursor to replay concurrent changes.");return}n.changes.length?Z(["Sequence","Type","Resource","Created"],n.changes.map(r=>[r.sequence,r.type,`${r.resource_type}:${r.resource_id||"-"}`,r.created_at]),[12,32,40,24]):console.log(` ${R.default.dim("No changes since this cursor.")}`),c("Next cursor",n.next_cursor),n.has_more&&Xe("More changes are available; call again with the next cursor.")}async function Ed(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 i=new URLSearchParams({mailbox_ids:t.join(",")});e.status&&i.set("status",e.status),e.assigned&&i.set("assigned",e.assigned),e.limit&&i.set("limit",e.limit);let s=await x(`/api/email/work-queue?${i}`),n=await s.json();if(s.ok||u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}),e.json)return w(n,e.fields);if(S("Shared Inbox Work"),!n.items.length)return console.log(` ${R.default.dim("No conversations match this queue.")}`);Z(["Thread","Status","Assignee","Subject"],n.items.map(r=>[r.thread_key,r.status,r.assignee?.label||"Unassigned",r.subject||"(no subject)"]),[28,10,28,48]),n.partial&&Xe("This is a bounded snapshot. Increase --limit or use the API scan_limit when you need a wider queue.")}async function Td(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,i=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(n=>n.trim()).filter(Boolean),status:e.status,assignee:t,version:e.ifVersion?Number.parseInt(e.ifVersion,10):void 0})}),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 w(s,e.fields);S("Conversation Updated"),c("Status",s.status),c("Assignee",s.assignee?.label||"Unassigned"),c("Version",s.version)}async function Pd(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})}),i=await t.json();if(t.ok||u(i.error||i.message,{hint:i.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return w(i,e.fields);console.log(`${b.success} Private note added`)}async function Dd(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`),i=await t.json();if(t.ok||u(i.error||i.message,{hint:i.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return w(i,e.fields);if(S("Private Notes"),!i.notes.length)return console.log(` ${R.default.dim("No private notes yet.")}`);Z(["Author","Created","Note"],i.notes.map(s=>[s.author.label,s.created_at,s.body]),[28,24,64])}async function Nd(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`),i=await t.json();if(t.ok||u(i.error||i.message,{hint:i.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return w(i,e.fields);if(S("Conversation Activity"),!i.activity.length)return console.log(` ${R.default.dim("No activity yet.")}`);Z(["Type","Actor","Created"],i.activity.map(s=>[s.type,s.actor.label,s.created_at]),[36,32,24])}async function Ud(e){let t=await Qe(e);if(e.dryRun)return B("email_setup",{domain:t},e.json,e.fields);let i=C(!e.json);i.start(`Setting up email on ${v.domain(t)}`);let s=await x(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"POST"}),n=await s.json();if(s.ok||(i.stop("Failed"),u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Email ${n.status==="already_configured"?"already configured":"configured"}`),e.json){w(n,e.fields);return}if(n.records?.length){d(),S(`Email DNS Records ${v.domain(t)}`);let r=n.records.map(o=>[R.default.yellow(o.type),o.name,o.value.length>40?o.value.slice(0,40)+"...":o.value,o.status==="verified"||o.status==="created"?R.default.green(o.status):R.default.yellow(o.status)]);Z(["Type","Name","Value","Status"],r,[8,28,44,12])}d(),n.hint&&Xe(n.hint),I("Check status:",`domani email status --domain ${t}`),d()}async function qd(e){let t=await Qe(e),i=C(!e.json);i.start(`Checking email status for ${v.domain(t)}`);let s=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),n=await s.json();if(s.ok||(i.stop("Failed"),u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Status loaded`),e.json){w(n,e.fields);return}if(S(`Email ${v.domain(t)}`),c("Enabled",n.enabled?R.default.green("yes"):R.default.dim("no")),n.enabled&&(c("Verified",n.verified?R.default.green("yes"):R.default.yellow("pending")),c("Mailboxes",String(n.mailbox_count))),d(),!n.enabled)I("Set up email:",`domani email setup --domain ${t}`),d();else if(!n.verified&&n.records?.length){console.log(` ${R.default.yellow("!")} Add these DNS records to verify:`);for(let r of n.records)console.log(` ${R.default.yellow(r.type)} ${r.name} ${R.default.dim("\u2192")} ${r.value.length>50?r.value.slice(0,50)+"...":r.value}`);d()}}async function Fd(e){let t=await Qe(e);if(e.dryRun)return B("email_remove",{domain:t},e.json,e.fields);let i=C(!e.json);i.start(`Removing email from ${v.domain(t)}`);let s=await x(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"DELETE"}),n=await s.json();if(s.ok||(i.stop("Failed"),u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Email disabled`),e.json){w(n,e.fields);return}n.mailboxes_deleted>0&&console.log(` ${R.default.dim(`${n.mailboxes_deleted} mailbox(es) deleted.`)}`),d()}async function mo(e){let t=C(!e.json);t.start("Loading mailboxes");let i=e.domain?`?domain=${encodeURIComponent(e.domain)}`:"",s=await x(`/api/emails${i}`),n=await s.json();s.ok||(t.stop("Failed"),u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}));let r=n.mailboxes||[];if(t.stop(`${b.success} ${r.length} mailbox(es)`),e.json){w(n,e.fields);return}if(r.length===0){d(),console.log(` ${R.default.dim("No mailboxes.")}`),d(),I("Create one:","domani email create hello@example.com"),d();return}d(),S("Mailboxes");let o=r.map(a=>[R.default.cyan(a.address),String(a.message_count),a.webhook_url?v.url(a.webhook_url):R.default.dim("-"),R.default.dim(new Date(a.created_at).toLocaleDateString())]);Z(["Address","Messages","Webhook","Created"],o,[32,10,36,14]),d()}async function Md(e){let t=await Qe(e);if(e.dryRun)return B("email_create_mailbox",{domain:t,slug:e.slug,workspace_id:e.workspace},e.json,e.fields);let i=e.slug;if(!i&&!e.json){let f=await Te({message:`Email handle for @${t}:`,placeholder:"hello"});le(f)&&process.exit(0),i=f}i||u("Slug required",{hint:`Usage: domani email create hello@${t}`,code:"validation_error",json:e.json,fields:e.fields});let s=`${i}@${t}`,n=C(!e.json);n.start("Creating mailbox");let r=await x("/api/emails",{method:"POST",body:JSON.stringify({address:s,workspace_id:e.workspace})}),o=await r.json();if(r.status===202&&!e.json){n.stop("");let f=o.txt_record,m=o.email_records||[],g=[{type:"TXT",name:f?.name||"@",value:f?.value||"",note:"ownership proof"},...m];d(),console.log(" Add these records at your DNS provider:"),d();for(let j of g){let O=j.priority!==void 0?` ${R.default.dim(`priority: ${j.priority}`)}`:"",A=j.note?` ${R.default.dim(`(${j.note})`)}`:"";console.log(` ${R.default.yellow(j.type)} ${R.default.bold(j.name)}${O}${A}`),console.log(` ${R.default.dim("\u2192")} ${R.default.cyan(j.value)}`),d()}Xe("DNS propagation typically takes 5\u201330 minutes. Checking automatically..."),d();let y=g.map(j=>({cells:[R.default.yellow(j.type),j.name,j.note?R.default.dim(`(${j.note})`):""],status:"pending"})),k=qt(["Type","Name",""],y,[6,24,16]);k.start();let $=0;for(;r.status===202&&$<60;)await Ut(15e3),$++,r=await x("/api/emails",{method:"POST",body:JSON.stringify({address:s,workspace_id:e.workspace})}),o=await r.json(),r.status!==202&&!r.ok&&(k.stop(),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));r.status===202&&(k.stop(),u("TXT record not detected after 15 minutes.",{hint:`Check the record is set, then retry: domani email create ${s}`,code:"timeout",json:e.json,fields:e.fields})),k.markDone(0);let h=j=>`${j.type}:${j.name}`,_=new Map;g.slice(1).forEach((j,O)=>_.set(h(j),O+1));for(let j=0;j<60;j++){await Ut(15e3);let O=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),A=await O.json();if(O.ok&&A.records){for(let L of A.records)if(L.status==="verified"||L.status==="created"){let H=_.get(h(L));H!==void 0&&k.markDone(H)}}if(O.ok&&A.verified)break}k.stop(),d()}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(`${b.success} ${R.default.cyan(o.address)} created`),e.json){w(o,e.fields);return}let a=await x(`/api/domains/${encodeURIComponent(t)}/email/status`),l=await a.json();d(),a.ok&&l.verified?(I("Read inbox:",`domani email inbox ${o.address}`),I("Web inbox:",`${ni}/inbox?address=${encodeURIComponent(o.address)}`)):(I("Check propagation:",`domani email status --domain ${t}`),I("Web inbox:",`${ni}/inbox?address=${encodeURIComponent(o.address)}`)),d()}async function Ld(e){let t=await Qe(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 B("email_delete_mailbox",{domain:t,address:`${e.slug}@${t}`},e.json,e.fields);let i=C(!e.json);i.start(`Deleting ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),n=await x(`/api/emails/${s}`,{method:"DELETE",body:JSON.stringify({confirm:!0})}),r=await n.json();if(n.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:n.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Mailbox deleted`),e.json){w(r,e.fields);return}console.log(` ${R.default.dim(`${r.address} and all messages deleted.`)}`),d()}async function Vd(e){let t=await Qe(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 B("email_send",{from:`${e.slug}@${t}`,to:e.to,subject:e.subject},e.json,e.fields);let i=C(!e.json);i.start(`Sending from ${e.slug}@${t}`);let s={to:is(ts(e.to))},n=is(ts(e.cc)),r=is(ts(e.bcc));n&&(s.cc=n),r&&(s.bcc=r),e.subject&&(s.subject=e.subject),e.text&&(s.text=e.text),e.inReplyTo&&(s.in_reply_to=e.inReplyTo),e.references&&(s.references=e.references),e.sendAt&&(s.send_at=e.sendAt);let o=encodeURIComponent(`${e.slug}@${t}`),a=await x(`/api/emails/${o}/send`,{method:"POST",body:JSON.stringify(s)}),l=await a.json();if(!a.ok){i.stop("Failed");let m=l.code==="MONTHLY_LIMIT_EXCEEDED"?`Run ${R.default.cyan("domani upgrade")} to switch to Pro (10,000 emails/month).`:l.hint;u(l.error||l.message,{hint:m,status:a.status,json:e.json,fields:e.fields})}let f=Array.isArray(l.to)?l.to.join(", "):l.to;if(i.stop(l.status==="scheduled"?`${b.success} Scheduled for ${R.default.cyan(e.sendAt||"")} to ${R.default.cyan(f)} ${R.default.dim("(trash the message before then to cancel)")}`:`${b.success} Sent to ${R.default.cyan(f)}`),e.json){w(l,e.fields);return}}function xn(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 go(e,t,i,s,n){let r=C(!i.json);r.start(s);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:i.json,fields:i.fields})),r.stop(n(a)),i.json&&w(a,i.fields)}async function Wd(e){let t='Usage: domani email escalate hello@example.com --message-id MSG_ID [--reason "refund over $500"] [--clear]',{address:i}=xn(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let s={};e.reason&&(s.reason=e.reason),e.clear&&(s.clear=!0),await go(`/api/emails/${encodeURIComponent(i)}/messages/${encodeURIComponent(e.messageId)}/escalate`,s,e,e.clear?"Clearing escalation":"Flagging for a human",n=>n.needs_human?`${b.success} Flagged for a human ${R.default.dim("(conversation held, email.escalated fired)")}`:`${b.success} Escalation cleared`)}async function Hd(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:i}=xn(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 s={};e.at&&(s.remind_at=e.at),e.note&&(s.note=e.note),e.clear&&(s.clear=!0),await go(`/api/emails/${encodeURIComponent(i)}/messages/${encodeURIComponent(e.messageId)}/remind`,s,e,e.clear?"Clearing reminder":"Setting follow-up reminder",n=>n.remind_at?`${b.success} Reminder set for ${R.default.cyan(String(n.remind_at))} ${R.default.dim("(fires only if still unanswered)")}`:`${b.success} Reminder cleared`)}async function Jd(e){let t=new URLSearchParams;e.q&&t.set("q",e.q),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let i=await x(`/api/contacts${t.size?`?${t}`:""}`),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){w(s,e.fields);return}let n=s.contacts||[];if(n.length===0){console.log(R.default.dim("No contacts yet. The address book fills itself as mail flows in and out."));return}for(let r of n){let o=r.name?` ${R.default.dim(r.name)}`:"",a=r.notes?` ${R.default.dim("-")} ${r.notes}`:"";console.log(`${R.default.cyan(r.address)}${o} ${R.default.dim(`(${r.message_count} msg${r.message_count!==1?"s":""}, last ${r.last_direction||"-"})`)}${a}`)}s.next_cursor&&console.log(R.default.dim(`More: --cursor ${s.next_cursor}`))}function yo(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 Bd(e){let i=yo(e,'Usage: domani email contact-add ada@example.com [--name "Ada"] [--notes "prefers short emails"]'),s={address:i};e.name!==void 0&&(s.name=e.name),e.notes!==void 0&&(s.notes=e.notes);let n=await x("/api/contacts",{method:"POST",body:JSON.stringify(s)}),r=await n.json();if(n.ok||u(r.error||r.message,{hint:r.hint,status:n.status,json:e.json,fields:e.fields}),e.json){w(r,e.fields);return}console.log(`${b.success} Contact ${R.default.cyan(i)} saved.`)}async function Gd(e){let i=yo(e,"Usage: domani email contact-remove ada@example.com"),s=await x(`/api/contacts/${encodeURIComponent(i)}`,{method:"DELETE"}),n=await s.json();if(s.ok||u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}),e.json){w(n,e.fields);return}console.log(n.deleted?`${b.success} Contact ${R.default.cyan(i)} deleted.`:R.default.dim(`No contact ${i}.`))}async function Kd(e){let t='Usage: domani email tone hello@example.com [--set "lowercase, friendly, sign as Ada"] [--clear]',{address:i}=xn(e,t),s=encodeURIComponent(i);if(e.set===void 0&&!e.clear){let o=await x(`/api/emails/${s}`),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){w({address:i,tone_notes:a.tone_notes??null},e.fields);return}console.log(a.tone_notes?a.tone_notes:R.default.dim(`No tone notes on ${i}. Set them with --set.`));return}let n=await x(`/api/emails/${s}`,{method:"PATCH",body:JSON.stringify({tone_notes:e.clear?null:e.set})}),r=await n.json();if(n.ok||u(r.error||r.message,{hint:r.hint,status:n.status,json:e.json,fields:e.fields}),e.json){w(r,e.fields);return}console.log(e.clear?`${b.success} Tone notes cleared on ${R.default.cyan(i)}.`:`${b.success} Tone notes set on ${R.default.cyan(i)}.`)}async function zd(e){let t=await Qe(e);e.slug||u("Slug required",{hint:"Usage: domani email inbox hello@example.com [--direction in|out] [--limit 20]",code:"validation_error",json:e.json,fields:e.fields});let i=new URLSearchParams;e.direction&&i.set("direction",e.direction),e.folder&&i.set("folder",e.folder),e.view&&i.set("view",e.view),e.limit&&i.set("limit",e.limit);let s=i.toString()?`?${i}`:"",n=C(!e.json);n.start(`Loading messages for ${e.slug}@${t}`);let r=encodeURIComponent(`${e.slug}@${t}`),o=await x(`/api/emails/${r}/messages${s}`),a=await o.json();o.ok||(n.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:e.json,fields:e.fields}));let l=a.messages||[];if(e.json){n.stop(`${b.success} ${l.length} message(s)`),w(a,e.fields);return}if(l.length===0){n.stop(`${R.default.dim("No messages")}`);return}let f=l.length>1?"s":"";n.stop(`${b.success} ${R.default.cyan(`${e.slug}@${t}`)} ${R.default.dim("\xB7 "+l.length+" message"+f)}`);for(let m of l){let g=m.direction==="in"?R.default.green("in "):R.default.dim("out"),y=m.direction==="in"?m.from:m.to,k=m.subject||"(no subject)",$=R.default.dim(new Date(m.created_at).toLocaleString()),h=k;if(m.text){let _=m.text.replace(/\s+/g," ").trim(),j=_.length>60?_.slice(0,60)+"\u2026":_;h=`${k} ${R.default.dim("- "+j)}`}console.log(` ${g} ${y.padEnd(30)} ${h} ${$}`)}a.next_cursor&&console.log(` ${R.default.dim("\u2026 more available, use --limit to paginate")}`)}async function Yd(e){let t=await Qe(e);e.slug||u("Slug required",{hint:"Usage: domani email folders hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let i=encodeURIComponent(`${e.slug}@${t}`),s=await x(`/api/emails/${i}/folders`),n=await s.json();if(s.ok||u(n.error||n.message,{hint:n.hint,status:s.status,json:e.json,fields:e.fields}),e.json)return w(n,e.fields);S(`Folders for ${e.slug}@${t}`);for(let r of n.folders||[])c(r.id,`${r.total} total, ${r.unread} unread`);for(let r of n.views||[])c(r.id,`${r.total} total, ${r.unread} unread`)}async function Xd(e,t){let i=await Qe(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 s=(t.messageIds||"").split(",").map(m=>m.trim()).filter(Boolean);s.length||u("Message IDs required",{hint:"Pass --message-ids id1,id2",code:"validation_error",json:t.json,fields:t.fields});let n={message_ids:s,idempotency_key:t.idempotencyKey||(0,ho.randomUUID)()};if((e==="archive"||e==="trash")&&Object.assign(n,{action:"move",destination:e==="archive"?"archive":"trash"}),e==="restore"&&(n.action="restore"),(e==="read"||e==="unread")&&Object.assign(n,{action:"mark_read",read:e==="read"}),(e==="star"||e==="unstar")&&Object.assign(n,{action:"star",starred:e==="star"}),t.dryRun)return B("email_messages_action",{address:`${t.slug}@${i}`,...n},t.json,t.fields);let r=encodeURIComponent(`${t.slug}@${i}`),o=await x(`/api/emails/${r}/messages/actions`,{method:"POST",body:JSON.stringify(n)}),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 w(a,t.fields);let l=(a.results||[]).filter(m=>m.ok).length,f=(a.results||[]).length-l;console.log(`${b.success} ${l} updated${f?R.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 Zd(e){let t=await Qe(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 i=`${e.slug}@${t}`,s=encodeURIComponent(i),n;try{n=Ft(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&&n!==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 B("email_webhook",{address:i,webhook_url:e.url||null,...r!==void 0?{events:r}:{},...n!==void 0?{header_names:Mt(n)}:{}},e.json,e.fields);let o=C(!e.json);if(e.url){o.start(`Setting webhook for ${i}`);let a=await x(`/api/emails/${s}/webhook`,{method:"PUT",body:JSON.stringify({url:e.url,...n!==void 0?{headers:n}:{},...r!==void 0?{events:r}:{}})}),l=await a.json();if(a.ok||(o.stop("Failed"),u(l.error||l.message,{hint:l.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${b.success} Webhook set`),e.json){w(l,e.fields);return}S(`Mailbox ${l.address}`),c("Webhook",v.url(l.webhook_url)),c("Events",l.events?.join(", ")||R.default.dim("email.received")),c("Auth headers",l.header_names?.join(", ")||R.default.dim("none")),c("Signing secret",R.default.dim(l.signing_secret)),d()}else{o.start(`Removing webhook for ${i}`);let a=await x(`/api/emails/${s}/webhook`,{method:"DELETE"}),l=await a.json();if(a.ok||(o.stop("Failed"),u(l.error||l.message,{hint:l.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${b.success} Webhook removed`),e.json){w(l,e.fields);return}S(`Mailbox ${l.address}`),c("Webhook",R.default.dim("none")),d()}}async function Qd(e){let t=await Qe(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 i=`${e.slug}@${t}`;if(e.dryRun)return B("email_webhook_test",{address:i},e.json,e.fields);let s=C(!e.json);s.start(`Testing webhook for ${i}`);let n=await x(`/api/emails/${encodeURIComponent(i)}/webhook/test`,{method:"POST"}),r=await n.json();if((!n.ok||!r.success)&&(s.stop("Failed"),u(r.error||r.message||"Webhook test failed",{hint:r.hint||"Check the endpoint and sender authentication, then retry.",status:n.status,json:e.json,fields:e.fields})),s.stop(`${b.success} Test delivered`),e.json)return w(r,e.fields);S(`Mailbox ${i}`),c("Delivery",R.default.green("successful")),typeof r.status=="number"&&c("Endpoint",`HTTP ${r.status}`),d()}async function ec(e){let t=await Qe(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 B("email_forward",{address:`${e.slug}@${t}`,forward_to:e.forwardTo||null},e.json,e.fields);let i=C(!e.json),s=e.forwardTo||null;i.start(`Updating forward for ${e.slug}@${t}`);let n=encodeURIComponent(`${e.slug}@${t}`),r=await x(`/api/emails/${n}`,{method:"PATCH",body:JSON.stringify({forward_to:s})}),o=await r.json();if(r.ok||(i.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),i.stop(`${b.success} Forward ${s?"set":"removed"}`),e.json){w(o,e.fields);return}S(`Mailbox ${o.address}`),c("Forward to",o.forward_to?R.default.cyan(o.forward_to):R.default.dim("none")),d()}async function fo(e,t,i){let s=C(!t);s.start(`Checking email health for ${v.domain(e)}`);let n=await x(`/api/domains/${encodeURIComponent(e)}/email/check`),r=await n.json();if(n.ok||(s.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:n.status,json:t,fields:i})),s.stop("Email health checked"),t){w(r,i);return}if(S(`Email Health ${v.domain(r.domain)}`),r.provider?c("Provider",R.default.cyan(kn(r.provider))):c("Provider",R.default.dim("unknown")),r.mx.configured?c("MX",`${b.success} ${R.default.green("propagated")} ${R.default.dim(`(${r.mx.records.length} record${r.mx.records.length!==1?"s":""})`)}`):c("MX",`${b.error} ${R.default.red("not configured")}`),r.spf.configured?c("SPF",`${b.success} ${R.default.green(r.spf.value)}`):c("SPF",`${b.error} ${R.default.red("missing")}`),r.dmarc.configured){let o=r.dmarc.value.length>50?r.dmarc.value.slice(0,50)+"...":r.dmarc.value;c("DMARC",`${b.success} ${R.default.green(o)}`)}else c("DMARC",`${b.error} ${R.default.red("missing")}`);r.dkim.configured?c("DKIM",`${b.success} ${R.default.green("found")} ${R.default.dim(`(${r.dkim.selectors.join(", ")})`)}`):c("DKIM",`${b.warning} ${R.default.yellow("not found")}`),d(),r.mx.configured?(!r.spf.configured||!r.dmarc.configured)&&(Xe("SPF and DMARC protect against email spoofing. Re-run email setup to add them."),d()):(I("Set up email:",`domani email ${e} google`),d())}async function po(e,t,i,s){return t?wo(e,t,i,s):bo(e,i,s)}async function bo(e,t,i){let s=C(!t);s.start("Loading email providers");let n=await x(`/api/domains/${encodeURIComponent(e)}/connect`),r=await n.json();n.ok||(s.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:n.status,json:t,fields:i})),s.stop("Providers loaded");let o=r.providers?.email||[];o.length===0&&u("No email providers available",{code:"not_found",json:t,fields:i});let a=await tt({message:"Choose an email provider",options:o.map(l=>({value:l.name,label:kn(l.name)}))});return le(a)&&process.exit(0),wo(e,a,t,i)}async function wo(e,t,i,s){if(i){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:i,fields:s}),w(m,s);return}let n=await x(`/api/domains/${encodeURIComponent(e)}/connect?provider=${encodeURIComponent(t)}`);if(!n.ok){let f=await n.json();u(f.error||f.message,{hint:f.hint,status:n.status,json:i,fields:s})}let r=await n.json(),o=r.preview?.records??[],a=r.preview?.provider??t,l=kn(a);if(S(`Email ${v.domain(e)}`),c("Provider",R.default.cyan(l)),o.length){d(),console.log(` ${R.default.bold("DNS Records")}`);let f=[8,24,40],m=qt(["Type","Name","Value"],o.map(j=>({cells:Sd(j),status:"pending"})),f);m.start();let g=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),y=await g.json();g.ok||(m.stop(),d(),u(y.error||y.message,{hint:y.hint,status:g.status,json:i,fields:s}));let k=y.records||[];for(let j=0;j<o.length;j++)k.find(A=>A.record.type===o[j].type&&A.record.name===o[j].name&&A.record.value===o[j].value)?.status==="already_set"||await Ut(60),m.markDone(j);await Ut(80),m.stop();let $=k.filter(j=>j.status==="created"||j.status==="updated").length,h=k.filter(j=>j.status==="already_set").length,_;h===k.length?_=`All ${h} records already set`:h>0?_=`${$} created, ${h} already set`:_=`${$} DNS records set`,d(),console.log(` ${b.success} ${R.default.green(`Email configured - ${_}`)}`)}else{let f=C(!0);f.start("Setting DNS records");let m=await x(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),g=await m.json();m.ok||(f.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:m.status,json:i,fields:s})),f.stop(`${b.success} Email configured via ${R.default.cyan(l)}`)}d(),I("Verify propagation:",`domani email ${e} --check`),d()}var R,ho,xd,jd,jn=Ae(()=>{"use strict";G();ri();R=D(M(),1);Ne();V();ge();Ze();ho=require("node:crypto");es();xd=["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"],jd={"google-workspace":"Google Workspace",fastmail:"Fastmail",proton:"Proton Mail"}});var $o={};Ht($o,{dns:()=>Cn});async function Cn(e,t,i,s,n,r){e||(e=await fe()),z(e,r);let o=r?.json??!1,a=r?.type||i,l=r?.name||s,f=r?.value||n;if(!t||t==="get"){let m=C(!o);m.start(`Loading DNS for ${v.domain(e)}`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns`),y=await g.json();if(g.ok||(m.stop("Failed"),u(y.error||y.message,{hint:y.hint,status:g.status,json:o,fields:r?.fields})),m.stop(`${y.records.length} record(s)`),o){w(y,r?.fields);return}if(y.records.length===0){d(),console.log(` ${Ce.default.dim(`No DNS records for ${e}`)}`),d(),I("Auto-configure DNS:",`domani connect ${e}`),d();return}let k=[8,24,40,8];S(`DNS ${v.domain(e)}`,k.reduce((h,_)=>h+_,0)+k.length-1);let $=y.records.map(h=>{let _=h.priority?Ce.default.dim(` pri=${h.priority}`):"";return[Ce.default.yellow(h.type),h.name,Ce.default.cyan(h.value)+_,Ce.default.dim(String(h.ttl))]});Z(["Type","Name","Value","TTL"],$,k),d();return}if(t==="set"){if((!a||!l||!f)&&u("Missing arguments for dns set",{hint:"Usage: domani dns <domain> set --type A --name www --value 1.2.3.4",code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return B("dns_set",{domain:e,record:{type:a.toUpperCase(),name:l,value:f,ttl:3600}},o,r?.fields);let m=C(!o);m.start(`Setting ${Ce.default.yellow(a.toUpperCase())} record`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns`),y=await g.json(),$=(g.ok?y.records:[]).filter(j=>!(j.type===a.toUpperCase()&&j.name===l));$.push({type:a.toUpperCase(),name:l,value:f,ttl:3600});let h=await x(`/api/domains/${encodeURIComponent(e)}/dns`,{method:"PUT",body:JSON.stringify({records:$})}),_=await h.json();h.ok||(m.stop("Failed"),u(_.error||_.message,{hint:_.hint,status:h.status,json:o,fields:r?.fields})),m.stop(`${b.success} ${Ce.default.yellow(a.toUpperCase())} ${l} ${b.arrow} ${Ce.default.cyan(f)}`),o?w(_,r?.fields):(d(),I("Check propagation:",`domani status ${e}`),d());return}if(t==="delete"){if((!a||!l)&&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 B("dns_delete",{domain:e,record:{type:a.toUpperCase(),name:l}},o,r?.fields);let m=C(!o);m.start(`Deleting ${Ce.default.yellow(a.toUpperCase())} ${l}`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns?type=${encodeURIComponent(a.toUpperCase())}&name=${encodeURIComponent(l)}`,{method:"DELETE"}),y=await g.json();g.ok||(m.stop("Failed"),u(y.error||y.message,{hint:y.hint,status:g.status,json:o,fields:r?.fields})),m.stop(`${b.success} Deleted ${Ce.default.yellow(a.toUpperCase())} ${l}`),o?w(y,r?.fields):(d(),I("Check propagation:",`domani status ${e}`),d());return}if(t==="snapshot"){if(r?.dryRun)return B("dns_snapshot",{domain:e},o,r?.fields);let m=C(!o);m.start(`Capturing DNS snapshot for ${v.domain(e)}`);let g=await x(`/api/domains/${encodeURIComponent(e)}/dns/snapshot`,{method:"POST"}),y=await g.json();g.ok||(m.stop("Failed"),u(y.error||y.message,{hint:y.hint,status:g.status,json:o,fields:r?.fields}));let k=y.records?.length??0;if(m.stop(`${b.success} Captured ${k} record(s)`),o){w(y,r?.fields);return}let $=`${e}.dns.json`,h=(0,Sn.resolve)(process.cwd(),$);(0,ss.writeFileSync)(h,JSON.stringify(y,null,2)+`
179
179
  `),S("DNS Snapshot"),c("Domain",v.domain(y.domain)),c("Records",String(k)),c("Subdomains",String(y.subdomains?.length??0)),c("Sources",(y.sources||[]).join(", ")||"none"),c("Captured",y.capturedAt||y.captured_at||"now"),c("Saved to",Ce.default.cyan($)),d(),I("Restore from this snapshot:",`domani dns ${e} restore --file ${$}`),d();return}if(t==="restore"){if(r?.dryRun)return B("dns_restore",{domain:e,source:r?.file||"server_backup"},o,r?.fields);let m=C(!o),g;if(r?.file){let $=(0,Sn.resolve)(process.cwd(),r.file);$.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 h=(0,ss.readFileSync)($,"utf-8"),_=JSON.parse(h);g=JSON.stringify({snapshot:_}),m.start(`Restoring DNS for ${v.domain(e)} from ${Ce.default.cyan(r.file)}`)}catch(h){u(`Failed to read snapshot file: ${h instanceof Error?h.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 ${v.domain(e)} from server backup`);let y=await x(`/api/domains/${encodeURIComponent(e)}/dns/restore`,{method:"POST",...g?{body:g}:{}}),k=await y.json();if(y.ok||(m.stop("Failed"),u(k.error||k.message,{hint:k.hint,status:y.status,json:o,fields:r?.fields})),m.stop(`${b.success} Restored DNS`),o){w(k,r?.fields);return}if(S("DNS Restored"),c("Domain",v.domain(k.domain)),c("Applied",Ce.default.green(String(k.applied??0))),c("Skipped",Ce.default.dim(String(k.skipped??0))),k.errors?.length>0){c("Errors",Ce.default.red(String(k.errors.length)));for(let $ of k.errors)console.log(` ${Ce.default.red("\u2022")} ${$}`)}d(),I("Verify DNS records:",`domani dns ${e}`),d();return}u(`Unknown action: ${t}`,{hint:"Use 'get', 'set', 'delete', 'snapshot', or 'restore'.",code:"validation_error",json:o,fields:r?.fields})}var Ce,ss,Sn,On=Ae(()=>{"use strict";G();Ce=D(M(),1);V();ge();Ze();ss=require("node:fs"),Sn=require("node:path")});var ko={};Ht(ko,{status:()=>In});function tc(e){return[it.default.yellow(e.type),e.name,it.default.cyan(e.value)+(e.priority?it.default.dim(` pri=${e.priority}`):"")]}function ic(e){if(S(`Status ${v.domain(e.domain)}`),e.expires){let t=new Date(e.expires).toLocaleDateString(),i=e.days_until_expiry,s=i!=null&&i<30?it.default.red:i!=null&&i<90?it.default.yellow:it.default.green;c("Expires",`${t} ${it.default.dim("(")}${s(`${i} days`)}${it.default.dim(")")}`)}}async function In(e,t){if(e||(e=await fe()),z(e,t),t.json){let g=await x(`/api/domains/${encodeURIComponent(e)}/status`),y=await g.json();g.ok||u(y.error||y.message,{hint:y.hint,status:g.status,json:t.json,fields:t.fields}),w(y,t.fields);return}let i=C(!0);i.start(`Checking ${v.domain(e)}`);let s;try{s=await x(`/api/domains/${encodeURIComponent(e)}/status`,{headers:{Accept:"text/event-stream"},signal:AbortSignal.timeout(t.timeout?parseInt(t.timeout,10)*1e3:3e4)})}catch{i.stop("Failed"),u("Request timed out",{hint:"The status check took too long. Try again.",code:"timeout",json:t.json,fields:t.fields})}if(!s.ok){i.stop("Failed");try{let g=await s.json();u(g.error||g.message,{hint:g.hint,status:s.status,json:t.json,fields:t.fields})}catch{u(`Server error (${s.status})`,{status:s.status,json:t.json,fields:t.fields})}}let n=s.body;n||(i.stop("Failed"),u("Empty response"));let r=new TextDecoder,o="",a=null,l=[],f=!1,m="";try{for await(let g of n){o+=r.decode(g,{stream:!0});let y=o.split(`
180
180
  `);o=y.pop()??"";for(let k of y)if(k.startsWith("event: "))m=k.slice(7);else if(k.startsWith("data: ")){let $=JSON.parse(k.slice(6));if(m==="info"&&(i.stop("Status retrieved"),f=!0,ic($)),m==="records")if(l=$,l.length>0){d(),console.log(` ${it.default.bold("DNS Records")}`);let h=[8,10,34];a=qt(["Type","Name","Value"],l.map(_=>({cells:tc(_),status:"pending"})),h),a.start()}else d(),c("DNS",it.default.dim("no records")),I("Auto-configure DNS:",`domani connect ${e}`);if(m==="propagation"&&a){let{index:h,propagated:_}=$,j=_?b.success:`${b.warning}`;a.markDone(h,j)}m==="done"&&a&&a.stop(),m==="error"&&(f||i.stop("Failed"),a&&a.stop(),u($.message||"Status check failed"))}}}catch{f||i.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||i.stop("Done"),d()}var it,Rn=Ae(()=>{"use strict";G();it=D(M(),1);V();ge();Ze()});var pi={};Ht(pi,{buy:()=>En});async function An(e){let t=await tt({message:`What's next for ${Ue.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(le(t)||t==="done"){d();return}if(d(),t==="connect"){let{connect:i}=await Promise.resolve().then(()=>($n(),uo));await i(e,void 0,{})}else if(t==="email"){let i=await Te({message:`Mailbox name for ${Ue.default.cyan(e)}`,placeholder:"e.g. hey, hello, contact"});if(le(i)||!i){d();return}d();let{email:s}=await Promise.resolve().then(()=>(jn(),vo));await s("create",void 0,{domain:e,slug:i})}else if(t==="dns"){let{dns:i}=await Promise.resolve().then(()=>(On(),$o));await i(e)}else if(t==="status"){let{status:i}=await Promise.resolve().then(()=>(Rn(),ko));await i(e,{})}}async function sc(e,t){z(e,t);let i;if(t.preChecked)i={available:!0,...t.preChecked};else{let m=C(!t.json);m.start(`Checking ${v.domain(e)}`);let g=await x(`/api/domains/search?q=${encodeURIComponent(e)}`);i=await g.json(),g.ok||(m.stop("Search failed"),u(i.error,{hint:i.hint,status:g.status,json:t.json,fields:t.fields})),i.available||(m.stop(`${b.error} ${v.domain(e)} is not available`),u(`${e} is not available`,{code:"not_available",json:t.json,fields:t.fields})),m.stop(`${b.success} ${v.domain(e)} ${b.dot} available ${b.dot} ${v.price(i.price)}/yr`)}if(t.dryRun)return B("buy",{domain:e,available:!0,price:i.price,currency:i.currency||"USD"},t.json,t.fields);if(!Nt(t)){let m=await Ye({message:`Purchase ${Ue.default.bold(e)} for ${v.price(i.price)}/yr?`});if(!m||typeof m=="symbol"){console.log(` ${Ue.default.dim("Cancelled.")}`);return}}let s=C(!t.json);s.start("Purchasing");let n=await x("/api/domains/buy",{method:"POST",headers:{Accept:"text/event-stream"},body:JSON.stringify({domain:e})});if(!n.ok||!n.body){s.stop("Purchase failed");let m=await n.json().catch(()=>({}));u(m.error||m.message,{hint:m.hint,fixUrl:m.setup_url||m.payment_options?.card?.setup_url,status:n.status,json:t.json,fields:t.fields})}let r={},o=new TextDecoder,a="",l="";for await(let m of n.body){a+=o.decode(m,{stream:!0});let g=a.split(`
181
181
  `);a=g.pop()??"";for(let y of g)if(y.startsWith("event: "))l=y.slice(7).trim();else if(y.startsWith("data: ")){let k=JSON.parse(y.slice(6));l==="checking"?s.message(`Checking ${v.domain(k.domain)}`):l==="payment"?s.message(`Charging ${v.price(k.total)}`):l==="registering"?s.message(`Registering ${v.domain(k.domain)}`):l==="registered"?r=k:l==="error"&&(s.stop("Purchase failed"),u(k.error,{hint:k.hint,fixUrl:k.setup_url,status:n.status,json:t.json,fields:t.fields}))}}let f=r.expires?Ue.default.dim(` \xB7 expires ${new Date(r.expires).toLocaleDateString()}`):"";if(s.stop(`${b.success} ${v.domain(r.domain)} is yours!${f}`),t.json){w(r,t.fields);return}Se?await An(r.domain):(I("Connect to a service:",`domani connect ${r.domain}`),I("Set up email:",`domani email setup ${r.domain}`),I("Configure DNS:",`domani dns ${r.domain}`),d())}async function nc(e,t){lo(e,t);let i=!!t.json,s=C(!i);s.start(`Checking ${e.length} domains`);let n=await Promise.all(e.map(async h=>{try{let _=await x(`/api/domains/search?q=${encodeURIComponent(h)}`),j=await _.json();return{domain:h,available:_.ok&&j.available,price:j.price}}catch{return{domain:h,available:!1,price:void 0}}})),r=n.filter(h=>h.available),o=n.filter(h=>!h.available);r.length===0&&(s.stop(`${b.error} None of the ${e.length} domains are available`),process.exit(1));let a=r.reduce((h,_)=>h+(_.price||0),0);if(s.stop(`${b.success} ${r.length}/${e.length} available ${b.dot} ${v.price(a.toFixed(2))} total`),o.length>0)for(let h of o)console.log(` ${b.error} ${v.domain(h.domain)} ${Ue.default.dim("not available")}`);if(t.dryRun)return B("buy_bulk",{domains:r.map(h=>({domain:h.domain,price:h.price})),unavailable:o.map(h=>h.domain),total_price:parseFloat(a.toFixed(2))},t.json,t.fields);if(!Nt(t)){let h=await Ye({message:`Purchase ${Ue.default.bold(String(r.length))} domain${r.length>1?"s":""} for ${v.price(a.toFixed(2))}?`});if(!h||typeof h=="symbol"){console.log(` ${Ue.default.dim("Cancelled.")}`);return}}d();let l=r.map(h=>({cells:[v.domain(h.domain),h.price?`${v.price(h.price.toFixed(2))}/yr`:""],status:"pending"})),f=qt(["Domain","Price"],l,[30,12],!i);f.start();let g=await(await x("/api/domains/buy",{method:"POST",body:JSON.stringify({domains:r.map(h=>h.domain)})})).json(),y=new Set((g.results||[]).map(h=>h.domain));for(let h=0;h<r.length;h++){let _=r[h].domain.toLowerCase().trim();y.has(_)?f.markDone(h,b.success):f.markDone(h,b.error)}if(f.stop(),i){w(g,t.fields);return}d();let k=g.summary?.succeeded??0,$=g.summary?.failed??0;if(k>0&&console.log(` ${b.success} ${Ue.default.green(`${k} domain${k>1?"s":""} registered`)}`),$>0){console.log(` ${b.error} ${Ue.default.red(`${$} failed`)}`);for(let h of g.errors||[])console.log(` ${Ue.default.dim("\u2500")} ${v.domain(h.domain)}: ${Ue.default.dim(h.error)}${h.hint?` ${Ue.default.dim(`(${h.hint})`)}`:""}`)}if(d(),k>0&&Se){let h=(g.results||[]).filter(_=>_.success).map(_=>_.domain);if(h.length===1)await An(h[0]);else{let _=await tt({message:"Set up one of your new domains?",options:[...h.map(j=>({value:j,label:Ue.default.cyan(j)})),{value:"done",label:"Done"}]});!le(_)&&_!=="done"?(d(),await An(_)):d()}}else k>0&&(I("Connect to a service:","domani connect <domain>"),I("Set up email:","domani email setup <domain>"),d())}async function En(e,t){let i=e.filter(Boolean);if(i.length===0){Se||u("Missing required argument: domain(s)",{hint:"Usage: domani buy <domain> [domain2 ...]",code:"missing_argument",json:t.json});let s=await Te({message:"Domain to purchase",placeholder:"e.g. myapp.dev (space-separated for multiple)"});(le(s)||!s)&&process.exit(0),i=s.split(/\s+/).filter(Boolean)}return i.length===1?sc(i[0],t):nc(i,t)}var Ue,ei=Ae(()=>{"use strict";G();Ne();Ue=D(M(),1);V();ge()});var Zn=D(Xn(),1),{program:fu,createCommand:pu,createArgument:hu,createOption:gu,CommanderError:yu,InvalidArgumentError:bu,InvalidOptionArgumentError:wu,Command:Qn,Argument:vu,Option:$u,Help:ku}=Zn.default;var ut=D(M(),1);gt();yn();V();ri();gt();var at=D(M(),1);V();var cd=new Set(["cli","mcp","plugin","skill","api"]);function ud(e){let t=e.scopes?.split(",").map(o=>o.trim()).filter(Boolean),i=e.mailboxes?.split(",").map(o=>o.trim().toLowerCase()).filter(Boolean),s=!!(t?.length||i?.length||e.label||e.expiresIn),n=e.surface||"cli";if(!cd.has(n))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:s,body:{...t?.length?{scopes:t}:{},...i?.length?{mailboxes:i}:{},...e.label?{label:e.label}:{},...r!==void 0?{expires_in:r}:{},surface:n,intent:"programmatic_access"}}}async function to(e){let t=Le(),i=C(!e.json),s;try{s=ud(e)}catch(k){u(k instanceof Error?k.message:"Invalid login options",{code:"invalid_expires_in",json:e.json})}let{body:n,delegated:r}=s,o=ht(),a=Ve();if(a&&!r){i.start("Checking session");try{let k=await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${a}`}});if(k.ok){let $=await k.json();i.stop(`Already logged in as ${at.default.bold($.email)}`),e.json&&w({status:"already_logged_in",email:$.email});return}}catch{}i.stop("Session expired, re-authenticating"),d()}i.start("Requesting auth code");let l=await fetch(`${t}/api/auth/cli`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)});if(!l.ok){i.stop("Failed to initiate login");try{let k=await l.json();u(k.error||k.message||`Server error (${l.status})`,{hint:k.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:g}=await l.json();if(i.stop("Auth code received"),e.json){w({status:"awaiting_approval",code:f,auth_url:m,expires_in:g});return}d(),console.log(` ${at.default.dim("Verification code:")} ${at.default.bold(at.default.cyan(f))}`),e.open!==!1?(console.log(` ${at.default.dim("Opening browser")} ${b.arrow} ${v.url(m)}`),Je(m)):console.log(` ${at.default.dim("Open this URL to approve:")} ${v.url(m)}`),d(),i.start("Waiting for approval");let y=120;for(let k=0;k<y;k++){await new Promise(_=>setTimeout(_,5e3));let $=await fetch(`${t}/api/auth/cli/poll?code=${f}`);!$.ok&&$.status!==202&&(i.stop("Login failed"),u(`Server error (${$.status})`,{code:"login_failed"}));let h=await $.json();if(h.status==="complete"){zt({...ht(),token:h.token,email:h.email,api_url:t}),i.stop(`Logged in as ${at.default.bold(h.email)}`),d(),console.log(` ${at.default.bold("Get one real result:")}`),I("1. Create your free inbox:","domani email create YOUR_HANDLE@domani.run"),I("2. Connect your webhook:","domani email webhook YOUR_HANDLE@domani.run --url https://YOUR_AGENT/webhook"),I("3. Prove delivery:","domani email webhook-test YOUR_HANDLE@domani.run"),console.log(` ${at.default.dim("A custom domain can wait until this loop works.")}`),d();return}h.error&&(i.stop("Login failed"),u(h.error||h.message,{hint:h.hint,code:"login_failed"}))}i.stop("Login timed out"),u("No approval received within 10 minutes",{hint:"Run 'domani login' to try again",code:"timeout"})}gt();var bn=D(M(),1);V();async function io(e){let t=ht();if(!t.token){e.json?w({status:"not_logged_in"}):console.log(` ${bn.default.dim("Not logged in.")}`);return}let{api_url:i}=t;mr(),i&&zt({api_url:i}),e.json?w({status:"logged_out",email:t.email||null}):console.log(` ${b.success} Logged out${t.email?` ${bn.default.dim(`(${t.email})`)}`:""}`)}G();var mi=D(M(),1);V();async function no(e){let[t,i]=await Promise.all([x("/api/me"),x("/api/me/activation")]),s=await t.json();t.ok||u(s.error||s.message,{hint:s.hint,status:t.status,json:e.json,fields:e.fields});let n=i.ok?await i.json():null;if(e.json){w({...s,activation:n},e.fields);return}if(S("Account"),c("Email",mi.default.bold(s.email)),c("Payment",s.has_payment_method?`${b.success} ${mi.default.green("active")}`:`${b.error} ${mi.default.dim("none")}`),c("Domains",String(s.domain_count)),c("API tokens",String(s.token_count)),c("Referral code",s.referral_code||mi.default.dim("-")),c("Created",new Date(s.created_at).toLocaleDateString()),n){c("Activation",n.status);let r=n.recommended_actions?.[0];r&&c("Next action",r.label)}d()}G();Ne();var N=D(M(),1);V();ge();var Be=10,ti=200,ns=["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"],rs=null;async function _o(){if(rs)return rs;try{let e=await we("/api/tlds?sort=price&order=asc&limit=1000");if(e.ok){let i=(await e.json()).tlds.map(s=>s.tld);if(i.length>0){let s=new Set(ns),n=new Set(i),r=[...ns.filter(o=>n.has(o)),...i.filter(o=>!s.has(o))];return rs=r,r}}}catch{}return rs=ns,ns}async function rc(e,t,i,s,n){let r=[],o=[],a=Be,l=0,f=!0,m=0,g=0,y=!1,k=!1,$=null,h="",_=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],j=0,O=setInterval(()=>{k||!f||(j=(j+1)%_.length,T())},80);function A(){m>0&&(process.stdout.write(`\x1B[${m}A\x1B[0J`),m=0)}function L(){if(f)return[];let F=Be+g*Be;return r.length>a||s&&F<n.length?["more","new","skip"]:["new","skip"]}function H(){return r.slice(0,a)}function te(){let F=L();return Math.max(0,H().length+F.length-1)}let P=6;function T(){A();let F=[],X=H(),ee=!f&&X.length===0&&o.length>0,K=ee?o.slice(0,P):X,Re=K.reduce((de,ae)=>Math.max(de,ae.domain.length),0),Ke=L();for(let de=0;de<K.length;de++){let ae=K[de];if(ee)F.push(`${N.default.dim("\u2502")} ${N.default.dim("\u2715")} ${N.default.dim(ae.domain.padEnd(Re))} ${N.default.dim("taken")}`);else{let _e=de===l,mt=_e?N.default.green("\u25CF"):N.default.dim("\u25CB"),ie=ae.domain.padEnd(Re),nt=_e?N.default.bold(N.default.cyan(ie)):ie,kt=ae.for_sale?N.default.cyan(`$${ae.for_sale.price} (for sale)`):N.default.dim(`$${ae.price}/yr`);F.push(`${N.default.dim("\u2502")} ${mt} ${nt} ${kt}`)}}if(ee&&o.length>P&&F.push(`${N.default.dim("\u2502")} ${N.default.dim(`\u2026 and ${o.length-P} more taken`)}`),f){let de=h?N.default.dim(`checking ${h}\u2026`):N.default.dim("searching\u2026");F.push(`${N.default.dim("\u2502")} ${N.default.cyan(_[j])} ${de}`)}else{let de=Be+g*Be;s&&de>=n.length&&F.push(`${N.default.dim("\u2502")} ${N.default.dim(`All ${Math.min(de,n.length)} TLDs searched`)}`);for(let _e=0;_e<Ke.length;_e++){let nt=H().length+_e===l?N.default.green("\u25CF"):N.default.dim("\u25CB"),kt=Ke[_e]==="more"?N.default.dim("More \u2192"):Ke[_e]==="new"?N.default.dim("New search \u2192"):N.default.dim("Skip");F.push(`${N.default.dim("\u2502")} ${nt} ${kt}`)}F.push(N.default.dim("\u2514"))}process.stdout.write(F.join(`
@@ -345,7 +345,7 @@ Examples:
345
345
  domani email webhook-test hi@myapp.dev # one signed test; live inbound retries up to 3x
346
346
  domani email setup myapp.dev # setup email for domain
347
347
  domani email status myapp.dev # check email DNS health
348
- domani email delete --domain myapp.dev --slug hi # delete mailbox`).option("--domain <domain>","Domain name").option("--slug <slug>","Mailbox slug (local part before @)").option("--from <email>","Sender address user@domain (alternative to --domain + --slug)").option("--to <email>","Recipient email address (for send)").option("--cc <emails>","CC recipients, comma-separated (for send)").option("--bcc <emails>","BCC recipients, comma-separated (for send)").option("--subject <s>","Email subject (for send)").option("--title <s>","Email subject (alias for --subject)").option("--text <t>","Email body text (for send)").option("--body <t>","Email body text (alias for --text)").option("--send-at <iso>","Schedule the send (ISO 8601, 30s to 30 days out); trash the message to cancel").option("--message-id <id>","Message ID (for escalate/remind)").option("--reason <text>","Why the human is needed (for escalate)").option("--at <iso>","Reminder time, ISO 8601 (for remind)").option("--clear","Clear the escalation flag, reminder, or tone notes").option("--q <query>","Filter contacts by address or name").option("--name <name>","Contact display name (for contact-add)").option("--notes <text>","Contact notes (for contact-add)").option("--set <text>","Tone notes to set on the mailbox (for tone)").option("--in-reply-to <message-id>","Message-ID of email being replied to (for threading)").option("--references <message-ids>","Space-separated Message-ID chain (for threading)").option("--url <url>","Webhook URL (for webhook)").option("--authorization-env <name>","Read the webhook Authorization value from this environment variable").option("--api-key-env <name>","Read the webhook X-API-Key value from this environment variable").option("--clear-headers","Clear custom webhook auth headers (requires --url)").option("--forward-to <email>","Email address to forward inbound emails to (for forward)").option("--direction <dir>","Filter messages: in or out").option("--folder <folder>","System folder: inbox, archive, sent, spam, trash").option("--view <view>","Virtual view: starred, all, or needs_human").option("--message-ids <ids>","Comma-separated message IDs for lifecycle actions").option("--mailbox-ids <ids>","Comma-separated mailbox IDs for shared inbox work").option("--workspace <id>","Create the mailbox inside this workspace (owner-only)").option("--thread-key <key>","Stable email thread key").option("--thread-aliases <keys>","Comma-separated legacy thread keys returned by the inbox").option("--status <status>","Workflow status: open, waiting, or closed").option("--assigned <filter>","Assignment filter: mine, unassigned, or all").option("--assignee-type <type>","Assignee type: member, token, or agent").option("--assignee-id <id>","Assignee ID").option("--conversation-id <id>","Conversation state ID").option("--note <text>","Private note text").option("--if-version <number>","Conversation version for compare-and-set updates").option("--idempotency-key <key>","Stable retry key for mailbox lifecycle actions").option("--client-id <id>","Stable opaque ID for this app installation or agent process").option("--lease-id <id>","Compose lease returned by a presence heartbeat").option("--mode <mode>","Presence mode: viewing or composing").option("--no-acquire-lease","Advertise composing presence without acquiring the primary lease").option("--limit <n>","Limit results").option("--cursor <cursor>","Opaque pagination or synchronization cursor").option("--check","Verify email DNS health (MX, SPF, DKIM, DMARC)").option("--dry-run","Show what would happen without executing").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").action(fi);W.command("workspace [action]").description("Manage shared workspaces, members, and mailbox access").option("--id <id>","Workspace ID").option("--name <name>","Workspace name").option("--email <email>","Collaborator email").option("--role <role>","Workspace role: admin or member").option("--mailboxes <ids>","Comma-separated mailbox IDs").option("--mailbox-role <role>","Mailbox role: viewer, responder, or manager").option("--token <token>","Invitation token").option("--membership-id <id>","Target workspace membership ID").option("--invitation-id <id>","Pending workspace invitation ID").option("--transfer-id <id>","Pending ownership transfer ID").option("--mailbox-id <id>","Mailbox ID to adopt into the workspace").option("--subject <type:id>","Access subject: human:id, agent:id, token:id, service:id, or group:id").option("--resource <type:id>","Access resource: mailbox:id or collection:id").option("--profile <profile>","Access profile: viewer, responder, manager, draft_only, or mail_client").option("--principals <principals>","Comma-separated group principals as type:id").option("--group-id <id>","Existing access group ID to replace").option("--collection-id <id>","Existing mailbox collection ID to replace").option("--grant-id <id>","Canonical access grant ID").option("--apply","Apply an access plan; the default is dry-run").option("--expected-version <n>","Expected grant version for conflict-safe reconciliation").option("--ownership-disposition <mode>","Offer ownership: unchanged or claim").option("--creator-disposition <mode>","After ownership claim: stay, stay_admin, or leave").option("--billing-disposition <mode>","Billing after offer: unchanged, sponsor, or transfer").option("--plan <plan>","Mailzero plan: mail_solo, mail_team, or mail_business").option("--no-open","Do not open checkout in a browser").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").addHelpText("after",`
348
+ domani email delete --domain myapp.dev --slug hi # delete mailbox`).option("--domain <domain>","Domain name").option("--slug <slug>","Mailbox slug (local part before @)").option("--from <email>","Sender address user@domain (alternative to --domain + --slug)").option("--to <email>","Recipient email address (for send)").option("--cc <emails>","CC recipients, comma-separated (for send)").option("--bcc <emails>","BCC recipients, comma-separated (for send)").option("--subject <s>","Email subject (for send)").option("--title <s>","Email subject (alias for --subject)").option("--text <t>","Email body text (for send)").option("--body <t>","Email body text (alias for --text)").option("--send-at <iso>","Schedule the send (ISO 8601, 30s to 30 days out); trash the message to cancel").option("--message-id <id>","Message ID (for escalate/remind)").option("--reason <text>","Why the human is needed (for escalate)").option("--at <iso>","Reminder time, ISO 8601 (for remind)").option("--clear","Clear the escalation flag, reminder, or tone notes").option("--q <query>","Filter contacts by address or name").option("--name <name>","Contact display name (for contact-add)").option("--notes <text>","Contact notes (for contact-add)").option("--set <text>","Tone notes to set on the mailbox (for tone)").option("--in-reply-to <message-id>","Message-ID of email being replied to (for threading)").option("--references <message-ids>","Space-separated Message-ID chain (for threading)").option("--url <url>","Webhook URL (for webhook)").option("--events <list>","Comma-separated webhook events: email.received plus delivery verdicts on outbound mail (email.delivered, email.bounced, email.failed, email.suppressed, email.complained, email.delayed); omit to keep the current subscription").option("--authorization-env <name>","Read the webhook Authorization value from this environment variable").option("--api-key-env <name>","Read the webhook X-API-Key value from this environment variable").option("--clear-headers","Clear custom webhook auth headers (requires --url)").option("--forward-to <email>","Email address to forward inbound emails to (for forward)").option("--direction <dir>","Filter messages: in or out").option("--folder <folder>","System folder: inbox, archive, sent, spam, trash").option("--view <view>","Virtual view: starred, all, or needs_human").option("--message-ids <ids>","Comma-separated message IDs for lifecycle actions").option("--mailbox-ids <ids>","Comma-separated mailbox IDs for shared inbox work").option("--workspace <id>","Create the mailbox inside this workspace (owner-only)").option("--thread-key <key>","Stable email thread key").option("--thread-aliases <keys>","Comma-separated legacy thread keys returned by the inbox").option("--status <status>","Workflow status: open, waiting, or closed").option("--assigned <filter>","Assignment filter: mine, unassigned, or all").option("--assignee-type <type>","Assignee type: member, token, or agent").option("--assignee-id <id>","Assignee ID").option("--conversation-id <id>","Conversation state ID").option("--note <text>","Private note text").option("--if-version <number>","Conversation version for compare-and-set updates").option("--idempotency-key <key>","Stable retry key for mailbox lifecycle actions").option("--client-id <id>","Stable opaque ID for this app installation or agent process").option("--lease-id <id>","Compose lease returned by a presence heartbeat").option("--mode <mode>","Presence mode: viewing or composing").option("--no-acquire-lease","Advertise composing presence without acquiring the primary lease").option("--limit <n>","Limit results").option("--cursor <cursor>","Opaque pagination or synchronization cursor").option("--check","Verify email DNS health (MX, SPF, DKIM, DMARC)").option("--dry-run","Show what would happen without executing").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").action(fi);W.command("workspace [action]").description("Manage shared workspaces, members, and mailbox access").option("--id <id>","Workspace ID").option("--name <name>","Workspace name").option("--email <email>","Collaborator email").option("--role <role>","Workspace role: admin or member").option("--mailboxes <ids>","Comma-separated mailbox IDs").option("--mailbox-role <role>","Mailbox role: viewer, responder, or manager").option("--token <token>","Invitation token").option("--membership-id <id>","Target workspace membership ID").option("--invitation-id <id>","Pending workspace invitation ID").option("--transfer-id <id>","Pending ownership transfer ID").option("--mailbox-id <id>","Mailbox ID to adopt into the workspace").option("--subject <type:id>","Access subject: human:id, agent:id, token:id, service:id, or group:id").option("--resource <type:id>","Access resource: mailbox:id or collection:id").option("--profile <profile>","Access profile: viewer, responder, manager, draft_only, or mail_client").option("--principals <principals>","Comma-separated group principals as type:id").option("--group-id <id>","Existing access group ID to replace").option("--collection-id <id>","Existing mailbox collection ID to replace").option("--grant-id <id>","Canonical access grant ID").option("--apply","Apply an access plan; the default is dry-run").option("--expected-version <n>","Expected grant version for conflict-safe reconciliation").option("--ownership-disposition <mode>","Offer ownership: unchanged or claim").option("--creator-disposition <mode>","After ownership claim: stay, stay_admin, or leave").option("--billing-disposition <mode>","Billing after offer: unchanged, sponsor, or transfer").option("--plan <plan>","Mailzero plan: mail_solo, mail_team, or mail_business").option("--no-open","Do not open checkout in a browser").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").addHelpText("after",`
349
349
  Examples:
350
350
  domani workspace list
351
351
  domani workspace create --name Acme
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "domani-cli",
3
- "version": "0.4.58",
3
+ "version": "0.4.59",
4
4
  "type": "module",
5
5
  "description": "Domain infrastructure for AI agents. Search, register, DNS, email, connect - all from your terminal. Installs the `domani` command.",
6
6
  "license": "MIT",