domani-cli 0.4.92 → 0.4.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/domani.cjs +123 -123
- package/package.json +1 -1
package/dist/domani.cjs
CHANGED
|
@@ -1,227 +1,227 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var Ol=Object.create;var
|
|
3
|
-
`)}displayWidth(t){return
|
|
2
|
+
"use strict";var Ol=Object.create;var ds=Object.defineProperty;var Cl=Object.getOwnPropertyDescriptor;var Rl=Object.getOwnPropertyNames;var Il=Object.getPrototypeOf,Al=Object.prototype.hasOwnProperty;var $e=(e,t)=>()=>(e&&(t=e(e=0)),t);var xt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),gn=(e,t)=>{for(var n in t)ds(e,n,{get:t[n],enumerable:!0})},Tl=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Rl(t))!Al.call(e,s)&&s!==n&&ds(e,s,{get:()=>t[s],enumerable:!(i=Cl(t,s))||i.enumerable});return e};var D=(e,t,n)=>(n=e!=null?Ol(Il(e)):{},Tl(t||!e||!e.__esModule?ds(n,"default",{value:e,enumerable:!0}):n,e));var An=xt(cs=>{var di=class extends Error{constructor(t,n,i){super(i),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=n,this.exitCode=t,this.nestedError=void 0}},ls=class extends di{constructor(t){super(1,"commander.invalidArgument",t),Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}};cs.CommanderError=di;cs.InvalidArgumentError=ls});var li=xt(ms=>{var{InvalidArgumentError:El}=An(),us=class{constructor(t,n){switch(this.description=n||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,t[0]){case"<":this.required=!0,this._name=t.slice(1,-1);break;case"[":this.required=!1,this._name=t.slice(1,-1);break;default:this.required=!0,this._name=t;break}this._name.length>3&&this._name.slice(-3)==="..."&&(this.variadic=!0,this._name=this._name.slice(0,-3))}name(){return this._name}_concatValue(t,n){return n===this.defaultValue||!Array.isArray(n)?[t]:n.concat(t)}default(t,n){return this.defaultValue=t,this.defaultValueDescription=n,this}argParser(t){return this.parseArg=t,this}choices(t){return this.argChoices=t.slice(),this.parseArg=(n,i)=>{if(!this.argChoices.includes(n))throw new El(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(n,i):n},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}};function Pl(e){let t=e.name()+(e.variadic===!0?"...":"");return e.required?"<"+t+">":"["+t+"]"}ms.Argument=us;ms.humanReadableArgName=Pl});var hs=xt(ps=>{var{humanReadableArgName:Dl}=li(),fs=class{constructor(){this.helpWidth=void 0,this.minWidthToWrap=40,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}prepareContext(t){this.helpWidth=this.helpWidth??t.helpWidth??80}visibleCommands(t){let n=t.commands.filter(s=>!s._hidden),i=t._getHelpCommand();return i&&!i._hidden&&n.push(i),this.sortSubcommands&&n.sort((s,r)=>s.name().localeCompare(r.name())),n}compareOptions(t,n){let i=s=>s.short?s.short.replace(/^-/,""):s.long.replace(/^--/,"");return i(t).localeCompare(i(n))}visibleOptions(t){let n=t.options.filter(s=>!s.hidden),i=t._getHelpOption();if(i&&!i.hidden){let s=i.short&&t._findOption(i.short),r=i.long&&t._findOption(i.long);!s&&!r?n.push(i):i.long&&!r?n.push(t.createOption(i.long,i.description)):i.short&&!s&&n.push(t.createOption(i.short,i.description))}return this.sortOptions&&n.sort(this.compareOptions),n}visibleGlobalOptions(t){if(!this.showGlobalOptions)return[];let n=[];for(let i=t.parent;i;i=i.parent){let s=i.options.filter(r=>!r.hidden);n.push(...s)}return this.sortOptions&&n.sort(this.compareOptions),n}visibleArguments(t){return t._argsDescription&&t.registeredArguments.forEach(n=>{n.description=n.description||t._argsDescription[n.name()]||""}),t.registeredArguments.find(n=>n.description)?t.registeredArguments:[]}subcommandTerm(t){let n=t.registeredArguments.map(i=>Dl(i)).join(" ");return t._name+(t._aliases[0]?"|"+t._aliases[0]:"")+(t.options.length?" [options]":"")+(n?" "+n:"")}optionTerm(t){return t.flags}argumentTerm(t){return t.name()}longestSubcommandTermLength(t,n){return n.visibleCommands(t).reduce((i,s)=>Math.max(i,this.displayWidth(n.styleSubcommandTerm(n.subcommandTerm(s)))),0)}longestOptionTermLength(t,n){return n.visibleOptions(t).reduce((i,s)=>Math.max(i,this.displayWidth(n.styleOptionTerm(n.optionTerm(s)))),0)}longestGlobalOptionTermLength(t,n){return n.visibleGlobalOptions(t).reduce((i,s)=>Math.max(i,this.displayWidth(n.styleOptionTerm(n.optionTerm(s)))),0)}longestArgumentTermLength(t,n){return n.visibleArguments(t).reduce((i,s)=>Math.max(i,this.displayWidth(n.styleArgumentTerm(n.argumentTerm(s)))),0)}commandUsage(t){let n=t._name;t._aliases[0]&&(n=n+"|"+t._aliases[0]);let i="";for(let s=t.parent;s;s=s.parent)i=s.name()+" "+i;return i+n+" "+t.usage()}commandDescription(t){return t.description()}subcommandDescription(t){return t.summary()||t.description()}optionDescription(t){let n=[];return t.argChoices&&n.push(`choices: ${t.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),t.defaultValue!==void 0&&(t.required||t.optional||t.isBoolean()&&typeof t.defaultValue=="boolean")&&n.push(`default: ${t.defaultValueDescription||JSON.stringify(t.defaultValue)}`),t.presetArg!==void 0&&t.optional&&n.push(`preset: ${JSON.stringify(t.presetArg)}`),t.envVar!==void 0&&n.push(`env: ${t.envVar}`),n.length>0?`${t.description} (${n.join(", ")})`:t.description}argumentDescription(t){let n=[];if(t.argChoices&&n.push(`choices: ${t.argChoices.map(i=>JSON.stringify(i)).join(", ")}`),t.defaultValue!==void 0&&n.push(`default: ${t.defaultValueDescription||JSON.stringify(t.defaultValue)}`),n.length>0){let i=`(${n.join(", ")})`;return t.description?`${t.description} ${i}`:i}return t.description}formatHelp(t,n){let i=n.padWidth(t,n),s=n.helpWidth??80;function r(p,w){return n.formatItem(p,i,w,n)}let o=[`${n.styleTitle("Usage:")} ${n.styleUsage(n.commandUsage(t))}`,""],a=n.commandDescription(t);a.length>0&&(o=o.concat([n.boxWrap(n.styleCommandDescription(a),s),""]));let d=n.visibleArguments(t).map(p=>r(n.styleArgumentTerm(n.argumentTerm(p)),n.styleArgumentDescription(n.argumentDescription(p))));d.length>0&&(o=o.concat([n.styleTitle("Arguments:"),...d,""]));let m=n.visibleOptions(t).map(p=>r(n.styleOptionTerm(n.optionTerm(p)),n.styleOptionDescription(n.optionDescription(p))));if(m.length>0&&(o=o.concat([n.styleTitle("Options:"),...m,""])),n.showGlobalOptions){let p=n.visibleGlobalOptions(t).map(w=>r(n.styleOptionTerm(n.optionTerm(w)),n.styleOptionDescription(n.optionDescription(w))));p.length>0&&(o=o.concat([n.styleTitle("Global Options:"),...p,""]))}let f=n.visibleCommands(t).map(p=>r(n.styleSubcommandTerm(n.subcommandTerm(p)),n.styleSubcommandDescription(n.subcommandDescription(p))));return f.length>0&&(o=o.concat([n.styleTitle("Commands:"),...f,""])),o.join(`
|
|
3
|
+
`)}displayWidth(t){return io(t).length}styleTitle(t){return t}styleUsage(t){return t.split(" ").map(n=>n==="[options]"?this.styleOptionText(n):n==="[command]"?this.styleSubcommandText(n):n[0]==="["||n[0]==="<"?this.styleArgumentText(n):this.styleCommandText(n)).join(" ")}styleCommandDescription(t){return this.styleDescriptionText(t)}styleOptionDescription(t){return this.styleDescriptionText(t)}styleSubcommandDescription(t){return this.styleDescriptionText(t)}styleArgumentDescription(t){return this.styleDescriptionText(t)}styleDescriptionText(t){return t}styleOptionTerm(t){return this.styleOptionText(t)}styleSubcommandTerm(t){return t.split(" ").map(n=>n==="[options]"?this.styleOptionText(n):n[0]==="["||n[0]==="<"?this.styleArgumentText(n):this.styleSubcommandText(n)).join(" ")}styleArgumentTerm(t){return this.styleArgumentText(t)}styleOptionText(t){return t}styleArgumentText(t){return t}styleSubcommandText(t){return t}styleCommandText(t){return t}padWidth(t,n){return Math.max(n.longestOptionTermLength(t,n),n.longestGlobalOptionTermLength(t,n),n.longestSubcommandTermLength(t,n),n.longestArgumentTermLength(t,n))}preformatted(t){return/\n[^\S\r\n]/.test(t)}formatItem(t,n,i,s){let o=" ".repeat(2);if(!i)return o+t;let a=t.padEnd(n+t.length-s.displayWidth(t)),d=2,f=(this.helpWidth??80)-n-d-2,p;return f<this.minWidthToWrap||s.preformatted(i)?p=i:p=s.boxWrap(i,f).replace(/\n/g,`
|
|
4
4
|
`+" ".repeat(n+d)),o+a+" ".repeat(d)+p.replace(/\n/g,`
|
|
5
|
-
${o}`)}boxWrap(t,n){if(n<this.minWidthToWrap)return t;let i=t.split(/\r\n|\n/),s=/[\s]*[^\s]+/g,r=[];return i.forEach(o=>{let a=o.match(s);if(a===null){r.push("");return}let d=[a.shift()],m=this.displayWidth(d[0]);a.forEach(f=>{let p=this.displayWidth(f);if(m+p<=n){d.push(f),m+=p;return}r.push(d.join(""));let
|
|
6
|
-
`)}};function
|
|
5
|
+
${o}`)}boxWrap(t,n){if(n<this.minWidthToWrap)return t;let i=t.split(/\r\n|\n/),s=/[\s]*[^\s]+/g,r=[];return i.forEach(o=>{let a=o.match(s);if(a===null){r.push("");return}let d=[a.shift()],m=this.displayWidth(d[0]);a.forEach(f=>{let p=this.displayWidth(f);if(m+p<=n){d.push(f),m+=p;return}r.push(d.join(""));let w=f.trimStart();d=[w],m=this.displayWidth(w)}),r.push(d.join(""))}),r.join(`
|
|
6
|
+
`)}};function io(e){let t=/\x1b\[\d*(;\d*)*m/g;return e.replace(t,"")}ps.Help=fs;ps.stripColor=io});var ws=xt(bs=>{var{InvalidArgumentError:Nl}=An(),gs=class{constructor(t,n){this.flags=t,this.description=n||"",this.required=t.includes("<"),this.optional=t.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(t),this.mandatory=!1;let i=Ul(t);this.short=i.shortFlag,this.long=i.longFlag,this.negate=!1,this.long&&(this.negate=this.long.startsWith("--no-")),this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(t,n){return this.defaultValue=t,this.defaultValueDescription=n,this}preset(t){return this.presetArg=t,this}conflicts(t){return this.conflictsWith=this.conflictsWith.concat(t),this}implies(t){let n=t;return typeof t=="string"&&(n={[t]:!0}),this.implied=Object.assign(this.implied||{},n),this}env(t){return this.envVar=t,this}argParser(t){return this.parseArg=t,this}makeOptionMandatory(t=!0){return this.mandatory=!!t,this}hideHelp(t=!0){return this.hidden=!!t,this}_concatValue(t,n){return n===this.defaultValue||!Array.isArray(n)?[t]:n.concat(t)}choices(t){return this.argChoices=t.slice(),this.parseArg=(n,i)=>{if(!this.argChoices.includes(n))throw new Nl(`Allowed choices are ${this.argChoices.join(", ")}.`);return this.variadic?this._concatValue(n,i):n},this}name(){return this.long?this.long.replace(/^--/,""):this.short.replace(/^-/,"")}attributeName(){return this.negate?so(this.name().replace(/^no-/,"")):so(this.name())}is(t){return this.short===t||this.long===t}isBoolean(){return!this.required&&!this.optional&&!this.negate}},ys=class{constructor(t){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,t.forEach(n=>{n.negate?this.negativeOptions.set(n.attributeName(),n):this.positiveOptions.set(n.attributeName(),n)}),this.negativeOptions.forEach((n,i)=>{this.positiveOptions.has(i)&&this.dualOptions.add(i)})}valueFromOption(t,n){let i=n.attributeName();if(!this.dualOptions.has(i))return!0;let s=this.negativeOptions.get(i).presetArg,r=s!==void 0?s:!1;return n.negate===(r===t)}};function so(e){return e.split("-").reduce((t,n)=>t+n[0].toUpperCase()+n.slice(1))}function Ul(e){let t,n,i=/^-[^-]$/,s=/^--[^-]/,r=e.split(/[ |,]+/).concat("guard");if(i.test(r[0])&&(t=r.shift()),s.test(r[0])&&(n=r.shift()),!t&&i.test(r[0])&&(t=r.shift()),!t&&s.test(r[0])&&(t=n,n=r.shift()),r[0].startsWith("-")){let o=r[0],a=`option creation failed due to '${o}' in option flags '${e}'`;throw/^-[^-][^-]/.test(o)?new Error(`${a}
|
|
7
7
|
- a short flag is a single dash and a single character
|
|
8
8
|
- either use a single dash and a single character (for a short flag)
|
|
9
9
|
- or use a double dash for a long option (and can have two, like '--ws, --workspace')`):i.test(o)?new Error(`${a}
|
|
10
10
|
- too many short flags`):s.test(o)?new Error(`${a}
|
|
11
11
|
- too many long flags`):new Error(`${a}
|
|
12
|
-
- unrecognised flag format`)}if(t===void 0&&n===void 0)throw new Error(`option creation failed due to no flags found in '${e}'.`);return{shortFlag:t,longFlag:n}}
|
|
12
|
+
- unrecognised flag format`)}if(t===void 0&&n===void 0)throw new Error(`option creation failed due to no flags found in '${e}'.`);return{shortFlag:t,longFlag:n}}bs.Option=gs;bs.DualOptions=ys});var oo=xt(ro=>{function Ml(e,t){if(Math.abs(e.length-t.length)>3)return Math.max(e.length,t.length);let n=[];for(let i=0;i<=e.length;i++)n[i]=[i];for(let i=0;i<=t.length;i++)n[0][i]=i;for(let i=1;i<=t.length;i++)for(let s=1;s<=e.length;s++){let r=1;e[s-1]===t[i-1]?r=0:r=1,n[s][i]=Math.min(n[s-1][i]+1,n[s][i-1]+1,n[s-1][i-1]+r),s>1&&i>1&&e[s-1]===t[i-2]&&e[s-2]===t[i-1]&&(n[s][i]=Math.min(n[s][i],n[s-2][i-2]+1))}return n[e.length][t.length]}function ql(e,t){if(!t||t.length===0)return"";t=Array.from(new Set(t));let n=e.startsWith("--");n&&(e=e.slice(2),t=t.map(o=>o.slice(2)));let i=[],s=3,r=.4;return t.forEach(o=>{if(o.length<=1)return;let a=Ml(e,o),d=Math.max(e.length,o.length);(d-a)/d>r&&(a<s?(s=a,i=[o]):a===s&&i.push(o))}),i.sort((o,a)=>o.localeCompare(a)),n&&(i=i.map(o=>`--${o}`)),i.length>1?`
|
|
13
13
|
(Did you mean one of ${i.join(", ")}?)`:i.length===1?`
|
|
14
|
-
(Did you mean ${i[0]}?)`:""}
|
|
14
|
+
(Did you mean ${i[0]}?)`:""}ro.suggestSimilar=ql});var uo=xt(xs=>{var Fl=require("node:events").EventEmitter,$s=require("node:child_process"),jt=require("node:path"),ci=require("node:fs"),se=require("node:process"),{Argument:Ll,humanReadableArgName:Vl}=li(),{CommanderError:vs}=An(),{Help:Wl,stripColor:Hl}=hs(),{Option:ao,DualOptions:Jl}=ws(),{suggestSimilar:lo}=oo(),_s=class e extends Fl{constructor(t){super(),this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!1,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=t||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._savedState=null,this._outputConfiguration={writeOut:n=>se.stdout.write(n),writeErr:n=>se.stderr.write(n),outputError:(n,i)=>i(n),getOutHelpWidth:()=>se.stdout.isTTY?se.stdout.columns:void 0,getErrHelpWidth:()=>se.stderr.isTTY?se.stderr.columns:void 0,getOutHasColors:()=>ks()??(se.stdout.isTTY&&se.stdout.hasColors?.()),getErrHasColors:()=>ks()??(se.stderr.isTTY&&se.stderr.hasColors?.()),stripColor:n=>Hl(n)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(t){return this._outputConfiguration=t._outputConfiguration,this._helpOption=t._helpOption,this._helpCommand=t._helpCommand,this._helpConfiguration=t._helpConfiguration,this._exitCallback=t._exitCallback,this._storeOptionsAsProperties=t._storeOptionsAsProperties,this._combineFlagAndOptionalValue=t._combineFlagAndOptionalValue,this._allowExcessArguments=t._allowExcessArguments,this._enablePositionalOptions=t._enablePositionalOptions,this._showHelpAfterError=t._showHelpAfterError,this._showSuggestionAfterError=t._showSuggestionAfterError,this}_getCommandAndAncestors(){let t=[];for(let n=this;n;n=n.parent)t.push(n);return t}command(t,n,i){let s=n,r=i;typeof s=="object"&&s!==null&&(r=s,s=null),r=r||{};let[,o,a]=t.match(/([^ ]+) *(.*)/),d=this.createCommand(o);return s&&(d.description(s),d._executableHandler=!0),r.isDefault&&(this._defaultCommandName=d._name),d._hidden=!!(r.noHelp||r.hidden),d._executableFile=r.executableFile||null,a&&d.arguments(a),this._registerCommand(d),d.parent=this,d.copyInheritedSettings(this),s?this:d}createCommand(t){return new e(t)}createHelp(){return Object.assign(new Wl,this.configureHelp())}configureHelp(t){return t===void 0?this._helpConfiguration:(this._helpConfiguration=t,this)}configureOutput(t){return t===void 0?this._outputConfiguration:(Object.assign(this._outputConfiguration,t),this)}showHelpAfterError(t=!0){return typeof t!="string"&&(t=!!t),this._showHelpAfterError=t,this}showSuggestionAfterError(t=!0){return this._showSuggestionAfterError=!!t,this}addCommand(t,n){if(!t._name)throw new Error(`Command passed to .addCommand() must have a name
|
|
15
15
|
- specify the name in Command constructor or using .name()`);return n=n||{},n.isDefault&&(this._defaultCommandName=t._name),(n.noHelp||n.hidden)&&(t._hidden=!0),this._registerCommand(t),t.parent=this,t._checkForBrokenPassThrough(),this}createArgument(t,n){return new Ll(t,n)}argument(t,n,i,s){let r=this.createArgument(t,n);return typeof i=="function"?r.default(s).argParser(i):r.default(i),this.addArgument(r),this}arguments(t){return t.trim().split(/ +/).forEach(n=>{this.argument(n)}),this}addArgument(t){let n=this.registeredArguments.slice(-1)[0];if(n&&n.variadic)throw new Error(`only the last argument can be variadic '${n.name()}'`);if(t.required&&t.defaultValue!==void 0&&t.parseArg===void 0)throw new Error(`a default value for a required argument is never used: '${t.name()}'`);return this.registeredArguments.push(t),this}helpCommand(t,n){if(typeof t=="boolean")return this._addImplicitHelpCommand=t,this;t=t??"help [command]";let[,i,s]=t.match(/([^ ]+) *(.*)/),r=n??"display help for command",o=this.createCommand(i);return o.helpOption(!1),s&&o.arguments(s),r&&o.description(r),this._addImplicitHelpCommand=!0,this._helpCommand=o,this}addHelpCommand(t,n){return typeof t!="object"?(this.helpCommand(t,n),this):(this._addImplicitHelpCommand=!0,this._helpCommand=t,this)}_getHelpCommand(){return this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))?(this._helpCommand===void 0&&this.helpCommand(void 0,void 0),this._helpCommand):null}hook(t,n){let i=["preSubcommand","preAction","postAction"];if(!i.includes(t))throw new Error(`Unexpected value for event passed to hook : '${t}'.
|
|
16
|
-
Expecting one of '${i.join("', '")}'`);return this._lifeCycleHooks[t]?this._lifeCycleHooks[t].push(n):this._lifeCycleHooks[t]=[n],this}exitOverride(t){return t?this._exitCallback=t:this._exitCallback=n=>{if(n.code!=="commander.executeSubCommandAsync")throw n},this}_exit(t,n,i){this._exitCallback&&this._exitCallback(new
|
|
17
|
-
- already used by option '${n.flags}'`)}this.options.push(t)}_registerCommand(t){let n=s=>[s.name()].concat(s.aliases()),i=n(t).find(s=>this._findCommand(s));if(i){let s=n(this._findCommand(i)).join("|"),r=n(t).join("|");throw new Error(`cannot add command '${r}' as already have command '${s}'`)}this.commands.push(t)}addOption(t){this._registerOption(t);let n=t.name(),i=t.attributeName();if(t.negate){let r=t.long.replace(/^--no-/,"--");this._findOption(r)||this.setOptionValueWithSource(i,t.defaultValue===void 0?!0:t.defaultValue,"default")}else t.defaultValue!==void 0&&this.setOptionValueWithSource(i,t.defaultValue,"default");let s=(r,o,a)=>{r==null&&t.presetArg!==void 0&&(r=t.presetArg);let d=this.getOptionValue(i);r!==null&&t.parseArg?r=this._callParseArg(t,r,d,o):r!==null&&t.variadic&&(r=t._concatValue(r,d)),r==null&&(t.negate?r=!1:t.isBoolean()||t.optional?r=!0:r=""),this.setOptionValueWithSource(i,r,a)};return this.on("option:"+n,r=>{let o=`error: option '${t.flags}' argument '${r}' is invalid.`;s(r,o,"cli")}),t.envVar&&this.on("optionEnv:"+n,r=>{let o=`error: option '${t.flags}' value '${r}' from env '${t.envVar}' is invalid.`;s(r,o,"env")}),this}_optionEx(t,n,i,s,r){if(typeof n=="object"&&n instanceof
|
|
16
|
+
Expecting one of '${i.join("', '")}'`);return this._lifeCycleHooks[t]?this._lifeCycleHooks[t].push(n):this._lifeCycleHooks[t]=[n],this}exitOverride(t){return t?this._exitCallback=t:this._exitCallback=n=>{if(n.code!=="commander.executeSubCommandAsync")throw n},this}_exit(t,n,i){this._exitCallback&&this._exitCallback(new vs(t,n,i)),se.exit(t)}action(t){let n=i=>{let s=this.registeredArguments.length,r=i.slice(0,s);return this._storeOptionsAsProperties?r[s]=this:r[s]=this.opts(),r.push(this),t.apply(this,r)};return this._actionHandler=n,this}createOption(t,n){return new ao(t,n)}_callParseArg(t,n,i,s){try{return t.parseArg(n,i)}catch(r){if(r.code==="commander.invalidArgument"){let o=`${s} ${r.message}`;this.error(o,{exitCode:r.exitCode,code:r.code})}throw r}}_registerOption(t){let n=t.short&&this._findOption(t.short)||t.long&&this._findOption(t.long);if(n){let i=t.long&&this._findOption(t.long)?t.long:t.short;throw new Error(`Cannot add option '${t.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${i}'
|
|
17
|
+
- already used by option '${n.flags}'`)}this.options.push(t)}_registerCommand(t){let n=s=>[s.name()].concat(s.aliases()),i=n(t).find(s=>this._findCommand(s));if(i){let s=n(this._findCommand(i)).join("|"),r=n(t).join("|");throw new Error(`cannot add command '${r}' as already have command '${s}'`)}this.commands.push(t)}addOption(t){this._registerOption(t);let n=t.name(),i=t.attributeName();if(t.negate){let r=t.long.replace(/^--no-/,"--");this._findOption(r)||this.setOptionValueWithSource(i,t.defaultValue===void 0?!0:t.defaultValue,"default")}else t.defaultValue!==void 0&&this.setOptionValueWithSource(i,t.defaultValue,"default");let s=(r,o,a)=>{r==null&&t.presetArg!==void 0&&(r=t.presetArg);let d=this.getOptionValue(i);r!==null&&t.parseArg?r=this._callParseArg(t,r,d,o):r!==null&&t.variadic&&(r=t._concatValue(r,d)),r==null&&(t.negate?r=!1:t.isBoolean()||t.optional?r=!0:r=""),this.setOptionValueWithSource(i,r,a)};return this.on("option:"+n,r=>{let o=`error: option '${t.flags}' argument '${r}' is invalid.`;s(r,o,"cli")}),t.envVar&&this.on("optionEnv:"+n,r=>{let o=`error: option '${t.flags}' value '${r}' from env '${t.envVar}' is invalid.`;s(r,o,"env")}),this}_optionEx(t,n,i,s,r){if(typeof n=="object"&&n instanceof ao)throw new Error("To add an Option object use addOption() instead of option() or requiredOption()");let o=this.createOption(n,i);if(o.makeOptionMandatory(!!t.mandatory),typeof s=="function")o.default(r).argParser(s);else if(s instanceof RegExp){let a=s;s=(d,m)=>{let f=a.exec(d);return f?f[0]:m},o.default(r).argParser(s)}else o.default(s);return this.addOption(o)}option(t,n,i,s){return this._optionEx({},t,n,i,s)}requiredOption(t,n,i,s){return this._optionEx({mandatory:!0},t,n,i,s)}combineFlagAndOptionalValue(t=!0){return this._combineFlagAndOptionalValue=!!t,this}allowUnknownOption(t=!0){return this._allowUnknownOption=!!t,this}allowExcessArguments(t=!0){return this._allowExcessArguments=!!t,this}enablePositionalOptions(t=!0){return this._enablePositionalOptions=!!t,this}passThroughOptions(t=!0){return this._passThroughOptions=!!t,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw new Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(t=!0){if(this.options.length)throw new Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw new Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!t,this}getOptionValue(t){return this._storeOptionsAsProperties?this[t]:this._optionValues[t]}setOptionValue(t,n){return this.setOptionValueWithSource(t,n,void 0)}setOptionValueWithSource(t,n,i){return this._storeOptionsAsProperties?this[t]=n:this._optionValues[t]=n,this._optionValueSources[t]=i,this}getOptionValueSource(t){return this._optionValueSources[t]}getOptionValueSourceWithGlobals(t){let n;return this._getCommandAndAncestors().forEach(i=>{i.getOptionValueSource(t)!==void 0&&(n=i.getOptionValueSource(t))}),n}_prepareUserArgs(t,n){if(t!==void 0&&!Array.isArray(t))throw new Error("first parameter to parse must be array or undefined");if(n=n||{},t===void 0&&n.from===void 0){se.versions?.electron&&(n.from="electron");let s=se.execArgv??[];(s.includes("-e")||s.includes("--eval")||s.includes("-p")||s.includes("--print"))&&(n.from="eval")}t===void 0&&(t=se.argv),this.rawArgs=t.slice();let i;switch(n.from){case void 0:case"node":this._scriptPath=t[1],i=t.slice(2);break;case"electron":se.defaultApp?(this._scriptPath=t[1],i=t.slice(2)):i=t.slice(1);break;case"user":i=t.slice(0);break;case"eval":i=t.slice(1);break;default:throw new Error(`unexpected parse option { from: '${n.from}' }`)}return!this._name&&this._scriptPath&&this.nameFromFilename(this._scriptPath),this._name=this._name||"program",i}parse(t,n){this._prepareForParse();let i=this._prepareUserArgs(t,n);return this._parseCommand([],i),this}async parseAsync(t,n){this._prepareForParse();let i=this._prepareUserArgs(t,n);return await this._parseCommand([],i),this}_prepareForParse(){this._savedState===null?this.saveStateBeforeParse():this.restoreStateBeforeParse()}saveStateBeforeParse(){this._savedState={_name:this._name,_optionValues:{...this._optionValues},_optionValueSources:{...this._optionValueSources}}}restoreStateBeforeParse(){if(this._storeOptionsAsProperties)throw new Error(`Can not call parse again when storeOptionsAsProperties is true.
|
|
18
18
|
- either make a new Command for each call to parse, or stop storing options as properties`);this._name=this._savedState._name,this._scriptPath=null,this.rawArgs=[],this._optionValues={...this._savedState._optionValues},this._optionValueSources={...this._savedState._optionValueSources},this.args=[],this.processedArgs=[]}_checkForMissingExecutable(t,n,i){if(ci.existsSync(t))return;let s=n?`searched for local subcommand relative to directory '${n}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",r=`'${t}' does not exist
|
|
19
19
|
- if '${i}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
|
|
20
20
|
- if the default executable name is not suitable, use the executableFile option to supply a custom name or path
|
|
21
|
-
- ${s}`;throw new Error(r)}_executeSubCommand(t,n){n=n.slice();let i=!1,s=[".js",".ts",".tsx",".mjs",".cjs"];function r(f,p){let
|
|
21
|
+
- ${s}`;throw new Error(r)}_executeSubCommand(t,n){n=n.slice();let i=!1,s=[".js",".ts",".tsx",".mjs",".cjs"];function r(f,p){let w=jt.resolve(f,p);if(ci.existsSync(w))return w;if(s.includes(jt.extname(p)))return;let _=s.find(v=>ci.existsSync(`${w}${v}`));if(_)return`${w}${_}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let o=t._executableFile||`${this._name}-${t._name}`,a=this._executableDir||"";if(this._scriptPath){let f;try{f=ci.realpathSync(this._scriptPath)}catch{f=this._scriptPath}a=jt.resolve(jt.dirname(f),a)}if(a){let f=r(a,o);if(!f&&!t._executableFile&&this._scriptPath){let p=jt.basename(this._scriptPath,jt.extname(this._scriptPath));p!==this._name&&(f=r(a,`${p}-${t._name}`))}o=f||o}i=s.includes(jt.extname(o));let d;se.platform!=="win32"?i?(n.unshift(o),n=co(se.execArgv).concat(n),d=$s.spawn(se.argv[0],n,{stdio:"inherit"})):d=$s.spawn(o,n,{stdio:"inherit"}):(this._checkForMissingExecutable(o,a,t._name),n.unshift(o),n=co(se.execArgv).concat(n),d=$s.spawn(se.execPath,n,{stdio:"inherit"})),d.killed||["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach(p=>{se.on(p,()=>{d.killed===!1&&d.exitCode===null&&d.kill(p)})});let m=this._exitCallback;d.on("close",f=>{f=f??1,m?m(new vs(f,"commander.executeSubCommandAsync","(close)")):se.exit(f)}),d.on("error",f=>{if(f.code==="ENOENT")this._checkForMissingExecutable(o,a,t._name);else if(f.code==="EACCES")throw new Error(`'${o}' not executable`);if(!m)se.exit(1);else{let p=new vs(1,"commander.executeSubCommandAsync","(error)");p.nestedError=f,m(p)}}),this.runningCommand=d}_dispatchSubcommand(t,n,i){let s=this._findCommand(t);s||this.help({error:!0}),s._prepareForParse();let r;return r=this._chainOrCallSubCommandHook(r,s,"preSubcommand"),r=this._chainOrCall(r,()=>{if(s._executableHandler)this._executeSubCommand(s,n.concat(i));else return s._parseCommand(n,i)}),r}_dispatchHelpCommand(t){t||this.help();let n=this._findCommand(t);return n&&!n._executableHandler&&n.help(),this._dispatchSubcommand(t,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){this.registeredArguments.forEach((t,n)=>{t.required&&this.args[n]==null&&this.missingArgument(t.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let t=(i,s,r)=>{let o=s;if(s!==null&&i.parseArg){let a=`error: command-argument value '${s}' is invalid for argument '${i.name()}'.`;o=this._callParseArg(i,s,r,a)}return o};this._checkNumberOfArguments();let n=[];this.registeredArguments.forEach((i,s)=>{let r=i.defaultValue;i.variadic?s<this.args.length?(r=this.args.slice(s),i.parseArg&&(r=r.reduce((o,a)=>t(i,a,o),i.defaultValue))):r===void 0&&(r=[]):s<this.args.length&&(r=this.args[s],i.parseArg&&(r=t(i,r,i.defaultValue))),n[s]=r}),this.processedArgs=n}_chainOrCall(t,n){return t&&t.then&&typeof t.then=="function"?t.then(()=>n()):n()}_chainOrCallHooks(t,n){let i=t,s=[];return this._getCommandAndAncestors().reverse().filter(r=>r._lifeCycleHooks[n]!==void 0).forEach(r=>{r._lifeCycleHooks[n].forEach(o=>{s.push({hookedCommand:r,callback:o})})}),n==="postAction"&&s.reverse(),s.forEach(r=>{i=this._chainOrCall(i,()=>r.callback(r.hookedCommand,this))}),i}_chainOrCallSubCommandHook(t,n,i){let s=t;return this._lifeCycleHooks[i]!==void 0&&this._lifeCycleHooks[i].forEach(r=>{s=this._chainOrCall(s,()=>r(this,n))}),s}_parseCommand(t,n){let i=this.parseOptions(n);if(this._parseOptionsEnv(),this._parseOptionsImplied(),t=t.concat(i.operands),n=i.unknown,this.args=t.concat(n),t&&this._findCommand(t[0]))return this._dispatchSubcommand(t[0],t.slice(1),n);if(this._getHelpCommand()&&t[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(t[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(n),this._dispatchSubcommand(this._defaultCommandName,t,n);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(i.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let s=()=>{i.unknown.length>0&&this.unknownOption(i.unknown[0])},r=`command:${this.name()}`;if(this._actionHandler){s(),this._processArguments();let o;return o=this._chainOrCallHooks(o,"preAction"),o=this._chainOrCall(o,()=>this._actionHandler(this.processedArgs)),this.parent&&(o=this._chainOrCall(o,()=>{this.parent.emit(r,t,n)})),o=this._chainOrCallHooks(o,"postAction"),o}if(this.parent&&this.parent.listenerCount(r))s(),this._processArguments(),this.parent.emit(r,t,n);else if(t.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",t,n);this.listenerCount("command:*")?this.emit("command:*",t,n):this.commands.length?this.unknownCommand():(s(),this._processArguments())}else this.commands.length?(s(),this.help({error:!0})):(s(),this._processArguments())}_findCommand(t){if(t)return this.commands.find(n=>n._name===t||n._aliases.includes(t))}_findOption(t){return this.options.find(n=>n.is(t))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(t=>{t.options.forEach(n=>{n.mandatory&&t.getOptionValue(n.attributeName())===void 0&&t.missingMandatoryOptionValue(n)})})}_checkForConflictingLocalOptions(){let t=this.options.filter(i=>{let s=i.attributeName();return this.getOptionValue(s)===void 0?!1:this.getOptionValueSource(s)!=="default"});t.filter(i=>i.conflictsWith.length>0).forEach(i=>{let s=t.find(r=>i.conflictsWith.includes(r.attributeName()));s&&this._conflictingOption(i,s)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(t=>{t._checkForConflictingLocalOptions()})}parseOptions(t){let n=[],i=[],s=n,r=t.slice();function o(d){return d.length>1&&d[0]==="-"}let a=null;for(;r.length;){let d=r.shift();if(d==="--"){s===i&&s.push(d),s.push(...r);break}if(a&&!o(d)){this.emit(`option:${a.name()}`,d);continue}if(a=null,o(d)){let m=this._findOption(d);if(m){if(m.required){let f=r.shift();f===void 0&&this.optionMissingArgument(m),this.emit(`option:${m.name()}`,f)}else if(m.optional){let f=null;r.length>0&&!o(r[0])&&(f=r.shift()),this.emit(`option:${m.name()}`,f)}else this.emit(`option:${m.name()}`);a=m.variadic?m:null;continue}}if(d.length>2&&d[0]==="-"&&d[1]!=="-"){let m=this._findOption(`-${d[1]}`);if(m){m.required||m.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${m.name()}`,d.slice(2)):(this.emit(`option:${m.name()}`),r.unshift(`-${d.slice(2)}`));continue}}if(/^--[^=]+=/.test(d)){let m=d.indexOf("="),f=this._findOption(d.slice(0,m));if(f&&(f.required||f.optional)){this.emit(`option:${f.name()}`,d.slice(m+1));continue}}if(o(d)&&(s=i),(this._enablePositionalOptions||this._passThroughOptions)&&n.length===0&&i.length===0){if(this._findCommand(d)){n.push(d),r.length>0&&i.push(...r);break}else if(this._getHelpCommand()&&d===this._getHelpCommand().name()){n.push(d),r.length>0&&n.push(...r);break}else if(this._defaultCommandName){i.push(d),r.length>0&&i.push(...r);break}}if(this._passThroughOptions){s.push(d),r.length>0&&s.push(...r);break}s.push(d)}return{operands:n,unknown:i}}opts(){if(this._storeOptionsAsProperties){let t={},n=this.options.length;for(let i=0;i<n;i++){let s=this.options[i].attributeName();t[s]=s===this._versionOptionName?this._version:this[s]}return t}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((t,n)=>Object.assign(t,n.opts()),{})}error(t,n){this._outputConfiguration.outputError(`${t}
|
|
22
22
|
`,this._outputConfiguration.writeErr),typeof this._showHelpAfterError=="string"?this._outputConfiguration.writeErr(`${this._showHelpAfterError}
|
|
23
23
|
`):this._showHelpAfterError&&(this._outputConfiguration.writeErr(`
|
|
24
|
-
`),this.outputHelp({error:!0}));let i=n||{},s=i.exitCode||1,r=i.code||"commander.error";this._exit(s,r,t)}_parseOptionsEnv(){this.options.forEach(t=>{if(t.envVar&&t.envVar in se.env){let n=t.attributeName();(this.getOptionValue(n)===void 0||["default","config","env"].includes(this.getOptionValueSource(n)))&&(t.required||t.optional?this.emit(`optionEnv:${t.name()}`,se.env[t.envVar]):this.emit(`optionEnv:${t.name()}`))}})}_parseOptionsImplied(){let t=new Jl(this.options),n=i=>this.getOptionValue(i)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(i));this.options.filter(i=>i.implied!==void 0&&n(i.attributeName())&&t.valueFromOption(this.getOptionValue(i.attributeName()),i)).forEach(i=>{Object.keys(i.implied).filter(s=>!n(s)).forEach(s=>{this.setOptionValueWithSource(s,i.implied[s],"implied")})})}missingArgument(t){let n=`error: missing required argument '${t}'`;this.error(n,{code:"commander.missingArgument"})}optionMissingArgument(t){let n=`error: option '${t.flags}' argument missing`;this.error(n,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(t){let n=`error: required option '${t.flags}' not specified`;this.error(n,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(t,n){let i=o=>{let a=o.attributeName(),d=this.getOptionValue(a),m=this.options.find(p=>p.negate&&a===p.attributeName()),f=this.options.find(p=>!p.negate&&a===p.attributeName());return m&&(m.presetArg===void 0&&d===!1||m.presetArg!==void 0&&d===m.presetArg)?m:f||o},s=o=>{let a=i(o),d=a.attributeName();return this.getOptionValueSource(d)==="env"?`environment variable '${a.envVar}'`:`option '${a.flags}'`},r=`error: ${s(t)} cannot be used with ${s(n)}`;this.error(r,{code:"commander.conflictingOption"})}unknownOption(t){if(this._allowUnknownOption)return;let n="";if(t.startsWith("--")&&this._showSuggestionAfterError){let s=[],r=this;do{let o=r.createHelp().visibleOptions(r).filter(a=>a.long).map(a=>a.long);s=s.concat(o),r=r.parent}while(r&&!r._enablePositionalOptions);n=
|
|
24
|
+
`),this.outputHelp({error:!0}));let i=n||{},s=i.exitCode||1,r=i.code||"commander.error";this._exit(s,r,t)}_parseOptionsEnv(){this.options.forEach(t=>{if(t.envVar&&t.envVar in se.env){let n=t.attributeName();(this.getOptionValue(n)===void 0||["default","config","env"].includes(this.getOptionValueSource(n)))&&(t.required||t.optional?this.emit(`optionEnv:${t.name()}`,se.env[t.envVar]):this.emit(`optionEnv:${t.name()}`))}})}_parseOptionsImplied(){let t=new Jl(this.options),n=i=>this.getOptionValue(i)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(i));this.options.filter(i=>i.implied!==void 0&&n(i.attributeName())&&t.valueFromOption(this.getOptionValue(i.attributeName()),i)).forEach(i=>{Object.keys(i.implied).filter(s=>!n(s)).forEach(s=>{this.setOptionValueWithSource(s,i.implied[s],"implied")})})}missingArgument(t){let n=`error: missing required argument '${t}'`;this.error(n,{code:"commander.missingArgument"})}optionMissingArgument(t){let n=`error: option '${t.flags}' argument missing`;this.error(n,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(t){let n=`error: required option '${t.flags}' not specified`;this.error(n,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(t,n){let i=o=>{let a=o.attributeName(),d=this.getOptionValue(a),m=this.options.find(p=>p.negate&&a===p.attributeName()),f=this.options.find(p=>!p.negate&&a===p.attributeName());return m&&(m.presetArg===void 0&&d===!1||m.presetArg!==void 0&&d===m.presetArg)?m:f||o},s=o=>{let a=i(o),d=a.attributeName();return this.getOptionValueSource(d)==="env"?`environment variable '${a.envVar}'`:`option '${a.flags}'`},r=`error: ${s(t)} cannot be used with ${s(n)}`;this.error(r,{code:"commander.conflictingOption"})}unknownOption(t){if(this._allowUnknownOption)return;let n="";if(t.startsWith("--")&&this._showSuggestionAfterError){let s=[],r=this;do{let o=r.createHelp().visibleOptions(r).filter(a=>a.long).map(a=>a.long);s=s.concat(o),r=r.parent}while(r&&!r._enablePositionalOptions);n=lo(t,s)}let i=`error: unknown option '${t}'${n}`;this.error(i,{code:"commander.unknownOption"})}_excessArguments(t){if(this._allowExcessArguments)return;let n=this.registeredArguments.length,i=n===1?"":"s",r=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${n} argument${i} but got ${t.length}.`;this.error(r,{code:"commander.excessArguments"})}unknownCommand(){let t=this.args[0],n="";if(this._showSuggestionAfterError){let s=[];this.createHelp().visibleCommands(this).forEach(r=>{s.push(r.name()),r.alias()&&s.push(r.alias())}),n=lo(t,s)}let i=`error: unknown command '${t}'${n}`;this.error(i,{code:"commander.unknownCommand"})}version(t,n,i){if(t===void 0)return this._version;this._version=t,n=n||"-V, --version",i=i||"output the version number";let s=this.createOption(n,i);return this._versionOptionName=s.attributeName(),this._registerOption(s),this.on("option:"+s.name(),()=>{this._outputConfiguration.writeOut(`${t}
|
|
25
25
|
`),this._exit(0,"commander.version",t)}),this}description(t,n){return t===void 0&&n===void 0?this._description:(this._description=t,n&&(this._argsDescription=n),this)}summary(t){return t===void 0?this._summary:(this._summary=t,this)}alias(t){if(t===void 0)return this._aliases[0];let n=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(n=this.commands[this.commands.length-1]),t===n._name)throw new Error("Command alias can't be the same as its name");let i=this.parent?._findCommand(t);if(i){let s=[i.name()].concat(i.aliases()).join("|");throw new Error(`cannot add alias '${t}' to command '${this.name()}' as already have command '${s}'`)}return n._aliases.push(t),this}aliases(t){return t===void 0?this._aliases:(t.forEach(n=>this.alias(n)),this)}usage(t){if(t===void 0){if(this._usage)return this._usage;let n=this.registeredArguments.map(i=>Vl(i));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?n:[]).join(" ")}return this._usage=t,this}name(t){return t===void 0?this._name:(this._name=t,this)}nameFromFilename(t){return this._name=jt.basename(t,jt.extname(t)),this}executableDir(t){return t===void 0?this._executableDir:(this._executableDir=t,this)}helpInformation(t){let n=this.createHelp(),i=this._getOutputContext(t);n.prepareContext({error:i.error,helpWidth:i.helpWidth,outputHasColors:i.hasColors});let s=n.formatHelp(this,n);return i.hasColors?s:this._outputConfiguration.stripColor(s)}_getOutputContext(t){t=t||{};let n=!!t.error,i,s,r;return n?(i=a=>this._outputConfiguration.writeErr(a),s=this._outputConfiguration.getErrHasColors(),r=this._outputConfiguration.getErrHelpWidth()):(i=a=>this._outputConfiguration.writeOut(a),s=this._outputConfiguration.getOutHasColors(),r=this._outputConfiguration.getOutHelpWidth()),{error:n,write:a=>(s||(a=this._outputConfiguration.stripColor(a)),i(a)),hasColors:s,helpWidth:r}}outputHelp(t){let n;typeof t=="function"&&(n=t,t=void 0);let i=this._getOutputContext(t),s={error:i.error,write:i.write,command:this};this._getCommandAndAncestors().reverse().forEach(o=>o.emit("beforeAllHelp",s)),this.emit("beforeHelp",s);let r=this.helpInformation({error:i.error});if(n&&(r=n(r),typeof r!="string"&&!Buffer.isBuffer(r)))throw new Error("outputHelp callback must return a string or a Buffer");i.write(r),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit("afterHelp",s),this._getCommandAndAncestors().forEach(o=>o.emit("afterAllHelp",s))}helpOption(t,n){return typeof t=="boolean"?(t?this._helpOption=this._helpOption??void 0:this._helpOption=null,this):(t=t??"-h, --help",n=n??"display help for command",this._helpOption=this.createOption(t,n),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(t){return this._helpOption=t,this}help(t){this.outputHelp(t);let n=Number(se.exitCode??0);n===0&&t&&typeof t!="function"&&t.error&&(n=1),this._exit(n,"commander.help","(outputHelp)")}addHelpText(t,n){let i=["beforeAll","before","after","afterAll"];if(!i.includes(t))throw new Error(`Unexpected value for position to addHelpText.
|
|
26
26
|
Expecting one of '${i.join("', '")}'`);let s=`${t}Help`;return this.on(s,r=>{let o;typeof n=="function"?o=n({error:r.error,command:r.command}):o=n,o&&r.write(`${o}
|
|
27
|
-
`)}),this}_outputHelpIfRequested(t){let n=this._getHelpOption();n&&t.find(s=>n.is(s))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function
|
|
28
|
-
`).ok:!1},delete(e){process.platform==="darwin"?Gt("security",["delete-generic-password","-s",
|
|
27
|
+
`)}),this}_outputHelpIfRequested(t){let n=this._getHelpOption();n&&t.find(s=>n.is(s))&&(this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)"))}};function co(e){return e.map(t=>{if(!t.startsWith("--inspect"))return t;let n,i="127.0.0.1",s="9229",r;return(r=t.match(/^(--inspect(-brk)?)$/))!==null?n=r[1]:(r=t.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null?(n=r[1],/^\d+$/.test(r[3])?s=r[3]:i=r[3]):(r=t.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(n=r[1],i=r[3],s=r[4]),n&&s!=="0"?`${n}=${i}:${parseInt(s)+1}`:t})}function ks(){if(se.env.NO_COLOR||se.env.FORCE_COLOR==="0"||se.env.FORCE_COLOR==="false")return!1;if(se.env.FORCE_COLOR||se.env.CLICOLOR_FORCE!==void 0)return!0}xs.Command=_s;xs.useColor=ks});var ho=xt(nt=>{var{Argument:mo}=li(),{Command:js}=uo(),{CommanderError:Bl,InvalidArgumentError:fo}=An(),{Help:Gl}=hs(),{Option:po}=ws();nt.program=new js;nt.createCommand=e=>new js(e);nt.createOption=(e,t)=>new po(e,t);nt.createArgument=(e,t)=>new mo(e,t);nt.Command=js;nt.Option=po;nt.Argument=mo;nt.Help=Gl;nt.CommanderError=Bl;nt.InvalidArgumentError=fo;nt.InvalidOptionArgumentError=fo});var Dt,ui=$e(()=>{Dt={mailProductName:"Mailzero",domaniProductName:"Domani",mailProductHost:"mailzero.run"}});var L=xt((dp,Ss)=>{var fi=process||{},bo=fi.argv||[],mi=fi.env||{},zl=!(mi.NO_COLOR||bo.includes("--no-color"))&&(!!mi.FORCE_COLOR||bo.includes("--color")||fi.platform==="win32"||(fi.stdout||{}).isTTY&&mi.TERM!=="dumb"||!!mi.CI),Yl=(e,t,n=e)=>i=>{let s=""+i,r=s.indexOf(t,e.length);return~r?e+Xl(s,t,n,r)+t:e+s+t},Xl=(e,t,n,i)=>{let s="",r=0;do s+=e.substring(r,i)+n,r=i+t.length,i=e.indexOf(t,r);while(~i);return s+e.substring(r)},wo=(e=zl)=>{let t=e?Yl:()=>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")}};Ss.exports=wo();Ss.exports.createColors=wo});var yn,Tn,En=$e(()=>{"use strict";yn="domani.run",Tn=`https://${yn}`});function Gt(e,t,n){try{let i=(0,$o.spawnSync)(e,t,{encoding:"utf-8",input:n,timeout:3e3,stdio:["pipe","pipe","ignore"]});return{ok:i.status===0,stdout:(i.stdout||"").trim()}}catch{return{ok:!1,stdout:""}}}function vo(){return pi.available()}function _o(e,t={}){if(!t.refresh&&Pn.has(e))return Pn.get(e)??void 0;let n=pi.get(e);return Pn.set(e,n??null),n}function ko(e,t){let n=pi.set(e,t);return n&&Pn.set(e,t),n}function hi(e){pi.delete(e),Pn.set(e,null)}var $o,bn,Zl,pi,Pn,Os=$e(()=>{"use strict";$o=require("child_process"),bn="domani-cli";Zl={available(){return process.platform==="darwin"?!0:process.platform==="linux"?Gt("secret-tool",["--help"]).ok:!1},get(e){if(process.platform==="darwin"){let t=Gt("security",["find-generic-password","-s",bn,"-a",e,"-w"]);return t.ok&&t.stdout?t.stdout:void 0}if(process.platform==="linux"){let t=Gt("secret-tool",["lookup","service",bn,"account",e]);return t.ok&&t.stdout?t.stdout:void 0}},set(e,t){return process.platform==="darwin"?Gt("security",["add-generic-password","-U","-s",bn,"-a",e,"-w",t]).ok:process.platform==="linux"?Gt("secret-tool",["store",`--label=domani CLI token (${e})`,"service",bn,"account",e],t+`
|
|
28
|
+
`).ok:!1},delete(e){process.platform==="darwin"?Gt("security",["delete-generic-password","-s",bn,"-a",e]):process.platform==="linux"&&Gt("secret-tool",["clear","service",bn,"account",e])}},pi=Zl,Pn=new Map});function Dn(){return process.env.DOMANI_CONFIG_DIR||Nn.default.join(xo.default.homedir(),".domani")}function jo(){return Nn.default.join(Dn(),"config.json")}function So(e){Cs=e}function yi(e){return ec.test(e)}function Ke(){let e;try{e=JSON.parse(Kt.default.readFileSync(jo(),"utf-8"))}catch{return{}}if(!e||typeof e!="object")return{};let{token:t,email:n,token_in_keychain:i,...s}=e,r={...s,accounts:{...e.accounts??{}}};return!e.accounts&&(t||n||i)&&(r.accounts={[Rs]:{email:n,api_url:e.api_url,...t?{token:t}:{},...i?{token_in_keychain:i}:{}}},r.active_account=Rs),r}function As(e){Kt.default.mkdirSync(Dn(),{recursive:!0,mode:448}),Kt.default.writeFileSync(jo(),JSON.stringify(e,null,2),{mode:384})}function Oo(e){Is=e}function Un(){return process.env.DOMANI_API_KEY?{source:"api_key_env"}:Nt()}function Nt(){if(Is)return{name:Is,source:"flag"};if(process.env.DOMANI_ACCOUNT)return{name:process.env.DOMANI_ACCOUNT,source:"env"};let e=Ke().active_account;return e?{name:e,source:"active"}:{source:"none"}}function wn(){return Nt().name??Rs}function Co(e){return Ke().accounts?.[e]}function ot(){let e=Ke().accounts??{};return Object.keys(e).sort().map(t=>({name:t,...e[t]}))}function Ts(e,t={}){let n=Co(e);if(n){if(n.token)return n.token;if(n.token_in_keychain)return _o(e,{refresh:t.refreshKeychain})}}function bi(e,t){let n=Ke(),i=vo()&&ko(e,t.token)?{email:t.email,api_url:t.api_url,token_in_keychain:!0}:{email:t.email,api_url:t.api_url,token:t.token};n.accounts={...n.accounts??{},[e]:i},(!n.active_account||!n.accounts[n.active_account])&&(n.active_account=e),As(n)}function Ro(e){let t=Ke(),n=t.accounts?.[e];if(n)return n.token_in_keychain&&hi(e),delete t.accounts[e],t.active_account===e&&delete t.active_account,As(t),n}function Io(e){let t=Ke();return t.accounts?.[e]?(t.active_account=e,As(t),!0):!1}function St(){let e=Un();if(e.source==="api_key_env")return"DOMANI_API_KEY";if(!e.name)return;let t=Co(e.name)?.email;return ot().length<=1&&e.source==="active"?t:t?`${e.name} (${t})`:e.name}function ze(){if(Cs)return Cs;let e=Ke(),{name:t}=Nt();return t&&e.accounts?.[t]?.api_url||e.api_url||Tn}function at(e={}){if(process.env.DOMANI_API_KEY)return process.env.DOMANI_API_KEY;let{name:t}=Nt();return t?Ts(t,e):void 0}function tc(){try{let e=Kt.default.readFileSync(Nn.default.join(Dn(),"version-check.json"),"utf-8");return JSON.parse(e)}catch{return null}}function nc(e){try{Kt.default.mkdirSync(Dn(),{recursive:!0,mode:448}),Kt.default.writeFileSync(Nn.default.join(Dn(),"version-check.json"),JSON.stringify(e),{mode:384})}catch{}}function gi(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]||0)>(i[s]||0))return 1;if((n[s]||0)<(i[s]||0))return-1}return 0}async function Ao(){let e=tc();if(e&&Date.now()-e.checkedAt<Ql)return gi(e.version,Ie)>0?{update:e.version,forced:gi(Ie,e.min)<0}:null;try{let t=ze(),n=await fetch(`${t}/api/cli/version`,{signal:AbortSignal.timeout(3e3)});if(!n.ok)return null;let i=await n.json();if(nc({version:i.version,min:i.min,checkedAt:Date.now()}),gi(i.version,Ie)>0)return{update:i.version,forced:gi(Ie,i.min)<0}}catch{}return null}var Kt,Nn,xo,Cs,Ql,Rs,ec,Is,Es,Ie,De=$e(()=>{"use strict";Kt=D(require("fs"),1),Nn=D(require("path"),1),xo=D(require("os"),1);En();Os();Ql=1440*60*1e3,Rs="default",ec=/^[a-z0-9][a-z0-9._-]{0,62}$/i;Es=process.stdout.isTTY??!1,Ie="0.4.93"});var Ds=xt((pp,To)=>{"use strict";var Ps={to(e,t){return t?`\x1B[${t+1};${e+1}H`:`\x1B[${e+1}G`},move(e,t){let n="";return e<0?n+=`\x1B[${-e}D`:e>0&&(n+=`\x1B[${e}C`),t<0?n+=`\x1B[${-t}A`:t>0&&(n+=`\x1B[${t}B`),n},up:(e=1)=>`\x1B[${e}A`,down:(e=1)=>`\x1B[${e}B`,forward:(e=1)=>`\x1B[${e}C`,backward:(e=1)=>`\x1B[${e}D`,nextLine:(e=1)=>"\x1B[E".repeat(e),prevLine:(e=1)=>"\x1B[F".repeat(e),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},ic={up:(e=1)=>"\x1B[S".repeat(e),down:(e=1)=>"\x1B[T".repeat(e)},sc={screen:"\x1B[2J",up:(e=1)=>"\x1B[1J".repeat(e),down:(e=1)=>"\x1B[J".repeat(e),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(e){let t="";for(let n=0;n<e;n++)t+=this.line+(n<e-1?Ps.up():"");return e&&(t+=Ps.left),t}};To.exports={cursor:Ps,scroll:ic,erase:sc,beep:"\x07"}});function Ot(e,t,n){if(!n.some(o=>!o.disabled))return e;let i=e+t,s=Math.max(n.length-1,0),r=i<0?s:i>s?0:i;return n[r].disabled?Ot(r,t<0?-1:1,n):r}function Fs(e,t,n){return String(e).normalize().replaceAll(`\r
|
|
29
29
|
`,`
|
|
30
30
|
`).split(`
|
|
31
31
|
`).map(i=>gc(i,t,n)).join(`
|
|
32
|
-
`)}function
|
|
32
|
+
`)}function Lo(e){if(e.aliases!==void 0){let t=e.aliases;for(let n in t){if(!Object.hasOwn(t,n))continue;let i=t[n];fe.actions.has(i)&&(fe.aliases.has(n)||fe.aliases.set(n,i))}}if(e.messages!==void 0){let t=e.messages;t.cancel!==void 0&&(fe.messages.cancel=t.cancel),t.error!==void 0&&(fe.messages.error=t.error)}e.withGuide!==void 0&&(fe.withGuide=e.withGuide!==!1)}function Hs(e,t){if(typeof e=="string")return fe.aliases.get(e)===t;for(let n of e)if(n!==void 0&&Hs(n,t))return!0;return!1}function bc(e,t){if(e===t)return;let n=e.split(`
|
|
33
33
|
`),i=t.split(`
|
|
34
|
-
`),s=Math.max(n.length,i.length),r=[];for(let o=0;o<s;o++)n[o]!==i[o]&&r.push(o);return{lines:r,numLinesBefore:n.length,numLinesAfter:i.length,numLines:s}}function ae(e){return e===
|
|
34
|
+
`),s=Math.max(n.length,i.length),r=[];for(let o=0;o<s;o++)n[o]!==i[o]&&r.push(o);return{lines:r,numLinesBefore:n.length,numLinesAfter:i.length,numLines:s}}function ae(e){return e===Ls}function _i(e,t){let n=e;n.isTTY&&n.setRawMode(t)}function Vo({input:e=zt.stdin,output:t=zt.stdout,overwrite:n=!0,hideCursor:i=!0}={}){let s=Mt.createInterface({input:e,output:t,prompt:"",tabSize:1});Mt.emitKeypressEvents(e,s),e instanceof qs.ReadStream&&e.isTTY&&e.setRawMode(!0);let r=(o,{name:a,sequence:d})=>{let m=String(o);if(Hs([m,a,d],"cancel")){i&&t.write(Ne.cursor.show),process.exit(0);return}if(!n)return;Mt.moveCursor(t,a==="return"?0:-1,a==="return"?-1:0,()=>{Mt.clearLine(t,1,()=>{e.once("keypress",r)})})};return i&&t.write(Ne.cursor.hide),e.once("keypress",r),()=>{e.off("keypress",r),i&&t.write(Ne.cursor.show),e instanceof qs.ReadStream&&e.isTTY&&!wc&&e.setRawMode(!1),s.terminal=!1,s.close()}}function ht(e,t,n,i=n){let s=Yt(e??zt.stdout);return Fs(t,s-n.length,{hard:!0,trim:!1}).split(`
|
|
35
35
|
`).map((r,o)=>`${o===0?i:n}${r}`).join(`
|
|
36
|
-
`)}function $c(e,t){if(e===void 0||t.length===0)return 0;let n=t.findIndex(i=>i.value===e);return n!==-1?n:0}function vc(e,t){return(t.label??String(t.value)).toLowerCase().includes(e.toLowerCase())}function _c(e,t){if(t)return e?t:t[0]}var Ut,zt,
|
|
37
|
-
`),f=m[Symbol.iterator](),p=f.next(),
|
|
38
|
-
`?(r&&(i+=
|
|
39
|
-
`&&(s&&
|
|
40
|
-
`),_i(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let t=
|
|
41
|
-
`).length-1;this.output.write(Ne.cursor.move(-999,t*-1))}render(){let t=
|
|
36
|
+
`)}function $c(e,t){if(e===void 0||t.length===0)return 0;let n=t.findIndex(i=>i.value===e);return n!==-1?n:0}function vc(e,t){return(t.label??String(t.value)).toLowerCase().includes(e.toLowerCase())}function _c(e,t){if(t)return e?t:t[0]}var Ut,zt,Mt,No,Ne,qs,rc,oc,ac,Ns,wi,$i,Us,vi,dc,lc,Uo,cc,Mn,Ri,Mo,uc,Vs,qo,mc,Fo,Ws,Eo,fc,Po,Do,pc,Ms,hc,gc,yc,fe,wc,Ls,Yt,Js,pt,qn,ki,xi,ji,Wo,Si,Oi,Ci,Bs=$e(()=>{Ut=D(L(),1),zt=require("node:process"),Mt=D(require("node:readline"),1),No=D(require("node:readline"),1),Ne=D(Ds(),1),qs=require("node:tty");rc=e=>e===161||e===164||e===167||e===168||e===170||e===173||e===174||e>=176&&e<=180||e>=182&&e<=186||e>=188&&e<=191||e===198||e===208||e===215||e===216||e>=222&&e<=225||e===230||e>=232&&e<=234||e===236||e===237||e===240||e===242||e===243||e>=247&&e<=250||e===252||e===254||e===257||e===273||e===275||e===283||e===294||e===295||e===299||e>=305&&e<=307||e===312||e>=319&&e<=322||e===324||e>=328&&e<=331||e===333||e===338||e===339||e===358||e===359||e===363||e===462||e===464||e===466||e===468||e===470||e===472||e===474||e===476||e===593||e===609||e===708||e===711||e>=713&&e<=715||e===717||e===720||e>=728&&e<=731||e===733||e===735||e>=768&&e<=879||e>=913&&e<=929||e>=931&&e<=937||e>=945&&e<=961||e>=963&&e<=969||e===1025||e>=1040&&e<=1103||e===1105||e===8208||e>=8211&&e<=8214||e===8216||e===8217||e===8220||e===8221||e>=8224&&e<=8226||e>=8228&&e<=8231||e===8240||e===8242||e===8243||e===8245||e===8251||e===8254||e===8308||e===8319||e>=8321&&e<=8324||e===8364||e===8451||e===8453||e===8457||e===8467||e===8470||e===8481||e===8482||e===8486||e===8491||e===8531||e===8532||e>=8539&&e<=8542||e>=8544&&e<=8555||e>=8560&&e<=8569||e===8585||e>=8592&&e<=8601||e===8632||e===8633||e===8658||e===8660||e===8679||e===8704||e===8706||e===8707||e===8711||e===8712||e===8715||e===8719||e===8721||e===8725||e===8730||e>=8733&&e<=8736||e===8739||e===8741||e>=8743&&e<=8748||e===8750||e>=8756&&e<=8759||e===8764||e===8765||e===8776||e===8780||e===8786||e===8800||e===8801||e>=8804&&e<=8807||e===8810||e===8811||e===8814||e===8815||e===8834||e===8835||e===8838||e===8839||e===8853||e===8857||e===8869||e===8895||e===8978||e>=9312&&e<=9449||e>=9451&&e<=9547||e>=9552&&e<=9587||e>=9600&&e<=9615||e>=9618&&e<=9621||e===9632||e===9633||e>=9635&&e<=9641||e===9650||e===9651||e===9654||e===9655||e===9660||e===9661||e===9664||e===9665||e>=9670&&e<=9672||e===9675||e>=9678&&e<=9681||e>=9698&&e<=9701||e===9711||e===9733||e===9734||e===9737||e===9742||e===9743||e===9756||e===9758||e===9792||e===9794||e===9824||e===9825||e>=9827&&e<=9829||e>=9831&&e<=9834||e===9836||e===9837||e===9839||e===9886||e===9887||e===9919||e>=9926&&e<=9933||e>=9935&&e<=9939||e>=9941&&e<=9953||e===9955||e===9960||e===9961||e>=9963&&e<=9969||e===9972||e>=9974&&e<=9977||e===9979||e===9980||e===9982||e===9983||e===10045||e>=10102&&e<=10111||e>=11094&&e<=11097||e>=12872&&e<=12879||e>=57344&&e<=63743||e>=65024&&e<=65039||e===65533||e>=127232&&e<=127242||e>=127248&&e<=127277||e>=127280&&e<=127337||e>=127344&&e<=127373||e===127375||e===127376||e>=127387&&e<=127404||e>=917760&&e<=917999||e>=983040&&e<=1048573||e>=1048576&&e<=1114109,oc=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,ac=e=>e>=4352&&e<=4447||e===8986||e===8987||e===9001||e===9002||e>=9193&&e<=9196||e===9200||e===9203||e===9725||e===9726||e===9748||e===9749||e>=9800&&e<=9811||e===9855||e===9875||e===9889||e===9898||e===9899||e===9917||e===9918||e===9924||e===9925||e===9934||e===9940||e===9962||e===9970||e===9971||e===9973||e===9978||e===9981||e===9989||e===9994||e===9995||e===10024||e===10060||e===10062||e>=10067&&e<=10069||e===10071||e>=10133&&e<=10135||e===10160||e===10175||e===11035||e===11036||e===11088||e===11093||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=94176&&e<=94180||e===94192||e===94193||e>=94208&&e<=100343||e>=100352&&e<=101589||e>=101632&&e<=101640||e>=110576&&e<=110579||e>=110581&&e<=110587||e===110589||e===110590||e>=110592&&e<=110882||e===110898||e>=110928&&e<=110930||e===110933||e>=110948&&e<=110951||e>=110960&&e<=111355||e===126980||e===127183||e===127374||e>=127377&&e<=127386||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e===127568||e===127569||e>=127584&&e<=127589||e>=127744&&e<=127776||e>=127789&&e<=127797||e>=127799&&e<=127868||e>=127870&&e<=127891||e>=127904&&e<=127946||e>=127951&&e<=127955||e>=127968&&e<=127984||e===127988||e>=127992&&e<=128062||e===128064||e>=128066&&e<=128252||e>=128255&&e<=128317||e>=128331&&e<=128334||e>=128336&&e<=128359||e===128378||e===128405||e===128406||e===128420||e>=128507&&e<=128591||e>=128640&&e<=128709||e===128716||e>=128720&&e<=128722||e>=128725&&e<=128727||e>=128732&&e<=128735||e===128747||e===128748||e>=128756&&e<=128764||e>=128992&&e<=129003||e===129008||e>=129292&&e<=129338||e>=129340&&e<=129349||e>=129351&&e<=129535||e>=129648&&e<=129660||e>=129664&&e<=129672||e>=129680&&e<=129725||e>=129727&&e<=129733||e>=129742&&e<=129755||e>=129760&&e<=129768||e>=129776&&e<=129784||e>=131072&&e<=196605||e>=196608&&e<=262141,Ns=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/y,wi=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,$i=/\t{1,1000}/y,Us=new RegExp("[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*","yu"),vi=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,dc=new RegExp("\\p{M}+","gu"),lc={limit:1/0,ellipsis:""},Uo=(e,t={},n={})=>{let i=t.limit??1/0,s=t.ellipsis??"",r=t?.ellipsisWidth??(s?Uo(s,lc,n).width:0),o=n.ansiWidth??0,a=n.controlWidth??0,d=n.tabWidth??8,m=n.ambiguousWidth??1,f=n.emojiWidth??2,p=n.fullWidthWidth??2,w=n.regularWidth??1,_=n.wideWidth??2,v=0,g=0,x=e.length,O=0,S=!1,I=x,q=Math.max(0,i-r),F=0,Y=0,U=0,M=0;e:for(;;){if(Y>F||g>=x&&g>v){let ce=e.slice(F,Y)||e.slice(v,g);O=0;for(let le of ce.replaceAll(dc,"")){let P=le.codePointAt(0)||0;if(oc(P)?M=p:ac(P)?M=_:m!==w&&rc(P)?M=m:M=w,U+M>q&&(I=Math.min(I,Math.max(F,v)+O)),U+M>i){S=!0;break e}O+=le.length,U+=M}F=Y=0}if(g>=x)break;if(vi.lastIndex=g,vi.test(e)){if(O=vi.lastIndex-g,M=O*w,U+M>q&&(I=Math.min(I,g+Math.floor((q-U)/w))),U+M>i){S=!0;break}U+=M,F=v,Y=g,g=v=vi.lastIndex;continue}if(Ns.lastIndex=g,Ns.test(e)){if(U+o>q&&(I=Math.min(I,g)),U+o>i){S=!0;break}U+=o,F=v,Y=g,g=v=Ns.lastIndex;continue}if(wi.lastIndex=g,wi.test(e)){if(O=wi.lastIndex-g,M=O*a,U+M>q&&(I=Math.min(I,g+Math.floor((q-U)/a))),U+M>i){S=!0;break}U+=M,F=v,Y=g,g=v=wi.lastIndex;continue}if($i.lastIndex=g,$i.test(e)){if(O=$i.lastIndex-g,M=O*d,U+M>q&&(I=Math.min(I,g+Math.floor((q-U)/d))),U+M>i){S=!0;break}U+=M,F=v,Y=g,g=v=$i.lastIndex;continue}if(Us.lastIndex=g,Us.test(e)){if(U+f>q&&(I=Math.min(I,g)),U+f>i){S=!0;break}U+=f,F=v,Y=g,g=v=Us.lastIndex;continue}g+=1}return{width:S?q:U,index:S?I:x,truncated:S,ellipsed:S&&i>=r}},cc={limit:1/0,ellipsis:"",ellipsisWidth:0},Mn=(e,t={})=>Uo(e,cc,t).width,Ri="\x1B",Mo="\x9B",uc=39,Vs="\x07",qo="[",mc="]",Fo="m",Ws=`${mc}8;;`,Eo=new RegExp(`(?:\\${qo}(?<code>\\d+)m|\\${Ws}(?<uri>.*)${Vs})`,"y"),fc=e=>{if(e>=30&&e<=37||e>=90&&e<=97)return 39;if(e>=40&&e<=47||e>=100&&e<=107)return 49;if(e===1||e===2)return 22;if(e===3)return 23;if(e===4)return 24;if(e===7)return 27;if(e===8)return 28;if(e===9)return 29;if(e===0)return 0},Po=e=>`${Ri}${qo}${e}${Fo}`,Do=e=>`${Ri}${Ws}${e}${Vs}`,pc=e=>e.map(t=>Mn(t)),Ms=(e,t,n)=>{let i=t[Symbol.iterator](),s=!1,r=!1,o=e.at(-1),a=o===void 0?0:Mn(o),d=i.next(),m=i.next(),f=0;for(;!d.done;){let p=d.value,w=Mn(p);a+w<=n?e[e.length-1]+=p:(e.push(p),a=0),(p===Ri||p===Mo)&&(s=!0,r=t.startsWith(Ws,f+1)),s?r?p===Vs&&(s=!1,r=!1):p===Fo&&(s=!1):(a+=w,a===n&&!m.done&&(e.push(""),a=0)),d=m,m=i.next(),f+=p.length}o=e.at(-1),!a&&o!==void 0&&o.length>0&&e.length>1&&(e[e.length-2]+=e.pop())},hc=e=>{let t=e.split(" "),n=t.length;for(;n>0&&!(Mn(t[n-1])>0);)n--;return n===t.length?e:t.slice(0,n).join(" ")+t.slice(n).join("")},gc=(e,t,n={})=>{if(n.trim!==!1&&e.trim()==="")return"";let i="",s,r,o=e.split(" "),a=pc(o),d=[""];for(let[v,g]of o.entries()){n.trim!==!1&&(d[d.length-1]=(d.at(-1)??"").trimStart());let x=Mn(d.at(-1)??"");if(v!==0&&(x>=t&&(n.wordWrap===!1||n.trim===!1)&&(d.push(""),x=0),(x>0||n.trim===!1)&&(d[d.length-1]+=" ",x++)),n.hard&&a[v]>t){let O=t-x,S=1+Math.floor((a[v]-O-1)/t);Math.floor((a[v]-1)/t)<S&&d.push(""),Ms(d,g,t);continue}if(x+a[v]>t&&x>0&&a[v]>0){if(n.wordWrap===!1&&x<t){Ms(d,g,t);continue}d.push("")}if(x+a[v]>t&&n.wordWrap===!1){Ms(d,g,t);continue}d[d.length-1]+=g}n.trim!==!1&&(d=d.map(v=>hc(v)));let m=d.join(`
|
|
37
|
+
`),f=m[Symbol.iterator](),p=f.next(),w=f.next(),_=0;for(;!p.done;){let v=p.value,g=w.value;if(i+=v,v===Ri||v===Mo){Eo.lastIndex=_+1;let O=Eo.exec(m)?.groups;if(O?.code!==void 0){let S=Number.parseFloat(O.code);s=S===uc?void 0:S}else O?.uri!==void 0&&(r=O.uri.length===0?void 0:O.uri)}let x=s?fc(s):void 0;g===`
|
|
38
|
+
`?(r&&(i+=Do("")),s&&x&&(i+=Po(x))):v===`
|
|
39
|
+
`&&(s&&x&&(i+=Po(s)),r&&(i+=Do(r))),_+=v.length,p=w,w=f.next()}return i};yc=["up","down","left","right","space","enter","cancel"],fe={actions:new Set(yc),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"},withGuide:!0};wc=globalThis.process.platform.startsWith("win"),Ls=Symbol("clack:cancel");Yt=e=>"columns"in e&&typeof e.columns=="number"?e.columns:80,Js=e=>"rows"in e&&typeof e.rows=="number"?e.rows:20;pt=class{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;state="initial";error="";value;userInput="";constructor(t,n=!0){let{input:i=zt.stdin,output:s=zt.stdout,render:r,signal:o,...a}=t;this.opts=a,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=r.bind(this),this._track=n,this._abortSignal=o,this.input=i,this.output=s}unsubscribe(){this._subscribers.clear()}setSubscriber(t,n){let i=this._subscribers.get(t)??[];i.push(n),this._subscribers.set(t,i)}on(t,n){this.setSubscriber(t,{cb:n})}once(t,n){this.setSubscriber(t,{cb:n,once:!0})}emit(t,...n){let i=this._subscribers.get(t)??[],s=[];for(let r of i)r.cb(...n),r.once&&s.push(()=>i.splice(i.indexOf(r),1));for(let r of s)r()}prompt(){return new Promise(t=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),t(Ls);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}this.rl=No.default.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on("keypress",this.onKeypress),_i(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(Ne.cursor.show),this.output.off("resize",this.render),_i(this.input,!1),t(this.value)}),this.once("cancel",()=>{this.output.write(Ne.cursor.show),this.output.off("resize",this.render),_i(this.input,!1),t(Ls)})})}_isActionKey(t,n){return t===" "}_setValue(t){this.value=t,this.emit("value",this.value)}_setUserInput(t,n){this.userInput=t??"",this.emit("userInput",this.userInput),n&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:"u"}),this._setUserInput("")}onKeypress(t,n){if(this._track&&n.name!=="return"&&(n.name&&this._isActionKey(t,n)&&this.rl?.write(null,{ctrl:!0,name:"h"}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state==="error"&&(this.state="active"),n?.name&&(!this._track&&fe.aliases.has(n.name)&&this.emit("cursor",fe.aliases.get(n.name)),fe.actions.has(n.name)&&this.emit("cursor",n.name)),t&&(t.toLowerCase()==="y"||t.toLowerCase()==="n")&&this.emit("confirm",t.toLowerCase()==="y"),this.emit("key",t?.toLowerCase(),n),n?.name==="return"){if(this.opts.validate){let i=this.opts.validate(this.value);i&&(this.error=i instanceof Error?i.message:i,this.state="error",this.rl?.write(this.userInput))}this.state!=="error"&&(this.state="submit")}Hs([t,n?.name,n?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
|
|
40
|
+
`),_i(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){let t=Fs(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
41
|
+
`).length-1;this.output.write(Ne.cursor.move(-999,t*-1))}render(){let t=Fs(this._render(this)??"",process.stdout.columns,{hard:!0,trim:!1});if(t!==this._prevFrame){if(this.state==="initial")this.output.write(Ne.cursor.hide);else{let n=bc(this._prevFrame,t),i=Js(this.output);if(this.restoreCursor(),n){let s=Math.max(0,n.numLinesAfter-i),r=Math.max(0,n.numLinesBefore-i),o=n.lines.find(a=>a>=s);if(o===void 0){this._prevFrame=t;return}if(n.lines.length===1){this.output.write(Ne.cursor.move(0,o-r)),this.output.write(Ne.erase.lines(1));let a=t.split(`
|
|
42
42
|
`);this.output.write(a[o]),this._prevFrame=t,this.output.write(Ne.cursor.move(0,a.length-o-1));return}else if(n.lines.length>1){if(s<r)o=s;else{let d=o-r;d>0&&this.output.write(Ne.cursor.move(0,d))}this.output.write(Ne.erase.down());let a=t.split(`
|
|
43
43
|
`).slice(o);this.output.write(a.join(`
|
|
44
|
-
`)),this._prevFrame=t;return}}this.output.write(Ne.erase.down())}this.output.write(t),this.state==="initial"&&(this.state="active"),this._prevFrame=t}}};
|
|
44
|
+
`)),this._prevFrame=t;return}}this.output.write(Ne.erase.down())}this.output.write(t),this.state==="initial"&&(this.state="active"),this._prevFrame=t}}};qn=class extends pt{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#e=0;#n="";#i;#t;get cursor(){return this.#e}get userInputWithCursor(){if(!this.userInput)return Ut.default.inverse(Ut.default.hidden("_"));if(this._cursor>=this.userInput.length)return`${this.userInput}\u2588`;let t=this.userInput.slice(0,this._cursor),[n,...i]=this.userInput.slice(this._cursor);return`${t}${Ut.default.inverse(n)}${i.join("")}`}get options(){return typeof this.#t=="function"?this.#t():this.#t}constructor(t){super(t),this.#t=t.options;let n=this.options;this.filteredOptions=[...n],this.multiple=t.multiple===!0,this.#i=t.filter??vc;let i;if(t.initialValue&&Array.isArray(t.initialValue)?this.multiple?i=t.initialValue:i=t.initialValue.slice(0,1):!this.multiple&&this.options.length>0&&(i=[this.options[0].value]),i)for(let s of i){let r=n.findIndex(o=>o.value===s);r!==-1&&(this.toggleSelected(s),this.#e=r)}this.focusedValue=this.options[this.#e]?.value,this.on("key",(s,r)=>this.#s(s,r)),this.on("userInput",s=>this.#r(s))}_isActionKey(t,n){return t===" "||this.multiple&&this.isNavigating&&n.name==="space"&&t!==void 0&&t!==""}#s(t,n){let i=n.name==="up",s=n.name==="down",r=n.name==="return";i||s?(this.#e=Ot(this.#e,i?-1:1,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#e]?.value,this.multiple||(this.selectedValues=[this.focusedValue]),this.isNavigating=!0):r?this.value=_c(this.multiple,this.selectedValues):this.multiple?this.focusedValue!==void 0&&(n.name==="tab"||this.isNavigating&&n.name==="space")?this.toggleSelected(this.focusedValue):this.isNavigating=!1:(this.focusedValue&&(this.selectedValues=[this.focusedValue]),this.isNavigating=!1)}deselectAll(){this.selectedValues=[]}toggleSelected(t){this.filteredOptions.length!==0&&(this.multiple?this.selectedValues.includes(t)?this.selectedValues=this.selectedValues.filter(n=>n!==t):this.selectedValues=[...this.selectedValues,t]:this.selectedValues=[t])}#r(t){if(t!==this.#n){this.#n=t;let n=this.options;t?this.filteredOptions=n.filter(r=>this.#i(t,r)):this.filteredOptions=[...n];let i=$c(this.focusedValue,this.filteredOptions);this.#e=Ot(i,0,this.filteredOptions);let s=this.filteredOptions[this.#e];s&&!s.disabled?this.focusedValue=s.value:this.focusedValue=void 0,this.multiple||(this.focusedValue!==void 0?this.toggleSelected(this.focusedValue):this.deselectAll())}}},ki=class extends pt{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(t){super(t,!1),this.value=!!t.initialValue,this.on("userInput",()=>{this.value=this._value}),this.on("confirm",n=>{this.output.write(Ne.cursor.move(0,-1)),this.value=n,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}},xi=class extends pt{options;cursor=0;#e;getGroupItems(t){return this.options.filter(n=>n.group===t)}isGroupSelected(t){let n=this.getGroupItems(t),i=this.value;return i===void 0?!1:n.every(s=>i.includes(s.value))}toggleValue(){let t=this.options[this.cursor];if(this.value===void 0&&(this.value=[]),t.group===!0){let n=t.value,i=this.getGroupItems(n);this.isGroupSelected(n)?this.value=this.value.filter(s=>i.findIndex(r=>r.value===s)===-1):this.value=[...this.value,...i.map(s=>s.value)],this.value=Array.from(new Set(this.value))}else{let n=this.value.includes(t.value);this.value=n?this.value.filter(i=>i!==t.value):[...this.value,t.value]}}constructor(t){super(t,!1);let{options:n}=t;this.#e=t.selectableGroups!==!1,this.options=Object.entries(n).flatMap(([i,s])=>[{value:i,group:!0,label:i},...s.map(r=>({...r,group:i}))]),this.value=[...t.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:i})=>i===t.cursorAt),this.#e?0:1),this.on("cursor",i=>{switch(i){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;let s=this.options[this.cursor]?.group===!0;!this.#e&&s&&(this.cursor=this.cursor===0?this.options.length-1:this.cursor-1);break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;let s=this.options[this.cursor]?.group===!0;!this.#e&&s&&(this.cursor=this.cursor===this.options.length-1?0:this.cursor+1);break}case"space":this.toggleValue();break}})}},ji=class extends pt{options;cursor=0;get _value(){return this.options[this.cursor].value}get _enabledOptions(){return this.options.filter(t=>t.disabled!==!0)}toggleAll(){let t=this._enabledOptions,n=this.value!==void 0&&this.value.length===t.length;this.value=n?[]:t.map(i=>i.value)}toggleInvert(){let t=this.value;if(!t)return;let n=this._enabledOptions.filter(i=>!t.includes(i.value));this.value=n.map(i=>i.value)}toggleValue(){this.value===void 0&&(this.value=[]);let t=this.value.includes(this._value);this.value=t?this.value.filter(n=>n!==this._value):[...this.value,this._value]}constructor(t){super(t,!1),this.options=t.options,this.value=[...t.initialValues??[]];let n=Math.max(this.options.findIndex(({value:i})=>i===t.cursorAt),0);this.cursor=this.options[n].disabled?Ot(n,1,this.options):n,this.on("key",i=>{i==="a"&&this.toggleAll(),i==="i"&&this.toggleInvert()}),this.on("cursor",i=>{switch(i){case"left":case"up":this.cursor=Ot(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=Ot(this.cursor,1,this.options);break;case"space":this.toggleValue();break}})}},Wo=class extends pt{_mask="\u2022";get cursor(){return this._cursor}get masked(){return this.userInput.replaceAll(/./g,this._mask)}get userInputWithCursor(){if(this.state==="submit"||this.state==="cancel")return this.masked;let e=this.userInput;if(this.cursor>=e.length)return`${this.masked}${Ut.default.inverse(Ut.default.hidden("_"))}`;let t=this.masked,n=t.slice(0,this.cursor),i=t.slice(this.cursor);return`${n}${Ut.default.inverse(i[0])}${i.slice(1)}`}clear(){this._clearUserInput()}constructor({mask:e,...t}){super(t),this._mask=e??"\u2022",this.on("userInput",n=>{this._setValue(n)})}},Si=class extends pt{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){this.value=this._selectedValue.value}constructor(t){super(t,!1),this.options=t.options;let n=this.options.findIndex(({value:s})=>s===t.initialValue),i=n===-1?0:n;this.cursor=this.options[i].disabled?Ot(i,1,this.options):i,this.changeValue(),this.on("cursor",s=>{switch(s){case"left":case"up":this.cursor=Ot(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=Ot(this.cursor,1,this.options);break}this.changeValue()})}},Oi=class extends pt{options;cursor=0;constructor(t){super(t,!1),this.options=t.options;let n=t.caseSensitive===!0,i=this.options.map(({value:[s]})=>n?s:s?.toLowerCase());this.cursor=Math.max(i.indexOf(t.initialValue),0),this.on("key",(s,r)=>{if(!s)return;let o=n&&r.shift?s.toUpperCase():s;if(!i.includes(o))return;let a=this.options.find(({value:[d]})=>n?d===o:d?.toLowerCase()===s);a&&(this.value=a.value,this.state="submit",this.emit("submit"))})}},Ci=class extends pt{get userInputWithCursor(){if(this.state==="submit")return this.userInput;let t=this.userInput;if(this.cursor>=t.length)return`${this.userInput}\u2588`;let n=t.slice(0,this.cursor),[i,...s]=t.slice(this.cursor);return`${n}${Ut.default.inverse(i)}${s.join("")}`}get cursor(){return this._cursor}constructor(t){super({...t,initialUserInput:t.initialUserInput??t.initialValue}),this.on("userInput",n=>{this._setValue(n)}),this.on("finalize",()=>{this.value||(this.value=t.defaultValue),this.value===void 0&&(this.value="")})}}});var cr={};gn(cr,{S_BAR:()=>N,S_BAR_END:()=>Ae,S_BAR_END_RIGHT:()=>ea,S_BAR_H:()=>Ui,S_BAR_START:()=>Qs,S_BAR_START_RIGHT:()=>Qo,S_CHECKBOX_ACTIVE:()=>Ni,S_CHECKBOX_INACTIVE:()=>vn,S_CHECKBOX_SELECTED:()=>Zt,S_CONNECT_LEFT:()=>na,S_CORNER_BOTTOM_LEFT:()=>nr,S_CORNER_BOTTOM_RIGHT:()=>tr,S_CORNER_TOP_LEFT:()=>ia,S_CORNER_TOP_RIGHT:()=>er,S_ERROR:()=>or,S_INFO:()=>ir,S_PASSWORD_MASK:()=>ta,S_RADIO_ACTIVE:()=>Vn,S_RADIO_INACTIVE:()=>en,S_STEP_ACTIVE:()=>Zo,S_STEP_CANCEL:()=>Xs,S_STEP_ERROR:()=>Zs,S_STEP_SUBMIT:()=>tn,S_SUCCESS:()=>sr,S_WARN:()=>rr,autocomplete:()=>la,autocompleteMultiselect:()=>Mc,box:()=>Vc,cancel:()=>Jc,confirm:()=>Je,group:()=>Wc,groupMultiselect:()=>Hc,intro:()=>Bc,isCI:()=>Ys,isCancel:()=>ae,isTTY:()=>Xo,limitOptions:()=>kn,log:()=>Xe,multiselect:()=>Kc,note:()=>Xc,outro:()=>Gc,password:()=>Zc,path:()=>Qc,progress:()=>tu,select:()=>lt,selectKey:()=>nu,settings:()=>fe,spinner:()=>Wn,stream:()=>Xt,symbol:()=>dt,symbolBar:()=>ar,taskLog:()=>ru,tasks:()=>iu,text:()=>Ue,unicode:()=>Di,unicodeOr:()=>oe,updateSettings:()=>Lo});function kc(){return Ye.default.platform!=="win32"?Ye.default.env.TERM!=="linux":!!Ye.default.env.CI||!!Ye.default.env.WT_SESSION||!!Ye.default.env.TERMINUS_SUBLIME||Ye.default.env.ConEmuTask==="{cmd::Cmder}"||Ye.default.env.TERM_PROGRAM==="Terminus-Sublime"||Ye.default.env.TERM_PROGRAM==="vscode"||Ye.default.env.TERM==="xterm-256color"||Ye.default.env.TERM==="alacritty"||Ye.default.env.TERMINAL_EMULATOR==="JetBrains-JediTerm"}function _n(e,t,n){return String(e).normalize().replaceAll(`\r
|
|
45
45
|
`,`
|
|
46
46
|
`).split(`
|
|
47
47
|
`).map(i=>Dc(i,t,n)).join(`
|
|
48
|
-
`)}function Bo(e){return e.label??String(e.value??"")}function aa(e,t){if(!e)return!0;let n=(t.label??String(t.value??"")).toLowerCase(),i=(t.hint??"").toLowerCase(),s=String(t.value).toLowerCase(),r=e.toLowerCase();return n.includes(r)||i.includes(r)||s.includes(r)}function Uc(e,t){let n=[];for(let i of t)e.includes(i.value)&&n.push(i);return n}function Go(e,t,n,i){let s=n,r=n;return i==="center"?s=Math.floor((t-e)/2):i==="right"&&(s=t-e-n),r=t-s-e,[s,r]}function tu({style:e="heavy",max:t=100,size:n=40,...i}={}){let s=Ln(i),r=0,o="",a=Math.max(1,t),d=Math.max(1,n),m=_=>{switch(_){case"initial":case"active":return h.default.magenta;case"error":case"cancel":return h.default.red;case"submit":return h.default.green;default:return h.default.magenta}},f=(_,v)=>{let w=Math.floor(r/a*d);return`${m(_)(Ko[e].repeat(w))}${h.default.dim(Ko[e].repeat(d-w))} ${v}`},p=(_="")=>{o=_,s.start(f("initial",_))},g=(_=1,v)=>{r=Math.min(a,_+r),s.message(f("active",v??o)),o=v??o};return{start:p,stop:s.stop,cancel:s.cancel,error:s.error,clear:s.clear,advance:g,isCancelled:s.isCancelled,message:_=>g(0,_)}}var h,ze,Qt,Mn,wn,Pi,Di,zs,Yo,oe,Xo,Ys,Xs,tn,Zs,N,Ae,Zo,Qo,Fn,en,Ni,Zt,$n,ea,Ui,Qs,ta,er,tr,na,nr,ir,sr,rr,at,or,xc,jc,Sc,Bs,Ii,Ai,Gs,Ti,Oc,Cc,ia,Rc,Le,qi,sa,Ic,ar,ra,Ac,oa,dr,Wo,Tc,Ho,Jo,Ec,Ks,Pc,Dc,Nc,_n,da,qc,Mc,Fc,Lc,Vc,He,Wc,Hc,Ye,Jc,Bc,Gc,qn,Kc,zc,Yc,Xc,Zc,Qc,eu,Ln,Ko,Ei,dt,nu,zo,Xt,iu,su,ru,Ue,qe=$e(()=>{Js();Js();h=D(L(),1),ze=D(require("node:process"),1),Qt=require("node:fs"),Mn=require("node:path"),wn=D(Ps(),1),Pi=require("node:util");Di=kc(),zs=()=>process.env.CI==="true",Yo=e=>e.isTTY===!0,oe=(e,t)=>Di?e:t,Xo=oe("\u25C6","*"),Ys=oe("\u25A0","x"),Xs=oe("\u25B2","x"),tn=oe("\u25C7","o"),Zs=oe("\u250C","T"),N=oe("\u2502","|"),Ae=oe("\u2514","\u2014"),Zo=oe("\u2510","T"),Qo=oe("\u2518","\u2014"),Fn=oe("\u25CF",">"),en=oe("\u25CB"," "),Ni=oe("\u25FB","[\u2022]"),Zt=oe("\u25FC","[+]"),$n=oe("\u25FB","[ ]"),ea=oe("\u25AA","\u2022"),Ui=oe("\u2500","-"),Qs=oe("\u256E","+"),ta=oe("\u251C","+"),er=oe("\u256F","+"),tr=oe("\u2570","+"),na=oe("\u256D","+"),nr=oe("\u25CF","\u2022"),ir=oe("\u25C6","*"),sr=oe("\u25B2","!"),rr=oe("\u25A0","x"),at=e=>{switch(e){case"initial":case"active":return h.default.cyan(Xo);case"cancel":return h.default.red(Ys);case"error":return h.default.yellow(Xs);case"submit":return h.default.green(tn)}},or=e=>{switch(e){case"initial":case"active":return h.default.cyan(N);case"cancel":return h.default.red(N);case"error":return h.default.yellow(N);case"submit":return h.default.green(N)}},xc=e=>e===161||e===164||e===167||e===168||e===170||e===173||e===174||e>=176&&e<=180||e>=182&&e<=186||e>=188&&e<=191||e===198||e===208||e===215||e===216||e>=222&&e<=225||e===230||e>=232&&e<=234||e===236||e===237||e===240||e===242||e===243||e>=247&&e<=250||e===252||e===254||e===257||e===273||e===275||e===283||e===294||e===295||e===299||e>=305&&e<=307||e===312||e>=319&&e<=322||e===324||e>=328&&e<=331||e===333||e===338||e===339||e===358||e===359||e===363||e===462||e===464||e===466||e===468||e===470||e===472||e===474||e===476||e===593||e===609||e===708||e===711||e>=713&&e<=715||e===717||e===720||e>=728&&e<=731||e===733||e===735||e>=768&&e<=879||e>=913&&e<=929||e>=931&&e<=937||e>=945&&e<=961||e>=963&&e<=969||e===1025||e>=1040&&e<=1103||e===1105||e===8208||e>=8211&&e<=8214||e===8216||e===8217||e===8220||e===8221||e>=8224&&e<=8226||e>=8228&&e<=8231||e===8240||e===8242||e===8243||e===8245||e===8251||e===8254||e===8308||e===8319||e>=8321&&e<=8324||e===8364||e===8451||e===8453||e===8457||e===8467||e===8470||e===8481||e===8482||e===8486||e===8491||e===8531||e===8532||e>=8539&&e<=8542||e>=8544&&e<=8555||e>=8560&&e<=8569||e===8585||e>=8592&&e<=8601||e===8632||e===8633||e===8658||e===8660||e===8679||e===8704||e===8706||e===8707||e===8711||e===8712||e===8715||e===8719||e===8721||e===8725||e===8730||e>=8733&&e<=8736||e===8739||e===8741||e>=8743&&e<=8748||e===8750||e>=8756&&e<=8759||e===8764||e===8765||e===8776||e===8780||e===8786||e===8800||e===8801||e>=8804&&e<=8807||e===8810||e===8811||e===8814||e===8815||e===8834||e===8835||e===8838||e===8839||e===8853||e===8857||e===8869||e===8895||e===8978||e>=9312&&e<=9449||e>=9451&&e<=9547||e>=9552&&e<=9587||e>=9600&&e<=9615||e>=9618&&e<=9621||e===9632||e===9633||e>=9635&&e<=9641||e===9650||e===9651||e===9654||e===9655||e===9660||e===9661||e===9664||e===9665||e>=9670&&e<=9672||e===9675||e>=9678&&e<=9681||e>=9698&&e<=9701||e===9711||e===9733||e===9734||e===9737||e===9742||e===9743||e===9756||e===9758||e===9792||e===9794||e===9824||e===9825||e>=9827&&e<=9829||e>=9831&&e<=9834||e===9836||e===9837||e===9839||e===9886||e===9887||e===9919||e>=9926&&e<=9933||e>=9935&&e<=9939||e>=9941&&e<=9953||e===9955||e===9960||e===9961||e>=9963&&e<=9969||e===9972||e>=9974&&e<=9977||e===9979||e===9980||e===9982||e===9983||e===10045||e>=10102&&e<=10111||e>=11094&&e<=11097||e>=12872&&e<=12879||e>=57344&&e<=63743||e>=65024&&e<=65039||e===65533||e>=127232&&e<=127242||e>=127248&&e<=127277||e>=127280&&e<=127337||e>=127344&&e<=127373||e===127375||e===127376||e>=127387&&e<=127404||e>=917760&&e<=917999||e>=983040&&e<=1048573||e>=1048576&&e<=1114109,jc=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,Sc=e=>e>=4352&&e<=4447||e===8986||e===8987||e===9001||e===9002||e>=9193&&e<=9196||e===9200||e===9203||e===9725||e===9726||e===9748||e===9749||e>=9800&&e<=9811||e===9855||e===9875||e===9889||e===9898||e===9899||e===9917||e===9918||e===9924||e===9925||e===9934||e===9940||e===9962||e===9970||e===9971||e===9973||e===9978||e===9981||e===9989||e===9994||e===9995||e===10024||e===10060||e===10062||e>=10067&&e<=10069||e===10071||e>=10133&&e<=10135||e===10160||e===10175||e===11035||e===11036||e===11088||e===11093||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=94176&&e<=94180||e===94192||e===94193||e>=94208&&e<=100343||e>=100352&&e<=101589||e>=101632&&e<=101640||e>=110576&&e<=110579||e>=110581&&e<=110587||e===110589||e===110590||e>=110592&&e<=110882||e===110898||e>=110928&&e<=110930||e===110933||e>=110948&&e<=110951||e>=110960&&e<=111355||e===126980||e===127183||e===127374||e>=127377&&e<=127386||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e===127568||e===127569||e>=127584&&e<=127589||e>=127744&&e<=127776||e>=127789&&e<=127797||e>=127799&&e<=127868||e>=127870&&e<=127891||e>=127904&&e<=127946||e>=127951&&e<=127955||e>=127968&&e<=127984||e===127988||e>=127992&&e<=128062||e===128064||e>=128066&&e<=128252||e>=128255&&e<=128317||e>=128331&&e<=128334||e>=128336&&e<=128359||e===128378||e===128405||e===128406||e===128420||e>=128507&&e<=128591||e>=128640&&e<=128709||e===128716||e>=128720&&e<=128722||e>=128725&&e<=128727||e>=128732&&e<=128735||e===128747||e===128748||e>=128756&&e<=128764||e>=128992&&e<=129003||e===129008||e>=129292&&e<=129338||e>=129340&&e<=129349||e>=129351&&e<=129535||e>=129648&&e<=129660||e>=129664&&e<=129672||e>=129680&&e<=129725||e>=129727&&e<=129733||e>=129742&&e<=129755||e>=129760&&e<=129768||e>=129776&&e<=129784||e>=131072&&e<=196605||e>=196608&&e<=262141,Bs=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/y,Ii=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,Ai=/\t{1,1000}/y,Gs=new RegExp("[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*","yu"),Ti=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,Oc=new RegExp("\\p{M}+","gu"),Cc={limit:1/0,ellipsis:""},ia=(e,t={},n={})=>{let i=t.limit??1/0,s=t.ellipsis??"",r=t?.ellipsisWidth??(s?ia(s,Cc,n).width:0),o=n.ansiWidth??0,a=n.controlWidth??0,d=n.tabWidth??8,m=n.ambiguousWidth??1,f=n.emojiWidth??2,p=n.fullWidthWidth??2,g=n.regularWidth??1,_=n.wideWidth??2,v=0,w=0,S=e.length,O=0,j=!1,I=S,M=Math.max(0,i-r),F=0,Y=0,U=0,q=0;e:for(;;){if(Y>F||w>=S&&w>v){let ce=e.slice(F,Y)||e.slice(v,w);O=0;for(let le of ce.replaceAll(Oc,"")){let P=le.codePointAt(0)||0;if(jc(P)?q=p:Sc(P)?q=_:m!==g&&xc(P)?q=m:q=g,U+q>M&&(I=Math.min(I,Math.max(F,v)+O)),U+q>i){j=!0;break e}O+=le.length,U+=q}F=Y=0}if(w>=S)break;if(Ti.lastIndex=w,Ti.test(e)){if(O=Ti.lastIndex-w,q=O*g,U+q>M&&(I=Math.min(I,w+Math.floor((M-U)/g))),U+q>i){j=!0;break}U+=q,F=v,Y=w,w=v=Ti.lastIndex;continue}if(Bs.lastIndex=w,Bs.test(e)){if(U+o>M&&(I=Math.min(I,w)),U+o>i){j=!0;break}U+=o,F=v,Y=w,w=v=Bs.lastIndex;continue}if(Ii.lastIndex=w,Ii.test(e)){if(O=Ii.lastIndex-w,q=O*a,U+q>M&&(I=Math.min(I,w+Math.floor((M-U)/a))),U+q>i){j=!0;break}U+=q,F=v,Y=w,w=v=Ii.lastIndex;continue}if(Ai.lastIndex=w,Ai.test(e)){if(O=Ai.lastIndex-w,q=O*d,U+q>M&&(I=Math.min(I,w+Math.floor((M-U)/d))),U+q>i){j=!0;break}U+=q,F=v,Y=w,w=v=Ai.lastIndex;continue}if(Gs.lastIndex=w,Gs.test(e)){if(U+f>M&&(I=Math.min(I,w)),U+f>i){j=!0;break}U+=f,F=v,Y=w,w=v=Gs.lastIndex;continue}w+=1}return{width:j?M:U,index:j?I:S,truncated:j,ellipsed:j&&i>=r}},Rc={limit:1/0,ellipsis:"",ellipsisWidth:0},Le=(e,t={})=>ia(e,Rc,t).width,qi="\x1B",sa="\x9B",Ic=39,ar="\x07",ra="[",Ac="]",oa="m",dr=`${Ac}8;;`,Wo=new RegExp(`(?:\\${ra}(?<code>\\d+)m|\\${dr}(?<uri>.*)${ar})`,"y"),Tc=e=>{if(e>=30&&e<=37||e>=90&&e<=97)return 39;if(e>=40&&e<=47||e>=100&&e<=107)return 49;if(e===1||e===2)return 22;if(e===3)return 23;if(e===4)return 24;if(e===7)return 27;if(e===8)return 28;if(e===9)return 29;if(e===0)return 0},Ho=e=>`${qi}${ra}${e}${oa}`,Jo=e=>`${qi}${dr}${e}${ar}`,Ec=e=>e.map(t=>Le(t)),Ks=(e,t,n)=>{let i=t[Symbol.iterator](),s=!1,r=!1,o=e.at(-1),a=o===void 0?0:Le(o),d=i.next(),m=i.next(),f=0;for(;!d.done;){let p=d.value,g=Le(p);a+g<=n?e[e.length-1]+=p:(e.push(p),a=0),(p===qi||p===sa)&&(s=!0,r=t.startsWith(dr,f+1)),s?r?p===ar&&(s=!1,r=!1):p===oa&&(s=!1):(a+=g,a===n&&!m.done&&(e.push(""),a=0)),d=m,m=i.next(),f+=p.length}o=e.at(-1),!a&&o!==void 0&&o.length>0&&e.length>1&&(e[e.length-2]+=e.pop())},Pc=e=>{let t=e.split(" "),n=t.length;for(;n>0&&!(Le(t[n-1])>0);)n--;return n===t.length?e:t.slice(0,n).join(" ")+t.slice(n).join("")},Dc=(e,t,n={})=>{if(n.trim!==!1&&e.trim()==="")return"";let i="",s,r,o=e.split(" "),a=Ec(o),d=[""];for(let[v,w]of o.entries()){n.trim!==!1&&(d[d.length-1]=(d.at(-1)??"").trimStart());let S=Le(d.at(-1)??"");if(v!==0&&(S>=t&&(n.wordWrap===!1||n.trim===!1)&&(d.push(""),S=0),(S>0||n.trim===!1)&&(d[d.length-1]+=" ",S++)),n.hard&&a[v]>t){let O=t-S,j=1+Math.floor((a[v]-O-1)/t);Math.floor((a[v]-1)/t)<j&&d.push(""),Ks(d,w,t);continue}if(S+a[v]>t&&S>0&&a[v]>0){if(n.wordWrap===!1&&S<t){Ks(d,w,t);continue}d.push("")}if(S+a[v]>t&&n.wordWrap===!1){Ks(d,w,t);continue}d[d.length-1]+=w}n.trim!==!1&&(d=d.map(v=>Pc(v)));let m=d.join(`
|
|
49
|
-
`),f=m[Symbol.iterator](),p=f.next(),
|
|
50
|
-
`?(r&&(i+=
|
|
51
|
-
`&&(s&&
|
|
52
|
-
`);
|
|
48
|
+
`)}function Go(e){return e.label??String(e.value??"")}function da(e,t){if(!e)return!0;let n=(t.label??String(t.value??"")).toLowerCase(),i=(t.hint??"").toLowerCase(),s=String(t.value).toLowerCase(),r=e.toLowerCase();return n.includes(r)||i.includes(r)||s.includes(r)}function Uc(e,t){let n=[];for(let i of t)e.includes(i.value)&&n.push(i);return n}function Ko(e,t,n,i){let s=n,r=n;return i==="center"?s=Math.floor((t-e)/2):i==="right"&&(s=t-e-n),r=t-s-e,[s,r]}function tu({style:e="heavy",max:t=100,size:n=40,...i}={}){let s=Wn(i),r=0,o="",a=Math.max(1,t),d=Math.max(1,n),m=_=>{switch(_){case"initial":case"active":return h.default.magenta;case"error":case"cancel":return h.default.red;case"submit":return h.default.green;default:return h.default.magenta}},f=(_,v)=>{let g=Math.floor(r/a*d);return`${m(_)(zo[e].repeat(g))}${h.default.dim(zo[e].repeat(d-g))} ${v}`},p=(_="")=>{o=_,s.start(f("initial",_))},w=(_=1,v)=>{r=Math.min(a,_+r),s.message(f("active",v??o)),o=v??o};return{start:p,stop:s.stop,cancel:s.cancel,error:s.error,clear:s.clear,advance:w,isCancelled:s.isCancelled,message:_=>w(0,_)}}var h,Ye,Qt,Ln,$n,Pi,Di,Ys,Xo,oe,Zo,Xs,Zs,tn,Qs,N,Ae,Qo,ea,Vn,en,Ni,Zt,vn,ta,Ui,er,na,tr,nr,ia,ir,sr,rr,or,dt,ar,xc,jc,Sc,Gs,Ii,Ai,Ks,Ti,Oc,Cc,sa,Rc,Le,Mi,ra,Ic,dr,oa,Ac,aa,lr,Ho,Tc,Jo,Bo,Ec,zs,Pc,Dc,Nc,kn,la,Mc,qc,Fc,Lc,Vc,Je,Wc,Hc,Xe,Jc,Bc,Gc,Fn,Kc,zc,Yc,Xc,Zc,Qc,eu,Wn,zo,Ei,lt,nu,Yo,Xt,iu,su,ru,Ue,Me=$e(()=>{Bs();Bs();h=D(L(),1),Ye=D(require("node:process"),1),Qt=require("node:fs"),Ln=require("node:path"),$n=D(Ds(),1),Pi=require("node:util");Di=kc(),Ys=()=>process.env.CI==="true",Xo=e=>e.isTTY===!0,oe=(e,t)=>Di?e:t,Zo=oe("\u25C6","*"),Xs=oe("\u25A0","x"),Zs=oe("\u25B2","x"),tn=oe("\u25C7","o"),Qs=oe("\u250C","T"),N=oe("\u2502","|"),Ae=oe("\u2514","\u2014"),Qo=oe("\u2510","T"),ea=oe("\u2518","\u2014"),Vn=oe("\u25CF",">"),en=oe("\u25CB"," "),Ni=oe("\u25FB","[\u2022]"),Zt=oe("\u25FC","[+]"),vn=oe("\u25FB","[ ]"),ta=oe("\u25AA","\u2022"),Ui=oe("\u2500","-"),er=oe("\u256E","+"),na=oe("\u251C","+"),tr=oe("\u256F","+"),nr=oe("\u2570","+"),ia=oe("\u256D","+"),ir=oe("\u25CF","\u2022"),sr=oe("\u25C6","*"),rr=oe("\u25B2","!"),or=oe("\u25A0","x"),dt=e=>{switch(e){case"initial":case"active":return h.default.cyan(Zo);case"cancel":return h.default.red(Xs);case"error":return h.default.yellow(Zs);case"submit":return h.default.green(tn)}},ar=e=>{switch(e){case"initial":case"active":return h.default.cyan(N);case"cancel":return h.default.red(N);case"error":return h.default.yellow(N);case"submit":return h.default.green(N)}},xc=e=>e===161||e===164||e===167||e===168||e===170||e===173||e===174||e>=176&&e<=180||e>=182&&e<=186||e>=188&&e<=191||e===198||e===208||e===215||e===216||e>=222&&e<=225||e===230||e>=232&&e<=234||e===236||e===237||e===240||e===242||e===243||e>=247&&e<=250||e===252||e===254||e===257||e===273||e===275||e===283||e===294||e===295||e===299||e>=305&&e<=307||e===312||e>=319&&e<=322||e===324||e>=328&&e<=331||e===333||e===338||e===339||e===358||e===359||e===363||e===462||e===464||e===466||e===468||e===470||e===472||e===474||e===476||e===593||e===609||e===708||e===711||e>=713&&e<=715||e===717||e===720||e>=728&&e<=731||e===733||e===735||e>=768&&e<=879||e>=913&&e<=929||e>=931&&e<=937||e>=945&&e<=961||e>=963&&e<=969||e===1025||e>=1040&&e<=1103||e===1105||e===8208||e>=8211&&e<=8214||e===8216||e===8217||e===8220||e===8221||e>=8224&&e<=8226||e>=8228&&e<=8231||e===8240||e===8242||e===8243||e===8245||e===8251||e===8254||e===8308||e===8319||e>=8321&&e<=8324||e===8364||e===8451||e===8453||e===8457||e===8467||e===8470||e===8481||e===8482||e===8486||e===8491||e===8531||e===8532||e>=8539&&e<=8542||e>=8544&&e<=8555||e>=8560&&e<=8569||e===8585||e>=8592&&e<=8601||e===8632||e===8633||e===8658||e===8660||e===8679||e===8704||e===8706||e===8707||e===8711||e===8712||e===8715||e===8719||e===8721||e===8725||e===8730||e>=8733&&e<=8736||e===8739||e===8741||e>=8743&&e<=8748||e===8750||e>=8756&&e<=8759||e===8764||e===8765||e===8776||e===8780||e===8786||e===8800||e===8801||e>=8804&&e<=8807||e===8810||e===8811||e===8814||e===8815||e===8834||e===8835||e===8838||e===8839||e===8853||e===8857||e===8869||e===8895||e===8978||e>=9312&&e<=9449||e>=9451&&e<=9547||e>=9552&&e<=9587||e>=9600&&e<=9615||e>=9618&&e<=9621||e===9632||e===9633||e>=9635&&e<=9641||e===9650||e===9651||e===9654||e===9655||e===9660||e===9661||e===9664||e===9665||e>=9670&&e<=9672||e===9675||e>=9678&&e<=9681||e>=9698&&e<=9701||e===9711||e===9733||e===9734||e===9737||e===9742||e===9743||e===9756||e===9758||e===9792||e===9794||e===9824||e===9825||e>=9827&&e<=9829||e>=9831&&e<=9834||e===9836||e===9837||e===9839||e===9886||e===9887||e===9919||e>=9926&&e<=9933||e>=9935&&e<=9939||e>=9941&&e<=9953||e===9955||e===9960||e===9961||e>=9963&&e<=9969||e===9972||e>=9974&&e<=9977||e===9979||e===9980||e===9982||e===9983||e===10045||e>=10102&&e<=10111||e>=11094&&e<=11097||e>=12872&&e<=12879||e>=57344&&e<=63743||e>=65024&&e<=65039||e===65533||e>=127232&&e<=127242||e>=127248&&e<=127277||e>=127280&&e<=127337||e>=127344&&e<=127373||e===127375||e===127376||e>=127387&&e<=127404||e>=917760&&e<=917999||e>=983040&&e<=1048573||e>=1048576&&e<=1114109,jc=e=>e===12288||e>=65281&&e<=65376||e>=65504&&e<=65510,Sc=e=>e>=4352&&e<=4447||e===8986||e===8987||e===9001||e===9002||e>=9193&&e<=9196||e===9200||e===9203||e===9725||e===9726||e===9748||e===9749||e>=9800&&e<=9811||e===9855||e===9875||e===9889||e===9898||e===9899||e===9917||e===9918||e===9924||e===9925||e===9934||e===9940||e===9962||e===9970||e===9971||e===9973||e===9978||e===9981||e===9989||e===9994||e===9995||e===10024||e===10060||e===10062||e>=10067&&e<=10069||e===10071||e>=10133&&e<=10135||e===10160||e===10175||e===11035||e===11036||e===11088||e===11093||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12287||e>=12289&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12591||e>=12593&&e<=12686||e>=12688&&e<=12771||e>=12783&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=94176&&e<=94180||e===94192||e===94193||e>=94208&&e<=100343||e>=100352&&e<=101589||e>=101632&&e<=101640||e>=110576&&e<=110579||e>=110581&&e<=110587||e===110589||e===110590||e>=110592&&e<=110882||e===110898||e>=110928&&e<=110930||e===110933||e>=110948&&e<=110951||e>=110960&&e<=111355||e===126980||e===127183||e===127374||e>=127377&&e<=127386||e>=127488&&e<=127490||e>=127504&&e<=127547||e>=127552&&e<=127560||e===127568||e===127569||e>=127584&&e<=127589||e>=127744&&e<=127776||e>=127789&&e<=127797||e>=127799&&e<=127868||e>=127870&&e<=127891||e>=127904&&e<=127946||e>=127951&&e<=127955||e>=127968&&e<=127984||e===127988||e>=127992&&e<=128062||e===128064||e>=128066&&e<=128252||e>=128255&&e<=128317||e>=128331&&e<=128334||e>=128336&&e<=128359||e===128378||e===128405||e===128406||e===128420||e>=128507&&e<=128591||e>=128640&&e<=128709||e===128716||e>=128720&&e<=128722||e>=128725&&e<=128727||e>=128732&&e<=128735||e===128747||e===128748||e>=128756&&e<=128764||e>=128992&&e<=129003||e===129008||e>=129292&&e<=129338||e>=129340&&e<=129349||e>=129351&&e<=129535||e>=129648&&e<=129660||e>=129664&&e<=129672||e>=129680&&e<=129725||e>=129727&&e<=129733||e>=129742&&e<=129755||e>=129760&&e<=129768||e>=129776&&e<=129784||e>=131072&&e<=196605||e>=196608&&e<=262141,Gs=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/y,Ii=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,Ai=/\t{1,1000}/y,Ks=new RegExp("[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*","yu"),Ti=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,Oc=new RegExp("\\p{M}+","gu"),Cc={limit:1/0,ellipsis:""},sa=(e,t={},n={})=>{let i=t.limit??1/0,s=t.ellipsis??"",r=t?.ellipsisWidth??(s?sa(s,Cc,n).width:0),o=n.ansiWidth??0,a=n.controlWidth??0,d=n.tabWidth??8,m=n.ambiguousWidth??1,f=n.emojiWidth??2,p=n.fullWidthWidth??2,w=n.regularWidth??1,_=n.wideWidth??2,v=0,g=0,x=e.length,O=0,S=!1,I=x,q=Math.max(0,i-r),F=0,Y=0,U=0,M=0;e:for(;;){if(Y>F||g>=x&&g>v){let ce=e.slice(F,Y)||e.slice(v,g);O=0;for(let le of ce.replaceAll(Oc,"")){let P=le.codePointAt(0)||0;if(jc(P)?M=p:Sc(P)?M=_:m!==w&&xc(P)?M=m:M=w,U+M>q&&(I=Math.min(I,Math.max(F,v)+O)),U+M>i){S=!0;break e}O+=le.length,U+=M}F=Y=0}if(g>=x)break;if(Ti.lastIndex=g,Ti.test(e)){if(O=Ti.lastIndex-g,M=O*w,U+M>q&&(I=Math.min(I,g+Math.floor((q-U)/w))),U+M>i){S=!0;break}U+=M,F=v,Y=g,g=v=Ti.lastIndex;continue}if(Gs.lastIndex=g,Gs.test(e)){if(U+o>q&&(I=Math.min(I,g)),U+o>i){S=!0;break}U+=o,F=v,Y=g,g=v=Gs.lastIndex;continue}if(Ii.lastIndex=g,Ii.test(e)){if(O=Ii.lastIndex-g,M=O*a,U+M>q&&(I=Math.min(I,g+Math.floor((q-U)/a))),U+M>i){S=!0;break}U+=M,F=v,Y=g,g=v=Ii.lastIndex;continue}if(Ai.lastIndex=g,Ai.test(e)){if(O=Ai.lastIndex-g,M=O*d,U+M>q&&(I=Math.min(I,g+Math.floor((q-U)/d))),U+M>i){S=!0;break}U+=M,F=v,Y=g,g=v=Ai.lastIndex;continue}if(Ks.lastIndex=g,Ks.test(e)){if(U+f>q&&(I=Math.min(I,g)),U+f>i){S=!0;break}U+=f,F=v,Y=g,g=v=Ks.lastIndex;continue}g+=1}return{width:S?q:U,index:S?I:x,truncated:S,ellipsed:S&&i>=r}},Rc={limit:1/0,ellipsis:"",ellipsisWidth:0},Le=(e,t={})=>sa(e,Rc,t).width,Mi="\x1B",ra="\x9B",Ic=39,dr="\x07",oa="[",Ac="]",aa="m",lr=`${Ac}8;;`,Ho=new RegExp(`(?:\\${oa}(?<code>\\d+)m|\\${lr}(?<uri>.*)${dr})`,"y"),Tc=e=>{if(e>=30&&e<=37||e>=90&&e<=97)return 39;if(e>=40&&e<=47||e>=100&&e<=107)return 49;if(e===1||e===2)return 22;if(e===3)return 23;if(e===4)return 24;if(e===7)return 27;if(e===8)return 28;if(e===9)return 29;if(e===0)return 0},Jo=e=>`${Mi}${oa}${e}${aa}`,Bo=e=>`${Mi}${lr}${e}${dr}`,Ec=e=>e.map(t=>Le(t)),zs=(e,t,n)=>{let i=t[Symbol.iterator](),s=!1,r=!1,o=e.at(-1),a=o===void 0?0:Le(o),d=i.next(),m=i.next(),f=0;for(;!d.done;){let p=d.value,w=Le(p);a+w<=n?e[e.length-1]+=p:(e.push(p),a=0),(p===Mi||p===ra)&&(s=!0,r=t.startsWith(lr,f+1)),s?r?p===dr&&(s=!1,r=!1):p===aa&&(s=!1):(a+=w,a===n&&!m.done&&(e.push(""),a=0)),d=m,m=i.next(),f+=p.length}o=e.at(-1),!a&&o!==void 0&&o.length>0&&e.length>1&&(e[e.length-2]+=e.pop())},Pc=e=>{let t=e.split(" "),n=t.length;for(;n>0&&!(Le(t[n-1])>0);)n--;return n===t.length?e:t.slice(0,n).join(" ")+t.slice(n).join("")},Dc=(e,t,n={})=>{if(n.trim!==!1&&e.trim()==="")return"";let i="",s,r,o=e.split(" "),a=Ec(o),d=[""];for(let[v,g]of o.entries()){n.trim!==!1&&(d[d.length-1]=(d.at(-1)??"").trimStart());let x=Le(d.at(-1)??"");if(v!==0&&(x>=t&&(n.wordWrap===!1||n.trim===!1)&&(d.push(""),x=0),(x>0||n.trim===!1)&&(d[d.length-1]+=" ",x++)),n.hard&&a[v]>t){let O=t-x,S=1+Math.floor((a[v]-O-1)/t);Math.floor((a[v]-1)/t)<S&&d.push(""),zs(d,g,t);continue}if(x+a[v]>t&&x>0&&a[v]>0){if(n.wordWrap===!1&&x<t){zs(d,g,t);continue}d.push("")}if(x+a[v]>t&&n.wordWrap===!1){zs(d,g,t);continue}d[d.length-1]+=g}n.trim!==!1&&(d=d.map(v=>Pc(v)));let m=d.join(`
|
|
49
|
+
`),f=m[Symbol.iterator](),p=f.next(),w=f.next(),_=0;for(;!p.done;){let v=p.value,g=w.value;if(i+=v,v===Mi||v===ra){Ho.lastIndex=_+1;let O=Ho.exec(m)?.groups;if(O?.code!==void 0){let S=Number.parseFloat(O.code);s=S===Ic?void 0:S}else O?.uri!==void 0&&(r=O.uri.length===0?void 0:O.uri)}let x=s?Tc(s):void 0;g===`
|
|
50
|
+
`?(r&&(i+=Bo("")),s&&x&&(i+=Jo(x))):v===`
|
|
51
|
+
`&&(s&&x&&(i+=Jo(s)),r&&(i+=Bo(r))),_+=v.length,p=w,w=f.next()}return i};Nc=(e,t,n,i,s)=>{let r=t,o=0;for(let a=n;a<i;a++){let d=e[a];if(r=r-d.length,o++,r<=s)break}return{lineCount:r,removals:o}},kn=e=>{let{cursor:t,options:n,style:i}=e,s=e.output??process.stdout,r=Yt(s),o=e.columnPadding??0,a=e.rowPadding??4,d=r-o,m=Js(s),f=h.default.dim("..."),p=e.maxItems??Number.POSITIVE_INFINITY,w=Math.max(m-a,0),_=Math.max(Math.min(p,w),5),v=0;t>=_-3&&(v=Math.max(Math.min(t-_+3,n.length-_),0));let g=_<n.length&&v>0,x=_<n.length&&v+_<n.length,O=Math.min(v+_,n.length),S=[],I=0;g&&I++,x&&I++;let q=v+(g?1:0),F=O-(x?1:0);for(let U=q;U<F;U++){let M=_n(i(n[U],U===t),d,{hard:!0,trim:!1}).split(`
|
|
52
|
+
`);S.push(M),I+=M.length}if(I>w){let U=0,M=0,ce=I,le=t-q,P=(ge,ie)=>Nc(S,ce,ge,ie,w);g?({lineCount:ce,removals:U}=P(0,le),ce>w&&({lineCount:ce,removals:M}=P(le+1,S.length))):({lineCount:ce,removals:M}=P(le+1,S.length),ce>w&&({lineCount:ce,removals:U}=P(0,le))),U>0&&(g=!0,S.splice(0,U)),M>0&&(x=!0,S.splice(S.length-M,M))}let Y=[];g&&Y.push(f);for(let U of S)for(let M of U)Y.push(M);return x&&Y.push(f),Y};la=e=>new qn({options:e.options,initialValue:e.initialValue?[e.initialValue]:void 0,initialUserInput:e.initialUserInput,filter:e.filter??((t,n)=>da(t,n)),signal:e.signal,input:e.input,output:e.output,validate:e.validate,render(){let t=e.withGuide??fe.withGuide,n=t?[`${h.default.gray(N)}`,`${dt(this.state)} ${e.message}`]:[`${dt(this.state)} ${e.message}`],i=this.userInput,s=this.options,r=e.placeholder,o=i===""&&r!==void 0,a=(d,m)=>{let f=Go(d),p=d.hint&&d.value===this.focusedValue?h.default.dim(` (${d.hint})`):"";switch(m){case"active":return`${h.default.green(Vn)} ${f}${p}`;case"inactive":return`${h.default.dim(en)} ${h.default.dim(f)}`;case"disabled":return`${h.default.gray(en)} ${h.default.strikethrough(h.default.gray(f))}`}};switch(this.state){case"submit":{let d=Uc(this.selectedValues,s),m=d.length>0?` ${h.default.dim(d.map(Go).join(", "))}`:"",f=t?h.default.gray(N):"";return`${n.join(`
|
|
53
53
|
`)}
|
|
54
54
|
${f}${m}`}case"cancel":{let d=i?` ${h.default.strikethrough(h.default.dim(i))}`:"",m=t?h.default.gray(N):"";return`${n.join(`
|
|
55
55
|
`)}
|
|
56
|
-
${m}${d}`}default:{let d=this.state==="error"?h.default.yellow:h.default.cyan,m=t?`${d(N)} `:"",f=t?d(Ae):"",p="";if(this.isNavigating||o){let
|
|
57
|
-
`)}}}}).prompt(),
|
|
58
|
-
${
|
|
59
|
-
`,s=this.userInput,r=e.placeholder,o=s===""&&r!==void 0,a=this.isNavigating||o?h.default.dim(o?r:s):this.userInputWithCursor,d=this.options,m=this.filteredOptions.length!==d.length?h.default.dim(` (${this.filteredOptions.length} match${this.filteredOptions.length===1?"":"es"})`):"";switch(this.state){case"submit":return`${i}${h.default.gray(N)} ${h.default.dim(`${this.selectedValues.length} items selected`)}`;case"cancel":return`${i}${h.default.gray(N)} ${h.default.strikethrough(h.default.dim(s))}`;default:{let f=this.state==="error"?h.default.yellow:h.default.cyan,p=[`${h.default.dim("\u2191/\u2193")} to navigate`,`${h.default.dim(this.isNavigating?"Space/Tab:":"Tab:")} select`,`${h.default.dim("Enter:")} confirm`,`${h.default.dim("Type:")} to search`],
|
|
60
|
-
`),`${f(N)} ${h.default.dim("Search:")} ${a}${m}`,...
|
|
61
|
-
`)}}}});return n.prompt()},
|
|
62
|
-
`),le=
|
|
63
|
-
`);let
|
|
64
|
-
`);for(let ce of
|
|
65
|
-
`)}i.write(`${m}${p[2]}${
|
|
66
|
-
`)},
|
|
67
|
-
`:""}${
|
|
56
|
+
${m}${d}`}default:{let d=this.state==="error"?h.default.yellow:h.default.cyan,m=t?`${d(N)} `:"",f=t?d(Ae):"",p="";if(this.isNavigating||o){let S=o?r:i;p=S!==""?` ${h.default.dim(S)}`:""}else p=` ${this.userInputWithCursor}`;let w=this.filteredOptions.length!==s.length?h.default.dim(` (${this.filteredOptions.length} match${this.filteredOptions.length===1?"":"es"})`):"",_=this.filteredOptions.length===0&&i?[`${m}${h.default.yellow("No matches found")}`]:[],v=this.state==="error"?[`${m}${h.default.yellow(this.error)}`]:[];t&&n.push(`${m.trimEnd()}`),n.push(`${m}${h.default.dim("Search:")}${p}${w}`,..._,...v);let g=[`${h.default.dim("\u2191/\u2193")} to select`,`${h.default.dim("Enter:")} confirm`,`${h.default.dim("Type:")} to search`],x=[`${m}${g.join(" \u2022 ")}`,f],O=this.filteredOptions.length===0?[]:kn({cursor:this.cursor,options:this.filteredOptions,columnPadding:t?3:0,rowPadding:n.length+x.length,style:(S,I)=>a(S,S.disabled?"disabled":I?"active":"inactive"),maxItems:e.maxItems,output:e.output});return[...n,...O.map(S=>`${m}${S}`),...x].join(`
|
|
57
|
+
`)}}}}).prompt(),Mc=e=>{let t=(i,s,r,o)=>{let a=r.includes(i.value),d=i.label??String(i.value??""),m=i.hint&&o!==void 0&&i.value===o?h.default.dim(` (${i.hint})`):"",f=a?h.default.green(Zt):h.default.dim(vn);return i.disabled?`${h.default.gray(vn)} ${h.default.strikethrough(h.default.gray(d))}`:s?`${f} ${d}${m}`:`${f} ${h.default.dim(d)}`},n=new qn({options:e.options,multiple:!0,filter:e.filter??((i,s)=>da(i,s)),validate:()=>{if(e.required&&n.selectedValues.length===0)return"Please select at least one item"},initialValue:e.initialValues,signal:e.signal,input:e.input,output:e.output,render(){let i=`${h.default.gray(N)}
|
|
58
|
+
${dt(this.state)} ${e.message}
|
|
59
|
+
`,s=this.userInput,r=e.placeholder,o=s===""&&r!==void 0,a=this.isNavigating||o?h.default.dim(o?r:s):this.userInputWithCursor,d=this.options,m=this.filteredOptions.length!==d.length?h.default.dim(` (${this.filteredOptions.length} match${this.filteredOptions.length===1?"":"es"})`):"";switch(this.state){case"submit":return`${i}${h.default.gray(N)} ${h.default.dim(`${this.selectedValues.length} items selected`)}`;case"cancel":return`${i}${h.default.gray(N)} ${h.default.strikethrough(h.default.dim(s))}`;default:{let f=this.state==="error"?h.default.yellow:h.default.cyan,p=[`${h.default.dim("\u2191/\u2193")} to navigate`,`${h.default.dim(this.isNavigating?"Space/Tab:":"Tab:")} select`,`${h.default.dim("Enter:")} confirm`,`${h.default.dim("Type:")} to search`],w=this.filteredOptions.length===0&&s?[`${f(N)} ${h.default.yellow("No matches found")}`]:[],_=this.state==="error"?[`${f(N)} ${h.default.yellow(this.error)}`]:[],v=[...`${i}${f(N)}`.split(`
|
|
60
|
+
`),`${f(N)} ${h.default.dim("Search:")} ${a}${m}`,...w,..._],g=[`${f(N)} ${p.join(" \u2022 ")}`,`${f(Ae)}`],x=kn({cursor:this.cursor,options:this.filteredOptions,style:(O,S)=>t(O,S,this.selectedValues,this.focusedValue),maxItems:e.maxItems,output:e.output,rowPadding:v.length+g.length});return[...v,...x.map(O=>`${f(N)} ${O}`),...g].join(`
|
|
61
|
+
`)}}}});return n.prompt()},qc=[ia,er,nr,tr],Fc=[Qs,Qo,Ae,ea];Lc=e=>e,Vc=(e="",t="",n)=>{let i=n?.output??process.stdout,s=Yt(i),r=2,o=n?.titlePadding??1,a=n?.contentPadding??2,d=n?.width===void 0||n.width==="auto"?1:Math.min(1,n.width),m=n?.withGuide??fe.withGuide?`${N} `:"",f=n?.formatBorder??Lc,p=(n?.rounded?qc:Fc).map(f),w=f(Ui),_=f(N),v=Le(m),g=Le(t),x=s-v,O=Math.floor(s*d)-v;if(n?.width==="auto"){let ce=e.split(`
|
|
62
|
+
`),le=g+o*2;for(let ge of ce){let ie=Le(ge)+a*2;ie>le&&(le=ie)}let P=le+r;P<O&&(O=P)}O%2!==0&&(O<x?O++:O--);let S=O-r,I=S-o*2,q=g>I?`${t.slice(0,I-3)}...`:t,[F,Y]=Ko(Le(q),S,o,n?.titleAlign),U=_n(e,S-a*2,{hard:!0,trim:!1});i.write(`${m}${p[0]}${w.repeat(F)}${q}${w.repeat(Y)}${p[1]}
|
|
63
|
+
`);let M=U.split(`
|
|
64
|
+
`);for(let ce of M){let[le,P]=Ko(Le(ce),S,a,n?.contentAlign);i.write(`${m}${_}${" ".repeat(le)}${ce}${" ".repeat(P)}${_}
|
|
65
|
+
`)}i.write(`${m}${p[2]}${w.repeat(S)}${p[3]}
|
|
66
|
+
`)},Je=e=>{let t=e.active??"Yes",n=e.inactive??"No";return new ki({active:t,inactive:n,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue??!0,render(){let i=e.withGuide??fe.withGuide,s=`${i?`${h.default.gray(N)}
|
|
67
|
+
`:""}${dt(this.state)} ${e.message}
|
|
68
68
|
`,r=this.value?t:n;switch(this.state){case"submit":{let o=i?`${h.default.gray(N)} `:"";return`${s}${o}${h.default.dim(r)}`}case"cancel":{let o=i?`${h.default.gray(N)} `:"";return`${s}${o}${h.default.strikethrough(h.default.dim(r))}${i?`
|
|
69
|
-
${h.default.gray(N)}`:""}`}default:{let o=i?`${h.default.cyan(N)} `:"",a=i?h.default.cyan(Ae):"";return`${s}${o}${this.value?`${h.default.green(
|
|
69
|
+
${h.default.gray(N)}`:""}`}default:{let o=i?`${h.default.cyan(N)} `:"",a=i?h.default.cyan(Ae):"";return`${s}${o}${this.value?`${h.default.green(Vn)} ${t}`:`${h.default.dim(en)} ${h.default.dim(t)}`}${e.vertical?i?`
|
|
70
70
|
${h.default.cyan(N)} `:`
|
|
71
|
-
`:` ${h.default.dim("/")} `}${this.value?`${h.default.dim(en)} ${h.default.dim(n)}`:`${h.default.green(
|
|
71
|
+
`:` ${h.default.dim("/")} `}${this.value?`${h.default.dim(en)} ${h.default.dim(n)}`:`${h.default.green(Vn)} ${n}`}
|
|
72
72
|
${a}
|
|
73
|
-
`}}}}).prompt()},Wc=async(e,t)=>{let n={},i=Object.keys(e);for(let s of i){let r=e[s],o=await r({results:n})?.catch(a=>{throw a});if(typeof t?.onCancel=="function"&&ae(o)){n[s]="canceled",t.onCancel({results:n});continue}n[s]=o}return n},Hc=e=>{let{selectableGroups:t=!0,groupSpacing:n=0}=e,i=(r,o,a=[])=>{let d=r.label??String(r.value),m=typeof r.group=="string",f=m&&(a[a.indexOf(r)+1]??{group:!0}),p=m&&f&&f.group===!0,
|
|
74
|
-
${h.default.cyan(N)}`;_=`${
|
|
73
|
+
`}}}}).prompt()},Wc=async(e,t)=>{let n={},i=Object.keys(e);for(let s of i){let r=e[s],o=await r({results:n})?.catch(a=>{throw a});if(typeof t?.onCancel=="function"&&ae(o)){n[s]="canceled",t.onCancel({results:n});continue}n[s]=o}return n},Hc=e=>{let{selectableGroups:t=!0,groupSpacing:n=0}=e,i=(r,o,a=[])=>{let d=r.label??String(r.value),m=typeof r.group=="string",f=m&&(a[a.indexOf(r)+1]??{group:!0}),p=m&&f&&f.group===!0,w=m?t?`${p?Ae:N} `:" ":"",_="";if(n>0&&!m){let g=`
|
|
74
|
+
${h.default.cyan(N)}`;_=`${g.repeat(n-1)}${g} `}if(o==="active")return`${_}${h.default.dim(w)}${h.default.cyan(Ni)} ${d}${r.hint?` ${h.default.dim(`(${r.hint})`)}`:""}`;if(o==="group-active")return`${_}${w}${h.default.cyan(Ni)} ${h.default.dim(d)}`;if(o==="group-active-selected")return`${_}${w}${h.default.green(Zt)} ${h.default.dim(d)}`;if(o==="selected"){let g=m||t?h.default.green(Zt):"";return`${_}${h.default.dim(w)}${g} ${h.default.dim(d)}${r.hint?` ${h.default.dim(`(${r.hint})`)}`:""}`}if(o==="cancelled")return`${h.default.strikethrough(h.default.dim(d))}`;if(o==="active-selected")return`${_}${h.default.dim(w)}${h.default.green(Zt)} ${d}${r.hint?` ${h.default.dim(`(${r.hint})`)}`:""}`;if(o==="submitted")return`${h.default.dim(d)}`;let v=m||t?h.default.dim(vn):"";return`${_}${h.default.dim(w)}${v} ${h.default.dim(d)}`},s=e.required??!0;return new xi({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValues:e.initialValues,required:s,cursorAt:e.cursorAt,selectableGroups:t,validate(r){if(s&&(r===void 0||r.length===0))return`Please select at least one option.
|
|
75
75
|
${h.default.reset(h.default.dim(`Press ${h.default.gray(h.default.bgWhite(h.default.inverse(" space ")))} to select, ${h.default.gray(h.default.bgWhite(h.default.inverse(" enter ")))} to submit`))}`},render(){let r=`${h.default.gray(N)}
|
|
76
|
-
${
|
|
76
|
+
${dt(this.state)} ${e.message}
|
|
77
77
|
`,o=this.value??[];switch(this.state){case"submit":{let a=this.options.filter(({value:m})=>o.includes(m)).map(m=>i(m,"submitted")),d=a.length===0?"":` ${a.join(h.default.dim(", "))}`;return`${r}${h.default.gray(N)}${d}`}case"cancel":{let a=this.options.filter(({value:d})=>o.includes(d)).map(d=>i(d,"cancelled")).join(h.default.dim(", "));return`${r}${h.default.gray(N)} ${a.trim()?`${a}
|
|
78
78
|
${h.default.gray(N)}`:""}`}case"error":{let a=this.error.split(`
|
|
79
79
|
`).map((d,m)=>m===0?`${h.default.yellow(Ae)} ${h.default.yellow(d)}`:` ${d}`).join(`
|
|
80
|
-
`);return`${r}${h.default.yellow(N)} ${this.options.map((d,m,f)=>{let p=o.includes(d.value)||d.group===!0&&this.isGroupSelected(`${d.value}`),
|
|
80
|
+
`);return`${r}${h.default.yellow(N)} ${this.options.map((d,m,f)=>{let p=o.includes(d.value)||d.group===!0&&this.isGroupSelected(`${d.value}`),w=m===this.cursor;return!w&&typeof d.group=="string"&&this.options[this.cursor].value===d.group?i(d,p?"group-active-selected":"group-active",f):w&&p?i(d,"active-selected",f):p?i(d,"selected",f):i(d,w?"active":"inactive",f)}).join(`
|
|
81
81
|
${h.default.yellow(N)} `)}
|
|
82
82
|
${a}
|
|
83
|
-
`}default:{let a=this.options.map((m,f,p)=>{let
|
|
84
|
-
`)?" ":""}${
|
|
83
|
+
`}default:{let a=this.options.map((m,f,p)=>{let w=o.includes(m.value)||m.group===!0&&this.isGroupSelected(`${m.value}`),_=f===this.cursor,v=!_&&typeof m.group=="string"&&this.options[this.cursor].value===m.group,g="";return v?g=i(m,w?"group-active-selected":"group-active",p):_&&w?g=i(m,"active-selected",p):w?g=i(m,"selected",p):g=i(m,_?"active":"inactive",p),`${f!==0&&!g.startsWith(`
|
|
84
|
+
`)?" ":""}${g}`}).join(`
|
|
85
85
|
${h.default.cyan(N)}`),d=a.startsWith(`
|
|
86
86
|
`)?"":" ";return`${r}${h.default.cyan(N)}${d}${a}
|
|
87
87
|
${h.default.cyan(Ae)}
|
|
88
|
-
`}}}}).prompt()},
|
|
89
|
-
`);if(p.length>0){let[
|
|
88
|
+
`}}}}).prompt()},Xe={message:(e=[],{symbol:t=h.default.gray(N),secondarySymbol:n=h.default.gray(N),output:i=process.stdout,spacing:s=1,withGuide:r}={})=>{let o=[],a=r??fe.withGuide,d=a?n:"",m=a?`${t} `:"",f=a?`${n} `:"";for(let w=0;w<s;w++)o.push(d);let p=Array.isArray(e)?e:e.split(`
|
|
89
|
+
`);if(p.length>0){let[w,..._]=p;w.length>0?o.push(`${m}${w}`):o.push(a?t:"");for(let v of _)v.length>0?o.push(`${f}${v}`):o.push(a?n:"")}i.write(`${o.join(`
|
|
90
90
|
`)}
|
|
91
|
-
`)},info:(e,t)=>{
|
|
91
|
+
`)},info:(e,t)=>{Xe.message(e,{...t,symbol:h.default.blue(ir)})},success:(e,t)=>{Xe.message(e,{...t,symbol:h.default.green(sr)})},step:(e,t)=>{Xe.message(e,{...t,symbol:h.default.green(tn)})},warn:(e,t)=>{Xe.message(e,{...t,symbol:h.default.yellow(rr)})},warning:(e,t)=>{Xe.warn(e,t)},error:(e,t)=>{Xe.message(e,{...t,symbol:h.default.red(or)})}},Jc=(e="",t)=>{(t?.output??process.stdout).write(`${h.default.gray(Ae)} ${h.default.red(e)}
|
|
92
92
|
|
|
93
|
-
`)},Bc=(e="",t)=>{(t?.output??process.stdout).write(`${h.default.gray(
|
|
93
|
+
`)},Bc=(e="",t)=>{(t?.output??process.stdout).write(`${h.default.gray(Qs)} ${e}
|
|
94
94
|
`)},Gc=(e="",t)=>{(t?.output??process.stdout).write(`${h.default.gray(N)}
|
|
95
95
|
${h.default.gray(Ae)} ${e}
|
|
96
96
|
|
|
97
|
-
`)},
|
|
97
|
+
`)},Fn=(e,t)=>e.split(`
|
|
98
98
|
`).map(n=>t(n)).join(`
|
|
99
|
-
`),Kc=e=>{let t=(i,s)=>{let r=i.label??String(i.value);return s==="disabled"?`${h.default.gray(
|
|
100
|
-
${h.default.reset(h.default.dim(`Press ${h.default.gray(h.default.bgWhite(h.default.inverse(" space ")))} to select, ${h.default.gray(h.default.bgWhite(h.default.inverse(" enter ")))} to submit`))}`},render(){let i=ht(e.output,e.message,`${
|
|
99
|
+
`),Kc=e=>{let t=(i,s)=>{let r=i.label??String(i.value);return s==="disabled"?`${h.default.gray(vn)} ${Fn(r,o=>h.default.strikethrough(h.default.gray(o)))}${i.hint?` ${h.default.dim(`(${i.hint??"disabled"})`)}`:""}`:s==="active"?`${h.default.cyan(Ni)} ${r}${i.hint?` ${h.default.dim(`(${i.hint})`)}`:""}`:s==="selected"?`${h.default.green(Zt)} ${Fn(r,h.default.dim)}${i.hint?` ${h.default.dim(`(${i.hint})`)}`:""}`:s==="cancelled"?`${Fn(r,o=>h.default.strikethrough(h.default.dim(o)))}`:s==="active-selected"?`${h.default.green(Zt)} ${r}${i.hint?` ${h.default.dim(`(${i.hint})`)}`:""}`:s==="submitted"?`${Fn(r,h.default.dim)}`:`${h.default.dim(vn)} ${Fn(r,h.default.dim)}`},n=e.required??!0;return new ji({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValues:e.initialValues,required:n,cursorAt:e.cursorAt,validate(i){if(n&&(i===void 0||i.length===0))return`Please select at least one option.
|
|
100
|
+
${h.default.reset(h.default.dim(`Press ${h.default.gray(h.default.bgWhite(h.default.inverse(" space ")))} to select, ${h.default.gray(h.default.bgWhite(h.default.inverse(" enter ")))} to submit`))}`},render(){let i=ht(e.output,e.message,`${ar(this.state)} `,`${dt(this.state)} `),s=`${h.default.gray(N)}
|
|
101
101
|
${i}
|
|
102
102
|
`,r=this.value??[],o=(a,d)=>{if(a.disabled)return t(a,"disabled");let m=r.includes(a.value);return d&&m?t(a,"active-selected"):m?t(a,"selected"):t(a,d?"active":"inactive")};switch(this.state){case"submit":{let a=this.options.filter(({value:m})=>r.includes(m)).map(m=>t(m,"submitted")).join(h.default.dim(", "))||h.default.dim("none"),d=ht(e.output,a,`${h.default.gray(N)} `);return`${s}${d}`}case"cancel":{let a=this.options.filter(({value:m})=>r.includes(m)).map(m=>t(m,"cancelled")).join(h.default.dim(", "));if(a.trim()==="")return`${s}${h.default.gray(N)}`;let d=ht(e.output,a,`${h.default.gray(N)} `);return`${s}${d}
|
|
103
103
|
${h.default.gray(N)}`}case"error":{let a=`${h.default.yellow(N)} `,d=this.error.split(`
|
|
104
|
-
`).map((p,
|
|
104
|
+
`).map((p,w)=>w===0?`${h.default.yellow(Ae)} ${h.default.yellow(p)}`:` ${p}`).join(`
|
|
105
105
|
`),m=s.split(`
|
|
106
106
|
`).length,f=d.split(`
|
|
107
|
-
`).length+1;return`${s}${a}${
|
|
107
|
+
`).length+1;return`${s}${a}${kn({output:e.output,options:this.options,cursor:this.cursor,maxItems:e.maxItems,columnPadding:a.length,rowPadding:m+f,style:o}).join(`
|
|
108
108
|
${a}`)}
|
|
109
109
|
${d}
|
|
110
110
|
`}default:{let a=`${h.default.cyan(N)} `,d=s.split(`
|
|
111
|
-
`).length;return`${s}${a}${
|
|
111
|
+
`).length;return`${s}${a}${kn({output:e.output,options:this.options,cursor:this.cursor,maxItems:e.maxItems,columnPadding:a.length,rowPadding:d+2,style:o}).join(`
|
|
112
112
|
${a}`)}
|
|
113
113
|
${h.default.cyan(Ae)}
|
|
114
|
-
`}}}}).prompt()},zc=e=>h.default.dim(e),Yc=(e,t,n)=>{let i={hard:!0,trim:!1},s=
|
|
115
|
-
`),r=s.reduce((d,m)=>Math.max(Le(m),d),0),o=s.map(n).reduce((d,m)=>Math.max(Le(m),d),0),a=t-(o-r);return
|
|
116
|
-
`).map(r),""],a=Le(t),d=Math.max(o.reduce((
|
|
114
|
+
`}}}}).prompt()},zc=e=>h.default.dim(e),Yc=(e,t,n)=>{let i={hard:!0,trim:!1},s=_n(e,t,i).split(`
|
|
115
|
+
`),r=s.reduce((d,m)=>Math.max(Le(m),d),0),o=s.map(n).reduce((d,m)=>Math.max(Le(m),d),0),a=t-(o-r);return _n(e,a,i)},Xc=(e="",t="",n)=>{let i=n?.output??Ye.default.stdout,s=n?.withGuide??fe.withGuide,r=n?.format??zc,o=["",...Yc(e,Yt(i)-6,r).split(`
|
|
116
|
+
`).map(r),""],a=Le(t),d=Math.max(o.reduce((w,_)=>{let v=Le(_);return v>w?v:w},0),a)+2,m=o.map(w=>`${h.default.gray(N)} ${w}${" ".repeat(d-Le(w))}${h.default.gray(N)}`).join(`
|
|
117
117
|
`),f=s?`${h.default.gray(N)}
|
|
118
|
-
`:"",p=s?
|
|
118
|
+
`:"",p=s?na:nr;i.write(`${f}${h.default.green(tn)} ${h.default.reset(t)} ${h.default.gray(Ui.repeat(Math.max(d-a-1,1))+er)}
|
|
119
119
|
${m}
|
|
120
|
-
${h.default.gray(p+Ui.repeat(d+2)+
|
|
121
|
-
`)},Zc=e=>new
|
|
122
|
-
`:""}${
|
|
120
|
+
${h.default.gray(p+Ui.repeat(d+2)+tr)}
|
|
121
|
+
`)},Zc=e=>new Wo({validate:e.validate,mask:e.mask??ta,signal:e.signal,input:e.input,output:e.output,render(){let t=e.withGuide??fe.withGuide,n=`${t?`${h.default.gray(N)}
|
|
122
|
+
`:""}${dt(this.state)} ${e.message}
|
|
123
123
|
`,i=this.userInputWithCursor,s=this.masked;switch(this.state){case"error":{let r=t?`${h.default.yellow(N)} `:"",o=t?`${h.default.yellow(Ae)} `:"",a=s??"";return e.clearOnError&&this.clear(),`${n.trim()}
|
|
124
124
|
${r}${a}
|
|
125
125
|
${o}${h.default.yellow(this.error)}
|
|
126
126
|
`}case"submit":{let r=t?`${h.default.gray(N)} `:"",o=s?h.default.dim(s):"";return`${n}${r}${o}`}case"cancel":{let r=t?`${h.default.gray(N)} `:"",o=s?h.default.strikethrough(h.default.dim(s)):"";return`${n}${r}${o}${s&&t?`
|
|
127
127
|
${h.default.gray(N)}`:""}`}default:{let r=t?`${h.default.cyan(N)} `:"",o=t?h.default.cyan(Ae):"";return`${n}${r}${i}
|
|
128
128
|
${o}
|
|
129
|
-
`}}}}).prompt(),Qc=e=>{let t=e.validate;return
|
|
130
|
-
`);let A=
|
|
131
|
-
`);A.length>1&&n.write(
|
|
132
|
-
`);let H=0,ne=0;Y(),p=setInterval(()=>{if(m&&v===
|
|
129
|
+
`}}}}).prompt(),Qc=e=>{let t=e.validate;return la({...e,initialUserInput:e.initialValue??e.root??process.cwd(),maxItems:5,validate(n){if(!Array.isArray(n)){if(!n)return"Please select a path";if(t)return t(n)}},options(){let n=this.userInput;if(n==="")return[];try{let i;return(0,Qt.existsSync)(n)?(0,Qt.lstatSync)(n).isDirectory()?i=n:i=(0,Ln.dirname)(n):i=(0,Ln.dirname)(n),(0,Qt.readdirSync)(i).map(s=>{let r=(0,Ln.join)(i,s),o=(0,Qt.lstatSync)(r);return{name:s,path:r,isDirectory:o.isDirectory()}}).filter(({path:s,isDirectory:r})=>s.startsWith(n)&&(e.directory||!r)).map(s=>({value:s.path}))}catch{return[]}}})},eu=h.default.magenta,Wn=({indicator:e="dots",onCancel:t,output:n=process.stdout,cancelMessage:i,errorMessage:s,frames:r=Di?["\u25D2","\u25D0","\u25D3","\u25D1"]:["\u2022","o","O","0"],delay:o=Di?80:120,signal:a,...d}={})=>{let m=Ys(),f,p,w=!1,_=!1,v="",g,x=performance.now(),O=Yt(n),S=d?.styleFrame??eu,I=A=>{let H=A>1?s??fe.messages.error:i??fe.messages.cancel;_=A===1,w&&(ie(H,A),_&&typeof t=="function"&&t())},q=()=>I(2),F=()=>I(1),Y=()=>{process.on("uncaughtExceptionMonitor",q),process.on("unhandledRejection",q),process.on("SIGINT",F),process.on("SIGTERM",F),process.on("exit",I),a&&a.addEventListener("abort",F)},U=()=>{process.removeListener("uncaughtExceptionMonitor",q),process.removeListener("unhandledRejection",q),process.removeListener("SIGINT",F),process.removeListener("SIGTERM",F),process.removeListener("exit",I),a&&a.removeEventListener("abort",F)},M=()=>{if(g===void 0)return;m&&n.write(`
|
|
130
|
+
`);let A=_n(g,O,{hard:!0,trim:!1}).split(`
|
|
131
|
+
`);A.length>1&&n.write($n.cursor.up(A.length-1)),n.write($n.cursor.to(0)),n.write($n.erase.down())},ce=A=>A.replace(/\.+$/,""),le=A=>{let H=(performance.now()-A)/1e3,ne=Math.floor(H/60),Z=Math.floor(H%60);return ne>0?`[${ne}m ${Z}s]`:`[${Z}s]`},P=d.withGuide??fe.withGuide,ge=(A="")=>{w=!0,f=Vo({output:n}),v=ce(A),x=performance.now(),P&&n.write(`${h.default.gray(N)}
|
|
132
|
+
`);let H=0,ne=0;Y(),p=setInterval(()=>{if(m&&v===g)return;M(),g=v;let Z=S(r[H]),ue;if(m)ue=`${Z} ${v}...`;else if(e==="timer")ue=`${Z} ${v} ${le(x)}`;else{let ye=".".repeat(Math.floor(ne)).slice(0,3);ue=`${Z} ${v}${ye}`}let ke=_n(ue,O,{hard:!0,trim:!1});n.write(ke),H=H+1<r.length?H+1:0,ne=ne<4?ne+.125:0},o)},ie=(A="",H=0,ne=!1)=>{if(!w)return;w=!1,clearInterval(p),M();let Z=H===0?h.default.green(tn):H===1?h.default.red(Xs):h.default.red(Zs);v=A??v,ne||(e==="timer"?n.write(`${Z} ${v} ${le(x)}
|
|
133
133
|
`):n.write(`${Z} ${v}
|
|
134
|
-
`)),U(),f()};return{start:ge,stop:(A="")=>ie(A,0),message:(A="")=>{v=ce(A??v)},cancel:(A="")=>ie(A,1),error:(A="")=>ie(A,2),clear:()=>ie("",0,!0),get isCancelled(){return _}}},
|
|
134
|
+
`)),U(),f()};return{start:ge,stop:(A="")=>ie(A,0),message:(A="")=>{v=ce(A??v)},cancel:(A="")=>ie(A,1),error:(A="")=>ie(A,2),clear:()=>ie("",0,!0),get isCancelled(){return _}}},zo={light:oe("\u2500","-"),heavy:oe("\u2501","="),block:oe("\u2588","#")};Ei=(e,t)=>e.includes(`
|
|
135
135
|
`)?e.split(`
|
|
136
136
|
`).map(n=>t(n)).join(`
|
|
137
|
-
`):t(e),
|
|
137
|
+
`):t(e),lt=e=>{let t=(n,i)=>{let s=n.label??String(n.value);switch(i){case"disabled":return`${h.default.gray(en)} ${Ei(s,h.default.gray)}${n.hint?` ${h.default.dim(`(${n.hint??"disabled"})`)}`:""}`;case"selected":return`${Ei(s,h.default.dim)}`;case"active":return`${h.default.green(Vn)} ${s}${n.hint?` ${h.default.dim(`(${n.hint})`)}`:""}`;case"cancelled":return`${Ei(s,r=>h.default.strikethrough(h.default.dim(r)))}`;default:return`${h.default.dim(en)} ${Ei(s,h.default.dim)}`}};return new Si({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue,render(){let n=e.withGuide??fe.withGuide,i=`${dt(this.state)} `,s=`${ar(this.state)} `,r=ht(e.output,e.message,s,i),o=`${n?`${h.default.gray(N)}
|
|
138
138
|
`:""}${r}
|
|
139
139
|
`;switch(this.state){case"submit":{let a=n?`${h.default.gray(N)} `:"",d=ht(e.output,t(this.options[this.cursor],"selected"),a);return`${o}${d}`}case"cancel":{let a=n?`${h.default.gray(N)} `:"",d=ht(e.output,t(this.options[this.cursor],"cancelled"),a);return`${o}${d}${n?`
|
|
140
140
|
${h.default.gray(N)}`:""}`}default:{let a=n?`${h.default.cyan(N)} `:"",d=n?h.default.cyan(Ae):"",m=o.split(`
|
|
141
|
-
`).length,f=n?2:1;return`${o}${a}${
|
|
141
|
+
`).length,f=n?2:1;return`${o}${a}${kn({output:e.output,cursor:this.cursor,options:this.options,maxItems:e.maxItems,columnPadding:a.length,rowPadding:m+f,style:(p,w)=>t(p,p.disabled?"disabled":w?"active":"inactive")}).join(`
|
|
142
142
|
${a}`)}
|
|
143
143
|
${d}
|
|
144
144
|
`}}}}).prompt()},nu=e=>{let t=(n,i="inactive")=>{let s=n.label??String(n.value);return i==="selected"?`${h.default.dim(s)}`:i==="cancelled"?`${h.default.strikethrough(h.default.dim(s))}`:i==="active"?`${h.default.bgCyan(h.default.gray(` ${n.value} `))} ${s}${n.hint?` ${h.default.dim(`(${n.hint})`)}`:""}`:`${h.default.gray(h.default.bgWhite(h.default.inverse(` ${n.value} `)))} ${s}${n.hint?` ${h.default.dim(`(${n.hint})`)}`:""}`};return new Oi({options:e.options,signal:e.signal,input:e.input,output:e.output,initialValue:e.initialValue,caseSensitive:e.caseSensitive,render(){let n=e.withGuide??fe.withGuide,i=`${n?`${h.default.gray(N)}
|
|
145
|
-
`:""}${
|
|
145
|
+
`:""}${dt(this.state)} ${e.message}
|
|
146
146
|
`;switch(this.state){case"submit":{let s=n?`${h.default.gray(N)} `:"",r=this.options.find(a=>a.value===this.value)??e.options[0],o=ht(e.output,t(r,"selected"),s);return`${i}${o}`}case"cancel":{let s=n?`${h.default.gray(N)} `:"",r=ht(e.output,t(this.options[0],"cancelled"),s);return`${i}${r}${n?`
|
|
147
147
|
${h.default.gray(N)}`:""}`}default:{let s=n?`${h.default.cyan(N)} `:"",r=n?h.default.cyan(Ae):"",o=this.options.map((a,d)=>ht(e.output,t(a,d===this.cursor?"active":"inactive"),s)).join(`
|
|
148
148
|
`);return`${i}${o}
|
|
149
149
|
${r}
|
|
150
|
-
`}}}}).prompt()},
|
|
150
|
+
`}}}}).prompt()},Yo=`${h.default.gray(N)} `,Xt={message:async(e,{symbol:t=h.default.gray(N)}={})=>{process.stdout.write(`${h.default.gray(N)}
|
|
151
151
|
${t} `);let n=3;for await(let i of e){i=i.replace(/\n/g,`
|
|
152
|
-
${
|
|
152
|
+
${Yo}`),i.includes(`
|
|
153
153
|
`)&&(n=3+(0,Pi.stripVTControlCharacters)(i.slice(i.lastIndexOf(`
|
|
154
154
|
`))).length);let s=(0,Pi.stripVTControlCharacters)(i).length;n+s<process.stdout.columns?(n+=s,process.stdout.write(i)):(process.stdout.write(`
|
|
155
|
-
${
|
|
156
|
-
`)},info:e=>Xt.message(e,{symbol:h.default.blue(
|
|
155
|
+
${Yo}${i.trimStart()}`),n=3+(0,Pi.stripVTControlCharacters)(i.trimStart()).length)}process.stdout.write(`
|
|
156
|
+
`)},info:e=>Xt.message(e,{symbol:h.default.blue(ir)}),success:e=>Xt.message(e,{symbol:h.default.green(sr)}),step:e=>Xt.message(e,{symbol:h.default.green(tn)}),warn:e=>Xt.message(e,{symbol:h.default.yellow(rr)}),warning:e=>Xt.warn(e),error:e=>Xt.message(e,{symbol:h.default.red(or)})},iu=async(e,t)=>{for(let n of e){if(n.enabled===!1)continue;let i=Wn(t);i.start(n.title);let s=await n.task(i.message);i.stop(s||n.title)}},su=e=>e.replace(/\x1b\[(?:\d+;)*\d*[ABCDEFGHfJKSTsu]|\x1b\[(s|u)/g,""),ru=e=>{let t=e.output??process.stdout,n=Yt(t),i=h.default.gray(N),s=e.spacing??1,r=3,o=e.retainLog===!0,a=!Ys()&&Xo(t);t.write(`${i}
|
|
157
157
|
`),t.write(`${h.default.green(tn)} ${e.title}
|
|
158
|
-
`);for(let
|
|
159
|
-
`);let d=[{value:"",full:""}],m=!1,f=
|
|
160
|
-
${
|
|
161
|
-
`).reduce((U,
|
|
162
|
-
${
|
|
163
|
-
`).map(h.default.bold),{output:t,secondarySymbol:i,symbol:i,spacing:0}),
|
|
164
|
-
`).map(h.default.dim),{output:t,secondarySymbol:i,symbol:i,spacing:O??s})},
|
|
165
|
-
`),
|
|
166
|
-
`),
|
|
158
|
+
`);for(let x=0;x<s;x++)t.write(`${i}
|
|
159
|
+
`);let d=[{value:"",full:""}],m=!1,f=x=>{if(d.length===0)return;let O=0;x&&(O+=s+2);for(let S of d){let{value:I,result:q}=S,F=q?.message??I;if(F.length===0)continue;q===void 0&&S.header!==void 0&&S.header!==""&&(F+=`
|
|
160
|
+
${S.header}`);let Y=F.split(`
|
|
161
|
+
`).reduce((U,M)=>M===""?U+1:U+Math.ceil((M.length+r)/n),0);O+=Y}O>0&&(O+=1,t.write($n.erase.lines(O)))},p=(x,O,S)=>{let I=S?`${x.full}
|
|
162
|
+
${x.value}`:x.value;x.header!==void 0&&x.header!==""&&Xe.message(x.header.split(`
|
|
163
|
+
`).map(h.default.bold),{output:t,secondarySymbol:i,symbol:i,spacing:0}),Xe.message(I.split(`
|
|
164
|
+
`).map(h.default.dim),{output:t,secondarySymbol:i,symbol:i,spacing:O??s})},w=()=>{for(let x of d){let{header:O,value:S,full:I}=x;(O===void 0||O.length===0)&&S.length===0||p(x,void 0,o===!0&&I.length>0)}},_=(x,O,S)=>{if(f(!1),(S?.raw!==!0||!m)&&x.value!==""&&(x.value+=`
|
|
165
|
+
`),x.value+=su(O),m=S?.raw===!0,e.limit!==void 0){let I=x.value.split(`
|
|
166
|
+
`),q=I.length-e.limit;if(q>0){let F=I.splice(0,q);o&&(x.full+=(x.full===""?"":`
|
|
167
167
|
`)+F.join(`
|
|
168
|
-
`))}
|
|
169
|
-
`)}a&&v()},v=()=>{for(let
|
|
170
|
-
`:""}${
|
|
168
|
+
`))}x.value=I.join(`
|
|
169
|
+
`)}a&&v()},v=()=>{for(let x of d)x.result?x.result.status==="error"?Xe.error(x.result.message,{output:t,secondarySymbol:i,spacing:0}):Xe.success(x.result.message,{output:t,secondarySymbol:i,spacing:0}):x.value!==""&&p(x,0)},g=(x,O)=>{f(!1),x.result=O,a&&v()};return{message(x,O){_(d[0],x,O)},group(x){let O={header:x,value:"",full:""};return d.push(O),{message(S,I){_(O,S,I)},error(S){g(O,{status:"error",message:S})},success(S){g(O,{status:"success",message:S})}}},error(x,O){f(!0),Xe.error(x,{output:t,secondarySymbol:i,spacing:1}),O?.showLog!==!1&&w(),d.splice(1,d.length-1),d[0].value="",d[0].full=""},success(x,O){f(!0),Xe.success(x,{output:t,secondarySymbol:i,spacing:1}),O?.showLog===!0&&w(),d.splice(1,d.length-1),d[0].value="",d[0].full=""}}},Ue=e=>new Ci({validate:e.validate,placeholder:e.placeholder,defaultValue:e.defaultValue,initialValue:e.initialValue,output:e.output,signal:e.signal,input:e.input,render(){let t=e?.withGuide??fe.withGuide,n=`${`${t?`${h.default.gray(N)}
|
|
170
|
+
`:""}${dt(this.state)} `}${e.message}
|
|
171
171
|
`,i=e.placeholder?h.default.inverse(e.placeholder[0])+h.default.dim(e.placeholder.slice(1)):h.default.inverse(h.default.hidden("_")),s=this.userInput?this.userInputWithCursor:i,r=this.value??"";switch(this.state){case"error":{let o=this.error?` ${h.default.yellow(this.error)}`:"",a=t?`${h.default.yellow(N)} `:"",d=t?h.default.yellow(Ae):"";return`${n.trim()}
|
|
172
172
|
${a}${s}
|
|
173
173
|
${d}${o}
|
|
174
174
|
`}case"submit":{let o=r?` ${h.default.dim(r)}`:"",a=t?h.default.gray(N):"";return`${n}${a}${o}`}case"cancel":{let o=r?` ${h.default.strikethrough(h.default.dim(r))}`:"",a=t?h.default.gray(N):"";return`${n}${a}${o}${r.trim()?`
|
|
175
175
|
${a}`:""}`}default:{let o=t?`${h.default.cyan(N)} `:"",a=t?h.default.cyan(Ae):"";return`${n}${o}${s}
|
|
176
176
|
${a}
|
|
177
|
-
`}}}}).prompt()});function ou(e){return!!(e.json||!Te)}function
|
|
178
|
-
`)}else{for(let _ of g)console.log(_);m=!0}}return{start(){s&&(process.stdout.write("\x1B[?25l"),process.on("exit",f)),p(),s&&(o=setInterval(()=>{r++,p()},80))},markDone(g,_){t[g].status="done",_!==void 0&&(t[g].icon=_),s&&p()},stop(){o&&clearInterval(o);for(let g of t)g.status="done";p(),s&&(process.stdout.write("\x1B[?25h"),process.removeListener("exit",f))}}}var B,ua,Te,y,$,au,du,cu,ca,V=$e(()=>{"use strict";B=D(L(),1),ua=require("child_process");De();qe();Te=process.stdout.isTTY??!1;y={success:B.default.green("\u2713"),error:B.default.red("\u2717"),warning:B.default.yellow("!"),info:B.default.cyan("\u25CF"),arrow:B.default.dim("\u2192"),dot:B.default.dim("\xB7"),dash:B.default.dim("\u2500")},$={domain:e=>B.default.bold(B.default.white(e)),price:e=>B.default.green(`$${e}`),label:e=>B.default.dim(e),value:e=>B.default.white(e),dim:e=>B.default.dim(e),bold:e=>B.default.bold(e),success:e=>B.default.green(e),error:e=>B.default.red(e),warn:e=>B.default.yellow(e),cyan:e=>B.default.cyan(e),url:e=>`\x1B]8;;${e}\x1B\\${B.default.underline(B.default.cyan(e))}\x1B]8;;\x1B\\`};au={start:()=>{},stop:()=>{},message:()=>{}};du=/\x1b\]8;;[^\x1b]*\x1b\\|\x1b\[[0-9;]*m/g;cu={auth_required:"domani login",payment_required:"domani card add",contact_required:"domani contact set"};ca=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]});function pa(e){return typeof e=="string"&&["pro","agent","fleet","scale","mail_solo","mail_team","mail_business"].includes(e)}function ha(e){return pa(e.plan)||Array.isArray(e.workspace_plans)&&e.workspace_plans.some(pa)}async function ga(){if(fr)return;let e=process.argv.includes("--json")||!Ts,t=Ke(),n=ot();try{let r=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${n}`}})).json();if(ha(r)){fr=!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)),c(),console.log(` ${Oe.default.dim("This feature requires a")} ${Oe.default.bold("paid plan")} ${Oe.default.dim(`(including an active ${Dt.mailProductName} workspace plan or legacy Pro subscription).`)}`),console.log(` ${Oe.default.dim("Opening pricing page")} ${y.arrow} ${Oe.default.cyan("domani.run/pricing")}`),Ve(`${t.replace("http://localhost:3000","https://domani.run")}/pricing`),c();let i=C(!0);i.start("Waiting for upgrade...");for(let s=0;s<120;s++){await new Promise(r=>setTimeout(r,5e3));try{let o=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${n}`}})).json();if(ha(o)){fr=!0,i.stop(`${y.success} Paid plan active! Continuing...`),c();return}}catch{}}i.stop("Timed out"),console.error(` ${Oe.default.red("\u2717")} No upgrade detected. Visit ${Oe.default.cyan("domani.run/settings")} to upgrade.`),process.exit(1)}async function ya(){if(mr||ot()){mr=!0;return}let e=process.argv.includes("--json")||!Ts,{source:t}=Nt(),n=bn(),i=t==="flag"||t==="env"?`domani login --account ${n}`:"domani login";e&&(console.log(JSON.stringify({error:t==="flag"||t==="env"?`Not logged in to the CLI account "${n}"`:"Not logged in",code:"auth_required",hint:`Run '${i}' or set DOMANI_API_KEY environment variable`,fix_command:i},null,2)),process.exit(1)),c(),console.log(` ${Oe.default.dim("You're not logged in.")} Starting authentication...`),c();let s=Ke(),r=C(!0);r.start("Requesting auth code");let o;try{o=await fetch(`${s}/api/auth/cli`,{method:"POST",headers:{"Content-Type":"application/json"}})}catch{r.stop("Failed"),console.error(` ${Oe.default.red("\u2717")} Could not reach ${s}. Check your connection.`),process.exit(1)}if(!o.ok){r.stop("Failed");let m=`Server error (${o.status})`;try{let f=await o.json();m=f.error||f.message||m}catch{}console.error(` ${Oe.default.red("\u2717")} ${m}`),process.exit(1)}let a,d;try{({code:a,auth_url:d}=await o.json())}catch{r.stop("Failed"),console.error(` ${Oe.default.red("\u2717")} Invalid response from server.`),process.exit(1)}r.stop(`${y.success} Auth code ready`),c(),console.log(` ${Oe.default.dim("Verification code:")} ${Oe.default.bold(Oe.default.cyan(a))}`),console.log(` ${Oe.default.dim("Opening browser")} ${y.arrow} ${$.url(d)}`),Ve(d),c(),r.start("Waiting for browser approval");for(let m=0;m<120;m++){await new Promise(g=>setTimeout(g,5e3));let f=await fetch(`${s}/api/auth/cli/poll?code=${a}`).catch(()=>null);if(!f||!f.ok&&f.status!==202)continue;let p=await f.json().catch(()=>({}));if(p.status==="complete"){bi(n,{token:p.token,email:p.email,api_url:s}),mr=!0,r.stop(`${y.success} Logged in as ${Oe.default.bold(p.email)}`),c();return}}r.stop("Timed out"),console.error(` ${Oe.default.red("\u2717")} No approval received. Run ${Oe.default.cyan("domani login")} to try again.`),process.exit(1)}var Oe,mr,fr,pr=$e(()=>{"use strict";Oe=D(L(),1);ui();De();V();mr=!1,fr=!1});function va(e){return e.json=async()=>{let t=await e.clone().text();try{return JSON.parse(t)}catch{let n=t.trim().slice(0,120);return e.ok?(Object.defineProperty(e,"ok",{value:!1}),{error:`Unexpected non-JSON response (HTTP ${e.status})`,hint:`The server replied but not with JSON${n?` (got: "${n}")`:""}. This is usually transient (deploy or proxy) - retry in a few seconds.`}):{error:`Server error (${e.status})`,hint:"The server returned an unexpected response. Try again later."}}},e}async function k(e,t={},n=!1){let i=ot(),s=`${Ke()}${e}`,r=await fetch(s,{...t,headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json","User-Agent":`domani-cli/${Ie}`,...t.headers}});if(!n){let o=await r.clone().text();try{if(JSON.parse(o).code==="UPGRADE_REQUIRED")return await ga(),k(e,t,!0)}catch{}}return va(r)}async function xe(e,t={}){let n=`${Ke()}${e}`,i=ot(),s=await fetch(n,{...t,headers:{"Content-Type":"application/json","User-Agent":`domani-cli/${Ie}`,...i?{Authorization:`Bearer ${i}`}:{},...t.headers}});return va(s)}var G=$e(()=>{"use strict";De();pr()});function Lt(){return{ok:!0}}function It(e,t,n){return{ok:!1,error:{message:e,code:t,hint:n}}}function Sa(e){return hu.test(e)?It("Input contains control characters","invalid_input","Remove non-printable characters from the input"):Lt()}function vu(e){return gu.test(e)?It("Input contains path traversal","invalid_input","Domain names cannot contain '../' or '..\\'"):Lt()}function _u(e){return yu.test(e)?It("Input contains query string or fragment","invalid_input","Remove '?' or '#' from the domain name"):Lt()}function ku(e){return bu.test(e)?It("Input contains percent-encoded characters","invalid_input","Use plain text, not URL-encoded values (e.g. 'example.com' not 'example%2Ecom')"):Lt()}function Oa(e){if(!e)return It("Domain name is required","validation_error");if(e.length>ja)return It(`Domain name too long (${e.length} chars, max ${ja})`,"validation_error");for(let t of[Sa,vu,_u,ku]){let n=t(e);if(!n.ok)return n}return wu.test(e)?Lt():It(`Invalid domain name: ${e}`,"validation_error","Domain names can only contain letters, digits, hyphens, and dots")}function xu(e){if(!e)return It("TLD is required","validation_error");let t=Sa(e);return t.ok?$u.test(e)?Lt():It(`Invalid TLD: ${e}`,"validation_error","TLDs contain only letters (e.g. 'com', '.dev', 'ai')"):t}function ju(e){for(let t of e){let n=Oa(t);if(!n.ok)return n}return Lt()}function Su(e){for(let t of e){let n=xu(t);if(!n.ok)return n}return Lt()}function X(e,t){let n=Oa(e);n.ok||u(n.error.message,{code:n.error.code,hint:n.error.hint,json:t?.json,fields:t?.fields})}function Ca(e,t){let n=ju(e);n.ok||u(n.error.message,{code:n.error.code,hint:n.error.hint,json:t?.json,fields:t?.fields})}function Fi(e,t){let n=Su(e);n.ok||u(n.error.message,{code:n.error.code,hint:n.error.hint,json:t?.json,fields:t?.fields})}var hu,gu,yu,bu,wu,$u,ja,ve=$e(()=>{"use strict";V();hu=/[\x00-\x08\x0b\x0c\x0e-\x1f]/,gu=/\.\.[/\\]/,yu=/[?#]/,bu=/%[0-9a-fA-F]{2}/,wu=/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*\.?$/,$u=/^\.?[a-zA-Z]{2,63}$/,ja=253});function gr(e,t){return t!==void 0&&Math.round(t*100)!==Math.round(e*100)}function yr(e,t){return gr(e,t)?`$${e.toFixed(2)} first year, then $${t.toFixed(2)}/yr`:`$${e.toFixed(2)}/yr`}var br=$e(()=>{"use strict"});function lt(e){return`${e} year${e===1?"":"s"}`}function Ra(e){return typeof e.min_years=="number"&&Number.isInteger(e.min_years)&&e.min_years>1?e.min_years:1}function Ia(e){if(e===void 0)return;if(!/^\d+$/u.test(e.trim()))return null;let t=Number(e.trim());return t>=1&&t<=wr?t:null}function Vn(e,t){let n=Ra(e),i=t??n,s=i===n&&n>1&&typeof e.min_term_price=="number"?e.min_term_price:typeof e.price=="number"?Ou(e.price*i):void 0;return{years:i,min_years:n,...s!==void 0?{total:s}:{}}}function Aa(e,t){if(!(t.years===1||t.total===void 0||typeof e.price!="number"))return{total:t.total,minimum:t.years===t.min_years?` (${t.min_years}-year minimum)`:"",then:`, then ${Li(e.renewal_price??e.price)}/yr`}}function ct(e,t=Vn(e)){if(typeof e.price!="number")return"";let n=Aa(e,t);return n?`${Li(n.total)} for ${lt(t.years)}${n.minimum}${n.then}`:yr(e.price,e.renewal_price)}function $r(e,t){let n=Aa(e,t);return n?`for ${lt(t.years)}: ${Li(n.total)}${n.minimum}${n.then}`:typeof e.price=="number"?`for ${yr(e.price,e.renewal_price)}`:`for ${lt(t.years)}`}function vr(e){return{years:e.years,...e.min_years>1?{min_years:e.min_years}:{},...e.total!==void 0?{total_price:e.total}:{}}}function Ta(e){let t=e.filter(i=>i.term.years>1);return t.length===0?"":` (${t.map(({domain:i,term:s})=>`${i} for ${lt(s.years)}${s.years===s.min_years?`, the ${i.slice(i.indexOf("."))} minimum`:""}`).join("; ")})`}function _r(e,t,n){let i=Ra(t);if(n===void 0||n>=i)return;let{total:s}=Vn(t);return{domain:e,requested_years:n,min_years:i,...s!==void 0?{price:s}:{}}}function Ea(e){return e.map(t=>{let n=t.price!==void 0?`, ${Li(t.price)} in total`:"";return`${t.domain} cannot be registered for ${lt(t.requested_years)}: ${t.domain.slice(t.domain.indexOf("."))} names are registered for at least ${lt(t.min_years)}${n}.`}).join(" ")}function kr(e){return`Re-run with --years ${e}, or leave --years out for the minimum term.`}function Pa(e){let t=typeof e.code=="string"?e.code:"";if(!Cu.has(t))return;let n=typeof e.hint=="string"?e.hint:void 0;if(t==="TERM_BELOW_MINIMUM"){let s=Array.isArray(e.terms)?e.terms.map(o=>o.min_years):[e.min_years],r=Math.max(0,...s.filter(o=>typeof o=="number"));return{code:t,hint:r>1?kr(r):n}}if(t==="TERM_NOT_SUPPORTED"){let s=e.suggested_years;return{code:t,hint:typeof s=="number"?`Re-run with --years ${s}.`:n}}let i=e.retry_after;return{code:t,hint:typeof i=="number"?`Try again in ${i} seconds.`:n}}function Wn(e){return{price:e.price,currency:e.currency,renewal_price:e.renewal_price,min_years:e.min_years,min_term_price:e.min_term_price}}var wr,Ou,Li,Cu,Hn=$e(()=>{"use strict";br();wr=10,Ou=e=>Math.round(e*100)/100,Li=e=>`$${e.toFixed(2)}`;Cu=new Set(["TERM_BELOW_MINIMUM","TERM_NOT_SUPPORTED","REGISTRAR_UNAVAILABLE"])});function Jn(e){return Math.round(e*100)/100}function Vt(e){return e.code==="PRICE_ABOVE_MAX"&&typeof e.price=="number"?e.price:void 0}function xr(e){return`Nothing was charged. Re-run with --max-price ${e.toFixed(2)} to accept the new price.`}function Ru(e){return typeof e.renewal_price=="number"&&e.renewal_price>0?e.renewal_price:void 0}async function Bn(e,t,n,i,s){let r=Ru(n);Ct(s)&&u(n.error??`The price is now $${e.toFixed(2)}, above $${t.toFixed(2)}. Nothing was charged.`,{code:"price_above_max",hint:xr(e),data:{price:e,...typeof n.listed_price=="number"?{listed_price:n.listed_price}:{},...r!==void 0?{renewal_price:r}:{}},json:s.json,fields:s.fields});let o=r!==void 0?`, then ${$.price(r.toFixed(2))}/year to renew`:"",a=await He({message:`The price changed: ${$.price(e.toFixed(2))} instead of ${$.price(t.toFixed(2))}${o}. Nothing was charged. ${i} for ${$.price(e.toFixed(2))}?`});if(!a||typeof a=="symbol"){console.log(` ${Da.default.dim("Cancelled.")}`);return}return e}function sn(e,t){if(e===void 0)return;let n=Number(e);return(!Number.isFinite(n)||n<=0)&&u(`--max-price must be a positive amount in USD, got "${e}"`,{code:"validation_error",json:t.json,fields:t.fields}),n}var Da,Vi=$e(()=>{"use strict";qe();Da=D(L(),1);V()});function jr(e){let t=Ia(e.years);return t===null&&u(`--years must be a whole number from 1 to ${wr}, got "${e.years}"`,{code:"validation_error",json:e.json,fields:e.fields}),t}function Sr(e,t,n){u(Ea(e),{code:"TERM_BELOW_MINIMUM",hint:kr(Math.max(...e.map(i=>i.min_years))),data:t?{terms:e}:e[0],json:n.json,fields:n.fields})}function Wi(e,t,n){let i=Pa(e);i&&u(e.error,{code:i.code,hint:n.json?void 0:i.hint,status:t,data:e,json:n.json,fields:n.fields}),u(e.error||e.message,{hint:e.hint,fixUrl:e.setup_url||e.payment_options?.card?.setup_url,status:t,json:n.json,fields:n.fields})}var Na=$e(()=>{"use strict";V();Hn()});async function be(){Te||u("Missing required argument: domain",{hint:"Pass the domain as an argument, e.g. 'domani settings example.com'",code:"missing_argument",json:!0});let e=C(!0);e.start("Loading your domains");let t=await k("/api/domains"),n=await t.json();t.ok||(e.stop("Failed"),ur(n.error,n.hint),process.exit(1));let i=n.domains||[];i.length===0&&(e.stop("No domains"),c(),console.log(` ${Or.default.dim("No domains yet.")} Use: ${Or.default.cyan("domani buy <domain>")}`),c(),process.exit(0)),e.stop(`${i.length} domain(s)`);let s=await dt({message:"Which domain?",options:i.map(r=>({value:r.domain,label:r.domain,hint:r.status!=="active"?r.status:void 0}))});return ae(s)&&process.exit(0),s}var Or,it=$e(()=>{"use strict";G();qe();Or=D(L(),1);V()});var qa={};hn(qa,{connect:()=>Cr});async function Cr(e,t,n){e||(e=await be()),X(e,n);let i;if(t&&!n.provider?t.includes(".")?i=t:n.provider=t:i=t,!i&&!n.provider&&!n.list&&n.dryRun)return K("connect",{domain:e,note:"No provider specified. Pass --provider <name> to connect."},n.json,n.fields);if(!i&&!n.provider&&!n.list){let s=C(!n.json);s.start(`Loading providers for ${$.domain(e)}`);let r=await k(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop("Providers loaded"),n.json){b(o,n.fields);return}let a=[];for(let w of["hosting","email"]){let S=o.providers?.[w]||[];for(let O of S)a.push({value:`${w}:${O.name}`,label:O.name,hint:w})}a.length===0&&u("No providers available",{code:"not_found",json:n.json,fields:n.fields});let d=await dt({message:"Choose a provider",options:a});ae(d)&&process.exit(0);let[m,f]=d.split(":"),g=(o.providers?.[m]||[]).find(w=>w.name===f),_;if(g&&g.methods.length>1){let w=await dt({message:"Choose a method",options:g.methods.map(S=>({value:S.name,label:S.name,hint:S.default?"default":void 0}))});ae(w)&&process.exit(0),_=w}let v;if(m==="hosting"&&g?.requires_target){g.notes?.setup&&de(g.notes.setup);let w=await Ue({message:"Target hostname or IP"});ae(w)&&process.exit(0),v=w.trim()}return Ua(e,{target:v,provider:f,method:_,dryRun:n.dryRun,json:!1})}if(n.list){let s=C(!n.json);s.start(`Loading providers for ${$.domain(e)}`);let r=await k(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop("Providers loaded"),n.json){b(o,n.fields);return}x(`Providers for ${$.domain(o.domain)}`);for(let a of["hosting","email"]){let d=o.providers?.[a];if(d?.length){c(),console.log(` ${pe.default.bold(a.toUpperCase())}`);for(let m of d){let f=m.methods.map(p=>p.default?pe.default.green(`${p.name} (default)`):pe.default.dim(p.name)).join(pe.default.dim(", "));console.log(` ${pe.default.cyan(m.name.padEnd(20))} ${f}`)}}}c();return}return Ua(e,n)}async function Ua(e,t){let n={};if(t.target&&(n.target=t.target),t.provider&&(n.provider=t.provider),t.method&&(n.method=t.method),t.dryRun)return K("connect",{domain:e,...n},t.json,t.fields);let i=C(!t.json);i.start(`Connecting ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify(n)}),r=await s.json();s.ok||(i.stop("Connection failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}));let o=r.status==="manual_setup_required";if(i.stop(o?`${y.success} DNS instructions for ${pe.default.cyan(r.provider)}`:`${y.success} Connected to ${pe.default.cyan(r.provider)}`),t.json){b(r,t.fields);return}if(x(o?`Add these records at your registrar for ${$.domain(r.domain)}`:`Connected ${$.domain(r.domain)}`),l("Provider",pe.default.cyan(r.provider)),l("Method",r.method),r.records?.length){let a=[8,22,40];c(),console.log(` ${pe.default.bold("DNS Records")}`);let d=["Type","Name","Value"].map((f,p)=>pe.default.dim(f.padEnd(a[p]))).join(" "),m=a.map(f=>pe.default.dim("\u2500".repeat(f))).join(" ");console.log(` ${d}`),console.log(` ${m}`);for(let f of r.records){let p=f.record,g=f.status!=="already_set";process.stdout.isTTY&&g&&await Rt(50);let v=[pe.default.yellow(p.type),p.name,pe.default.cyan(p.value)+(p.priority?pe.default.dim(` pri=${p.priority}`):"")].map((O,j)=>Mi(O,a[j])).join(" "),w=f.status==="already_set"?pe.default.dim("\u2713"):f.status==="updated"?pe.default.yellow("\u21BA"):f.status==="pending"?pe.default.yellow("\u2192"):y.success,S=f.status==="already_set"?pe.default.dim(" already set"):f.status==="updated"?pe.default.dim(" updated"):f.status==="pending"?pe.default.dim(" add this"):"";console.log(` ${w} ${v}${S}`)}}c(),r.next_steps?.length?(console.log(` ${pe.default.bold("Next steps")}`),r.next_steps.forEach((a,d)=>{console.log(` ${pe.default.dim(`${d+1}.`)} ${a}`)})):r.hint&&console.log(` ${pe.default.dim(r.hint)}`),r.docs&&console.log(` ${pe.default.dim("Docs:")} ${$.url(r.docs)}`),c()}var pe,Rr=$e(()=>{"use strict";G();pe=D(L(),1);qe();V();ve();it()});function rn(e,t=process.env){if(e.clearHeaders&&(e.authorizationEnv||e.apiKeyEnv))throw new Error("--clear-headers cannot be combined with header environment options");if(e.clearHeaders)return{};let n={},i=[["Authorization",e.authorizationEnv],["X-API-Key",e.apiKeyEnv]];for(let[s,r]of i){if(!r)continue;let o=t[r];if(!o)throw new Error(`Environment variable ${r} is not set`);n[s]=o}return Object.keys(n).length>0?n:void 0}function on(e){return e?Object.keys(e):[]}var Hi=$e(()=>{"use strict"});function Gn(e,t,n){return u(e,{hint:t,code:"validation_error",json:n.json,fields:n.fields})}function Ir(e){return e.slug&&e.domain?`${e.slug}@${e.domain}`:null}function Ji(e,t){return t.messageId||t.messageIds||(e&&!e.includes("@")?e:void 0)}function Fa(e,t,n){return`/api/emails/${encodeURIComponent(e)}/messages/${encodeURIComponent(t)}/${n}`}function Au(e,t,n){return e.match==="domain"?`domani email sender-rule-add --action block --match domain --value ${e.value}`:`domani email sender-rule-add --action block --match campaign --from ${t} --message-id ${n}`}function Tu(e){let t=new URLSearchParams;e.action&&t.set("action",e.action),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}function Eu(e){if(!e.action||!Ma.includes(e.action))return{error:"--action must be block or allow"};if(!e.match||!Iu.includes(e.match))return{error:"--match must be address, domain or campaign"};let t=Ir(e),n={action:e.action,match:e.match};if(e.messageId){if(!t)return{error:"--message-id needs --from, the mailbox the message is in"};n.mailbox=t,n.message_id=e.messageId}else if(e.value){if(e.match==="campaign")return{error:"A campaign rule is taken from a message: pass --from and --message-id"};n.value=e.value}else return{error:"Pass --value, or --from and --message-id"};return e.confirm&&(n.confirm=!0),{body:n}}function Pu(e,t){return`/api/sender-rules/${encodeURIComponent(e)}${t?"?restore=false":""}`}function Ar(e){return e.match==="campaign"?e.label?`campaign "${e.label.slice(0,48)}"`:`campaign ${e.value.slice(0,8)}`:e.match==="domain"?`everything from ${e.value}`:e.value}async function Bi(e,t,n,i){let s=C(!n.json);s.start(i);let r=await k(e,t),o=await r.json();return r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop("Done"),o}async function La(e,t){let n="Usage: domani email spam <message_id> --from hi@myapp.dev [--confirm]",i=Ir(t),s=Ji(e,t);(!i||!s)&&Gn("Mailbox and message ID required",n,t);let r=await Bi(Fa(i,s,"spam"),{method:"POST",body:JSON.stringify(t.confirm?{confirm:!0}:{})},t,"Marking as spam");if(t.json)return b(r,t.fields);x("Spam"),l("Message",`${r.message_id} ${Me.default.dim("moved to Spam")}`),r.rule&&l("Blocked",`${Me.default.cyan(r.sender)} ${Me.default.dim("for every mailbox of the account")}`),l("Moved",`${r.moved} other message${r.moved===1?"":"s"} from the sender`),r.confirmation_required&&(console.log(` ${y.warning} ${r.confirmation_required.message}`),R("Block them anyway:",`domani email spam ${s} --from ${i} --confirm`));let o=r.suggestions||[];if(o.length){console.log(),console.log(` ${Me.default.bold("One step further")}`);for(let a of o){let d=a.match==="domain"?`Everything from ${a.value}`:`The same campaign${a.label?` ("${a.label.slice(0,48)}")`:""}`;console.log(` ${d}: ${a.count} message${a.count===1?"":"s"} in ${a.mailboxes} mailbox${a.mailboxes===1?"":"es"}`),R(" Apply:",Au(a,i,s))}}else r.hint&&de(r.hint)}async function Va(e,t){let n="Usage: domani email not-spam <message_id> --from hi@myapp.dev",i=Ir(t),s=Ji(e,t);(!i||!s)&&Gn("Mailbox and message ID required",n,t);let r=await Bi(Fa(i,s,"not-spam"),{method:"POST",body:"{}"},t,"Marking as not spam");if(t.json)return b(r,t.fields);x("Not spam"),l("Message",`${r.message_id} ${Me.default.dim("back in the Inbox")}`),r.rule&&l("Allowed",`${Me.default.cyan(r.sender)} ${Me.default.dim("for every mailbox of the account")}`),l("Moved",`${r.moved} other message${r.moved===1?"":"s"} back from Spam`);let o=r.matching_rules||[];if(o.length){console.log(),console.log(` ${Me.default.bold("Wider rules that also matched it")}`);for(let a of o)console.log(` Block on ${Ar(a)}`),R(" Remove:",`domani email sender-rule-remove ${a.id}`)}else r.hint&&de(r.hint)}async function Wa(e){e.action&&!Ma.includes(e.action)&&Gn("--action must be block or allow","Usage: domani email sender-rules [--action block|allow] [--limit 50] [--cursor C]",e);let t=await k(`/api/sender-rules${Tu(e)}`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);let i=n.rules||[];if(!i.length){console.log(Me.default.dim("No learned rules yet. Mark a message as spam (domani email spam) to block its sender."));return}x("Learned sender rules"),J(["ID","Rule","Moved","By","When"],i.map(s=>[s.id,`${s.action==="block"?Me.default.red("block"):Me.default.green("allow")} ${Ar(s)}`,String(s.moved+s.hits),s.created_by.label.slice(0,20),s.created_at.slice(0,10)]),[27,56,7,22,11]),n.next_cursor&&console.log(Me.default.dim(`More: --cursor ${n.next_cursor}`))}async function Ha(e){let t="Usage: domani email sender-rule-add --action block|allow --match address|domain --value secure.net [--confirm] (or --match campaign --from hi@myapp.dev --message-id MSG)",n=Eu(e);if("error"in n)return Gn(n.error,t,e);let i=await Bi("/api/sender-rules",{method:"POST",body:JSON.stringify(n.body)},e,"Saving the rule");if(e.json)return b(i,e.fields);let s=i.rule;console.log(`${y.success} ${s.action==="block"?"Blocked":"Allowed"} ${Me.default.cyan(Ar(s))} ${Me.default.dim(`(${s.id})`)}`),console.log(` ${i.moved} message${i.moved===1?"":"s"} already received moved ${s.action==="block"?"to Spam":"back to the Inbox"}.`),i.truncated&&de("The scan stopped early: some older copies of the campaign may still be in place."),R("Undo:",`domani email sender-rule-remove ${s.id}`)}async function Ja(e,t){let n=e&&!e.includes("@")?e:void 0;n||Gn("Rule ID required","Usage: domani email sender-rule-remove <rule_id> [--keep-moved]",t);let i=await Bi(Pu(n,t.keepMoved),{method:"DELETE"},t,"Removing the rule");if(t.json)return b(i,t.fields);console.log(`${y.success} Rule ${Me.default.cyan(n)} removed.${t.keepMoved?"":` ${i.restored} message${i.restored===1?"":"s"} went back where ${i.restored===1?"it was":"they were"}.`}`)}var Me,Ma,Iu,Tr=$e(()=>{"use strict";Me=D(L(),1);G();V();Ma=["block","allow"],Iu=["address","domain","campaign"]});function Du(e,t){return`/api/emails/${encodeURIComponent(e)}/messages/${encodeURIComponent(t)}/decisions`}function Nu(e){let t=e.previous&&e.previous!==e.value?`${e.previous} -> ${e.value}`:e.value,n=e.applied?e.action:an.default.dim(e.action),i=e.reasons.map(s=>s.code).join(", ");return[e.at.slice(5,19).replace("T"," "),e.axis,e.actor,n,t,i]}function Uu(e){return e?`${`spf ${e.spf??"-"}, dkim ${e.dkim??"-"}, dmarc ${e.dmarc??"-"}`} ${an.default.dim(`(${e.authserv_id??"unknown server"}, ${e.trusted?"trusted":"not trusted"})`)}`:an.default.dim("no verdict")}async function Ba(e,t){let n="Usage: domani email decisions <message_id> --from hi@myapp.dev",i=t.slug&&t.domain?`${t.slug}@${t.domain}`:null,s=Ji(e,t);(!i||!s)&&u("Mailbox and message ID required",{hint:n,code:"validation_error",json:t.json,fields:t.fields});let r=C(!t.json);r.start("Reading the decisions");let o=await k(Du(i,s)),a=await o.json();if(o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields})),r.stop("Done"),t.json)return b(a,t.fields);x("Decisions"),l("Message",`${a.message_id} ${an.default.dim(`(${a.mailbox})`)}`),l("From",a.from),a.subject&&l("Subject",a.subject.slice(0,72)),l("Now",`${a.current.folder}${a.current.kind?`, kind ${a.current.kind} ${an.default.dim(`(${a.current.kind_decided_by})`)}`:""}`),a.direction==="in"&&l("Authentication",Uu(a.authentication));let d=Object.entries(a.upstream?.headers??{});for(let[f,p]of d)l(f,p.slice(0,72));let m=a.decisions||[];if(m.length&&(console.log(),J(["When (UTC)","Axis","Who","Did","Value","Why"],m.map(Nu),[16,11,16,9,18,34])),a.ledger){let f=a.ledger;l("Ledger",`${f.at.slice(0,16).replace("T"," ")} ${f.status}: ${f.verdict.placement??"-"} by ${f.verdict.layer??"-"} ${an.default.dim(`(${f.version}, ${f.model})`)}`)}de(a.hint)}var an,Ga=$e(()=>{"use strict";an=D(L(),1);G();V();Tr()});var ad={};hn(ad,{buildSendBody:()=>ed,contactsQuery:()=>nd,email:()=>Kn,inboxQuery:()=>sd,parseRecipients:()=>Ki,recipientField:()=>zi,resolveDomainArg:()=>Er,resolveDraftIdArg:()=>Za,systemLocale:()=>Qa});function Fu(e){return[T.default.yellow(e.type),e.name,T.default.cyan(e.value)+(e.priority?T.default.dim(` pri=${e.priority}`):"")]}function Dr(e){return Mu[e]||e}function Ki(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function zi(e){if(e.length!==0)return e.length===1?e[0]:e}function Lu(e,t){if(e&&e.includes("@")){let[n,i]=e.split("@",2);!t.slug&&n&&(t.slug=n),!t.domain&&i&&(t.domain=i)}}function Er(e,t){if(t.domain)return t.domain;if(e&&!e.includes("@"))return e}async function Xe(e){return e.domain?(X(e.domain,e),e.domain):be()}async function Kn(e,t,n){if(e&&e.includes(".")&&!qu.includes(e))return n.check?za(e,!!n.json,n.fields):t?Ya(e,t,!!n.json,n.fields):rd(e,!!n.json,n.fields);if(Lu(t,n),n.body&&!n.text&&(n.text=n.body),n.title&&!n.subject&&(n.subject=n.title),n.from&&n.from.includes("@")){let[i,s]=n.from.split("@",2);!n.slug&&i&&(n.slug=i),!n.domain&&s&&(n.domain=s)}switch(e){case void 0:return Ka(n);case"list":return Ka(n);case"inbox":return gm(n);case"folders":return ym(n);case"drafts":return bm(n);case"draft":return zu(t,n);case"archive":case"trash":case"restore":case"read":case"unread":case"star":case"unstar":return wm(e,n);case"setup":return n.domain=Er(t,n),sm(n);case"status":return n.domain=Er(t,n),rm(n);case"remove":return om(n);case"create":return am(n);case"delete":return dm(n);case"send":return lm(n);case"webhook":return $m(n);case"webhook-test":return vm(n);case"forward":return _m(n);case"work":return Qu(n);case"triage":return em(n);case"note":return tm(n);case"notes":return nm(n);case"activity":return im(n);case"changes":return Ju(n);case"search":return Bu(t,n);case"threads":return Gu(n);case"thread":return Ku(t,n);case"label":return Yu(n);case"facts":return Xu(t,n);case"extract":return Zu(t,n);case"spam":return La(t,n);case"not-spam":return Va(t,n);case"decisions":return Ba(t,n);case"sender-rules":return Wa(n);case"sender-rule-add":return Ha(n);case"sender-rule-remove":return Ja(t,n);case"coordination":return Vu(n);case"presence":return Wu(n);case"release-presence":return Hu(n);case"escalate":return cm(n);case"remind":return um(n);case"contacts":return mm(n);case"contact-add":return fm(n);case"contact-remove":return pm(n);case"tone":return hm(n);case"check":return za(n.domain||await be(),!!n.json,n.fields);case"connect":return Ya(n.domain||await be(),t||void 0,!!n.json,n.fields);default:u(`Unknown action: ${e}`,{hint:"Actions: list, inbox, folders, archive, trash, restore, read, unread, star, unstar, spam, not-spam, decisions, sender-rules, sender-rule-add, sender-rule-remove, create, delete, send, forward, webhook, webhook-test, work, triage, notes, note, activity, changes, coordination, presence, release-presence, setup, status, check, connect",code:"validation_error",json:n.json,fields:n.fields})}}function Nr(e){let t=e.mailboxIds?.split(",").map(n=>n.trim()).filter(Boolean)[0];return(!t||!e.threadKey)&&u("Mailbox ID and thread key required",{hint:"Pass --mailbox-ids mb_1 --thread-key 'jmap:thread_1'",code:"validation_error",json:e.json,fields:e.fields}),{mailboxId:t,threadKey:e.threadKey}}async function Vu(e){let{mailboxId:t,threadKey:n}=Nr(e),i=new URLSearchParams({mailbox_id:t,thread_key:n}),s=await k(`/api/email/collaboration/coordination?${i}`),r=await s.json();if(s.ok||u(r.error||"Could not read coordination",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return b(r,e.fields);x("Conversation Coordination"),l("Conversation",r.conversation_id),l("Reply version",String(r.reply_version)),l("Presence",String(r.presence?.length||0)),l("Compose lease",r.compose_lease?.holder?.label||"none")}async function Wu(e){let{mailboxId:t,threadKey:n}=Nr(e);e.clientId||u("Client ID required",{hint:"Pass a stable --client-id for this agent process or app installation",code:"validation_error",json:e.json,fields:e.fields});let i=e.mode||"viewing";["viewing","composing"].includes(i)||u("Mode must be viewing or composing",{code:"validation_error",json:e.json,fields:e.fields});let s=await k("/api/email/collaboration/coordination",{method:"PUT",body:JSON.stringify({mailbox_id:t,thread_key:n,client_id:e.clientId,mode:i,acquire_lease:e.acquireLease!==!1})}),r=await s.json();if(s.ok||u(r.error||"Could not heartbeat presence",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return b(r,e.fields);x("Conversation Presence"),l("Mode",i),l("Reply version",String(r.reply_version)),l("Lease ID",r.compose_lease?.lease_id||"none"),l("Expires",r.compose_lease?.expires_at||r.presence?.find(o=>o.client_id===e.clientId)?.expires_at||"unknown")}async function Hu(e){let{mailboxId:t,threadKey:n}=Nr(e);e.clientId||u("Client ID required",{hint:"Pass the same --client-id used for presence",code:"validation_error",json:e.json,fields:e.fields});let i=await k("/api/email/collaboration/coordination",{method:"DELETE",body:JSON.stringify({mailbox_id:t,thread_key:n,client_id:e.clientId,lease_id:e.leaseId})}),s=await i.json();if(i.ok||u(s.error||"Could not release presence",{code:s.code||"api_error",json:e.json,fields:e.fields}),e.json)return b(s,e.fields);x("Conversation Presence"),l("Released",e.clientId),l("Remaining presence",String(s.presence?.length||0))}async function Ju(e){let t=e.mailboxIds?.split(",").map(r=>r.trim()).filter(Boolean)[0];t||u("Mailbox ID required",{hint:"Usage: domani email changes --mailbox-ids mb_1 [--cursor <opaque>]",code:"validation_error",json:e.json,fields:e.fields});let n=new URLSearchParams({mailbox_id:t});e.cursor&&n.set("cursor",e.cursor),e.limit&&n.set("limit",e.limit);let i=await k(`/api/email/changes?${n}`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);if(x("Mailbox Changes"),s.requires_full_sync){l("Full sync","Required"),l("Baseline cursor",s.next_cursor),de("Take a bounded mailbox snapshot, then call this command again with --cursor to replay concurrent changes.");return}s.changes.length?J(["Sequence","Type","Resource","Created"],s.changes.map(r=>[r.sequence,r.type,`${r.resource_type}:${r.resource_id||"-"}`,r.created_at]),[12,32,40,24]):console.log(` ${T.default.dim("No changes since this cursor.")}`),l("Next cursor",s.next_cursor),s.has_more&&de("More changes are available; call again with the next cursor.")}function Gi(e){return(e||"").split(",").map(t=>t.trim()).filter(Boolean)}async function Bu(e,t){let n=(t.query||(e&&!e.includes("@")?e:void 0)||"").trim();n||u("Query required",{hint:'Usage: domani email search "the invoice from tucows" [--from hi@myapp.dev] [--mode hybrid|semantic|keyword] [--limit 10] [--label billing]',code:"validation_error",json:t.json,fields:t.fields});let i=new URLSearchParams({q:n});t.mode&&i.set("mode",t.mode),t.limit&&i.set("limit",t.limit),t.slug&&t.domain&&i.set("mailbox",`${t.slug}@${t.domain}`),t.folder&&i.set("folder",t.folder),t.since&&i.set("since",t.since),t.until&&i.set("until",t.until),t.label&&i.set("label",t.label);let s=await k(`/api/emails/search?${i}`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);if(x(`Search: ${n}`),!r.results.length){console.log(` ${T.default.dim(r.hint||"No mail matches this search.")}`);return}J(["Why","From","Subject","Mailbox","Message"],r.results.map(o=>[o.why,o.message.from.slice(0,28),(o.message.subject||"").slice(0,44),o.message.mailbox.slice(0,28),o.message.id]),[8,30,46,30,28]),de(`${r.results.length} result${r.results.length===1?"":"s"} in ${r.took_ms} ms, mode ${r.mode}. Open one with: domani email thread <thread_id> --from <mailbox>`)}async function Gu(e){let{address:t}=At(e,"Usage: domani email threads --from hi@myapp.dev [--folder inbox] [--since <iso>] [--limit 25] [--cursor <cursor>] [--label billing]"),n=new URLSearchParams;e.folder&&n.set("folder",e.folder),e.since&&n.set("since",e.since),e.limit&&n.set("limit",e.limit),e.cursor&&n.set("cursor",e.cursor),e.label&&n.set("label",e.label);let i=n.toString(),s=await k(`/api/emails/${encodeURIComponent(t)}/threads${i?`?${i}`:""}`),r=await s.json();if(s.ok||u(r.error||r.message,{code:r.code,hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json)return b(r,e.fields);if(x(`Threads in ${t}`),!r.threads.length){console.log(` ${T.default.dim("No conversations here.")}`);return}J(["Messages","Unread","Subject","With","Last","Thread"],r.threads.map(o=>[String(o.message_count),String(o.unread_count),(o.subject||"").slice(0,40),o.participants.filter(a=>a!==t).join(", ").slice(0,30),o.last_message_at.slice(0,16),o.id]),[9,7,42,32,17,28]),r.next_cursor&&l("Next cursor",r.next_cursor)}async function Ku(e,t){let n=t.threadId||(e&&!e.includes("@")?e:void 0),{address:i}=At(t,"Usage: domani email thread <thread_id> --from hi@myapp.dev");n||u("Thread ID required",{hint:"Usage: domani email thread <thread_id> --from hi@myapp.dev",code:"validation_error",json:t.json,fields:t.fields});let s=await k(`/api/emails/${encodeURIComponent(i)}/threads/${encodeURIComponent(n)}`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);x(r.subject||"Conversation"),l("Messages",String(r.message_count)),l("Unread",String(r.unread_count)),l("With",r.participants.join(", "));for(let o of r.messages)console.log(`
|
|
179
|
-
${T.default.bold(o.direction==="out"?"\u2192":"\u2190")} ${o.from} ${T.default.dim(o.created_at.slice(0,16))}${o.labels?.length?` ${T.default.dim(`[${o.labels.join(", ")}]`)}`:""} ${T.default.dim(o.id)}`),o.text&&console.log(` ${o.text.replace(/\s+/g," ").trim().slice(0,300)}`)}function Za(e){return e&&!e.includes("@")?e:void 0}async function zu(e,t){let n=Za(e),{address:i}=At(t,"Usage: domani email draft <draft_id> --from hi@myapp.dev");n||u("Draft ID required",{hint:"Usage: domani email draft <draft_id> --from hi@myapp.dev",code:"validation_error",json:t.json,fields:t.fields});let s=await k(`/api/emails/${encodeURIComponent(i)}/drafts/${encodeURIComponent(n)}`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);
|
|
180
|
-
${r.text.replace(/\s+/g," ").trim().slice(0,500)}`)}async function Yu(e){let{address:t}=At(e,"Usage: domani email label --from hi@myapp.dev --message-ids m1,m2 --add billing[,urgent] [--remove old] | --set a,b"),n=Gi(e.messageIds),i=Gi(e.add),s=Gi(e.remove),r=e.set===void 0?void 0:Gi(e.set);(!n.length||!i.length&&!s.length&&r===void 0)&&u("Message IDs and labels required",{hint:"Usage: domani email label --from hi@myapp.dev --message-ids m1,m2 --add billing[,urgent] [--remove old] | --set a,b",code:"validation_error",json:e.json,fields:e.fields});let o={message_ids:n,action:"label",idempotency_key:e.idempotencyKey||(0,Pr.randomUUID)()};i.length&&(o.add=i),s.length&&(o.remove=s),r!==void 0&&(o.set=r);let a=await k(`/api/emails/${encodeURIComponent(t)}/messages/actions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}),d=await a.json();if(a.ok||u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields}),e.json)return b(d,e.fields);let m=d.results||[];x("Labels"),J(["Message","Result"],m.map(f=>[f.message_id,f.ok?f.changed?"updated":"unchanged":f.error?.message||"failed"]),[30,40])}async function Xu(e,t){let n=t.messageIds||(e&&!e.includes("@")?e:void 0),{address:i}=At(t,"Usage: domani email facts <message_id> --from hi@myapp.dev");n||u("Message ID required",{hint:"Usage: domani email facts <message_id> --from hi@myapp.dev",code:"validation_error",json:t.json,fields:t.fields});let s=await k(`/api/emails/${encodeURIComponent(i)}/messages/${encodeURIComponent(n)}/facts`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);if(x("Facts"),!r.analysed){l("Analysed","no"),l("Reason",r.reason),de(r.reason==="not_enabled"?"Enable the mailbox in the assistant: domani assistant set --enable --mailboxes <id>":"The analysis has not happened yet; try again in a minute.");return}l("Analysis",`${r.analysis.id} (${r.analysis.generated_at.slice(0,16)}, ${r.analysis.coverage})`),r.facts.length?J(["Subject","Predicate","Value","Basis"],r.facts.map(o=>[(o.subject||"").slice(0,28),(o.predicate||"").slice(0,28),`${o.value?.value??o.object??""}${o.value?.currency?` ${o.value.currency}`:""}`.slice(0,32),o.basis||""]),[30,30,34,18]):console.log(` ${T.default.dim("No claim recorded.")}`);for(let o of r.commitments)l("Promised",`${o.who}: ${o.what}`);for(let o of r.expectations)l("Awaited",`${o.who}: ${o.what}`)}async function Zu(e,t){let n=t.messageIds||(e&&!e.includes("@")?e:void 0),i=`Usage: domani email extract <message_id> --from hi@myapp.dev --schema '{"type":"object","properties":{"total":{"type":"number"}}}' [--instructions "amounts in EUR"] (or --schema @fields.json)`,{address:s}=At(t,i);(!n||!t.schema)&&u("Message ID and --schema required",{hint:i,code:"validation_error",json:t.json,fields:t.fields});let r;try{let d=t.schema.startsWith("@")?(0,Xa.readFileSync)(t.schema.slice(1),"utf8"):t.schema;r=JSON.parse(d)}catch(d){u("Schema must be JSON (inline or @file)",{hint:d instanceof Error?d.message:String(d),code:"validation_error",json:t.json,fields:t.fields})}let o=await k(`/api/emails/${encodeURIComponent(s)}/messages/${encodeURIComponent(n)}/extract`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({schema:r,...t.instructions?{instructions:t.instructions}:{}})}),a=await o.json();if(o.ok||u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields}),t.json)return b(a,t.fields);x("Extraction"),l("Confidence",String(a.confidence)),l("Cached",a.cached?"yes":"no"),l("Model",a.model);for(let[d,m]of Object.entries(a.data))l(d,m===null?T.default.dim("null"):typeof m=="object"?JSON.stringify(m):String(m));for(let d of a.evidence_quotes)console.log(` ${T.default.dim(`"${d.slice(0,120)}"`)}`)}async function Qu(e){let t=(e.mailboxIds||"").split(",").map(r=>r.trim()).filter(Boolean);t.length||u("Mailbox IDs required",{hint:"Usage: domani email work --mailbox-ids mb_1,mb_2",code:"validation_error",json:e.json,fields:e.fields});let n=new URLSearchParams({mailbox_ids:t.join(",")});e.status&&n.set("status",e.status),e.assigned&&n.set("assigned",e.assigned),e.limit&&n.set("limit",e.limit);let i=await k(`/api/email/work-queue?${n}`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);if(x("Shared Inbox Work"),!s.items.length)return console.log(` ${T.default.dim("No conversations match this queue.")}`);J(["Thread","Status","Assignee","Subject"],s.items.map(r=>[r.thread_key,r.status,r.assignee?.label||"Unassigned",r.subject||"(no subject)"]),[28,10,28,48]),s.partial&&de("This is a bounded snapshot. Increase --limit or use the API scan_limit when you need a wider queue.")}async function em(e){(!e.mailboxIds||!e.threadKey)&&u("Mailbox ID and thread key required",{hint:"Usage: domani email triage --mailbox-ids mb_1 --thread-key <key> --status closed",code:"validation_error",json:e.json,fields:e.fields});let t=e.assigneeId&&e.assigneeType?{type:e.assigneeType,id:e.assigneeId}:void 0,n=await k("/api/email/collaboration",{method:"PATCH",body:JSON.stringify({mailbox_id:e.mailboxIds.split(",")[0],thread_key:e.threadKey,thread_aliases:e.threadAliases?.split(",").map(s=>s.trim()).filter(Boolean),status:e.status,assignee:t,version:e.ifVersion?Number.parseInt(e.ifVersion,10):void 0})}),i=await n.json();if(n.ok||u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields}),e.json)return b(i,e.fields);x("Conversation Updated"),l("Status",i.status),l("Assignee",i.assignee?.label||"Unassigned"),l("Version",i.version)}async function tm(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 k(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/notes`,{method:"POST",body:JSON.stringify({body:e.note})}),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);console.log(`${y.success} Private note added`)}async function nm(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 k(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/notes`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);if(x("Private Notes"),!n.notes.length)return console.log(` ${T.default.dim("No private notes yet.")}`);J(["Author","Created","Note"],n.notes.map(i=>[i.author.label,i.created_at,i.body]),[28,24,64])}async function im(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 k(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/activity`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);if(x("Conversation Activity"),!n.activity.length)return console.log(` ${T.default.dim("No activity yet.")}`);J(["Type","Actor","Created"],n.activity.map(i=>[i.type,i.actor.label,i.created_at]),[36,32,24])}async function sm(e){let t=await Xe(e);if(e.dryRun)return K("email_setup",{domain:t},e.json,e.fields);let n=C(!e.json);n.start(`Setting up email on ${$.domain(t)}`);let i=await k(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"POST"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Email ${s.status==="already_configured"?"already configured":"configured"}`),e.json){b(s,e.fields);return}if(s.records?.length){c(),x(`Email DNS Records ${$.domain(t)}`);let r=s.records.map(o=>[T.default.yellow(o.type),o.name,o.value.length>40?o.value.slice(0,40)+"...":o.value,o.status==="verified"||o.status==="created"?T.default.green(o.status):T.default.yellow(o.status)]);J(["Type","Name","Value","Status"],r,[8,28,44,12])}c(),s.hint&&de(s.hint),R("Check status:",`domani email status --domain ${t}`),c()}async function rm(e){let t=await Xe(e),n=C(!e.json);n.start(`Checking email status for ${$.domain(t)}`);let i=await k(`/api/domains/${encodeURIComponent(t)}/email/status`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Status loaded`),e.json){b(s,e.fields);return}if(x(`Email ${$.domain(t)}`),l("Enabled",s.enabled?T.default.green("yes"):T.default.dim("no")),s.enabled&&(l("Verified",s.verified?T.default.green("yes"):T.default.yellow("pending")),l("Mailboxes",String(s.mailbox_count))),c(),!s.enabled)R("Set up email:",`domani email setup --domain ${t}`),c();else if(!s.verified&&s.records?.length){console.log(` ${T.default.yellow("!")} Add these DNS records to verify:`);for(let r of s.records)console.log(` ${T.default.yellow(r.type)} ${r.name} ${T.default.dim("\u2192")} ${r.value.length>50?r.value.slice(0,50)+"...":r.value}`);c()}}async function om(e){let t=await Xe(e);if(e.dryRun)return K("email_remove",{domain:t},e.json,e.fields);let n=C(!e.json);n.start(`Removing email from ${$.domain(t)}`);let i=await k(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"DELETE"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Email disabled`),e.json){b(s,e.fields);return}s.mailboxes_deleted>0&&console.log(` ${T.default.dim(`${s.mailboxes_deleted} mailbox(es) deleted.`)}`),c()}async function Ka(e){let t=C(!e.json);t.start("Loading mailboxes");let n=e.domain?`?domain=${encodeURIComponent(e.domain)}`:"",i=await k(`/api/emails${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.mailboxes||[];if(t.stop(`${y.success} ${r.length} mailbox(es)`),e.json){b(s,e.fields);return}if(r.length===0){c(),console.log(` ${T.default.dim("No mailboxes.")}`),c(),R("Create one:","domani email create hello@example.com"),c();return}c(),x("Mailboxes");let o=r.map(a=>[T.default.cyan(a.address),String(a.message_count),a.webhook_url?$.url(a.webhook_url):T.default.dim("-"),T.default.dim(new Date(a.created_at).toLocaleDateString())]);J(["Address","Messages","Webhook","Created"],o,[32,10,36,14]),c()}async function am(e){let t=await Xe(e);if(e.dryRun)return K("email_create_mailbox",{domain:t,slug:e.slug,workspace_id:e.workspace},e.json,e.fields);let n=e.slug;if(!n&&!e.json){let m=await Ue({message:`Email handle for @${t}:`,placeholder:"hello"});ae(m)&&process.exit(0),n=m}n||u("Slug required",{hint:`Usage: domani email create hello@${t}`,code:"validation_error",json:e.json,fields:e.fields});let i=`${n}@${t}`,s=C(!e.json);s.start("Creating mailbox");let r=await k("/api/emails",{method:"POST",body:JSON.stringify({address:i,workspace_id:e.workspace})}),o=await r.json();if(r.status===202&&!e.json){s.stop("");let m=o.txt_record,f=o.email_records||[],p=[{type:"TXT",name:m?.name||"@",value:m?.value||"",note:"ownership proof"},...f];c(),console.log(" Add these records at your DNS provider:"),c();for(let O of p){let j=O.priority!==void 0?` ${T.default.dim(`priority: ${O.priority}`)}`:"",I=O.note?` ${T.default.dim(`(${O.note})`)}`:"";console.log(` ${T.default.yellow(O.type)} ${T.default.bold(O.name)}${j}${I}`),console.log(` ${T.default.dim("\u2192")} ${T.default.cyan(O.value)}`),c()}de("DNS propagation typically takes 5-30 minutes. Checking automatically..."),c();let g=p.map(O=>({cells:[T.default.yellow(O.type),O.name,O.note?T.default.dim(`(${O.note})`):""],status:"pending"})),_=nn(["Type","Name",""],g,[6,24,16]);_.start();let v=0;for(;r.status===202&&v<60;)await Rt(15e3),v++,r=await k("/api/emails",{method:"POST",body:JSON.stringify({address:i,workspace_id:e.workspace})}),o=await r.json(),r.status!==202&&!r.ok&&(_.stop(),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));r.status===202&&(_.stop(),u("TXT record not detected after 15 minutes.",{hint:`Check the record is set, then retry: domani email create ${i}`,code:"timeout",json:e.json,fields:e.fields})),_.markDone(0);let w=O=>`${O.type}:${O.name}`,S=new Map;p.slice(1).forEach((O,j)=>S.set(w(O),j+1));for(let O=0;O<60;O++){await Rt(15e3);let j=await k(`/api/domains/${encodeURIComponent(t)}/email/status`),I=await j.json();if(j.ok&&I.records){for(let M of I.records)if(M.status==="verified"||M.status==="created"){let F=S.get(w(M));F!==void 0&&_.markDone(F)}}if(j.ok&&I.verified)break}_.stop(),c()}if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),s.stop(`${y.success} ${T.default.cyan(o.address)} created`),e.json){b(o,e.fields);return}let a=await k(`/api/domains/${encodeURIComponent(t)}/email/status`),d=await a.json();c(),a.ok&&d.verified?(R("Read inbox:",`domani email inbox ${o.address}`),R("Web inbox:",`${In}/inbox?address=${encodeURIComponent(o.address)}`)):(R("Check propagation:",`domani email status --domain ${t}`),R("Web inbox:",`${In}/inbox?address=${encodeURIComponent(o.address)}`)),c()}async function dm(e){let t=await Xe(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 K("email_delete_mailbox",{domain:t,address:`${e.slug}@${t}`},e.json,e.fields);let n=C(!e.json);n.start(`Deleting ${e.slug}@${t}`);let i=encodeURIComponent(`${e.slug}@${t}`),s=await k(`/api/emails/${i}`,{method:"DELETE",body:JSON.stringify({confirm:!0})}),r=await s.json();if(s.ok||(n.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Mailbox deleted`),e.json){b(r,e.fields);return}console.log(` ${T.default.dim(`${r.address} and all messages deleted.`)}`),c()}function Qa(){let e=Intl.DateTimeFormat().resolvedOptions();return{locale:e.locale,timeZone:e.timeZone}}function ed(e){let t={to:zi(Ki(e.to))},n=zi(Ki(e.cc)),i=zi(Ki(e.bcc));if(n&&(t.cc=n),i&&(t.bcc=i),e.subject&&(t.subject=e.subject),e.text&&(t.text=e.text),e.inReplyTo)if(t.in_reply_to=e.inReplyTo,e.quote!==!1){let{locale:s,timeZone:r}=Qa();t.quote_original={locale:s,time_zone:r}}else t.quote_original=!1;return e.references&&(t.references=e.references),e.sendAt&&(t.send_at=e.sendAt),t}async function lm(e){let t=await Xe(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 K("email_send",{from:`${e.slug}@${t}`,to:e.to,subject:e.subject},e.json,e.fields);let n=C(!e.json);n.start(`Sending from ${e.slug}@${t}`);let i=ed(e),s=encodeURIComponent(`${e.slug}@${t}`),r=await k(`/api/emails/${s}/send`,{method:"POST",body:JSON.stringify(i)}),o=await r.json();if(!r.ok){n.stop("Failed");let d=o.code==="MONTHLY_LIMIT_EXCEEDED"?`Run ${T.default.cyan("domani upgrade")} to switch to Pro (10,000 emails/month).`:o.hint;u(o.error||o.message,{hint:d,status:r.status,json:e.json,fields:e.fields})}let a=Array.isArray(o.to)?o.to.join(", "):o.to;if(n.stop(o.status==="scheduled"?`${y.success} Scheduled for ${T.default.cyan(e.sendAt||"")} to ${T.default.cyan(a)} ${T.default.dim("(trash the message before then to cancel)")}`:`${y.success} Sent to ${T.default.cyan(a)}`),e.json){b(o,e.fields);return}}function At(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 td(e,t,n,i,s){let r=C(!n.json);r.start(i);let o=await k(e,{method:"POST",body:JSON.stringify(t)}),a=await o.json();o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:n.json,fields:n.fields})),r.stop(s(a)),n.json&&b(a,n.fields)}async function cm(e){let t='Usage: domani email escalate hello@example.com --message-id MSG_ID [--reason "refund over $500"] [--clear]',{address:n}=At(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let i={};e.reason&&(i.reason=e.reason),e.clear&&(i.clear=!0),await td(`/api/emails/${encodeURIComponent(n)}/messages/${encodeURIComponent(e.messageId)}/escalate`,i,e,e.clear?"Clearing escalation":"Flagging for a human",s=>s.needs_human?`${y.success} Flagged for a human ${T.default.dim("(conversation held, email.escalated fired)")}`:`${y.success} Escalation cleared`)}async function um(e){let t='Usage: domani email remind hello@example.com --message-id MSG_ID --at 2026-09-03T09:00:00Z [--note "chase the invoice"] [--clear]',{address:n}=At(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields}),!e.at&&!e.clear&&u("Reminder time required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let i={};e.at&&(i.remind_at=e.at),e.note&&(i.note=e.note),e.clear&&(i.clear=!0),await td(`/api/emails/${encodeURIComponent(n)}/messages/${encodeURIComponent(e.messageId)}/remind`,i,e,e.clear?"Clearing reminder":"Setting follow-up reminder",s=>s.remind_at?`${y.success} Reminder set for ${T.default.cyan(String(s.remind_at))} ${T.default.dim("(fires only if still unanswered)")}`:`${y.success} Reminder cleared`)}function nd(e){let t=new URLSearchParams;e.q&&t.set("q",e.q),e.limit&&t.set("limit",e.limit),e.order&&t.set("order",e.order),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function mm(e){let t=await k(`/api/contacts${nd(e)}`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json){b(n,e.fields);return}let i=n.contacts||[];if(i.length===0){console.log(T.default.dim("No contacts yet. The address book fills itself as mail flows in and out."));return}for(let s of i){let r=s.name?` ${T.default.dim(s.name)}`:"",o=s.notes?` ${T.default.dim("-")} ${s.notes}`:"";console.log(`${T.default.cyan(s.address)}${r} ${T.default.dim(`(${s.message_count} msg${s.message_count!==1?"s":""}, last ${s.last_direction||"-"})`)}${o}`)}n.next_cursor&&console.log(T.default.dim(`More: --cursor ${n.next_cursor}`))}function id(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 fm(e){let n=id(e,'Usage: domani email contact-add ada@example.com [--name "Ada"] [--notes "prefers short emails"]'),i={address:n};e.name!==void 0&&(i.name=e.name),e.notes!==void 0&&(i.notes=e.notes);let s=await k("/api/contacts",{method:"POST",body:JSON.stringify(i)}),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json){b(r,e.fields);return}console.log(`${y.success} Contact ${T.default.cyan(n)} saved.`)}async function pm(e){let n=id(e,"Usage: domani email contact-remove ada@example.com"),i=await k(`/api/contacts/${encodeURIComponent(n)}`,{method:"DELETE"}),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json){b(s,e.fields);return}console.log(s.deleted?`${y.success} Contact ${T.default.cyan(n)} deleted.`:T.default.dim(`No contact ${n}.`))}async function hm(e){let t='Usage: domani email tone hello@example.com [--set "lowercase, friendly, sign as Ada"] [--clear]',{address:n}=At(e,t),i=encodeURIComponent(n);if(e.set===void 0&&!e.clear){let o=await k(`/api/emails/${i}`),a=await o.json();if(o.ok||u(a.error||a.message,{hint:a.hint,status:o.status,json:e.json,fields:e.fields}),e.json){b({address:n,tone_notes:a.tone_notes??null},e.fields);return}console.log(a.tone_notes?a.tone_notes:T.default.dim(`No tone notes on ${n}. Set them with --set.`));return}let s=await k(`/api/emails/${i}`,{method:"PATCH",body:JSON.stringify({tone_notes:e.clear?null:e.set})}),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json){b(r,e.fields);return}console.log(e.clear?`${y.success} Tone notes cleared on ${T.default.cyan(n)}.`:`${y.success} Tone notes set on ${T.default.cyan(n)}.`)}function sd(e){let t=new URLSearchParams;e.direction&&t.set("direction",e.direction),e.folder&&t.set("folder",e.folder),e.view&&t.set("view",e.view),e.limit&&t.set("limit",e.limit),e.since&&t.set("since",e.since),e.until&&t.set("until",e.until),e.label&&t.set("label",e.label),e.kind&&t.set("kind",e.kind),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function gm(e){let t=await Xe(e);e.slug||u("Slug required",{hint:"Usage: domani email inbox hello@example.com [--direction in|out] [--kind person,update] [--limit 20] [--cursor <next_cursor>]",code:"validation_error",json:e.json,fields:e.fields});let n=sd(e),i=C(!e.json);i.start(`Loading messages for ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),r=await k(`/api/emails/${s}/messages${n}`),o=await r.json();r.ok||(i.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));let a=o.messages||[];if(e.json){i.stop(`${y.success} ${a.length} message(s)`),b(o,e.fields);return}if(a.length===0){i.stop(`${T.default.dim("No messages")}`);return}let d=a.length>1?"s":"";i.stop(`${y.success} ${T.default.cyan(`${e.slug}@${t}`)} ${T.default.dim("\xB7 "+a.length+" message"+d)}`);for(let m of a){let f=m.direction==="in"?`${T.default.green("in ")}${m.kind?` ${T.default.dim(m.kind.padEnd(10))}`:""}`:T.default.dim("out"),p=m.direction==="in"?m.from:m.to,g=m.subject||"(no subject)",_=T.default.dim(new Date(m.created_at).toLocaleString()),v=g;if(m.text){let w=m.text.replace(/\s+/g," ").trim(),S=w.length>60?w.slice(0,60)+"\u2026":w;v=`${g} ${T.default.dim("- "+S)}`}console.log(` ${f} ${p.padEnd(30)} ${v} ${_}`)}o.next_cursor&&console.log(T.default.dim(`More: --cursor ${o.next_cursor}`))}async function ym(e){let t=await Xe(e);e.slug||u("Slug required",{hint:"Usage: domani email folders hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=encodeURIComponent(`${e.slug}@${t}`),i=await k(`/api/emails/${n}/folders`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);x(`Folders for ${e.slug}@${t}`);for(let r of s.folders||[])l(r.id,`${r.total} total, ${r.unread} unread`);for(let r of s.views||[])l(r.id,`${r.total} total, ${r.unread} unread`)}async function bm(e){let t=await Xe(e);e.slug||u("Slug required",{hint:"Usage: domani email drafts hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=encodeURIComponent(`${e.slug}@${t}`),i=await k(`/api/emails/${n}/drafts`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);x(`Drafts from ${e.slug}@${t}`);let r=s.drafts||[];if(!r.length){console.log(` ${T.default.dim("No drafts.")}`);return}for(let o of r){let a=o.to.map(p=>p.address).join(", "),d=o.subject||"(no subject)",m=(o.text||"").replace(/\s+/g," ").trim(),f=m.length>60?m.slice(0,60)+"\u2026":m;console.log(` ${T.default.dim(o.updated_at.slice(0,16))} ${a.padEnd(30)} ${d}${f?T.default.dim(" - "+f):""} ${T.default.dim(o.id)}`)}}async function wm(e,t){let n=await Xe(t);t.slug||u("Slug required",{hint:`Usage: domani email ${e} hello@example.com --message-ids id1,id2`,code:"validation_error",json:t.json,fields:t.fields});let i=(t.messageIds||"").split(",").map(f=>f.trim()).filter(Boolean);i.length||u("Message IDs required",{hint:"Pass --message-ids id1,id2",code:"validation_error",json:t.json,fields:t.fields});let s={message_ids:i,idempotency_key:t.idempotencyKey||(0,Pr.randomUUID)()};if((e==="archive"||e==="trash")&&Object.assign(s,{action:"move",destination:e==="archive"?"archive":"trash"}),e==="restore"&&(s.action="restore"),(e==="read"||e==="unread")&&Object.assign(s,{action:"mark_read",read:e==="read"}),(e==="star"||e==="unstar")&&Object.assign(s,{action:"star",starred:e==="star"}),t.dryRun)return K("email_messages_action",{address:`${t.slug}@${n}`,...s},t.json,t.fields);let r=encodeURIComponent(`${t.slug}@${n}`),o=await k(`/api/emails/${r}/messages/actions`,{method:"POST",body:JSON.stringify(s)}),a=await o.json();if(!o.ok&&o.status!==207&&u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields}),t.json)return b(a,t.fields);let d=(a.results||[]).filter(f=>f.ok).length,m=(a.results||[]).length-d;console.log(`${y.success} ${d} updated${m?T.default.yellow(`, ${m} failed`):""}`),a.operation_id&&(l("Operation",a.operation_id),l("Idempotency key",a.idempotency_key),a.idempotent_replay&&l("Receipt","replayed (no duplicate mutation)"))}async function $m(e){let t=await Xe(e);e.slug||u("Slug required",{hint:"Usage: domani email webhook hello@example.com --url https://...",code:"validation_error",json:e.json,fields:e.fields});let n=`${e.slug}@${t}`,i=encodeURIComponent(n),s;try{s=rn(e)}catch(a){u(a instanceof Error?a.message:"Invalid webhook headers",{hint:"Set the named environment variable, or remove the conflicting header option.",code:"validation_error",json:e.json,fields:e.fields})}let r;if(e.events!==void 0&&(r=e.events.split(",").map(a=>a.trim()).filter(Boolean),r.length===0&&u("--events needs at least one event",{hint:"Example: --events email.received,email.bounced,email.delivered",code:"validation_error",json:e.json,fields:e.fields}),e.url||u("--url is required when changing webhook events",{hint:"Pass the existing webhook URL together with --events.",code:"validation_error",json:e.json,fields:e.fields})),!e.url&&s!==void 0&&u("--url is required when changing webhook auth headers",{hint:"Pass the existing webhook URL with --authorization-env, --api-key-env, or --clear-headers.",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return K("email_webhook",{address:n,webhook_url:e.url||null,...r!==void 0?{events:r}:{},...s!==void 0?{header_names:on(s)}:{}},e.json,e.fields);let o=C(!e.json);if(e.url){o.start(`Setting webhook for ${n}`);let a=await k(`/api/emails/${i}/webhook`,{method:"PUT",body:JSON.stringify({url:e.url,...s!==void 0?{headers:s}:{},...r!==void 0?{events:r}:{}})}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${y.success} Webhook set`),e.json){b(d,e.fields);return}x(`Mailbox ${d.address}`),l("Webhook",$.url(d.webhook_url)),l("Events",d.events?.join(", ")||T.default.dim("email.received")),l("Auth headers",d.header_names?.join(", ")||T.default.dim("none")),l("Signing secret",T.default.dim(d.signing_secret)),c()}else{o.start(`Removing webhook for ${n}`);let a=await k(`/api/emails/${i}/webhook`,{method:"DELETE"}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${y.success} Webhook removed`),e.json){b(d,e.fields);return}x(`Mailbox ${d.address}`),l("Webhook",T.default.dim("none")),c()}}async function vm(e){let t=await Xe(e);e.slug||u("Slug required",{hint:"Usage: domani email webhook-test hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=`${e.slug}@${t}`;if(e.dryRun)return K("email_webhook_test",{address:n},e.json,e.fields);let i=C(!e.json);i.start(`Testing webhook for ${n}`);let s=await k(`/api/emails/${encodeURIComponent(n)}/webhook/test`,{method:"POST"}),r=await s.json();if((!s.ok||!r.success)&&(i.stop("Failed"),u(r.error||r.message||"Webhook test failed",{hint:r.hint||"Check the endpoint and sender authentication, then retry.",status:s.status,json:e.json,fields:e.fields})),i.stop(`${y.success} Test delivered`),e.json)return b(r,e.fields);x(`Mailbox ${n}`),l("Delivery",T.default.green("successful")),typeof r.status=="number"&&l("Endpoint",`HTTP ${r.status}`),c()}async function _m(e){let t=await Xe(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 K("email_forward",{address:`${e.slug}@${t}`,forward_to:e.forwardTo||null},e.json,e.fields);let n=C(!e.json),i=e.forwardTo||null;n.start(`Updating forward for ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),r=await k(`/api/emails/${s}`,{method:"PATCH",body:JSON.stringify({forward_to:i})}),o=await r.json();if(r.ok||(n.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Forward ${i?"set":"removed"}`),e.json){b(o,e.fields);return}x(`Mailbox ${o.address}`),l("Forward to",o.forward_to?T.default.cyan(o.forward_to):T.default.dim("none")),c()}async function za(e,t,n){let i=C(!t);i.start(`Checking email health for ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}/email/check`),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop("Email health checked"),t){b(r,n);return}if(x(`Email Health ${$.domain(r.domain)}`),r.provider?l("Provider",T.default.cyan(Dr(r.provider))):l("Provider",T.default.dim("unknown")),r.mx.configured?l("MX",`${y.success} ${T.default.green("propagated")} ${T.default.dim(`(${r.mx.records.length} record${r.mx.records.length!==1?"s":""})`)}`):l("MX",`${y.error} ${T.default.red("not configured")}`),r.spf.configured?l("SPF",`${y.success} ${T.default.green(r.spf.value)}`):l("SPF",`${y.error} ${T.default.red("missing")}`),r.dmarc.configured){let o=r.dmarc.value.length>50?r.dmarc.value.slice(0,50)+"...":r.dmarc.value;l("DMARC",`${y.success} ${T.default.green(o)}`)}else l("DMARC",`${y.error} ${T.default.red("missing")}`);r.dkim.configured?l("DKIM",`${y.success} ${T.default.green("found")} ${T.default.dim(`(${r.dkim.selectors.join(", ")})`)}`):l("DKIM",`${y.warning} ${T.default.yellow("not found")}`),c(),r.mx.configured?(!r.spf.configured||!r.dmarc.configured)&&(de("SPF and DMARC protect against email spoofing. Re-run email setup to add them."),c()):(R("Set up email:",`domani email ${e} google`),c())}async function Ya(e,t,n,i){return t?od(e,t,n,i):rd(e,n,i)}async function rd(e,t,n){let i=C(!t);i.start("Loading email providers");let s=await k(`/api/domains/${encodeURIComponent(e)}/connect`),r=await s.json();s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop("Providers loaded");let o=r.providers?.email||[];o.length===0&&u("No email providers available",{code:"not_found",json:t,fields:n});let a=await dt({message:"Choose an email provider",options:o.map(d=>({value:d.name,label:Dr(d.name)}))});return ae(a)&&process.exit(0),od(e,a,t,n)}async function od(e,t,n,i){if(n){let m=await k(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),f=await m.json();m.ok||u(f.error||f.message,{hint:f.hint,status:m.status,json:n,fields:i}),b(f,i);return}let s=await k(`/api/domains/${encodeURIComponent(e)}/connect?provider=${encodeURIComponent(t)}`);if(!s.ok){let m=await s.json();u(m.error||m.message,{hint:m.hint,status:s.status,json:n,fields:i})}let r=await s.json(),o=r.preview?.records??[],a=r.preview?.provider??t,d=Dr(a);if(x(`Email ${$.domain(e)}`),l("Provider",T.default.cyan(d)),o.length){c(),console.log(` ${T.default.bold("DNS Records")}`);let m=[8,24,40],f=nn(["Type","Name","Value"],o.map(O=>({cells:Fu(O),status:"pending"})),m);f.start();let p=await k(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),g=await p.json();p.ok||(f.stop(),c(),u(g.error||g.message,{hint:g.hint,status:p.status,json:n,fields:i}));let _=g.records||[];for(let O=0;O<o.length;O++)_.find(I=>I.record.type===o[O].type&&I.record.name===o[O].name&&I.record.value===o[O].value)?.status==="already_set"||await Rt(60),f.markDone(O);await Rt(80),f.stop();let v=_.filter(O=>O.status==="created"||O.status==="updated").length,w=_.filter(O=>O.status==="already_set").length,S;w===_.length?S=`All ${w} records already set`:w>0?S=`${v} created, ${w} already set`:S=`${v} DNS records set`,c(),console.log(` ${y.success} ${T.default.green(`Email configured - ${S}`)}`)}else{let m=C(!0);m.start("Setting DNS records");let f=await k(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),p=await f.json();f.ok||(m.stop("Failed"),u(p.error||p.message,{hint:p.hint,status:f.status,json:n,fields:i})),m.stop(`${y.success} Email configured via ${T.default.cyan(d)}`)}c(),R("Verify propagation:",`domani email ${e} --check`),c()}var T,Pr,Xa,qu,Mu,Ur=$e(()=>{"use strict";G();An();T=D(L(),1);qe();V();ve();it();Pr=require("node:crypto"),Xa=require("node:fs");Hi();Tr();Ga();qu=["setup","status","remove","list","create","delete","send","inbox","folders","drafts","draft","archive","trash","restore","read","unread","star","unstar","webhook","forward","check","connect","work","triage","notes","note","activity","changes","coordination","presence","release-presence","escalate","remind","contacts","contact-add","contact-remove","tone","search","threads","thread","label","facts","extract","spam","not-spam","decisions","sender-rules","sender-rule-add","sender-rule-remove"],Mu={"google-workspace":"Google Workspace",fastmail:"Fastmail",proton:"Proton Mail"}});var ld={};hn(ld,{dns:()=>Mr,nextDnsRecords:()=>dd});function dd(e,t,n){let i=r=>r.type===t.type&&r.name===t.name;return n==="add"&&e.some(r=>i(r)&&r.value===t.value)?{kind:"unchanged"}:n==="add"&&t.type==="CNAME"&&e.some(i)?{kind:"cname_taken"}:{kind:"write",records:[...n==="add"?e:e.filter(r=>!i(r)),{...t,ttl:3600}]}}async function Mr(e,t,n,i,s,r){e||(e=await be()),X(e,r);let o=r?.json??!1,a=r?.type||n,d=r?.name||i,m=r?.value||s;if(!t||t==="get"){let f=C(!o);f.start(`Loading DNS for ${$.domain(e)}`);let p=await k(`/api/domains/${encodeURIComponent(e)}/dns`),g=await p.json();if(p.ok||(f.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:p.status,json:o,fields:r?.fields})),f.stop(`${g.records.length} record(s)`),o){b(g,r?.fields);return}if(g.records.length===0){c(),console.log(` ${Ce.default.dim(`No DNS records for ${e}`)}`),c(),R("Auto-configure DNS:",`domani connect ${e}`),c();return}let _=[8,24,40,8];x(`DNS ${$.domain(e)}`,_.reduce((w,S)=>w+S,0)+_.length-1);let v=g.records.map(w=>{let S=w.priority?Ce.default.dim(` pri=${w.priority}`):"";return[Ce.default.yellow(w.type),w.name,Ce.default.cyan(w.value)+S,Ce.default.dim(String(w.ttl))]});J(["Type","Name","Value","TTL"],v,_),c();return}if(t==="set"||t==="add"){let f=t==="add";if((!a||!d||!m)&&u(`Missing arguments for dns ${t}`,{hint:`Usage: domani dns <domain> ${t} --type A --name www --value 1.2.3.4`,code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return K(f?"dns_add":"dns_set",{domain:e,record:{type:a.toUpperCase(),name:d,value:m,ttl:3600}},o,r?.fields);let p=C(!o);p.start(`${f?"Adding":"Setting"} ${Ce.default.yellow(a.toUpperCase())} record`);let g=await k(`/api/domains/${encodeURIComponent(e)}/dns`),_=await g.json();g.ok||(p.stop("Failed"),u(_.error||_.message||"Could not read the current DNS records; nothing was changed.",{hint:_.hint,status:g.status,json:o,fields:r?.fields}));let v=_.records??[],w=a.toUpperCase(),S=dd(v,{type:w,name:d,value:m},f?"add":"set");if(S.kind==="unchanged"){p.stop(`${y.success} ${Ce.default.yellow(w)} ${d} ${y.arrow} ${Ce.default.cyan(m)} already exists`),o&&b({records:v,unchanged:!0},r?.fields);return}S.kind==="cname_taken"&&(p.stop("Failed"),u(`${d} already has a CNAME record; a name can hold only one.`,{hint:`Replace it with: domani dns ${e} set --type CNAME --name ${d} --value ${m}`,code:"validation_error",json:o,fields:r?.fields}));let O=S.records,j=await k(`/api/domains/${encodeURIComponent(e)}/dns`,{method:"PUT",body:JSON.stringify({records:O})}),I=await j.json();j.ok||(p.stop("Failed"),u(I.error||I.message,{hint:I.hint,status:j.status,json:o,fields:r?.fields})),p.stop(`${y.success} ${Ce.default.yellow(a.toUpperCase())} ${d} ${y.arrow} ${Ce.default.cyan(m)}`),o?b(I,r?.fields):(c(),R("Check propagation:",`domani status ${e}`),c());return}if(t==="delete"){if((!a||!d)&&u("Missing arguments for dns delete",{hint:"Usage: domani dns <domain> delete --type A --name www",code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return K("dns_delete",{domain:e,record:{type:a.toUpperCase(),name:d}},o,r?.fields);let f=C(!o);f.start(`Deleting ${Ce.default.yellow(a.toUpperCase())} ${d}`);let p=await k(`/api/domains/${encodeURIComponent(e)}/dns?type=${encodeURIComponent(a.toUpperCase())}&name=${encodeURIComponent(d)}`,{method:"DELETE"}),g=await p.json();p.ok||(f.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:p.status,json:o,fields:r?.fields})),f.stop(`${y.success} Deleted ${Ce.default.yellow(a.toUpperCase())} ${d}`),o?b(g,r?.fields):(c(),R("Check propagation:",`domani status ${e}`),c());return}if(t==="snapshot"){if(r?.dryRun)return K("dns_snapshot",{domain:e},o,r?.fields);let f=C(!o);f.start(`Capturing DNS snapshot for ${$.domain(e)}`);let p=await k(`/api/domains/${encodeURIComponent(e)}/dns/snapshot`,{method:"POST"}),g=await p.json();p.ok||(f.stop("Failed"),u(g.error||g.message,{hint:g.hint,status:p.status,json:o,fields:r?.fields}));let _=g.records?.length??0;if(f.stop(`${y.success} Captured ${_} record(s)`),o){b(g,r?.fields);return}let v=`${e}.dns.json`,w=(0,qr.resolve)(process.cwd(),v);(0,Yi.writeFileSync)(w,JSON.stringify(g,null,2)+`
|
|
181
|
-
`),
|
|
182
|
-
`);o=
|
|
183
|
-
`);m=v.pop()??"";for(let w of v)if(w.startsWith("event: "))f=w.slice(7).trim();else if(w.startsWith("data: ")){let S=JSON.parse(w.slice(6));if(f==="checking")r.message(`Checking ${$.domain(S.domain)}`);else if(f==="available"&&typeof S.years=="number")r.message(`Buying ${$.domain(S.domain??e)} for ${lt(S.years)}`);else if(f==="payment")r.message(`Charging ${$.price(S.total)}`);else if(f==="registering")r.message(`Registering ${$.domain(S.domain)}`);else if(f==="registered")a=S;else if(f==="error"){let O=Vt(S);if(O!==void 0)return r.stop("Price changed - nothing was charged"),{refused:{price:O,error:S.error,renewal_price:S.renewal_price,listed_price:S.listed_price}};r.stop("Purchase failed"),Wi(S,o.status,s)}}}let p=typeof a.years=="number"?je.default.dim(` \xB7 ${lt(a.years)}`):"",g=a.expires?je.default.dim(` \xB7 expires ${new Date(a.expires).toLocaleDateString()}`):"";return r.stop(`${y.success} ${$.domain(a.domain)} is yours!${p}${g}`),{registered:a}}async function jm(e,t){X(e,t);let n=sn(t.maxPrice,t),i=jr(t),s,r=C(!t.json&&!t.preChecked);if(t.preChecked)s={available:!0,...t.preChecked};else{r.start(`Checking ${$.domain(e)}`);let g=await k(`/api/domains/search?q=${encodeURIComponent(e)}`);s=await g.json(),g.ok||(r.stop("Search failed"),u(s.error,{hint:s.hint,status:g.status,json:t.json,fields:t.fields})),s.available||(r.stop(`${y.error} ${$.domain(e)} is not available`),u(`${e} is not available`,{code:"not_available",json:t.json,fields:t.fields}))}let o=_r(e,s,i),a=Vn(s,o?void 0:i);r.stop(`${y.success} ${$.domain(e)} ${y.dot} available ${y.dot} ${je.default.green(ct(s,a))}`),o&&Sr([o],!1,t);let d=n??(a.total!==void 0?Jn(a.total):void 0);if(t.dryRun)return K("buy",{...t.json?{}:{purchase:`${e} ${$r(s,a)}`},domain:e,available:!0,price:s.price,...s.renewal_price!==void 0?{renewal_price:s.renewal_price}:{},...vr(a),currency:s.currency||"USD",max_price:d,acting_as:St()},t.json,t.fields);if(!Ct(t)){let g=await He({message:`Purchase ${je.default.bold(e)} ${je.default.green($r(s,a))}${Mt()}?`});if(!g||typeof g=="symbol"){console.log(` ${je.default.dim("Cancelled.")}`);return}}let m=g=>`Purchasing ${$.domain(e)} for ${lt(a.years)}${g!==void 0?`: ${$.price(g.toFixed(2))}`:""}`,f=await ud(e,i,d,m(a.total),t);for(;"refused"in f;){let g=await Bn(f.refused.price,d??a.total??s.price,f.refused,"Buy",t);if(g===void 0)return;d=g,f=await ud(e,i,d,m(g),t)}let p=f.registered;if(t.json){b(p,t.fields);return}Te?await Wr(p.domain):(R("Connect to a service:",`domani connect ${p.domain}`),R("Set up email:",`domani email setup ${p.domain}`),R("Configure DNS:",`domani dns ${p.domain}`),c())}async function Sm(e,t){Ca(e,t);let n=sn(t.maxPrice,t),i=jr(t),s=!!t.json,r=C(!s);r.start(`Checking ${e.length} domains`);let o=await Promise.all(e.map(async j=>{try{let I=await k(`/api/domains/search?q=${encodeURIComponent(j)}`),M=await I.json();return{domain:j,available:I.ok&&M.available,price:M.price,renewal_price:M.renewal_price,min_years:M.min_years,min_term_price:M.min_term_price}}catch{return{domain:j,available:!1,price:void 0,renewal_price:void 0}}})),a=o.filter(j=>!j.available);o.every(j=>!j.available)&&(r.stop(`${y.error} None of the ${e.length} domains are available`),process.exit(1));let d=o.filter(j=>j.available).map(j=>_r(j.domain,j,i)).filter(j=>j!==void 0);d.length>0&&(r.stop(`${y.error} ${d.length} domain${d.length>1?"s":""} cannot be registered for ${lt(i??1)}`),Sr(d,!0,t));let m=o.filter(j=>j.available).map(j=>({...j,term:Vn(j,i)})),f=Jn(m.reduce((j,I)=>j+(I.term.total??0),0)),p=m.reduce((j,I)=>j+(I.renewal_price??I.price??0),0),g=gr(f,p)?`, then ${$.price(p.toFixed(2))}/yr`:"";if(r.stop(`${y.success} ${m.length}/${e.length} available ${y.dot} ${$.price(f.toFixed(2))} total`),a.length>0)for(let j of a)console.log(` ${y.error} ${$.domain(j.domain)} ${je.default.dim("not available")}`);let _=n??(m.every(j=>j.term.total!==void 0)?f:void 0);if(t.dryRun)return K("buy_bulk",{domains:m.map(j=>({domain:j.domain,price:j.price,...j.renewal_price!==void 0?{renewal_price:j.renewal_price}:{},...vr(j.term)})),unavailable:a.map(j=>j.domain),total_price:parseFloat(f.toFixed(2)),max_price:_,acting_as:St()},t.json,t.fields);if(!Ct(t)){let j=await He({message:`Purchase ${je.default.bold(String(m.length))} domain${m.length>1?"s":""} for ${$.price(f.toFixed(2))}${Ta(m)}${g}${Mt()}?`});if(!j||typeof j=="symbol"){console.log(` ${je.default.dim("Cancelled.")}`);return}}c();let v,w;for(;;){let j=nn(["Domain","Price"],m.map(F=>({cells:[$.domain(F.domain),F.price?je.default.green(ct(F,F.term)):""],status:"pending"})),[30,12],!s);j.start(),v=await k("/api/domains/buy",{method:"POST",body:JSON.stringify({domains:m.map(F=>F.domain),...i!==void 0?{years:i}:{},..._!==void 0?{max_price:_}:{}})}),w=await v.json();let I=v.ok?void 0:Vt(w);if(I===void 0){let F=new Set((w.results||[]).map(Y=>Y.domain));for(let Y=0;Y<m.length;Y++){let U=m[Y].domain.toLowerCase().trim();j.markDone(Y,F.has(U)?y.success:y.error)}j.stop();break}for(let F=0;F<m.length;F++)j.markDone(F,je.default.dim("\xB7"));j.stop(),c();let M=await Bn(I,_??f,w,"Buy",t);if(M===void 0)return;_=M,c()}if(v.ok||Wi(w,v.status,t),s){b(w,t.fields);return}c();let S=w.summary?.succeeded??0,O=w.summary?.failed??0;if(S>0&&console.log(` ${y.success} ${je.default.green(`${S} domain${S>1?"s":""} registered`)}`),O>0){console.log(` ${y.error} ${je.default.red(`${O} failed`)}`);for(let j of w.errors||[])console.log(` ${je.default.dim("\u2500")} ${$.domain(j.domain)}: ${je.default.dim(j.error)}${j.hint?` ${je.default.dim(`(${j.hint})`)}`:""}`)}if(c(),S>0&&Te){let j=(w.results||[]).filter(I=>I.success).map(I=>I.domain);if(j.length===1)await Wr(j[0]);else{let I=await dt({message:"Set up one of your new domains?",options:[...j.map(M=>({value:M,label:je.default.cyan(M)})),{value:"done",label:"Done"}]});!ae(I)&&I!=="done"?(c(),await Wr(I)):c()}}else S>0&&(R("Connect to a service:","domani connect <domain>"),R("Set up email:","domani email setup <domain>"),c())}async function Hr(e,t){let n=e.filter(Boolean);if(n.length===0){Te||u("Missing required argument: domain(s)",{hint:"Usage: domani buy <domain> [domain2 ...]",code:"missing_argument",json:t.json});let i=await Ue({message:"Domain to purchase",placeholder:"e.g. myapp.dev (space-separated for multiple)"});(ae(i)||!i)&&process.exit(0),n=i.split(/\s+/).filter(Boolean)}return n.length===1?jm(n[0],t):Sm(n,t)}var je,kn=$e(()=>{"use strict";G();qe();je=D(L(),1);V();De();ve();Vi();br();Hn();Na()});var ho=D(po(),1),{program:Yf,createCommand:Xf,createArgument:Zf,createOption:Qf,CommanderError:ep,InvalidArgumentError:tp,InvalidOptionArgumentError:np,Command:go,Argument:ip,Option:sp,Help:rp}=ho.default;ui();var kt=D(L(),1);De();pr();V();An();De();var nt=D(L(),1);V();var mu=new Set(["cli","mcp","plugin","skill","api"]);function fu(e){let t=e.scopes?.split(",").map(o=>o.trim()).filter(Boolean),n=e.mailboxes?.split(",").map(o=>o.trim().toLowerCase()).filter(Boolean),i=!!(t?.length||n?.length||e.label||e.expiresIn),s=e.surface||"cli";if(!mu.has(s))throw new RangeError("--surface must be one of: cli, mcp, plugin, skill, api");let r=e.expiresIn===void 0?void 0:Number(e.expiresIn);if(r!==void 0&&(!Number.isInteger(r)||r<3600||r>31536e3))throw new RangeError("--expires-in must be an integer between 3600 and 31536000 seconds");return{delegated:i,body:{...t?.length?{scopes:t}:{},...n?.length?{mailboxes:n}:{},...e.label?{label:e.label}:{},...r!==void 0?{expires_in:r}:{},surface:s,intent:"programmatic_access"}}}function ba(e){return e!=="default"||rt().some(n=>n.name!==e)?` ${nt.default.dim(`(account ${e})`)}`:""}async function wa(e){let t=Ke(),n=C(!e.json),i;try{i=fu(e)}catch(_){u(_ instanceof Error?_.message:"Invalid login options",{code:"invalid_expires_in",json:e.json})}let{body:s,delegated:r}=i,o=bn(),a=As(o);if(a&&!r){n.start("Checking session");try{let _=await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${a}`}});if(_.ok){let v=await _.json();n.stop(`Already logged in as ${nt.default.bold(v.email)}${ba(o)}`),e.json&&b({status:"already_logged_in",email:v.email,account:o});return}}catch{}n.stop("Session expired, re-authenticating"),c()}n.start("Requesting auth code");let d=await fetch(`${t}/api/auth/cli`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(!d.ok){n.stop("Failed to initiate login");try{let _=await d.json();u(_.error||_.message||`Server error (${d.status})`,{hint:_.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:m,auth_url:f,expires_in:p}=await d.json();if(n.stop("Auth code received"),e.json){b({status:"awaiting_approval",code:m,auth_url:f,expires_in:p,account:o});return}c(),console.log(` ${nt.default.dim("Verification code:")} ${nt.default.bold(nt.default.cyan(m))}`),e.open!==!1?(console.log(` ${nt.default.dim("Opening browser")} ${y.arrow} ${$.url(f)}`),Ve(f)):console.log(` ${nt.default.dim("Open this URL to approve:")} ${$.url(f)}`),c(),n.start("Waiting for approval");let g=120;for(let _=0;_<g;_++){await new Promise(S=>setTimeout(S,5e3));let v=await fetch(`${t}/api/auth/cli/poll?code=${m}`);!v.ok&&v.status!==202&&(n.stop("Login failed"),u(`Server error (${v.status})`,{code:"login_failed"}));let w=await v.json();if(w.status==="complete"){bi(o,{token:w.token,email:w.email,api_url:t}),n.stop(`Logged in as ${nt.default.bold(w.email)}${ba(o)}`),c();let S=Ge().active_account;if(S&&S!==o){console.log(` ${nt.default.dim(`Commands still act as the active account "${S}".`)}`),R("Switch to this one:",`domani use ${o}`),R("Or use it once:",`domani --account ${o} me`),c();return}console.log(` ${nt.default.bold("Get one real result:")}`),R("1. Create your free inbox:","domani email create YOUR_HANDLE@domani.run"),R("2. Connect your webhook:","domani email webhook YOUR_HANDLE@domani.run --url https://YOUR_AGENT/webhook"),R("3. Prove delivery:","domani email webhook-test YOUR_HANDLE@domani.run"),console.log(` ${nt.default.dim("A custom domain can wait until this loop works.")}`),c();return}w.error&&(n.stop("Login failed"),u(w.error||w.message,{hint:w.hint,code:"login_failed"}))}n.stop("Login timed out"),u("No approval received within 10 minutes",{hint:"Run 'domani login' to try again",code:"timeout"})}De();var hr=D(L(),1);V();async function $a(e){let t=bn(),n=Co(t);if(!n){e.json?b({status:"not_logged_in",account:t}):console.log(` ${hr.default.dim(`Not logged in${t==="default"?"":` to the account "${t}"`}.`)}`);return}let i=rt().map(r=>r.name);if(e.json){b({status:"logged_out",account:t,email:n.email||null,remaining_accounts:i});return}let s=[n.email,i.length>0||t!=="default"?`account ${t}`:void 0].filter(Boolean).join(", ");console.log(` ${y.success} Logged out${s?` ${hr.default.dim(`(${s})`)}`:""}`),i.length>0&&!Ge().active_account&&R("Pick the account to use next:",`domani use ${i[0]}`)}G();De();var Ft=D(L(),1);V();async function _a(e){let[t,n]=await Promise.all([k("/api/me"),k("/api/me/activation")]),i=await t.json();t.ok||u(i.error||i.message,{hint:i.hint,status:t.status,json:e.json,fields:e.fields});let s=n.ok?await n.json():null,r=Dn(),o={name:r.name??null,source:r.source};if(e.json){b({...i,activation:s,cli_account:o},e.fields);return}if(x("Account"),l("Email",Ft.default.bold(i.email)),l("CLI account",r.source==="api_key_env"?Ft.default.dim("DOMANI_API_KEY"):`${r.name??"-"}${r.source==="flag"?Ft.default.dim(" (--account)"):r.source==="env"?Ft.default.dim(" (DOMANI_ACCOUNT)"):""}`),l("Payment",i.has_payment_method?`${y.success} ${Ft.default.green("active")}`:`${y.error} ${Ft.default.dim("none")}`),l("Domains",String(i.domain_count)),l("API tokens",String(i.token_count)),l("Referral code",i.referral_code||Ft.default.dim("-")),l("Created",new Date(i.created_at).toLocaleDateString()),s){l("Activation",s.status);let a=s.recommended_actions?.[0];a&&l("Next action",a.label)}c()}var gt=D(L(),1);De();V();var pu={api_key_env:"DOMANI_API_KEY",flag:"--account",env:"DOMANI_ACCOUNT",active:"domani use",none:"none"};async function ka(e){let t=rt(),n=Ge().active_account??null,i=Dn();if(e.json){b({active:n,current:i.name??null,source:i.source,accounts:t.map(r=>({name:r.name,email:r.email??null,api_url:r.api_url??null,active:r.name===n,current:r.name===i.name}))});return}if(t.length===0){console.log(` ${gt.default.dim("No saved accounts.")}`),R("Log in:","domani login");return}x("Accounts");let s=Math.max(...t.map(r=>r.name.length));for(let r of t){let o=r.name===i.name?gt.default.green("*"):" ",a=[r.name===n?"active":void 0,r.name===i.name&&i.source!=="active"?`selected by ${pu[i.source]}`:void 0].filter(Boolean);console.log(` ${o} ${gt.default.bold(r.name.padEnd(s))} ${r.email??gt.default.dim("unknown email")}${a.length?` ${gt.default.dim(a.join(", "))}`:""}`)}i.source==="api_key_env"&&(c(),console.log(` ${y.warning} ${gt.default.dim("DOMANI_API_KEY is set: every command uses that key, not these accounts.")}`)),c(),R("Switch:","domani use <name>"),R("Add one:","domani login --account <name>"),c()}async function xa(e,t){if(yi(e)||u(`Invalid account name: ${e}`,{code:"validation_error",hint:"Use letters, digits, dot, dash or underscore",json:t.json}),!Ro(e)){let i=rt().map(s=>s.name);u(`No saved account named "${e}"`,{code:"account_not_found",hint:i.length?`Saved accounts: ${i.join(", ")}. Add one with 'domani login --account ${e}'`:`Log in with 'domani login --account ${e}'`,json:t.json})}let n=rt().find(i=>i.name===e)?.email??null;if(t.json){b({status:"switched",active:e,email:n});return}console.log(` ${y.success} Now using ${gt.default.bold(e)}${n?` ${gt.default.dim(`(${n})`)}`:""}`),process.env.DOMANI_ACCOUNT&&process.env.DOMANI_ACCOUNT!==e&&console.log(` ${y.warning} ${gt.default.dim(`DOMANI_ACCOUNT=${process.env.DOMANI_ACCOUNT} still overrides it in this shell.`)}`)}G();qe();var E=D(L(),1);V();ve();Hn();function Wt(e){return!e.available&&!e.error&&!e.registry_status&&e.price===0&&!!e.reason&&!dn(e)}var Qi="not sold on Domani";function dn(e){return e.tld_kind==="alt_root"}function Jr(e){return e.reason||`${e.domain} does not resolve in public DNS: its TLD is not in the DNS root zone (IANA). Domani does not offer it.`}function yt(e){return e.registry_status==="premium"||e.registry_status==="reserved"}function jn(e){return e.registry_status==="reserved"?"reserved":e.registry_price!==void 0?`premium $${e.registry_price.toFixed(2)}`:"premium"}function Br(e){if(e.reason)return e.reason;if(e.registry_status==="reserved")return`${e.domain} is reserved by the registry and cannot be registered.`;let t=e.registry_price!==void 0?`: the registry prices it at $${e.registry_price.toFixed(2)}`:" priced by the registry";return`${e.domain} is a premium name${t}. Premium names cannot be bought at the standard price.`}function ln(e,t){let n=e.findIndex(i=>i.domain===t);return n!==-1&&e.splice(n,1),n}var Ze=10,xn=200,Xi=["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"],Zi=null;async function md(){if(Zi)return Zi;try{let e=await xe("/api/tlds?sort=price&order=asc&limit=1000");if(e.ok){let n=(await e.json()).tlds.map(i=>i.tld);if(n.length>0){let i=new Set(Xi),s=new Set(n),r=[...Xi.filter(o=>s.has(o)),...n.filter(o=>!i.has(o))];return Zi=r,r}}}catch{}return Zi=Xi,Xi}async function Om(e,t,n,i,s){let r=[],o=[],a=Ze,d=0,m=!0,f=0,p=0,g=!1,_=!1,v=null,w="",S=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],O=0,j=setInterval(()=>{_||!m||(O=(O+1)%S.length,q())},80);function I(){f>0&&(process.stdout.write(`\x1B[${f}A\x1B[0J`),f=0)}function M(){if(m)return[];let A=Ze+p*Ze;return r.length>a||i&&A<s.length?["more","new","skip"]:["new","skip"]}function F(){return r.slice(0,a)}function Y(){let A=M();return Math.max(0,F().length+A.length-1)}let U=6;function q(){I();let A=[],H=F(),ne=!m&&H.length===0&&o.length>0,Z=ne?o.slice(0,U):H,ue=Z.reduce((ye,te)=>Math.max(ye,te.domain.length),0),ke=M();for(let ye=0;ye<Z.length;ye++){let te=Z[ye];if(ne)A.push(`${E.default.dim("\u2502")} ${E.default.dim("\u2715")} ${E.default.dim(te.domain.padEnd(ue))} ${E.default.dim(yt(te)?jn(te):Wt(te)?Qi:"taken")}`);else{let me=ye===d,ft=me?E.default.green("\u25CF"):E.default.dim("\u25CB"),Bt=te.domain.padEnd(ue),fn=me?E.default.bold(E.default.cyan(Bt)):Bt,Cn=te.for_sale?E.default.cyan(`$${te.for_sale.price} (for sale)`):E.default.dim(ct(te));A.push(`${E.default.dim("\u2502")} ${ft} ${fn} ${Cn}`)}}if(ne&&o.length>U&&A.push(`${E.default.dim("\u2502")} ${E.default.dim(`\u2026 and ${o.length-U} more taken`)}`),m){let ye=w?E.default.dim(`checking ${w}\u2026`):E.default.dim("searching\u2026");A.push(`${E.default.dim("\u2502")} ${E.default.cyan(S[O])} ${ye}`)}else{let ye=Ze+p*Ze;i&&ye>=s.length&&A.push(`${E.default.dim("\u2502")} ${E.default.dim(`All ${Math.min(ye,s.length)} TLDs searched`)}`);for(let me=0;me<ke.length;me++){let fn=F().length+me===d?E.default.green("\u25CF"):E.default.dim("\u25CB"),Cn=ke[me]==="more"?E.default.dim("More \u2192"):ke[me]==="new"?E.default.dim("New search \u2192"):E.default.dim("Skip");A.push(`${E.default.dim("\u2502")} ${fn} ${Cn}`)}A.push(E.default.dim("\u2514"))}process.stdout.write(A.join(`
|
|
177
|
+
`}}}}).prompt()});function ou(e){return!!(e.json||!Te)}function j(e,t=50){console.log(),console.log(` ${B.default.bold(e)}`),console.log(` ${B.default.dim("\u2500".repeat(t))}`)}function l(e,t,n=2){let i=" ".repeat(n);console.log(`${i}${B.default.dim(e.padEnd(16))} ${t}`)}function c(){console.log()}function de(e){console.log(` ${B.default.dim(e)}`)}function R(e,t){console.log(` ${B.default.dim(e)} ${B.default.cyan(t)}`)}function fa(e){return e.split(/(https?:\/\/[^\s]+)/g).map(n=>/^https?:\/\//.test(n)?`\x1B]8;;${n}\x1B\\${B.default.underline(B.default.cyan(n))}\x1B]8;;\x1B\\`:B.default.dim(n)).join("")}function mr(e,t){console.error(` ${y.error} ${B.default.red(e)}`),t&&console.error(` ${fa(t)}`)}function C(e=!0){return e?Wn():au}function pa(e){return e.replace(du,"")}function qi(e,t){let n=pa(e).length,i=Math.max(0,t-n);return e+" ".repeat(i)}function J(e,t,n){let i=n||e.map((o,a)=>{let d=t.reduce((m,f)=>Math.max(m,pa(f[a]||"").length),0);return Math.max(o.length,d)+2}),s=e.map((o,a)=>B.default.dim(o.padEnd(i[a]))).join(" "),r=i.map(o=>B.default.dim("\u2500".repeat(o))).join(" ");console.log(` ${s}`),console.log(` ${r}`);for(let o of t){let a=o.map((d,m)=>qi(d,i[m])).join(" ");console.log(` ${a}`)}}function lu(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}function ur(e){if(Array.isArray(e))return e.map(ur);if(e&&typeof e=="object"&&!(e instanceof Date)){let t={};for(let[n,i]of Object.entries(e))t[lu(n)]=ur(i);return t}return e}function b(e,t){let n=ur(e);if(!t){console.log(JSON.stringify(n,null,2));return}let i=t.split(",").map(s=>s.trim()).filter(Boolean);if(Array.isArray(n)){let s=n.map(r=>ca(r,i));console.log(JSON.stringify(s,null,2))}else console.log(JSON.stringify(n&&typeof n=="object"?ca(n,i):n,null,2))}function ca(e,t){let n={};for(let i of t)i in e&&(n[i]=e[i]);if(Object.keys(n).length===0){for(let[i,s]of Object.entries(e))if(Array.isArray(s)&&s.length>0&&typeof s[0]=="object"){let r=s.map(o=>{let a={};for(let d of t)d in o&&(a[d]=o[d]);return a});Object.keys(r[0]).length>0&&(n[i]=r)}}return n}function Ct(e){return!!(e.yes||ou(e))}function qt(){let e=St();return e?` as ${B.default.bold(e)}`:""}function K(e,t,n,i){if(n){b({dry_run:!0,action:e,...t},i);return}console.log(),console.log(` ${B.default.yellow("\u25B8 DRY RUN")} ${B.default.dim("- no changes made")}`),console.log(` ${B.default.dim("Action:")} ${B.default.bold(e)}`);for(let[s,r]of Object.entries(t))r!=null&&(Array.isArray(r)?console.log(` ${B.default.dim(s+":")} ${r.map(String).join(", ")}`):console.log(typeof r=="object"?` ${B.default.dim(s+":")} ${JSON.stringify(r)}`:` ${B.default.dim(s+":")} ${String(r)}`));console.log()}function uu(e,t,n){return t===401||t===403?"auth_required":t===402||n?"payment_required":t===404?"not_found":t===409?"conflict":t===422?"validation_error":t===429?"rate_limited":/contact/i.test(e)?"contact_required":"error"}function u(e,t){let n=e||`Request failed${t?.status?` (${t.status})`:""}`,i=t?.code||uu(n,t?.status,t?.fixUrl),s=t?.fixCommand||cu[i];if(t?.json){let r={error:n,code:i,...t.data};t.hint&&(r.hint=t.hint),s&&(r.fix_command=s),t.fixUrl&&(r.fix_url=t.fixUrl),b(r,t.fields)}else mr(n,t?.hint),s?console.error(` ${B.default.dim("Or run:")} ${B.default.cyan(s)}`):t?.fixUrl&&console.error(` ${fa(`Add a payment method at ${t.fixUrl}`)}`);process.exit(1)}function Ve(e){let t=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";(0,ma.execFile)(t,[e])}function Rt(e){return new Promise(t=>setTimeout(t,e))}function nn(e,t,n,i=!0){let s=process.stdout.isTTY??!1;if(!i)return{start(){},markDone(){},stop(){}};let r=0,o=null,a=2+t.length;function d(){let w=" "+e.map((g,x)=>B.default.dim(g.padEnd(n[x]))).join(" "),_=" "+n.map(g=>B.default.dim("\u2500".repeat(g))).join(" "),v=[w,_];for(let g of t){let x=g.status==="done"?g.icon??y.success:B.default.cyan(ua[r%ua.length]),O=g.cells.map((S,I)=>qi(S,n[I])).join(" ");v.push(` ${x} ${O}`)}return v}let m=!1,f=()=>process.stdout.write("\x1B[?25h");function p(){let w=d();if(m&&s){process.stdout.write(`\x1B[${a}A`);for(let _ of w)process.stdout.write(`\x1B[2K${_}
|
|
178
|
+
`)}else{for(let _ of w)console.log(_);m=!0}}return{start(){s&&(process.stdout.write("\x1B[?25l"),process.on("exit",f)),p(),s&&(o=setInterval(()=>{r++,p()},80))},markDone(w,_){t[w].status="done",_!==void 0&&(t[w].icon=_),s&&p()},stop(){o&&clearInterval(o);for(let w of t)w.status="done";p(),s&&(process.stdout.write("\x1B[?25h"),process.removeListener("exit",f))}}}var B,ma,Te,y,$,au,du,cu,ua,V=$e(()=>{"use strict";B=D(L(),1),ma=require("child_process");De();Me();Te=process.stdout.isTTY??!1;y={success:B.default.green("\u2713"),error:B.default.red("\u2717"),warning:B.default.yellow("!"),info:B.default.cyan("\u25CF"),arrow:B.default.dim("\u2192"),dot:B.default.dim("\xB7"),dash:B.default.dim("\u2500")},$={domain:e=>B.default.bold(B.default.white(e)),price:e=>B.default.green(`$${e}`),label:e=>B.default.dim(e),value:e=>B.default.white(e),dim:e=>B.default.dim(e),bold:e=>B.default.bold(e),success:e=>B.default.green(e),error:e=>B.default.red(e),warn:e=>B.default.yellow(e),cyan:e=>B.default.cyan(e),url:e=>`\x1B]8;;${e}\x1B\\${B.default.underline(B.default.cyan(e))}\x1B]8;;\x1B\\`};au={start:()=>{},stop:()=>{},message:()=>{}};du=/\x1b\]8;;[^\x1b]*\x1b\\|\x1b\[[0-9;]*m/g;cu={auth_required:"domani login",payment_required:"domani card add",contact_required:"domani contact set"};ua=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"]});function ha(e){return typeof e=="string"&&["pro","agent","fleet","scale","mail_solo","mail_team","mail_business"].includes(e)}function ga(e){return ha(e.plan)||Array.isArray(e.workspace_plans)&&e.workspace_plans.some(ha)}async function ya(){if(pr)return;let e=process.argv.includes("--json")||!Es,t=ze(),n=at();try{let r=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${n}`}})).json();if(ga(r)){pr=!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)),c(),console.log(` ${Oe.default.dim("This feature requires a")} ${Oe.default.bold("paid plan")} ${Oe.default.dim(`(including an active ${Dt.mailProductName} workspace plan or legacy Pro subscription).`)}`),console.log(` ${Oe.default.dim("Opening pricing page")} ${y.arrow} ${Oe.default.cyan("domani.run/pricing")}`),Ve(`${t.replace("http://localhost:3000","https://domani.run")}/pricing`),c();let i=C(!0);i.start("Waiting for upgrade...");for(let s=0;s<120;s++){await new Promise(r=>setTimeout(r,5e3));try{let o=await(await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${n}`}})).json();if(ga(o)){pr=!0,i.stop(`${y.success} Paid plan active! Continuing...`),c();return}}catch{}}i.stop("Timed out"),console.error(` ${Oe.default.red("\u2717")} No upgrade detected. Visit ${Oe.default.cyan("domani.run/settings")} to upgrade.`),process.exit(1)}async function ba(){if(fr||at()){fr=!0;return}let e=process.argv.includes("--json")||!Es,{source:t}=Nt(),n=wn(),i=t==="flag"||t==="env"?`domani login --account ${n}`:"domani login";e&&(console.log(JSON.stringify({error:t==="flag"||t==="env"?`Not logged in to the CLI account "${n}"`:"Not logged in",code:"auth_required",hint:`Run '${i}' or set DOMANI_API_KEY environment variable`,fix_command:i},null,2)),process.exit(1)),c(),console.log(` ${Oe.default.dim("You're not logged in.")} Starting authentication...`),c();let s=ze(),r=C(!0);r.start("Requesting auth code");let o;try{o=await fetch(`${s}/api/auth/cli`,{method:"POST",headers:{"Content-Type":"application/json"}})}catch{r.stop("Failed"),console.error(` ${Oe.default.red("\u2717")} Could not reach ${s}. Check your connection.`),process.exit(1)}if(!o.ok){r.stop("Failed");let m=`Server error (${o.status})`;try{let f=await o.json();m=f.error||f.message||m}catch{}console.error(` ${Oe.default.red("\u2717")} ${m}`),process.exit(1)}let a,d;try{({code:a,auth_url:d}=await o.json())}catch{r.stop("Failed"),console.error(` ${Oe.default.red("\u2717")} Invalid response from server.`),process.exit(1)}r.stop(`${y.success} Auth code ready`),c(),console.log(` ${Oe.default.dim("Verification code:")} ${Oe.default.bold(Oe.default.cyan(a))}`),console.log(` ${Oe.default.dim("Opening browser")} ${y.arrow} ${$.url(d)}`),Ve(d),c(),r.start("Waiting for browser approval");for(let m=0;m<120;m++){await new Promise(w=>setTimeout(w,5e3));let f=await fetch(`${s}/api/auth/cli/poll?code=${a}`).catch(()=>null);if(!f||!f.ok&&f.status!==202)continue;let p=await f.json().catch(()=>({}));if(p.status==="complete"){bi(n,{token:p.token,email:p.email,api_url:s}),fr=!0,r.stop(`${y.success} Logged in as ${Oe.default.bold(p.email)}`),c();return}}r.stop("Timed out"),console.error(` ${Oe.default.red("\u2717")} No approval received. Run ${Oe.default.cyan("domani login")} to try again.`),process.exit(1)}var Oe,fr,pr,hr=$e(()=>{"use strict";Oe=D(L(),1);ui();De();V();fr=!1,pr=!1});function _a(e){return e.json=async()=>{let t=await e.clone().text();try{return JSON.parse(t)}catch{let n=t.trim().slice(0,120);return e.ok?(Object.defineProperty(e,"ok",{value:!1}),{error:`Unexpected non-JSON response (HTTP ${e.status})`,hint:`The server replied but not with JSON${n?` (got: "${n}")`:""}. This is usually transient (deploy or proxy) - retry in a few seconds.`}):{error:`Server error (${e.status})`,hint:"The server returned an unexpected response. Try again later."}}},e}async function k(e,t={},n=!1){let i=at(),s=`${ze()}${e}`,r=await fetch(s,{...t,headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json","User-Agent":`domani-cli/${Ie}`,...t.headers}});if(!n){let o=await r.clone().text();try{if(JSON.parse(o).code==="UPGRADE_REQUIRED")return await ya(),k(e,t,!0)}catch{}}return _a(r)}async function xe(e,t={}){let n=`${ze()}${e}`,i=at(),s=await fetch(n,{...t,headers:{"Content-Type":"application/json","User-Agent":`domani-cli/${Ie}`,...i?{Authorization:`Bearer ${i}`}:{},...t.headers}});return _a(s)}var G=$e(()=>{"use strict";De();hr()});function Lt(){return{ok:!0}}function It(e,t,n){return{ok:!1,error:{message:e,code:t,hint:n}}}function Oa(e){return hu.test(e)?It("Input contains control characters","invalid_input","Remove non-printable characters from the input"):Lt()}function vu(e){return gu.test(e)?It("Input contains path traversal","invalid_input","Domain names cannot contain '../' or '..\\'"):Lt()}function _u(e){return yu.test(e)?It("Input contains query string or fragment","invalid_input","Remove '?' or '#' from the domain name"):Lt()}function ku(e){return bu.test(e)?It("Input contains percent-encoded characters","invalid_input","Use plain text, not URL-encoded values (e.g. 'example.com' not 'example%2Ecom')"):Lt()}function Ca(e){if(!e)return It("Domain name is required","validation_error");if(e.length>Sa)return It(`Domain name too long (${e.length} chars, max ${Sa})`,"validation_error");for(let t of[Oa,vu,_u,ku]){let n=t(e);if(!n.ok)return n}return wu.test(e)?Lt():It(`Invalid domain name: ${e}`,"validation_error","Domain names can only contain letters, digits, hyphens, and dots")}function xu(e){if(!e)return It("TLD is required","validation_error");let t=Oa(e);return t.ok?$u.test(e)?Lt():It(`Invalid TLD: ${e}`,"validation_error","TLDs contain only letters (e.g. 'com', '.dev', 'ai')"):t}function ju(e){for(let t of e){let n=Ca(t);if(!n.ok)return n}return Lt()}function Su(e){for(let t of e){let n=xu(t);if(!n.ok)return n}return Lt()}function X(e,t){let n=Ca(e);n.ok||u(n.error.message,{code:n.error.code,hint:n.error.hint,json:t?.json,fields:t?.fields})}function Ra(e,t){let n=ju(e);n.ok||u(n.error.message,{code:n.error.code,hint:n.error.hint,json:t?.json,fields:t?.fields})}function Fi(e,t){let n=Su(e);n.ok||u(n.error.message,{code:n.error.code,hint:n.error.hint,json:t?.json,fields:t?.fields})}var hu,gu,yu,bu,wu,$u,Sa,ve=$e(()=>{"use strict";V();hu=/[\x00-\x08\x0b\x0c\x0e-\x1f]/,gu=/\.\.[/\\]/,yu=/[?#]/,bu=/%[0-9a-fA-F]{2}/,wu=/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*\.?$/,$u=/^\.?[a-zA-Z]{2,63}$/,Sa=253});function yr(e,t){return t!==void 0&&Math.round(t*100)!==Math.round(e*100)}function br(e,t){return yr(e,t)?`$${e.toFixed(2)} first year, then $${t.toFixed(2)}/yr`:`$${e.toFixed(2)}/yr`}var wr=$e(()=>{"use strict"});function We(e){return`${e} year${e===1?"":"s"}`}function Ia(e){return typeof e.min_years=="number"&&Number.isInteger(e.min_years)&&e.min_years>1?e.min_years:1}function Vi(e){if(e===void 0)return;if(!/^\d+$/u.test(e.trim()))return null;let t=Number(e.trim());return t>=1&&t<=$r?t:null}function Hn(e,t){let n=Ia(e),i=t??n,s=i===n&&n>1&&typeof e.min_term_price=="number"?e.min_term_price:typeof e.price=="number"?Ou(e.price*i):void 0;return{years:i,min_years:n,...s!==void 0?{total:s}:{}}}function Aa(e,t){if(!(t.years===1||t.total===void 0||typeof e.price!="number"))return{total:t.total,minimum:t.years===t.min_years?` (${t.min_years}-year minimum)`:"",then:`, then ${Li(e.renewal_price??e.price)}/yr`}}function ct(e,t=Hn(e)){if(typeof e.price!="number")return"";let n=Aa(e,t);return n?`${Li(n.total)} for ${We(t.years)}${n.minimum}${n.then}`:br(e.price,e.renewal_price)}function vr(e,t){let n=Aa(e,t);return n?`for ${We(t.years)}: ${Li(n.total)}${n.minimum}${n.then}`:typeof e.price=="number"?`for ${br(e.price,e.renewal_price)}`:`for ${We(t.years)}`}function _r(e){return{years:e.years,...e.min_years>1?{min_years:e.min_years}:{},...e.total!==void 0?{total_price:e.total}:{}}}function Ta(e){let t=e.filter(i=>i.term.years>1);return t.length===0?"":` (${t.map(({domain:i,term:s})=>`${i} for ${We(s.years)}${s.years===s.min_years?`, the ${i.slice(i.indexOf("."))} minimum`:""}`).join("; ")})`}function kr(e,t,n){let i=Ia(t);if(n===void 0||n>=i)return;let{total:s}=Hn(t);return{domain:e,requested_years:n,min_years:i,...s!==void 0?{price:s}:{}}}function Ea(e){return e.map(t=>{let n=t.price!==void 0?`, ${Li(t.price)} in total`:"";return`${t.domain} cannot be registered for ${We(t.requested_years)}: ${t.domain.slice(t.domain.indexOf("."))} names are registered for at least ${We(t.min_years)}${n}.`}).join(" ")}function xr(e){return`Re-run with --years ${e}, or leave --years out for the minimum term.`}function Pa(e){let t=typeof e.code=="string"?e.code:"";if(!Cu.has(t))return;let n=typeof e.hint=="string"?e.hint:void 0;if(t==="TERM_BELOW_MINIMUM"){let s=Array.isArray(e.terms)?e.terms.map(o=>o.min_years):[e.min_years],r=Math.max(0,...s.filter(o=>typeof o=="number"));return{code:t,hint:r>1?xr(r):n}}if(t==="TERM_NOT_SUPPORTED"){let s=e.suggested_years;return{code:t,hint:typeof s=="number"?`Re-run with --years ${s}.`:n}}let i=e.retry_after;return{code:t,hint:typeof i=="number"?`Try again in ${i} seconds.`:n}}function Jn(e){return{price:e.price,currency:e.currency,renewal_price:e.renewal_price,min_years:e.min_years,min_term_price:e.min_term_price}}var $r,Ou,Li,Cu,xn=$e(()=>{"use strict";wr();$r=10,Ou=e=>Math.round(e*100)/100,Li=e=>`$${e.toFixed(2)}`;Cu=new Set(["TERM_BELOW_MINIMUM","TERM_NOT_SUPPORTED","REGISTRAR_UNAVAILABLE"])});function jn(e){return Math.round(e*100)/100}function Vt(e){return e.code==="PRICE_ABOVE_MAX"&&typeof e.price=="number"?e.price:void 0}function jr(e){return`Nothing was charged. Re-run with --max-price ${e.toFixed(2)} to accept the new price.`}function Ru(e){return typeof e.renewal_price=="number"&&e.renewal_price>0?e.renewal_price:void 0}async function Bn(e,t,n,i,s){let r=Ru(n);Ct(s)&&u(n.error??`The price is now $${e.toFixed(2)}, above $${t.toFixed(2)}. Nothing was charged.`,{code:"price_above_max",hint:jr(e),data:{price:e,...typeof n.listed_price=="number"?{listed_price:n.listed_price}:{},...r!==void 0?{renewal_price:r}:{}},json:s.json,fields:s.fields});let o=r!==void 0?`, then ${$.price(r.toFixed(2))}/year to renew`:"",a=await Je({message:`The price changed: ${$.price(e.toFixed(2))} instead of ${$.price(t.toFixed(2))}${o}. Nothing was charged. ${i} for ${$.price(e.toFixed(2))}?`});if(!a||typeof a=="symbol"){console.log(` ${Da.default.dim("Cancelled.")}`);return}return e}function sn(e,t){if(e===void 0)return;let n=Number(e);return(!Number.isFinite(n)||n<=0)&&u(`--max-price must be a positive amount in USD, got "${e}"`,{code:"validation_error",json:t.json,fields:t.fields}),n}var Da,Wi=$e(()=>{"use strict";Me();Da=D(L(),1);V()});function Sr(e){let t=Vi(e.years);return t===null&&u(`--years must be a whole number from 1 to ${$r}, got "${e.years}"`,{code:"validation_error",json:e.json,fields:e.fields}),t}function Or(e,t,n){u(Ea(e),{code:"TERM_BELOW_MINIMUM",hint:xr(Math.max(...e.map(i=>i.min_years))),data:t?{terms:e}:e[0],json:n.json,fields:n.fields})}function Hi(e,t,n){let i=Pa(e);i&&u(e.error,{code:i.code,hint:n.json?void 0:i.hint,status:t,data:e,json:n.json,fields:n.fields}),u(e.error||e.message,{hint:e.hint,fixUrl:e.setup_url||e.payment_options?.card?.setup_url,status:t,json:n.json,fields:n.fields})}var Na=$e(()=>{"use strict";V();xn()});async function be(){Te||u("Missing required argument: domain",{hint:"Pass the domain as an argument, e.g. 'domani settings example.com'",code:"missing_argument",json:!0});let e=C(!0);e.start("Loading your domains");let t=await k("/api/domains"),n=await t.json();t.ok||(e.stop("Failed"),mr(n.error,n.hint),process.exit(1));let i=n.domains||[];i.length===0&&(e.stop("No domains"),c(),console.log(` ${Cr.default.dim("No domains yet.")} Use: ${Cr.default.cyan("domani buy <domain>")}`),c(),process.exit(0)),e.stop(`${i.length} domain(s)`);let s=await lt({message:"Which domain?",options:i.map(r=>({value:r.domain,label:r.domain,hint:r.status!=="active"?r.status:void 0}))});return ae(s)&&process.exit(0),s}var Cr,st=$e(()=>{"use strict";G();Me();Cr=D(L(),1);V()});var Ma={};gn(Ma,{connect:()=>Rr});async function Rr(e,t,n){e||(e=await be()),X(e,n);let i;if(t&&!n.provider?t.includes(".")?i=t:n.provider=t:i=t,!i&&!n.provider&&!n.list&&n.dryRun)return K("connect",{domain:e,note:"No provider specified. Pass --provider <name> to connect."},n.json,n.fields);if(!i&&!n.provider&&!n.list){let s=C(!n.json);s.start(`Loading providers for ${$.domain(e)}`);let r=await k(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop("Providers loaded"),n.json){b(o,n.fields);return}let a=[];for(let g of["hosting","email"]){let x=o.providers?.[g]||[];for(let O of x)a.push({value:`${g}:${O.name}`,label:O.name,hint:g})}a.length===0&&u("No providers available",{code:"not_found",json:n.json,fields:n.fields});let d=await lt({message:"Choose a provider",options:a});ae(d)&&process.exit(0);let[m,f]=d.split(":"),w=(o.providers?.[m]||[]).find(g=>g.name===f),_;if(w&&w.methods.length>1){let g=await lt({message:"Choose a method",options:w.methods.map(x=>({value:x.name,label:x.name,hint:x.default?"default":void 0}))});ae(g)&&process.exit(0),_=g}let v;if(m==="hosting"&&w?.requires_target){w.notes?.setup&&de(w.notes.setup);let g=await Ue({message:"Target hostname or IP"});ae(g)&&process.exit(0),v=g.trim()}return Ua(e,{target:v,provider:f,method:_,dryRun:n.dryRun,json:!1})}if(n.list){let s=C(!n.json);s.start(`Loading providers for ${$.domain(e)}`);let r=await k(`/api/domains/${encodeURIComponent(e)}/connect`),o=await r.json();if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop("Providers loaded"),n.json){b(o,n.fields);return}j(`Providers for ${$.domain(o.domain)}`);for(let a of["hosting","email"]){let d=o.providers?.[a];if(d?.length){c(),console.log(` ${pe.default.bold(a.toUpperCase())}`);for(let m of d){let f=m.methods.map(p=>p.default?pe.default.green(`${p.name} (default)`):pe.default.dim(p.name)).join(pe.default.dim(", "));console.log(` ${pe.default.cyan(m.name.padEnd(20))} ${f}`)}}}c();return}return Ua(e,n)}async function Ua(e,t){let n={};if(t.target&&(n.target=t.target),t.provider&&(n.provider=t.provider),t.method&&(n.method=t.method),t.dryRun)return K("connect",{domain:e,...n},t.json,t.fields);let i=C(!t.json);i.start(`Connecting ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify(n)}),r=await s.json();s.ok||(i.stop("Connection failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}));let o=r.status==="manual_setup_required";if(i.stop(o?`${y.success} DNS instructions for ${pe.default.cyan(r.provider)}`:`${y.success} Connected to ${pe.default.cyan(r.provider)}`),t.json){b(r,t.fields);return}if(j(o?`Add these records at your registrar for ${$.domain(r.domain)}`:`Connected ${$.domain(r.domain)}`),l("Provider",pe.default.cyan(r.provider)),l("Method",r.method),r.records?.length){let a=[8,22,40];c(),console.log(` ${pe.default.bold("DNS Records")}`);let d=["Type","Name","Value"].map((f,p)=>pe.default.dim(f.padEnd(a[p]))).join(" "),m=a.map(f=>pe.default.dim("\u2500".repeat(f))).join(" ");console.log(` ${d}`),console.log(` ${m}`);for(let f of r.records){let p=f.record,w=f.status!=="already_set";process.stdout.isTTY&&w&&await Rt(50);let v=[pe.default.yellow(p.type),p.name,pe.default.cyan(p.value)+(p.priority?pe.default.dim(` pri=${p.priority}`):"")].map((O,S)=>qi(O,a[S])).join(" "),g=f.status==="already_set"?pe.default.dim("\u2713"):f.status==="updated"?pe.default.yellow("\u21BA"):f.status==="pending"?pe.default.yellow("\u2192"):y.success,x=f.status==="already_set"?pe.default.dim(" already set"):f.status==="updated"?pe.default.dim(" updated"):f.status==="pending"?pe.default.dim(" add this"):"";console.log(` ${g} ${v}${x}`)}}c(),r.next_steps?.length?(console.log(` ${pe.default.bold("Next steps")}`),r.next_steps.forEach((a,d)=>{console.log(` ${pe.default.dim(`${d+1}.`)} ${a}`)})):r.hint&&console.log(` ${pe.default.dim(r.hint)}`),r.docs&&console.log(` ${pe.default.dim("Docs:")} ${$.url(r.docs)}`),c()}var pe,Ir=$e(()=>{"use strict";G();pe=D(L(),1);Me();V();ve();st()});function rn(e,t=process.env){if(e.clearHeaders&&(e.authorizationEnv||e.apiKeyEnv))throw new Error("--clear-headers cannot be combined with header environment options");if(e.clearHeaders)return{};let n={},i=[["Authorization",e.authorizationEnv],["X-API-Key",e.apiKeyEnv]];for(let[s,r]of i){if(!r)continue;let o=t[r];if(!o)throw new Error(`Environment variable ${r} is not set`);n[s]=o}return Object.keys(n).length>0?n:void 0}function on(e){return e?Object.keys(e):[]}var Ji=$e(()=>{"use strict"});function Gn(e,t,n){return u(e,{hint:t,code:"validation_error",json:n.json,fields:n.fields})}function Ar(e){return e.slug&&e.domain?`${e.slug}@${e.domain}`:null}function Bi(e,t){return t.messageId||t.messageIds||(e&&!e.includes("@")?e:void 0)}function Fa(e,t,n){return`/api/emails/${encodeURIComponent(e)}/messages/${encodeURIComponent(t)}/${n}`}function Au(e,t,n){return e.match==="domain"?`domani email sender-rule-add --action block --match domain --value ${e.value}`:`domani email sender-rule-add --action block --match campaign --from ${t} --message-id ${n}`}function Tu(e){let t=new URLSearchParams;e.action&&t.set("action",e.action),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}function Eu(e){if(!e.action||!qa.includes(e.action))return{error:"--action must be block or allow"};if(!e.match||!Iu.includes(e.match))return{error:"--match must be address, domain or campaign"};let t=Ar(e),n={action:e.action,match:e.match};if(e.messageId){if(!t)return{error:"--message-id needs --from, the mailbox the message is in"};n.mailbox=t,n.message_id=e.messageId}else if(e.value){if(e.match==="campaign")return{error:"A campaign rule is taken from a message: pass --from and --message-id"};n.value=e.value}else return{error:"Pass --value, or --from and --message-id"};return e.confirm&&(n.confirm=!0),{body:n}}function Pu(e,t){return`/api/sender-rules/${encodeURIComponent(e)}${t?"?restore=false":""}`}function Tr(e){return e.match==="campaign"?e.label?`campaign "${e.label.slice(0,48)}"`:`campaign ${e.value.slice(0,8)}`:e.match==="domain"?`everything from ${e.value}`:e.value}async function Gi(e,t,n,i){let s=C(!n.json);s.start(i);let r=await k(e,t),o=await r.json();return r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop("Done"),o}async function La(e,t){let n="Usage: domani email spam <message_id> --from hi@myapp.dev [--confirm]",i=Ar(t),s=Bi(e,t);(!i||!s)&&Gn("Mailbox and message ID required",n,t);let r=await Gi(Fa(i,s,"spam"),{method:"POST",body:JSON.stringify(t.confirm?{confirm:!0}:{})},t,"Marking as spam");if(t.json)return b(r,t.fields);j("Spam"),l("Message",`${r.message_id} ${qe.default.dim("moved to Spam")}`),r.rule&&l("Blocked",`${qe.default.cyan(r.sender)} ${qe.default.dim("for every mailbox of the account")}`),l("Moved",`${r.moved} other message${r.moved===1?"":"s"} from the sender`),r.confirmation_required&&(console.log(` ${y.warning} ${r.confirmation_required.message}`),R("Block them anyway:",`domani email spam ${s} --from ${i} --confirm`));let o=r.suggestions||[];if(o.length){console.log(),console.log(` ${qe.default.bold("One step further")}`);for(let a of o){let d=a.match==="domain"?`Everything from ${a.value}`:`The same campaign${a.label?` ("${a.label.slice(0,48)}")`:""}`;console.log(` ${d}: ${a.count} message${a.count===1?"":"s"} in ${a.mailboxes} mailbox${a.mailboxes===1?"":"es"}`),R(" Apply:",Au(a,i,s))}}else r.hint&&de(r.hint)}async function Va(e,t){let n="Usage: domani email not-spam <message_id> --from hi@myapp.dev",i=Ar(t),s=Bi(e,t);(!i||!s)&&Gn("Mailbox and message ID required",n,t);let r=await Gi(Fa(i,s,"not-spam"),{method:"POST",body:"{}"},t,"Marking as not spam");if(t.json)return b(r,t.fields);j("Not spam"),l("Message",`${r.message_id} ${qe.default.dim("back in the Inbox")}`),r.rule&&l("Allowed",`${qe.default.cyan(r.sender)} ${qe.default.dim("for every mailbox of the account")}`),l("Moved",`${r.moved} other message${r.moved===1?"":"s"} back from Spam`);let o=r.matching_rules||[];if(o.length){console.log(),console.log(` ${qe.default.bold("Wider rules that also matched it")}`);for(let a of o)console.log(` Block on ${Tr(a)}`),R(" Remove:",`domani email sender-rule-remove ${a.id}`)}else r.hint&&de(r.hint)}async function Wa(e){e.action&&!qa.includes(e.action)&&Gn("--action must be block or allow","Usage: domani email sender-rules [--action block|allow] [--limit 50] [--cursor C]",e);let t=await k(`/api/sender-rules${Tu(e)}`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);let i=n.rules||[];if(!i.length){console.log(qe.default.dim("No learned rules yet. Mark a message as spam (domani email spam) to block its sender."));return}j("Learned sender rules"),J(["ID","Rule","Moved","By","When"],i.map(s=>[s.id,`${s.action==="block"?qe.default.red("block"):qe.default.green("allow")} ${Tr(s)}`,String(s.moved+s.hits),s.created_by.label.slice(0,20),s.created_at.slice(0,10)]),[27,56,7,22,11]),n.next_cursor&&console.log(qe.default.dim(`More: --cursor ${n.next_cursor}`))}async function Ha(e){let t="Usage: domani email sender-rule-add --action block|allow --match address|domain --value secure.net [--confirm] (or --match campaign --from hi@myapp.dev --message-id MSG)",n=Eu(e);if("error"in n)return Gn(n.error,t,e);let i=await Gi("/api/sender-rules",{method:"POST",body:JSON.stringify(n.body)},e,"Saving the rule");if(e.json)return b(i,e.fields);let s=i.rule;console.log(`${y.success} ${s.action==="block"?"Blocked":"Allowed"} ${qe.default.cyan(Tr(s))} ${qe.default.dim(`(${s.id})`)}`),console.log(` ${i.moved} message${i.moved===1?"":"s"} already received moved ${s.action==="block"?"to Spam":"back to the Inbox"}.`),i.truncated&&de("The scan stopped early: some older copies of the campaign may still be in place."),R("Undo:",`domani email sender-rule-remove ${s.id}`)}async function Ja(e,t){let n=e&&!e.includes("@")?e:void 0;n||Gn("Rule ID required","Usage: domani email sender-rule-remove <rule_id> [--keep-moved]",t);let i=await Gi(Pu(n,t.keepMoved),{method:"DELETE"},t,"Removing the rule");if(t.json)return b(i,t.fields);console.log(`${y.success} Rule ${qe.default.cyan(n)} removed.${t.keepMoved?"":` ${i.restored} message${i.restored===1?"":"s"} went back where ${i.restored===1?"it was":"they were"}.`}`)}var qe,qa,Iu,Er=$e(()=>{"use strict";qe=D(L(),1);G();V();qa=["block","allow"],Iu=["address","domain","campaign"]});function Du(e,t){return`/api/emails/${encodeURIComponent(e)}/messages/${encodeURIComponent(t)}/decisions`}function Nu(e){let t=e.previous&&e.previous!==e.value?`${e.previous} -> ${e.value}`:e.value,n=e.applied?e.action:an.default.dim(e.action),i=e.reasons.map(s=>s.code).join(", ");return[e.at.slice(5,19).replace("T"," "),e.axis,e.actor,n,t,i]}function Uu(e){return e?`${`spf ${e.spf??"-"}, dkim ${e.dkim??"-"}, dmarc ${e.dmarc??"-"}`} ${an.default.dim(`(${e.authserv_id??"unknown server"}, ${e.trusted?"trusted":"not trusted"})`)}`:an.default.dim("no verdict")}async function Ba(e,t){let n="Usage: domani email decisions <message_id> --from hi@myapp.dev",i=t.slug&&t.domain?`${t.slug}@${t.domain}`:null,s=Bi(e,t);(!i||!s)&&u("Mailbox and message ID required",{hint:n,code:"validation_error",json:t.json,fields:t.fields});let r=C(!t.json);r.start("Reading the decisions");let o=await k(Du(i,s)),a=await o.json();if(o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields})),r.stop("Done"),t.json)return b(a,t.fields);j("Decisions"),l("Message",`${a.message_id} ${an.default.dim(`(${a.mailbox})`)}`),l("From",a.from),a.subject&&l("Subject",a.subject.slice(0,72)),l("Now",`${a.current.folder}${a.current.kind?`, kind ${a.current.kind} ${an.default.dim(`(${a.current.kind_decided_by})`)}`:""}`),a.direction==="in"&&l("Authentication",Uu(a.authentication));let d=Object.entries(a.upstream?.headers??{});for(let[f,p]of d)l(f,p.slice(0,72));let m=a.decisions||[];if(m.length&&(console.log(),J(["When (UTC)","Axis","Who","Did","Value","Why"],m.map(Nu),[16,11,16,9,18,34])),a.ledger){let f=a.ledger;l("Ledger",`${f.at.slice(0,16).replace("T"," ")} ${f.status}: ${f.verdict.placement??"-"} by ${f.verdict.layer??"-"} ${an.default.dim(`(${f.version}, ${f.model})`)}`)}de(a.hint)}var an,Ga=$e(()=>{"use strict";an=D(L(),1);G();V();Er()});var ad={};gn(ad,{buildSendBody:()=>ed,contactsQuery:()=>nd,email:()=>Kn,inboxQuery:()=>sd,parseRecipients:()=>zi,recipientField:()=>Yi,resolveDomainArg:()=>Pr,resolveDraftIdArg:()=>Za,systemLocale:()=>Qa});function Fu(e){return[T.default.yellow(e.type),e.name,T.default.cyan(e.value)+(e.priority?T.default.dim(` pri=${e.priority}`):"")]}function Nr(e){return qu[e]||e}function zi(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function Yi(e){if(e.length!==0)return e.length===1?e[0]:e}function Lu(e,t){if(e&&e.includes("@")){let[n,i]=e.split("@",2);!t.slug&&n&&(t.slug=n),!t.domain&&i&&(t.domain=i)}}function Pr(e,t){if(t.domain)return t.domain;if(e&&!e.includes("@"))return e}async function Ze(e){return e.domain?(X(e.domain,e),e.domain):be()}async function Kn(e,t,n){if(e&&e.includes(".")&&!Mu.includes(e))return n.check?za(e,!!n.json,n.fields):t?Ya(e,t,!!n.json,n.fields):rd(e,!!n.json,n.fields);if(Lu(t,n),n.body&&!n.text&&(n.text=n.body),n.title&&!n.subject&&(n.subject=n.title),n.from&&n.from.includes("@")){let[i,s]=n.from.split("@",2);!n.slug&&i&&(n.slug=i),!n.domain&&s&&(n.domain=s)}switch(e){case void 0:return Ka(n);case"list":return Ka(n);case"inbox":return gm(n);case"folders":return ym(n);case"drafts":return bm(n);case"draft":return zu(t,n);case"archive":case"trash":case"restore":case"read":case"unread":case"star":case"unstar":return wm(e,n);case"setup":return n.domain=Pr(t,n),sm(n);case"status":return n.domain=Pr(t,n),rm(n);case"remove":return om(n);case"create":return am(n);case"delete":return dm(n);case"send":return lm(n);case"webhook":return $m(n);case"webhook-test":return vm(n);case"forward":return _m(n);case"work":return Qu(n);case"triage":return em(n);case"note":return tm(n);case"notes":return nm(n);case"activity":return im(n);case"changes":return Ju(n);case"search":return Bu(t,n);case"threads":return Gu(n);case"thread":return Ku(t,n);case"label":return Yu(n);case"facts":return Xu(t,n);case"extract":return Zu(t,n);case"spam":return La(t,n);case"not-spam":return Va(t,n);case"decisions":return Ba(t,n);case"sender-rules":return Wa(n);case"sender-rule-add":return Ha(n);case"sender-rule-remove":return Ja(t,n);case"coordination":return Vu(n);case"presence":return Wu(n);case"release-presence":return Hu(n);case"escalate":return cm(n);case"remind":return um(n);case"contacts":return mm(n);case"contact-add":return fm(n);case"contact-remove":return pm(n);case"tone":return hm(n);case"check":return za(n.domain||await be(),!!n.json,n.fields);case"connect":return Ya(n.domain||await be(),t||void 0,!!n.json,n.fields);default:u(`Unknown action: ${e}`,{hint:"Actions: list, inbox, folders, archive, trash, restore, read, unread, star, unstar, spam, not-spam, decisions, sender-rules, sender-rule-add, sender-rule-remove, create, delete, send, forward, webhook, webhook-test, work, triage, notes, note, activity, changes, coordination, presence, release-presence, setup, status, check, connect",code:"validation_error",json:n.json,fields:n.fields})}}function Ur(e){let t=e.mailboxIds?.split(",").map(n=>n.trim()).filter(Boolean)[0];return(!t||!e.threadKey)&&u("Mailbox ID and thread key required",{hint:"Pass --mailbox-ids mb_1 --thread-key 'jmap:thread_1'",code:"validation_error",json:e.json,fields:e.fields}),{mailboxId:t,threadKey:e.threadKey}}async function Vu(e){let{mailboxId:t,threadKey:n}=Ur(e),i=new URLSearchParams({mailbox_id:t,thread_key:n}),s=await k(`/api/email/collaboration/coordination?${i}`),r=await s.json();if(s.ok||u(r.error||"Could not read coordination",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return b(r,e.fields);j("Conversation Coordination"),l("Conversation",r.conversation_id),l("Reply version",String(r.reply_version)),l("Presence",String(r.presence?.length||0)),l("Compose lease",r.compose_lease?.holder?.label||"none")}async function Wu(e){let{mailboxId:t,threadKey:n}=Ur(e);e.clientId||u("Client ID required",{hint:"Pass a stable --client-id for this agent process or app installation",code:"validation_error",json:e.json,fields:e.fields});let i=e.mode||"viewing";["viewing","composing"].includes(i)||u("Mode must be viewing or composing",{code:"validation_error",json:e.json,fields:e.fields});let s=await k("/api/email/collaboration/coordination",{method:"PUT",body:JSON.stringify({mailbox_id:t,thread_key:n,client_id:e.clientId,mode:i,acquire_lease:e.acquireLease!==!1})}),r=await s.json();if(s.ok||u(r.error||"Could not heartbeat presence",{code:r.code||"api_error",json:e.json,fields:e.fields}),e.json)return b(r,e.fields);j("Conversation Presence"),l("Mode",i),l("Reply version",String(r.reply_version)),l("Lease ID",r.compose_lease?.lease_id||"none"),l("Expires",r.compose_lease?.expires_at||r.presence?.find(o=>o.client_id===e.clientId)?.expires_at||"unknown")}async function Hu(e){let{mailboxId:t,threadKey:n}=Ur(e);e.clientId||u("Client ID required",{hint:"Pass the same --client-id used for presence",code:"validation_error",json:e.json,fields:e.fields});let i=await k("/api/email/collaboration/coordination",{method:"DELETE",body:JSON.stringify({mailbox_id:t,thread_key:n,client_id:e.clientId,lease_id:e.leaseId})}),s=await i.json();if(i.ok||u(s.error||"Could not release presence",{code:s.code||"api_error",json:e.json,fields:e.fields}),e.json)return b(s,e.fields);j("Conversation Presence"),l("Released",e.clientId),l("Remaining presence",String(s.presence?.length||0))}async function Ju(e){let t=e.mailboxIds?.split(",").map(r=>r.trim()).filter(Boolean)[0];t||u("Mailbox ID required",{hint:"Usage: domani email changes --mailbox-ids mb_1 [--cursor <opaque>]",code:"validation_error",json:e.json,fields:e.fields});let n=new URLSearchParams({mailbox_id:t});e.cursor&&n.set("cursor",e.cursor),e.limit&&n.set("limit",e.limit);let i=await k(`/api/email/changes?${n}`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);if(j("Mailbox Changes"),s.requires_full_sync){l("Full sync","Required"),l("Baseline cursor",s.next_cursor),de("Take a bounded mailbox snapshot, then call this command again with --cursor to replay concurrent changes.");return}s.changes.length?J(["Sequence","Type","Resource","Created"],s.changes.map(r=>[r.sequence,r.type,`${r.resource_type}:${r.resource_id||"-"}`,r.created_at]),[12,32,40,24]):console.log(` ${T.default.dim("No changes since this cursor.")}`),l("Next cursor",s.next_cursor),s.has_more&&de("More changes are available; call again with the next cursor.")}function Ki(e){return(e||"").split(",").map(t=>t.trim()).filter(Boolean)}async function Bu(e,t){let n=(t.query||(e&&!e.includes("@")?e:void 0)||"").trim();n||u("Query required",{hint:'Usage: domani email search "the invoice from tucows" [--from hi@myapp.dev] [--mode hybrid|semantic|keyword] [--limit 10] [--label billing]',code:"validation_error",json:t.json,fields:t.fields});let i=new URLSearchParams({q:n});t.mode&&i.set("mode",t.mode),t.limit&&i.set("limit",t.limit),t.slug&&t.domain&&i.set("mailbox",`${t.slug}@${t.domain}`),t.folder&&i.set("folder",t.folder),t.since&&i.set("since",t.since),t.until&&i.set("until",t.until),t.label&&i.set("label",t.label);let s=await k(`/api/emails/search?${i}`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);if(j(`Search: ${n}`),!r.results.length){console.log(` ${T.default.dim(r.hint||"No mail matches this search.")}`);return}J(["Why","From","Subject","Mailbox","Message"],r.results.map(o=>[o.why,o.message.from.slice(0,28),(o.message.subject||"").slice(0,44),o.message.mailbox.slice(0,28),o.message.id]),[8,30,46,30,28]),de(`${r.results.length} result${r.results.length===1?"":"s"} in ${r.took_ms} ms, mode ${r.mode}. Open one with: domani email thread <thread_id> --from <mailbox>`)}async function Gu(e){let{address:t}=At(e,"Usage: domani email threads --from hi@myapp.dev [--folder inbox] [--since <iso>] [--limit 25] [--cursor <cursor>] [--label billing]"),n=new URLSearchParams;e.folder&&n.set("folder",e.folder),e.since&&n.set("since",e.since),e.limit&&n.set("limit",e.limit),e.cursor&&n.set("cursor",e.cursor),e.label&&n.set("label",e.label);let i=n.toString(),s=await k(`/api/emails/${encodeURIComponent(t)}/threads${i?`?${i}`:""}`),r=await s.json();if(s.ok||u(r.error||r.message,{code:r.code,hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json)return b(r,e.fields);if(j(`Threads in ${t}`),!r.threads.length){console.log(` ${T.default.dim("No conversations here.")}`);return}J(["Messages","Unread","Subject","With","Last","Thread"],r.threads.map(o=>[String(o.message_count),String(o.unread_count),(o.subject||"").slice(0,40),o.participants.filter(a=>a!==t).join(", ").slice(0,30),o.last_message_at.slice(0,16),o.id]),[9,7,42,32,17,28]),r.next_cursor&&l("Next cursor",r.next_cursor)}async function Ku(e,t){let n=t.threadId||(e&&!e.includes("@")?e:void 0),{address:i}=At(t,"Usage: domani email thread <thread_id> --from hi@myapp.dev");n||u("Thread ID required",{hint:"Usage: domani email thread <thread_id> --from hi@myapp.dev",code:"validation_error",json:t.json,fields:t.fields});let s=await k(`/api/emails/${encodeURIComponent(i)}/threads/${encodeURIComponent(n)}`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);j(r.subject||"Conversation"),l("Messages",String(r.message_count)),l("Unread",String(r.unread_count)),l("With",r.participants.join(", "));for(let o of r.messages)console.log(`
|
|
179
|
+
${T.default.bold(o.direction==="out"?"\u2192":"\u2190")} ${o.from} ${T.default.dim(o.created_at.slice(0,16))}${o.labels?.length?` ${T.default.dim(`[${o.labels.join(", ")}]`)}`:""} ${T.default.dim(o.id)}`),o.text&&console.log(` ${o.text.replace(/\s+/g," ").trim().slice(0,300)}`)}function Za(e){return e&&!e.includes("@")?e:void 0}async function zu(e,t){let n=Za(e),{address:i}=At(t,"Usage: domani email draft <draft_id> --from hi@myapp.dev");n||u("Draft ID required",{hint:"Usage: domani email draft <draft_id> --from hi@myapp.dev",code:"validation_error",json:t.json,fields:t.fields});let s=await k(`/api/emails/${encodeURIComponent(i)}/drafts/${encodeURIComponent(n)}`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);j(r.subject||"(no subject)"),l("From",r.from||"-"),l("To",(r.to||[]).map(o=>o.address).join(", ")||"-"),r.cc?.length&&l("Cc",r.cc.map(o=>o.address).join(", ")),l("Updated",r.updated_at.slice(0,16)),r.text&&console.log(`
|
|
180
|
+
${r.text.replace(/\s+/g," ").trim().slice(0,500)}`)}async function Yu(e){let{address:t}=At(e,"Usage: domani email label --from hi@myapp.dev --message-ids m1,m2 --add billing[,urgent] [--remove old] | --set a,b"),n=Ki(e.messageIds),i=Ki(e.add),s=Ki(e.remove),r=e.set===void 0?void 0:Ki(e.set);(!n.length||!i.length&&!s.length&&r===void 0)&&u("Message IDs and labels required",{hint:"Usage: domani email label --from hi@myapp.dev --message-ids m1,m2 --add billing[,urgent] [--remove old] | --set a,b",code:"validation_error",json:e.json,fields:e.fields});let o={message_ids:n,action:"label",idempotency_key:e.idempotencyKey||(0,Dr.randomUUID)()};i.length&&(o.add=i),s.length&&(o.remove=s),r!==void 0&&(o.set=r);let a=await k(`/api/emails/${encodeURIComponent(t)}/messages/actions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}),d=await a.json();if(a.ok||u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields}),e.json)return b(d,e.fields);let m=d.results||[];j("Labels"),J(["Message","Result"],m.map(f=>[f.message_id,f.ok?f.changed?"updated":"unchanged":f.error?.message||"failed"]),[30,40])}async function Xu(e,t){let n=t.messageIds||(e&&!e.includes("@")?e:void 0),{address:i}=At(t,"Usage: domani email facts <message_id> --from hi@myapp.dev");n||u("Message ID required",{hint:"Usage: domani email facts <message_id> --from hi@myapp.dev",code:"validation_error",json:t.json,fields:t.fields});let s=await k(`/api/emails/${encodeURIComponent(i)}/messages/${encodeURIComponent(n)}/facts`),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}),t.json)return b(r,t.fields);if(j("Facts"),!r.analysed){l("Analysed","no"),l("Reason",r.reason),de(r.reason==="not_enabled"?"Enable the mailbox in the assistant: domani assistant set --enable --mailboxes <id>":"The analysis has not happened yet; try again in a minute.");return}l("Analysis",`${r.analysis.id} (${r.analysis.generated_at.slice(0,16)}, ${r.analysis.coverage})`),r.facts.length?J(["Subject","Predicate","Value","Basis"],r.facts.map(o=>[(o.subject||"").slice(0,28),(o.predicate||"").slice(0,28),`${o.value?.value??o.object??""}${o.value?.currency?` ${o.value.currency}`:""}`.slice(0,32),o.basis||""]),[30,30,34,18]):console.log(` ${T.default.dim("No claim recorded.")}`);for(let o of r.commitments)l("Promised",`${o.who}: ${o.what}`);for(let o of r.expectations)l("Awaited",`${o.who}: ${o.what}`)}async function Zu(e,t){let n=t.messageIds||(e&&!e.includes("@")?e:void 0),i=`Usage: domani email extract <message_id> --from hi@myapp.dev --schema '{"type":"object","properties":{"total":{"type":"number"}}}' [--instructions "amounts in EUR"] (or --schema @fields.json)`,{address:s}=At(t,i);(!n||!t.schema)&&u("Message ID and --schema required",{hint:i,code:"validation_error",json:t.json,fields:t.fields});let r;try{let d=t.schema.startsWith("@")?(0,Xa.readFileSync)(t.schema.slice(1),"utf8"):t.schema;r=JSON.parse(d)}catch(d){u("Schema must be JSON (inline or @file)",{hint:d instanceof Error?d.message:String(d),code:"validation_error",json:t.json,fields:t.fields})}let o=await k(`/api/emails/${encodeURIComponent(s)}/messages/${encodeURIComponent(n)}/extract`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({schema:r,...t.instructions?{instructions:t.instructions}:{}})}),a=await o.json();if(o.ok||u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields}),t.json)return b(a,t.fields);j("Extraction"),l("Confidence",String(a.confidence)),l("Cached",a.cached?"yes":"no"),l("Model",a.model);for(let[d,m]of Object.entries(a.data))l(d,m===null?T.default.dim("null"):typeof m=="object"?JSON.stringify(m):String(m));for(let d of a.evidence_quotes)console.log(` ${T.default.dim(`"${d.slice(0,120)}"`)}`)}async function Qu(e){let t=(e.mailboxIds||"").split(",").map(r=>r.trim()).filter(Boolean);t.length||u("Mailbox IDs required",{hint:"Usage: domani email work --mailbox-ids mb_1,mb_2",code:"validation_error",json:e.json,fields:e.fields});let n=new URLSearchParams({mailbox_ids:t.join(",")});e.status&&n.set("status",e.status),e.assigned&&n.set("assigned",e.assigned),e.limit&&n.set("limit",e.limit);let i=await k(`/api/email/work-queue?${n}`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);if(j("Shared Inbox Work"),!s.items.length)return console.log(` ${T.default.dim("No conversations match this queue.")}`);J(["Thread","Status","Assignee","Subject"],s.items.map(r=>[r.thread_key,r.status,r.assignee?.label||"Unassigned",r.subject||"(no subject)"]),[28,10,28,48]),s.partial&&de("This is a bounded snapshot. Increase --limit or use the API scan_limit when you need a wider queue.")}async function em(e){(!e.mailboxIds||!e.threadKey)&&u("Mailbox ID and thread key required",{hint:"Usage: domani email triage --mailbox-ids mb_1 --thread-key <key> --status closed",code:"validation_error",json:e.json,fields:e.fields});let t=e.assigneeId&&e.assigneeType?{type:e.assigneeType,id:e.assigneeId}:void 0,n=await k("/api/email/collaboration",{method:"PATCH",body:JSON.stringify({mailbox_id:e.mailboxIds.split(",")[0],thread_key:e.threadKey,thread_aliases:e.threadAliases?.split(",").map(s=>s.trim()).filter(Boolean),status:e.status,assignee:t,version:e.ifVersion?Number.parseInt(e.ifVersion,10):void 0})}),i=await n.json();if(n.ok||u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields}),e.json)return b(i,e.fields);j("Conversation Updated"),l("Status",i.status),l("Assignee",i.assignee?.label||"Unassigned"),l("Version",i.version)}async function tm(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 k(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/notes`,{method:"POST",body:JSON.stringify({body:e.note})}),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);console.log(`${y.success} Private note added`)}async function nm(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 k(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/notes`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);if(j("Private Notes"),!n.notes.length)return console.log(` ${T.default.dim("No private notes yet.")}`);J(["Author","Created","Note"],n.notes.map(i=>[i.author.label,i.created_at,i.body]),[28,24,64])}async function im(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 k(`/api/email/collaboration/${encodeURIComponent(e.conversationId)}/activity`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json)return b(n,e.fields);if(j("Conversation Activity"),!n.activity.length)return console.log(` ${T.default.dim("No activity yet.")}`);J(["Type","Actor","Created"],n.activity.map(i=>[i.type,i.actor.label,i.created_at]),[36,32,24])}async function sm(e){let t=await Ze(e);if(e.dryRun)return K("email_setup",{domain:t},e.json,e.fields);let n=C(!e.json);n.start(`Setting up email on ${$.domain(t)}`);let i=await k(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"POST"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Email ${s.status==="already_configured"?"already configured":"configured"}`),e.json){b(s,e.fields);return}if(s.records?.length){c(),j(`Email DNS Records ${$.domain(t)}`);let r=s.records.map(o=>[T.default.yellow(o.type),o.name,o.value.length>40?o.value.slice(0,40)+"...":o.value,o.status==="verified"||o.status==="created"?T.default.green(o.status):T.default.yellow(o.status)]);J(["Type","Name","Value","Status"],r,[8,28,44,12])}c(),s.hint&&de(s.hint),R("Check status:",`domani email status --domain ${t}`),c()}async function rm(e){let t=await Ze(e),n=C(!e.json);n.start(`Checking email status for ${$.domain(t)}`);let i=await k(`/api/domains/${encodeURIComponent(t)}/email/status`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Status loaded`),e.json){b(s,e.fields);return}if(j(`Email ${$.domain(t)}`),l("Enabled",s.enabled?T.default.green("yes"):T.default.dim("no")),s.enabled&&(l("Verified",s.verified?T.default.green("yes"):T.default.yellow("pending")),l("Mailboxes",String(s.mailbox_count))),c(),!s.enabled)R("Set up email:",`domani email setup --domain ${t}`),c();else if(!s.verified&&s.records?.length){console.log(` ${T.default.yellow("!")} Add these DNS records to verify:`);for(let r of s.records)console.log(` ${T.default.yellow(r.type)} ${r.name} ${T.default.dim("\u2192")} ${r.value.length>50?r.value.slice(0,50)+"...":r.value}`);c()}}async function om(e){let t=await Ze(e);if(e.dryRun)return K("email_remove",{domain:t},e.json,e.fields);let n=C(!e.json);n.start(`Removing email from ${$.domain(t)}`);let i=await k(`/api/domains/${encodeURIComponent(t)}/email/setup`,{method:"DELETE"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Email disabled`),e.json){b(s,e.fields);return}s.mailboxes_deleted>0&&console.log(` ${T.default.dim(`${s.mailboxes_deleted} mailbox(es) deleted.`)}`),c()}async function Ka(e){let t=C(!e.json);t.start("Loading mailboxes");let n=e.domain?`?domain=${encodeURIComponent(e.domain)}`:"",i=await k(`/api/emails${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.mailboxes||[];if(t.stop(`${y.success} ${r.length} mailbox(es)`),e.json){b(s,e.fields);return}if(r.length===0){c(),console.log(` ${T.default.dim("No mailboxes.")}`),c(),R("Create one:","domani email create hello@example.com"),c();return}c(),j("Mailboxes");let o=r.map(a=>[T.default.cyan(a.address),String(a.message_count),a.webhook_url?$.url(a.webhook_url):T.default.dim("-"),T.default.dim(new Date(a.created_at).toLocaleDateString())]);J(["Address","Messages","Webhook","Created"],o,[32,10,36,14]),c()}async function am(e){let t=await Ze(e);if(e.dryRun)return K("email_create_mailbox",{domain:t,slug:e.slug,workspace_id:e.workspace},e.json,e.fields);let n=e.slug;if(!n&&!e.json){let m=await Ue({message:`Email handle for @${t}:`,placeholder:"hello"});ae(m)&&process.exit(0),n=m}n||u("Slug required",{hint:`Usage: domani email create hello@${t}`,code:"validation_error",json:e.json,fields:e.fields});let i=`${n}@${t}`,s=C(!e.json);s.start("Creating mailbox");let r=await k("/api/emails",{method:"POST",body:JSON.stringify({address:i,workspace_id:e.workspace})}),o=await r.json();if(r.status===202&&!e.json){s.stop("");let m=o.txt_record,f=o.email_records||[],p=[{type:"TXT",name:m?.name||"@",value:m?.value||"",note:"ownership proof"},...f];c(),console.log(" Add these records at your DNS provider:"),c();for(let O of p){let S=O.priority!==void 0?` ${T.default.dim(`priority: ${O.priority}`)}`:"",I=O.note?` ${T.default.dim(`(${O.note})`)}`:"";console.log(` ${T.default.yellow(O.type)} ${T.default.bold(O.name)}${S}${I}`),console.log(` ${T.default.dim("\u2192")} ${T.default.cyan(O.value)}`),c()}de("DNS propagation typically takes 5-30 minutes. Checking automatically..."),c();let w=p.map(O=>({cells:[T.default.yellow(O.type),O.name,O.note?T.default.dim(`(${O.note})`):""],status:"pending"})),_=nn(["Type","Name",""],w,[6,24,16]);_.start();let v=0;for(;r.status===202&&v<60;)await Rt(15e3),v++,r=await k("/api/emails",{method:"POST",body:JSON.stringify({address:i,workspace_id:e.workspace})}),o=await r.json(),r.status!==202&&!r.ok&&(_.stop(),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));r.status===202&&(_.stop(),u("TXT record not detected after 15 minutes.",{hint:`Check the record is set, then retry: domani email create ${i}`,code:"timeout",json:e.json,fields:e.fields})),_.markDone(0);let g=O=>`${O.type}:${O.name}`,x=new Map;p.slice(1).forEach((O,S)=>x.set(g(O),S+1));for(let O=0;O<60;O++){await Rt(15e3);let S=await k(`/api/domains/${encodeURIComponent(t)}/email/status`),I=await S.json();if(S.ok&&I.records){for(let q of I.records)if(q.status==="verified"||q.status==="created"){let F=x.get(g(q));F!==void 0&&_.markDone(F)}}if(S.ok&&I.verified)break}_.stop(),c()}if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),s.stop(`${y.success} ${T.default.cyan(o.address)} created`),e.json){b(o,e.fields);return}let a=await k(`/api/domains/${encodeURIComponent(t)}/email/status`),d=await a.json();c(),a.ok&&d.verified?(R("Read inbox:",`domani email inbox ${o.address}`),R("Web inbox:",`${Tn}/inbox?address=${encodeURIComponent(o.address)}`)):(R("Check propagation:",`domani email status --domain ${t}`),R("Web inbox:",`${Tn}/inbox?address=${encodeURIComponent(o.address)}`)),c()}async function dm(e){let t=await Ze(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 K("email_delete_mailbox",{domain:t,address:`${e.slug}@${t}`},e.json,e.fields);let n=C(!e.json);n.start(`Deleting ${e.slug}@${t}`);let i=encodeURIComponent(`${e.slug}@${t}`),s=await k(`/api/emails/${i}`,{method:"DELETE",body:JSON.stringify({confirm:!0})}),r=await s.json();if(s.ok||(n.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Mailbox deleted`),e.json){b(r,e.fields);return}console.log(` ${T.default.dim(`${r.address} and all messages deleted.`)}`),c()}function Qa(){let e=Intl.DateTimeFormat().resolvedOptions();return{locale:e.locale,timeZone:e.timeZone}}function ed(e){let t={to:Yi(zi(e.to))},n=Yi(zi(e.cc)),i=Yi(zi(e.bcc));if(n&&(t.cc=n),i&&(t.bcc=i),e.subject&&(t.subject=e.subject),e.text&&(t.text=e.text),e.inReplyTo)if(t.in_reply_to=e.inReplyTo,e.quote!==!1){let{locale:s,timeZone:r}=Qa();t.quote_original={locale:s,time_zone:r}}else t.quote_original=!1;return e.references&&(t.references=e.references),e.sendAt&&(t.send_at=e.sendAt),t}async function lm(e){let t=await Ze(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 K("email_send",{from:`${e.slug}@${t}`,to:e.to,subject:e.subject},e.json,e.fields);let n=C(!e.json);n.start(`Sending from ${e.slug}@${t}`);let i=ed(e),s=encodeURIComponent(`${e.slug}@${t}`),r=await k(`/api/emails/${s}/send`,{method:"POST",body:JSON.stringify(i)}),o=await r.json();if(!r.ok){n.stop("Failed");let d=o.code==="MONTHLY_LIMIT_EXCEEDED"?`Run ${T.default.cyan("domani upgrade")} to switch to Pro (10,000 emails/month).`:o.hint;u(o.error||o.message,{hint:d,status:r.status,json:e.json,fields:e.fields})}let a=Array.isArray(o.to)?o.to.join(", "):o.to;if(n.stop(o.status==="scheduled"?`${y.success} Scheduled for ${T.default.cyan(e.sendAt||"")} to ${T.default.cyan(a)} ${T.default.dim("(trash the message before then to cancel)")}`:`${y.success} Sent to ${T.default.cyan(a)}`),e.json){b(o,e.fields);return}}function At(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 td(e,t,n,i,s){let r=C(!n.json);r.start(i);let o=await k(e,{method:"POST",body:JSON.stringify(t)}),a=await o.json();o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:n.json,fields:n.fields})),r.stop(s(a)),n.json&&b(a,n.fields)}async function cm(e){let t='Usage: domani email escalate hello@example.com --message-id MSG_ID [--reason "refund over $500"] [--clear]',{address:n}=At(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let i={};e.reason&&(i.reason=e.reason),e.clear&&(i.clear=!0),await td(`/api/emails/${encodeURIComponent(n)}/messages/${encodeURIComponent(e.messageId)}/escalate`,i,e,e.clear?"Clearing escalation":"Flagging for a human",s=>s.needs_human?`${y.success} Flagged for a human ${T.default.dim("(conversation held, email.escalated fired)")}`:`${y.success} Escalation cleared`)}async function um(e){let t='Usage: domani email remind hello@example.com --message-id MSG_ID --at 2026-09-03T09:00:00Z [--note "chase the invoice"] [--clear]',{address:n}=At(e,t);e.messageId||u("Message ID required",{hint:t,code:"validation_error",json:e.json,fields:e.fields}),!e.at&&!e.clear&&u("Reminder time required",{hint:t,code:"validation_error",json:e.json,fields:e.fields});let i={};e.at&&(i.remind_at=e.at),e.note&&(i.note=e.note),e.clear&&(i.clear=!0),await td(`/api/emails/${encodeURIComponent(n)}/messages/${encodeURIComponent(e.messageId)}/remind`,i,e,e.clear?"Clearing reminder":"Setting follow-up reminder",s=>s.remind_at?`${y.success} Reminder set for ${T.default.cyan(String(s.remind_at))} ${T.default.dim("(fires only if still unanswered)")}`:`${y.success} Reminder cleared`)}function nd(e){let t=new URLSearchParams;e.q&&t.set("q",e.q),e.limit&&t.set("limit",e.limit),e.order&&t.set("order",e.order),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function mm(e){let t=await k(`/api/contacts${nd(e)}`),n=await t.json();if(t.ok||u(n.error||n.message,{hint:n.hint,status:t.status,json:e.json,fields:e.fields}),e.json){b(n,e.fields);return}let i=n.contacts||[];if(i.length===0){console.log(T.default.dim("No contacts yet. The address book fills itself as mail flows in and out."));return}for(let s of i){let r=s.name?` ${T.default.dim(s.name)}`:"",o=s.notes?` ${T.default.dim("-")} ${s.notes}`:"";console.log(`${T.default.cyan(s.address)}${r} ${T.default.dim(`(${s.message_count} msg${s.message_count!==1?"s":""}, last ${s.last_direction||"-"})`)}${o}`)}n.next_cursor&&console.log(T.default.dim(`More: --cursor ${n.next_cursor}`))}function id(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 fm(e){let n=id(e,'Usage: domani email contact-add ada@example.com [--name "Ada"] [--notes "prefers short emails"]'),i={address:n};e.name!==void 0&&(i.name=e.name),e.notes!==void 0&&(i.notes=e.notes);let s=await k("/api/contacts",{method:"POST",body:JSON.stringify(i)}),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json){b(r,e.fields);return}console.log(`${y.success} Contact ${T.default.cyan(n)} saved.`)}async function pm(e){let n=id(e,"Usage: domani email contact-remove ada@example.com"),i=await k(`/api/contacts/${encodeURIComponent(n)}`,{method:"DELETE"}),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json){b(s,e.fields);return}console.log(s.deleted?`${y.success} Contact ${T.default.cyan(n)} deleted.`:T.default.dim(`No contact ${n}.`))}async function hm(e){let t='Usage: domani email tone hello@example.com [--set "lowercase, friendly, sign as Ada"] [--clear]',{address:n}=At(e,t),i=encodeURIComponent(n);if(e.set===void 0&&!e.clear){let o=await k(`/api/emails/${i}`),a=await o.json();if(o.ok||u(a.error||a.message,{hint:a.hint,status:o.status,json:e.json,fields:e.fields}),e.json){b({address:n,tone_notes:a.tone_notes??null},e.fields);return}console.log(a.tone_notes?a.tone_notes:T.default.dim(`No tone notes on ${n}. Set them with --set.`));return}let s=await k(`/api/emails/${i}`,{method:"PATCH",body:JSON.stringify({tone_notes:e.clear?null:e.set})}),r=await s.json();if(s.ok||u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields}),e.json){b(r,e.fields);return}console.log(e.clear?`${y.success} Tone notes cleared on ${T.default.cyan(n)}.`:`${y.success} Tone notes set on ${T.default.cyan(n)}.`)}function sd(e){let t=new URLSearchParams;e.direction&&t.set("direction",e.direction),e.folder&&t.set("folder",e.folder),e.view&&t.set("view",e.view),e.limit&&t.set("limit",e.limit),e.since&&t.set("since",e.since),e.until&&t.set("until",e.until),e.label&&t.set("label",e.label),e.kind&&t.set("kind",e.kind),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function gm(e){let t=await Ze(e);e.slug||u("Slug required",{hint:"Usage: domani email inbox hello@example.com [--direction in|out] [--kind person,update] [--limit 20] [--cursor <next_cursor>]",code:"validation_error",json:e.json,fields:e.fields});let n=sd(e),i=C(!e.json);i.start(`Loading messages for ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),r=await k(`/api/emails/${s}/messages${n}`),o=await r.json();r.ok||(i.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields}));let a=o.messages||[];if(e.json){i.stop(`${y.success} ${a.length} message(s)`),b(o,e.fields);return}if(a.length===0){i.stop(`${T.default.dim("No messages")}`);return}let d=a.length>1?"s":"";i.stop(`${y.success} ${T.default.cyan(`${e.slug}@${t}`)} ${T.default.dim("\xB7 "+a.length+" message"+d)}`);for(let m of a){let f=m.direction==="in"?`${T.default.green("in ")}${m.kind?` ${T.default.dim(m.kind.padEnd(10))}`:""}`:T.default.dim("out"),p=m.direction==="in"?m.from:m.to,w=m.subject||"(no subject)",_=T.default.dim(new Date(m.created_at).toLocaleString()),v=w;if(m.text){let g=m.text.replace(/\s+/g," ").trim(),x=g.length>60?g.slice(0,60)+"\u2026":g;v=`${w} ${T.default.dim("- "+x)}`}console.log(` ${f} ${p.padEnd(30)} ${v} ${_}`)}o.next_cursor&&console.log(T.default.dim(`More: --cursor ${o.next_cursor}`))}async function ym(e){let t=await Ze(e);e.slug||u("Slug required",{hint:"Usage: domani email folders hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=encodeURIComponent(`${e.slug}@${t}`),i=await k(`/api/emails/${n}/folders`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);j(`Folders for ${e.slug}@${t}`);for(let r of s.folders||[])l(r.id,`${r.total} total, ${r.unread} unread`);for(let r of s.views||[])l(r.id,`${r.total} total, ${r.unread} unread`)}async function bm(e){let t=await Ze(e);e.slug||u("Slug required",{hint:"Usage: domani email drafts hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=encodeURIComponent(`${e.slug}@${t}`),i=await k(`/api/emails/${n}/drafts`),s=await i.json();if(i.ok||u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}),e.json)return b(s,e.fields);j(`Drafts from ${e.slug}@${t}`);let r=s.drafts||[];if(!r.length){console.log(` ${T.default.dim("No drafts.")}`);return}for(let o of r){let a=o.to.map(p=>p.address).join(", "),d=o.subject||"(no subject)",m=(o.text||"").replace(/\s+/g," ").trim(),f=m.length>60?m.slice(0,60)+"\u2026":m;console.log(` ${T.default.dim(o.updated_at.slice(0,16))} ${a.padEnd(30)} ${d}${f?T.default.dim(" - "+f):""} ${T.default.dim(o.id)}`)}}async function wm(e,t){let n=await Ze(t);t.slug||u("Slug required",{hint:`Usage: domani email ${e} hello@example.com --message-ids id1,id2`,code:"validation_error",json:t.json,fields:t.fields});let i=(t.messageIds||"").split(",").map(f=>f.trim()).filter(Boolean);i.length||u("Message IDs required",{hint:"Pass --message-ids id1,id2",code:"validation_error",json:t.json,fields:t.fields});let s={message_ids:i,idempotency_key:t.idempotencyKey||(0,Dr.randomUUID)()};if((e==="archive"||e==="trash")&&Object.assign(s,{action:"move",destination:e==="archive"?"archive":"trash"}),e==="restore"&&(s.action="restore"),(e==="read"||e==="unread")&&Object.assign(s,{action:"mark_read",read:e==="read"}),(e==="star"||e==="unstar")&&Object.assign(s,{action:"star",starred:e==="star"}),t.dryRun)return K("email_messages_action",{address:`${t.slug}@${n}`,...s},t.json,t.fields);let r=encodeURIComponent(`${t.slug}@${n}`),o=await k(`/api/emails/${r}/messages/actions`,{method:"POST",body:JSON.stringify(s)}),a=await o.json();if(!o.ok&&o.status!==207&&u(a.error||a.message,{hint:a.hint,status:o.status,json:t.json,fields:t.fields}),t.json)return b(a,t.fields);let d=(a.results||[]).filter(f=>f.ok).length,m=(a.results||[]).length-d;console.log(`${y.success} ${d} updated${m?T.default.yellow(`, ${m} failed`):""}`),a.operation_id&&(l("Operation",a.operation_id),l("Idempotency key",a.idempotency_key),a.idempotent_replay&&l("Receipt","replayed (no duplicate mutation)"))}async function $m(e){let t=await Ze(e);e.slug||u("Slug required",{hint:"Usage: domani email webhook hello@example.com --url https://...",code:"validation_error",json:e.json,fields:e.fields});let n=`${e.slug}@${t}`,i=encodeURIComponent(n),s;try{s=rn(e)}catch(a){u(a instanceof Error?a.message:"Invalid webhook headers",{hint:"Set the named environment variable, or remove the conflicting header option.",code:"validation_error",json:e.json,fields:e.fields})}let r;if(e.events!==void 0&&(r=e.events.split(",").map(a=>a.trim()).filter(Boolean),r.length===0&&u("--events needs at least one event",{hint:"Example: --events email.received,email.bounced,email.delivered",code:"validation_error",json:e.json,fields:e.fields}),e.url||u("--url is required when changing webhook events",{hint:"Pass the existing webhook URL together with --events.",code:"validation_error",json:e.json,fields:e.fields})),!e.url&&s!==void 0&&u("--url is required when changing webhook auth headers",{hint:"Pass the existing webhook URL with --authorization-env, --api-key-env, or --clear-headers.",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return K("email_webhook",{address:n,webhook_url:e.url||null,...r!==void 0?{events:r}:{},...s!==void 0?{header_names:on(s)}:{}},e.json,e.fields);let o=C(!e.json);if(e.url){o.start(`Setting webhook for ${n}`);let a=await k(`/api/emails/${i}/webhook`,{method:"PUT",body:JSON.stringify({url:e.url,...s!==void 0?{headers:s}:{},...r!==void 0?{events:r}:{}})}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${y.success} Webhook set`),e.json){b(d,e.fields);return}j(`Mailbox ${d.address}`),l("Webhook",$.url(d.webhook_url)),l("Events",d.events?.join(", ")||T.default.dim("email.received")),l("Auth headers",d.header_names?.join(", ")||T.default.dim("none")),l("Signing secret",T.default.dim(d.signing_secret)),c()}else{o.start(`Removing webhook for ${n}`);let a=await k(`/api/emails/${i}/webhook`,{method:"DELETE"}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:e.json,fields:e.fields})),o.stop(`${y.success} Webhook removed`),e.json){b(d,e.fields);return}j(`Mailbox ${d.address}`),l("Webhook",T.default.dim("none")),c()}}async function vm(e){let t=await Ze(e);e.slug||u("Slug required",{hint:"Usage: domani email webhook-test hello@example.com",code:"validation_error",json:e.json,fields:e.fields});let n=`${e.slug}@${t}`;if(e.dryRun)return K("email_webhook_test",{address:n},e.json,e.fields);let i=C(!e.json);i.start(`Testing webhook for ${n}`);let s=await k(`/api/emails/${encodeURIComponent(n)}/webhook/test`,{method:"POST"}),r=await s.json();if((!s.ok||!r.success)&&(i.stop("Failed"),u(r.error||r.message||"Webhook test failed",{hint:r.hint||"Check the endpoint and sender authentication, then retry.",status:s.status,json:e.json,fields:e.fields})),i.stop(`${y.success} Test delivered`),e.json)return b(r,e.fields);j(`Mailbox ${n}`),l("Delivery",T.default.green("successful")),typeof r.status=="number"&&l("Endpoint",`HTTP ${r.status}`),c()}async function _m(e){let t=await Ze(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 K("email_forward",{address:`${e.slug}@${t}`,forward_to:e.forwardTo||null},e.json,e.fields);let n=C(!e.json),i=e.forwardTo||null;n.start(`Updating forward for ${e.slug}@${t}`);let s=encodeURIComponent(`${e.slug}@${t}`),r=await k(`/api/emails/${s}`,{method:"PATCH",body:JSON.stringify({forward_to:i})}),o=await r.json();if(r.ok||(n.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Forward ${i?"set":"removed"}`),e.json){b(o,e.fields);return}j(`Mailbox ${o.address}`),l("Forward to",o.forward_to?T.default.cyan(o.forward_to):T.default.dim("none")),c()}async function za(e,t,n){let i=C(!t);i.start(`Checking email health for ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}/email/check`),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop("Email health checked"),t){b(r,n);return}if(j(`Email Health ${$.domain(r.domain)}`),r.provider?l("Provider",T.default.cyan(Nr(r.provider))):l("Provider",T.default.dim("unknown")),r.mx.configured?l("MX",`${y.success} ${T.default.green("propagated")} ${T.default.dim(`(${r.mx.records.length} record${r.mx.records.length!==1?"s":""})`)}`):l("MX",`${y.error} ${T.default.red("not configured")}`),r.spf.configured?l("SPF",`${y.success} ${T.default.green(r.spf.value)}`):l("SPF",`${y.error} ${T.default.red("missing")}`),r.dmarc.configured){let o=r.dmarc.value.length>50?r.dmarc.value.slice(0,50)+"...":r.dmarc.value;l("DMARC",`${y.success} ${T.default.green(o)}`)}else l("DMARC",`${y.error} ${T.default.red("missing")}`);r.dkim.configured?l("DKIM",`${y.success} ${T.default.green("found")} ${T.default.dim(`(${r.dkim.selectors.join(", ")})`)}`):l("DKIM",`${y.warning} ${T.default.yellow("not found")}`),c(),r.mx.configured?(!r.spf.configured||!r.dmarc.configured)&&(de("SPF and DMARC protect against email spoofing. Re-run email setup to add them."),c()):(R("Set up email:",`domani email ${e} google`),c())}async function Ya(e,t,n,i){return t?od(e,t,n,i):rd(e,n,i)}async function rd(e,t,n){let i=C(!t);i.start("Loading email providers");let s=await k(`/api/domains/${encodeURIComponent(e)}/connect`),r=await s.json();s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop("Providers loaded");let o=r.providers?.email||[];o.length===0&&u("No email providers available",{code:"not_found",json:t,fields:n});let a=await lt({message:"Choose an email provider",options:o.map(d=>({value:d.name,label:Nr(d.name)}))});return ae(a)&&process.exit(0),od(e,a,t,n)}async function od(e,t,n,i){if(n){let m=await k(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),f=await m.json();m.ok||u(f.error||f.message,{hint:f.hint,status:m.status,json:n,fields:i}),b(f,i);return}let s=await k(`/api/domains/${encodeURIComponent(e)}/connect?provider=${encodeURIComponent(t)}`);if(!s.ok){let m=await s.json();u(m.error||m.message,{hint:m.hint,status:s.status,json:n,fields:i})}let r=await s.json(),o=r.preview?.records??[],a=r.preview?.provider??t,d=Nr(a);if(j(`Email ${$.domain(e)}`),l("Provider",T.default.cyan(d)),o.length){c(),console.log(` ${T.default.bold("DNS Records")}`);let m=[8,24,40],f=nn(["Type","Name","Value"],o.map(O=>({cells:Fu(O),status:"pending"})),m);f.start();let p=await k(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),w=await p.json();p.ok||(f.stop(),c(),u(w.error||w.message,{hint:w.hint,status:p.status,json:n,fields:i}));let _=w.records||[];for(let O=0;O<o.length;O++)_.find(I=>I.record.type===o[O].type&&I.record.name===o[O].name&&I.record.value===o[O].value)?.status==="already_set"||await Rt(60),f.markDone(O);await Rt(80),f.stop();let v=_.filter(O=>O.status==="created"||O.status==="updated").length,g=_.filter(O=>O.status==="already_set").length,x;g===_.length?x=`All ${g} records already set`:g>0?x=`${v} created, ${g} already set`:x=`${v} DNS records set`,c(),console.log(` ${y.success} ${T.default.green(`Email configured - ${x}`)}`)}else{let m=C(!0);m.start("Setting DNS records");let f=await k(`/api/domains/${encodeURIComponent(e)}/connect`,{method:"POST",body:JSON.stringify({target:t})}),p=await f.json();f.ok||(m.stop("Failed"),u(p.error||p.message,{hint:p.hint,status:f.status,json:n,fields:i})),m.stop(`${y.success} Email configured via ${T.default.cyan(d)}`)}c(),R("Verify propagation:",`domani email ${e} --check`),c()}var T,Dr,Xa,Mu,qu,Mr=$e(()=>{"use strict";G();En();T=D(L(),1);Me();V();ve();st();Dr=require("node:crypto"),Xa=require("node:fs");Ji();Er();Ga();Mu=["setup","status","remove","list","create","delete","send","inbox","folders","drafts","draft","archive","trash","restore","read","unread","star","unstar","webhook","forward","check","connect","work","triage","notes","note","activity","changes","coordination","presence","release-presence","escalate","remind","contacts","contact-add","contact-remove","tone","search","threads","thread","label","facts","extract","spam","not-spam","decisions","sender-rules","sender-rule-add","sender-rule-remove"],qu={"google-workspace":"Google Workspace",fastmail:"Fastmail",proton:"Proton Mail"}});var ld={};gn(ld,{dns:()=>Fr,nextDnsRecords:()=>dd});function dd(e,t,n){let i=r=>r.type===t.type&&r.name===t.name;return n==="add"&&e.some(r=>i(r)&&r.value===t.value)?{kind:"unchanged"}:n==="add"&&t.type==="CNAME"&&e.some(i)?{kind:"cname_taken"}:{kind:"write",records:[...n==="add"?e:e.filter(r=>!i(r)),{...t,ttl:3600}]}}async function Fr(e,t,n,i,s,r){e||(e=await be()),X(e,r);let o=r?.json??!1,a=r?.type||n,d=r?.name||i,m=r?.value||s;if(!t||t==="get"){let f=C(!o);f.start(`Loading DNS for ${$.domain(e)}`);let p=await k(`/api/domains/${encodeURIComponent(e)}/dns`),w=await p.json();if(p.ok||(f.stop("Failed"),u(w.error||w.message,{hint:w.hint,status:p.status,json:o,fields:r?.fields})),f.stop(`${w.records.length} record(s)`),o){b(w,r?.fields);return}if(w.records.length===0){c(),console.log(` ${Ce.default.dim(`No DNS records for ${e}`)}`),c(),R("Auto-configure DNS:",`domani connect ${e}`),c();return}let _=[8,24,40,8];j(`DNS ${$.domain(e)}`,_.reduce((g,x)=>g+x,0)+_.length-1);let v=w.records.map(g=>{let x=g.priority?Ce.default.dim(` pri=${g.priority}`):"";return[Ce.default.yellow(g.type),g.name,Ce.default.cyan(g.value)+x,Ce.default.dim(String(g.ttl))]});J(["Type","Name","Value","TTL"],v,_),c();return}if(t==="set"||t==="add"){let f=t==="add";if((!a||!d||!m)&&u(`Missing arguments for dns ${t}`,{hint:`Usage: domani dns <domain> ${t} --type A --name www --value 1.2.3.4`,code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return K(f?"dns_add":"dns_set",{domain:e,record:{type:a.toUpperCase(),name:d,value:m,ttl:3600}},o,r?.fields);let p=C(!o);p.start(`${f?"Adding":"Setting"} ${Ce.default.yellow(a.toUpperCase())} record`);let w=await k(`/api/domains/${encodeURIComponent(e)}/dns`),_=await w.json();w.ok||(p.stop("Failed"),u(_.error||_.message||"Could not read the current DNS records; nothing was changed.",{hint:_.hint,status:w.status,json:o,fields:r?.fields}));let v=_.records??[],g=a.toUpperCase(),x=dd(v,{type:g,name:d,value:m},f?"add":"set");if(x.kind==="unchanged"){p.stop(`${y.success} ${Ce.default.yellow(g)} ${d} ${y.arrow} ${Ce.default.cyan(m)} already exists`),o&&b({records:v,unchanged:!0},r?.fields);return}x.kind==="cname_taken"&&(p.stop("Failed"),u(`${d} already has a CNAME record; a name can hold only one.`,{hint:`Replace it with: domani dns ${e} set --type CNAME --name ${d} --value ${m}`,code:"validation_error",json:o,fields:r?.fields}));let O=x.records,S=await k(`/api/domains/${encodeURIComponent(e)}/dns`,{method:"PUT",body:JSON.stringify({records:O})}),I=await S.json();S.ok||(p.stop("Failed"),u(I.error||I.message,{hint:I.hint,status:S.status,json:o,fields:r?.fields})),p.stop(`${y.success} ${Ce.default.yellow(a.toUpperCase())} ${d} ${y.arrow} ${Ce.default.cyan(m)}`),o?b(I,r?.fields):(c(),R("Check propagation:",`domani status ${e}`),c());return}if(t==="delete"){if((!a||!d)&&u("Missing arguments for dns delete",{hint:"Usage: domani dns <domain> delete --type A --name www",code:"validation_error",json:o,fields:r?.fields}),r?.dryRun)return K("dns_delete",{domain:e,record:{type:a.toUpperCase(),name:d}},o,r?.fields);let f=C(!o);f.start(`Deleting ${Ce.default.yellow(a.toUpperCase())} ${d}`);let p=await k(`/api/domains/${encodeURIComponent(e)}/dns?type=${encodeURIComponent(a.toUpperCase())}&name=${encodeURIComponent(d)}`,{method:"DELETE"}),w=await p.json();p.ok||(f.stop("Failed"),u(w.error||w.message,{hint:w.hint,status:p.status,json:o,fields:r?.fields})),f.stop(`${y.success} Deleted ${Ce.default.yellow(a.toUpperCase())} ${d}`),o?b(w,r?.fields):(c(),R("Check propagation:",`domani status ${e}`),c());return}if(t==="snapshot"){if(r?.dryRun)return K("dns_snapshot",{domain:e},o,r?.fields);let f=C(!o);f.start(`Capturing DNS snapshot for ${$.domain(e)}`);let p=await k(`/api/domains/${encodeURIComponent(e)}/dns/snapshot`,{method:"POST"}),w=await p.json();p.ok||(f.stop("Failed"),u(w.error||w.message,{hint:w.hint,status:p.status,json:o,fields:r?.fields}));let _=w.records?.length??0;if(f.stop(`${y.success} Captured ${_} record(s)`),o){b(w,r?.fields);return}let v=`${e}.dns.json`,g=(0,qr.resolve)(process.cwd(),v);(0,Xi.writeFileSync)(g,JSON.stringify(w,null,2)+`
|
|
181
|
+
`),j("DNS Snapshot"),l("Domain",$.domain(w.domain)),l("Records",String(_)),l("Subdomains",String(w.subdomains?.length??0)),l("Sources",(w.sources||[]).join(", ")||"none"),l("Captured",w.capturedAt||w.captured_at||"now"),l("Saved to",Ce.default.cyan(v)),c(),R("Restore from this snapshot:",`domani dns ${e} restore --file ${v}`),c();return}if(t==="restore"){if(r?.dryRun)return K("dns_restore",{domain:e,source:r?.file||"server_backup"},o,r?.fields);let f=C(!o),p;if(r?.file){let v=(0,qr.resolve)(process.cwd(),r.file);v.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 g=(0,Xi.readFileSync)(v,"utf-8"),x=JSON.parse(g);p=JSON.stringify({snapshot:x}),f.start(`Restoring DNS for ${$.domain(e)} from ${Ce.default.cyan(r.file)}`)}catch(g){u(`Failed to read snapshot file: ${g instanceof Error?g.message:"unknown"}`,{hint:`Make sure ${r.file} exists and contains valid JSON.`,code:"validation_error",json:o,fields:r?.fields})}}else f.start(`Restoring DNS for ${$.domain(e)} from server backup`);let w=await k(`/api/domains/${encodeURIComponent(e)}/dns/restore`,{method:"POST",...p?{body:p}:{}}),_=await w.json();if(w.ok||(f.stop("Failed"),u(_.error||_.message,{hint:_.hint,status:w.status,json:o,fields:r?.fields})),f.stop(`${y.success} Restored DNS`),o){b(_,r?.fields);return}if(j("DNS Restored"),l("Domain",$.domain(_.domain)),l("Applied",Ce.default.green(String(_.applied??0))),l("Skipped",Ce.default.dim(String(_.skipped??0))),_.errors?.length>0){l("Errors",Ce.default.red(String(_.errors.length)));for(let v of _.errors)console.log(` ${Ce.default.red("\u2022")} ${v}`)}c(),R("Verify DNS records:",`domani dns ${e}`),c();return}u(`Unknown action: ${t}`,{hint:"Use 'get', 'set', 'add', 'delete', 'snapshot', or 'restore'.",code:"validation_error",json:o,fields:r?.fields})}var Ce,Xi,qr,Lr=$e(()=>{"use strict";G();Ce=D(L(),1);V();ve();st();Xi=require("node:fs"),qr=require("node:path")});var cd={};gn(cd,{status:()=>Vr});function km(e){return[ut.default.yellow(e.type),e.name,ut.default.cyan(e.value)+(e.priority?ut.default.dim(` pri=${e.priority}`):"")]}function xm(e){if(j(`Status ${$.domain(e.domain)}`),e.expires){let t=new Date(e.expires).toLocaleDateString(),n=e.days_until_expiry,i=n!=null&&n<30?ut.default.red:n!=null&&n<90?ut.default.yellow:ut.default.green;l("Expires",`${t} ${ut.default.dim("(")}${i(`${n} days`)}${ut.default.dim(")")}`)}}async function Vr(e,t){if(e||(e=await be()),X(e,t),t.json){let p=await k(`/api/domains/${encodeURIComponent(e)}/status`),w=await p.json();p.ok||u(w.error||w.message,{hint:w.hint,status:p.status,json:t.json,fields:t.fields}),b(w,t.fields);return}let n=C(!0);n.start(`Checking ${$.domain(e)}`);let i;try{i=await k(`/api/domains/${encodeURIComponent(e)}/status`,{headers:{Accept:"text/event-stream"},signal:AbortSignal.timeout(t.timeout?parseInt(t.timeout,10)*1e3:3e4)})}catch{n.stop("Failed"),u("Request timed out",{hint:"The status check took too long. Try again.",code:"timeout",json:t.json,fields:t.fields})}if(!i.ok){n.stop("Failed");try{let p=await i.json();u(p.error||p.message,{hint:p.hint,status:i.status,json:t.json,fields:t.fields})}catch{u(`Server error (${i.status})`,{status:i.status,json:t.json,fields:t.fields})}}let s=i.body;s||(n.stop("Failed"),u("Empty response"));let r=new TextDecoder,o="",a=null,d=[],m=!1,f="";try{for await(let p of s){o+=r.decode(p,{stream:!0});let w=o.split(`
|
|
182
|
+
`);o=w.pop()??"";for(let _ of w)if(_.startsWith("event: "))f=_.slice(7);else if(_.startsWith("data: ")){let v=JSON.parse(_.slice(6));if(f==="info"&&(n.stop("Status retrieved"),m=!0,xm(v)),f==="records")if(d=v,d.length>0){c(),console.log(` ${ut.default.bold("DNS Records")}`);let g=[8,10,34];a=nn(["Type","Name","Value"],d.map(x=>({cells:km(x),status:"pending"})),g),a.start()}else c(),l("DNS",ut.default.dim("no records")),R("Auto-configure DNS:",`domani connect ${e}`);if(f==="propagation"&&a){let{index:g,propagated:x}=v,O=x?y.success:`${y.warning}`;a.markDone(g,O)}f==="done"&&a&&a.stop(),f==="error"&&(m||n.stop("Failed"),a&&a.stop(),u(v.message||"Status check failed"))}}}catch{m||n.stop("Failed"),a&&a.stop(),u("Connection lost",{hint:"The status check was interrupted. Try again.",code:"connection_lost",json:t.json,fields:t.fields})}m||n.stop("Done"),c()}var ut,Wr=$e(()=>{"use strict";G();ut=D(L(),1);V();ve();st()});var zn={};gn(zn,{buy:()=>Jr});async function Hr(e){let t=await lt({message:`What's next for ${je.default.cyan(e)}?`,options:[{value:"connect",label:"Connect to a service",hint:"domani connect"},{value:"email",label:"Set up email",hint:"domani email setup"},{value:"dns",label:"Configure DNS",hint:"domani dns"},{value:"status",label:"Check status & DNS propagation",hint:"domani status"},{value:"done",label:"Done"}]});if(ae(t)||t==="done"){c();return}if(c(),t==="connect"){let{connect:n}=await Promise.resolve().then(()=>(Ir(),Ma));await n(e,void 0,{})}else if(t==="email"){let n=await Ue({message:`Mailbox name for ${je.default.cyan(e)}`,placeholder:"e.g. hey, hello, contact"});if(ae(n)||!n){c();return}c();let{email:i}=await Promise.resolve().then(()=>(Mr(),ad));await i("create",void 0,{domain:e,slug:n})}else if(t==="dns"){let{dns:n}=await Promise.resolve().then(()=>(Lr(),ld));await n(e)}else if(t==="status"){let{status:n}=await Promise.resolve().then(()=>(Wr(),cd));await n(e,{})}}async function ud(e,t,n,i,s){let r=C(!s.json);r.start(i);let o=await k("/api/domains/buy",{method:"POST",headers:{Accept:"text/event-stream"},body:JSON.stringify({domain:e,...t!==void 0?{years:t}:{},...n!==void 0?{max_price:n}:{}})});if(!o.ok||!o.body){let _=await o.json().catch(()=>({})),v=Vt(_);if(v!==void 0)return r.stop("Price changed - nothing was charged"),{refused:{price:v,error:_.error,renewal_price:_.renewal_price,listed_price:_.listed_price}};r.stop("Purchase failed"),Hi(_,o.status,s)}let a={},d=new TextDecoder,m="",f="";for await(let _ of o.body){m+=d.decode(_,{stream:!0});let v=m.split(`
|
|
183
|
+
`);m=v.pop()??"";for(let g of v)if(g.startsWith("event: "))f=g.slice(7).trim();else if(g.startsWith("data: ")){let x=JSON.parse(g.slice(6));if(f==="checking")r.message(`Checking ${$.domain(x.domain)}`);else if(f==="available"&&typeof x.years=="number")r.message(`Buying ${$.domain(x.domain??e)} for ${We(x.years)}`);else if(f==="payment")r.message(`Charging ${$.price(x.total)}`);else if(f==="registering")r.message(`Registering ${$.domain(x.domain)}`);else if(f==="registered")a=x;else if(f==="error"){let O=Vt(x);if(O!==void 0)return r.stop("Price changed - nothing was charged"),{refused:{price:O,error:x.error,renewal_price:x.renewal_price,listed_price:x.listed_price}};r.stop("Purchase failed"),Hi(x,o.status,s)}}}let p=typeof a.years=="number"?je.default.dim(` \xB7 ${We(a.years)}`):"",w=a.expires?je.default.dim(` \xB7 expires ${new Date(a.expires).toLocaleDateString()}`):"";return r.stop(`${y.success} ${$.domain(a.domain)} is yours!${p}${w}`),{registered:a}}async function jm(e,t){X(e,t);let n=sn(t.maxPrice,t),i=Sr(t),s,r=C(!t.json&&!t.preChecked);if(t.preChecked)s={available:!0,...t.preChecked};else{r.start(`Checking ${$.domain(e)}`);let w=await k(`/api/domains/search?q=${encodeURIComponent(e)}`);s=await w.json(),w.ok||(r.stop("Search failed"),u(s.error,{hint:s.hint,status:w.status,json:t.json,fields:t.fields})),s.available||(r.stop(`${y.error} ${$.domain(e)} is not available`),u(`${e} is not available`,{code:"not_available",json:t.json,fields:t.fields}))}let o=kr(e,s,i),a=Hn(s,o?void 0:i);r.stop(`${y.success} ${$.domain(e)} ${y.dot} available ${y.dot} ${je.default.green(ct(s,a))}`),o&&Or([o],!1,t);let d=n??(a.total!==void 0?jn(a.total):void 0);if(t.dryRun)return K("buy",{...t.json?{}:{purchase:`${e} ${vr(s,a)}`},domain:e,available:!0,price:s.price,...s.renewal_price!==void 0?{renewal_price:s.renewal_price}:{},..._r(a),currency:s.currency||"USD",max_price:d,acting_as:St()},t.json,t.fields);if(!Ct(t)){let w=await Je({message:`Purchase ${je.default.bold(e)} ${je.default.green(vr(s,a))}${qt()}?`});if(!w||typeof w=="symbol"){console.log(` ${je.default.dim("Cancelled.")}`);return}}let m=w=>`Purchasing ${$.domain(e)} for ${We(a.years)}${w!==void 0?`: ${$.price(w.toFixed(2))}`:""}`,f=await ud(e,i,d,m(a.total),t);for(;"refused"in f;){let w=await Bn(f.refused.price,d??a.total??s.price,f.refused,"Buy",t);if(w===void 0)return;d=w,f=await ud(e,i,d,m(w),t)}let p=f.registered;if(t.json){b(p,t.fields);return}Te?await Hr(p.domain):(R("Connect to a service:",`domani connect ${p.domain}`),R("Set up email:",`domani email setup ${p.domain}`),R("Configure DNS:",`domani dns ${p.domain}`),c())}async function Sm(e,t){Ra(e,t);let n=sn(t.maxPrice,t),i=Sr(t),s=!!t.json,r=C(!s);r.start(`Checking ${e.length} domains`);let o=await Promise.all(e.map(async S=>{try{let I=await k(`/api/domains/search?q=${encodeURIComponent(S)}`),q=await I.json();return{domain:S,available:I.ok&&q.available,price:q.price,renewal_price:q.renewal_price,min_years:q.min_years,min_term_price:q.min_term_price}}catch{return{domain:S,available:!1,price:void 0,renewal_price:void 0}}})),a=o.filter(S=>!S.available);o.every(S=>!S.available)&&(r.stop(`${y.error} None of the ${e.length} domains are available`),process.exit(1));let d=o.filter(S=>S.available).map(S=>kr(S.domain,S,i)).filter(S=>S!==void 0);d.length>0&&(r.stop(`${y.error} ${d.length} domain${d.length>1?"s":""} cannot be registered for ${We(i??1)}`),Or(d,!0,t));let m=o.filter(S=>S.available).map(S=>({...S,term:Hn(S,i)})),f=jn(m.reduce((S,I)=>S+(I.term.total??0),0)),p=m.reduce((S,I)=>S+(I.renewal_price??I.price??0),0),w=yr(f,p)?`, then ${$.price(p.toFixed(2))}/yr`:"";if(r.stop(`${y.success} ${m.length}/${e.length} available ${y.dot} ${$.price(f.toFixed(2))} total`),a.length>0)for(let S of a)console.log(` ${y.error} ${$.domain(S.domain)} ${je.default.dim("not available")}`);let _=n??(m.every(S=>S.term.total!==void 0)?f:void 0);if(t.dryRun)return K("buy_bulk",{domains:m.map(S=>({domain:S.domain,price:S.price,...S.renewal_price!==void 0?{renewal_price:S.renewal_price}:{},..._r(S.term)})),unavailable:a.map(S=>S.domain),total_price:parseFloat(f.toFixed(2)),max_price:_,acting_as:St()},t.json,t.fields);if(!Ct(t)){let S=await Je({message:`Purchase ${je.default.bold(String(m.length))} domain${m.length>1?"s":""} for ${$.price(f.toFixed(2))}${Ta(m)}${w}${qt()}?`});if(!S||typeof S=="symbol"){console.log(` ${je.default.dim("Cancelled.")}`);return}}c();let v,g;for(;;){let S=nn(["Domain","Price"],m.map(F=>({cells:[$.domain(F.domain),F.price?je.default.green(ct(F,F.term)):""],status:"pending"})),[30,12],!s);S.start(),v=await k("/api/domains/buy",{method:"POST",body:JSON.stringify({domains:m.map(F=>F.domain),...i!==void 0?{years:i}:{},..._!==void 0?{max_price:_}:{}})}),g=await v.json();let I=v.ok?void 0:Vt(g);if(I===void 0){let F=new Set((g.results||[]).map(Y=>Y.domain));for(let Y=0;Y<m.length;Y++){let U=m[Y].domain.toLowerCase().trim();S.markDone(Y,F.has(U)?y.success:y.error)}S.stop();break}for(let F=0;F<m.length;F++)S.markDone(F,je.default.dim("\xB7"));S.stop(),c();let q=await Bn(I,_??f,g,"Buy",t);if(q===void 0)return;_=q,c()}if(v.ok||Hi(g,v.status,t),s){b(g,t.fields);return}c();let x=g.summary?.succeeded??0,O=g.summary?.failed??0;if(x>0&&console.log(` ${y.success} ${je.default.green(`${x} domain${x>1?"s":""} registered`)}`),O>0){console.log(` ${y.error} ${je.default.red(`${O} failed`)}`);for(let S of g.errors||[])console.log(` ${je.default.dim("\u2500")} ${$.domain(S.domain)}: ${je.default.dim(S.error)}${S.hint?` ${je.default.dim(`(${S.hint})`)}`:""}`)}if(c(),x>0&&Te){let S=(g.results||[]).filter(I=>I.success).map(I=>I.domain);if(S.length===1)await Hr(S[0]);else{let I=await lt({message:"Set up one of your new domains?",options:[...S.map(q=>({value:q,label:je.default.cyan(q)})),{value:"done",label:"Done"}]});!ae(I)&&I!=="done"?(c(),await Hr(I)):c()}}else x>0&&(R("Connect to a service:","domani connect <domain>"),R("Set up email:","domani email setup <domain>"),c())}async function Jr(e,t){let n=e.filter(Boolean);if(n.length===0){Te||u("Missing required argument: domain(s)",{hint:"Usage: domani buy <domain> [domain2 ...]",code:"missing_argument",json:t.json});let i=await Ue({message:"Domain to purchase",placeholder:"e.g. myapp.dev (space-separated for multiple)"});(ae(i)||!i)&&process.exit(0),n=i.split(/\s+/).filter(Boolean)}return n.length===1?jm(n[0],t):Sm(n,t)}var je,Sn=$e(()=>{"use strict";G();Me();je=D(L(),1);V();De();ve();Wi();wr();xn();Na()});var go=D(ho(),1),{program:Yf,createCommand:Xf,createArgument:Zf,createOption:Qf,CommanderError:ep,InvalidArgumentError:tp,InvalidOptionArgumentError:np,Command:yo,Argument:ip,Option:sp,Help:rp}=go.default;ui();var kt=D(L(),1);De();hr();V();En();De();var it=D(L(),1);V();var mu=new Set(["cli","mcp","plugin","skill","api"]);function fu(e){let t=e.scopes?.split(",").map(o=>o.trim()).filter(Boolean),n=e.mailboxes?.split(",").map(o=>o.trim().toLowerCase()).filter(Boolean),i=!!(t?.length||n?.length||e.label||e.expiresIn),s=e.surface||"cli";if(!mu.has(s))throw new RangeError("--surface must be one of: cli, mcp, plugin, skill, api");let r=e.expiresIn===void 0?void 0:Number(e.expiresIn);if(r!==void 0&&(!Number.isInteger(r)||r<3600||r>31536e3))throw new RangeError("--expires-in must be an integer between 3600 and 31536000 seconds");return{delegated:i,body:{...t?.length?{scopes:t}:{},...n?.length?{mailboxes:n}:{},...e.label?{label:e.label}:{},...r!==void 0?{expires_in:r}:{},surface:s,intent:"programmatic_access"}}}function wa(e){return e!=="default"||ot().some(n=>n.name!==e)?` ${it.default.dim(`(account ${e})`)}`:""}async function $a(e){let t=ze(),n=C(!e.json),i;try{i=fu(e)}catch(_){u(_ instanceof Error?_.message:"Invalid login options",{code:"invalid_expires_in",json:e.json})}let{body:s,delegated:r}=i,o=wn(),a=Ts(o);if(a&&!r){n.start("Checking session");try{let _=await fetch(`${t}/api/me`,{headers:{Authorization:`Bearer ${a}`}});if(_.ok){let v=await _.json();n.stop(`Already logged in as ${it.default.bold(v.email)}${wa(o)}`),e.json&&b({status:"already_logged_in",email:v.email,account:o});return}}catch{}n.stop("Session expired, re-authenticating"),c()}n.start("Requesting auth code");let d=await fetch(`${t}/api/auth/cli`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});if(!d.ok){n.stop("Failed to initiate login");try{let _=await d.json();u(_.error||_.message||`Server error (${d.status})`,{hint:_.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:m,auth_url:f,expires_in:p}=await d.json();if(n.stop("Auth code received"),e.json){b({status:"awaiting_approval",code:m,auth_url:f,expires_in:p,account:o});return}c(),console.log(` ${it.default.dim("Verification code:")} ${it.default.bold(it.default.cyan(m))}`),e.open!==!1?(console.log(` ${it.default.dim("Opening browser")} ${y.arrow} ${$.url(f)}`),Ve(f)):console.log(` ${it.default.dim("Open this URL to approve:")} ${$.url(f)}`),c(),n.start("Waiting for approval");let w=120;for(let _=0;_<w;_++){await new Promise(x=>setTimeout(x,5e3));let v=await fetch(`${t}/api/auth/cli/poll?code=${m}`);!v.ok&&v.status!==202&&(n.stop("Login failed"),u(`Server error (${v.status})`,{code:"login_failed"}));let g=await v.json();if(g.status==="complete"){bi(o,{token:g.token,email:g.email,api_url:t}),n.stop(`Logged in as ${it.default.bold(g.email)}${wa(o)}`),c();let x=Ke().active_account;if(x&&x!==o){console.log(` ${it.default.dim(`Commands still act as the active account "${x}".`)}`),R("Switch to this one:",`domani use ${o}`),R("Or use it once:",`domani --account ${o} me`),c();return}console.log(` ${it.default.bold("Get one real result:")}`),R("1. Create your free inbox:","domani email create YOUR_HANDLE@domani.run"),R("2. Connect your webhook:","domani email webhook YOUR_HANDLE@domani.run --url https://YOUR_AGENT/webhook"),R("3. Prove delivery:","domani email webhook-test YOUR_HANDLE@domani.run"),console.log(` ${it.default.dim("A custom domain can wait until this loop works.")}`),c();return}g.error&&(n.stop("Login failed"),u(g.error||g.message,{hint:g.hint,code:"login_failed"}))}n.stop("Login timed out"),u("No approval received within 10 minutes",{hint:"Run 'domani login' to try again",code:"timeout"})}De();var gr=D(L(),1);V();async function va(e){let t=wn(),n=Ro(t);if(!n){e.json?b({status:"not_logged_in",account:t}):console.log(` ${gr.default.dim(`Not logged in${t==="default"?"":` to the account "${t}"`}.`)}`);return}let i=ot().map(r=>r.name);if(e.json){b({status:"logged_out",account:t,email:n.email||null,remaining_accounts:i});return}let s=[n.email,i.length>0||t!=="default"?`account ${t}`:void 0].filter(Boolean).join(", ");console.log(` ${y.success} Logged out${s?` ${gr.default.dim(`(${s})`)}`:""}`),i.length>0&&!Ke().active_account&&R("Pick the account to use next:",`domani use ${i[0]}`)}G();De();var Ft=D(L(),1);V();async function ka(e){let[t,n]=await Promise.all([k("/api/me"),k("/api/me/activation")]),i=await t.json();t.ok||u(i.error||i.message,{hint:i.hint,status:t.status,json:e.json,fields:e.fields});let s=n.ok?await n.json():null,r=Un(),o={name:r.name??null,source:r.source};if(e.json){b({...i,activation:s,cli_account:o},e.fields);return}if(j("Account"),l("Email",Ft.default.bold(i.email)),l("CLI account",r.source==="api_key_env"?Ft.default.dim("DOMANI_API_KEY"):`${r.name??"-"}${r.source==="flag"?Ft.default.dim(" (--account)"):r.source==="env"?Ft.default.dim(" (DOMANI_ACCOUNT)"):""}`),l("Payment",i.has_payment_method?`${y.success} ${Ft.default.green("active")}`:`${y.error} ${Ft.default.dim("none")}`),l("Domains",String(i.domain_count)),l("API tokens",String(i.token_count)),l("Referral code",i.referral_code||Ft.default.dim("-")),l("Created",new Date(i.created_at).toLocaleDateString()),s){l("Activation",s.status);let a=s.recommended_actions?.[0];a&&l("Next action",a.label)}c()}var gt=D(L(),1);De();V();var pu={api_key_env:"DOMANI_API_KEY",flag:"--account",env:"DOMANI_ACCOUNT",active:"domani use",none:"none"};async function xa(e){let t=ot(),n=Ke().active_account??null,i=Un();if(e.json){b({active:n,current:i.name??null,source:i.source,accounts:t.map(r=>({name:r.name,email:r.email??null,api_url:r.api_url??null,active:r.name===n,current:r.name===i.name}))});return}if(t.length===0){console.log(` ${gt.default.dim("No saved accounts.")}`),R("Log in:","domani login");return}j("Accounts");let s=Math.max(...t.map(r=>r.name.length));for(let r of t){let o=r.name===i.name?gt.default.green("*"):" ",a=[r.name===n?"active":void 0,r.name===i.name&&i.source!=="active"?`selected by ${pu[i.source]}`:void 0].filter(Boolean);console.log(` ${o} ${gt.default.bold(r.name.padEnd(s))} ${r.email??gt.default.dim("unknown email")}${a.length?` ${gt.default.dim(a.join(", "))}`:""}`)}i.source==="api_key_env"&&(c(),console.log(` ${y.warning} ${gt.default.dim("DOMANI_API_KEY is set: every command uses that key, not these accounts.")}`)),c(),R("Switch:","domani use <name>"),R("Add one:","domani login --account <name>"),c()}async function ja(e,t){if(yi(e)||u(`Invalid account name: ${e}`,{code:"validation_error",hint:"Use letters, digits, dot, dash or underscore",json:t.json}),!Io(e)){let i=ot().map(s=>s.name);u(`No saved account named "${e}"`,{code:"account_not_found",hint:i.length?`Saved accounts: ${i.join(", ")}. Add one with 'domani login --account ${e}'`:`Log in with 'domani login --account ${e}'`,json:t.json})}let n=ot().find(i=>i.name===e)?.email??null;if(t.json){b({status:"switched",active:e,email:n});return}console.log(` ${y.success} Now using ${gt.default.bold(e)}${n?` ${gt.default.dim(`(${n})`)}`:""}`),process.env.DOMANI_ACCOUNT&&process.env.DOMANI_ACCOUNT!==e&&console.log(` ${y.warning} ${gt.default.dim(`DOMANI_ACCOUNT=${process.env.DOMANI_ACCOUNT} still overrides it in this shell.`)}`)}G();Me();var E=D(L(),1);V();ve();xn();function Wt(e){return!e.available&&!e.error&&!e.registry_status&&e.price===0&&!!e.reason&&!dn(e)}var es="not sold on Domani";function dn(e){return e.tld_kind==="alt_root"}function Br(e){return e.reason||`${e.domain} does not resolve in public DNS: its TLD is not in the DNS root zone (IANA). Domani does not offer it.`}function yt(e){return e.registry_status==="premium"||e.registry_status==="reserved"}function Cn(e){return e.registry_status==="reserved"?"reserved":e.registry_price!==void 0?`premium $${e.registry_price.toFixed(2)}`:"premium"}function Gr(e){if(e.reason)return e.reason;if(e.registry_status==="reserved")return`${e.domain} is reserved by the registry and cannot be registered.`;let t=e.registry_price!==void 0?`: the registry prices it at $${e.registry_price.toFixed(2)}`:" priced by the registry";return`${e.domain} is a premium name${t}. Premium names cannot be bought at the standard price.`}function ln(e,t){let n=e.findIndex(i=>i.domain===t);return n!==-1&&e.splice(n,1),n}var Qe=10,On=200,Zi=["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"],Qi=null;async function md(){if(Qi)return Qi;try{let e=await xe("/api/tlds?sort=price&order=asc&limit=1000");if(e.ok){let n=(await e.json()).tlds.map(i=>i.tld);if(n.length>0){let i=new Set(Zi),s=new Set(n),r=[...Zi.filter(o=>s.has(o)),...n.filter(o=>!i.has(o))];return Qi=r,r}}}catch{}return Qi=Zi,Zi}async function Om(e,t,n,i,s){let r=[],o=[],a=Qe,d=0,m=!0,f=0,p=0,w=!1,_=!1,v=null,g="",x=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],O=0,S=setInterval(()=>{_||!m||(O=(O+1)%x.length,M())},80);function I(){f>0&&(process.stdout.write(`\x1B[${f}A\x1B[0J`),f=0)}function q(){if(m)return[];let A=Qe+p*Qe;return r.length>a||i&&A<s.length?["more","new","skip"]:["new","skip"]}function F(){return r.slice(0,a)}function Y(){let A=q();return Math.max(0,F().length+A.length-1)}let U=6;function M(){I();let A=[],H=F(),ne=!m&&H.length===0&&o.length>0,Z=ne?o.slice(0,U):H,ue=Z.reduce((ye,te)=>Math.max(ye,te.domain.length),0),ke=q();for(let ye=0;ye<Z.length;ye++){let te=Z[ye];if(ne)A.push(`${E.default.dim("\u2502")} ${E.default.dim("\u2715")} ${E.default.dim(te.domain.padEnd(ue))} ${E.default.dim(yt(te)?Cn(te):Wt(te)?es:"taken")}`);else{let me=ye===d,ft=me?E.default.green("\u25CF"):E.default.dim("\u25CB"),Bt=te.domain.padEnd(ue),pn=me?E.default.bold(E.default.cyan(Bt)):Bt,In=te.for_sale?E.default.cyan(`$${te.for_sale.price} (for sale)`):E.default.dim(ct(te));A.push(`${E.default.dim("\u2502")} ${ft} ${pn} ${In}`)}}if(ne&&o.length>U&&A.push(`${E.default.dim("\u2502")} ${E.default.dim(`\u2026 and ${o.length-U} more taken`)}`),m){let ye=g?E.default.dim(`checking ${g}\u2026`):E.default.dim("searching\u2026");A.push(`${E.default.dim("\u2502")} ${E.default.cyan(x[O])} ${ye}`)}else{let ye=Qe+p*Qe;i&&ye>=s.length&&A.push(`${E.default.dim("\u2502")} ${E.default.dim(`All ${Math.min(ye,s.length)} TLDs searched`)}`);for(let me=0;me<ke.length;me++){let pn=F().length+me===d?E.default.green("\u25CF"):E.default.dim("\u25CB"),In=ke[me]==="more"?E.default.dim("More \u2192"):ke[me]==="new"?E.default.dim("New search \u2192"):E.default.dim("Skip");A.push(`${E.default.dim("\u2502")} ${pn} ${In}`)}A.push(E.default.dim("\u2514"))}process.stdout.write(A.join(`
|
|
184
184
|
`)+`
|
|
185
185
|
`),f=A.length}process.stdout.write(`${E.default.cyan("\u25C6")} Register a domain?
|
|
186
|
-
`),process.stdout.write("\x1B[?25l"),process.stdin.setRawMode(!0),process.stdin.resume();let ce=A=>{let H=A.toString();if(H==="\x1B[A")d=Math.max(0,d-1),
|
|
187
|
-
`);ne=ke.pop()??"";for(let ye of ke)if(ye.startsWith("event: "))Z=ye.slice(7);else if(ye.startsWith("data: ")){let te=JSON.parse(ye.slice(6));if(Z==="error"&&(process.stdin.isTTY&&process.stdin.setRawMode(!1),process.stdout.write("\x1B[?25h"),u(te.message||te.error||"Search failed",{code:te.code||"error"})),Z==="result"){
|
|
186
|
+
`),process.stdout.write("\x1B[?25l"),process.stdin.setRawMode(!0),process.stdin.resume();let ce=A=>{let H=A.toString();if(H==="\x1B[A")d=Math.max(0,d-1),M();else if(H==="\x1B[B")d=Math.min(Y(),d+1),M();else if(H==="\r"){let ne=F();if(m&&ne.length===0)return;if(d<ne.length)v=ne[d]?.domain??null,_=!0;else{let ue=q()[d-ne.length];ue==="more"?(a+=Qe,r.length<a?w=!0:(d=Math.min(d,Y()),M())):(ue==="new"&&(v="__new__"),_=!0)}}else(H===""||H==="\x1B")&&(_=!0)};process.stdin.on("data",ce),M();async function le(A){let H=new TextDecoder,ne="",Z="";for await(let ue of A){if(_)break;ne+=H.decode(ue,{stream:!0});let ke=ne.split(`
|
|
187
|
+
`);ne=ke.pop()??"";for(let ye of ke)if(ye.startsWith("event: "))Z=ye.slice(7);else if(ye.startsWith("data: ")){let te=JSON.parse(ye.slice(6));if(Z==="error"&&(process.stdin.isTTY&&process.stdin.setRawMode(!1),process.stdout.write("\x1B[?25h"),u(te.message||te.error||"Search failed",{code:te.code||"error"})),Z==="result"){g=te.domain,ln(o,te.domain);let me=ln(r,te.domain);me!==-1&&(me<d&&d--,d=Math.min(d,Y()),M())}if(Z==="result"&&(te.available||te.for_sale||n)&&!yt(te)&&!Wt(te)){if(p===0){let me=r.findIndex(ft=>ft.price>te.price);me===-1?r.push(te):(r.splice(me,0,te),me<=d&&d++)}else r.push(te);M()}else if(Z==="result"&&!te.available&&!te.error)o.length<8&&o.push(te);else if(Z==="done"){m=!1,d=Math.min(d,Y());let me=Qe+p*Qe;r.length<a&&i&&me<s.length&&(w=!0),w||M()}}}m=!1}for(await le(e);!_;)if(await new Promise(A=>{let H=setInterval(()=>{(_||w)&&(clearInterval(H),A())},16)}),w&&!_){w=!1;let A=Qe+p*Qe,H=s.slice(A,A+Qe);p++,m=!0,d=Math.min(d,Math.max(0,r.length-1)),M();let ne=new URLSearchParams;ne.set("domains",H.map(Z=>`${t}.${Z}`).join(","));try{let Z=await xe(`/api/domains/search?${ne}`,{headers:{Accept:"text/event-stream"}});Z.ok&&Z.body?await le(Z.body):(m=!1,M())}catch{m=!1,M()}}clearInterval(S),process.stdin.removeListener("data",ce),process.stdin.isTTY&&process.stdin.setRawMode(!1),process.stdin.pause(),process.stdout.write("\x1B[?25h"),I();let P=v==="__new__",ge=P?null:v,ie=ge?r.find(A=>A.domain===ge)??null:null;return ge?process.stdout.write(`${E.default.dim("\u25C7")} Register a domain?
|
|
188
188
|
${E.default.dim("\u2502")} ${E.default.bold(E.default.cyan(ge))}
|
|
189
189
|
${E.default.dim("\u2514")}
|
|
190
190
|
`):process.stdout.write(`${E.default.dim("\u2514")}
|
|
191
|
-
`),{chosen:ge,chosenResult:ie,searchAgain:P,allTaken:r.length===0&&o.length>0,expanded:p>0}}async function fd(e,t,n){if(!e){Te||u("Missing required argument: domain",{hint:"Usage: domani search <domain> [tlds...]",code:"missing_argument",json:n.json});let P=await Ue({message:"Search for a domain",placeholder:"e.g. myapp or myapp.dev"});(ae(P)||!P)&&process.exit(0),e=P}let i=t.map(P=>P.replace(/^\./,"")),s=n.tlds?.split(",").map(P=>P.trim())||[],r=[...new Set([...i,...s])];if(r.length>0&&Fi(r,n),X(e,n),e.includes(".")&&r.length===0){let P=C(!n.json);P.start(`Checking ${$.domain(e)}`);let[ge,ie]=await Promise.all([xe(`/api/domains/search?q=${encodeURIComponent(e)}`),xe(`/api/domains/${encodeURIComponent(e)}/og`).catch(()=>null)]),A=await ge.json();if(ge.ok||(P.stop("Search failed"),u(A.error||A.message,{hint:A.hint,status:ge.status,json:n.json,fields:n.fields})),n.json){let H=A.domain.split(".")[0];b({name:H,results:[A],total:1,available:A.available?1:0},n.fields);return}if(dn(A))P.stop(`${y.warning} ${$.domain(A.domain)} ${y.dot} ${E.default.yellow("not in public DNS")}`),c(),console.log(` ${
|
|
192
|
-
`);H=
|
|
193
|
-
`);ce=ge.pop()??"";for(let ie of ge)if(ie.startsWith("event: "))le=ie.slice(7);else if(ie.startsWith("data: ")){let A=JSON.parse(ie.slice(6));if(le==="error")
|
|
194
|
-
`);_=S.pop()??"";for(let O of S)if(O.startsWith("event: "))v=O.slice(7);else if(O.startsWith("data: "))try{let j=JSON.parse(O.slice(6));if(v==="result")ln(a,j.domain)!==-1||ln(d,j.domain)!==-1||f++,j.available?a.push(j):d.push(j),m||i.message(`Finding available domains ${wt.default.dim(`(${f} checked, ${a.length} available)`)}`);else if(v==="iteration")m||i.message(`Finding available domains ${wt.default.dim(`(round ${j.n})`)}`);else if(v==="done"){p();for(let I of a){let M=I.reason?` ${wt.default.dim(I.reason)}`:"";console.log(` ${y.success} ${$.domain(I.domain).padEnd(37)} ${wt.default.green(ct(I))}${M}`)}for(let I of d)console.log(` ${y.error} ${wt.default.dim(I.domain.padEnd(38))} ${yt(I)?wt.default.yellow(jn(I)):wt.default.red("taken")}`);console.log(` ${wt.default.dim("\u2500".repeat(50))}`),console.log(` ${wt.default.dim(`Found ${j.total} available \xB7 checked ${j.checked} \xB7 ${j.iterations} round${j.iterations>1?"s":""}`)}`)}else v==="error"&&(m||i.stop("Failed"),u(j.message))}catch{}}a.length===0&&d.length===0&&(m||i.stop("No results"),u("Could not find available domains for this prompt.")),c(),a.length>0&&(R("Register one:",`domani buy ${a[0].domain}`),c())}Rr();Vr();G();qe();var $t=D(L(),1);V();De();ve();An();async function vd(e){let t=e.maxConsecutiveFailures??10,n=0;for(let i=1;i<=e.maxAttempts;i++){let s=await e.fetchPlan().catch(()=>null);if(e.onTick?.(s,i),s!==null){if(n=0,e.isEligible(s))return{status:"eligible",plan:s}}else if(n++,n>=t)return{status:"unreachable",failures:n};i<e.maxAttempts&&await e.sleep(e.intervalMs)}return{status:"timeout",attempts:e.maxAttempts}}var Xn=D(L(),1);V();function Zn(e){if(e){c(),console.log(` ${Xn.default.bold(`Exit path (${e.managed_via})`)}`),console.log(` ${Xn.default.dim("Unlock:")} ${e.unlock}`),console.log(` ${Xn.default.dim("Auth code:")} ${e.auth_code}`);for(let t of e.notes||[])console.log(` ${Xn.default.yellow("!")} ${t}`)}}var Rm=6e4,Im=1440;async function _d(e,t){X(e,t);let n=C(!t.json);n.start(`Planning safe adoption for ${$.domain(e)}`);let i=await k(`/api/domains/adoption-plan?domain=${encodeURIComponent(e)}`),s=await i.json();if(i.ok||(n.stop("Check failed"),u(s.error,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),s.options?.transfer?.eligible)n.stop(`${y.success} Eligible for transfer`);else{n.stop(`${y.error} Not eligible`);let a=s.options?.transfer;if(t.watch&&a?.eligible_at){let d=await k("/api/domains/transfer-watch",{method:"POST",body:JSON.stringify({domain:e})}),m=await d.json();if(d.ok||u(m.error||m.message,{hint:m.hint,status:d.status,json:t.json,fields:t.fields}),t.json){b(m,t.fields);return}x("Transfer Watch Registered"),l("Domain",$.domain(e)),l("Eligible from",m.eligible_at||a.eligible_at),m.hint&&(c(),console.log(` ${$t.default.dim(m.hint)}`)),c();return}if(t.watch){t.json||(console.log(` ${$t.default.dim(a?.reason||"Domain is not eligible for transfer yet.")}`),Zn(a?.guidance),c());let d=C(!t.json);d.start(`Watching ${$.domain(e)} until it becomes transferable (every 60s, Ctrl+C to stop)`);let m=await vd({fetchPlan:async()=>{let f=await k(`/api/domains/adoption-plan?domain=${encodeURIComponent(e)}`);return f.ok?f.json():null},isEligible:f=>!!f.options?.transfer?.eligible,sleep:f=>new Promise(p=>setTimeout(p,f)),intervalMs:Rm,maxAttempts:Im});m.status!=="eligible"&&(d.stop(`${y.error} Watch ended`),u(m.status==="timeout"?"Domain did not become eligible within 24 hours.":"Gave up after repeated failures fetching the adoption plan.",{hint:"The transfer lock is disabled at the losing registrar; rerun with --watch once you have flipped it.",code:m.status==="timeout"?"watch_timeout":"watch_unreachable",json:t.json,fields:t.fields})),s=m.plan,d.stop(`${y.success} Now eligible for transfer`)}else{t.json||Zn(a?.guidance);let d=a?.eligible_at?`Eligible from ${a.eligible_at}. Rerun with --watch to register a server watch (email + webhook when the date arrives).`:"Fix the blocker above, then rerun - or rerun with --watch to poll until the domain becomes eligible and continue automatically.",m=t.json&&a?.guidance?` The registrar exit playbook is in the adoption plan (options.transfer.guidance, \`domani adopt ${e} --json\`).`:"";u(a?.reason||"Domain is not eligible for transfer.",{hint:[d+m,...s.warnings?.length?[s.warnings.join(" ")]:[]].join(" "),code:"not_eligible",json:t.json,fields:t.fields})}}if(t.dryRun)return K("transfer",{domain:e,eligible:!0,price:s.options.transfer.price,currency:s.options.transfer.currency||"USD",includes_renewal:!0,preserves_nameservers:!0,migrates_dns:!1,nameservers:s.current.nameservers,dns_provider:s.current.dns_provider,dnssec_enabled:s.current.dnssec_enabled,acting_as:St()},t.json,t.fields);if(!Ct(t)){x("Transfer Safety Plan"),l("Registrar",s.current.registrar||"Unknown"),l("DNS provider",s.current.dns_provider),l("Nameservers",`${s.current.nameservers.length} preserved`),l("DNSSEC",s.current.dnssec_enabled?$t.default.yellow("Enabled, DS will be verified"):"Not enabled"),l("DNS migration","Not requested"),c();let a=s.options.transfer.price!=null?` for ${$.price(s.options.transfer.price.toFixed(2))}`:"",d=await He({message:`Transfer ${$t.default.bold(e)} to ${gn}${a}${Mt()}? Nameservers stay unchanged and 1 year is included.`});if(!d||typeof d=="symbol"){console.log(` ${$t.default.dim("Cancelled.")}`);return}}if(!t.authCode){(t.json||!process.stdout.isTTY)&&u("--auth-code is required",{hint:"The safety plan passed. Get the EPP/auth code from the current registrar and retry.",code:"validation_error",json:t.json,fields:t.fields}),s.options?.transfer?.guidance&&console.log(` ${$t.default.dim("Where to get it:")} ${s.options.transfer.guidance.auth_code}`);let a=await Ue({message:"Enter the EPP/auth code from your current registrar:",validate:d=>!d||d.trim().length===0?"Auth code is required":void 0});ae(a)&&process.exit(0),t.authCode=a}n.start(`Initiating transfer for ${$.domain(e)}`);let r=await k("/api/domains/transfer",{method:"POST",body:JSON.stringify({domain:e,auth_code:t.authCode})}),o=await r.json();if(r.ok||(n.stop("Transfer failed"),u(o.error||o.message,{hint:o.hint,fixUrl:o.setup_url||o.payment_options?.card?.setup_url,status:r.status,json:t.json,fields:t.fields})),n.stop(`${y.success} Transfer initiated`),t.json){b(o,t.fields);return}x("Transfer Initiated"),l("Domain",$.domain(o.domain)),l("Status",$t.default.yellow(o.status||"pending")),o.price&&l("Price",$.price(o.price)+$t.default.dim(` ${o.currency||"USD"}`)),o.payment_method&&l("Payment",o.payment_method),o.expires&&l("Expires",new Date(o.expires).toLocaleDateString()),o.hint&&(c(),console.log(` ${$t.default.dim(o.hint)}`)),c(),R("Check transfer progress:",`domani status ${o.domain}`),c()}G();var Qn=D(L(),1);V();ve();async function kd(e,t){X(e,t);let n=C(!t.json);n.start(`Inspecting ${$.domain(e)}`);let i=await k(`/api/domains/adoption-plan?domain=${encodeURIComponent(e)}`),s=await i.json();if(i.ok||(n.stop("Inspection failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} Adoption plan ready`),t.json){b(s,t.fields);return}if(x(`Adopt ${$.domain(s.domain)}`),l("Registrar",s.current.registrar||"Unknown"),l("DNS provider",s.current.dns_provider),l("Nameservers",s.current.nameservers.join(", ")||"None detected"),l("DNSSEC",s.current.dnssec_enabled?Qn.default.yellow("Enabled"):"Not enabled"),l("Account",s.account_state),l("Recommended",Qn.default.cyan(s.recommended_action)),c(),s.recommended_action==="connect"&&R("Connect free, without changing registrar or DNS:",`domani import ${s.domain}`),s.options.transfer.available){let r=s.options.transfer.price==null?"price unavailable":`$${s.options.transfer.price.toFixed(2)} ${s.options.transfer.currency}`;R(`Transfer registration for ${r}, preserving nameservers:`,`domani transfer ${s.domain}`),!s.options.transfer.eligible&&s.options.transfer.reason&&(console.log(` ${Qn.default.yellow("!")} ${s.options.transfer.reason}`),R("Wait for eligibility and transfer in one go:",`domani transfer ${s.domain} --watch`)),Zn(s.options.transfer.guidance)}for(let r of s.warnings||[])console.log(` ${Qn.default.yellow("!")} ${r}`);c()}G();qe();var Sn=D(L(),1);V();De();ve();it();Vi();async function xd(e,t){e||(e=await be()),X(e,t);let n=t.years?parseInt(t.years,10):1;(isNaN(n)||n<1||n>10)&&u("--years must be between 1 and 10",{code:"validation_error",json:t.json,fields:t.fields});let i=sn(t.maxPrice,t),s=`${n} year${n>1?"s":""}`,r=C(!t.json);r.start(`Checking ${$.domain(e)}`);let o=await k(`/api/domains/${encodeURIComponent(e)}`),a=await o.json();o.ok||(r.stop("Lookup failed"),u(a.error,{hint:a.hint,status:o.status,json:t.json,fields:t.fields}));let d=typeof a.renewal_price=="number"?a.renewal_price:void 0,m=d!==void 0?Jn(d*n):void 0;r.stop(d!==void 0?`${y.success} ${$.domain(e)} ${y.dot} renews at ${$.price(d.toFixed(2))}/yr`:`${$.domain(e)} ${y.dot} ${Sn.default.dim("renewal price unknown")}`);let f=i??m;if(t.dryRun)return K("renew",{domain:e,years:n,price:m,currency:"USD",max_price:f,acting_as:St()},t.json,t.fields);if(!Ct(t)){let v=await He({message:m!==void 0?`Renew ${Sn.default.bold(e)} for ${s} for ${$.price(m.toFixed(2))}${Mt()}?`:`Renew ${Sn.default.bold(e)} for ${s}${Mt()}? You will be charged.`});if(!v||typeof v=="symbol"){console.log(` ${Sn.default.dim("Cancelled.")}`);return}}let p,g,_;for(;;){_=C(!t.json),_.start(`Renewing ${$.domain(e)}`),p=await k(`/api/domains/${encodeURIComponent(e)}/renew`,{method:"POST",body:JSON.stringify({years:n,...f!==void 0?{max_price:f}:{}})}),g=await p.json();let v=p.ok?void 0:Vt(g);if(v===void 0)break;_.stop("Price changed");let w=await Bn(v,f??v,g,"Renew",t);if(w===void 0)return;f=w}if(p.ok||(_.stop("Renewal failed"),u(g.error||g.message,{hint:g.hint,fixUrl:g.setup_url||g.payment_options?.card?.setup_url,status:p.status,json:t.json,fields:t.fields})),_.stop(`${y.success} Domain renewed`),t.json){b(g,t.fields);return}x("Renewal Complete"),l("Domain",$.domain(g.domain)),l("Years",String(g.renewed_years)),l("New expiry",new Date(g.new_expiry).toLocaleDateString()),g.price&&l("Price",$.price(g.price.toFixed(2))+Sn.default.dim(` ${g.currency||"USD"}`)),g.payment_method&&l("Payment",g.payment_method),c(),R("Verify renewal:",`domani status ${g.domain}`),c()}G();var vt=D(L(),1);V();ve();async function jd(e,t){e||u("Domain is required",{hint:`Usage: domani import <domain>
|
|
195
|
-
domani import <domain> --verify`,code:"validation_error",json:t.json,fields:t.fields}),X(e,t);let n=t.verify?"/api/domains/import/verify":"/api/domains/import",i=C(!t.json);i.start(t.verify?`Verifying ownership of ${$.domain(e)}`:`Initiating import for ${$.domain(e)}`);let s=await k(n,{method:"POST",body:JSON.stringify({domain:e})}),r=await s.json();if(s.ok||(i.stop(t.verify?"Verification failed":"Import failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields})),t.json){i.stop(""),b(r,t.fields);return}t.verify?(i.stop(`${y.success} ${$.domain(e)} imported!`),
|
|
196
|
-
Run 'domani tokens list' to see your tokens.`,code:"validation_error",json:e.json,fields:e.fields});let t=C(!e.json);t.start("Revoking token");let n=await k(`/api/tokens/${encodeURIComponent(e.tokenId)}`,{method:"DELETE"}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),t.stop(`${y.success} Token revoked`),e.json){b(i,e.fields);return}console.log(` ${We.default.dim("Any applications using this key will need a new one.")}`),c()}G();var Pe=D(L(),1);V();ve();it();async function Cd(e,t){e||(e=await be()),X(e,t);let n=t.autoRenew!==void 0,i=t.whoisPrivacy!==void 0,s=t.securityLock!==void 0;if(!n&&!i&&!s)return Pm(e,t.json,t.fields);let r={};if(n){let m=Gr(t.autoRenew);m===null&&u("--auto-renew must be on or off",{code:"validation_error",json:t.json,fields:t.fields}),r.auto_renew=m}if(i){let m=Gr(t.whoisPrivacy);m===null&&u("--whois-privacy must be on or off",{code:"validation_error",json:t.json,fields:t.fields}),r.whois_privacy=m}if(s){let m=Gr(t.securityLock);m===null&&u("--security-lock must be on or off",{code:"validation_error",json:t.json,fields:t.fields}),r.security_lock=m}if(t.dryRun)return K("settings_update",{domain:e,...r},t.json,t.fields);let o=C(!t.json);o.start(`Updating ${$.domain(e)}`);let a=await k(`/api/domains/${encodeURIComponent(e)}/settings`,{method:"PUT",body:JSON.stringify(r)}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:t.json,fields:t.fields})),o.stop(`${y.success} Settings updated`),t.json){b(d,t.fields);return}x("Settings Updated"),l("Domain",$.domain(d.domain)),d.auto_renew!==void 0&&l("Auto-renew",d.auto_renew?Pe.default.green("on"):Pe.default.dim("off")),d.whois_privacy!==void 0&&l("WHOIS privacy",d.whois_privacy?Pe.default.green("on"):Pe.default.dim("off")),d.security_lock!==void 0&&l("Security lock",d.security_lock?Pe.default.green("locked"):Pe.default.dim("unlocked")),d.hint&&l("",Pe.default.dim(d.hint)),c()}async function Pm(e,t,n){let i=C(!t);i.start(`Loading ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}`),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop(`${y.success} ${$.domain(e)}`),t){b(r,n);return}x("Domain Settings"),l("Domain",$.domain(r.domain)),l("Status",r.status==="active"?Pe.default.green(r.status):Pe.default.yellow(r.status)),l("Auto-renew",r.auto_renew?Pe.default.green("on"):Pe.default.dim("off")),r.registrar&&(l("WHOIS privacy",r.registrar.whois_privacy?Pe.default.green("on"):Pe.default.dim("off")),l("Security lock",r.registrar.security_lock?Pe.default.green("locked"):Pe.default.dim("unlocked"))),l("Expires",new Date(r.expires_at).toLocaleDateString()+Pe.default.dim(` (${r.days_until_expiry} days)`)),c(),R("Toggle auto-renew:",`domani settings ${e} --auto-renew off`),R("Toggle WHOIS privacy:",`domani settings ${e} --whois-privacy off`),R("Toggle security lock:",`domani settings ${e} --security-lock off`),R("Get transfer auth code:",`domani auth-code ${e}`),c()}function Gr(e){let t=e.toLowerCase();return t==="on"||t==="true"||t==="1"||t==="enable"?!0:t==="off"||t==="false"||t==="0"||t==="disable"?!1:null}G();var Et=D(L(),1);V();ve();it();async function Rd(e,t){e||(e=await be()),X(e,t);let n=C(!t.json);n.start(`Getting auth code for ${$.domain(e)}`);let i=await k(`/api/domains/${encodeURIComponent(e)}/auth-code`),s=await i.json();i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields}));let r=s.status==="requested";if(n.stop(r?`${y.success} Auth code requested`:`${y.success} Auth code retrieved`),t.json){b(s,t.fields);return}if(r){x("Auth Code"),l("Domain",$.domain(s.domain)),l("Status",Et.default.yellow("Requested")),s.expected_by&&l("Ready by",new Date(s.expected_by).toLocaleString()),s.hint&&(c(),console.log(` ${Et.default.dim(s.hint)}`)),c(),R("Read the code once you get the email:",`domani auth-code ${e}`),c();return}if(x("Auth Code"),l("Domain",$.domain(s.domain)),l("Auth code",Et.default.bold(Et.default.green(s.auth_code))),s.was_unlocked&&l("",Et.default.yellow("Domain was automatically unlocked to allow transfer.")),s.hint&&(c(),console.log(` ${Et.default.dim(s.hint)}`)),s.next_steps?.length){c();for(let o of s.next_steps)console.log(` ${Et.default.dim("\u2192")} ${Et.default.dim(o)}`)}c(),R("Check transfer status:",`domani transfer-away ${e}`),R("Re-lock domain:",`domani settings ${e} --security-lock on`),c()}G();var Pt=D(L(),1);V();ve();it();var Dm={none:Pt.default.dim,pending:Pt.default.yellow,approved:Pt.default.yellow,completed:Pt.default.green,rejected:Pt.default.red,expired:Pt.default.red};async function Id(e,t){e||(e=await be()),X(e,t);let n=C(!t.json);n.start(`Checking transfer status for ${$.domain(e)}`);let i=await k(`/api/domains/${encodeURIComponent(e)}/transfer-away`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} ${$.domain(e)}`),t.json){b(s,t.fields);return}x("Transfer Away Status"),l("Domain",$.domain(s.domain));let r=Dm[s.status]||Pt.default.dim;l("Status",r(s.status)),s.gaining_registrar&&l("New registrar",s.gaining_registrar),s.request_date&&l("Requested",new Date(s.request_date).toLocaleDateString()),s.hint&&(c(),console.log(` ${Pt.default.dim(s.hint)}`)),c(),s.status==="none"?R("Get auth code to start:",`domani auth-code ${e}`):s.status==="pending"||s.status==="approved"?R("Check again later:",`domani transfer-away ${e}`):s.status==="completed"?R("Search for a new domain:","domani search <name>"):(s.status==="rejected"||s.status==="expired")&&R("Retry with a new auth code:",`domani auth-code ${e}`),c()}G();qe();var es=D(L(),1);V();async function Ad(e,t){return e==="set"?Um(t):Nm(t)}async function Nm(e){let t=C(!e.json);t.start("Loading contact info");let n=await k("/api/me/contact"),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),t.stop(`${y.success} Contact info`),e.json){b(i,e.fields);return}if(x("Contact Info"),!i.has_contact){console.log(` ${y.warning} ${es.default.yellow("No contact info set.")} Run ${es.default.bold("domani contact set")} to add.`),c(),console.log(` ${es.default.dim("Contact info is required before purchasing domains.")}`),c();return}let s=i.contact;l("Name",`${s.first_name} ${s.last_name}`),s.org_name&&l("Organization",s.org_name),l("Address",s.address1),s.address2&&l("",s.address2),l("",`${s.city}, ${s.state} ${s.postal_code}`),l("Country",s.country),l("Phone",s.phone),l("Email",s.email),c()}async function Um(e){let t={},n=e.firstName||e.lastName||e.address1;if(!Te&&!n&&u("Missing required flags for contact set",{hint:"Usage: domani contact set --first-name John --last-name Doe --address1 '123 Main St' --city SF --state CA --postal-code 94105 --country US --phone +1.5551234567 --email john@example.com",code:"missing_argument",json:e.json}),n){let a=["firstName","lastName","address1","city","state","postalCode","country","phone","email"],d={firstName:"first_name",lastName:"last_name",orgName:"org_name",address1:"address1",address2:"address2",city:"city",state:"state",postalCode:"postal_code",country:"country",phone:"phone",email:"email"},m=a.filter(f=>!e[f]);m.length>0&&u(`Missing required flags: ${m.map(f=>`--${f.replace(/[A-Z]/g,p=>`-${p.toLowerCase()}`)}`).join(", ")}`,{code:"missing_argument",json:e.json});for(let[f,p]of Object.entries(d)){let g=e[f];g&&(t[p]=g)}}else{let a=await k("/api/me/contact"),m=(a.ok?await a.json():null)?.contact,f=[{key:"first_name",message:"First name",placeholder:"John",required:!0},{key:"last_name",message:"Last name",placeholder:"Doe",required:!0},{key:"org_name",message:"Organization (optional, press Enter to skip)",placeholder:"Acme Inc.",required:!1},{key:"address1",message:"Address line 1",placeholder:"123 Main St",required:!0},{key:"address2",message:"Address line 2 (optional)",placeholder:"Suite 100",required:!1},{key:"city",message:"City",placeholder:"San Francisco",required:!0},{key:"state",message:"State / Province",placeholder:"CA",required:!0},{key:"postal_code",message:"Postal / ZIP code",placeholder:"94105",required:!0},{key:"country",message:"Country code (ISO 3166-1 alpha-2)",placeholder:"US",required:!0},{key:"phone",message:"Phone (+CC.NUMBER)",placeholder:"+1.5551234567",required:!0},{key:"email",message:"Contact email",placeholder:"john@example.com",required:!0}];for(let p of f){let g=m?.[p.key]||"",_=await Ue({message:p.message,placeholder:p.placeholder,defaultValue:g,validate:p.required?w=>w?.trim()?void 0:`${p.message} is required`:void 0});ae(_)&&process.exit(0);let v=_.trim();v&&(t[p.key]=v)}}if(e.dryRun)return K("contact_set",t,e.json,e.fields);let i=C(!e.json);i.start("Saving contact info");let s=await k("/api/me/contact",{method:"PUT",body:JSON.stringify(t)}),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${y.success} Contact info saved`),e.json){b(r,e.fields);return}x("Contact Saved");let o=r.contact;l("Name",`${o.first_name} ${o.last_name}`),o.org_name&&l("Organization",o.org_name),l("Address",o.address1),o.address2&&l("",o.address2),l("",`${o.city}, ${o.state} ${o.postal_code}`),l("Country",o.country),l("Phone",o.phone),l("Email",o.email),c(),R("Search for a domain:","domani search <name>"),c()}G();var Fe=D(L(),1);V();ve();it();async function Pd(e,t,n,i){if(e||(e=await be()),X(e,i),!t)return qm(e,i.json,i.fields);switch(t){case"enable":case"on":return i.dryRun?K("parking_enable",{domain:e},i.json,i.fields):Td(e,!0,i.json,i.fields);case"disable":case"off":return i.dryRun?K("parking_disable",{domain:e},i.json,i.fields):Td(e,!1,i.json,i.fields);case"price":{n||u("Price required",{hint:"Usage: domani parking <domain> price <amount>",code:"validation_error",json:i.json,fields:i.fields});let s=parseFloat(n);return(isNaN(s)||s<=0)&&u("Price must be a positive number",{hint:`Got: "${n}"`,code:"validation_error",json:i.json,fields:i.fields}),i.dryRun?K("parking_price",{domain:e,price:s},i.json,i.fields):Ed(e,s,i.json,i.fields)}case"unprice":case"unlist":return i.dryRun?K("parking_unlist",{domain:e},i.json,i.fields):Ed(e,null,i.json,i.fields);default:u(`Unknown action: ${t}`,{hint:"Actions: enable, disable, price <amount>, unprice",code:"validation_error",json:i.json,fields:i.fields})}}async function qm(e,t,n){let i=C(!t);i.start(`Loading ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}`),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop(`${y.success} ${$.domain(e)}`),t){b({domain:r.domain,parking_enabled:r.parking_enabled,listing_price:r.listing_price},n);return}x("Parking"),l("Domain",$.domain(r.domain)),l("Parking",r.parking_enabled?Fe.default.green("enabled"):Fe.default.dim("disabled")),l("Listing",r.listing_price?`${$.price(r.listing_price)} ${Fe.default.dim("(for sale)")}`:Fe.default.dim("not listed")),c(),R("Enable parking:",`domani parking ${e} enable`),R("Set sale price:",`domani parking ${e} price 499`),R("View analytics:",`domani analytics ${e}`),c()}async function Td(e,t,n,i){let s=C(!n);s.start(`${t?"Enabling":"Disabling"} parking for ${$.domain(e)}`);let r=await k(`/api/domains/${encodeURIComponent(e)}/parking`,{method:"PUT",body:JSON.stringify({enabled:t})}),o=await r.json();if(r.status===409&&o.requires_confirmation){if(s.stop(`${y.warning} DNS records will be replaced`),n){b(o,i);return}console.log(`
|
|
191
|
+
`),{chosen:ge,chosenResult:ie,searchAgain:P,allTaken:r.length===0&&o.length>0,expanded:p>0}}async function fd(e,t,n){if(!e){Te||u("Missing required argument: domain",{hint:"Usage: domani search <domain> [tlds...]",code:"missing_argument",json:n.json});let P=await Ue({message:"Search for a domain",placeholder:"e.g. myapp or myapp.dev"});(ae(P)||!P)&&process.exit(0),e=P}let i=t.map(P=>P.replace(/^\./,"")),s=n.tlds?.split(",").map(P=>P.trim())||[],r=[...new Set([...i,...s])];if(r.length>0&&Fi(r,n),X(e,n),e.includes(".")&&r.length===0){let P=C(!n.json);P.start(`Checking ${$.domain(e)}`);let[ge,ie]=await Promise.all([xe(`/api/domains/search?q=${encodeURIComponent(e)}`),xe(`/api/domains/${encodeURIComponent(e)}/og`).catch(()=>null)]),A=await ge.json();if(ge.ok||(P.stop("Search failed"),u(A.error||A.message,{hint:A.hint,status:ge.status,json:n.json,fields:n.fields})),n.json){let H=A.domain.split(".")[0];b({name:H,results:[A],total:1,available:A.available?1:0},n.fields);return}if(dn(A))P.stop(`${y.warning} ${$.domain(A.domain)} ${y.dot} ${E.default.yellow("not in public DNS")}`),c(),console.log(` ${Br(A)}`),c();else if(Wt(A))P.stop(`${y.warning} ${$.domain(A.domain)} ${y.dot} ${E.default.yellow(es)}`),c(),console.log(` ${A.reason}`),c();else if(yt(A))P.stop(`${y.warning} ${$.domain(A.domain)} ${y.dot} ${E.default.yellow(Cn(A))}`),c(),console.log(` ${Gr(A)}`),c();else if(A.available)if(P.stop(`${y.success} ${$.domain(A.domain)} ${y.dot} available ${y.dot} ${E.default.green(ct(A))}`),Te&&!n.json){let{buy:H}=await Promise.resolve().then(()=>(Sn(),zn));await H([A.domain],{preChecked:Jn(A)})}else c(),R("Register it:",`domani buy ${A.domain}`),c();else if(A.for_sale?.buyable)if(P.stop(`${y.info} ${$.domain(A.domain)} ${y.dot} ${E.default.cyan("for sale")} ${y.dot} ${$.price(A.for_sale.price)}`),Te&&!n.json){let{buy:H}=await Promise.resolve().then(()=>(Sn(),zn));await H([A.domain],{preChecked:{price:A.for_sale.price,currency:A.for_sale.currency,marketplace:!0}})}else c(),R("Buy it:",`domani buy ${A.domain}`),c();else if(A.error)P.stop(`${E.default.dim("?")} ${$.domain(A.domain)} ${y.dot} ${E.default.dim("lookup failed")}`);else{let H;try{if(ie?.ok){let Z=await ie.json();Z?.title&&(H=Z.title)}}catch{}let ne=H?` ${y.dot} ${E.default.dim(`"${H}"`)}`:"";P.stop(`${y.error} ${$.domain(A.domain)} ${y.dot} ${E.default.red("taken")}${ne}`)}return}let o=e.split(".")[0];if(Te&&!n.json&&r.length>0){let P=new URLSearchParams;P.set("domains",r.map(z=>`${o}.${z}`).join(",")),n.maxPrice&&P.set("max_price",n.maxPrice);let ge=await xe(`/api/domains/search?${P}`,{headers:{Accept:"text/event-stream"}});if(!ge.ok||!ge.body){u("Search failed",{json:n.json});return}let ie=[],A=new TextDecoder,H="",ne="",Z=C(!0);Z.start(`Checking ${r.length} TLD${r.length>1?"s":""}`);for await(let z of ge.body){H+=A.decode(z,{stream:!0});let hn=H.split(`
|
|
192
|
+
`);H=hn.pop()??"";for(let ai of hn)if(ai.startsWith("event: "))ne=ai.slice(7);else if(ai.startsWith("data: ")&&ne==="result"){let no=JSON.parse(ai.slice(6));ln(ie,no.domain),ie.push(no)}}Z.stop("");let ue=Math.max(...r.map(z=>`${o}.${z}`.length))+2,ke=ie.filter(z=>z.available),ye=ie.filter(dn),te=ie.filter(Wt),me=ie.filter(yt),ft=ie.filter(z=>!z.available&&!z.error&&!dn(z)&&!Wt(z)&&!yt(z)),Bt=ie.filter(z=>!z.available&&z.for_sale);for(let z of[...ke,...Bt,...me,...ft.filter(hn=>!hn.for_sale),...te,...ye])dn(z)?console.log(` ${E.default.yellow("!")} ${E.default.dim(z.domain.padEnd(ue))} ${E.default.yellow("not in public DNS")}`):Wt(z)?console.log(` ${E.default.yellow("!")} ${E.default.dim(z.domain.padEnd(ue))} ${E.default.yellow(es)}`):yt(z)?console.log(` ${E.default.yellow("!")} ${E.default.dim(z.domain.padEnd(ue))} ${E.default.yellow(Cn(z))}`):z.available?console.log(` ${E.default.green("\u2713")} ${E.default.bold(E.default.white(z.domain.padEnd(ue)))} ${E.default.green(ct(z))}`):z.for_sale?console.log(` ${E.default.cyan("$")} ${E.default.bold(E.default.white(z.domain.padEnd(ue)))} ${E.default.cyan($.price(z.for_sale.price))} ${E.default.dim("(for sale)")}`):console.log(` ${E.default.dim("\u2717")} ${E.default.dim(z.domain.padEnd(ue))} ${E.default.dim("taken")}`);if(ye.length>0||te.length>0||me.length>0){c();for(let z of me)console.log(` ${E.default.dim(Gr(z))}`);for(let z of te)console.log(` ${E.default.dim(z.reason??"")}`);for(let z of ye)console.log(` ${E.default.dim(Br(z))}`)}if(ke.length===0){console.log(` ${E.default.dim("No domains available")}`),c();return}let{buy:pn}=await Promise.resolve().then(()=>(Sn(),zn));if(ke.length===1){await pn([ke[0].domain],{preChecked:Jn(ke[0])});return}let{select:In,isCancel:Sl}=await Promise.resolve().then(()=>(Me(),cr)),oi=await In({message:"Register one?",options:[...ke.map(z=>({value:z.domain,label:$.domain(z.domain),hint:ct(z)})),{value:"__skip__",label:"Skip"}]});if(!Sl(oi)&&oi!=="__skip__"){c();let z=ke.find(hn=>hn.domain===oi);await pn([oi],{preChecked:z?Jn(z):void 0})}else c();return}if(Te&&!n.json){let P=await md();for(n.expand&&P.length>On&&console.error(E.default.dim(` (--expand: checking the first ${On} of ${P.length} TLDs - server limit per request)`));;){let ge=n.expand?P.slice(0,On):P.slice(0,Qe),ie=new URLSearchParams;ie.set("domains",ge.map(ft=>`${o}.${ft}`).join(",")),n.maxPrice&&ie.set("max_price",n.maxPrice);let A=C(!0);A.start(`Searching available domains for ${E.default.bold(o)}`);let H=await xe(`/api/domains/search?${ie}`,{headers:{Accept:"text/event-stream"}});if(!H.ok||!H.body){A.stop("Search failed");break}A.stop("");let ne=!n.expand,{chosen:Z,chosenResult:ue,searchAgain:ke}=await Om(H.body,o,n.all??!1,ne,P);if(Z){c();let{buy:ft}=await Promise.resolve().then(()=>(Sn(),zn)),Bt=ue?Jn(ue):void 0;await ft([Z],{preChecked:Bt});return}if(!ke)break;let{text:ye,isCancel:te}=await Promise.resolve().then(()=>(Me(),cr)),me=await ye({message:"Search for a domain",placeholder:"e.g. myapp or myapp.dev"});if(te(me)||!me)break;o=me.split(".")[0]}c();return}let a=o,d=await md(),m=r.length>0?r:n.expand?d.slice(0,On):d.slice(0,Qe);n.expand&&r.length===0&&d.length>On&&console.error(`(--expand: checking the first ${On} of ${d.length} TLDs - server limit per request; use --tlds to target others)`);let f=m.map(P=>`${a}.${P}`),p=new URLSearchParams;p.set("domains",f.join(",")),n.maxPrice&&p.set("max_price",n.maxPrice);let w=C(!n.json);w.start(`Searching available domains for ${E.default.bold(a)}`);let _=await xe(`/api/domains/search?${p}`,{headers:{Accept:"text/event-stream"}});if(!_.ok){w.stop("Search failed");try{let P=await _.json();u(P.error||P.message||`Server error (${_.status})`,{hint:P.hint,status:_.status,json:n.json,fields:n.fields})}catch{u(`Server error (${_.status})`,{status:_.status,json:n.json,fields:n.fields})}}let v=_.body;v||(w.stop("Search failed"),u("Empty response",{code:"error",json:n.json,fields:n.fields}));let g=[],x=!1,O=0,S=!1,I=new Set,q=n.all??!1;function F(){x||(x=!0,w.stop(`Checking TLDs for ${E.default.bold(a)}`),c())}function Y(P){F(),dn(P)?(console.log(` ${y.warning} ${E.default.dim(P.domain.padEnd(38))} ${E.default.yellow("not in public DNS")}`),console.log(` ${E.default.dim(Br(P))}`)):Wt(P)?(console.log(` ${y.warning} ${E.default.dim(P.domain.padEnd(38))} ${E.default.yellow(es)}`),console.log(` ${E.default.dim(P.reason??"")}`)):yt(P)?(console.log(` ${y.warning} ${E.default.dim(P.domain.padEnd(38))} ${E.default.yellow(Cn(P))}`),console.log(` ${E.default.dim(Gr(P))}`)):P.available?console.log(` ${y.success} ${$.domain(P.domain).padEnd(37)} ${E.default.green(ct(P))}`):P.for_sale?console.log(` ${y.info} ${$.domain(P.domain).padEnd(37)} ${E.default.cyan($.price(P.for_sale.price))} ${E.default.dim("(for sale)")}`):P.error||console.log(` ${y.error} ${E.default.dim(P.domain.padEnd(38))} ${E.default.red("taken")}`)}function U(){x||w.message(`Checking TLDs for ${E.default.bold(a)} ${E.default.dim(`(${O} checked)`)}`)}let M=new TextDecoder,ce="",le="";for await(let P of v){ce+=M.decode(P,{stream:!0});let ge=ce.split(`
|
|
193
|
+
`);ce=ge.pop()??"";for(let ie of ge)if(ie.startsWith("event: "))le=ie.slice(7);else if(ie.startsWith("data: ")){let A=JSON.parse(ie.slice(6));if(le==="error")w.stop("Search failed"),u(A.message||A.error||"Search failed",{code:A.code||"error",json:n.json,fields:n.fields});else if(le==="result"){I.add(A.domain),O=I.size;let H=ln(g,A.domain);(A.available||A.for_sale||q||dn(A)||Wt(A)||yt(A))&&g.splice(H===-1?g.length:H,0,A),n.json||U()}else if(le==="done"){if(n.json){g.sort((ue,ke)=>ue.price-ke.price),b({name:a,results:g,total:A.total,available:A.available},n.fields);return}S=!0;for(let ue of g)Y(ue);x&&console.log(` ${E.default.dim("\u2500".repeat(50))}`);let H=A.total-A.available,ne=A.total>=5&&H/A.total>=.5,Z=`Checked ${A.total} TLDs \xB7 ${A.available} available${ne?" \xB7 popular name":""}`;console.log(` ${E.default.dim(Z)}`),A.available===0&&!n.expand&&r.length===0&&(c(),R("Try more TLDs:",`domani search ${a} --expand`))}}}if(!S&&!n.json)for(let P of g)Y(P);c()}Sn();G();var Yn=D(L(),1);V();ve();Ji();function pd(e,t,n=process.env){let i=rn(t,n);if(i!==void 0&&!e)throw new Error("--webhook is required when setting webhook authentication");return{request:{...e?{webhook_url:e}:{},...i!==void 0?{webhook_headers:i}:{}},preview:{...e?{webhook_url:e}:{},...i!==void 0?{webhook_header_names:on(i)}:{}}}}Wi();async function hd(e,t){X(e,t);let n={domain:e};t.slug&&(n.slug=t.slug),t.name&&(n.name=t.name);let i;try{i=pd(t.webhook,t)}catch(m){u(m instanceof Error?m.message:"Invalid webhook headers",{hint:"Set the named environment variable and retry.",code:"validation_error",json:t.json,fields:t.fields})}Object.assign(n,i.request),t.years&&(n.years=Number(t.years));let s=sn(t.maxPrice,t);if(s!==void 0&&(n.max_price=s),t.paymentMethod&&(n.payment_method=t.paymentMethod),t.dryRun){let m={...n};delete m.webhook_headers,Object.assign(m,i.preview),K("POST /api/agents/provision",m,t.json,t.fields);return}let r=C(!t.json);r.start(`Provisioning ${$.domain(e)}`);let o=await k("/api/agents/provision",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}),a=await o.json(),d=o.ok?void 0:Vt(a);if(d!==void 0&&(r.stop("Price changed - nothing was charged"),u(a.error,{code:"price_above_max",hint:jr(d),data:{price:d},json:t.json,fields:t.fields})),o.ok||(r.stop("Provisioning failed"),u(a.error||"Provisioning failed",{hint:a.hint,status:o.status,json:t.json,fields:t.fields})),r.stop(`${$.domain(e)} is ready`),t.json){b(a,t.fields);return}if(c(),j("Agent identity"),l("Domain",`${a.domain} (${a.domain_status})`),l("Mailbox",a.mailbox?Yn.default.green(a.mailbox.address):Yn.default.yellow("pending DNS")),l("Webhook",a.webhook?a.webhook.url:Yn.default.dim("none")),a.webhook?.header_names.length&&l("Webhook auth",a.webhook.header_names.join(", ")),a.webhook?.secret&&l("Signing secret",a.webhook.secret),a.warnings?.length){c();for(let m of a.warnings)de(Yn.default.yellow(m))}if(a.next_steps?.length){c(),j("Next");for(let m of a.next_steps)de(m)}c()}G();var Tt=D(L(),1);V();async function gd(e){let t=C(!e.json);t.start("Loading domains");let n=await k("/api/domains"),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),t.stop(`${i.domains.length} domain(s)`),e.json){b({...i,count:i.domains.length},e.fields);return}if(i.domains.length===0){c(),console.log(` ${Tt.default.dim("No domains yet.")} Use: ${Tt.default.cyan("domani buy <domain>")}`),c();return}let s=[30,12,12,14];j(`Your Domains (${i.domains.length})`,s.reduce((o,a)=>o+a,0)+s.length-1);let r=i.domains.map(o=>{let a=new Date(o.expiresAt).toLocaleDateString(),d=o.status==="active"?Tt.default.green:o.status==="pending"?Tt.default.yellow:Tt.default.red,m=o.autoRenew?Tt.default.green("on"):Tt.default.dim("off");return[$.domain(o.domain),d(o.status),m,Tt.default.dim(a)]});J(["Domain","Status","Auto-renew","Expires"],r,s),c()}Lr();G();var bt=D(L(),1);V();function Cm(e){let t=new URLSearchParams;return e.kind&&t.set("kind",e.kind),e.maxPrice&&t.set("max_price",e.maxPrice),e.minPrice&&t.set("min_price",e.minPrice),e.sort&&t.set("sort",e.sort),e.search&&t.set("search",e.search),e.limit&&t.set("limit",e.limit),t.set("order","asc"),t.toString()}function yd(e){return e==="second_level"?"second level":e==="alt_root"?"alt root, no public DNS":"tld"}async function bd(e){let t=C(!e.json);t.start("Loading TLDs");let n=await xe(`/api/tlds?${Cm(e)}`),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),t.stop(`${i.total} TLDs loaded`),e.json){b(i,e.fields);return}let s=i.tlds;if(s.length===0){c(),console.log(` ${bt.default.dim("No TLDs match your filters.")}`),c();return}j("TLD Pricing");let r=s.map(o=>[bt.default.bold(`.${o.tld}`),$.price(o.registration.toFixed(2))+bt.default.dim("/yr"),bt.default.dim("renew ")+$.price(o.renewal.toFixed(2))+bt.default.dim("/yr"),o.kind==="alt_root"?bt.default.yellow(yd(o.kind)):bt.default.dim(yd(o.kind))]);J(["TLD","Register","Renewal","Kind"],r,[22,16,20,24]),c(),console.log(` ${bt.default.dim(`${i.total} TLDs total`)}`),s.some(o=>o.kind==="alt_root")&&console.log(` ${y.warning} ${bt.default.yellow("alt root names are outside the IANA root zone: they do not resolve in public DNS, and Domani does not sell them.")}`),c()}G();var Ee=D(L(),1);V();ve();async function wd(e,t){X(e,t);let n=C(!t.json);n.start(`Looking up ${$.domain(e)}`);let[i,s]=await Promise.all([xe(`/api/domains/whois?q=${encodeURIComponent(e)}`),xe(`/api/domains/${encodeURIComponent(e)}/og`).catch(()=>null)]),r=await i.json(),o=null;try{s?.ok&&(o=await s.json())}catch{}if(i.ok||(n.stop("Lookup failed"),u(r.error||r.message,{hint:r.hint,status:i.status,json:t.json,fields:t.fields})),n.stop("WHOIS data retrieved"),t.json){b({...r,...o?{og:o}:{}},t.fields);return}if(j(`WHOIS ${$.domain(r.domain)}`),!r.registered){l("Status",`${y.success} ${Ee.default.green("not registered")}`),c(),R("Register it:",`domani buy ${r.domain}`),c();return}if(l("Status",`${y.error} ${Ee.default.red("registered")}`),(o?.title||o?.description)&&(c(),console.log(` ${Ee.default.bold("Website preview")}`),console.log(` ${Ee.default.dim("\u2500".repeat(50))}`),o.title&&l("Title",o.title),o.description&&l("Description",Ee.default.dim(o.description.length>80?o.description.slice(0,80)+"\u2026":o.description)),c()),r.registrar&&l("Registrar",r.registrar),r.created&&l("Created",r.created),r.expires&&l("Expires",r.expires),r.days_until_expiry!=null){let d=r.days_until_expiry,m=d<30?Ee.default.red:d<90?Ee.default.yellow:Ee.default.green;l("Days left",m(String(d)))}r.updated&&l("Updated",r.updated),l("DNSSEC",r.dnssec?Ee.default.green("yes"):Ee.default.dim("no")),r.nameservers?.length>0&&l("Nameservers",r.nameservers.map(d=>Ee.default.cyan(d)).join(Ee.default.dim(", "))),r.status?.length>0&&l("Status codes",Ee.default.dim(r.status.join(", ")));let a=r.contacts?.registrant;a&&!r.redacted?(c(),console.log(` ${Ee.default.bold("Registrant")}`),console.log(` ${Ee.default.dim("\u2500".repeat(50))}`),a.name&&l("Name",a.name),a.organization&&l("Organization",a.organization),a.email&&l("Email",$.url(a.email)),a.country&&l("Country",a.country)):r.redacted&&l("Contact",Ee.default.dim("redacted (WHOIS privacy)")),c()}G();Me();var wt=D(L(),1);V();ve();xn();async function $d(e,t){if(!e){Te||u("Missing required argument: prompt",{hint:'Usage: domani suggest "describe your project"',code:"missing_argument",json:t.json});let g=await Ue({message:"Describe your project or idea",placeholder:"e.g. AI coding assistant, pet food delivery..."});(ae(g)||!g)&&process.exit(0),e=g}let n=new URLSearchParams({prompt:e});if(t.count&&n.set("count",t.count),t.tlds&&n.set("tlds",t.tlds),t.tlds&&Fi(t.tlds.split(",").map(g=>g.trim()),t),t.style&&n.set("style",t.style),t.lang&&n.set("lang",t.lang),t.json){let g=C(!1);g.start("Finding available domains");let x=t.timeout?parseInt(t.timeout,10)*1e3:6e4,O;try{O=await xe(`/api/domains/suggest?${n}`,{signal:AbortSignal.timeout(x)})}catch{g.stop("Failed"),u("Request timed out",{hint:"Suggest took too long. Try --timeout <seconds> to increase.",code:"timeout",json:t.json,fields:t.fields})}let S=await O.json();O.ok||(g.stop("Failed"),u(S.error||S.message,{hint:S.hint,status:O.status,json:t.json,fields:t.fields})),b(S,t.fields);return}let i=C(!0);i.start("Finding available domains");let s=t.timeout?parseInt(t.timeout,10)*1e3:6e4,r;try{r=await xe(`/api/domains/suggest?${n}`,{headers:{Accept:"text/event-stream"},signal:AbortSignal.timeout(s)})}catch{i.stop("Failed"),u("Request timed out",{hint:"Suggest took too long. Try --timeout <seconds> to increase.",code:"timeout"})}if(!r.ok){i.stop("Failed");try{let g=await r.json();u(g.error||g.message||`Server error (${r.status})`,{hint:g.hint,status:r.status})}catch{u(`Server error (${r.status})`,{status:r.status})}}let o=r.body;o||(i.stop("Failed"),u("Empty response"));let a=[],d=[],m=!1,f=0;function p(){m||(m=!0,i.stop("Finding available domains"),c())}let w=new TextDecoder,_="",v="";for await(let g of o){_+=w.decode(g,{stream:!0});let x=_.split(`
|
|
194
|
+
`);_=x.pop()??"";for(let O of x)if(O.startsWith("event: "))v=O.slice(7);else if(O.startsWith("data: "))try{let S=JSON.parse(O.slice(6));if(v==="result")ln(a,S.domain)!==-1||ln(d,S.domain)!==-1||f++,S.available?a.push(S):d.push(S),m||i.message(`Finding available domains ${wt.default.dim(`(${f} checked, ${a.length} available)`)}`);else if(v==="iteration")m||i.message(`Finding available domains ${wt.default.dim(`(round ${S.n})`)}`);else if(v==="done"){p();for(let I of a){let q=I.reason?` ${wt.default.dim(I.reason)}`:"";console.log(` ${y.success} ${$.domain(I.domain).padEnd(37)} ${wt.default.green(ct(I))}${q}`)}for(let I of d)console.log(` ${y.error} ${wt.default.dim(I.domain.padEnd(38))} ${yt(I)?wt.default.yellow(Cn(I)):wt.default.red("taken")}`);console.log(` ${wt.default.dim("\u2500".repeat(50))}`),console.log(` ${wt.default.dim(`Found ${S.total} available \xB7 checked ${S.checked} \xB7 ${S.iterations} round${S.iterations>1?"s":""}`)}`)}else v==="error"&&(m||i.stop("Failed"),u(S.message))}catch{}}a.length===0&&d.length===0&&(m||i.stop("No results"),u("Could not find available domains for this prompt.")),c(),a.length>0&&(R("Register one:",`domani buy ${a[0].domain}`),c())}Ir();Wr();G();Me();var $t=D(L(),1);V();De();ve();En();async function vd(e){let t=e.maxConsecutiveFailures??10,n=0;for(let i=1;i<=e.maxAttempts;i++){let s=await e.fetchPlan().catch(()=>null);if(e.onTick?.(s,i),s!==null){if(n=0,e.isEligible(s))return{status:"eligible",plan:s}}else if(n++,n>=t)return{status:"unreachable",failures:n};i<e.maxAttempts&&await e.sleep(e.intervalMs)}return{status:"timeout",attempts:e.maxAttempts}}var Xn=D(L(),1);V();function Zn(e){if(e){c(),console.log(` ${Xn.default.bold(`Exit path (${e.managed_via})`)}`),console.log(` ${Xn.default.dim("Unlock:")} ${e.unlock}`),console.log(` ${Xn.default.dim("Auth code:")} ${e.auth_code}`);for(let t of e.notes||[])console.log(` ${Xn.default.yellow("!")} ${t}`)}}var Rm=6e4,Im=1440;async function _d(e,t){X(e,t);let n=C(!t.json);n.start(`Planning safe adoption for ${$.domain(e)}`);let i=await k(`/api/domains/adoption-plan?domain=${encodeURIComponent(e)}`),s=await i.json();if(i.ok||(n.stop("Check failed"),u(s.error,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),s.options?.transfer?.eligible)n.stop(`${y.success} Eligible for transfer`);else{n.stop(`${y.error} Not eligible`);let a=s.options?.transfer;if(t.watch&&a?.eligible_at){let d=await k("/api/domains/transfer-watch",{method:"POST",body:JSON.stringify({domain:e})}),m=await d.json();if(d.ok||u(m.error||m.message,{hint:m.hint,status:d.status,json:t.json,fields:t.fields}),t.json){b(m,t.fields);return}j("Transfer Watch Registered"),l("Domain",$.domain(e)),l("Eligible from",m.eligible_at||a.eligible_at),m.hint&&(c(),console.log(` ${$t.default.dim(m.hint)}`)),c();return}if(t.watch){t.json||(console.log(` ${$t.default.dim(a?.reason||"Domain is not eligible for transfer yet.")}`),Zn(a?.guidance),c());let d=C(!t.json);d.start(`Watching ${$.domain(e)} until it becomes transferable (every 60s, Ctrl+C to stop)`);let m=await vd({fetchPlan:async()=>{let f=await k(`/api/domains/adoption-plan?domain=${encodeURIComponent(e)}`);return f.ok?f.json():null},isEligible:f=>!!f.options?.transfer?.eligible,sleep:f=>new Promise(p=>setTimeout(p,f)),intervalMs:Rm,maxAttempts:Im});m.status!=="eligible"&&(d.stop(`${y.error} Watch ended`),u(m.status==="timeout"?"Domain did not become eligible within 24 hours.":"Gave up after repeated failures fetching the adoption plan.",{hint:"The transfer lock is disabled at the losing registrar; rerun with --watch once you have flipped it.",code:m.status==="timeout"?"watch_timeout":"watch_unreachable",json:t.json,fields:t.fields})),s=m.plan,d.stop(`${y.success} Now eligible for transfer`)}else{t.json||Zn(a?.guidance);let d=a?.eligible_at?`Eligible from ${a.eligible_at}. Rerun with --watch to register a server watch (email + webhook when the date arrives).`:"Fix the blocker above, then rerun - or rerun with --watch to poll until the domain becomes eligible and continue automatically.",m=t.json&&a?.guidance?` The registrar exit playbook is in the adoption plan (options.transfer.guidance, \`domani adopt ${e} --json\`).`:"";u(a?.reason||"Domain is not eligible for transfer.",{hint:[d+m,...s.warnings?.length?[s.warnings.join(" ")]:[]].join(" "),code:"not_eligible",json:t.json,fields:t.fields})}}if(t.dryRun)return K("transfer",{domain:e,eligible:!0,price:s.options.transfer.price,currency:s.options.transfer.currency||"USD",includes_renewal:s.options.transfer.includes_renewal!==!1,preserves_nameservers:!0,migrates_dns:!1,nameservers:s.current.nameservers,dns_provider:s.current.dns_provider,dnssec_enabled:s.current.dnssec_enabled,acting_as:St()},t.json,t.fields);if(!Ct(t)){j("Transfer Safety Plan"),l("Registrar",s.current.registrar||"Unknown"),l("DNS provider",s.current.dns_provider),l("Nameservers",`${s.current.nameservers.length} preserved`),l("DNSSEC",s.current.dnssec_enabled?$t.default.yellow("Enabled, DS will be verified"):"Not enabled"),l("DNS migration","Not requested"),c();let a=s.options.transfer.price!=null?` for ${$.price(s.options.transfer.price.toFixed(2))}`:"",d=await Je({message:`Transfer ${$t.default.bold(e)} to ${yn}${a}${qt()}? Nameservers stay unchanged and ${s.options.transfer.includes_renewal===!1?"no year is added: the domain keeps its expiry date":"1 year is included"}.`});if(!d||typeof d=="symbol"){console.log(` ${$t.default.dim("Cancelled.")}`);return}}if(!t.authCode){(t.json||!process.stdout.isTTY)&&u("--auth-code is required",{hint:"The safety plan passed. Get the EPP/auth code from the current registrar and retry.",code:"validation_error",json:t.json,fields:t.fields}),s.options?.transfer?.guidance&&console.log(` ${$t.default.dim("Where to get it:")} ${s.options.transfer.guidance.auth_code}`);let a=await Ue({message:"Enter the EPP/auth code from your current registrar:",validate:d=>!d||d.trim().length===0?"Auth code is required":void 0});ae(a)&&process.exit(0),t.authCode=a}n.start(`Initiating transfer for ${$.domain(e)}`);let r=await k("/api/domains/transfer",{method:"POST",body:JSON.stringify({domain:e,auth_code:t.authCode})}),o=await r.json();if(r.ok||(n.stop("Transfer failed"),u(o.error||o.message,{hint:o.hint,fixUrl:o.setup_url||o.payment_options?.card?.setup_url,status:r.status,json:t.json,fields:t.fields})),n.stop(`${y.success} Transfer initiated`),t.json){b(o,t.fields);return}j("Transfer Initiated"),l("Domain",$.domain(o.domain)),l("Status",$t.default.yellow(o.status||"pending")),o.price&&l("Price",$.price(o.price)+$t.default.dim(` ${o.currency||"USD"}`)),o.payment_method&&l("Payment",o.payment_method),o.expires&&l("Expires",new Date(o.expires).toLocaleDateString()),o.hint&&(c(),console.log(` ${$t.default.dim(o.hint)}`)),c(),R("Check transfer progress:",`domani status ${o.domain}`),c()}G();var Qn=D(L(),1);V();ve();async function kd(e,t){X(e,t);let n=C(!t.json);n.start(`Inspecting ${$.domain(e)}`);let i=await k(`/api/domains/adoption-plan?domain=${encodeURIComponent(e)}`),s=await i.json();if(i.ok||(n.stop("Inspection failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} Adoption plan ready`),t.json){b(s,t.fields);return}if(j(`Adopt ${$.domain(s.domain)}`),l("Registrar",s.current.registrar||"Unknown"),l("DNS provider",s.current.dns_provider),l("Nameservers",s.current.nameservers.join(", ")||"None detected"),l("DNSSEC",s.current.dnssec_enabled?Qn.default.yellow("Enabled"):"Not enabled"),l("Account",s.account_state),l("Recommended",Qn.default.cyan(s.recommended_action)),c(),s.recommended_action==="connect"&&R("Connect free, without changing registrar or DNS:",`domani import ${s.domain}`),s.options.transfer.available){let r=s.options.transfer.price==null?"price unavailable":`$${s.options.transfer.price.toFixed(2)} ${s.options.transfer.currency}`;R(`Transfer registration for ${r}, preserving nameservers:`,`domani transfer ${s.domain}`),!s.options.transfer.eligible&&s.options.transfer.reason&&(console.log(` ${Qn.default.yellow("!")} ${s.options.transfer.reason}`),R("Wait for eligibility and transfer in one go:",`domani transfer ${s.domain} --watch`)),Zn(s.options.transfer.guidance)}for(let r of s.warnings||[])console.log(` ${Qn.default.yellow("!")} ${r}`);c()}G();Me();var cn=D(L(),1);V();De();ve();st();Wi();xn();async function xd(e,t){e||(e=await be()),X(e,t);let n=Vi(t.years);n===null&&u("--years must be between 1 and 10",{code:"validation_error",json:t.json,fields:t.fields});let i=sn(t.maxPrice,t),s=C(!t.json);s.start(`Checking ${$.domain(e)}`);let r=await k(`/api/domains/${encodeURIComponent(e)}`),o=await r.json();r.ok||(s.stop("Lookup failed"),u(o.error,{hint:o.hint,status:r.status,json:t.json,fields:t.fields}));let a=typeof o.renewal_price=="number"?o.renewal_price:void 0,d=typeof o.min_renewal_years=="number"&&o.min_renewal_years>1?o.min_renewal_years:1,m=n??d,f=We(m),p=a!==void 0?jn(a*m):void 0,w=d>1?` ${cn.default.dim(`(${We(d)} at a time)`)}`:"";if(s.stop(a!==void 0?`${y.success} ${$.domain(e)} ${y.dot} renews at ${$.price(a.toFixed(2))}/yr${w}`:`${$.domain(e)} ${y.dot} ${cn.default.dim("renewal price unknown")}`),m<d){let O=a!==void 0?`, ${$.price(jn(a*d).toFixed(2))} in total`:"";u(`${e} cannot be renewed for ${f}: it renews for at least ${We(d)}${O}. Nothing was charged.`,{code:"TERM_BELOW_MINIMUM",hint:`Re-run with --years ${d}, or leave --years out.`,json:t.json,fields:t.fields})}let _=i??p;if(t.dryRun)return K("renew",{domain:e,years:m,price:p,currency:"USD",max_price:_,acting_as:St()},t.json,t.fields);if(!Ct(t)){let O=await Je({message:p!==void 0?`Renew ${cn.default.bold(e)} for ${f} for ${$.price(p.toFixed(2))}${qt()}?`:`Renew ${cn.default.bold(e)} for ${f}${qt()}? You will be charged.`});if(!O||typeof O=="symbol"){console.log(` ${cn.default.dim("Cancelled.")}`);return}}let v,g,x;for(;;){x=C(!t.json),x.start(`Renewing ${$.domain(e)}`),v=await k(`/api/domains/${encodeURIComponent(e)}/renew`,{method:"POST",body:JSON.stringify({years:m,..._!==void 0?{max_price:_}:{}})}),g=await v.json();let O=v.ok?void 0:Vt(g);if(O===void 0)break;x.stop("Price changed");let S=await Bn(O,_??O,g,"Renew",t);if(S===void 0)return;_=S}if(v.ok||(x.stop("Renewal failed"),u(g.error||g.message,{hint:g.hint,fixUrl:g.setup_url||g.payment_options?.card?.setup_url,status:v.status,json:t.json,fields:t.fields})),x.stop(`${y.success} Domain renewed`),t.json){b(g,t.fields);return}j("Renewal Complete"),l("Domain",$.domain(g.domain)),l("Years",String(g.renewed_years)),l("New expiry",new Date(g.new_expiry).toLocaleDateString()),g.price&&l("Price",$.price(g.price.toFixed(2))+cn.default.dim(` ${g.currency||"USD"}`)),g.payment_method&&l("Payment",g.payment_method),c(),R("Verify renewal:",`domani status ${g.domain}`),c()}G();var vt=D(L(),1);V();ve();async function jd(e,t){e||u("Domain is required",{hint:`Usage: domani import <domain>
|
|
195
|
+
domani import <domain> --verify`,code:"validation_error",json:t.json,fields:t.fields}),X(e,t);let n=t.verify?"/api/domains/import/verify":"/api/domains/import",i=C(!t.json);i.start(t.verify?`Verifying ownership of ${$.domain(e)}`:`Initiating import for ${$.domain(e)}`);let s=await k(n,{method:"POST",body:JSON.stringify({domain:e})}),r=await s.json();if(s.ok||(i.stop(t.verify?"Verification failed":"Import failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields})),t.json){i.stop(""),b(r,t.fields);return}t.verify?(i.stop(`${y.success} ${$.domain(e)} imported!`),j("Domain Imported"),l("Domain",$.domain(r.domain)),l("Status",vt.default.green(r.status||"active")),r.expires_at&&l("Expires",new Date(r.expires_at).toLocaleDateString()),r.registrar&&l("Registrar",r.registrar),c(),R("Check domain health:",`domani status ${r.domain}`),c()):(i.stop(`${y.success} Verification record ready`),j("Import Domain"),l("Domain",$.domain(r.domain)),l("Status",vt.default.yellow("pending verification")),c(),console.log(" Add this TXT record at your DNS provider:"),c(),console.log(` ${vt.default.dim("Type:")} ${vt.default.bold("TXT")}`),console.log(` ${vt.default.dim("Name:")} ${vt.default.bold(r.txt_record?.name||"@")}`),console.log(` ${vt.default.dim("Value:")} ${vt.default.bold(r.txt_record?.value||`domani-verify=${r.token}`)}`),c(),console.log(` ${vt.default.dim("DNS propagation may take a few minutes to 48 hours.")}`),c(),R("Once the record is set, verify:",`domani import ${e} --verify`),c())}Mr();De();V();function Sd(e){let t=at();if(t||(c(),u("Not logged in",{hint:"Run 'domani login' first",code:"auth_required",json:e.json})),!e.reveal&&!e.json&&process.stdout.isTTY){let n=`${t.slice(0,12)}...${t.slice(-4)}`;console.log(n),console.log("Run 'domani token --reveal' to print the full key.");return}e.json?b({token:t}):console.log(t)}G();var He=D(L(),1);V();async function Od(e,t){switch(e){case void 0:case"list":return Am(t.json,t.fields);case"create":return Tm(t);case"revoke":return Em(t);default:u(`Unknown action: ${e}`,{hint:"Actions: list, create, revoke",code:"validation_error",json:t.json,fields:t.fields})}}async function Am(e,t){let n=C(!e);n.start("Loading tokens");let i=await k("/api/tokens"),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e,fields:t})),n.stop(`${y.success} ${s.tokens.length} token(s)`),e){b(s,t);return}if(s.tokens.length===0){c(),console.log(` ${He.default.dim("No tokens.")}`),c(),R("Create one:",'domani tokens create --name "My App"'),c();return}c(),j("API Tokens");let r=s.tokens.map(o=>{let a;o.expired?a=He.default.red("Expired"):o.expiresAt?a=He.default.dim(`Expires ${new Date(o.expiresAt).toLocaleDateString()}`):a=He.default.dim("No expiration");let d=o.scopes.includes("*")?He.default.dim("all"):He.default.dim(o.scopes.join(", "));return[He.default.dim(o.id),He.default.bold(o.name),o.agent_identity?He.default.dim(o.agent_identity.name||o.agent_identity.slug):He.default.dim("-"),d,a]});J(["ID","Name","Agent","Scopes","Expiration"],r,[28,16,18,32,20]),c()}async function Tm(e){let t={};if(e.name&&(t.name=e.name),e.scopes&&(t.scopes=e.scopes.split(",").map(r=>r.trim())),e.expiresIn){let r=Number(e.expiresIn);(isNaN(r)||r<3600||r>31536e3)&&u("Invalid --expires-in value",{hint:"Must be between 3600 (1 hour) and 31536000 (1 year) seconds",code:"validation_error",json:e.json,fields:e.fields}),t.expires_in=r}e.agentIdentity&&(t.agent_identity_id=e.agentIdentity);let n=C(!e.json);n.start("Creating token");let i=await k("/api/tokens",{method:"POST",body:JSON.stringify(t)}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Token created`),e.json){b(s,e.fields);return}c(),j("Token Created"),l("ID",s.id),l("Name",s.name),l("Scopes",s.scopes?.includes("*")?"All (full access)":s.scopes?.join(", ")||"All"),s.agent_identity&&l("Agent",s.agent_identity.name||s.agent_identity.slug),l("Expires",s.expiresAt?new Date(s.expiresAt).toLocaleString():"Never"),c(),console.log(` ${He.default.yellow("!")} ${He.default.bold("Key:")} ${s.key}`),console.log(` ${He.default.dim("Save this key - it will not be shown again.")}`),c()}async function Em(e){e.tokenId||u("Token ID required",{hint:`Usage: domani tokens revoke --token-id <id>
|
|
196
|
+
Run 'domani tokens list' to see your tokens.`,code:"validation_error",json:e.json,fields:e.fields});let t=C(!e.json);t.start("Revoking token");let n=await k(`/api/tokens/${encodeURIComponent(e.tokenId)}`,{method:"DELETE"}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),t.stop(`${y.success} Token revoked`),e.json){b(i,e.fields);return}console.log(` ${He.default.dim("Any applications using this key will need a new one.")}`),c()}G();var Pe=D(L(),1);V();ve();st();async function Cd(e,t){e||(e=await be()),X(e,t);let n=t.autoRenew!==void 0,i=t.whoisPrivacy!==void 0,s=t.securityLock!==void 0;if(!n&&!i&&!s)return Pm(e,t.json,t.fields);let r={};if(n){let m=Kr(t.autoRenew);m===null&&u("--auto-renew must be on or off",{code:"validation_error",json:t.json,fields:t.fields}),r.auto_renew=m}if(i){let m=Kr(t.whoisPrivacy);m===null&&u("--whois-privacy must be on or off",{code:"validation_error",json:t.json,fields:t.fields}),r.whois_privacy=m}if(s){let m=Kr(t.securityLock);m===null&&u("--security-lock must be on or off",{code:"validation_error",json:t.json,fields:t.fields}),r.security_lock=m}if(t.dryRun)return K("settings_update",{domain:e,...r},t.json,t.fields);let o=C(!t.json);o.start(`Updating ${$.domain(e)}`);let a=await k(`/api/domains/${encodeURIComponent(e)}/settings`,{method:"PUT",body:JSON.stringify(r)}),d=await a.json();if(a.ok||(o.stop("Failed"),u(d.error||d.message,{hint:d.hint,status:a.status,json:t.json,fields:t.fields})),o.stop(`${y.success} Settings updated`),t.json){b(d,t.fields);return}j("Settings Updated"),l("Domain",$.domain(d.domain)),d.auto_renew!==void 0&&l("Auto-renew",d.auto_renew?Pe.default.green("on"):Pe.default.dim("off")),d.whois_privacy!==void 0&&l("WHOIS privacy",d.whois_privacy?Pe.default.green("on"):Pe.default.dim("off")),d.security_lock!==void 0&&l("Security lock",d.security_lock?Pe.default.green("locked"):Pe.default.dim("unlocked")),d.hint&&l("",Pe.default.dim(d.hint)),c()}async function Pm(e,t,n){let i=C(!t);i.start(`Loading ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}`),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop(`${y.success} ${$.domain(e)}`),t){b(r,n);return}j("Domain Settings"),l("Domain",$.domain(r.domain)),l("Status",r.status==="active"?Pe.default.green(r.status):Pe.default.yellow(r.status)),l("Auto-renew",r.auto_renew?Pe.default.green("on"):Pe.default.dim("off")),r.registrar&&(l("WHOIS privacy",r.registrar.whois_privacy?Pe.default.green("on"):Pe.default.dim("off")),l("Security lock",r.registrar.security_lock?Pe.default.green("locked"):Pe.default.dim("unlocked"))),l("Expires",new Date(r.expires_at).toLocaleDateString()+Pe.default.dim(` (${r.days_until_expiry} days)`)),c(),R("Toggle auto-renew:",`domani settings ${e} --auto-renew off`),R("Toggle WHOIS privacy:",`domani settings ${e} --whois-privacy off`),R("Toggle security lock:",`domani settings ${e} --security-lock off`),R("Get transfer auth code:",`domani auth-code ${e}`),c()}function Kr(e){let t=e.toLowerCase();return t==="on"||t==="true"||t==="1"||t==="enable"?!0:t==="off"||t==="false"||t==="0"||t==="disable"?!1:null}G();var Et=D(L(),1);V();ve();st();async function Rd(e,t){e||(e=await be()),X(e,t);let n=C(!t.json);n.start(`Getting auth code for ${$.domain(e)}`);let i=await k(`/api/domains/${encodeURIComponent(e)}/auth-code`),s=await i.json();i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields}));let r=s.status==="requested";if(n.stop(r?`${y.success} Auth code requested`:`${y.success} Auth code retrieved`),t.json){b(s,t.fields);return}if(r){j("Auth Code"),l("Domain",$.domain(s.domain)),l("Status",Et.default.yellow("Requested")),s.expected_by&&l("Ready by",new Date(s.expected_by).toLocaleString()),s.hint&&(c(),console.log(` ${Et.default.dim(s.hint)}`)),c(),R("Read the code once you get the email:",`domani auth-code ${e}`),c();return}if(j("Auth Code"),l("Domain",$.domain(s.domain)),l("Auth code",Et.default.bold(Et.default.green(s.auth_code))),s.was_unlocked&&l("",Et.default.yellow("Domain was automatically unlocked to allow transfer.")),s.hint&&(c(),console.log(` ${Et.default.dim(s.hint)}`)),s.next_steps?.length){c();for(let o of s.next_steps)console.log(` ${Et.default.dim("\u2192")} ${Et.default.dim(o)}`)}c(),R("Check transfer status:",`domani transfer-away ${e}`),R("Re-lock domain:",`domani settings ${e} --security-lock on`),c()}G();var Pt=D(L(),1);V();ve();st();var Dm={none:Pt.default.dim,pending:Pt.default.yellow,approved:Pt.default.yellow,completed:Pt.default.green,rejected:Pt.default.red,expired:Pt.default.red};async function Id(e,t){e||(e=await be()),X(e,t);let n=C(!t.json);n.start(`Checking transfer status for ${$.domain(e)}`);let i=await k(`/api/domains/${encodeURIComponent(e)}/transfer-away`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} ${$.domain(e)}`),t.json){b(s,t.fields);return}j("Transfer Away Status"),l("Domain",$.domain(s.domain));let r=Dm[s.status]||Pt.default.dim;l("Status",r(s.status)),s.gaining_registrar&&l("New registrar",s.gaining_registrar),s.request_date&&l("Requested",new Date(s.request_date).toLocaleDateString()),s.hint&&(c(),console.log(` ${Pt.default.dim(s.hint)}`)),c(),s.status==="none"?R("Get auth code to start:",`domani auth-code ${e}`):s.status==="pending"||s.status==="approved"?R("Check again later:",`domani transfer-away ${e}`):s.status==="completed"?R("Search for a new domain:","domani search <name>"):(s.status==="rejected"||s.status==="expired")&&R("Retry with a new auth code:",`domani auth-code ${e}`),c()}G();Me();var ts=D(L(),1);V();async function Ad(e,t){return e==="set"?Um(t):Nm(t)}async function Nm(e){let t=C(!e.json);t.start("Loading contact info");let n=await k("/api/me/contact"),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),t.stop(`${y.success} Contact info`),e.json){b(i,e.fields);return}if(j("Contact Info"),!i.has_contact){console.log(` ${y.warning} ${ts.default.yellow("No contact info set.")} Run ${ts.default.bold("domani contact set")} to add.`),c(),console.log(` ${ts.default.dim("Contact info is required before purchasing domains.")}`),c();return}let s=i.contact;l("Name",`${s.first_name} ${s.last_name}`),s.org_name&&l("Organization",s.org_name),l("Address",s.address1),s.address2&&l("",s.address2),l("",`${s.city}, ${s.state} ${s.postal_code}`),l("Country",s.country),l("Phone",s.phone),l("Email",s.email),c()}async function Um(e){let t={},n=e.firstName||e.lastName||e.address1;if(!Te&&!n&&u("Missing required flags for contact set",{hint:"Usage: domani contact set --first-name John --last-name Doe --address1 '123 Main St' --city SF --state CA --postal-code 94105 --country US --phone +1.5551234567 --email john@example.com",code:"missing_argument",json:e.json}),n){let a=["firstName","lastName","address1","city","state","postalCode","country","phone","email"],d={firstName:"first_name",lastName:"last_name",orgName:"org_name",address1:"address1",address2:"address2",city:"city",state:"state",postalCode:"postal_code",country:"country",phone:"phone",email:"email"},m=a.filter(f=>!e[f]);m.length>0&&u(`Missing required flags: ${m.map(f=>`--${f.replace(/[A-Z]/g,p=>`-${p.toLowerCase()}`)}`).join(", ")}`,{code:"missing_argument",json:e.json});for(let[f,p]of Object.entries(d)){let w=e[f];w&&(t[p]=w)}}else{let a=await k("/api/me/contact"),m=(a.ok?await a.json():null)?.contact,f=[{key:"first_name",message:"First name",placeholder:"John",required:!0},{key:"last_name",message:"Last name",placeholder:"Doe",required:!0},{key:"org_name",message:"Organization (optional, press Enter to skip)",placeholder:"Acme Inc.",required:!1},{key:"address1",message:"Address line 1",placeholder:"123 Main St",required:!0},{key:"address2",message:"Address line 2 (optional)",placeholder:"Suite 100",required:!1},{key:"city",message:"City",placeholder:"San Francisco",required:!0},{key:"state",message:"State / Province",placeholder:"CA",required:!0},{key:"postal_code",message:"Postal / ZIP code",placeholder:"94105",required:!0},{key:"country",message:"Country code (ISO 3166-1 alpha-2)",placeholder:"US",required:!0},{key:"phone",message:"Phone (+CC.NUMBER)",placeholder:"+1.5551234567",required:!0},{key:"email",message:"Contact email",placeholder:"john@example.com",required:!0}];for(let p of f){let w=m?.[p.key]||"",_=await Ue({message:p.message,placeholder:p.placeholder,defaultValue:w,validate:p.required?g=>g?.trim()?void 0:`${p.message} is required`:void 0});ae(_)&&process.exit(0);let v=_.trim();v&&(t[p.key]=v)}}if(e.dryRun)return K("contact_set",t,e.json,e.fields);let i=C(!e.json);i.start("Saving contact info");let s=await k("/api/me/contact",{method:"PUT",body:JSON.stringify(t)}),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${y.success} Contact info saved`),e.json){b(r,e.fields);return}j("Contact Saved");let o=r.contact;l("Name",`${o.first_name} ${o.last_name}`),o.org_name&&l("Organization",o.org_name),l("Address",o.address1),o.address2&&l("",o.address2),l("",`${o.city}, ${o.state} ${o.postal_code}`),l("Country",o.country),l("Phone",o.phone),l("Email",o.email),c(),R("Search for a domain:","domani search <name>"),c()}G();var Fe=D(L(),1);V();ve();st();async function Pd(e,t,n,i){if(e||(e=await be()),X(e,i),!t)return Mm(e,i.json,i.fields);switch(t){case"enable":case"on":return i.dryRun?K("parking_enable",{domain:e},i.json,i.fields):Td(e,!0,i.json,i.fields);case"disable":case"off":return i.dryRun?K("parking_disable",{domain:e},i.json,i.fields):Td(e,!1,i.json,i.fields);case"price":{n||u("Price required",{hint:"Usage: domani parking <domain> price <amount>",code:"validation_error",json:i.json,fields:i.fields});let s=parseFloat(n);return(isNaN(s)||s<=0)&&u("Price must be a positive number",{hint:`Got: "${n}"`,code:"validation_error",json:i.json,fields:i.fields}),i.dryRun?K("parking_price",{domain:e,price:s},i.json,i.fields):Ed(e,s,i.json,i.fields)}case"unprice":case"unlist":return i.dryRun?K("parking_unlist",{domain:e},i.json,i.fields):Ed(e,null,i.json,i.fields);default:u(`Unknown action: ${t}`,{hint:"Actions: enable, disable, price <amount>, unprice",code:"validation_error",json:i.json,fields:i.fields})}}async function Mm(e,t,n){let i=C(!t);i.start(`Loading ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}`),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t,fields:n})),i.stop(`${y.success} ${$.domain(e)}`),t){b({domain:r.domain,parking_enabled:r.parking_enabled,listing_price:r.listing_price},n);return}j("Parking"),l("Domain",$.domain(r.domain)),l("Parking",r.parking_enabled?Fe.default.green("enabled"):Fe.default.dim("disabled")),l("Listing",r.listing_price?`${$.price(r.listing_price)} ${Fe.default.dim("(for sale)")}`:Fe.default.dim("not listed")),c(),R("Enable parking:",`domani parking ${e} enable`),R("Set sale price:",`domani parking ${e} price 499`),R("View analytics:",`domani analytics ${e}`),c()}async function Td(e,t,n,i){let s=C(!n);s.start(`${t?"Enabling":"Disabling"} parking for ${$.domain(e)}`);let r=await k(`/api/domains/${encodeURIComponent(e)}/parking`,{method:"PUT",body:JSON.stringify({enabled:t})}),o=await r.json();if(r.status===409&&o.requires_confirmation){if(s.stop(`${y.warning} DNS records will be replaced`),n){b(o,i);return}console.log(`
|
|
197
197
|
${Fe.default.yellow("Enabling parking will replace these DNS records:")}`);for(let a of o.existing_dns||[])console.log(` ${Fe.default.dim(a.type)} ${a.name} ${Fe.default.dim("\u2192")} ${a.value}`);console.log(`
|
|
198
|
-
${Fe.default.dim("Run again with --confirm to proceed (not implemented yet).")}`),console.log(` ${Fe.default.dim("Or use the dashboard to confirm.")}`),c();return}if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n,fields:i})),s.stop(`${y.success} Parking ${t?"enabled":"disabled"}`),n){b(o,i);return}
|
|
199
|
-
Run 'domani webhooks events' to see available event types.`,code:"validation_error",json:e.json,fields:e.fields});let t=e.events.split(",").map(o=>o.trim()),n;try{n=rn(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.dryRun)return K("webhook_create",{url:e.url,events:t,header_names:on(n)},e.json,e.fields);let i=C(!e.json);i.start("Creating webhook");let s=await k("/api/webhooks",{method:"POST",body:JSON.stringify({url:e.url,events:t,...n!==void 0?{headers:n}:{}})}),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${y.success} Webhook created`),e.json){b(r,e.fields);return}c(),
|
|
198
|
+
${Fe.default.dim("Run again with --confirm to proceed (not implemented yet).")}`),console.log(` ${Fe.default.dim("Or use the dashboard to confirm.")}`),c();return}if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n,fields:i})),s.stop(`${y.success} Parking ${t?"enabled":"disabled"}`),n){b(o,i);return}j("Parking Updated"),l("Domain",$.domain(o.domain)),l("Parking",o.parking_enabled?Fe.default.green("enabled"):Fe.default.dim("disabled")),o.hint&&l("",Fe.default.dim(o.hint)),c()}async function Ed(e,t,n,i){let s=C(!n);s.start(t!==null?`Setting price for ${$.domain(e)} to ${$.price(t)}`:`Removing listing for ${$.domain(e)}`);let r=await k(`/api/domains/${encodeURIComponent(e)}/parking`,{method:"PUT",body:JSON.stringify({listing_price:t})}),o=await r.json();if(r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n,fields:i})),s.stop(`${y.success} ${t!==null?"Price set":"Listing removed"}`),n){b(o,i);return}j("Listing Updated"),l("Domain",$.domain(o.domain)),l("Listing",o.listing_price?`${$.price(o.listing_price)} ${Fe.default.dim("(for sale)")}`:Fe.default.dim("not listed")),o.hint&&l("",Fe.default.dim(o.hint)),c()}G();var et=D(L(),1);V();ve();st();var qm=" \u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588";function Fm(e){let t=Math.max(...e,1);return e.map(n=>qm[Math.min(Math.round(n/t*8),8)]).join("")}async function Dd(e,t){e||(e=await be()),X(e,t);let n=C(!t.json);n.start(`Loading analytics for ${$.domain(e)}`);let i=await k(`/api/domains/${encodeURIComponent(e)}/analytics`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop("Analytics loaded"),t.json){b(s,t.fields);return}if(c(),j(`Analytics: ${$.domain(e)}`),l("Views (7d)",et.default.cyan(s.views_7d.toLocaleString())),l("Views (30d)",et.default.cyan(s.views_30d.toLocaleString())),l("Inquiries",et.default.cyan(String(s.inquiries_30d))),l("Conversion",s.conversion_rate>0?et.default.green(`${s.conversion_rate}%`):et.default.dim("0%")),s.daily_views&&s.daily_views.length>0){let r=s.daily_views.map(m=>m.views),o=Fm(r),a=s.daily_views[0].date.slice(5),d=s.daily_views[s.daily_views.length-1].date.slice(5);c(),console.log(` ${et.default.dim(a)} ${et.default.cyan(o)} ${et.default.dim(d)}`)}if(s.recent_inquiries&&s.recent_inquiries.length>0){c(),console.log(` ${et.default.bold("Recent Inquiries")}`);let r=s.recent_inquiries.map(o=>[et.default.dim(o.email),o.offer?$.price(o.offer):et.default.dim("-"),et.default.dim(new Date(o.date).toLocaleDateString())]);J(["Email","Offer","Date"],r,[30,12,14])}c(),R("Set a listing price:",`domani parking ${e} price <amount>`),R("Set up email:",`domani email setup ${e}`),R("Domain settings:",`domani settings ${e}`),c()}G();var we=D(L(),1);V();Ji();async function Nd(e,t){switch(e){case void 0:case"list":return Vm(t.json,t.fields);case"create":return Wm(t);case"update":return Hm(t);case"delete":return Jm(t);case"deliveries":return Bm(t);case"replay":return Lm(t);case"events":return Gm(t.json,t.fields);default:u(`Unknown action: ${e}`,{hint:"Actions: list, create, update, delete, deliveries, replay, events",code:"validation_error",json:t.json,fields:t.fields})}}async function Lm(e){(!e.webhookId||!e.deliveryId||!e.idempotencyKey)&&u("Webhook ID, delivery ID, and idempotency key are required",{hint:"Usage: domani webhooks replay --webhook-id <id> --delivery-id <id> --idempotency-key <stable-key>",code:"validation_error",json:e.json,fields:e.fields});let t=C(!e.json);t.start("Replaying webhook delivery");let n=await k(`/api/webhooks/${encodeURIComponent(e.webhookId)}/deliveries/${encodeURIComponent(e.deliveryId)}/replay`,{method:"POST",body:JSON.stringify({idempotency_key:e.idempotencyKey})}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),t.stop(`${y.success} Webhook replay ${i.status}`),e.json)return b(i,e.fields);j("Webhook Replay Receipt"),l("Delivery",i.delivery_id),l("Original",i.original_delivery_id),l("Status",i.status),l("Attempts",i.attempts),l("Idempotent retry",i.idempotent_replay?"yes":"no"),c()}async function Vm(e,t){let n=C(!e);n.start("Loading webhooks");let i=await k("/api/webhooks"),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e,fields:t})),n.stop(`${y.success} ${s.webhooks.length} webhook(s)`),e){b(s,t);return}if(s.webhooks.length===0){c(),console.log(` ${we.default.dim("No webhooks configured.")}`),c(),R("Create one:","domani webhooks create --url https://... --events domain.purchased,dns.updated"),R("List events:","domani webhooks events"),c();return}c(),j("Webhooks");let r=s.webhooks.map(o=>[we.default.dim(o.id),$.url(o.url),o.events.length<=3?o.events.join(", "):`${o.events.length} events`,o.header_names?.join(", ")||we.default.dim("none"),o.active?we.default.green("active"):we.default.dim("paused")]);J(["ID","URL","Events","Auth headers","Status"],r,[28,40,24,20,10]),c()}async function Wm(e){e.url||u("URL required",{hint:"Usage: domani webhooks create --url https://example.com/hook --events domain.purchased,dns.updated",code:"validation_error",json:e.json,fields:e.fields}),e.events||u("Events required",{hint:`Usage: domani webhooks create --url https://... --events domain.purchased,dns.updated
|
|
199
|
+
Run 'domani webhooks events' to see available event types.`,code:"validation_error",json:e.json,fields:e.fields});let t=e.events.split(",").map(o=>o.trim()),n;try{n=rn(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.dryRun)return K("webhook_create",{url:e.url,events:t,header_names:on(n)},e.json,e.fields);let i=C(!e.json);i.start("Creating webhook");let s=await k("/api/webhooks",{method:"POST",body:JSON.stringify({url:e.url,events:t,...n!==void 0?{headers:n}:{}})}),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:e.json,fields:e.fields})),i.stop(`${y.success} Webhook created`),e.json){b(r,e.fields);return}c(),j("Webhook Created"),l("ID",r.id),l("URL",$.url(r.url)),l("Events",r.events.join(", ")),l("Auth headers",r.header_names?.join(", ")||we.default.dim("none")),l("Status",we.default.green("active")),c(),console.log(` ${we.default.yellow("!")} ${we.default.bold("Secret:")} ${r.secret}`),console.log(` ${we.default.dim("Save this secret - it won't be shown again.")}`),console.log(` ${we.default.dim("Use it to verify payloads with HMAC-SHA256.")}`),c()}async function Hm(e){e.webhookId||u("Webhook ID required",{hint:"Usage: domani webhooks update --webhook-id <id> [--url ...] [--events ...] [--active on|off]",code:"validation_error",json:e.json,fields:e.fields});let t={};e.url&&(t.url=e.url),e.events&&(t.events=e.events.split(",").map(r=>r.trim())),e.active!==void 0&&(t.active=e.active==="on"||e.active==="true");try{let r=rn(e);r!==void 0&&(t.headers=r)}catch(r){u(r instanceof Error?r.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.dryRun){let{headers:r,...o}=t;return K("webhook_update",{webhook_id:e.webhookId,...o,...r!==void 0?{header_names:on(r)}:{}},e.json,e.fields)}let n=C(!e.json);n.start("Updating webhook");let i=await k(`/api/webhooks/${encodeURIComponent(e.webhookId)}`,{method:"PATCH",body:JSON.stringify(t)}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} Webhook updated`),e.json){b(s,e.fields);return}j("Webhook Updated"),l("ID",s.id),l("URL",$.url(s.url)),l("Events",s.events.join(", ")),l("Auth headers",s.header_names?.join(", ")||we.default.dim("none")),l("Status",s.active?we.default.green("active"):we.default.dim("paused")),c()}async function Jm(e){if(e.webhookId||u("Webhook ID required",{hint:"Usage: domani webhooks delete --webhook-id <id>",code:"validation_error",json:e.json,fields:e.fields}),e.dryRun)return K("webhook_delete",{webhook_id:e.webhookId},e.json,e.fields);let t=C(!e.json);t.start("Deleting webhook");let n=await k(`/api/webhooks/${encodeURIComponent(e.webhookId)}`,{method:"DELETE"}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),t.stop(`${y.success} Webhook deleted`),e.json){b(i,e.fields);return}console.log(` ${we.default.dim("Pending deliveries have been cancelled.")}`),c()}async function Bm(e){e.webhookId||u("Webhook ID required",{hint:"Usage: domani webhooks deliveries --webhook-id <id> [--limit 20]",code:"validation_error",json:e.json,fields:e.fields});let t=e.limit?`?limit=${e.limit}`:"",n=C(!e.json);n.start("Loading deliveries");let i=await k(`/api/webhooks/${encodeURIComponent(e.webhookId)}/deliveries${t}`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields})),n.stop(`${y.success} ${s.deliveries.length} delivery(ies)`),e.json){b(s,e.fields);return}if(s.deliveries.length===0){c(),console.log(` ${we.default.dim("No deliveries yet.")}`),c();return}c(),j("Deliveries");let r=s.deliveries.map(o=>{let a=o.status==="delivered"?we.default.green("delivered"):o.status==="failed"?we.default.red("failed"):we.default.yellow("pending");return[o.event_type,a,o.http_status?String(o.http_status):we.default.dim("-"),String(o.attempts),we.default.dim(new Date(o.created_at).toLocaleString())]});J(["Event","Status","HTTP","Tries","Date"],r,[22,12,6,6,22]),c()}async function Gm(e,t){let n=C(!e);n.start("Loading event types");let i=await xe("/api/webhooks/events"),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e,fields:t})),n.stop(`${y.success} ${s.events.length} event type(s)`),e){b(s,t);return}c(),j("Webhook Event Types");let r=s.events.map(o=>[we.default.cyan(o.type),we.default.dim(o.description)]);J(["Event","Description"],r,[24,50]),c()}G();var Re=D(L(),1);V();ve();async function Ud(e,t){if(e||u("Domain is required",{hint:`Usage: domani sell <domain> --price <amount>
|
|
200
200
|
domani sell <domain> --verify
|
|
201
201
|
domani sell <domain> --status
|
|
202
202
|
domani sell <domain> --cancel`,code:"validation_error",json:t.json,fields:t.fields}),X(e,t),t.status)return Ym(e,t);if(t.verify)return zm(e,t);if(t.cancel)return Xm(e,t);if(t.transferCode)return Zm(e,t.transferCode,t);if(t.price)return Km(e,t);u("No action specified",{hint:`Usage: domani sell <domain> --price <amount>
|
|
203
203
|
domani sell <domain> --verify
|
|
204
204
|
domani sell <domain> --status
|
|
205
205
|
domani sell <domain> --cancel
|
|
206
|
-
domani sell <domain> --transfer-code <code>`,code:"validation_error",json:t.json,fields:t.fields})}async function Km(e,t){let n=parseFloat(t.price);(isNaN(n)||n<=0)&&u("Invalid price",{hint:"Price must be a positive number, e.g. --price 5000",code:"validation_error",json:t.json,fields:t.fields});let i=C(!t.json);i.start(`Listing ${$.domain(e)} for sale`);let s={domain:e,price:n};t.description&&(s.description=t.description);let r=await k("/api/domains/sell",{method:"POST",body:JSON.stringify(s)}),o=await r.json();if(r.ok||(i.stop("Listing failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:t.json,fields:t.fields})),t.json){i.stop(""),b(o,t.fields);return}(o.listing?.status??"pending_verification")==="active"?(i.stop(`${y.success} Listed for sale`),
|
|
207
|
-
Run 'domani deals --role seller' to see your deals.`,code:"not_found",json:n.json,fields:n.fields}));let d=a[0].id;i.message(`Submitting transfer code for deal ${Re.default.dim(d)}`);let m=await k(`/api/deals/${encodeURIComponent(d)}`,{method:"PATCH",body:JSON.stringify({auth_code:t})}),f=await m.json();if(m.ok||(i.stop("Failed"),u(f.error||f.message,{hint:f.hint,status:m.status,json:n.json,fields:n.fields})),n.json){i.stop(""),b(f,n.fields);return}i.stop(`${y.success} Transfer code submitted for ${$.domain(e)}`),x("Transfer Code Submitted"),l("Domain",$.domain(e)),l("Deal",Re.default.dim(d)),l("Status",Re.default.green(f.status||"code_submitted")),c(),R("Track the deal:",`domani deals ${d}`),c()}G();var Se=D(L(),1);V();async function qd(e,t){return e?tf(e,t):ef(t)}function Qm(e){let t=new URLSearchParams;e.role&&t.set("role",e.role),e.status&&t.set("status",e.status),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function ef(e){let t=C(!e.json);t.start("Loading deals");let n=Qm(e),i=await k(`/api/deals${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.deals||s.data||[];if(t.stop(`${y.success} ${r.length} deal(s)`),e.json){b(s,e.fields);return}if(r.length===0){c(),console.log(` ${Se.default.dim("No deals found.")}`),c(),R("List a domain for sale:","domani sell <domain> --price <amount>"),c();return}c(),x("Deals");let o=r.map(a=>{let d=a.status==="completed"?Se.default.green:a.status==="active"?Se.default.cyan:a.status==="cancelled"?Se.default.red:Se.default.yellow;return[$.domain(a.domain),$.price(a.price),d(a.status),Se.default.dim(a.role||"-"),Se.default.dim(new Date(a.created_at).toLocaleDateString())]});J(["Domain","Price","Status","Role","Created"],o,[28,12,14,10,14]),c(),s.next_cursor&&(console.log(` ${Se.default.dim(`More: --cursor ${s.next_cursor}`)}`),c())}async function tf(e,t){let n=C(!t.json);n.start(`Loading deal ${Se.default.dim(e)}`);let i=await k(`/api/deals/${encodeURIComponent(e)}`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} Deal loaded`),t.json){b(s,t.fields);return}let r=s.deal||s;x("Deal Details"),l("ID",Se.default.dim(r.id)),l("Domain",$.domain(r.domain)),l("Price",$.price(r.price));let o=r.status==="completed"?Se.default.green:r.status==="active"?Se.default.cyan:r.status==="cancelled"?Se.default.red:Se.default.yellow;l("Status",o(r.status)),r.role&&l("Your Role",r.role),r.buyer&&l("Buyer",Se.default.dim(r.buyer)),r.seller&&l("Seller",Se.default.dim(r.seller)),r.created_at&&l("Created",Se.default.dim(new Date(r.created_at).toLocaleDateString())),r.updated_at&&l("Updated",Se.default.dim(new Date(r.updated_at).toLocaleDateString())),c();let a=r.events||[];if(a.length>0){x("Timeline");for(let d of a){let m=Se.default.dim(new Date(d.created_at).toLocaleString()),f=d.status==="completed"?y.success:d.status==="expired"||d.status==="refunded"?y.error:y.info;console.log(` ${f} ${m} ${d.detail||d.status}`)}c()}(r.status==="escrow_held"||r.status==="epp_pending")&&r.role==="seller"&&(R("Submit transfer code:",`domani sell ${r.domain} --transfer-code <code>`),c())}G();var Je=D(L(),1);V();ve();async function Ld(e,t,n){switch(e){case void 0:case"list":case"ls":return nf(n);case"request":case"acquire":case"new":return Md(t,n);case"status":case"get":return Fd(t,n);case"cancel":case"rm":return sf(t,n);default:return e.includes(".")?Md(e,n):Fd(e,n)}}async function Md(e,t){e||u("A domain is required.",{hint:"domani broker request dream.com --max-budget 5000",json:t.json}),X(e,{json:t.json});let n=C(!t.json);n.start(`Requesting acquisition of ${$.domain(e)}`);let i={domain:e};if(t.maxBudget){let a=Number(t.maxBudget);(!Number.isFinite(a)||a<=0)&&u("--max-budget must be a positive number (USD).",{json:t.json}),i.max_budget=a}let s=await k("/api/broker",{method:"POST",body:JSON.stringify(i)}),r=await s.json();s.ok||(n.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}));let o=r.request||r;if(n.stop(`${y.success} Acquisition requested`),t.json)return b(r,t.fields);x("Broker request"),l("Domain",$.domain(o.domain)),l("Status",Kr(o.status)),o.max_budget!=null&&l("Max budget",$.price(o.max_budget)),l("ID",Je.default.dim(o.id)),c(),console.log(` ${Je.default.dim("We'll source the owner and reach out anonymously. Commission-only - you pay nothing unless a deal closes.")}`),c(),R("Check progress:",`domani broker status ${o.id}`),c()}async function nf(e){let t=C(!e.json);t.start("Loading broker requests");let n=e.status?`?status=${encodeURIComponent(e.status)}`:"",i=await k(`/api/broker${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.requests||s.data||[];if(t.stop(`${y.success} ${r.length} request(s)`),e.json)return b(s,e.fields);if(r.length===0){c(),console.log(` ${Je.default.dim("No broker requests yet.")}`),c(),R("Acquire a taken domain:","domani broker request <domain> --max-budget <amount>"),c();return}c(),x("Broker requests"),J(["Domain","Status","Budget","ID"],r.map(o=>[$.domain(o.domain),Kr(o.status),o.max_budget!=null?$.price(o.max_budget):Je.default.dim("-"),Je.default.dim(o.id)])),c()}async function Fd(e,t){e||u("A request ID is required.",{hint:"domani broker status <id> (list with: domani broker)",json:t.json});let n=C(!t.json);n.start("Loading request");let i=await k(`/api/broker/${encodeURIComponent(e)}`),s=await i.json();i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields}));let r=s.request||s;if(n.stop(`${y.success} ${$.domain(r.domain)}`),t.json)return b(s,t.fields);x("Broker request"),l("Domain",$.domain(r.domain)),l("Status",Kr(r.status)),r.max_budget!=null&&l("Max budget",$.price(r.max_budget)),l("Contacted",r.contacted?Je.default.green("yes"):Je.default.dim("not yet")),r.failure_reason&&l("Reason",Je.default.yellow(r.failure_reason)),l("ID",Je.default.dim(r.id)),c(),r.negotiation_id?(console.log(` ${Je.default.dim("The owner responded - an anonymous negotiation is open.")}`),c(),R("Review the offer:","domani deals"),c()):["sourcing","contacted","negotiating"].includes(r.status)&&(R("Cancel this request:",`domani broker cancel ${r.id}`),c())}async function sf(e,t){e||u("A request ID is required.",{hint:"domani broker cancel <id>",json:t.json});let n=C(!t.json);n.start("Cancelling request");let i=await k(`/api/broker/${encodeURIComponent(e)}`,{method:"DELETE"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} Request cancelled`),t.json)return b(s,t.fields);c()}function Kr(e){return["completed","agreed"].includes(e)?Je.default.green(e):["negotiating","contacted","sourcing"].includes(e)?Je.default.cyan(e):["declined","no_contact","failed","expired","cancelled"].includes(e)?Je.default.dim(e):e}G();var et=D(L(),1);V();ve();var rf={registered:et.default.dim,expiring:et.default.yellow,expired:et.default.yellow,redemption:et.default.red,pending_delete:et.default.red,available:et.default.green,unknown:et.default.dim};function of(e){return e==="pending_delete"?"pending delete":e==="unknown"?"checking":e}function Vd(e){return(rf[e]??et.default.dim)(of(e))}function Wd(e){return e?e.slice(0,10):"-"}function Hd(e){if(!e)return"-";let t=e.source||"for sale";return e.price!=null?`${t} $${e.price}`:t}function af(e){return e.code==="WATCHLIST_LIMIT"?"limit_reached":void 0}async function Jd(e,t){if(X(e,t),t.dryRun)return K("follow",{domain:e},t.json,t.fields);let n=C(!t.json);n.start(`Following ${$.domain(e)}`);let i=await k("/api/watchlist",{method:"POST",body:JSON.stringify({domain:e})}),s=await i.json();i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,code:af(s),json:t.json,fields:t.fields}));let r=s.watch;if(n.stop(i.status===201?`${y.success} Following ${$.domain(r.domain)}`:`${y.success} Already following ${$.domain(r.domain)}`),t.json){b(s,t.fields);return}c(),l("Now",Vd(r.phase)),r.expires_at&&l("Expires",Wd(r.expires_at)),r.for_sale&&l("For sale",Hd(r.for_sale)),c(),console.log(` ${et.default.dim("You get an alert in the app and by email at each next step, until it drops.")}`),r.phase==="available"?R("It is free now. Register it:",`domani buy ${r.domain}`):R("See every name you follow:","domani watchlist"),c()}async function Bd(e,t){if(X(e,t),t.dryRun)return K("unfollow",{domain:e},t.json,t.fields);let n=C(!t.json);n.start(`Unfollowing ${$.domain(e)}`);let i=await k(`/api/watchlist/${encodeURIComponent(e)}`,{method:"DELETE"}),s=await i.json();i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} No longer following ${$.domain(e)}`),t.json&&b(s,t.fields)}async function Gd(e){let t=C(!e.json);t.start("Loading the names you follow");let n=await k("/api/watchlist"),i=await n.json();n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields}));let s=i.watches||[];if(t.stop(`${y.success} ${s.length} followed`),e.json){b(i,e.fields);return}if(s.length===0){c(),console.log(` ${et.default.dim("You follow no names yet.")}`),c(),R("Follow a taken name for free:","domani follow <domain>"),c();return}x("Names you follow"),J(["Domain","Now","Expires","For sale","Backorder"],s.map(r=>[$.domain(r.domain),Vd(r.phase),Wd(r.expires_at),Hd(r.for_sale),r.backorder_id?et.default.green("yes"):et.default.dim("-")])),c(),R("Stop following one:","domani unfollow <domain>"),c()}G();var _e=D(L(),1);V();async function zd(e){return e.read?cf(e):lf(e)}function df(e){let t=new URLSearchParams;e.unread&&t.set("unread","true"),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function lf(e){let t=C(!e.json);t.start("Loading notifications");let n=df(e),i=await k(`/api/notifications${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.notifications||s.data||[],o=s.unread_count??r.filter(d=>!d.read).length;if(t.stop(`${y.success} ${r.length} notification(s)${o>0?` ${y.dot} ${_e.default.yellow(`${o} unread`)}`:""}`),e.json){b(s,e.fields);return}if(r.length===0){c(),console.log(` ${_e.default.dim("No notifications.")}`),c();return}c(),x("Notifications");let a=r.map(d=>{let m=d.read?_e.default.dim(y.dot):_e.default.cyan(y.info),f=uf(d.type),p=d.read?_e.default.dim(d.title):_e.default.white(d.title),g=d.body?d.read?_e.default.dim(Kd(d.body,40)):_e.default.dim(Kd(d.body,40)):_e.default.dim("-"),_=_e.default.dim(new Date(d.created_at).toLocaleDateString());return[m,f,p,g,_]});J(["","Type","Title","Body","Date"],a,[3,16,28,42,14]),c(),s.next_cursor&&(console.log(` ${_e.default.dim(`More: --cursor ${s.next_cursor}`)}`),c()),o>0&&(console.log(` ${_e.default.dim("Mark all as read:")} ${_e.default.cyan("domani notifications --read")}`),c())}async function cf(e){let t=C(!e.json);t.start("Marking all notifications as read");let n=await k("/api/notifications/read-all",{method:"POST"}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),e.json){t.stop(""),b(i,e.fields);return}let s=i.count??0;t.stop(`${y.success} ${s} notification(s) marked as read`),c()}function uf(e){let t={deal:_e.default.cyan,sale:_e.default.green,purchase:_e.default.green,transfer:_e.default.yellow,expiry:_e.default.red,security:_e.default.red,billing:_e.default.yellow,email:_e.default.blue},n=e.split(".")[0].split("_")[0];return(t[n]||_e.default.dim)(e)}function Kd(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}G();var Ht=D(L(),1);V();async function Yd(e){let t=e.limit?Number(e.limit):20,n=await k(`/api/billing/invoices?limit=${t}`),i=await n.json();if(n.ok||u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields}),e.json){b({...i,count:i.invoices.length},e.fields);return}if(i.invoices.length===0){console.log(` ${Ht.default.dim("No invoices yet.")}`);return}x(`Invoices (${i.invoices.length})`),c();for(let s of i.invoices){let r=`$${(s.amount_paid/100).toFixed(2)}`,o=new Date(s.created).toLocaleDateString(),a=s.number||s.id;console.log(` ${y.success} ${Ht.default.bold(a)} ${Ht.default.green(r)} ${Ht.default.dim(o)}`),s.description&&console.log(` ${Ht.default.dim(s.description)}`),s.hosted_invoice_url&&console.log(` ${Ht.default.dim(s.hosted_invoice_url)}`)}c(),i.has_more&&(console.log(` ${Ht.default.dim(`Showing ${i.invoices.length} most recent. Use --limit to see more.`)}`),c())}G();var ei=D(L(),1);V();async function Xd(e){let t=C(!e?.json);t.start("Setting up billing session");let n=await k("/api/billing/setup",{method:"POST",body:JSON.stringify({mode:"checkout"})}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json})),i.url||(t.stop("Failed"),u("No checkout URL returned",{hint:"Try again or add a payment method at the dashboard.",json:e?.json})),t.stop("Checkout ready"),e?.json){b({url:i.url});return}c(),console.log(` ${ei.default.dim("Opening browser")} ${y.arrow} ${$.url(i.url)}`),c(),Ve(i.url),console.log(` ${y.info} ${ei.default.dim("Complete payment setup in your browser.")}`),console.log(` ${ei.default.dim(" After setup, you can purchase domains with")} ${ei.default.cyan("domani buy")}`),c()}G();var zr=D(L(),1);V();async function Zd(e){let t=C(!e?.json);t.start("Creating upgrade session");let n=await k("/api/billing/subscribe",{method:"POST"}),i=await n.json();if(!n.ok){t.stop("Failed"),i.code==="ALREADY_SUBSCRIBED"||i.code==="ALREADY_PRO"?u("You're already on a paid plan.",{json:e?.json}):u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json});return}if(t.stop("Ready"),e?.json){b({url:i.url},e?.fields);return}c(),console.log(` ${zr.default.dim("Opening browser")} ${y.arrow} ${$.url(i.url)}`),c(),Ve(i.url),console.log(` ${y.info} ${zr.default.dim("Complete your plan upgrade in the browser.")}`),c()}G();var Yr=D(L(),1);V();async function Qd(e){let t=C(!e?.json);t.start("Cancelling subscription");let n=await k("/api/billing/cancel",{method:"POST"}),i=await n.json();if(!n.ok){t.stop("Failed"),i.code==="NOT_PAID"||i.code==="NOT_PRO"?u("You're not on a paid plan.",{json:e?.json}):u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json});return}if(t.stop("Done"),e?.json){b(i,e?.fields);return}c();let s=i.cancel_at?new Date(i.cancel_at).toLocaleDateString():"end of billing period";console.log(` ${y.success} ${Yr.default.dim("Subscription cancelled.")} Access continues until ${Yr.default.cyan(s)}.`),c()}G();var mt=D(L(),1);V();ve();it();async function el(e,t,n){e||(e=await be()),X(e,n);let i=[];if(t?.length&&i.push(...t),n.set&&i.push(...n.set.split(",").map(s=>s.trim()).filter(Boolean)),i.length>0||n.reset){await ff(e,i,n);return}await mf(e,n)}async function mf(e,t){let n=C(!t.json);n.start(`Fetching nameservers for ${$.domain(e)}`);let i=await k(`/api/domains/${encodeURIComponent(e)}/nameservers`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`Nameservers for ${$.domain(e)}`),t.json){b(s,t.fields);return}if(c(),s.nameservers.length===0)console.log(` ${y.warning} ${mt.default.yellow("No nameservers configured.")}`),console.log(` ${mt.default.dim("DNS operations (parking, email, connect) will not work.")}`),c(),R("Set default nameservers:",`domani nameservers ${e} --reset`);else{x("Nameservers");for(let r of s.nameservers)console.log(` ${y.success} ${mt.default.cyan(r)}`);s.default_nameservers&&s.nameservers.length===s.default_nameservers.length&&s.nameservers.every(o=>s.default_nameservers.includes(o))&&(c(),console.log(` ${mt.default.dim("Using default nameservers.")}`))}s.default_nameservers?.length&&(c(),l("Defaults",s.default_nameservers.map(r=>mt.default.dim(r)).join(mt.default.dim(", ")))),c()}async function ff(e,t,n){let i=C(!n.json);if(n.reset){i.start(`Fetching default nameservers for ${$.domain(e)}`);let o=await k(`/api/domains/${encodeURIComponent(e)}/nameservers`),a=await o.json();o.ok||(i.stop("Failed"),u(a.error,{hint:a.hint,status:o.status,json:n.json,fields:n.fields})),a.default_nameservers?.length||(i.stop("No defaults"),u("No default nameservers available for this domain's registrar.",{code:"not_found",json:n.json,fields:n.fields})),t=a.default_nameservers,i.stop(`Using defaults: ${t.map(d=>mt.default.cyan(d)).join(mt.default.dim(", "))}`)}if(t.length<2&&u("At least 2 nameservers required.",{hint:"Example: domani nameservers example.com ns1.dns.com ns2.dns.com",code:"validation_error",json:n.json,fields:n.fields}),n.dryRun)return K("nameservers_set",{domain:e,nameservers:t},n.json,n.fields);i.start(`Setting nameservers for ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}/nameservers`,{method:"PUT",body:JSON.stringify({nameservers:t})}),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:n.json,fields:n.fields})),i.stop(`${y.success} Nameservers updated`),n.json){b(r,n.fields);return}c();for(let o of r.nameservers)console.log(` ${y.success} ${mt.default.cyan(o)}`);c(),console.log(` ${mt.default.dim("Changes may take up to 48 hours to propagate.")}`),c(),R("Check propagation:",`domani status ${e}`),c()}var tl=require("crypto"),ti=D(require("fs"),1);De();var ni=D(L(),1);V();function pf(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]||0)>(i[s]||0))return 1;if((n[s]||0)<(i[s]||0))return-1}return 0}async function nl(e){let t=!!e?.json,n=C(!t);n.start("Checking for updates");let i=Ke();try{let s=await fetch(`${i}/api/cli/version`);s.ok||(n.stop("Failed"),u("Could not check for updates"));let r=await s.json(),o=r.version,a=r.sha256;if(pf(o,Ie)<=0){n.stop(`${y.success} Already up to date (v${Ie})`),t&&b({current:Ie,latest:o,up_to_date:!0});return}if(t&&!e?.yes){n.stop(""),b({current:Ie,latest:o,up_to_date:!1,hint:"Run `domani update --yes` to upgrade non-interactively, or `domani update` in an interactive terminal."});return}n.stop(t?"":`New version available: ${ni.default.cyan(Ie)} ${y.arrow} ${ni.default.green(o)}`);let d=C(!t);d.start("Downloading update");let m=`${i}/cli/domani.js`,f=await fetch(m);f.ok||(d.stop("Download failed"),u(`Failed to download from ${m}`));let p=await f.text();a&&(0,tl.createHash)("sha256").update(p).digest("hex")!==a&&(d.stop("Integrity check failed"),u("Downloaded file does not match expected hash - update aborted"));let g=process.argv[1];g||(d.stop("Failed"),u("Could not determine binary path"));let _=ti.default.realpathSync(g),v=_+".tmp";if(ti.default.writeFileSync(v,p,{mode:493}),ti.default.chmodSync(v,493),ti.default.renameSync(v,_),d.stop(`${y.success} Updated to v${o}`),t){b({updated:!0,from:Ie,to:o});return}c(),console.log(` ${ni.default.dim("Restart your terminal or run")} domani --version ${ni.default.dim("to verify")}`),c()}catch(s){u(`Update failed: ${s instanceof Error?s.message:String(s)}`)}}var ts=D(require("fs"),1),il=D(require("path"),1),sl=D(require("os"),1);qe();var ii=D(L(),1);V();De();Ss();async function rl(){let e=process.argv[1],t=e?ts.default.realpathSync(e):null,n=il.default.join(sl.default.homedir(),".domani");if(c(),console.log(` ${ii.default.bold("This will remove:")}`),t&&console.log(` ${y.dot} CLI binary: ${ii.default.dim(t)}`),console.log(` ${y.dot} Config dir: ${ii.default.dim(n)}`),c(),await He({message:"Uninstall domani?"})!==!0){console.log(` ${ii.default.dim("Cancelled.")}`);return}for(let s of rt())s.token_in_keychain&&hi(s.name);ts.default.rmSync(n,{recursive:!0,force:!0}),t&&ts.default.unlinkSync(t),c(),console.log(` ${y.success} domani uninstalled.`),c()}G();var re=D(L(),1);V();async function al(e,t){let n=t?.json,i=t?.fields,s=e?`/api/schema?command=${encodeURIComponent(e)}`:"/api/schema",r=C(!n);r.start("Loading schema");let o=await xe(s),a=await o.json();if(o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:n,fields:i})),r.stop("Schema loaded"),n){b(a,i);return}e?gf(e,a):hf(a.commands)}function hf(e){x("Commands");let t=Object.entries(e).map(([n,i])=>[re.default.bold(re.default.cyan(n)),i.description]);J(["Command","Description"],t,[20,50]),c(),console.log(` ${re.default.dim("Run")} ${re.default.cyan("domani schema <command>")} ${re.default.dim("for full details")}`),c()}function gf(e,t){if(x(`domani ${e}`),console.log(` ${t.description}`),c(),console.log(` ${$.label("Usage:")} ${re.default.cyan(t.usage)}`),t.arguments&&Object.keys(t.arguments).length>0){c(),console.log(` ${re.default.bold("Arguments")}`);for(let[n,i]of Object.entries(t.arguments)){let s=i.required?re.default.red("*"):"",r=re.default.dim(`(${i.type}${i.variadic?", variadic":""})`);console.log(` ${re.default.cyan(n)}${s} ${r}`),i.description&&console.log(` ${re.default.dim(i.description)}`)}}if(t.options&&Object.keys(t.options).length>0){c(),console.log(` ${re.default.bold("Options")}`);for(let[n,i]of Object.entries(t.options)){let s=i.required?re.default.red("*"):"",r=re.default.dim(`(${i.type})`),o=i.choices?re.default.dim(` [${i.choices.join(", ")}]`):"";console.log(` ${re.default.cyan(`--${n}`)}${s} ${r}${o}`),console.log(` ${re.default.dim(i.description)}`)}}if(t.api)if(c(),console.log(` ${re.default.bold("API")}`),yf(t.api))ol(t.api);else for(let[n,i]of Object.entries(t.api))console.log(` ${re.default.bold(re.default.yellow(n))}`),ol(i,6);t.errors&&t.errors.length>0&&(c(),console.log(` ${re.default.bold("Errors")}`),console.log(` ${t.errors.map(n=>re.default.dim(n)).join(re.default.dim(", "))}`)),c()}function yf(e){return typeof e=="object"&&e!==null&&"method"in e&&"path"in e}function ol(e,t=4){let n=" ".repeat(t);if(console.log(`${n}${re.default.green(e.method)} ${re.default.white(e.path)}`),e.parameters&&Object.keys(e.parameters).length>0)for(let[i,s]of Object.entries(e.parameters)){let r=s.required?re.default.red("*"):"",o=[s.type];s.enum&&o.push(`enum: ${s.enum.join(", ")}`),s.minimum!==void 0&&o.push(`min: ${s.minimum}`),s.maximum!==void 0&&o.push(`max: ${s.maximum}`),s.maxItems!==void 0&&o.push(`maxItems: ${s.maxItems}`),s.items&&o.push(`items: ${s.items}`),s.in==="path"&&o.push("in: path");let a=re.default.dim(`(${o.join(", ")})`);console.log(`${n} ${re.default.cyan(i)}${r} ${a}`),s.description&&console.log(`${n} ${re.default.dim(s.description)}`)}}G();var Be=D(L(),1);qe();V();async function dl(e){let t=C(!e.json);t.start("Loading payment method");let n=await k("/api/me"),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),e.json){t.stop(""),b(i.card?{has_payment_method:i.has_payment_method,card:i.card}:{has_payment_method:!1},e.fields);return}if(!i.has_payment_method||!i.card){t.stop("No payment method on file"),c(),console.log(` ${Be.default.dim("Add a card with")} ${Be.default.cyan("domani card add")}`),c();return}let{brand:s,last4:r,exp_month:o,exp_year:a}=i.card,d=`${String(o).padStart(2,"0")}/${a}`,m=s.charAt(0).toUpperCase()+s.slice(1);t.stop("Payment method loaded"),x("Payment method"),l("Card",`${Be.default.bold(m)} \u2022\u2022\u2022\u2022 ${Be.default.bold(r)}`),l("Expires",d),c(),console.log(` ${Be.default.dim("Update with")} ${Be.default.cyan("domani card add")}`),c()}async function ll(e){let t=C(!e?.json);t.start("Setting up payment session");let n=await k("/api/billing/setup",{method:"POST",body:JSON.stringify({mode:"checkout"})}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json})),i.url||(t.stop("Failed"),u("No checkout URL returned",{json:e?.json})),t.stop("Checkout ready"),e?.json){b({url:i.url},e?.fields);return}c(),console.log(` ${Be.default.dim("Opening browser")} ${y.arrow} ${$.url(i.url)}`),c(),Ve(i.url),console.log(` ${y.info} ${Be.default.dim("Complete payment setup in your browser.")}`),console.log(` ${Be.default.dim(" After setup, you can purchase domains with")} ${Be.default.cyan("domani buy")}`),c()}async function cl(e){if(!e?.yes&&!e?.json){let s=await He({message:"Remove your saved payment method?"});if(ae(s)||!s){console.log(` ${Be.default.dim("Cancelled.")}`);return}}let t=C(!e?.json);t.start("Removing payment method");let n=await k("/api/billing/card",{method:"DELETE"}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json})),t.stop(`${y.success} Payment method removed`),e?.json){b({removed:!0},e?.fields);return}c(),console.log(` ${Be.default.dim("Add a new card with")} ${Be.default.cyan("domani card add")}`),c()}var Xr=D(L(),1);G();V();async function he(e,t,n,i){let s=C(!n.json);s.start(i);let r=await k(e,t),o=await r.json();return r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop(`${y.success} Done`),o}async function ul(e,t){if(!e||e==="list"){let n=await he("/api/workspaces",void 0,t,"Loading workspaces");if(t.json)return b(n,t.fields);if(c(),x("Workspaces"),!n.workspaces.length){console.log(` ${Xr.default.dim("No workspaces yet.")}`),R("Create one:","domani workspace create --name Acme");return}J(["ID","Name","Role","Mailboxes","Members"],n.workspaces.map(i=>[i.id,i.name,i.role,String(i.mailbox_count),String(i.member_count)]),[28,28,10,10,8]),c();return}if(e==="create"){t.name||u("Workspace name required",{hint:"Usage: domani workspace create --name Acme",code:"validation_error",json:t.json});let n=await he("/api/workspaces",{method:"POST",body:JSON.stringify({name:t.name})},t,"Creating workspace");if(t.json)return b(n,t.fields);c(),x("Workspace Created"),l("ID",n.id),l("Name",n.name),c();return}if(e==="show"){t.id||u("Workspace ID required",{hint:"Usage: domani workspace show --id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}`,void 0,t,"Loading workspace");if(t.json)return b(n,t.fields);c(),x(n.name),l("Role",n.role),l("Mailboxes",n.mailboxes.length),l("Members",n.members.length),c(),J(["Email","Role","Mailbox grants"],n.members.map(i=>[i.email,i.role,String(i.mailbox_grants.length)]),[42,12,16]),c();return}if(e==="access"){if(t.id||u("Workspace ID required",{hint:"Usage: domani workspace access --id <id>",code:"validation_error",json:t.json}),!t.subject&&!t.resource&&!t.profile){let a=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access`,void 0,t,"Loading access graph");if(t.json)return b(a,t.fields);c(),x("Access Graph"),l("Principals",a.principals.length),l("Mailboxes",a.mailboxes.length),l("Groups",a.groups.length),l("Collections",a.collections.length),l("Active grants",a.grants.length),l("Pending offers",a.offers.length),c();return}(!t.subject||!t.resource||!t.profile)&&u("Subject, resource, and profile are required together",{hint:"Usage: domani workspace access --id <id> --subject human:<id> --resource mailbox:<id> --profile responder [--apply]",code:"validation_error",json:t.json});let[n,i]=t.subject.split(":",2),[s,r]=t.resource.split(":",2);(!i||!["human","agent","service","token","group"].includes(n))&&u("Invalid --subject",{hint:"Use human:<id>, agent:<id>, service:<id>, token:<id>, or group:<id>",json:t.json}),(!r||!["mailbox","collection"].includes(s))&&u("Invalid --resource",{hint:"Use mailbox:<id> or collection:<id>",json:t.json});let o=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access`,{method:"PUT",body:JSON.stringify({mode:t.apply?"apply":"plan",subject:n==="group"?{type:"group",id:i}:{type:"principal",principal:{type:n,id:i}},resource:{type:s,id:r},profile:t.profile,expected_version:t.expectedVersion?Number(t.expectedVersion):void 0})},t,t.apply?"Applying access":"Planning access");if(t.json)return b(o,t.fields);c(),x(t.apply?"Access Applied":"Access Plan"),l("Action",o.action),l("Changed",String(o.changed)),o.grant_id&&l("Grant",o.grant_id),c();return}if(e==="group"){(!t.id||!t.name)&&u("Workspace ID and group name required",{hint:"Usage: domani workspace group --id <id> --name Support --principals human:u1,agent:a1",code:"validation_error",json:t.json});let n=(t.principals||"").split(",").map(s=>s.trim()).filter(Boolean).map(s=>{let[r,o]=s.split(":",2);return o||u(`Invalid principal: ${s}`,{hint:"Use type:id",json:t.json}),{type:r,id:o,label:o}}),i=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access/groups`,{method:"PUT",body:JSON.stringify({id:t.groupId,name:t.name,principals:n})},t,"Syncing access group");if(t.json)return b(i,t.fields);c(),x("Access Group Synced"),l("ID",i.id),l("Principals",i.principal_count),c();return}if(e==="collection"){(!t.id||!t.name)&&u("Workspace ID and collection name required",{hint:"Usage: domani workspace collection --id <id> --name Admin --mailboxes mb1,mb2",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access/collections`,{method:"PUT",body:JSON.stringify({id:t.collectionId,name:t.name,mailbox_ids:t.mailboxes?.split(",").map(i=>i.trim()).filter(Boolean)??[]})},t,"Syncing mailbox collection");if(t.json)return b(n,t.fields);c(),x("Mailbox Collection Synced"),l("ID",n.id),l("Mailboxes",n.mailbox_count),c();return}if(e==="offer"){(!t.id||!t.email)&&u("Workspace ID and recipient email required",{hint:"Usage: domani workspace offer --id <id> --email person@example.com --mailboxes mb1,mb2 --profile responder",code:"validation_error",json:t.json});let n=(t.mailboxes||"").split(",").map(s=>s.trim()).filter(Boolean).map(s=>({resource:{type:"mailbox",id:s},profile:t.profile||"responder"})),i=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access/offers`,{method:"POST",body:JSON.stringify({email:t.email,grants:n,ownership_disposition:t.ownershipDisposition,creator_disposition:t.creatorDisposition,billing_disposition:t.billingDisposition})},t,"Sending access offer");if(t.json)return b(i,t.fields);c(),x("Access Offered"),l("Email",i.email),l("Expires",i.expires_at),c();return}if(e==="accept-offer"){t.token||u("Access offer token required",{hint:"Usage: domani workspace accept-offer --token <token>",code:"validation_error",json:t.json});let n=await he("/api/workspaces/access/offers/accept",{method:"POST",body:JSON.stringify({token:t.token})},t,"Accepting access offer");if(t.json)return b(n,t.fields);c(),x("Access Accepted"),l("Workspace",n.workspace_name),l("Ownership",n.ownership),c();return}if(e==="revoke-access"){(!t.id||!t.grantId)&&u("Workspace and grant IDs required",{hint:"Usage: domani workspace revoke-access --id <id> --grant-id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access/grants/${encodeURIComponent(t.grantId)}`,{method:"DELETE",body:JSON.stringify({expected_version:t.expectedVersion?Number(t.expectedVersion):void 0})},t,"Revoking access");if(t.json)return b(n,t.fields);c(),x("Access Revoked"),l("Grant",n.grant_id),l("Version",n.version),c();return}if(e==="rename"){(!t.id||!t.name)&&u("Workspace ID and name required",{hint:"Usage: domani workspace rename --id <id> --name <name>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}`,{method:"PATCH",body:JSON.stringify({name:t.name})},t,"Renaming workspace");if(t.json)return b(n,t.fields);c(),x("Workspace Renamed"),l("ID",n.id),l("Name",n.name),c();return}if(e==="invite"){(!t.id||!t.email)&&u("Workspace ID and email required",{hint:"Usage: domani workspace invite --id <id> --email person@example.com",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/invitations`,{method:"POST",body:JSON.stringify({email:t.email,role:t.role,mailbox_ids:t.mailboxes?.split(",").map(i=>i.trim()).filter(Boolean),mailbox_role:t.mailboxRole})},t,"Sending invitation");if(t.json)return b(n,t.fields);c(),x("Invitation Sent"),l("Email",n.email),l("Role",n.role),l("Expires",n.expires_at),c();return}if(e==="accept"){t.token||u("Invitation token required",{hint:"Usage: domani workspace accept --token <token>",code:"validation_error",json:t.json});let n=await he("/api/workspaces/invitations/accept",{method:"POST",body:JSON.stringify({token:t.token})},t,"Accepting invitation");if(t.json)return b(n,t.fields);c(),x("Workspace Joined"),l("Workspace",n.workspace_name),l("Role",n.role),c();return}if(e==="revoke-invite"){(!t.id||!t.invitationId)&&u("Workspace ID and invitation ID required",{hint:"Usage: domani workspace revoke-invite --id <id> --invitation-id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/invitations/${encodeURIComponent(t.invitationId)}`,{method:"DELETE"},t,"Revoking invitation");if(t.json)return b(n,t.fields);c(),x("Invitation Revoked"),l("Invitation",n.invitation_id),c();return}if(e==="member-role"){(!t.id||!t.membershipId||!t.role)&&u("Workspace ID, membership ID, and role required",{hint:"Usage: domani workspace member-role --id <id> --membership-id <id> --role admin|member",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/members/${encodeURIComponent(t.membershipId)}`,{method:"PATCH",body:JSON.stringify({role:t.role})},t,"Updating member role");if(t.json)return b(n,t.fields);c(),x("Member Updated"),l("Membership",n.id),l("Role",n.role),c();return}if(e==="remove-member"){(!t.id||!t.membershipId)&&u("Workspace ID and membership ID required",{hint:"Usage: domani workspace remove-member --id <id> --membership-id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/members/${encodeURIComponent(t.membershipId)}`,{method:"DELETE"},t,"Removing member and revoking access");if(t.json)return b(n,t.fields);c(),x("Member Removed"),l("Membership",n.membership_id),c();return}if(e==="leave"){t.id||u("Workspace ID required",{hint:"Usage: domani workspace leave --id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/members/me`,{method:"DELETE"},t,"Leaving workspace and revoking access");if(t.json)return b(n,t.fields);c(),x("Workspace Left"),l("Workspace",n.workspace_id),c();return}if(e==="transfer"){(!t.id||!t.membershipId)&&u("Workspace ID and target membership ID required",{hint:"Usage: domani workspace transfer --id <workspace-id> --membership-id <membership-id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/ownership-transfer`,{method:"POST",body:JSON.stringify({membership_id:t.membershipId})},t,"Requesting ownership transfer");if(t.json)return b(n,t.fields);c(),x("Ownership Transfer Requested"),l("To",n.to_email),l("Expires",n.expires_at),l("Billing",n.billing),c();return}if(e==="accept-ownership"){t.token||u("Ownership transfer token required",{hint:"Usage: domani workspace accept-ownership --token <token>",code:"validation_error",json:t.json});let n=await he("/api/workspaces/ownership-transfers/accept",{method:"POST",body:JSON.stringify({token:t.token})},t,"Accepting ownership");if(t.json)return b(n,t.fields);c(),x("Ownership Transferred"),l("Workspace",n.workspace_id),l("Domains",n.domains_transferred),l("Mailboxes",n.mailboxes_transferred),l("Previous owner",n.previous_owner_role),c();return}if(e==="revoke-transfer"){(!t.id||!t.transferId)&&u("Workspace ID and transfer ID required",{hint:"Usage: domani workspace revoke-transfer --id <workspace-id> --transfer-id <transfer-id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/ownership-transfer/${encodeURIComponent(t.transferId)}`,{method:"DELETE"},t,"Revoking ownership transfer");if(t.json)return b(n,t.fields);c(),x("Ownership Transfer Revoked"),l("Transfer",n.transfer_id),c();return}if(e==="adopt-mailbox"){(!t.id||!t.mailboxId)&&u("Workspace ID and mailbox ID required",{hint:"Usage: domani workspace adopt-mailbox --id <workspace-id> --mailbox-id <mailbox-id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/mailboxes`,{method:"POST",body:JSON.stringify({mailbox_id:t.mailboxId})},t,"Adopting mailbox boundary");if(t.json)return b(n,t.fields);c(),x(n.adopted?"Mailbox Boundary Adopted":"Already in Workspace"),l("Address",n.address),l("Mailboxes",n.mailbox_ids?.length??1),c();return}if(e==="grant"){(!t.id||!t.mailboxId||!t.membershipId||!t.role)&&u("Workspace, mailbox, membership, and role required",{hint:"Usage: domani workspace grant --id <id> --mailbox-id <id> --membership-id <id> --role viewer|responder|manager",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/mailboxes/${encodeURIComponent(t.mailboxId)}/grants`,{method:"PUT",body:JSON.stringify({membership_id:t.membershipId,role:t.role})},t,"Granting mailbox access");if(t.json)return b(n,t.fields);c(),x("Mailbox Access Granted"),l("Membership",n.membership_id),l("Mailbox",n.mailbox_id),l("Role",n.role),c();return}if(e==="revoke-grant"){(!t.id||!t.mailboxId||!t.membershipId)&&u("Workspace, mailbox, and membership required",{hint:"Usage: domani workspace revoke-grant --id <id> --mailbox-id <id> --membership-id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/mailboxes/${encodeURIComponent(t.mailboxId)}/grants`,{method:"DELETE",body:JSON.stringify({membership_id:t.membershipId})},t,"Revoking mailbox access");if(t.json)return b(n,t.fields);c(),x("Mailbox Access Revoked"),l("Membership",n.membership_id),l("Mailbox",n.mailbox_id),c();return}if(e==="checkout"){(!t.id||!t.plan)&&u("Workspace ID and plan required",{hint:"Usage: domani workspace checkout --id <id> --plan mail_team",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/billing/checkout`,{method:"POST",body:JSON.stringify({plan:t.plan})},t,"Creating secure checkout");if(t.json)return b(n,t.fields);c(),x("Workspace Checkout"),l("Plan",n.plan),l("URL",n.url),c(),n.url&&t.open!==!1&&(console.log(` ${Xr.default.dim("Opening browser")} ${y.arrow} ${$.url(n.url)}`),Ve(n.url));return}if(e==="cancel"){t.id||u("Workspace ID required",{hint:"Usage: domani workspace cancel --id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/billing/cancel`,{method:"POST"},t,"Scheduling cancellation");if(t.json)return b(n,t.fields);c(),x("Cancellation Scheduled"),l("Message",n.message),n.cancel_at&&l("Cancels",n.cancel_at),c();return}u(`Unknown action: ${e}`,{hint:"Actions: list, create, show, access, group, collection, offer, accept-offer, revoke-access, rename, invite, accept, revoke-invite, member-role, remove-member, leave, transfer, accept-ownership, revoke-transfer, adopt-mailbox, grant, revoke-grant, checkout, cancel",code:"validation_error",json:t.json,fields:t.fields})}var si=D(L(),1);G();var ns=D(require("node:crypto"),1),On=D(require("node:fs"),1),ml=D(require("node:os"),1),is=D(require("node:path"),1),bf=process.env.DOMANI_CONFIG_DIR||is.default.join(ml.default.homedir(),".domani"),fl=is.default.join(bf,"mutations");function wf(e){return is.default.join(fl,`${ns.default.createHash("sha256").update(e).digest("hex")}.json`)}function _t(e,t,n){let i=wf(e),s=ns.default.createHash("sha256").update(JSON.stringify(t)).digest("hex");if(!n)try{let o=JSON.parse(On.default.readFileSync(i,"utf8"));if(o.key&&o.fingerprint===s)return{key:o.key,complete:()=>{try{On.default.unlinkSync(i)}catch{}}}}catch{}let r=n||`cli-${ns.default.randomUUID()}`;return On.default.mkdirSync(fl,{recursive:!0,mode:448}),On.default.writeFileSync(i,JSON.stringify({key:r,fingerprint:s}),{mode:384}),{key:r,complete:()=>{try{On.default.unlinkSync(i)}catch{}}}}V();function pl(e){if(e.clearUpstreamHeaders)return{};let t={};for(let[n,i]of[["Authorization",e.upstreamAuthorizationEnv],["X-Api-Key",e.upstreamApiKeyEnv]]){if(!i)continue;let s=process.env[i];s||u(`Environment variable ${i} is empty`,{code:"validation_error",json:e.json}),t[n]=s}return Object.keys(t).length?t:void 0}async function cn(e,t){let n=await e.json();return e.ok||u(n.error||n.message,{hint:n.hint,status:e.status,json:t.json,fields:t.fields}),n}function ss(e,t){if(t.json)return b(e,t.fields);let n=e.http_route||e;c(),x("HTTP Route"),l("ID",n.id),l("URL",n.url),l("Upstream",n.upstream),l("Status",n.status),l("Expires",n.expires_at),l("Browser mode",n.browser_mode||"stateless"),n.upstream_verification?.secret&&(l("Verification secret",si.default.yellow(n.upstream_verification.secret)),console.log(si.default.dim(" Save this secret now. It will not be shown again after this receipt."))),c()}function $f(e){let t=new URLSearchParams;e.domain&&t.set("domain",e.domain),e.hostname&&t.set("hostname",e.hostname),e.status&&t.set("status",e.status),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function hl(e,t,n){if(!e||e==="list"){let i=await cn(await k(`/api/http-routes${$f(n)}`),n);if(n.json)return b(i,n.fields);c(),x("HTTP Routes");for(let s of i.http_routes)console.log(` ${si.default.dim(s.id)} ${s.hostname} ${s.status} ${s.upstream}`);c(),i.next_cursor&&(console.log(` ${si.default.dim(`More: --cursor ${i.next_cursor}`)}`),c());return}if(e==="create"){n.upstream||u("--upstream is required",{code:"validation_error",json:n.json});let i=pl(n),s={...n.hostname?{hostname:n.hostname}:{},upstream:n.upstream,...n.expiresIn?{expires_in:Number(n.expiresIn)}:{},...n.hostHeader?{host_header:n.hostHeader}:{},...n.upstreamVerification?{upstream_verification:n.upstreamVerification}:{},...i?{upstream_headers:i}:{}},r=_t(`route:create:${n.hostname||"auto"}`,s,n.idempotencyKey),o=C(!n.json);o.start("Creating HTTP route");let a=await cn(await k("/api/http-routes",{method:"POST",headers:{"Idempotency-Key":r.key},body:JSON.stringify(s)}),n);return r.complete(),o.stop(`${y.success} HTTP route created`),ss(a,n)}if(t||u("Route ID is required",{hint:`Usage: domani route ${e} <id>`,code:"validation_error",json:n.json}),e==="get")return ss(await cn(await k(`/api/http-routes/${encodeURIComponent(t)}`),n),n);if(e==="delete"){let i=await k(`/api/http-routes/${encodeURIComponent(t)}`,{method:"DELETE"});if(i.ok||await cn(i,n),n.json)return b({deleted:!0,id:t},n.fields);console.log(`${y.success} HTTP route deleted`);return}if(e==="refresh"){n.expiresIn||u("--expires-in is required",{code:"validation_error",json:n.json});let i={expires_in:Number(n.expiresIn)},s=_t(`route:refresh:${t}`,i,n.idempotencyKey),r=await cn(await k(`/api/http-routes/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Idempotency-Key":s.key},body:JSON.stringify(i)}),n);return s.complete(),ss(r,n)}if(e==="rotate-verification"){let i=_t(`route:rotate-verification:${t}`,{},n.idempotencyKey),s=await cn(await k(`/api/http-routes/${encodeURIComponent(t)}/upstream-verification/rotate`,{method:"POST",headers:{"Idempotency-Key":i.key}}),n);return i.complete(),n.json?b(s,n.fields):ss(s,n)}if(e==="rotate-headers"){let i=pl(n);i||u("Provide an upstream header environment variable or --clear-upstream-headers",{code:"validation_error",json:n.json});let s=_t(`route:rotate-headers:${t}`,{upstream_headers:i},n.idempotencyKey),r=await cn(await k(`/api/http-routes/${encodeURIComponent(t)}/upstream-headers`,{method:"PUT",headers:{"Idempotency-Key":s.key},body:JSON.stringify({upstream_headers:i})}),n);if(s.complete(),n.json)return b(r,n.fields);console.log(`${y.success} Upstream headers replaced: ${r.upstream_header_names.join(", ")||"none"}`);return}u(`Unknown action: ${e}`,{hint:"Actions: create, list, get, refresh, rotate-verification, rotate-headers, delete",code:"validation_error",json:n.json})}var ee=D(L(),1),bl=require("node:fs");ui();G();V();var Qr="mailzero-personal-ai.v1",Q=class extends Error{constructor(n,i){super(n);this.hint=i;this.name="AssistantUsageError"}},vf={choose:"choose",instruct:"instruct","take-over":"take_over",snooze:"snooze",ignore:"ignore",correct:"correct",approve:"approve",reject:"reject",tag:"tag"},_f=["today","settings","set","preview","backfill","retry","item","choose","instruct","snooze","ignore","take-over","correct","approve","reject","tag","plan","activity","export","delete","brief","facts","sender","task","lease","release","effects","escalate","report","rules","approvals","suggestions","metrics"];function Zr(e,t,n){if(!e)throw new Q(`${t} is required`,n);try{return JSON.parse(e)}catch{throw new Q(`${t} must be valid JSON`,n)}}function rs(e){return(e||"").split(",").map(t=>t.trim()).filter(Boolean)}function gl(e){return(e||"").split(",").map(t=>t.trim()).filter(Boolean)}function un(e,t,n){let i=Number(e);if(!Number.isInteger(i)||i<n)throw new Q(`${t} must be an integer of at least ${n}`);return i}function kf(e,t,n){let i=e||"today";switch(i){case"today":{let s=new URLSearchParams;n.category&&s.set("category",n.category.trim().toLowerCase()),n.tag&&s.set("tag",n.tag.trim().toLowerCase());let r=s.toString();return{method:"GET",path:r?`/api/assistant/today?${r}`:"/api/assistant/today"}}case"settings":return{method:"GET",path:"/api/assistant/settings"};case"set":{let s={};if(n.enable&&n.disable)throw new Q("Use either --enable or --disable");if(n.pause&&n.resume)throw new Q("Use either --pause or --resume");if(n.enable&&(s.enabled=!0),n.disable&&(s.enabled=!1),n.shadow!==void 0&&(s.shadow_enabled=n.shadow),n.pause&&(s.paused=!0),n.resume&&(s.paused=!1),n.none?s.mailbox_ids=[]:n.mailboxes!==void 0&&(s.mailbox_ids=gl(n.mailboxes)),n.days!==void 0&&(s.history_window_days=un(n.days,"--days",1)),n.attachmentVision!==void 0){if(!["on","off"].includes(n.attachmentVision))throw new Q("--attachment-vision must be on or off");s.attachment_vision=n.attachmentVision==="on"}if(!Object.keys(s).length)throw new Q("Provide at least one setting","Options: --enable, --disable, --shadow, --no-shadow, --pause, --resume, --mailboxes <ids>, --none, --days <n>, --attachment-vision <on|off>");return{method:"PUT",path:"/api/assistant/settings",body:s}}case"preview":{if(!n.consent)throw new Q("--consent is required to start the assistant",`Consent means Domani may read the selected mailboxes and send bounded, minimized message content to the approved private model route (version ${Qr}). Nothing is ever sent on your behalf. You can pause or delete derived data at any time.`);let s=gl(n.mailboxes);if(!s.length)throw new Q("--mailboxes is required","Pass owned mailbox IDs, comma-separated. List them with: domani assistant settings");return{method:"POST",path:"/api/assistant/preview",body:{mailbox_ids:s,history_window_days:n.days===void 0?30:un(n.days,"--days",1),consent:!0,consent_version:Qr}}}case"backfill":return{method:"GET",path:"/api/assistant/backfill"};case"retry":return{method:"POST",path:"/api/assistant/backfill",idempotency:"assistant:retry"};case"item":if(!t)throw new Q("Work item ID is required","Usage: domani assistant item <id>");return{method:"GET",path:`/api/assistant/work-items/${encodeURIComponent(t)}`};case"brief":{if(t)return{method:"GET",path:`/api/assistant/work-items/${encodeURIComponent(t)}/brief`};if(!n.correspondent)throw new Q("Work item ID or --correspondent is required","Usage: domani assistant brief <id> | domani assistant brief --correspondent ada@example.com [--mailbox hi@myapp.dev]");let s=new URLSearchParams({correspondent:n.correspondent});return n.mailbox&&s.set("mailbox",n.mailbox),{method:"GET",path:`/api/assistant/brief?${s}`}}case"facts":if(!t)throw new Q("Work item ID is required","Usage: domani assistant facts <id>");return{method:"GET",path:`/api/assistant/work-items/${encodeURIComponent(t)}/facts`};case"sender":if(!t)throw new Q("Work item ID is required","Usage: domani assistant sender <id>");return{method:"GET",path:`/api/assistant/work-items/${encodeURIComponent(t)}/sender`};case"plan":if(!t)throw new Q("Action plan ID is required","Usage: domani assistant plan <id>");return{method:"GET",path:`/api/assistant/action-plans/${encodeURIComponent(t)}`};case"activity":return{method:"GET",path:`/api/assistant/activity${n.limit!==void 0?`?limit=${un(n.limit,"--limit",1)}`:""}`};case"rules":return{method:"GET",path:"/api/assistant/rules"};case"approvals":return{method:"GET",path:"/api/assistant/approvals"};case"suggestions":return{method:"GET",path:"/api/assistant/suggestions"};case"metrics":return{method:"GET",path:`/api/assistant/metrics${n.days!==void 0?`?window_days=${un(n.days,"--days",1)}`:""}`};case"export":return{method:"GET",path:"/api/assistant/data"};case"delete":if(!n.yes)throw new Q("Deleting derived assistant data requires --yes","This removes analyses, Decisions, plans, receipts, imports, and settings. Source mail is never touched.");return{method:"DELETE",path:"/api/assistant/data"};case"task":if(!t)throw new Q("Task ID is required","Usage: domani assistant task <work item id>");return{method:"GET",path:`/api/assistant/tasks/${encodeURIComponent(t)}`};case"lease":{if(!t)throw new Q("Task ID is required","Usage: domani assistant lease <id> [--ttl <seconds>]");let s={};return n.ttl!==void 0&&(s.ttl_seconds=un(n.ttl,"--ttl",30)),{method:"POST",path:`/api/assistant/tasks/${encodeURIComponent(t)}/lease`,body:s}}case"release":if(!t)throw new Q("Task ID is required","Usage: domani assistant release <id>");return{method:"DELETE",path:`/api/assistant/tasks/${encodeURIComponent(t)}/lease`};case"effects":{if(!t)throw new Q("Task ID is required","Usage: domani assistant effects <id> --effects '<json array>'");let s=Zr(n.effects,"--effects",`A JSON array of effects, for example: --effects '[{"kind":"label","mailbox_id":"mbx_1","add":["finance"]}]'`);if(!Array.isArray(s)||!s.length)throw new Q("--effects must be a non-empty JSON array","Kinds: reply, forward, label, snooze, resolve, note, request");let r={effects:s};return n.text&&(r.note=n.text),{method:"POST",path:`/api/assistant/tasks/${encodeURIComponent(t)}/effects`,body:r,idempotency:`assistant:effects:${t}`}}case"escalate":{if(!t)throw new Q("Task ID is required","Usage: domani assistant escalate <id> --question '<text>' [--options '<json>'] [--evidence <refs>]");if(!n.question)throw new Q("--question is required","What the owner must decide, with the evidence in --evidence");let s={question:n.question};n.options&&(s.options=Zr(n.options,"--options","A JSON array of { key, label, outcome }"));let r=rs(n.evidence);return r.length&&(s.evidence_refs=r),{method:"POST",path:`/api/assistant/tasks/${encodeURIComponent(t)}/escalate`,body:s}}case"report":{if(!t)throw new Q("Task ID is required","Usage: domani assistant report <id> --outcome done|blocked|handed_back --summary '<text>' [--claims '<json>'] [--evidence <refs>]");if(!n.outcome||!["done","blocked","handed_back"].includes(n.outcome))throw new Q("--outcome must be done, blocked or handed_back");if(!n.summary)throw new Q("--summary is required","What was done and how it ended, in a few lines");let s={outcome:n.outcome,summary:n.summary};n.claims&&(s.claims=Zr(n.claims,"--claims","A JSON array of { kind, ref } the platform reconciles with its receipts"));let r=rs(n.evidence);return r.length&&(s.evidence_refs=r),{method:"POST",path:`/api/assistant/tasks/${encodeURIComponent(t)}/report`,body:s}}case"choose":case"instruct":case"snooze":case"ignore":case"take-over":case"correct":case"approve":case"reject":case"tag":{if(!t)throw new Q("Work item ID is required",`Usage: domani assistant ${i} <id> --item-version <work_item_version>`);if(n.itemVersion===void 0)throw new Q("--item-version is required","Pass the work_item_version shown by: domani assistant item <id>");let s=vf[i],r={type:s,work_item_version:un(n.itemVersion,"--item-version",1)};if(s==="ignore"&&n.scope){if(!["item","sender","sender_domain","situation"].includes(n.scope))throw new Q("--scope must be item, sender, sender_domain or situation","Example: domani assistant ignore <id> --item-version 3 --scope sender");r.scope=n.scope}if(s==="choose"){if(!n.option||!n.decision||n.decisionVersion===void 0)throw new Q("--option, --decision and --decision-version are required","They come from the Decision shown by: domani assistant item <id>");r.decision_id=n.decision,r.decision_version=un(n.decisionVersion,"--decision-version",1),r.option_id=n.option}if(s==="instruct"){if(!n.text)throw new Q("--text is required","The instruction the assistant should follow when preparing the draft");r.instruction=n.text}if(s==="snooze"){if(!n.until)throw new Q("--until is required","ISO 8601 date-time, for example 2026-09-03T09:00:00Z");r.until=n.until}if(s==="correct"){if(!n.field||!n.text)throw new Q("--field and --text are required","Name the analysis field to correct and the correct value");r.field=n.field,r.correction=n.text}if(s==="tag"){let o=rs(n.add),a=rs(n.remove);if(!o.length&&!a.length)throw new Q("--add or --remove is required","Example: domani assistant tag <id> --item-version 3 --add lumenworks --remove draft");o.length&&(r.add=o),a.length&&(r.remove=a)}if(s==="approve"||s==="reject"){if(!n.plan)throw new Q("--plan is required","The waiting action plan shown by: domani assistant task <id>");r.plan_id=n.plan,s==="reject"&&n.text&&(r.reason=n.text)}return{method:"POST",path:`/api/assistant/work-items/${encodeURIComponent(t)}/interactions`,body:r,idempotency:`assistant:${s}:${t}`}}default:throw new Q(`Unknown action: ${i}`,`Actions: ${_f.join(", ")}`)}}async function xf(e,t){let n=await e.json();if(e.ok)return n;n.code==="NOT_AVAILABLE"&&u(`The ${Dt.mailProductName} assistant is in private preview`,{hint:"It is enabled per account during the private beta. Ask for access at https://domani.run/support or wait for general availability.",code:"not_available",status:e.status,json:t.json,fields:t.fields}),n.code==="INSUFFICIENT_SCOPE"&&u(n.error||"Missing assistant scope",{hint:"This token needs the assistant:read scope for reads and assistant:write for changes. Create one with: domani tokens create --scopes assistant:read,assistant:write",code:"insufficient_scope",status:e.status,json:t.json,fields:t.fields}),u(n.error||n.message,{hint:n.hint,status:e.status,json:t.json,fields:t.fields})}function jf(e){let t=e.sender?.name||e.sender?.address?.split("@")[0]||e.mailbox?.name||e.mailbox?.address||"",n=e.recurrence?.count&&e.recurrence.count>1?ee.default.dim(`x${e.recurrence.count}`):"",i=[e.category?e.category.replace(/_/g," "):"",...(e.tags??[]).map(s=>`#${s}`)].filter(Boolean).join(" ");return[ee.default.dim(e.id),t,i,`${(e.title||e.summary||"").slice(0,60)} ${n}`.trim(),e.ask?e.ask.slice(0,50):e.attention?.deadline||""]}function Sf(e,t){if(t.json)return b(e,t.fields);c(),x("Today");let n=[["now","Now"],["needs_you","Needs you"],["waiting","Waiting"],["upcoming","Upcoming"],["handled","Handled"]],i=0;for(let[a,d]of n){let m=e.sections&&typeof e.sections=="object"?e.sections:e,f=Array.isArray(m[a])?m[a]:[];f.length&&(i+=f.length,console.log(` ${ee.default.bold(d)} ${ee.default.dim(`(${f.length})`)}`),J(["ID","Who","Kind","Summary","Deadline"],f.map(jf)),c())}i||console.log(ee.default.dim(t.tag?` Nothing tagged ${t.tag} right now.`:t.category?` Nothing of the kind ${t.category} right now.`:" Nothing needs you right now."));let s=e.categories&&typeof e.categories=="object"?Object.entries(e.categories).sort((a,d)=>d[1]-a[1]):[];s.length>1&&console.log(ee.default.dim(` Kinds: ${s.map(([a,d])=>`${a} ${d}`).join(", ")} (narrow with --category)`));let r=e.tags&&typeof e.tags=="object"?Object.entries(e.tags).sort((a,d)=>d[1]-a[1]):[];r.length&&console.log(ee.default.dim(` Tags: ${r.map(([a,d])=>`${a} ${d}`).join(", ")} (narrow with --tag)`));let o=typeof e.as_of=="string"?e.as_of:void 0;o&&console.log(ee.default.dim(` As of ${o}`)),c()}function Of(e,t){if(t.json)return b(e,t.fields);let n=e.brief??e;if(e.correspondent&&!e.brief){c(),x(`Brief for ${e.correspondent}`),console.log(` ${ee.default.dim("Nothing analysed from this person yet.")}`);for(let i of e.recent_mail||[])l(i.received_at.slice(0,10),`${i.subject||""} (${i.mailbox})`);return}c(),x(n.title||"Brief"),n.situation&&l("Status",`${n.situation.status||""}${n.situation.attention?.level?` \xB7 ${n.situation.attention.level}`:""}${n.situation.occurrences&&n.situation.occurrences>1?` \xB7 ${n.situation.occurrences} messages`:""}`),n.situation?.sender?.address&&l("With",`${n.situation.sender.name?`${n.situation.sender.name} `:""}<${n.situation.sender.address}>`),n.summary&&l("Summary",n.summary),n.ask&&l("Ask",n.ask);for(let i of n.story||[])l(i.occurred_at.slice(0,10),`${i.title}${i.analysed?"":ee.default.dim(" (not analysed)")}`);for(let i of n.facts||[])l("Fact",`${i.subject||""} ${i.predicate||""} ${i.value?.value??i.object??""}${i.value?.currency?` ${i.value.currency}`:""}`.trim());for(let i of n.awaiting||[])l(i.overdue?ee.default.red("Awaited"):"Awaited",`${i.who}: ${i.what} (since ${i.since.slice(0,10)})`);for(let i of n.commitments||[])l(i.overdue?ee.default.red("Promised"):"Promised",`${i.who}: ${i.what}`);for(let i of(n.settled||[]).slice(0,5))l("Settled",`${i.what} (${i.status}, ${i.at.slice(0,10)})`);n.decision?.question&&l("Decision",`${n.decision.question} ${(n.decision.options||[]).map(i=>`${i.recommended?"\u2605 ":""}${i.label}`).join(" / ")}`),n.suggested_next&&l("Next",`${n.suggested_next.action} ${ee.default.dim(`(${n.suggested_next.reason})`)}`),e.related&&e.related.length&&l("Also",`${e.related.length} other item(s) from this person`)}function Cf(e,t){if(t.json)return b(e,t.fields);let n=e;c(),x(n.sender?`${n.sender.name?`${n.sender.name} `:""}<${n.sender.address}>`:"Sender"),n.organisation?(l("Organisation",`${n.organisation.name||n.sender?.domain||""}${n.organisation.legal_name&&n.organisation.legal_name!==n.organisation.name?` (${n.organisation.legal_name})`:""}${n.organisation.fresh?"":ee.default.dim(" (profile ageing)")}`),n.organisation.pitch&&l("About",n.organisation.pitch),n.organisation.registered_at&&l("Domain since",n.organisation.registered_at.slice(0,10)),l("Mail",`${n.organisation.mail.provider||"unknown provider"} \xB7 spf ${n.organisation.mail.spf===null?"?":n.organisation.mail.spf?"yes":"no"} \xB7 dmarc ${n.organisation.mail.dmarc}`)):n.sender?.shared_domain?l("Organisation",ee.default.dim(`${n.sender.domain} is a shared mail domain`)):n.sender?.domain&&l("Organisation",ee.default.dim(`${n.sender.domain} not analysed yet`));let i=n.relationship;if(i){let s=i.first_received_at&&i.last_received_at?` between ${i.first_received_at.slice(0,10)} and ${i.last_received_at.slice(0,10)}`:"";l("Received",i.received?`${i.received_capped?"50+":i.received} message(s)${s}`:"nothing before this");for(let r of i.matters.slice(0,5))l(r.last_seen_at.slice(0,10),`${r.title} ${ee.default.dim(`(${r.status}, ${r.id})`)}`);i.organisation?.matters.length&&l("Colleagues",`${i.organisation.other_senders.join(", ")}: ${i.organisation.matters.slice(0,3).map(r=>r.title).join(" / ")}`)}for(let s of n.participants||[])l(s.roles.join("+"),`${s.name?`${s.name} `:""}<${s.address}>${s.messages>1?ee.default.dim(` \xD7${s.messages}`):""}${s.same_organisation?"":ee.default.dim(" (outside)")}`)}function yl(e,t){if(t.json)return b(e,t.fields);let n=e.work_item||e;if(c(),x("Work item"),l("ID",n.id),l("Version",String(n.version??"")),l("Status",n.status||""),l("Mailbox",n.mailbox?.name?`${n.mailbox.name} <${n.mailbox.address||""}>`:n.mailbox?.address||""),n.title&&l("Title",n.title),n.sender?.address&&l("From",`${n.sender.name?`${n.sender.name} `:""}<${n.sender.address}>${n.sender.kind&&n.sender.kind!=="human"?` (${n.sender.kind})`:""}`),n.ask&&l("Ask",n.ask),n.recurrence?.count&&n.recurrence.count>1&&l("Recurrence",`${n.recurrence.count} messages since ${(n.recurrence.first_seen_at||"").slice(0,10)}`),l("Summary",n.summary||""),n.attention?.reason&&l("Why",n.attention.reason),n.attention?.deadline&&l("Deadline",n.attention.deadline),n.source?.event_id&&l("Source",`${n.source.type||"mail"} ${n.source.event_id}`),n.decision?.options?.length){c(),console.log(` ${ee.default.bold("Decision")} ${ee.default.dim(`${n.decision.id} v${n.decision.version??1}`)}`);for(let i of n.decision.options)console.log(` ${ee.default.dim(i.id)} ${i.label}${i.recommended?ee.default.green(" recommended"):""}`);console.log(ee.default.dim(` Choose with: domani assistant choose ${n.id} --version ${n.version??1} --decision ${n.decision.id} --decision-version ${n.decision.version??1} --option <id>`))}n.plan?.id&&l("Plan",`${n.plan.id} (preview with: domani assistant plan ${n.plan.id})`),c()}function Rf(e,t){if(t.json)return b(e,t.fields);c(),x(`${Dt.mailProductName} assistant`),l("Enabled",e.enabled?"yes":"no"),l("Shadow",e.shadow_enabled?"yes":"no"),l("Paused",e.paused?"yes":"no"),l("History window",`${e.history_window_days} days`),l("Privacy route",String(e.privacy_route||"")),l("Consent",e.consent?.accepted_version?`${e.consent.accepted_version} at ${e.consent.accepted_at}`:`none (required: ${e.consent?.required_version||Qr})`),c();let n=new Set(e.mailbox_ids||[]),i=e.mailboxes||[];i.length&&J(["ID","Address","AI"],i.map(s=>[ee.default.dim(s.id),s.address,n.has(s.id)?ee.default.green("on"):ee.default.dim("off")])),c()}function If(e,t){if(t.json)return b(e,t.fields);let n=e.backfill;if(c(),x("History import"),!n){console.log(ee.default.dim(" No import has run yet.")),c();return}l("Status",`${n.status} (${n.phase})`),l("Progress",`${n.processed}/${n.total}${n.percent===null||n.percent===void 0?"":` (${n.percent}%)`}`),l("Failed",String(n.failed??0)),l("Paused",n.paused?"yes":"no"),n.estimated_completion_at&&l("ETA",n.estimated_completion_at),n.can_close_app&&console.log(ee.default.dim(" The import continues in the background.")),c()}function Af(e,t){if(t.json)return b(e,t.fields);let n=e.action_plan||e.plan||e;c(),x("Action preview"),l("ID",n.id),l("Status",n.status||""),n.expires_at&&l("Expires",n.expires_at);for(let i of n.effects||[])c(),console.log(` ${ee.default.bold(i.kind||"effect")} ${ee.default.dim(`mailbox ${i.mailbox_id||""}`)}${i.reply_to_message_id?ee.default.dim(` in reply to ${i.reply_to_message_id}`):""}`),i.body&&console.log(`
|
|
206
|
+
domani sell <domain> --transfer-code <code>`,code:"validation_error",json:t.json,fields:t.fields})}async function Km(e,t){let n=parseFloat(t.price);(isNaN(n)||n<=0)&&u("Invalid price",{hint:"Price must be a positive number, e.g. --price 5000",code:"validation_error",json:t.json,fields:t.fields});let i=C(!t.json);i.start(`Listing ${$.domain(e)} for sale`);let s={domain:e,price:n};t.description&&(s.description=t.description);let r=await k("/api/domains/sell",{method:"POST",body:JSON.stringify(s)}),o=await r.json();if(r.ok||(i.stop("Listing failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:t.json,fields:t.fields})),t.json){i.stop(""),b(o,t.fields);return}(o.listing?.status??"pending_verification")==="active"?(i.stop(`${y.success} Listed for sale`),j("Sell Domain"),l("Domain",$.domain(o.listing?.domain||e)),l("Price",$.price(n)),l("Status",Re.default.green("active")),c(),console.log(` ${Re.default.dim("Your listing is live on the marketplace.")}`),c()):(i.stop(`${y.success} Verification record ready`),j("Sell Domain"),l("Domain",$.domain(o.listing?.domain||e)),l("Price",$.price(n)),l("Status",Re.default.yellow("pending verification")),c(),console.log(" Add this TXT record at your DNS provider:"),c(),console.log(` ${Re.default.dim("Type:")} ${Re.default.bold("TXT")}`),console.log(` ${Re.default.dim("Name:")} ${Re.default.bold(o.txt_record?.name||"@")}`),console.log(` ${Re.default.dim("Value:")} ${Re.default.bold(o.txt_record?.value||`domani-verify=${o.token}`)}`),c(),console.log(` ${Re.default.dim("DNS propagation may take a few minutes to 48 hours.")}`),c(),R("Once the record is set, verify:",`domani sell ${e} --verify`),c())}async function zm(e,t){let n=C(!t.json);n.start(`Verifying ownership of ${$.domain(e)}`);let i=await k("/api/domains/sell/verify",{method:"POST",body:JSON.stringify({domain:e})}),s=await i.json();if(i.ok||(n.stop("Verification failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),t.json){n.stop(""),b(s,t.fields);return}n.stop(`${y.success} ${$.domain(e)} is now listed for sale!`),j("Domain Listed"),l("Domain",$.domain(s.domain||e)),l("Status",Re.default.green(s.status||"active")),s.price&&l("Price",$.price(s.price)),c(),R("Check listing status:",`domani sell ${e} --status`),R("View your deals:","domani deals"),c()}async function Ym(e,t){let n=C(!t.json);n.start(`Checking listing status for ${$.domain(e)}`);let i=await k(`/api/domains/sell/status?domain=${encodeURIComponent(e)}`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} Listing status loaded`),t.json){b(s,t.fields);return}let r=s.listing;if(j("Listing Status"),l("Domain",$.domain(s.domain||e)),r){let o=r.status;l("Status",o==="active"?Re.default.green(o):Re.default.yellow(o||"unknown")),r.price&&l("Price",$.price(r.price)),r.description&&l("Description",r.description),r.created_at&&l("Listed",Re.default.dim(new Date(r.created_at).toLocaleDateString()))}else l("Status",Re.default.dim("No listing found"));s.deal&&l("Deal",`${s.deal.status} ($${s.deal.price})`),c()}async function Xm(e,t){let n=C(!t.json);n.start(`Removing ${$.domain(e)} from sale`);let i=await k(`/api/domains/sell?domain=${encodeURIComponent(e)}`,{method:"DELETE"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),t.json){n.stop(""),b(s,t.fields);return}n.stop(`${y.success} ${$.domain(e)} removed from sale`),c()}async function Zm(e,t,n){let i=C(!n.json);i.start(`Looking up active deal for ${$.domain(e)}`);let s=await k(`/api/deals?role=seller&domain=${encodeURIComponent(e)}&status=active`),r=await s.json();s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:n.json,fields:n.fields}));let a=(r.deals||r.data||[]).filter(p=>p.domain.toLowerCase()===e.toLowerCase());a.length===0&&(i.stop("No active deal found"),u(`No active deal found for ${e}`,{hint:`Make sure you have an active sale for this domain.
|
|
207
|
+
Run 'domani deals --role seller' to see your deals.`,code:"not_found",json:n.json,fields:n.fields}));let d=a[0].id;i.message(`Submitting transfer code for deal ${Re.default.dim(d)}`);let m=await k(`/api/deals/${encodeURIComponent(d)}`,{method:"PATCH",body:JSON.stringify({auth_code:t})}),f=await m.json();if(m.ok||(i.stop("Failed"),u(f.error||f.message,{hint:f.hint,status:m.status,json:n.json,fields:n.fields})),n.json){i.stop(""),b(f,n.fields);return}i.stop(`${y.success} Transfer code submitted for ${$.domain(e)}`),j("Transfer Code Submitted"),l("Domain",$.domain(e)),l("Deal",Re.default.dim(d)),l("Status",Re.default.green(f.status||"code_submitted")),c(),R("Track the deal:",`domani deals ${d}`),c()}G();var Se=D(L(),1);V();async function Md(e,t){return e?tf(e,t):ef(t)}function Qm(e){let t=new URLSearchParams;e.role&&t.set("role",e.role),e.status&&t.set("status",e.status),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function ef(e){let t=C(!e.json);t.start("Loading deals");let n=Qm(e),i=await k(`/api/deals${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.deals||s.data||[];if(t.stop(`${y.success} ${r.length} deal(s)`),e.json){b(s,e.fields);return}if(r.length===0){c(),console.log(` ${Se.default.dim("No deals found.")}`),c(),R("List a domain for sale:","domani sell <domain> --price <amount>"),c();return}c(),j("Deals");let o=r.map(a=>{let d=a.status==="completed"?Se.default.green:a.status==="active"?Se.default.cyan:a.status==="cancelled"?Se.default.red:Se.default.yellow;return[$.domain(a.domain),$.price(a.price),d(a.status),Se.default.dim(a.role||"-"),Se.default.dim(new Date(a.created_at).toLocaleDateString())]});J(["Domain","Price","Status","Role","Created"],o,[28,12,14,10,14]),c(),s.next_cursor&&(console.log(` ${Se.default.dim(`More: --cursor ${s.next_cursor}`)}`),c())}async function tf(e,t){let n=C(!t.json);n.start(`Loading deal ${Se.default.dim(e)}`);let i=await k(`/api/deals/${encodeURIComponent(e)}`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} Deal loaded`),t.json){b(s,t.fields);return}let r=s.deal||s;j("Deal Details"),l("ID",Se.default.dim(r.id)),l("Domain",$.domain(r.domain)),l("Price",$.price(r.price));let o=r.status==="completed"?Se.default.green:r.status==="active"?Se.default.cyan:r.status==="cancelled"?Se.default.red:Se.default.yellow;l("Status",o(r.status)),r.role&&l("Your Role",r.role),r.buyer&&l("Buyer",Se.default.dim(r.buyer)),r.seller&&l("Seller",Se.default.dim(r.seller)),r.created_at&&l("Created",Se.default.dim(new Date(r.created_at).toLocaleDateString())),r.updated_at&&l("Updated",Se.default.dim(new Date(r.updated_at).toLocaleDateString())),c();let a=r.events||[];if(a.length>0){j("Timeline");for(let d of a){let m=Se.default.dim(new Date(d.created_at).toLocaleString()),f=d.status==="completed"?y.success:d.status==="expired"||d.status==="refunded"?y.error:y.info;console.log(` ${f} ${m} ${d.detail||d.status}`)}c()}(r.status==="escrow_held"||r.status==="epp_pending")&&r.role==="seller"&&(R("Submit transfer code:",`domani sell ${r.domain} --transfer-code <code>`),c())}G();var Be=D(L(),1);V();ve();async function Ld(e,t,n){switch(e){case void 0:case"list":case"ls":return nf(n);case"request":case"acquire":case"new":return qd(t,n);case"status":case"get":return Fd(t,n);case"cancel":case"rm":return sf(t,n);default:return e.includes(".")?qd(e,n):Fd(e,n)}}async function qd(e,t){e||u("A domain is required.",{hint:"domani broker request dream.com --max-budget 5000",json:t.json}),X(e,{json:t.json});let n=C(!t.json);n.start(`Requesting acquisition of ${$.domain(e)}`);let i={domain:e};if(t.maxBudget){let a=Number(t.maxBudget);(!Number.isFinite(a)||a<=0)&&u("--max-budget must be a positive number (USD).",{json:t.json}),i.max_budget=a}let s=await k("/api/broker",{method:"POST",body:JSON.stringify(i)}),r=await s.json();s.ok||(n.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:t.json,fields:t.fields}));let o=r.request||r;if(n.stop(`${y.success} Acquisition requested`),t.json)return b(r,t.fields);j("Broker request"),l("Domain",$.domain(o.domain)),l("Status",zr(o.status)),o.max_budget!=null&&l("Max budget",$.price(o.max_budget)),l("ID",Be.default.dim(o.id)),c(),console.log(` ${Be.default.dim("We'll source the owner and reach out anonymously. Commission-only - you pay nothing unless a deal closes.")}`),c(),R("Check progress:",`domani broker status ${o.id}`),c()}async function nf(e){let t=C(!e.json);t.start("Loading broker requests");let n=e.status?`?status=${encodeURIComponent(e.status)}`:"",i=await k(`/api/broker${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.requests||s.data||[];if(t.stop(`${y.success} ${r.length} request(s)`),e.json)return b(s,e.fields);if(r.length===0){c(),console.log(` ${Be.default.dim("No broker requests yet.")}`),c(),R("Acquire a taken domain:","domani broker request <domain> --max-budget <amount>"),c();return}c(),j("Broker requests"),J(["Domain","Status","Budget","ID"],r.map(o=>[$.domain(o.domain),zr(o.status),o.max_budget!=null?$.price(o.max_budget):Be.default.dim("-"),Be.default.dim(o.id)])),c()}async function Fd(e,t){e||u("A request ID is required.",{hint:"domani broker status <id> (list with: domani broker)",json:t.json});let n=C(!t.json);n.start("Loading request");let i=await k(`/api/broker/${encodeURIComponent(e)}`),s=await i.json();i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields}));let r=s.request||s;if(n.stop(`${y.success} ${$.domain(r.domain)}`),t.json)return b(s,t.fields);j("Broker request"),l("Domain",$.domain(r.domain)),l("Status",zr(r.status)),r.max_budget!=null&&l("Max budget",$.price(r.max_budget)),l("Contacted",r.contacted?Be.default.green("yes"):Be.default.dim("not yet")),r.failure_reason&&l("Reason",Be.default.yellow(r.failure_reason)),l("ID",Be.default.dim(r.id)),c(),r.negotiation_id?(console.log(` ${Be.default.dim("The owner responded - an anonymous negotiation is open.")}`),c(),R("Review the offer:","domani deals"),c()):["sourcing","contacted","negotiating"].includes(r.status)&&(R("Cancel this request:",`domani broker cancel ${r.id}`),c())}async function sf(e,t){e||u("A request ID is required.",{hint:"domani broker cancel <id>",json:t.json});let n=C(!t.json);n.start("Cancelling request");let i=await k(`/api/broker/${encodeURIComponent(e)}`,{method:"DELETE"}),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} Request cancelled`),t.json)return b(s,t.fields);c()}function zr(e){return["completed","agreed"].includes(e)?Be.default.green(e):["negotiating","contacted","sourcing"].includes(e)?Be.default.cyan(e):["declined","no_contact","failed","expired","cancelled"].includes(e)?Be.default.dim(e):e}G();var tt=D(L(),1);V();ve();var rf={registered:tt.default.dim,expiring:tt.default.yellow,expired:tt.default.yellow,redemption:tt.default.red,pending_delete:tt.default.red,available:tt.default.green,unknown:tt.default.dim};function of(e){return e==="pending_delete"?"pending delete":e==="unknown"?"checking":e}function Vd(e){return(rf[e]??tt.default.dim)(of(e))}function Wd(e){return e?e.slice(0,10):"-"}function Hd(e){if(!e)return"-";let t=e.source||"for sale";return e.price!=null?`${t} $${e.price}`:t}function af(e){return e.code==="WATCHLIST_LIMIT"?"limit_reached":void 0}async function Jd(e,t){if(X(e,t),t.dryRun)return K("follow",{domain:e},t.json,t.fields);let n=C(!t.json);n.start(`Following ${$.domain(e)}`);let i=await k("/api/watchlist",{method:"POST",body:JSON.stringify({domain:e})}),s=await i.json();i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,code:af(s),json:t.json,fields:t.fields}));let r=s.watch;if(n.stop(i.status===201?`${y.success} Following ${$.domain(r.domain)}`:`${y.success} Already following ${$.domain(r.domain)}`),t.json){b(s,t.fields);return}c(),l("Now",Vd(r.phase)),r.expires_at&&l("Expires",Wd(r.expires_at)),r.for_sale&&l("For sale",Hd(r.for_sale)),c(),console.log(` ${tt.default.dim("You get an alert in the app and by email at each next step, until it drops.")}`),r.phase==="available"?R("It is free now. Register it:",`domani buy ${r.domain}`):R("See every name you follow:","domani watchlist"),c()}async function Bd(e,t){if(X(e,t),t.dryRun)return K("unfollow",{domain:e},t.json,t.fields);let n=C(!t.json);n.start(`Unfollowing ${$.domain(e)}`);let i=await k(`/api/watchlist/${encodeURIComponent(e)}`,{method:"DELETE"}),s=await i.json();i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`${y.success} No longer following ${$.domain(e)}`),t.json&&b(s,t.fields)}async function Gd(e){let t=C(!e.json);t.start("Loading the names you follow");let n=await k("/api/watchlist"),i=await n.json();n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields}));let s=i.watches||[];if(t.stop(`${y.success} ${s.length} followed`),e.json){b(i,e.fields);return}if(s.length===0){c(),console.log(` ${tt.default.dim("You follow no names yet.")}`),c(),R("Follow a taken name for free:","domani follow <domain>"),c();return}j("Names you follow"),J(["Domain","Now","Expires","For sale","Backorder"],s.map(r=>[$.domain(r.domain),Vd(r.phase),Wd(r.expires_at),Hd(r.for_sale),r.backorder_id?tt.default.green("yes"):tt.default.dim("-")])),c(),R("Stop following one:","domani unfollow <domain>"),c()}G();var _e=D(L(),1);V();async function zd(e){return e.read?cf(e):lf(e)}function df(e){let t=new URLSearchParams;e.unread&&t.set("unread","true"),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function lf(e){let t=C(!e.json);t.start("Loading notifications");let n=df(e),i=await k(`/api/notifications${n}`),s=await i.json();i.ok||(t.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:e.json,fields:e.fields}));let r=s.notifications||s.data||[],o=s.unread_count??r.filter(d=>!d.read).length;if(t.stop(`${y.success} ${r.length} notification(s)${o>0?` ${y.dot} ${_e.default.yellow(`${o} unread`)}`:""}`),e.json){b(s,e.fields);return}if(r.length===0){c(),console.log(` ${_e.default.dim("No notifications.")}`),c();return}c(),j("Notifications");let a=r.map(d=>{let m=d.read?_e.default.dim(y.dot):_e.default.cyan(y.info),f=uf(d.type),p=d.read?_e.default.dim(d.title):_e.default.white(d.title),w=d.body?d.read?_e.default.dim(Kd(d.body,40)):_e.default.dim(Kd(d.body,40)):_e.default.dim("-"),_=_e.default.dim(new Date(d.created_at).toLocaleDateString());return[m,f,p,w,_]});J(["","Type","Title","Body","Date"],a,[3,16,28,42,14]),c(),s.next_cursor&&(console.log(` ${_e.default.dim(`More: --cursor ${s.next_cursor}`)}`),c()),o>0&&(console.log(` ${_e.default.dim("Mark all as read:")} ${_e.default.cyan("domani notifications --read")}`),c())}async function cf(e){let t=C(!e.json);t.start("Marking all notifications as read");let n=await k("/api/notifications/read-all",{method:"POST"}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),e.json){t.stop(""),b(i,e.fields);return}let s=i.count??0;t.stop(`${y.success} ${s} notification(s) marked as read`),c()}function uf(e){let t={deal:_e.default.cyan,sale:_e.default.green,purchase:_e.default.green,transfer:_e.default.yellow,expiry:_e.default.red,security:_e.default.red,billing:_e.default.yellow,email:_e.default.blue},n=e.split(".")[0].split("_")[0];return(t[n]||_e.default.dim)(e)}function Kd(e,t){return e.length<=t?e:e.slice(0,t-1)+"\u2026"}G();var Ht=D(L(),1);V();async function Yd(e){let t=e.limit?Number(e.limit):20,n=await k(`/api/billing/invoices?limit=${t}`),i=await n.json();if(n.ok||u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields}),e.json){b({...i,count:i.invoices.length},e.fields);return}if(i.invoices.length===0){console.log(` ${Ht.default.dim("No invoices yet.")}`);return}j(`Invoices (${i.invoices.length})`),c();for(let s of i.invoices){let r=`$${(s.amount_paid/100).toFixed(2)}`,o=new Date(s.created).toLocaleDateString(),a=s.number||s.id;console.log(` ${y.success} ${Ht.default.bold(a)} ${Ht.default.green(r)} ${Ht.default.dim(o)}`),s.description&&console.log(` ${Ht.default.dim(s.description)}`),s.hosted_invoice_url&&console.log(` ${Ht.default.dim(s.hosted_invoice_url)}`)}c(),i.has_more&&(console.log(` ${Ht.default.dim(`Showing ${i.invoices.length} most recent. Use --limit to see more.`)}`),c())}G();var ei=D(L(),1);V();async function Xd(e){let t=C(!e?.json);t.start("Setting up billing session");let n=await k("/api/billing/setup",{method:"POST",body:JSON.stringify({mode:"checkout"})}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json})),i.url||(t.stop("Failed"),u("No checkout URL returned",{hint:"Try again or add a payment method at the dashboard.",json:e?.json})),t.stop("Checkout ready"),e?.json){b({url:i.url});return}c(),console.log(` ${ei.default.dim("Opening browser")} ${y.arrow} ${$.url(i.url)}`),c(),Ve(i.url),console.log(` ${y.info} ${ei.default.dim("Complete payment setup in your browser.")}`),console.log(` ${ei.default.dim(" After setup, you can purchase domains with")} ${ei.default.cyan("domani buy")}`),c()}G();var Yr=D(L(),1);V();async function Zd(e){let t=C(!e?.json);t.start("Creating upgrade session");let n=await k("/api/billing/subscribe",{method:"POST"}),i=await n.json();if(!n.ok){t.stop("Failed"),i.code==="ALREADY_SUBSCRIBED"||i.code==="ALREADY_PRO"?u("You're already on a paid plan.",{json:e?.json}):u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json});return}if(t.stop("Ready"),e?.json){b({url:i.url},e?.fields);return}c(),console.log(` ${Yr.default.dim("Opening browser")} ${y.arrow} ${$.url(i.url)}`),c(),Ve(i.url),console.log(` ${y.info} ${Yr.default.dim("Complete your plan upgrade in the browser.")}`),c()}G();var Xr=D(L(),1);V();async function Qd(e){let t=C(!e?.json);t.start("Cancelling subscription");let n=await k("/api/billing/cancel",{method:"POST"}),i=await n.json();if(!n.ok){t.stop("Failed"),i.code==="NOT_PAID"||i.code==="NOT_PRO"?u("You're not on a paid plan.",{json:e?.json}):u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json});return}if(t.stop("Done"),e?.json){b(i,e?.fields);return}c();let s=i.cancel_at?new Date(i.cancel_at).toLocaleDateString():"end of billing period";console.log(` ${y.success} ${Xr.default.dim("Subscription cancelled.")} Access continues until ${Xr.default.cyan(s)}.`),c()}G();var mt=D(L(),1);V();ve();st();async function el(e,t,n){e||(e=await be()),X(e,n);let i=[];if(t?.length&&i.push(...t),n.set&&i.push(...n.set.split(",").map(s=>s.trim()).filter(Boolean)),i.length>0||n.reset){await ff(e,i,n);return}await mf(e,n)}async function mf(e,t){let n=C(!t.json);n.start(`Fetching nameservers for ${$.domain(e)}`);let i=await k(`/api/domains/${encodeURIComponent(e)}/nameservers`),s=await i.json();if(i.ok||(n.stop("Failed"),u(s.error||s.message,{hint:s.hint,status:i.status,json:t.json,fields:t.fields})),n.stop(`Nameservers for ${$.domain(e)}`),t.json){b(s,t.fields);return}if(c(),s.nameservers.length===0)console.log(` ${y.warning} ${mt.default.yellow("No nameservers configured.")}`),console.log(` ${mt.default.dim("DNS operations (parking, email, connect) will not work.")}`),c(),R("Set default nameservers:",`domani nameservers ${e} --reset`);else{j("Nameservers");for(let r of s.nameservers)console.log(` ${y.success} ${mt.default.cyan(r)}`);s.default_nameservers&&s.nameservers.length===s.default_nameservers.length&&s.nameservers.every(o=>s.default_nameservers.includes(o))&&(c(),console.log(` ${mt.default.dim("Using default nameservers.")}`))}s.default_nameservers?.length&&(c(),l("Defaults",s.default_nameservers.map(r=>mt.default.dim(r)).join(mt.default.dim(", ")))),c()}async function ff(e,t,n){let i=C(!n.json);if(n.reset){i.start(`Fetching default nameservers for ${$.domain(e)}`);let o=await k(`/api/domains/${encodeURIComponent(e)}/nameservers`),a=await o.json();o.ok||(i.stop("Failed"),u(a.error,{hint:a.hint,status:o.status,json:n.json,fields:n.fields})),a.default_nameservers?.length||(i.stop("No defaults"),u("No default nameservers available for this domain's registrar.",{code:"not_found",json:n.json,fields:n.fields})),t=a.default_nameservers,i.stop(`Using defaults: ${t.map(d=>mt.default.cyan(d)).join(mt.default.dim(", "))}`)}if(t.length<2&&u("At least 2 nameservers required.",{hint:"Example: domani nameservers example.com ns1.dns.com ns2.dns.com",code:"validation_error",json:n.json,fields:n.fields}),n.dryRun)return K("nameservers_set",{domain:e,nameservers:t},n.json,n.fields);i.start(`Setting nameservers for ${$.domain(e)}`);let s=await k(`/api/domains/${encodeURIComponent(e)}/nameservers`,{method:"PUT",body:JSON.stringify({nameservers:t})}),r=await s.json();if(s.ok||(i.stop("Failed"),u(r.error||r.message,{hint:r.hint,status:s.status,json:n.json,fields:n.fields})),i.stop(`${y.success} Nameservers updated`),n.json){b(r,n.fields);return}c();for(let o of r.nameservers)console.log(` ${y.success} ${mt.default.cyan(o)}`);c(),console.log(` ${mt.default.dim("Changes may take up to 48 hours to propagate.")}`),c(),R("Check propagation:",`domani status ${e}`),c()}var tl=require("crypto"),ti=D(require("fs"),1);De();var ni=D(L(),1);V();function pf(e,t){let n=e.split(".").map(Number),i=t.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]||0)>(i[s]||0))return 1;if((n[s]||0)<(i[s]||0))return-1}return 0}async function nl(e){let t=!!e?.json,n=C(!t);n.start("Checking for updates");let i=ze();try{let s=await fetch(`${i}/api/cli/version`);s.ok||(n.stop("Failed"),u("Could not check for updates"));let r=await s.json(),o=r.version,a=r.sha256;if(pf(o,Ie)<=0){n.stop(`${y.success} Already up to date (v${Ie})`),t&&b({current:Ie,latest:o,up_to_date:!0});return}if(t&&!e?.yes){n.stop(""),b({current:Ie,latest:o,up_to_date:!1,hint:"Run `domani update --yes` to upgrade non-interactively, or `domani update` in an interactive terminal."});return}n.stop(t?"":`New version available: ${ni.default.cyan(Ie)} ${y.arrow} ${ni.default.green(o)}`);let d=C(!t);d.start("Downloading update");let m=`${i}/cli/domani.js`,f=await fetch(m);f.ok||(d.stop("Download failed"),u(`Failed to download from ${m}`));let p=await f.text();a&&(0,tl.createHash)("sha256").update(p).digest("hex")!==a&&(d.stop("Integrity check failed"),u("Downloaded file does not match expected hash - update aborted"));let w=process.argv[1];w||(d.stop("Failed"),u("Could not determine binary path"));let _=ti.default.realpathSync(w),v=_+".tmp";if(ti.default.writeFileSync(v,p,{mode:493}),ti.default.chmodSync(v,493),ti.default.renameSync(v,_),d.stop(`${y.success} Updated to v${o}`),t){b({updated:!0,from:Ie,to:o});return}c(),console.log(` ${ni.default.dim("Restart your terminal or run")} domani --version ${ni.default.dim("to verify")}`),c()}catch(s){u(`Update failed: ${s instanceof Error?s.message:String(s)}`)}}var ns=D(require("fs"),1),il=D(require("path"),1),sl=D(require("os"),1);Me();var ii=D(L(),1);V();De();Os();async function rl(){let e=process.argv[1],t=e?ns.default.realpathSync(e):null,n=il.default.join(sl.default.homedir(),".domani");if(c(),console.log(` ${ii.default.bold("This will remove:")}`),t&&console.log(` ${y.dot} CLI binary: ${ii.default.dim(t)}`),console.log(` ${y.dot} Config dir: ${ii.default.dim(n)}`),c(),await Je({message:"Uninstall domani?"})!==!0){console.log(` ${ii.default.dim("Cancelled.")}`);return}for(let s of ot())s.token_in_keychain&&hi(s.name);ns.default.rmSync(n,{recursive:!0,force:!0}),t&&ns.default.unlinkSync(t),c(),console.log(` ${y.success} domani uninstalled.`),c()}G();var re=D(L(),1);V();async function al(e,t){let n=t?.json,i=t?.fields,s=e?`/api/schema?command=${encodeURIComponent(e)}`:"/api/schema",r=C(!n);r.start("Loading schema");let o=await xe(s),a=await o.json();if(o.ok||(r.stop("Failed"),u(a.error||a.message,{hint:a.hint,status:o.status,json:n,fields:i})),r.stop("Schema loaded"),n){b(a,i);return}e?gf(e,a):hf(a.commands)}function hf(e){j("Commands");let t=Object.entries(e).map(([n,i])=>[re.default.bold(re.default.cyan(n)),i.description]);J(["Command","Description"],t,[20,50]),c(),console.log(` ${re.default.dim("Run")} ${re.default.cyan("domani schema <command>")} ${re.default.dim("for full details")}`),c()}function gf(e,t){if(j(`domani ${e}`),console.log(` ${t.description}`),c(),console.log(` ${$.label("Usage:")} ${re.default.cyan(t.usage)}`),t.arguments&&Object.keys(t.arguments).length>0){c(),console.log(` ${re.default.bold("Arguments")}`);for(let[n,i]of Object.entries(t.arguments)){let s=i.required?re.default.red("*"):"",r=re.default.dim(`(${i.type}${i.variadic?", variadic":""})`);console.log(` ${re.default.cyan(n)}${s} ${r}`),i.description&&console.log(` ${re.default.dim(i.description)}`)}}if(t.options&&Object.keys(t.options).length>0){c(),console.log(` ${re.default.bold("Options")}`);for(let[n,i]of Object.entries(t.options)){let s=i.required?re.default.red("*"):"",r=re.default.dim(`(${i.type})`),o=i.choices?re.default.dim(` [${i.choices.join(", ")}]`):"";console.log(` ${re.default.cyan(`--${n}`)}${s} ${r}${o}`),console.log(` ${re.default.dim(i.description)}`)}}if(t.api)if(c(),console.log(` ${re.default.bold("API")}`),yf(t.api))ol(t.api);else for(let[n,i]of Object.entries(t.api))console.log(` ${re.default.bold(re.default.yellow(n))}`),ol(i,6);t.errors&&t.errors.length>0&&(c(),console.log(` ${re.default.bold("Errors")}`),console.log(` ${t.errors.map(n=>re.default.dim(n)).join(re.default.dim(", "))}`)),c()}function yf(e){return typeof e=="object"&&e!==null&&"method"in e&&"path"in e}function ol(e,t=4){let n=" ".repeat(t);if(console.log(`${n}${re.default.green(e.method)} ${re.default.white(e.path)}`),e.parameters&&Object.keys(e.parameters).length>0)for(let[i,s]of Object.entries(e.parameters)){let r=s.required?re.default.red("*"):"",o=[s.type];s.enum&&o.push(`enum: ${s.enum.join(", ")}`),s.minimum!==void 0&&o.push(`min: ${s.minimum}`),s.maximum!==void 0&&o.push(`max: ${s.maximum}`),s.maxItems!==void 0&&o.push(`maxItems: ${s.maxItems}`),s.items&&o.push(`items: ${s.items}`),s.in==="path"&&o.push("in: path");let a=re.default.dim(`(${o.join(", ")})`);console.log(`${n} ${re.default.cyan(i)}${r} ${a}`),s.description&&console.log(`${n} ${re.default.dim(s.description)}`)}}G();var Ge=D(L(),1);Me();V();async function dl(e){let t=C(!e.json);t.start("Loading payment method");let n=await k("/api/me"),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e.json,fields:e.fields})),e.json){t.stop(""),b(i.card?{has_payment_method:i.has_payment_method,card:i.card}:{has_payment_method:!1},e.fields);return}if(!i.has_payment_method||!i.card){t.stop("No payment method on file"),c(),console.log(` ${Ge.default.dim("Add a card with")} ${Ge.default.cyan("domani card add")}`),c();return}let{brand:s,last4:r,exp_month:o,exp_year:a}=i.card,d=`${String(o).padStart(2,"0")}/${a}`,m=s.charAt(0).toUpperCase()+s.slice(1);t.stop("Payment method loaded"),j("Payment method"),l("Card",`${Ge.default.bold(m)} \u2022\u2022\u2022\u2022 ${Ge.default.bold(r)}`),l("Expires",d),c(),console.log(` ${Ge.default.dim("Update with")} ${Ge.default.cyan("domani card add")}`),c()}async function ll(e){let t=C(!e?.json);t.start("Setting up payment session");let n=await k("/api/billing/setup",{method:"POST",body:JSON.stringify({mode:"checkout"})}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json})),i.url||(t.stop("Failed"),u("No checkout URL returned",{json:e?.json})),t.stop("Checkout ready"),e?.json){b({url:i.url},e?.fields);return}c(),console.log(` ${Ge.default.dim("Opening browser")} ${y.arrow} ${$.url(i.url)}`),c(),Ve(i.url),console.log(` ${y.info} ${Ge.default.dim("Complete payment setup in your browser.")}`),console.log(` ${Ge.default.dim(" After setup, you can purchase domains with")} ${Ge.default.cyan("domani buy")}`),c()}async function cl(e){if(!e?.yes&&!e?.json){let s=await Je({message:"Remove your saved payment method?"});if(ae(s)||!s){console.log(` ${Ge.default.dim("Cancelled.")}`);return}}let t=C(!e?.json);t.start("Removing payment method");let n=await k("/api/billing/card",{method:"DELETE"}),i=await n.json();if(n.ok||(t.stop("Failed"),u(i.error||i.message,{hint:i.hint,status:n.status,json:e?.json})),t.stop(`${y.success} Payment method removed`),e?.json){b({removed:!0},e?.fields);return}c(),console.log(` ${Ge.default.dim("Add a new card with")} ${Ge.default.cyan("domani card add")}`),c()}var Zr=D(L(),1);G();V();async function he(e,t,n,i){let s=C(!n.json);s.start(i);let r=await k(e,t),o=await r.json();return r.ok||(s.stop("Failed"),u(o.error||o.message,{hint:o.hint,status:r.status,json:n.json,fields:n.fields})),s.stop(`${y.success} Done`),o}async function ul(e,t){if(!e||e==="list"){let n=await he("/api/workspaces",void 0,t,"Loading workspaces");if(t.json)return b(n,t.fields);if(c(),j("Workspaces"),!n.workspaces.length){console.log(` ${Zr.default.dim("No workspaces yet.")}`),R("Create one:","domani workspace create --name Acme");return}J(["ID","Name","Role","Mailboxes","Members"],n.workspaces.map(i=>[i.id,i.name,i.role,String(i.mailbox_count),String(i.member_count)]),[28,28,10,10,8]),c();return}if(e==="create"){t.name||u("Workspace name required",{hint:"Usage: domani workspace create --name Acme",code:"validation_error",json:t.json});let n=await he("/api/workspaces",{method:"POST",body:JSON.stringify({name:t.name})},t,"Creating workspace");if(t.json)return b(n,t.fields);c(),j("Workspace Created"),l("ID",n.id),l("Name",n.name),c();return}if(e==="show"){t.id||u("Workspace ID required",{hint:"Usage: domani workspace show --id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}`,void 0,t,"Loading workspace");if(t.json)return b(n,t.fields);c(),j(n.name),l("Role",n.role),l("Mailboxes",n.mailboxes.length),l("Members",n.members.length),c(),J(["Email","Role","Mailbox grants"],n.members.map(i=>[i.email,i.role,String(i.mailbox_grants.length)]),[42,12,16]),c();return}if(e==="access"){if(t.id||u("Workspace ID required",{hint:"Usage: domani workspace access --id <id>",code:"validation_error",json:t.json}),!t.subject&&!t.resource&&!t.profile){let a=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access`,void 0,t,"Loading access graph");if(t.json)return b(a,t.fields);c(),j("Access Graph"),l("Principals",a.principals.length),l("Mailboxes",a.mailboxes.length),l("Groups",a.groups.length),l("Collections",a.collections.length),l("Active grants",a.grants.length),l("Pending offers",a.offers.length),c();return}(!t.subject||!t.resource||!t.profile)&&u("Subject, resource, and profile are required together",{hint:"Usage: domani workspace access --id <id> --subject human:<id> --resource mailbox:<id> --profile responder [--apply]",code:"validation_error",json:t.json});let[n,i]=t.subject.split(":",2),[s,r]=t.resource.split(":",2);(!i||!["human","agent","service","token","group"].includes(n))&&u("Invalid --subject",{hint:"Use human:<id>, agent:<id>, service:<id>, token:<id>, or group:<id>",json:t.json}),(!r||!["mailbox","collection"].includes(s))&&u("Invalid --resource",{hint:"Use mailbox:<id> or collection:<id>",json:t.json});let o=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access`,{method:"PUT",body:JSON.stringify({mode:t.apply?"apply":"plan",subject:n==="group"?{type:"group",id:i}:{type:"principal",principal:{type:n,id:i}},resource:{type:s,id:r},profile:t.profile,expected_version:t.expectedVersion?Number(t.expectedVersion):void 0})},t,t.apply?"Applying access":"Planning access");if(t.json)return b(o,t.fields);c(),j(t.apply?"Access Applied":"Access Plan"),l("Action",o.action),l("Changed",String(o.changed)),o.grant_id&&l("Grant",o.grant_id),c();return}if(e==="group"){(!t.id||!t.name)&&u("Workspace ID and group name required",{hint:"Usage: domani workspace group --id <id> --name Support --principals human:u1,agent:a1",code:"validation_error",json:t.json});let n=(t.principals||"").split(",").map(s=>s.trim()).filter(Boolean).map(s=>{let[r,o]=s.split(":",2);return o||u(`Invalid principal: ${s}`,{hint:"Use type:id",json:t.json}),{type:r,id:o,label:o}}),i=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access/groups`,{method:"PUT",body:JSON.stringify({id:t.groupId,name:t.name,principals:n})},t,"Syncing access group");if(t.json)return b(i,t.fields);c(),j("Access Group Synced"),l("ID",i.id),l("Principals",i.principal_count),c();return}if(e==="collection"){(!t.id||!t.name)&&u("Workspace ID and collection name required",{hint:"Usage: domani workspace collection --id <id> --name Admin --mailboxes mb1,mb2",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access/collections`,{method:"PUT",body:JSON.stringify({id:t.collectionId,name:t.name,mailbox_ids:t.mailboxes?.split(",").map(i=>i.trim()).filter(Boolean)??[]})},t,"Syncing mailbox collection");if(t.json)return b(n,t.fields);c(),j("Mailbox Collection Synced"),l("ID",n.id),l("Mailboxes",n.mailbox_count),c();return}if(e==="offer"){(!t.id||!t.email)&&u("Workspace ID and recipient email required",{hint:"Usage: domani workspace offer --id <id> --email person@example.com --mailboxes mb1,mb2 --profile responder",code:"validation_error",json:t.json});let n=(t.mailboxes||"").split(",").map(s=>s.trim()).filter(Boolean).map(s=>({resource:{type:"mailbox",id:s},profile:t.profile||"responder"})),i=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access/offers`,{method:"POST",body:JSON.stringify({email:t.email,grants:n,ownership_disposition:t.ownershipDisposition,creator_disposition:t.creatorDisposition,billing_disposition:t.billingDisposition})},t,"Sending access offer");if(t.json)return b(i,t.fields);c(),j("Access Offered"),l("Email",i.email),l("Expires",i.expires_at),c();return}if(e==="accept-offer"){t.token||u("Access offer token required",{hint:"Usage: domani workspace accept-offer --token <token>",code:"validation_error",json:t.json});let n=await he("/api/workspaces/access/offers/accept",{method:"POST",body:JSON.stringify({token:t.token})},t,"Accepting access offer");if(t.json)return b(n,t.fields);c(),j("Access Accepted"),l("Workspace",n.workspace_name),l("Ownership",n.ownership),c();return}if(e==="revoke-access"){(!t.id||!t.grantId)&&u("Workspace and grant IDs required",{hint:"Usage: domani workspace revoke-access --id <id> --grant-id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/access/grants/${encodeURIComponent(t.grantId)}`,{method:"DELETE",body:JSON.stringify({expected_version:t.expectedVersion?Number(t.expectedVersion):void 0})},t,"Revoking access");if(t.json)return b(n,t.fields);c(),j("Access Revoked"),l("Grant",n.grant_id),l("Version",n.version),c();return}if(e==="rename"){(!t.id||!t.name)&&u("Workspace ID and name required",{hint:"Usage: domani workspace rename --id <id> --name <name>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}`,{method:"PATCH",body:JSON.stringify({name:t.name})},t,"Renaming workspace");if(t.json)return b(n,t.fields);c(),j("Workspace Renamed"),l("ID",n.id),l("Name",n.name),c();return}if(e==="invite"){(!t.id||!t.email)&&u("Workspace ID and email required",{hint:"Usage: domani workspace invite --id <id> --email person@example.com",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/invitations`,{method:"POST",body:JSON.stringify({email:t.email,role:t.role,mailbox_ids:t.mailboxes?.split(",").map(i=>i.trim()).filter(Boolean),mailbox_role:t.mailboxRole})},t,"Sending invitation");if(t.json)return b(n,t.fields);c(),j("Invitation Sent"),l("Email",n.email),l("Role",n.role),l("Expires",n.expires_at),c();return}if(e==="accept"){t.token||u("Invitation token required",{hint:"Usage: domani workspace accept --token <token>",code:"validation_error",json:t.json});let n=await he("/api/workspaces/invitations/accept",{method:"POST",body:JSON.stringify({token:t.token})},t,"Accepting invitation");if(t.json)return b(n,t.fields);c(),j("Workspace Joined"),l("Workspace",n.workspace_name),l("Role",n.role),c();return}if(e==="revoke-invite"){(!t.id||!t.invitationId)&&u("Workspace ID and invitation ID required",{hint:"Usage: domani workspace revoke-invite --id <id> --invitation-id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/invitations/${encodeURIComponent(t.invitationId)}`,{method:"DELETE"},t,"Revoking invitation");if(t.json)return b(n,t.fields);c(),j("Invitation Revoked"),l("Invitation",n.invitation_id),c();return}if(e==="member-role"){(!t.id||!t.membershipId||!t.role)&&u("Workspace ID, membership ID, and role required",{hint:"Usage: domani workspace member-role --id <id> --membership-id <id> --role admin|member",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/members/${encodeURIComponent(t.membershipId)}`,{method:"PATCH",body:JSON.stringify({role:t.role})},t,"Updating member role");if(t.json)return b(n,t.fields);c(),j("Member Updated"),l("Membership",n.id),l("Role",n.role),c();return}if(e==="remove-member"){(!t.id||!t.membershipId)&&u("Workspace ID and membership ID required",{hint:"Usage: domani workspace remove-member --id <id> --membership-id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/members/${encodeURIComponent(t.membershipId)}`,{method:"DELETE"},t,"Removing member and revoking access");if(t.json)return b(n,t.fields);c(),j("Member Removed"),l("Membership",n.membership_id),c();return}if(e==="leave"){t.id||u("Workspace ID required",{hint:"Usage: domani workspace leave --id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/members/me`,{method:"DELETE"},t,"Leaving workspace and revoking access");if(t.json)return b(n,t.fields);c(),j("Workspace Left"),l("Workspace",n.workspace_id),c();return}if(e==="transfer"){(!t.id||!t.membershipId)&&u("Workspace ID and target membership ID required",{hint:"Usage: domani workspace transfer --id <workspace-id> --membership-id <membership-id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/ownership-transfer`,{method:"POST",body:JSON.stringify({membership_id:t.membershipId})},t,"Requesting ownership transfer");if(t.json)return b(n,t.fields);c(),j("Ownership Transfer Requested"),l("To",n.to_email),l("Expires",n.expires_at),l("Billing",n.billing),c();return}if(e==="accept-ownership"){t.token||u("Ownership transfer token required",{hint:"Usage: domani workspace accept-ownership --token <token>",code:"validation_error",json:t.json});let n=await he("/api/workspaces/ownership-transfers/accept",{method:"POST",body:JSON.stringify({token:t.token})},t,"Accepting ownership");if(t.json)return b(n,t.fields);c(),j("Ownership Transferred"),l("Workspace",n.workspace_id),l("Domains",n.domains_transferred),l("Mailboxes",n.mailboxes_transferred),l("Previous owner",n.previous_owner_role),c();return}if(e==="revoke-transfer"){(!t.id||!t.transferId)&&u("Workspace ID and transfer ID required",{hint:"Usage: domani workspace revoke-transfer --id <workspace-id> --transfer-id <transfer-id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/ownership-transfer/${encodeURIComponent(t.transferId)}`,{method:"DELETE"},t,"Revoking ownership transfer");if(t.json)return b(n,t.fields);c(),j("Ownership Transfer Revoked"),l("Transfer",n.transfer_id),c();return}if(e==="adopt-mailbox"){(!t.id||!t.mailboxId)&&u("Workspace ID and mailbox ID required",{hint:"Usage: domani workspace adopt-mailbox --id <workspace-id> --mailbox-id <mailbox-id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/mailboxes`,{method:"POST",body:JSON.stringify({mailbox_id:t.mailboxId})},t,"Adopting mailbox boundary");if(t.json)return b(n,t.fields);c(),j(n.adopted?"Mailbox Boundary Adopted":"Already in Workspace"),l("Address",n.address),l("Mailboxes",n.mailbox_ids?.length??1),c();return}if(e==="grant"){(!t.id||!t.mailboxId||!t.membershipId||!t.role)&&u("Workspace, mailbox, membership, and role required",{hint:"Usage: domani workspace grant --id <id> --mailbox-id <id> --membership-id <id> --role viewer|responder|manager",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/mailboxes/${encodeURIComponent(t.mailboxId)}/grants`,{method:"PUT",body:JSON.stringify({membership_id:t.membershipId,role:t.role})},t,"Granting mailbox access");if(t.json)return b(n,t.fields);c(),j("Mailbox Access Granted"),l("Membership",n.membership_id),l("Mailbox",n.mailbox_id),l("Role",n.role),c();return}if(e==="revoke-grant"){(!t.id||!t.mailboxId||!t.membershipId)&&u("Workspace, mailbox, and membership required",{hint:"Usage: domani workspace revoke-grant --id <id> --mailbox-id <id> --membership-id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/mailboxes/${encodeURIComponent(t.mailboxId)}/grants`,{method:"DELETE",body:JSON.stringify({membership_id:t.membershipId})},t,"Revoking mailbox access");if(t.json)return b(n,t.fields);c(),j("Mailbox Access Revoked"),l("Membership",n.membership_id),l("Mailbox",n.mailbox_id),c();return}if(e==="checkout"){(!t.id||!t.plan)&&u("Workspace ID and plan required",{hint:"Usage: domani workspace checkout --id <id> --plan mail_team",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/billing/checkout`,{method:"POST",body:JSON.stringify({plan:t.plan})},t,"Creating secure checkout");if(t.json)return b(n,t.fields);c(),j("Workspace Checkout"),l("Plan",n.plan),l("URL",n.url),c(),n.url&&t.open!==!1&&(console.log(` ${Zr.default.dim("Opening browser")} ${y.arrow} ${$.url(n.url)}`),Ve(n.url));return}if(e==="cancel"){t.id||u("Workspace ID required",{hint:"Usage: domani workspace cancel --id <id>",code:"validation_error",json:t.json});let n=await he(`/api/workspaces/${encodeURIComponent(t.id)}/billing/cancel`,{method:"POST"},t,"Scheduling cancellation");if(t.json)return b(n,t.fields);c(),j("Cancellation Scheduled"),l("Message",n.message),n.cancel_at&&l("Cancels",n.cancel_at),c();return}u(`Unknown action: ${e}`,{hint:"Actions: list, create, show, access, group, collection, offer, accept-offer, revoke-access, rename, invite, accept, revoke-invite, member-role, remove-member, leave, transfer, accept-ownership, revoke-transfer, adopt-mailbox, grant, revoke-grant, checkout, cancel",code:"validation_error",json:t.json,fields:t.fields})}var si=D(L(),1);G();var is=D(require("node:crypto"),1),Rn=D(require("node:fs"),1),ml=D(require("node:os"),1),ss=D(require("node:path"),1),bf=process.env.DOMANI_CONFIG_DIR||ss.default.join(ml.default.homedir(),".domani"),fl=ss.default.join(bf,"mutations");function wf(e){return ss.default.join(fl,`${is.default.createHash("sha256").update(e).digest("hex")}.json`)}function _t(e,t,n){let i=wf(e),s=is.default.createHash("sha256").update(JSON.stringify(t)).digest("hex");if(!n)try{let o=JSON.parse(Rn.default.readFileSync(i,"utf8"));if(o.key&&o.fingerprint===s)return{key:o.key,complete:()=>{try{Rn.default.unlinkSync(i)}catch{}}}}catch{}let r=n||`cli-${is.default.randomUUID()}`;return Rn.default.mkdirSync(fl,{recursive:!0,mode:448}),Rn.default.writeFileSync(i,JSON.stringify({key:r,fingerprint:s}),{mode:384}),{key:r,complete:()=>{try{Rn.default.unlinkSync(i)}catch{}}}}V();function pl(e){if(e.clearUpstreamHeaders)return{};let t={};for(let[n,i]of[["Authorization",e.upstreamAuthorizationEnv],["X-Api-Key",e.upstreamApiKeyEnv]]){if(!i)continue;let s=process.env[i];s||u(`Environment variable ${i} is empty`,{code:"validation_error",json:e.json}),t[n]=s}return Object.keys(t).length?t:void 0}async function un(e,t){let n=await e.json();return e.ok||u(n.error||n.message,{hint:n.hint,status:e.status,json:t.json,fields:t.fields}),n}function rs(e,t){if(t.json)return b(e,t.fields);let n=e.http_route||e;c(),j("HTTP Route"),l("ID",n.id),l("URL",n.url),l("Upstream",n.upstream),l("Status",n.status),l("Expires",n.expires_at),l("Browser mode",n.browser_mode||"stateless"),n.upstream_verification?.secret&&(l("Verification secret",si.default.yellow(n.upstream_verification.secret)),console.log(si.default.dim(" Save this secret now. It will not be shown again after this receipt."))),c()}function $f(e){let t=new URLSearchParams;e.domain&&t.set("domain",e.domain),e.hostname&&t.set("hostname",e.hostname),e.status&&t.set("status",e.status),e.limit&&t.set("limit",e.limit),e.cursor&&t.set("cursor",e.cursor);let n=t.toString();return n?`?${n}`:""}async function hl(e,t,n){if(!e||e==="list"){let i=await un(await k(`/api/http-routes${$f(n)}`),n);if(n.json)return b(i,n.fields);c(),j("HTTP Routes");for(let s of i.http_routes)console.log(` ${si.default.dim(s.id)} ${s.hostname} ${s.status} ${s.upstream}`);c(),i.next_cursor&&(console.log(` ${si.default.dim(`More: --cursor ${i.next_cursor}`)}`),c());return}if(e==="create"){n.upstream||u("--upstream is required",{code:"validation_error",json:n.json});let i=pl(n),s={...n.hostname?{hostname:n.hostname}:{},upstream:n.upstream,...n.expiresIn?{expires_in:Number(n.expiresIn)}:{},...n.hostHeader?{host_header:n.hostHeader}:{},...n.upstreamVerification?{upstream_verification:n.upstreamVerification}:{},...i?{upstream_headers:i}:{}},r=_t(`route:create:${n.hostname||"auto"}`,s,n.idempotencyKey),o=C(!n.json);o.start("Creating HTTP route");let a=await un(await k("/api/http-routes",{method:"POST",headers:{"Idempotency-Key":r.key},body:JSON.stringify(s)}),n);return r.complete(),o.stop(`${y.success} HTTP route created`),rs(a,n)}if(t||u("Route ID is required",{hint:`Usage: domani route ${e} <id>`,code:"validation_error",json:n.json}),e==="get")return rs(await un(await k(`/api/http-routes/${encodeURIComponent(t)}`),n),n);if(e==="delete"){let i=await k(`/api/http-routes/${encodeURIComponent(t)}`,{method:"DELETE"});if(i.ok||await un(i,n),n.json)return b({deleted:!0,id:t},n.fields);console.log(`${y.success} HTTP route deleted`);return}if(e==="refresh"){n.expiresIn||u("--expires-in is required",{code:"validation_error",json:n.json});let i={expires_in:Number(n.expiresIn)},s=_t(`route:refresh:${t}`,i,n.idempotencyKey),r=await un(await k(`/api/http-routes/${encodeURIComponent(t)}`,{method:"PATCH",headers:{"Idempotency-Key":s.key},body:JSON.stringify(i)}),n);return s.complete(),rs(r,n)}if(e==="rotate-verification"){let i=_t(`route:rotate-verification:${t}`,{},n.idempotencyKey),s=await un(await k(`/api/http-routes/${encodeURIComponent(t)}/upstream-verification/rotate`,{method:"POST",headers:{"Idempotency-Key":i.key}}),n);return i.complete(),n.json?b(s,n.fields):rs(s,n)}if(e==="rotate-headers"){let i=pl(n);i||u("Provide an upstream header environment variable or --clear-upstream-headers",{code:"validation_error",json:n.json});let s=_t(`route:rotate-headers:${t}`,{upstream_headers:i},n.idempotencyKey),r=await un(await k(`/api/http-routes/${encodeURIComponent(t)}/upstream-headers`,{method:"PUT",headers:{"Idempotency-Key":s.key},body:JSON.stringify({upstream_headers:i})}),n);if(s.complete(),n.json)return b(r,n.fields);console.log(`${y.success} Upstream headers replaced: ${r.upstream_header_names.join(", ")||"none"}`);return}u(`Unknown action: ${e}`,{hint:"Actions: create, list, get, refresh, rotate-verification, rotate-headers, delete",code:"validation_error",json:n.json})}var ee=D(L(),1),bl=require("node:fs");ui();G();V();var eo="mailzero-personal-ai.v1",Q=class extends Error{constructor(n,i){super(n);this.hint=i;this.name="AssistantUsageError"}},vf={choose:"choose",instruct:"instruct","take-over":"take_over",snooze:"snooze",ignore:"ignore",correct:"correct",approve:"approve",reject:"reject",tag:"tag"},_f=["today","settings","set","preview","backfill","retry","item","choose","instruct","snooze","ignore","take-over","correct","approve","reject","tag","plan","activity","export","delete","brief","facts","sender","task","lease","release","effects","escalate","report","rules","approvals","suggestions","metrics"];function Qr(e,t,n){if(!e)throw new Q(`${t} is required`,n);try{return JSON.parse(e)}catch{throw new Q(`${t} must be valid JSON`,n)}}function os(e){return(e||"").split(",").map(t=>t.trim()).filter(Boolean)}function gl(e){return(e||"").split(",").map(t=>t.trim()).filter(Boolean)}function mn(e,t,n){let i=Number(e);if(!Number.isInteger(i)||i<n)throw new Q(`${t} must be an integer of at least ${n}`);return i}function kf(e,t,n){let i=e||"today";switch(i){case"today":{let s=new URLSearchParams;n.category&&s.set("category",n.category.trim().toLowerCase()),n.tag&&s.set("tag",n.tag.trim().toLowerCase());let r=s.toString();return{method:"GET",path:r?`/api/assistant/today?${r}`:"/api/assistant/today"}}case"settings":return{method:"GET",path:"/api/assistant/settings"};case"set":{let s={};if(n.enable&&n.disable)throw new Q("Use either --enable or --disable");if(n.pause&&n.resume)throw new Q("Use either --pause or --resume");if(n.enable&&(s.enabled=!0),n.disable&&(s.enabled=!1),n.shadow!==void 0&&(s.shadow_enabled=n.shadow),n.pause&&(s.paused=!0),n.resume&&(s.paused=!1),n.none?s.mailbox_ids=[]:n.mailboxes!==void 0&&(s.mailbox_ids=gl(n.mailboxes)),n.days!==void 0&&(s.history_window_days=mn(n.days,"--days",1)),n.attachmentVision!==void 0){if(!["on","off"].includes(n.attachmentVision))throw new Q("--attachment-vision must be on or off");s.attachment_vision=n.attachmentVision==="on"}if(!Object.keys(s).length)throw new Q("Provide at least one setting","Options: --enable, --disable, --shadow, --no-shadow, --pause, --resume, --mailboxes <ids>, --none, --days <n>, --attachment-vision <on|off>");return{method:"PUT",path:"/api/assistant/settings",body:s}}case"preview":{if(!n.consent)throw new Q("--consent is required to start the assistant",`Consent means Domani may read the selected mailboxes and send bounded, minimized message content to the approved private model route (version ${eo}). Nothing is ever sent on your behalf. You can pause or delete derived data at any time.`);let s=gl(n.mailboxes);if(!s.length)throw new Q("--mailboxes is required","Pass owned mailbox IDs, comma-separated. List them with: domani assistant settings");return{method:"POST",path:"/api/assistant/preview",body:{mailbox_ids:s,history_window_days:n.days===void 0?30:mn(n.days,"--days",1),consent:!0,consent_version:eo}}}case"backfill":return{method:"GET",path:"/api/assistant/backfill"};case"retry":return{method:"POST",path:"/api/assistant/backfill",idempotency:"assistant:retry"};case"item":if(!t)throw new Q("Work item ID is required","Usage: domani assistant item <id>");return{method:"GET",path:`/api/assistant/work-items/${encodeURIComponent(t)}`};case"brief":{if(t)return{method:"GET",path:`/api/assistant/work-items/${encodeURIComponent(t)}/brief`};if(!n.correspondent)throw new Q("Work item ID or --correspondent is required","Usage: domani assistant brief <id> | domani assistant brief --correspondent ada@example.com [--mailbox hi@myapp.dev]");let s=new URLSearchParams({correspondent:n.correspondent});return n.mailbox&&s.set("mailbox",n.mailbox),{method:"GET",path:`/api/assistant/brief?${s}`}}case"facts":if(!t)throw new Q("Work item ID is required","Usage: domani assistant facts <id>");return{method:"GET",path:`/api/assistant/work-items/${encodeURIComponent(t)}/facts`};case"sender":if(!t)throw new Q("Work item ID is required","Usage: domani assistant sender <id>");return{method:"GET",path:`/api/assistant/work-items/${encodeURIComponent(t)}/sender`};case"plan":if(!t)throw new Q("Action plan ID is required","Usage: domani assistant plan <id>");return{method:"GET",path:`/api/assistant/action-plans/${encodeURIComponent(t)}`};case"activity":return{method:"GET",path:`/api/assistant/activity${n.limit!==void 0?`?limit=${mn(n.limit,"--limit",1)}`:""}`};case"rules":return{method:"GET",path:"/api/assistant/rules"};case"approvals":return{method:"GET",path:"/api/assistant/approvals"};case"suggestions":return{method:"GET",path:"/api/assistant/suggestions"};case"metrics":return{method:"GET",path:`/api/assistant/metrics${n.days!==void 0?`?window_days=${mn(n.days,"--days",1)}`:""}`};case"export":return{method:"GET",path:"/api/assistant/data"};case"delete":if(!n.yes)throw new Q("Deleting derived assistant data requires --yes","This removes analyses, Decisions, plans, receipts, imports, and settings. Source mail is never touched.");return{method:"DELETE",path:"/api/assistant/data"};case"task":if(!t)throw new Q("Task ID is required","Usage: domani assistant task <work item id>");return{method:"GET",path:`/api/assistant/tasks/${encodeURIComponent(t)}`};case"lease":{if(!t)throw new Q("Task ID is required","Usage: domani assistant lease <id> [--ttl <seconds>]");let s={};return n.ttl!==void 0&&(s.ttl_seconds=mn(n.ttl,"--ttl",30)),{method:"POST",path:`/api/assistant/tasks/${encodeURIComponent(t)}/lease`,body:s}}case"release":if(!t)throw new Q("Task ID is required","Usage: domani assistant release <id>");return{method:"DELETE",path:`/api/assistant/tasks/${encodeURIComponent(t)}/lease`};case"effects":{if(!t)throw new Q("Task ID is required","Usage: domani assistant effects <id> --effects '<json array>'");let s=Qr(n.effects,"--effects",`A JSON array of effects, for example: --effects '[{"kind":"label","mailbox_id":"mbx_1","add":["finance"]}]'`);if(!Array.isArray(s)||!s.length)throw new Q("--effects must be a non-empty JSON array","Kinds: reply, forward, label, snooze, resolve, note, request");let r={effects:s};return n.text&&(r.note=n.text),{method:"POST",path:`/api/assistant/tasks/${encodeURIComponent(t)}/effects`,body:r,idempotency:`assistant:effects:${t}`}}case"escalate":{if(!t)throw new Q("Task ID is required","Usage: domani assistant escalate <id> --question '<text>' [--options '<json>'] [--evidence <refs>]");if(!n.question)throw new Q("--question is required","What the owner must decide, with the evidence in --evidence");let s={question:n.question};n.options&&(s.options=Qr(n.options,"--options","A JSON array of { key, label, outcome }"));let r=os(n.evidence);return r.length&&(s.evidence_refs=r),{method:"POST",path:`/api/assistant/tasks/${encodeURIComponent(t)}/escalate`,body:s}}case"report":{if(!t)throw new Q("Task ID is required","Usage: domani assistant report <id> --outcome done|blocked|handed_back --summary '<text>' [--claims '<json>'] [--evidence <refs>]");if(!n.outcome||!["done","blocked","handed_back"].includes(n.outcome))throw new Q("--outcome must be done, blocked or handed_back");if(!n.summary)throw new Q("--summary is required","What was done and how it ended, in a few lines");let s={outcome:n.outcome,summary:n.summary};n.claims&&(s.claims=Qr(n.claims,"--claims","A JSON array of { kind, ref } the platform reconciles with its receipts"));let r=os(n.evidence);return r.length&&(s.evidence_refs=r),{method:"POST",path:`/api/assistant/tasks/${encodeURIComponent(t)}/report`,body:s}}case"choose":case"instruct":case"snooze":case"ignore":case"take-over":case"correct":case"approve":case"reject":case"tag":{if(!t)throw new Q("Work item ID is required",`Usage: domani assistant ${i} <id> --item-version <work_item_version>`);if(n.itemVersion===void 0)throw new Q("--item-version is required","Pass the work_item_version shown by: domani assistant item <id>");let s=vf[i],r={type:s,work_item_version:mn(n.itemVersion,"--item-version",1)};if(s==="ignore"&&n.scope){if(!["item","sender","sender_domain","situation"].includes(n.scope))throw new Q("--scope must be item, sender, sender_domain or situation","Example: domani assistant ignore <id> --item-version 3 --scope sender");r.scope=n.scope}if(s==="choose"){if(!n.option||!n.decision||n.decisionVersion===void 0)throw new Q("--option, --decision and --decision-version are required","They come from the Decision shown by: domani assistant item <id>");r.decision_id=n.decision,r.decision_version=mn(n.decisionVersion,"--decision-version",1),r.option_id=n.option}if(s==="instruct"){if(!n.text)throw new Q("--text is required","The instruction the assistant should follow when preparing the draft");r.instruction=n.text}if(s==="snooze"){if(!n.until)throw new Q("--until is required","ISO 8601 date-time, for example 2026-09-03T09:00:00Z");r.until=n.until}if(s==="correct"){if(!n.field||!n.text)throw new Q("--field and --text are required","Name the analysis field to correct and the correct value");r.field=n.field,r.correction=n.text}if(s==="tag"){let o=os(n.add),a=os(n.remove);if(!o.length&&!a.length)throw new Q("--add or --remove is required","Example: domani assistant tag <id> --item-version 3 --add lumenworks --remove draft");o.length&&(r.add=o),a.length&&(r.remove=a)}if(s==="approve"||s==="reject"){if(!n.plan)throw new Q("--plan is required","The waiting action plan shown by: domani assistant task <id>");r.plan_id=n.plan,s==="reject"&&n.text&&(r.reason=n.text)}return{method:"POST",path:`/api/assistant/work-items/${encodeURIComponent(t)}/interactions`,body:r,idempotency:`assistant:${s}:${t}`}}default:throw new Q(`Unknown action: ${i}`,`Actions: ${_f.join(", ")}`)}}async function xf(e,t){let n=await e.json();if(e.ok)return n;n.code==="NOT_AVAILABLE"&&u(`The ${Dt.mailProductName} assistant is in private preview`,{hint:"It is enabled per account during the private beta. Ask for access at https://domani.run/support or wait for general availability.",code:"not_available",status:e.status,json:t.json,fields:t.fields}),n.code==="INSUFFICIENT_SCOPE"&&u(n.error||"Missing assistant scope",{hint:"This token needs the assistant:read scope for reads and assistant:write for changes. Create one with: domani tokens create --scopes assistant:read,assistant:write",code:"insufficient_scope",status:e.status,json:t.json,fields:t.fields}),u(n.error||n.message,{hint:n.hint,status:e.status,json:t.json,fields:t.fields})}function jf(e){let t=e.sender?.name||e.sender?.address?.split("@")[0]||e.mailbox?.name||e.mailbox?.address||"",n=e.recurrence?.count&&e.recurrence.count>1?ee.default.dim(`x${e.recurrence.count}`):"",i=[e.category?e.category.replace(/_/g," "):"",...(e.tags??[]).map(s=>`#${s}`)].filter(Boolean).join(" ");return[ee.default.dim(e.id),t,i,`${(e.title||e.summary||"").slice(0,60)} ${n}`.trim(),e.ask?e.ask.slice(0,50):e.attention?.deadline||""]}function Sf(e,t){if(t.json)return b(e,t.fields);c(),j("Today");let n=[["now","Now"],["needs_you","Needs you"],["waiting","Waiting"],["upcoming","Upcoming"],["handled","Handled"]],i=0;for(let[a,d]of n){let m=e.sections&&typeof e.sections=="object"?e.sections:e,f=Array.isArray(m[a])?m[a]:[];f.length&&(i+=f.length,console.log(` ${ee.default.bold(d)} ${ee.default.dim(`(${f.length})`)}`),J(["ID","Who","Kind","Summary","Deadline"],f.map(jf)),c())}i||console.log(ee.default.dim(t.tag?` Nothing tagged ${t.tag} right now.`:t.category?` Nothing of the kind ${t.category} right now.`:" Nothing needs you right now."));let s=e.categories&&typeof e.categories=="object"?Object.entries(e.categories).sort((a,d)=>d[1]-a[1]):[];s.length>1&&console.log(ee.default.dim(` Kinds: ${s.map(([a,d])=>`${a} ${d}`).join(", ")} (narrow with --category)`));let r=e.tags&&typeof e.tags=="object"?Object.entries(e.tags).sort((a,d)=>d[1]-a[1]):[];r.length&&console.log(ee.default.dim(` Tags: ${r.map(([a,d])=>`${a} ${d}`).join(", ")} (narrow with --tag)`));let o=typeof e.as_of=="string"?e.as_of:void 0;o&&console.log(ee.default.dim(` As of ${o}`)),c()}function Of(e,t){if(t.json)return b(e,t.fields);let n=e.brief??e;if(e.correspondent&&!e.brief){c(),j(`Brief for ${e.correspondent}`),console.log(` ${ee.default.dim("Nothing analysed from this person yet.")}`);for(let i of e.recent_mail||[])l(i.received_at.slice(0,10),`${i.subject||""} (${i.mailbox})`);return}c(),j(n.title||"Brief"),n.situation&&l("Status",`${n.situation.status||""}${n.situation.attention?.level?` \xB7 ${n.situation.attention.level}`:""}${n.situation.occurrences&&n.situation.occurrences>1?` \xB7 ${n.situation.occurrences} messages`:""}`),n.situation?.sender?.address&&l("With",`${n.situation.sender.name?`${n.situation.sender.name} `:""}<${n.situation.sender.address}>`),n.summary&&l("Summary",n.summary),n.ask&&l("Ask",n.ask);for(let i of n.story||[])l(i.occurred_at.slice(0,10),`${i.title}${i.analysed?"":ee.default.dim(" (not analysed)")}`);for(let i of n.facts||[])l("Fact",`${i.subject||""} ${i.predicate||""} ${i.value?.value??i.object??""}${i.value?.currency?` ${i.value.currency}`:""}`.trim());for(let i of n.awaiting||[])l(i.overdue?ee.default.red("Awaited"):"Awaited",`${i.who}: ${i.what} (since ${i.since.slice(0,10)})`);for(let i of n.commitments||[])l(i.overdue?ee.default.red("Promised"):"Promised",`${i.who}: ${i.what}`);for(let i of(n.settled||[]).slice(0,5))l("Settled",`${i.what} (${i.status}, ${i.at.slice(0,10)})`);n.decision?.question&&l("Decision",`${n.decision.question} ${(n.decision.options||[]).map(i=>`${i.recommended?"\u2605 ":""}${i.label}`).join(" / ")}`),n.suggested_next&&l("Next",`${n.suggested_next.action} ${ee.default.dim(`(${n.suggested_next.reason})`)}`),e.related&&e.related.length&&l("Also",`${e.related.length} other item(s) from this person`)}function Cf(e,t){if(t.json)return b(e,t.fields);let n=e;c(),j(n.sender?`${n.sender.name?`${n.sender.name} `:""}<${n.sender.address}>`:"Sender"),n.organisation?(l("Organisation",`${n.organisation.name||n.sender?.domain||""}${n.organisation.legal_name&&n.organisation.legal_name!==n.organisation.name?` (${n.organisation.legal_name})`:""}${n.organisation.fresh?"":ee.default.dim(" (profile ageing)")}`),n.organisation.pitch&&l("About",n.organisation.pitch),n.organisation.registered_at&&l("Domain since",n.organisation.registered_at.slice(0,10)),l("Mail",`${n.organisation.mail.provider||"unknown provider"} \xB7 spf ${n.organisation.mail.spf===null?"?":n.organisation.mail.spf?"yes":"no"} \xB7 dmarc ${n.organisation.mail.dmarc}`)):n.sender?.shared_domain?l("Organisation",ee.default.dim(`${n.sender.domain} is a shared mail domain`)):n.sender?.domain&&l("Organisation",ee.default.dim(`${n.sender.domain} not analysed yet`));let i=n.relationship;if(i){let s=i.first_received_at&&i.last_received_at?` between ${i.first_received_at.slice(0,10)} and ${i.last_received_at.slice(0,10)}`:"";l("Received",i.received?`${i.received_capped?"50+":i.received} message(s)${s}`:"nothing before this");for(let r of i.matters.slice(0,5))l(r.last_seen_at.slice(0,10),`${r.title} ${ee.default.dim(`(${r.status}, ${r.id})`)}`);i.organisation?.matters.length&&l("Colleagues",`${i.organisation.other_senders.join(", ")}: ${i.organisation.matters.slice(0,3).map(r=>r.title).join(" / ")}`)}for(let s of n.participants||[])l(s.roles.join("+"),`${s.name?`${s.name} `:""}<${s.address}>${s.messages>1?ee.default.dim(` \xD7${s.messages}`):""}${s.same_organisation?"":ee.default.dim(" (outside)")}`)}function yl(e,t){if(t.json)return b(e,t.fields);let n=e.work_item||e;if(c(),j("Work item"),l("ID",n.id),l("Version",String(n.version??"")),l("Status",n.status||""),l("Mailbox",n.mailbox?.name?`${n.mailbox.name} <${n.mailbox.address||""}>`:n.mailbox?.address||""),n.title&&l("Title",n.title),n.sender?.address&&l("From",`${n.sender.name?`${n.sender.name} `:""}<${n.sender.address}>${n.sender.kind&&n.sender.kind!=="human"?` (${n.sender.kind})`:""}`),n.ask&&l("Ask",n.ask),n.recurrence?.count&&n.recurrence.count>1&&l("Recurrence",`${n.recurrence.count} messages since ${(n.recurrence.first_seen_at||"").slice(0,10)}`),l("Summary",n.summary||""),n.attention?.reason&&l("Why",n.attention.reason),n.attention?.deadline&&l("Deadline",n.attention.deadline),n.source?.event_id&&l("Source",`${n.source.type||"mail"} ${n.source.event_id}`),n.decision?.options?.length){c(),console.log(` ${ee.default.bold("Decision")} ${ee.default.dim(`${n.decision.id} v${n.decision.version??1}`)}`);for(let i of n.decision.options)console.log(` ${ee.default.dim(i.id)} ${i.label}${i.recommended?ee.default.green(" recommended"):""}`);console.log(ee.default.dim(` Choose with: domani assistant choose ${n.id} --version ${n.version??1} --decision ${n.decision.id} --decision-version ${n.decision.version??1} --option <id>`))}n.plan?.id&&l("Plan",`${n.plan.id} (preview with: domani assistant plan ${n.plan.id})`),c()}function Rf(e,t){if(t.json)return b(e,t.fields);c(),j(`${Dt.mailProductName} assistant`),l("Enabled",e.enabled?"yes":"no"),l("Shadow",e.shadow_enabled?"yes":"no"),l("Paused",e.paused?"yes":"no"),l("History window",`${e.history_window_days} days`),l("Privacy route",String(e.privacy_route||"")),l("Consent",e.consent?.accepted_version?`${e.consent.accepted_version} at ${e.consent.accepted_at}`:`none (required: ${e.consent?.required_version||eo})`),c();let n=new Set(e.mailbox_ids||[]),i=e.mailboxes||[];i.length&&J(["ID","Address","AI"],i.map(s=>[ee.default.dim(s.id),s.address,n.has(s.id)?ee.default.green("on"):ee.default.dim("off")])),c()}function If(e,t){if(t.json)return b(e,t.fields);let n=e.backfill;if(c(),j("History import"),!n){console.log(ee.default.dim(" No import has run yet.")),c();return}l("Status",`${n.status} (${n.phase})`),l("Progress",`${n.processed}/${n.total}${n.percent===null||n.percent===void 0?"":` (${n.percent}%)`}`),l("Failed",String(n.failed??0)),l("Paused",n.paused?"yes":"no"),n.estimated_completion_at&&l("ETA",n.estimated_completion_at),n.can_close_app&&console.log(ee.default.dim(" The import continues in the background.")),c()}function Af(e,t){if(t.json)return b(e,t.fields);let n=e.action_plan||e.plan||e;c(),j("Action preview"),l("ID",n.id),l("Status",n.status||""),n.expires_at&&l("Expires",n.expires_at);for(let i of n.effects||[])c(),console.log(` ${ee.default.bold(i.kind||"effect")} ${ee.default.dim(`mailbox ${i.mailbox_id||""}`)}${i.reply_to_message_id?ee.default.dim(` in reply to ${i.reply_to_message_id}`):""}`),i.body&&console.log(`
|
|
208
208
|
${String(i.body).split(`
|
|
209
209
|
`).map(s=>` ${s}`).join(`
|
|
210
210
|
`)}
|
|
211
|
-
`);console.log(ee.default.dim(` Nothing is sent by this command. Send through the reply endpoint with assistant_plan_id=${n.id} or from the app.`)),c()}function Tf(e,t){if(t.json)return b(e,t.fields);let n=e.events||[];c(),
|
|
212
|
-
`;if(n.out){if((0,bl.writeFileSync)(n.out,p,"utf8"),n.json)return b({exported:!0,path:n.out},n.fields);console.log(`${y.success} Derived assistant data exported to ${n.out}`);return}process.stdout.write(p);return}case"delete":if(n.json)return b(f,n.fields);console.log(`${y.success} Derived assistant data deleted. Source mail is untouched.`);return;default:if(n.json)return b(f,n.fields);if(s==="set"||s==="preview"||s==="retry"){s==="preview"&&console.log(ee.default.dim(` Import ${f.preview?.backfill_id||""} runs in the background. Follow it with: domani assistant backfill`)),s==="retry"&&console.log(` Requeued ${f.retried??f.requeued??0} messages`),s==="set"&&console.log(` enabled=${f.enabled?"yes":"no"} shadow=${f.shadow_enabled?"yes":"no"} paused=${f.paused?"yes":"no"} mailboxes=${(f.mailbox_ids||[]).length}`);return}return f.work_item?yl(f,n):b(f,n.fields)}}G();var
|
|
213
|
-
${Jt.default.bold(a==="gmail"?"Gmail":a==="outlook"?"Outlook":"Any provider")}`),d.forEach((m,f)=>console.log(` ${f+1}. ${m}`));de(`Then: domani mailbox verify ${r.address} sends a probe; domani mailbox connector ${r.address} shows the confirmation code and the status.`);return}if(e==="connect"){if(n.json&&!n.wait)return b(r,n.fields);if(
|
|
211
|
+
`);console.log(ee.default.dim(` Nothing is sent by this command. Send through the reply endpoint with assistant_plan_id=${n.id} or from the app.`)),c()}function Tf(e,t){if(t.json)return b(e,t.fields);let n=e.events||[];c(),j("Assistant activity"),n.length?J(["When","Kind","Action","Work item"],n.map(i=>[i.occurred_at||"",i.kind||"",i.action||i.type||"",ee.default.dim(i.work_item?.id||i.work_item_id||"")])):console.log(ee.default.dim(" No activity yet.")),c()}async function wl(e,t,n){let i;try{i=kf(e,t,n)}catch(p){throw p instanceof Q&&u(p.message,{hint:p.hint,code:"validation_error",json:n.json}),p}let s=e||"today",r={},o;i.idempotency&&(o=_t(i.idempotency,i.body||{},n.idempotencyKey),r["Idempotency-Key"]=o.key,i.body&&i.path.endsWith("/interactions")&&(i.body.idempotency_key=o.key));let a={set:"Updating assistant settings",preview:"Recording consent and starting the history import",retry:"Requeuing failed messages",delete:"Deleting derived assistant data"}[s]||(i.method!=="GET"?"Recording your decision":void 0),d=C(!n.json&&!!a);a&&d.start(a);let m=await k(i.path,{method:i.method,headers:r,...i.body?{body:JSON.stringify(i.body)}:{}}),f=await xf(m,n);switch(o?.complete(),a&&d.stop(`${y.success} Done`),s){case"today":return Sf(f,n);case"settings":return Rf(f,n);case"backfill":return If(f,n);case"item":return yl(f,n);case"brief":return Of(f,n);case"facts":return b(f,n.fields);case"sender":return Cf(f,n);case"plan":return Af(f,n);case"activity":return Tf(f,n);case"export":{let p=`${JSON.stringify(f,null,2)}
|
|
212
|
+
`;if(n.out){if((0,bl.writeFileSync)(n.out,p,"utf8"),n.json)return b({exported:!0,path:n.out},n.fields);console.log(`${y.success} Derived assistant data exported to ${n.out}`);return}process.stdout.write(p);return}case"delete":if(n.json)return b(f,n.fields);console.log(`${y.success} Derived assistant data deleted. Source mail is untouched.`);return;default:if(n.json)return b(f,n.fields);if(s==="set"||s==="preview"||s==="retry"){s==="preview"&&console.log(ee.default.dim(` Import ${f.preview?.backfill_id||""} runs in the background. Follow it with: domani assistant backfill`)),s==="retry"&&console.log(` Requeued ${f.retried??f.requeued??0} messages`),s==="set"&&console.log(` enabled=${f.enabled?"yes":"no"} shadow=${f.shadow_enabled?"yes":"no"} paused=${f.paused?"yes":"no"} mailboxes=${(f.mailbox_ids||[]).length}`);return}return f.work_item?yl(f,n):b(f,n.fields)}}G();var as=D(L(),1);V();var Ef=["list","token","tokens","revoke-token"],fn=class extends Error{constructor(n,i){super(n);this.hint=i;this.name="AgentsUsageError"}};function Pf(e,t,n){switch(e||"list"){case"list":return{method:"GET",path:"/api/agents/identity"};case"token":{if(!t)throw new fn("Agent handle is required",'Usage: domani agents token <slug> [--name "Dave on the pod"] [--mailboxes mb_1,mb_2]');let i=(n.mailboxes||"").split(",").map(s=>s.trim()).filter(Boolean);return{method:"POST",path:`/api/agents/identity/${encodeURIComponent(t)}/tokens`,body:{...n.name?{name:n.name}:{},...i.length?{mailbox_ids:i}:{}}}}case"tokens":if(!t)throw new fn("Agent handle is required","Usage: domani agents tokens <slug>");return{method:"GET",path:`/api/agents/identity/${encodeURIComponent(t)}/tokens`};case"revoke-token":if(!t||!n.tokenId)throw new fn("Agent handle and --token-id are required","Usage: domani agents revoke-token <slug> --token-id <id>");return{method:"DELETE",path:`/api/agents/identity/${encodeURIComponent(t)}/tokens/${encodeURIComponent(n.tokenId)}`};default:throw new fn(`Unknown action: ${e}`,`Actions: ${Ef.join(", ")}`)}}async function $l(e,t,n){let i;try{i=Pf(e,t,n)}catch(o){if(o instanceof fn)return u(o.message,{hint:o.hint,code:"validation_error",json:n.json,fields:n.fields});throw o}let s=await k(i.path,{method:i.method,...i.body?{headers:{"Content-Type":"application/json"},body:JSON.stringify(i.body)}:{}}),r=await s.json().catch(()=>({}));if(!s.ok)return u(r.error||r.message||"Request failed",{hint:r.hint,status:s.status,json:n.json,fields:n.fields});if(n.json)return b(r,n.fields);switch(e||"list"){case"list":{let o=r.identities||r.items||[];if(j("Agent identities"),!o.length){console.log(` ${as.default.dim("No agent identity yet. Claim one: domani agents claim is on the web at /agents")}`);return}J(["Handle","Name","Email"],o.map(a=>[a.slug,a.name||"",a.email||""]),[24,30,40]);return}case"token":{j("Agent API key"),l("Key",r.key||r.token||""),r.scopes&&l("Scopes",r.scopes.join(", ")),r.mailbox_ids?.length&&l("Mailboxes",r.mailbox_ids.join(", ")),de("Shown once. The key sees only this agent's mailboxes and the items handed to it.");return}case"tokens":{let o=r.tokens||[];if(j("Agent API keys"),!o.length){console.log(` ${as.default.dim("No key yet: domani agents token <slug>")}`);return}J(["ID","Name","Scopes","Last used"],o.map(a=>[a.id,a.name||"",(a.scopes||[]).join(","),a.last_used_at||"never"]),[28,24,40,20]);return}case"revoke-token":console.log(`${as.default.green("\u2713")} Token revoked`);return}}G();var Jt=D(L(),1);V();var Df=["providers","connect","connector","import","verify","disconnect"],rt=class extends Error{constructor(n,i){super(n);this.hint=i;this.name="MailboxUsageError"}};function Nf(e,t,n){switch(e){case"providers":return{path:"/api/emails/connect/providers",method:"GET"};case"connect":{if(t==="forwarding"){if(!n.address)throw new rt("--address is required.","domani mailbox connect forwarding --address someone@gmail.com");return{path:"/api/emails/connect/forwarding",method:"POST",body:{address:n.address,...n.workspace?{workspace_id:n.workspace}:{}}}}let i=t??"gmail";if(i!=="gmail"&&i!=="outlook")throw new rt(`Unknown provider "${t}".`,"gmail or outlook (the APIs), or forwarding (a rule at any provider).");if(n.since&&n.window)throw new rt("Use --since or --window, not both.");return{path:`/api/emails/connect/${i}`,method:"POST",body:{...n.since?{since:n.since}:{},...n.window?{window:n.window}:{},...n.workspace?{workspace_id:n.workspace}:{}}}}case"connector":if(!t)throw new rt("Address required.","domani mailbox connector someone@gmail.com");return{path:`/api/emails/${encodeURIComponent(t.toLowerCase())}/connector`,method:"GET"};case"import":if(!t)throw new rt("Address required.","domani mailbox import someone@gmail.com --since 2026-06-01");if(!n.since)throw new rt("--since is required.","The date the import should reach back to, for example --since 2026-06-01.");return{path:`/api/emails/${encodeURIComponent(t.toLowerCase())}/import`,method:"POST",body:{since:n.since}};case"verify":if(!t)throw new rt("Address required.","domani mailbox verify someone@gmail.com");return{path:`/api/emails/${encodeURIComponent(t.toLowerCase())}/connector/verify`,method:"POST"};case"disconnect":if(!t)throw new rt("Address required.","domani mailbox disconnect someone@gmail.com");return{path:`/api/emails/${encodeURIComponent(t.toLowerCase())}/connector`,method:"DELETE"};default:throw new rt(`Unknown action "${e??""}".`,`Actions: ${Df.join(", ")}.`)}}function Uf(e){j(`${e.address} (${e.kind})`),l("Status",String(e.status)),l("Phase",String(e.phase)+(e.paused_reason?` (${e.paused_reason})`:"")),l("Imported since",e.import_since?new Date(String(e.import_since)).toLocaleString():"-");let t=e.forwarding;if(t){l("Forward to",String(t.address??"-")),l("Forwarded",`${t.forwarded??0}${t.last_forwarded_at?`, last ${new Date(t.last_forwarded_at).toLocaleString()}`:""}`),t.confirmation&&l("Gmail confirmation",`${Jt.default.bold(t.confirmation.code)}${t.confirmation.url?` ${t.confirmation.url}`:""}`);let i=t.guide;i&&l("Provider",`${i.name??"unknown"}${i.settings_url?` ${i.settings_url}`:""}${i.limits?.includes("paid_plan")?" (forwarding needs a paid plan there)":""}`),t.probe&&l("Probe",t.probe.returned_at?`came back ${new Date(t.probe.returned_at).toLocaleString()}`:`sent ${new Date(t.probe.sent_at).toLocaleString()}, not back yet`)}let n=e.import_run;n&&l("Import",`${n.status}: ${n.copied} copied, ${n.analysed}/${n.to_analyse} analysed${n.listing_done?"":", still listing"}`),e.source_messages_total&&l("In the source",`${e.source_messages_total} messages`),l("Last sync",e.last_sync_at?new Date(String(e.last_sync_at)).toLocaleString():"never"),e.last_error&&l("Last error",Jt.default.yellow(String(e.last_error)))}async function vl(e,t,n){let i;try{i=Nf(e,t,n)}catch(o){if(o instanceof rt)return u(o.message,{hint:o.hint,code:"validation_error",json:n.json});throw o}let s=await k(i.path,{method:i.method,...i.body?{headers:{"Content-Type":"application/json"},body:JSON.stringify(i.body)}:{}}),r=await s.json().catch(()=>({}));if(!s.ok)return u(r.error||r.message||"Request failed",{hint:r.hint,status:s.status,json:n.json,code:String(r.code??"request_failed")});if(e==="connect"&&t==="forwarding"){if(n.json)return b(r,n.fields);j("Connect your inbox by forwarding"),l("Inbox",String(r.address)),l("Forward to",Jt.default.cyan(String(r.forwarding_address))),l("Status",String(r.status));let o=r.instructions;for(let[a,d]of Object.entries(o??{}))console.log(`
|
|
213
|
+
${Jt.default.bold(a==="gmail"?"Gmail":a==="outlook"?"Outlook":"Any provider")}`),d.forEach((m,f)=>console.log(` ${f+1}. ${m}`));de(`Then: domani mailbox verify ${r.address} sends a probe; domani mailbox connector ${r.address} shows the confirmation code and the status.`);return}if(e==="connect"){if(n.json&&!n.wait)return b(r,n.fields);if(j("Connect your Gmail inbox"),l("Import since",new Date(String(r.import_since)).toLocaleString()),console.log(`
|
|
214
214
|
Open this link in your browser and choose the Google account:
|
|
215
215
|
${Jt.default.cyan(String(r.auth_url))}
|
|
216
216
|
`),n.open!==!1&&Ve(String(r.auth_url)),de("After consent, the inbox appears as a connected mailbox at its own address; check it with: domani mailbox connector <address>"),n.wait){let o=Date.now();for(let a=0;a<180;a+=1){await Rt(5e3);let f=((await(await k("/api/emails?limit=50")).json().catch(()=>({}))).mailboxes??[]).find(p=>p.kind==="connected"&&p.created_at&&Date.parse(p.created_at)>=o-6e4);if(f){let p=f.address??f.email;if(n.json)return b({status:"connected",address:p},n.fields);console.log(`
|
|
217
|
-
${Jt.default.green("Connected")} ${p}`);return}}return u("No inbox was connected within 15 minutes.",{code:"connect_timeout",json:n.json})}return}if(n.json)return b(r,n.fields);if(e==="providers"){
|
|
218
|
-
`);for await(let s of n){if(!s.trim())continue;let r=(async()=>{let o;try{o=JSON.parse(s)}catch{process.stdout.write(`${JSON.stringify(
|
|
217
|
+
${Jt.default.green("Connected")} ${p}`);return}}return u("No inbox was connected within 15 minutes.",{code:"connect_timeout",json:n.json})}return}if(n.json)return b(r,n.fields);if(e==="providers"){j("Mailbox providers");for(let o of r.providers??[])l(String(o.name),o.configured?`ready (${o.access.join(", ")}${o.imports_history?", imports older mail":""})`:Jt.default.yellow(`not set up: ${o.reason}`));de("domani mailbox connect gmail | outlook | forwarding --address me@company.com");return}if(e==="connector")return Uf(r);if(e==="verify"){j("Probe sent"),l("To",String(r.sent_to)),l("Comes back through",String(r.forwarding_address)),de("When the rule brings it back, the connection is active: domani mailbox connector <address>");return}if(e==="import"){j("Importing older mail"),l("From",new Date(String(r.import_since)).toLocaleString()),l("To",new Date(String(r.import_until)).toLocaleString()),de(`Progress: domani mailbox connector ${t}`);return}e==="disconnect"&&(j("Disconnected"),l("Address",String(r.address)),l("Removed",`${r.removed_messages} messages, ${r.removed_attachments} attachments`))}var _l=D(L(),1);G();V();async function Mf(e,t){let n=await e.json();return e.ok||u(n.error||n.message,{hint:n.hint,status:e.status,json:t.json,fields:t.fields}),n}async function kl(e,t,n,i){let s=`/api/domains/${encodeURIComponent(e)}/hostname-bindings`,r;if(!t||t==="list")r=await k(s);else if(t==="plan")i.hostname||u("--hostname is required",{code:"validation_error",json:i.json}),r=await k(`${s}/plan`,{method:"POST",body:JSON.stringify({hostname:i.hostname,browser_mode:i.browserMode})});else if(t==="create"){i.hostname||u("--hostname is required",{code:"validation_error",json:i.json});let d={hostname:i.hostname,browser_mode:i.browserMode,expected_zone_version:i.expectedZoneVersion,acknowledgements:i.acknowledgements?.split(",").map(f=>f.trim())},m=_t(`binding:create:${e}:${i.hostname}`,d);r=await k(s,{method:"POST",headers:{"Idempotency-Key":m.key},body:JSON.stringify(d)}),r.ok&&m.complete()}else{n||u("Binding ID is required",{hint:`Usage: domani binding ${e} ${t} <id>`,code:"validation_error",json:i.json});let d=`${s}/${encodeURIComponent(n)}`;if(t==="get")r=await k(d);else if(t==="verify")r=await k(`${d}/verify`,{method:"POST"});else if(t==="delete")r=await k(d,{method:"DELETE"});else if(t==="update"){i.browserMode||u("--browser-mode is required",{code:"validation_error",json:i.json});let m={browser_mode:i.browserMode,acknowledgements:i.acknowledgements?.split(",").map(p=>p.trim())},f=_t(`binding:update:${e}:${n}`,m);r=await k(d,{method:"PATCH",headers:{"Idempotency-Key":f.key},body:JSON.stringify(m)}),r.ok&&f.complete()}else return u(`Unknown action: ${t}`,{hint:"Actions: list, plan, create, get, update, verify, delete",code:"validation_error",json:i.json})}if(r.status===204){if(i.json)return b({disabled:!0,id:n},i.fields);console.log("Hostname binding disabled");return}let o=await Mf(r,i);if(i.json)return b(o,i.fields);c(),j(t==="plan"?"Hostname Binding Plan":"Hostname Bindings");let a=o.hostname_bindings||(o.hostname_binding?[o.hostname_binding]:[]);if(a.length)for(let d of a)console.log(` ${_l.default.dim(d.id)} ${d.hostname_pattern} ${d.status} ${d.browser_mode}`);else console.log(JSON.stringify(o,null,2));c()}var xl=D(require("node:readline"),1);De();function qf(e){return(Array.isArray(e)?e:[e]).filter(n=>!!n&&typeof n=="object")}function to(e,t,n,i){return{jsonrpc:"2.0",id:e,error:{code:t,message:n,...i?{data:i}:{}}}}function ri(e,t,n,i){let s=qf(e).filter(r=>Object.prototype.hasOwnProperty.call(r,"id")).map(r=>to(r.id??null,t,n,i));if(s.length!==0)return Array.isArray(e)?s:s[0]}function Ff(e){let t=[];for(let n of e.split(/\r?\n/)){if(!n.startsWith("data:"))continue;let i=n.slice(5).trim();if(!(!i||i==="[DONE]"))try{t.push(JSON.parse(i))}catch{}}return t}async function Lf(e,t={}){let n=t.fetchImpl??fetch,i=t.getAuthToken?t.getAuthToken():at(),s=(t.apiUrl??ze()).replace(/\/$/,""),r={"Content-Type":"application/json",Accept:"application/json, text/event-stream"};i&&(r.Authorization=`Bearer ${i}`);let o=()=>n(`${s}/mcp`,{method:"POST",headers:r,body:JSON.stringify(e)}),a;try{a=await o()}catch(f){let p=f instanceof Error?f.message:"Unknown network error",w=ri(e,-32002,"Domani MCP is unreachable",{code:"MCP_NETWORK_ERROR",hint:`Check your connection and that ${s} is reachable.`,detail:p});return w===void 0?[]:[w]}if(a.status===401){let f=t.refreshAuthToken?t.refreshAuthToken():t.getAuthToken?void 0:at({refreshKeychain:!0});if(f&&f!==i){await a.body?.cancel(),i=f,r.Authorization=`Bearer ${i}`;try{a=await o()}catch(p){let w=p instanceof Error?p.message:"Unknown network error",_=ri(e,-32002,"Domani MCP is unreachable",{code:"MCP_NETWORK_ERROR",hint:`Check your connection and that ${s} is reachable.`,detail:w});return _===void 0?[]:[_]}}}if(a.status===202||a.status===204)return[];let d=await a.text();if(a.status===401){let{name:f,source:p}=t.getAuthToken?{name:void 0,source:"none"}:Nt(),w=`npx -y domani-cli@latest login${p==="flag"||p==="env"?` --account ${f}`:""}`,_=ri(e,-32001,"Domani authentication required",{code:"AUTH_REQUIRED",hint:`Run \`${w}\`, approve access in the browser, then retry. Never paste an API key into chat.`,fix_command:w});return _===void 0?[]:[_]}if(!a.ok){let f=ri(e,-32e3,`Domani MCP request failed (${a.status})`,{code:"MCP_HTTP_ERROR",hint:"Retry once. If the error persists, check https://domani.run/status."});return f===void 0?[]:[f]}if(!d.trim())return[];if((a.headers.get("content-type")??"").includes("text/event-stream"))return Ff(d);try{return[JSON.parse(d)]}catch{let f=ri(e,-32700,"Domani MCP returned invalid JSON",{code:"MCP_INVALID_RESPONSE"});return f===void 0?[]:[f]}}async function jl(e={}){let t=e.stderr??process.stderr,n=xl.default.createInterface({input:process.stdin,crlfDelay:1/0}),i=new Set;e.verbose&&t.write(`domani MCP bridge ready
|
|
218
|
+
`);for await(let s of n){if(!s.trim())continue;let r=(async()=>{let o;try{o=JSON.parse(s)}catch{process.stdout.write(`${JSON.stringify(to(null,-32700,"Parse error"))}
|
|
219
219
|
`);return}let a=await Lf(o,e);for(let d of a)process.stdout.write(`${JSON.stringify(d)}
|
|
220
220
|
`)})().catch(o=>{if(e.verbose){let a=o instanceof Error?o.message:String(o);t.write(`domani MCP bridge internal error: ${a}
|
|
221
|
-
`)}process.stdout.write(`${JSON.stringify(
|
|
222
|
-
`)});i.add(r),r.then(()=>i.delete(r))}await Promise.all(i)}process.stdin.setMaxListeners(50);var W=new
|
|
221
|
+
`)}process.stdout.write(`${JSON.stringify(to(null,-32603,"Domani MCP bridge internal error"))}
|
|
222
|
+
`)});i.add(r),r.then(()=>i.delete(r))}await Promise.all(i)}process.stdin.setMaxListeners(50);var W=new yo;W.name("domani").description(`Domain names for developers and AI agents - ${yn}`).version(Ie).option("--api-url <url>","Override API base URL").option("--account <name>","Act as this saved CLI account (overrides DOMANI_ACCOUNT and 'domani use')").configureOutput({outputError:(e,t)=>{let n=e.replace(/^error:\s*/i,"").trimEnd();if(t(`${kt.default.red("\u2717")} ${n}
|
|
223
223
|
`),/unknown option|missing required|expected argument/i.test(n)){let i=process.argv[2],s=i&&!i.startsWith("-")?`domani ${i} --help`:"domani --help";t(`${kt.default.dim(` Run \`${s}\` to see available options.`)}
|
|
224
|
-
`)}}}).hook("preAction",async(e,t)=>{let n=e.opts();n.apiUrl&&
|
|
224
|
+
`)}}}).hook("preAction",async(e,t)=>{let n=e.opts();n.apiUrl&&So(n.apiUrl);for(let[s,r]of[["--account",n.account],["DOMANI_ACCOUNT",process.env.DOMANI_ACCOUNT]])r&&!yi(r)&&u(`Invalid ${s} name: ${r}`,{code:"validation_error",hint:"Use letters, digits, dot, dash or underscore (up to 63 characters)"});n.account&&Oo(n.account),process.stdout.isTTY||t.options.some(r=>r.long==="--json")&&t.setOptionValue("json",!0),["login","logout","accounts","use","search","suggest","tlds","whois","schema","update","uninstall","mcp"].includes(t.name())||await ba()});W.command("login").description(`Log in to ${yn} (opens browser)`).option("--json","Output as JSON (returns auth_url for non-interactive approval)").option("--no-open","Don't open browser (print URL instead)").option("--scopes <scopes>","Request a comma-separated, least-privilege scope set").option("--mailboxes <addresses>","Confine the credential to these comma-separated mailbox addresses").option("--label <label>","Human-readable label shown on the approval screen").option("--expires-in <seconds>","Delegated credential lifetime in seconds (3600-31536000)").option("--surface <surface>","Attribute onboarding: cli, mcp, plugin, skill, or api","cli").addHelpText("after",`
|
|
225
225
|
Examples:
|
|
226
226
|
domani login # interactive login (opens browser)
|
|
227
227
|
domani login --scopes domains:read,search --label "Project agent" --expires-in 86400
|
|
@@ -231,7 +231,7 @@ Examples:
|
|
|
231
231
|
domani login --json # non-interactive (returns auth_url)
|
|
232
232
|
domani login --no-open # print login URL without opening browser
|
|
233
233
|
domani login --account work # save a second Domani account as "work"
|
|
234
|
-
DOMANI_API_KEY=domani_sk_xxx domani list # skip login, use env var`).action(
|
|
234
|
+
DOMANI_API_KEY=domani_sk_xxx domani list # skip login, use env var`).action($a);W.command("logout").description("Forget the saved login of the current account (or --account <name>)").option("--yes","Skip confirmation").option("--json","Output as JSON").action(va);W.command("accounts").description("List the Domani accounts saved in this CLI and the one in use").option("--json","Output as JSON").addHelpText("after",`
|
|
235
235
|
Examples:
|
|
236
236
|
domani accounts # list saved accounts, * marks the one in use
|
|
237
237
|
domani login --account work # add another account
|
|
@@ -239,11 +239,11 @@ Examples:
|
|
|
239
239
|
domani --account work list # use it for one command
|
|
240
240
|
DOMANI_ACCOUNT=work domani mcp serve # pin an agent's MCP bridge to it
|
|
241
241
|
|
|
242
|
-
Precedence: DOMANI_API_KEY, then --account, then DOMANI_ACCOUNT, then 'domani use'.`).action(
|
|
242
|
+
Precedence: DOMANI_API_KEY, then --account, then DOMANI_ACCOUNT, then 'domani use'.`).action(xa);W.command("use <name>").description("Switch the active account (see: domani accounts)").option("--json","Output as JSON").action(ja);W.command("me").description("Show account info").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").addHelpText("after",`
|
|
243
243
|
Examples:
|
|
244
244
|
domani me # show account overview
|
|
245
245
|
domani me --json # machine-readable account info
|
|
246
|
-
domani me --json --fields email,plan # just email and plan`).action(
|
|
246
|
+
domani me --json --fields email,plan # just email and plan`).action(ka);W.command("invoices").description("List payment invoices").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").option("--limit <n>","Max invoices to show (default 20)").action(Yd);W.command("card [action]").description("Manage payment methods (list, add, remove)").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").option("--yes","Skip confirmation prompt (for remove)").action(async(e,t)=>{if(!e||e==="list")return dl(t);if(e==="add")return ll(t);if(e==="remove")return cl(t);u(`Unknown action: ${e}`,{hint:"Use: domani card list, domani card add, or domani card remove"})});W.command("upgrade").description("Upgrade to Agent ($19/month)").option("--json","Output as JSON (returns checkout URL)").action(Zd);W.command("cancel").description("Cancel your paid subscription (access continues until end of billing period)").option("--json","Output as JSON").action(Qd);W.command("billing",{hidden:!0}).option("--json","Output as JSON (returns checkout URL)").action(Xd);W.command("token").description("Print your API key (masked on a terminal; --reveal for the full key)").option("--json","Output as JSON").option("--reveal","Print the full key even on an interactive terminal").action(Sd);W.command("mcp [action]").description("Run the secure local MCP bridge (stdio)").option("--verbose","Write bridge lifecycle messages to stderr").addHelpText("after",`
|
|
247
247
|
Examples:
|
|
248
248
|
domani login # authenticate once in your browser
|
|
249
249
|
domani mcp serve # stdio bridge for agent plugins
|
|
@@ -273,7 +273,7 @@ Examples:
|
|
|
273
273
|
domani buy myapp.ai --dry-run --years 3 # preview a 3-year term (.ai: 2 years at least)
|
|
274
274
|
domani buy myapp.dev --yes # skip confirmation
|
|
275
275
|
domani buy myapp.dev --yes --max-price 15 # never pay more than $15
|
|
276
|
-
domani buy myapp.dev --json # machine-readable output`).action(
|
|
276
|
+
domani buy myapp.dev --json # machine-readable output`).action(Jr);W.command("provision <domain>").description("Give an agent a full identity: domain + mailbox + webhook in one call").option("--slug <slug>","Mailbox local part (e.g. 'hi' for hi@domain). Default 'hi'").option("--name <name>","Display name for outbound email").option("--webhook <url>","HTTPS URL to receive inbound email + domain events").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("--years <n>","Registration years (1-10, default 1)").option("--max-price <usd>","Ceiling for the domain charge (default: the listed price)").option("--payment-method <method>","card, usdc, or balance").option("--dry-run","Show what would happen without executing").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").addHelpText("after",`
|
|
277
277
|
Examples:
|
|
278
278
|
domani provision myagent.run # domain + hi@ mailbox
|
|
279
279
|
domani provision myagent.run --slug hey --name "My Agent" # custom mailbox
|
|
@@ -366,12 +366,12 @@ Examples:
|
|
|
366
366
|
Examples:
|
|
367
367
|
domani list # list all domains
|
|
368
368
|
domani domains # alias for list
|
|
369
|
-
domani list --json --fields domain,expires_at`).action(gd);W.command("status [domain]").description("Check domain health (DNS, SSL, email, expiry)").option("--timeout <seconds>","Request timeout in seconds (default: 30)").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").action(
|
|
369
|
+
domani list --json --fields domain,expires_at`).action(gd);W.command("status [domain]").description("Check domain health (DNS, SSL, email, expiry)").option("--timeout <seconds>","Request timeout in seconds (default: 30)").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").action(Vr);W.command("connect [domain] [target]").description("Connect domain to a hosting/email provider").option("--provider <name>","Provider name (e.g. vercel, google-workspace)").option("--method <name>","Connection method (e.g. cname-only)").option("--list","List available providers").option("--dry-run","Show what would happen without executing").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").addHelpText("after",`
|
|
370
370
|
Examples:
|
|
371
371
|
domani connect --list # list providers
|
|
372
372
|
domani connect myapp.dev vercel # connect to Vercel
|
|
373
373
|
domani connect myapp.dev --provider google-workspace # connect Google Workspace
|
|
374
|
-
domani connect myapp.dev vercel --dry-run # preview DNS changes`).action(
|
|
374
|
+
domani connect myapp.dev vercel --dry-run # preview DNS changes`).action(Rr);W.command("email [action] [arg2]").description("Manage email: inbox lifecycle, mailboxes, send, forwarding, webhooks and setup").addHelpText("after",`
|
|
375
375
|
Examples:
|
|
376
376
|
domani email list # list all mailboxes
|
|
377
377
|
domani email create --domain myapp.dev --slug hi # create hi@myapp.dev
|
|
@@ -432,7 +432,7 @@ Examples:
|
|
|
432
432
|
domani dns myapp.dev set --type CNAME --name www --value cname.vercel-dns.com
|
|
433
433
|
domani dns myapp.dev delete --type A --name @ # delete every @ A record
|
|
434
434
|
domani dns myapp.dev snapshot # export DNS as JSON
|
|
435
|
-
domani dns myapp.dev restore --file dns-backup.json # restore from snapshot`).action(
|
|
435
|
+
domani dns myapp.dev restore --file dns-backup.json # restore from snapshot`).action(Fr);W.command("nameservers [domain] [ns...]").alias("ns").description("Get or set nameservers (--reset for defaults)").option("--set <ns>","Comma-separated nameservers to set").option("--reset","Reset to registrar default nameservers").option("--dry-run","Show what would happen without executing").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").action(el);W.command("settings [domain]").description("View or update domain settings (auto-renew, WHOIS privacy, security lock)").option("--auto-renew <on|off>","Enable or disable auto-renew").option("--whois-privacy <on|off>","Enable or disable WHOIS privacy").option("--security-lock <on|off>","Lock or unlock domain transfers").option("--dry-run","Show what would happen without executing").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").addHelpText("after",`
|
|
436
436
|
Examples:
|
|
437
437
|
domani settings myapp.dev # view current settings
|
|
438
438
|
domani settings myapp.dev --auto-renew on # enable auto-renew
|
|
@@ -462,7 +462,7 @@ Examples:
|
|
|
462
462
|
domani deals --role seller --status active # your active sales
|
|
463
463
|
domani deals --cursor <next_cursor> # next page
|
|
464
464
|
domani deals deal_abc123 # view specific deal
|
|
465
|
-
domani deals --json # machine-readable output`).action(
|
|
465
|
+
domani deals --json # machine-readable output`).action(Md);W.command("broker [action] [arg]").description("Acquire a taken, unlisted domain (broker sources + negotiates on your behalf)").option("--max-budget <amount>","Your ceiling in USD for a request").option("--status <status>","Filter the list by status").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").addHelpText("after",`
|
|
466
466
|
Actions:
|
|
467
467
|
request <domain> ask domani to acquire a taken domain (commission-only)
|
|
468
468
|
list (default) list your acquisition requests
|
|
@@ -501,7 +501,7 @@ Examples:
|
|
|
501
501
|
domani mailbox verify me@outlook.com # send a probe through the rule
|
|
502
502
|
domani mailbox connector someone@gmail.com # status, import progress, the Gmail confirmation code
|
|
503
503
|
domani mailbox import someone@gmail.com --since 2026-01-01 # widen the import
|
|
504
|
-
domani mailbox disconnect someone@gmail.com # remove your copies and the credential`).option("--address <address>","The inbox to connect by forwarding (for connect forwarding)").option("--since <date>","Import the mail received after this ISO date").option("--window <window>","A preset instead of --since: 24h (default), 7d, 30d, 1y").option("--workspace <id>","Workspace the mailbox belongs to (for connect)").option("--no-open","Do not open the browser (for connect)").option("--wait","Wait until the inbox is connected (for connect)").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").action((e,t,n)=>vl(e,t,n));W.command("schema [command]").description("Show command schemas for AI agent integration").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").action(al);W.command("update").description("Update domani CLI to the latest version").option("--json","Output as JSON (check version without updating)").option("--yes","Perform the update even in JSON/non-interactive mode").action(nl);W.command("uninstall").description("Remove domani CLI and config from this machine").action(rl);(async()=>{let e=
|
|
504
|
+
domani mailbox disconnect someone@gmail.com # remove your copies and the credential`).option("--address <address>","The inbox to connect by forwarding (for connect forwarding)").option("--since <date>","Import the mail received after this ISO date").option("--window <window>","A preset instead of --since: 24h (default), 7d, 30d, 1y").option("--workspace <id>","Workspace the mailbox belongs to (for connect)").option("--no-open","Do not open the browser (for connect)").option("--wait","Wait until the inbox is connected (for connect)").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").action((e,t,n)=>vl(e,t,n));W.command("schema [command]").description("Show command schemas for AI agent integration").option("--json","Output as JSON").option("--fields <fields>","Filter JSON output fields (comma-separated)").action(al);W.command("update").description("Update domani CLI to the latest version").option("--json","Output as JSON (check version without updating)").option("--yes","Perform the update even in JSON/non-interactive mode").action(nl);W.command("uninstall").description("Remove domani CLI and config from this machine").action(rl);(async()=>{let e=Ao();await W.parseAsync();let t=await e,n=process.stdout.isTTY?"domani update":"domani update --yes";t?.forced?(console.error(`
|
|
505
505
|
${kt.default.red("!")} CLI v${Ie} is no longer supported. Run ${kt.default.bold(n)} to upgrade to v${t.update}
|
|
506
506
|
`),process.exit(1)):t?.update&&console.error(`
|
|
507
507
|
${kt.default.yellow("!")} Update available: ${kt.default.dim(Ie)} ${kt.default.dim("\u2192")} ${kt.default.green(t.update)} Run ${kt.default.bold(n)}
|