@director.run/cli 0.0.46 → 0.0.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +2 -2
  2. package/package.json +3 -3
package/dist/cli.js CHANGED
@@ -544,7 +544,7 @@ Please see the 3.x to 4.x migration guide for details on how to update your app.
544
544
  `)+w,B=J+1,J=D.indexOf(`
545
545
  `,B)}while(J!==-1);return Y+=D.slice(B),Y}var{stdout:HS,stderr:ES}=QS,UU=Symbol("GENERATOR"),tD=Symbol("STYLER"),FB=Symbol("IS_EMPTY"),VS=["ansi","ansi","ansi256","ansi16m"],eD=Object.create(null),uz1=(D,F={})=>{if(F.level&&!(Number.isInteger(F.level)&&F.level>=0&&F.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let w=HS?HS.level:0;D.level=F.level===void 0?w:F.level};var Lz1=(D)=>{let F=(...w)=>w.join(" ");return uz1(F,D),Object.setPrototypeOf(F,wB.prototype),F};function wB(D){return Lz1(D)}Object.setPrototypeOf(wB.prototype,Function.prototype);for(let[D,F]of Object.entries(X8))eD[D]={get(){let w=xW(this,qU(F.open,F.close,this[tD]),this[FB]);return Object.defineProperty(this,D,{value:w}),w}};eD.visible={get(){let D=xW(this,this[tD],!0);return Object.defineProperty(this,"visible",{value:D}),D}};var $U=(D,F,w,...J)=>{if(D==="rgb"){if(F==="ansi16m")return X8[w].ansi16m(...J);if(F==="ansi256")return X8[w].ansi256(X8.rgbToAnsi256(...J));return X8[w].ansi(X8.rgbToAnsi(...J))}if(D==="hex")return $U("rgb",F,w,...X8.hexToRgb(...J));return X8[w][D](...J)},Rz1=["rgb","hex","ansi256"];for(let D of Rz1){eD[D]={get(){let{level:w}=this;return function(...J){let B=qU($U(D,VS[w],"color",...J),X8.color.close,this[tD]);return xW(this,B,this[FB])}}};let F="bg"+D[0].toUpperCase()+D.slice(1);eD[F]={get(){let{level:w}=this;return function(...J){let B=qU($U(D,VS[w],"bgColor",...J),X8.bgColor.close,this[tD]);return xW(this,B,this[FB])}}}}var Tz1=Object.defineProperties(()=>{},{...eD,level:{enumerable:!0,get(){return this[UU].level},set(D){this[UU].level=D}}}),qU=(D,F,w)=>{let J,B;if(w===void 0)J=D,B=F;else J=w.openAll+D,B=F+w.closeAll;return{open:D,close:F,openAll:J,closeAll:B,parent:w}},xW=(D,F,w)=>{let J=(...B)=>Pz1(J,B.length===1?""+B[0]:B.join(" "));return Object.setPrototypeOf(J,Tz1),J[UU]=D,J[tD]=F,J[FB]=w,J},Pz1=(D,F)=>{if(D.level<=0||!F)return D[FB]?"":F;let w=D[tD];if(w===void 0)return F;let{openAll:J,closeAll:B}=w;if(F.includes("\x1B"))while(w!==void 0)F=XS(F,w.close,w.open),w=w.parent;let Y=F.indexOf(`
546
546
  `);if(Y!==-1)F=WS(F,B,J,Y);return J+F+B};Object.defineProperties(wB.prototype,eD);var vz1=wB(),hX0=wB({level:ES?ES.level:0});var m1=vz1;var NS=O1(zS(),1),l8=pU("#0099F7"),a5=pU("#F11712"),JB=pU("#00FF00"),AU=(D)=>m1.yellow(D);function pU(D){let F=xz1(D);return(w)=>`\x1B[38;5;${F}m${w}${NS.default.reset("")}`}function xz1(D){let F=parseInt(D.slice(1),16),w=Math.floor(F/65536)%256,J=Math.floor(F/256)%256,B=F%256;return 16+36*Math.round(w/255*5)+6*Math.round(J/255*5)+Math.round(B/255*5)}function u2(D){return m1.white.bold(D)}var OU=" ".repeat(2);function qS(D){let F=[];if(D._enableDebugCommands)F.push(AU("\uD83D\uDEA7 debug commands appear in yellow \uD83D\uDEA7")),F.push("");if(F.push(D.description().trim()),F.push(""),F.push(DF("usage")),F.push(OU+BB([D.parent?D.parent.name():"",D.name(),AS("command"),"[subcommand]","[flags]"])),F.push(""),D.parent)F.push(DF(`${D.name()} commands`));else F.push(DF("core commands"));D.commands.toSorted((J,B)=>Number(!!J.commands.length)-Number(!!B.commands.length)).forEach((J)=>{if(J.commands.length)F.push(""),F.push(DF(J.name())),J.commands.forEach((B)=>{F.push(US(B))});else F.push(US(J))}),F.push("");let w=[D._helpOption,...D.options].filter((J)=>J!==void 0);if(w.length)F.push(DF("flags")),w.forEach((J)=>{F.push(BB([OU,J.flags,MS(J.description,J.flags.length)]))}),F.push("");if(D.examples)F.push(DF("examples")),F.push(" "+D.examples.trim()),F.push("");return F.push(""),F.join(`
547
- `)}var DF=(D)=>{return u2(D.toLocaleUpperCase())},US=(D)=>{let F=D.registeredArguments.map((Y)=>Y.required?AS(Y.name()):$S(Y.name())).filter((Y)=>Y!=="").join(" "),w=BB([BB([D.parent&&D.parent.parent?D.parent?.name():void 0,D.name()]),F,D.options.length?$S("options"):""]),J=D.description()||a5("TODO"),B=BB([OU,w,MS(J,w.length)]);return D._debug?AU(B):B},MS=(D,F)=>{return" ".repeat(Math.max(0,45-F))+D},AS=(D)=>["<",D,">"].join(""),$S=(D)=>["[",D,"]"].join(""),BB=(D)=>D.filter(Boolean).join(" ");class n5 extends zU{debug=!0;examples="";constructor(D){super(D);this.helpCommand(!1)}showDebugCommands(D){return this._enableDebugCommands=D,this}debugCommand(D,F){if(this._enableDebugCommands){let w=super.command(D,F);return w._enableDebugCommands=!0,w._debug=!0,w}else return new zU(D)}helpInformation(D){return qS(this)}addExamples(D){this.examples=D}addCommand(D,F){return D._enableDebugCommands=this._enableDebugCommands,D._debug=this._debug,super.addCommand(D,F)}}function i8({flags:D,description:F,defaultValue:w,choices:J,mandatory:B}){let Y=new DS(D,F);return B&&Y.makeOptionMandatory(),w&&Y.default(w),J&&Y.choices(J),Y}var f9={name:"@director.run/cli",type:"module",version:"0.0.46",files:["dist","README.md"],bin:{director:"./dist/cli.js"},license:"MIT",repository:{type:"git",url:"https://github.com/director-run/director"},description:"The easiest way to manage and deploy MCP servers",author:"The Working Company <hello@director.run>",homepage:"https://director.run",scripts:{lint:"biome check .",format:"biome format --write .",clean:"rm -rf .turbo dist/*",test:"bun run vitest --fileParallelism=false",cli:"NODE_ENV=development bun run bin/cli.ts",typecheck:"tsc --noEmit",build:"bun build --production --target=node bin/cli.ts --outdir dist",release:"bun publish --access public --omit=peer",prepare:"bun run build",dev:"bun --watch bin/cli.ts"},peerDependencies:{typescript:"^5"},devDependencies:{"@director.run/gateway":"workspace:*","@director.run/mcp":"workspace:*","@director.run/utilities":"workspace:*","@inquirer/prompts":"^7.5.2","@types/update-notifier":"^6.0.8",boxen:"^8.0.1",chalk:"^5.4.1","cli-table3":"^0.6.5",commander:"^13.1.0",semver:"^7.7.2",superjson:"^2.2.2","type-fest":"^4.40.0","update-notifier":"^7.3.1","@segment/analytics-node":"^2.3.0","node-machine-id":"^1.1.12"}};import gW from"node:process";function CU({onlyFirst:D=!1}={}){let w=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(w,D?void 0:"g")}var fz1=CU();function o5(D){if(typeof D!=="string")throw new TypeError(`Expected a \`string\`, got \`${typeof D}\``);return D.replace(fz1,"")}function pS(D){return D===161||D===164||D===167||D===168||D===170||D===173||D===174||D>=176&&D<=180||D>=182&&D<=186||D>=188&&D<=191||D===198||D===208||D===215||D===216||D>=222&&D<=225||D===230||D>=232&&D<=234||D===236||D===237||D===240||D===242||D===243||D>=247&&D<=250||D===252||D===254||D===257||D===273||D===275||D===283||D===294||D===295||D===299||D>=305&&D<=307||D===312||D>=319&&D<=322||D===324||D>=328&&D<=331||D===333||D===338||D===339||D===358||D===359||D===363||D===462||D===464||D===466||D===468||D===470||D===472||D===474||D===476||D===593||D===609||D===708||D===711||D>=713&&D<=715||D===717||D===720||D>=728&&D<=731||D===733||D===735||D>=768&&D<=879||D>=913&&D<=929||D>=931&&D<=937||D>=945&&D<=961||D>=963&&D<=969||D===1025||D>=1040&&D<=1103||D===1105||D===8208||D>=8211&&D<=8214||D===8216||D===8217||D===8220||D===8221||D>=8224&&D<=8226||D>=8228&&D<=8231||D===8240||D===8242||D===8243||D===8245||D===8251||D===8254||D===8308||D===8319||D>=8321&&D<=8324||D===8364||D===8451||D===8453||D===8457||D===8467||D===8470||D===8481||D===8482||D===8486||D===8491||D===8531||D===8532||D>=8539&&D<=8542||D>=8544&&D<=8555||D>=8560&&D<=8569||D===8585||D>=8592&&D<=8601||D===8632||D===8633||D===8658||D===8660||D===8679||D===8704||D===8706||D===8707||D===8711||D===8712||D===8715||D===8719||D===8721||D===8725||D===8730||D>=8733&&D<=8736||D===8739||D===8741||D>=8743&&D<=8748||D===8750||D>=8756&&D<=8759||D===8764||D===8765||D===8776||D===8780||D===8786||D===8800||D===8801||D>=8804&&D<=8807||D===8810||D===8811||D===8814||D===8815||D===8834||D===8835||D===8838||D===8839||D===8853||D===8857||D===8869||D===8895||D===8978||D>=9312&&D<=9449||D>=9451&&D<=9547||D>=9552&&D<=9587||D>=9600&&D<=9615||D>=9618&&D<=9621||D===9632||D===9633||D>=9635&&D<=9641||D===9650||D===9651||D===9654||D===9655||D===9660||D===9661||D===9664||D===9665||D>=9670&&D<=9672||D===9675||D>=9678&&D<=9681||D>=9698&&D<=9701||D===9711||D===9733||D===9734||D===9737||D===9742||D===9743||D===9756||D===9758||D===9792||D===9794||D===9824||D===9825||D>=9827&&D<=9829||D>=9831&&D<=9834||D===9836||D===9837||D===9839||D===9886||D===9887||D===9919||D>=9926&&D<=9933||D>=9935&&D<=9939||D>=9941&&D<=9953||D===9955||D===9960||D===9961||D>=9963&&D<=9969||D===9972||D>=9974&&D<=9977||D===9979||D===9980||D===9982||D===9983||D===10045||D>=10102&&D<=10111||D>=11094&&D<=11097||D>=12872&&D<=12879||D>=57344&&D<=63743||D>=65024&&D<=65039||D===65533||D>=127232&&D<=127242||D>=127248&&D<=127277||D>=127280&&D<=127337||D>=127344&&D<=127373||D===127375||D===127376||D>=127387&&D<=127404||D>=917760&&D<=917999||D>=983040&&D<=1048573||D>=1048576&&D<=1114109}function OS(D){return D===12288||D>=65281&&D<=65376||D>=65504&&D<=65510}function CS(D){return D>=4352&&D<=4447||D===8986||D===8987||D===9001||D===9002||D>=9193&&D<=9196||D===9200||D===9203||D===9725||D===9726||D===9748||D===9749||D>=9776&&D<=9783||D>=9800&&D<=9811||D===9855||D>=9866&&D<=9871||D===9875||D===9889||D===9898||D===9899||D===9917||D===9918||D===9924||D===9925||D===9934||D===9940||D===9962||D===9970||D===9971||D===9973||D===9978||D===9981||D===9989||D===9994||D===9995||D===10024||D===10060||D===10062||D>=10067&&D<=10069||D===10071||D>=10133&&D<=10135||D===10160||D===10175||D===11035||D===11036||D===11088||D===11093||D>=11904&&D<=11929||D>=11931&&D<=12019||D>=12032&&D<=12245||D>=12272&&D<=12287||D>=12289&&D<=12350||D>=12353&&D<=12438||D>=12441&&D<=12543||D>=12549&&D<=12591||D>=12593&&D<=12686||D>=12688&&D<=12773||D>=12783&&D<=12830||D>=12832&&D<=12871||D>=12880&&D<=42124||D>=42128&&D<=42182||D>=43360&&D<=43388||D>=44032&&D<=55203||D>=63744&&D<=64255||D>=65040&&D<=65049||D>=65072&&D<=65106||D>=65108&&D<=65126||D>=65128&&D<=65131||D>=94176&&D<=94180||D===94192||D===94193||D>=94208&&D<=100343||D>=100352&&D<=101589||D>=101631&&D<=101640||D>=110576&&D<=110579||D>=110581&&D<=110587||D===110589||D===110590||D>=110592&&D<=110882||D===110898||D>=110928&&D<=110930||D===110933||D>=110948&&D<=110951||D>=110960&&D<=111355||D>=119552&&D<=119638||D>=119648&&D<=119670||D===126980||D===127183||D===127374||D>=127377&&D<=127386||D>=127488&&D<=127490||D>=127504&&D<=127547||D>=127552&&D<=127560||D===127568||D===127569||D>=127584&&D<=127589||D>=127744&&D<=127776||D>=127789&&D<=127797||D>=127799&&D<=127868||D>=127870&&D<=127891||D>=127904&&D<=127946||D>=127951&&D<=127955||D>=127968&&D<=127984||D===127988||D>=127992&&D<=128062||D===128064||D>=128066&&D<=128252||D>=128255&&D<=128317||D>=128331&&D<=128334||D>=128336&&D<=128359||D===128378||D===128405||D===128406||D===128420||D>=128507&&D<=128591||D>=128640&&D<=128709||D===128716||D>=128720&&D<=128722||D>=128725&&D<=128727||D>=128732&&D<=128735||D===128747||D===128748||D>=128756&&D<=128764||D>=128992&&D<=129003||D===129008||D>=129292&&D<=129338||D>=129340&&D<=129349||D>=129351&&D<=129535||D>=129648&&D<=129660||D>=129664&&D<=129673||D>=129679&&D<=129734||D>=129742&&D<=129756||D>=129759&&D<=129769||D>=129776&&D<=129784||D>=131072&&D<=196605||D>=196608&&D<=262141}function mz1(D){if(!Number.isSafeInteger(D))throw new TypeError(`Expected a code point, got \`${typeof D}\`.`)}function ZS(D,{ambiguousAsWide:F=!1}={}){if(mz1(D),OS(D)||CS(D)||F&&pS(D))return 2;return 1}var RS=O1(LS(),1),dz1=new Intl.Segmenter,kz1=/^\p{Default_Ignorable_Code_Point}$/u;function s2(D,F={}){if(typeof D!=="string"||D.length===0)return 0;let{ambiguousIsNarrow:w=!0,countAnsiEscapeCodes:J=!1}=F;if(!J)D=o5(D);if(D.length===0)return 0;let B=0,Y={ambiguousAsWide:!w};for(let{segment:Q}of dz1.segment(D)){let X=Q.codePointAt(0);if(X<=31||X>=127&&X<=159)continue;if(X>=8203&&X<=8207||X===65279)continue;if(X>=768&&X<=879||X>=6832&&X<=6911||X>=7616&&X<=7679||X>=8400&&X<=8447||X>=65056&&X<=65071)continue;if(X>=55296&&X<=57343)continue;if(X>=65024&&X<=65039)continue;if(kz1.test(Q))continue;if(RS.default().test(Q)){B+=2;continue}B+=ZS(X,Y)}return B}function mW(D){let F=0;for(let w of D.split(`
547
+ `)}var DF=(D)=>{return u2(D.toLocaleUpperCase())},US=(D)=>{let F=D.registeredArguments.map((Y)=>Y.required?AS(Y.name()):$S(Y.name())).filter((Y)=>Y!=="").join(" "),w=BB([BB([D.parent&&D.parent.parent?D.parent?.name():void 0,D.name()]),F,D.options.length?$S("options"):""]),J=D.description()||a5("TODO"),B=BB([OU,w,MS(J,w.length)]);return D._debug?AU(B):B},MS=(D,F)=>{return" ".repeat(Math.max(0,45-F))+D},AS=(D)=>["<",D,">"].join(""),$S=(D)=>["[",D,"]"].join(""),BB=(D)=>D.filter(Boolean).join(" ");class n5 extends zU{debug=!0;examples="";constructor(D){super(D);this.helpCommand(!1)}showDebugCommands(D){return this._enableDebugCommands=D,this}debugCommand(D,F){if(this._enableDebugCommands){let w=super.command(D,F);return w._enableDebugCommands=!0,w._debug=!0,w}else return new zU(D)}helpInformation(D){return qS(this)}addExamples(D){this.examples=D}addCommand(D,F){return D._enableDebugCommands=this._enableDebugCommands,D._debug=this._debug,super.addCommand(D,F)}}function i8({flags:D,description:F,defaultValue:w,choices:J,mandatory:B}){let Y=new DS(D,F);return B&&Y.makeOptionMandatory(),w&&Y.default(w),J&&Y.choices(J),Y}var f9={name:"@director.run/cli",type:"module",version:"0.0.48",files:["dist","README.md"],bin:{director:"./dist/cli.js"},author:"Barnaby Malet <barnaby@director.run>",license:"AGPL-3.0",repository:{type:"git",url:"https://github.com/director-run/director"},description:"The easiest way to manage and deploy MCP servers",homepage:"https://director.run",scripts:{lint:"biome check .",format:"biome format --write .",clean:"rm -rf .turbo dist/*",test:"bun run vitest --fileParallelism=false",cli:"NODE_ENV=development bun run bin/cli.ts",typecheck:"tsc --noEmit",build:"bun build --production --target=node bin/cli.ts --outdir dist",release:"bun publish --access public --omit=peer",prepare:"bun run build",dev:"bun --watch bin/cli.ts"},peerDependencies:{typescript:"^5"},devDependencies:{"@director.run/gateway":"workspace:*","@director.run/mcp":"workspace:*","@director.run/utilities":"workspace:*","@inquirer/prompts":"^7.5.2","@types/update-notifier":"^6.0.8",boxen:"^8.0.1",chalk:"^5.4.1","cli-table3":"^0.6.5",commander:"^13.1.0",semver:"^7.7.2",superjson:"^2.2.2","type-fest":"^4.40.0","update-notifier":"^7.3.1","@segment/analytics-node":"^2.3.0","node-machine-id":"^1.1.12"}};import gW from"node:process";function CU({onlyFirst:D=!1}={}){let w=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?(?:\\u0007|\\u001B\\u005C|\\u009C))","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))"].join("|");return new RegExp(w,D?void 0:"g")}var fz1=CU();function o5(D){if(typeof D!=="string")throw new TypeError(`Expected a \`string\`, got \`${typeof D}\``);return D.replace(fz1,"")}function pS(D){return D===161||D===164||D===167||D===168||D===170||D===173||D===174||D>=176&&D<=180||D>=182&&D<=186||D>=188&&D<=191||D===198||D===208||D===215||D===216||D>=222&&D<=225||D===230||D>=232&&D<=234||D===236||D===237||D===240||D===242||D===243||D>=247&&D<=250||D===252||D===254||D===257||D===273||D===275||D===283||D===294||D===295||D===299||D>=305&&D<=307||D===312||D>=319&&D<=322||D===324||D>=328&&D<=331||D===333||D===338||D===339||D===358||D===359||D===363||D===462||D===464||D===466||D===468||D===470||D===472||D===474||D===476||D===593||D===609||D===708||D===711||D>=713&&D<=715||D===717||D===720||D>=728&&D<=731||D===733||D===735||D>=768&&D<=879||D>=913&&D<=929||D>=931&&D<=937||D>=945&&D<=961||D>=963&&D<=969||D===1025||D>=1040&&D<=1103||D===1105||D===8208||D>=8211&&D<=8214||D===8216||D===8217||D===8220||D===8221||D>=8224&&D<=8226||D>=8228&&D<=8231||D===8240||D===8242||D===8243||D===8245||D===8251||D===8254||D===8308||D===8319||D>=8321&&D<=8324||D===8364||D===8451||D===8453||D===8457||D===8467||D===8470||D===8481||D===8482||D===8486||D===8491||D===8531||D===8532||D>=8539&&D<=8542||D>=8544&&D<=8555||D>=8560&&D<=8569||D===8585||D>=8592&&D<=8601||D===8632||D===8633||D===8658||D===8660||D===8679||D===8704||D===8706||D===8707||D===8711||D===8712||D===8715||D===8719||D===8721||D===8725||D===8730||D>=8733&&D<=8736||D===8739||D===8741||D>=8743&&D<=8748||D===8750||D>=8756&&D<=8759||D===8764||D===8765||D===8776||D===8780||D===8786||D===8800||D===8801||D>=8804&&D<=8807||D===8810||D===8811||D===8814||D===8815||D===8834||D===8835||D===8838||D===8839||D===8853||D===8857||D===8869||D===8895||D===8978||D>=9312&&D<=9449||D>=9451&&D<=9547||D>=9552&&D<=9587||D>=9600&&D<=9615||D>=9618&&D<=9621||D===9632||D===9633||D>=9635&&D<=9641||D===9650||D===9651||D===9654||D===9655||D===9660||D===9661||D===9664||D===9665||D>=9670&&D<=9672||D===9675||D>=9678&&D<=9681||D>=9698&&D<=9701||D===9711||D===9733||D===9734||D===9737||D===9742||D===9743||D===9756||D===9758||D===9792||D===9794||D===9824||D===9825||D>=9827&&D<=9829||D>=9831&&D<=9834||D===9836||D===9837||D===9839||D===9886||D===9887||D===9919||D>=9926&&D<=9933||D>=9935&&D<=9939||D>=9941&&D<=9953||D===9955||D===9960||D===9961||D>=9963&&D<=9969||D===9972||D>=9974&&D<=9977||D===9979||D===9980||D===9982||D===9983||D===10045||D>=10102&&D<=10111||D>=11094&&D<=11097||D>=12872&&D<=12879||D>=57344&&D<=63743||D>=65024&&D<=65039||D===65533||D>=127232&&D<=127242||D>=127248&&D<=127277||D>=127280&&D<=127337||D>=127344&&D<=127373||D===127375||D===127376||D>=127387&&D<=127404||D>=917760&&D<=917999||D>=983040&&D<=1048573||D>=1048576&&D<=1114109}function OS(D){return D===12288||D>=65281&&D<=65376||D>=65504&&D<=65510}function CS(D){return D>=4352&&D<=4447||D===8986||D===8987||D===9001||D===9002||D>=9193&&D<=9196||D===9200||D===9203||D===9725||D===9726||D===9748||D===9749||D>=9776&&D<=9783||D>=9800&&D<=9811||D===9855||D>=9866&&D<=9871||D===9875||D===9889||D===9898||D===9899||D===9917||D===9918||D===9924||D===9925||D===9934||D===9940||D===9962||D===9970||D===9971||D===9973||D===9978||D===9981||D===9989||D===9994||D===9995||D===10024||D===10060||D===10062||D>=10067&&D<=10069||D===10071||D>=10133&&D<=10135||D===10160||D===10175||D===11035||D===11036||D===11088||D===11093||D>=11904&&D<=11929||D>=11931&&D<=12019||D>=12032&&D<=12245||D>=12272&&D<=12287||D>=12289&&D<=12350||D>=12353&&D<=12438||D>=12441&&D<=12543||D>=12549&&D<=12591||D>=12593&&D<=12686||D>=12688&&D<=12773||D>=12783&&D<=12830||D>=12832&&D<=12871||D>=12880&&D<=42124||D>=42128&&D<=42182||D>=43360&&D<=43388||D>=44032&&D<=55203||D>=63744&&D<=64255||D>=65040&&D<=65049||D>=65072&&D<=65106||D>=65108&&D<=65126||D>=65128&&D<=65131||D>=94176&&D<=94180||D===94192||D===94193||D>=94208&&D<=100343||D>=100352&&D<=101589||D>=101631&&D<=101640||D>=110576&&D<=110579||D>=110581&&D<=110587||D===110589||D===110590||D>=110592&&D<=110882||D===110898||D>=110928&&D<=110930||D===110933||D>=110948&&D<=110951||D>=110960&&D<=111355||D>=119552&&D<=119638||D>=119648&&D<=119670||D===126980||D===127183||D===127374||D>=127377&&D<=127386||D>=127488&&D<=127490||D>=127504&&D<=127547||D>=127552&&D<=127560||D===127568||D===127569||D>=127584&&D<=127589||D>=127744&&D<=127776||D>=127789&&D<=127797||D>=127799&&D<=127868||D>=127870&&D<=127891||D>=127904&&D<=127946||D>=127951&&D<=127955||D>=127968&&D<=127984||D===127988||D>=127992&&D<=128062||D===128064||D>=128066&&D<=128252||D>=128255&&D<=128317||D>=128331&&D<=128334||D>=128336&&D<=128359||D===128378||D===128405||D===128406||D===128420||D>=128507&&D<=128591||D>=128640&&D<=128709||D===128716||D>=128720&&D<=128722||D>=128725&&D<=128727||D>=128732&&D<=128735||D===128747||D===128748||D>=128756&&D<=128764||D>=128992&&D<=129003||D===129008||D>=129292&&D<=129338||D>=129340&&D<=129349||D>=129351&&D<=129535||D>=129648&&D<=129660||D>=129664&&D<=129673||D>=129679&&D<=129734||D>=129742&&D<=129756||D>=129759&&D<=129769||D>=129776&&D<=129784||D>=131072&&D<=196605||D>=196608&&D<=262141}function mz1(D){if(!Number.isSafeInteger(D))throw new TypeError(`Expected a code point, got \`${typeof D}\`.`)}function ZS(D,{ambiguousAsWide:F=!1}={}){if(mz1(D),OS(D)||CS(D)||F&&pS(D))return 2;return 1}var RS=O1(LS(),1),dz1=new Intl.Segmenter,kz1=/^\p{Default_Ignorable_Code_Point}$/u;function s2(D,F={}){if(typeof D!=="string"||D.length===0)return 0;let{ambiguousIsNarrow:w=!0,countAnsiEscapeCodes:J=!1}=F;if(!J)D=o5(D);if(D.length===0)return 0;let B=0,Y={ambiguousAsWide:!w};for(let{segment:Q}of dz1.segment(D)){let X=Q.codePointAt(0);if(X<=31||X>=127&&X<=159)continue;if(X>=8203&&X<=8207||X===65279)continue;if(X>=768&&X<=879||X>=6832&&X<=6911||X>=7616&&X<=7679||X>=8400&&X<=8447||X>=65056&&X<=65071)continue;if(X>=55296&&X<=57343)continue;if(X>=65024&&X<=65039)continue;if(kz1.test(Q))continue;if(RS.default().test(Q)){B+=2;continue}B+=ZS(X,Y)}return B}function mW(D){let F=0;for(let w of D.split(`
548
548
  `))F=Math.max(F,s2(w));return F}var FI=O1(uU(),1);var hz1=/[\p{Lu}]/u,yz1=/[\p{Ll}]/u,vS=/^[\p{Lu}](?![\p{Lu}])/gu,_S=/([\p{Alpha}\p{N}_]|$)/u,LU=/[_.\- ]+/,gz1=new RegExp("^"+LU.source),SS=new RegExp(LU.source+_S.source,"gu"),IS=new RegExp("\\d+"+_S.source,"gu"),lz1=(D,F,w,J)=>{let B=!1,Y=!1,Q=!1,X=!1;for(let W=0;W<D.length;W++){let E=D[W];if(X=W>2?D[W-3]==="-":!0,B&&hz1.test(E))D=D.slice(0,W)+"-"+D.slice(W),B=!1,Q=Y,Y=!0,W++;else if(Y&&Q&&yz1.test(E)&&(!X||J))D=D.slice(0,W-1)+"-"+D.slice(W-1),Q=Y,Y=!1,B=!0;else B=F(E)===E&&w(E)!==E,Q=Y,Y=w(E)===E&&F(E)!==E}return D},iz1=(D,F)=>{return vS.lastIndex=0,D.replaceAll(vS,(w)=>F(w))},cz1=(D,F)=>{return SS.lastIndex=0,IS.lastIndex=0,D.replaceAll(IS,(w,J,B)=>["_","-"].includes(D.charAt(B+w.length))?w:F(w)).replaceAll(SS,(w,J)=>F(J))};function RU(D,F){if(!(typeof D==="string"||Array.isArray(D)))throw new TypeError("Expected the input to be `string | string[]`");if(F={pascalCase:!1,preserveConsecutiveUppercase:!1,...F},Array.isArray(D))D=D.map((Y)=>Y.trim()).filter((Y)=>Y.length).join("-");else D=D.trim();if(D.length===0)return"";let w=F.locale===!1?(Y)=>Y.toLowerCase():(Y)=>Y.toLocaleLowerCase(F.locale),J=F.locale===!1?(Y)=>Y.toUpperCase():(Y)=>Y.toLocaleUpperCase(F.locale);if(D.length===1){if(LU.test(D))return"";return F.pascalCase?J(D):w(D)}if(D!==w(D))D=lz1(D,w,J,F.preserveConsecutiveUppercase);if(D=D.replace(gz1,""),D=F.preserveConsecutiveUppercase?iz1(D,w):w(D),F.pascalCase)D=J(D.charAt(0))+D.slice(1);return cz1(D,J)}var IU=O1(gS(),1);var lS=(D=0)=>(F)=>`\x1B[${F+D}m`,iS=(D=0)=>(F)=>`\x1B[${38+D};5;${F}m`,cS=(D=0)=>(F,w,J)=>`\x1B[${38+D};2;${F};${w};${J}m`,c0={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},pW0=Object.keys(c0.modifier),DN1=Object.keys(c0.color),FN1=Object.keys(c0.bgColor),OW0=[...DN1,...FN1];function wN1(){let D=new Map;for(let[F,w]of Object.entries(c0)){for(let[J,B]of Object.entries(w))c0[J]={open:`\x1B[${B[0]}m`,close:`\x1B[${B[1]}m`},w[J]=c0[J],D.set(B[0],B[1]);Object.defineProperty(c0,F,{value:w,enumerable:!1})}return Object.defineProperty(c0,"codes",{value:D,enumerable:!1}),c0.color.close="\x1B[39m",c0.bgColor.close="\x1B[49m",c0.color.ansi=lS(),c0.color.ansi256=iS(),c0.color.ansi16m=cS(),c0.bgColor.ansi=lS(10),c0.bgColor.ansi256=iS(10),c0.bgColor.ansi16m=cS(10),Object.defineProperties(c0,{rgbToAnsi256:{value:(F,w,J)=>{if(F===w&&w===J){if(F<8)return 16;if(F>248)return 231;return Math.round((F-8)/247*24)+232}return 16+36*Math.round(F/255*5)+6*Math.round(w/255*5)+Math.round(J/255*5)},enumerable:!1},hexToRgb:{value:(F)=>{let w=/[a-f\d]{6}|[a-f\d]{3}/i.exec(F.toString(16));if(!w)return[0,0,0];let[J]=w;if(J.length===3)J=[...J].map((Y)=>Y+Y).join("");let B=Number.parseInt(J,16);return[B>>16&255,B>>8&255,B&255]},enumerable:!1},hexToAnsi256:{value:(F)=>c0.rgbToAnsi256(...c0.hexToRgb(F)),enumerable:!1},ansi256ToAnsi:{value:(F)=>{if(F<8)return 30+F;if(F<16)return 90+(F-8);let w,J,B;if(F>=232)w=((F-232)*10+8)/255,J=w,B=w;else{F-=16;let X=F%36;w=Math.floor(F/36)/5,J=Math.floor(X/6)/5,B=X%6/5}let Y=Math.max(w,J,B)*2;if(Y===0)return 30;let Q=30+(Math.round(B)<<2|Math.round(J)<<1|Math.round(w));if(Y===2)Q+=60;return Q},enumerable:!1},rgbToAnsi:{value:(F,w,J)=>c0.ansi256ToAnsi(c0.rgbToAnsi256(F,w,J)),enumerable:!1},hexToAnsi:{value:(F)=>c0.ansi256ToAnsi(c0.hexToAnsi256(F)),enumerable:!1}}),c0}var JN1=wN1(),aS=JN1;var hW=new Set(["\x1B","›"]),BN1=39,SU="\x07",sS="[",YN1="]",rS="m",bW=`${YN1}8;;`,nS=(D)=>`${hW.values().next().value}${sS}${D}${rS}`,oS=(D)=>`${hW.values().next().value}${bW}${D}${SU}`,QN1=(D)=>D.split(" ").map((F)=>s2(F)),vU=(D,F,w)=>{let J=[...F],B=!1,Y=!1,Q=s2(o5(D.at(-1)));for(let[X,W]of J.entries()){let E=s2(W);if(Q+E<=w)D[D.length-1]+=W;else D.push(W),Q=0;if(hW.has(W))B=!0,Y=J.slice(X+1,X+1+bW.length).join("")===bW;if(B){if(Y){if(W===SU)B=!1,Y=!1}else if(W===rS)B=!1;continue}if(Q+=E,Q===w&&X<J.length-1)D.push(""),Q=0}if(!Q&&D.at(-1).length>0&&D.length>1)D[D.length-2]+=D.pop()},XN1=(D)=>{let F=D.split(" "),w=F.length;while(w>0){if(s2(F[w-1])>0)break;w--}if(w===F.length)return D;return F.slice(0,w).join(" ")+F.slice(w).join("")},WN1=(D,F,w={})=>{if(w.trim!==!1&&D.trim()==="")return"";let J="",B,Y,Q=QN1(D),X=[""];for(let[K,U]of D.split(" ").entries()){if(w.trim!==!1)X[X.length-1]=X.at(-1).trimStart();let N=s2(X.at(-1));if(K!==0){if(N>=F&&(w.wordWrap===!1||w.trim===!1))X.push(""),N=0;if(N>0||w.trim===!1)X[X.length-1]+=" ",N++}if(w.hard&&Q[K]>F){let z=F-N,q=1+Math.floor((Q[K]-z-1)/F);if(Math.floor((Q[K]-1)/F)<q)X.push("");vU(X,U,F);continue}if(N+Q[K]>F&&N>0&&Q[K]>0){if(w.wordWrap===!1&&N<F){vU(X,U,F);continue}X.push("")}if(N+Q[K]>F&&w.wordWrap===!1){vU(X,U,F);continue}X[X.length-1]+=U}if(w.trim!==!1)X=X.map((K)=>XN1(K));let W=X.join(`
549
549
  `),E=[...W],V=0;for(let[K,U]of E.entries()){if(J+=U,hW.has(U)){let{groups:z}=new RegExp(`(?:\\${sS}(?<code>\\d+)m|\\${bW}(?<uri>.*)${SU})`).exec(W.slice(V))||{groups:{}};if(z.code!==void 0){let q=Number.parseFloat(z.code);B=q===BN1?void 0:q}else if(z.uri!==void 0)Y=z.uri.length===0?void 0:z.uri}let N=aS.codes.get(Number(B));if(E[K+1]===`
550
550
  `){if(Y)J+=oS("");if(B&&N)J+=nS(N)}else if(U===`
@@ -620,7 +620,7 @@ ${Y.style.help(`(${D.instructions?.pager??"Use arrow keys to reveal more choices
620
620
  ${Y.style.description(q.description)}`:"";return`${[W,M,C].filter(Boolean).join(" ")}
621
621
  ${u}${O}${P}${k41.default.cursorHide}`});function b41(D){return D.command("add <proxyId>").description("Add a server to a proxy.").addOption(i8({flags:"-e,--entry <entryName>",description:"add a server from the registry by specifying the entry name"})).addOption(i8({flags:"-u,--url <url>",description:"add a streamable or sse server by specifying the url"})).addOption(i8({flags:"-n,--name <serverName>",description:"the name of the server as it'll appear in the config file"})).action(g1(async(F,w)=>{if(w.entry)console.log(`adding ${w.entry} to ${F}`),await x60(F,w.entry);else if(w.url){if(!w.name)throw new Error("No server name provided. use --name to specify the name of the server");console.log(`adding ${w.url} to ${F}`),await _60(F,w.url,w.name)}else console.warn("No entry name or url provided. You must speciy --entry or --url and --name, alternatively update the config file directly and restart the gateway:"),console.log(),console.log(`${u2("CONFIG_FILE_PATH:")} ${$0.CONFIG_FILE_PATH}`),console.log()}))}async function _60(D,F,w){await Y4(async()=>{await g2.store.addServer.mutate({proxyId:D,server:{name:w,transport:{type:"http",url:F}}})}).start("installing server...").succeed(`HTTP server ${F} added to ${D}`).run()}async function x60(D,F){let w=await Y4(()=>h4.entries.getEntryByName.query({name:F})).start("fetching entry...").succeed("Entry fetched.").run(),J=await j60(w);await Y4(async()=>{let B=await h4.entries.getTransportForEntry.query({entryName:F,parameters:J});await g2.store.addServer.mutate({proxyId:D,server:{name:F,transport:B,source:{name:"registry",entryId:w.id,entryData:w}}})}).start("installing server...").succeed(`Registry entry ${F} added to ${D}`).run()}async function j60(D){let F={};if(!D.parameters)return{};for(let w of D.parameters)if(w.required)F[w.name]=await Pu({message:w.name,mask:"*"});else F[w.name]=await Tu({message:w.name});return F}var h41=P1("gateway/helpers");function WX(D){return`/${D}/mcp`}function HX(D){return`/${D}/sse`}async function Iu(D){h41.info(`restarting connected clients for ${D.id}`);for(let F of hB()){let w=e2(F);if(await w.isInstalled(D.id))h41.info(`${D.id} is intalled in ${F}, restarting...`),await w.restart()}}function y41(D){D.command("connect <proxyId>").description("Connect a proxy to a MCP client").addOption(i8({flags:"-t,--target <target>",description:"target client",choices:["claude","cursor","vscode"]})).action(g1(async(F,w)=>{if(w.target){let J=await g2.store.get.query({proxyId:F}),Y=await(await e2(w.target)).install({name:J.id,url:B4($0.GATEWAY_URL,HX(J.id))});console.log(Y)}else{console.log(),console.log(l8("--------------------------------")),console.log(l8(`Connection Details for '${F}'`)),console.log(l8("--------------------------------")),console.log(),console.log("Note: if you'd like to connect to a client automatically, run:"),console.log("director connect "+F+" --target <target>"),console.log();let J=await g2.store.get.query({proxyId:F}),B=$0.GATEWAY_URL,Y=B4(B,HX(J.id)),Q=B4(B,WX(J.id)),X={command:"npx",args:["-y","@director.run/cli@latest","http2stdio",Q],env:{LOG_LEVEL:"silent"}};console.log(u2("HTTP Streamable:")+" "+Q),console.log(u2("HTTP SSE:")+" "+Y),console.log(u2("Stdio:"),JSON.stringify(X,null,2)),console.log()}}))}function g41(D){D.debugCommand("test-proxy <proxyId>").description("Run a high level test of a proxy").action(g1(async(F)=>{let w=new q3("proxy-test-client");await w.connectToHTTP(B4($0.GATEWAY_URL,`${F}/mcp`));let{tools:J}=await w.listTools();console.log(),console.log(u2("TOOLS")),console.log(),console.log(J.map((B)=>B.name).join(`
622
622
  `)),console.log(),await w.close()})),D.debugCommand("reset").description("Delete proxies, clear the config file, and reset all clients").action(g1(async({target:F})=>{console.log("resetting service"),await g2.store.purge.mutate(),console.log("resetting clients"),await AE()}))}import f60 from"node:fs";function l41(D){D.command("env").description("Print environment variables").option("--write","Write the environment variables to .env.local in current working directory").action(g1((F)=>{if(F.write){console.log(`writing env vars to '${eJ}'`);let w=Object.entries($0).map(([J,B])=>`${J}=${B}`).join(`
623
- `);f60.writeFileSync(eJ,w)}else jv()&&console.log(l8(`using env file: ${vW()}`)),console.log(),console.log("env",$0)}))}import{exec as m60,execSync as d60}from"node:child_process";import{promisify as k60}from"node:util";var b60=k60(m60),lP0=P1("restartApp");function _u(D){if(process.platform==="win32")return!1;try{return d60(`which ${D}`,{stdio:"pipe"}).toString().trim().length>0}catch(w){return!1}}async function i41(D){if(!D||typeof D!=="string")throw new Error("Invalid URL provided");let F=D.startsWith("http://")||D.startsWith("https://")?D:`https://${D}`,w=process.platform,J;switch(w){case"darwin":J=`open "${F}"`;break;case"win32":J=`start "" "${F}"`;break;case"linux":J=`xdg-open "${F}"`;break;default:throw new Error(`Unsupported platform: ${w}`)}try{await b60(J)}catch(B){throw new Error(`Failed to open URL: ${B instanceof Error?B.message:"Unknown error"}`)}}async function wJ(){return{platform:process.platform,dependencies:[{name:"npx",installed:_u("npx")},{name:"uvx",installed:_u("uvx")}],clients:await CF()}}var s41=O1(o41(),1),r41=P1("http/middleware"),t41=(D,F,w,J)=>{let{status:B,message:Y,code:Q}=r60(D);r41.error({message:`${F.method} ${F.originalUrl} failed: ${Y}`,code:Q}),w.status(B).json({message:Y,code:Q})};function r60(D){if(jH(D))return t60(D);if(jf(D))return{status:D.statusCode,message:D.message};else return{status:500,message:"Something unexpected happened :("}}function t60(D){let F;switch(D.code){case"NOT_FOUND":F=404;break;case"BAD_REQUEST":F=400;break;default:F=500}return{status:F,message:D.message,code:D.code}}function e41(){throw new I1("NOT_FOUND","there's nothing here")}function YJ(D){return(F,w,J)=>{Promise.resolve(D(F,w,J)).catch(J)}}function D81(){return s41.default({logger:r41,useLevel:"trace",autoLogging:{ignore:(D)=>D.originalUrl?.startsWith("/trpc")},serializers:{req:(D)=>({id:D.id,ip:D.ip||D.connection?.remoteAddress,userAgent:D.headers["user-agent"]}),res:(D)=>({status:D.statusCode})},customReceivedMessage:(D)=>`→ ${D.method} ${D.originalUrl}`,customSuccessMessage:(D,F)=>{let w=F.statusCode,J=w>=500?"\uD83D\uDD34":w>=400?"\uD83D\uDFE1":"\uD83D\uDFE2";return`← ${D.method} ${D.originalUrl} ${J} ${w}`},customErrorMessage:(D,F)=>`← ${D.method} ${D.originalUrl} \uD83D\uDD34 ${F.statusCode}`})}var OJ1=O1(AJ1(),1),CJ1=O1(pJ1(),1);import TR from"os";class S5{analytics;machineId;enabled;traits;constructor(D){this.analytics=new OJ1.Analytics({writeKey:D.writeKey}),this.enabled=D.enabled,this.traits=D.traits||{}}async initialize(){if(this.machineId)return;if(this.machineId=await CJ1.machineId(),this.enabled)this.analytics.identify({userId:this.machineId,traits:{...this.traits,os:TR.platform(),osVersion:TR.release(),arch:TR.arch()}})}static noTelemetry(){return new S5({writeKey:"--",enabled:!1})}async trackEvent(D,F={}){if(await this.initialize(),this.enabled)this.analytics.track({userId:this.machineId,event:D,properties:F})}}var iJ1=O1(TJ1(),1),cJ1=O1(OQ(),1);import{existsSync as WQ0}from"node:fs";var I2=t.string().trim().min(1,"Required"),uz=I2.nullish(),DQ0=t.string().trim().min(1,"Required").regex(/^[a-z0-9._-]+$/,"Only lowercase ASCII letters, digits, and characters ., -, _ are allowed"),FQ0=t.object({type:t.literal("http"),url:I2.url(),headers:t.record(I2,t.string()).optional()}),wQ0=t.object({type:t.literal("stdio"),command:I2,args:t.array(t.string()).default([]),env:t.record(I2,t.string()).optional()}),PJ1=t.discriminatedUnion("type",[FQ0,wQ0]),JQ0=t.object({name:I2,description:I2,required:t.boolean(),type:t.enum(["string"]),password:t.boolean().optional()}),BQ0=t.object({name:I2,description:I2,inputSchema:t.object({type:I2,required:t.array(t.string()).optional(),properties:t.record(I2,t.object({type:t.string().optional(),description:t.string().optional(),default:t.unknown().optional(),title:t.string().optional(),anyOf:t.unknown().optional()})).optional()})}),YQ0=t.object({id:I2,name:I2,title:I2,description:I2,icon:uz,createdAt:t.coerce.date().nullable().default(null),isOfficial:t.boolean().nullable().default(null),isEnriched:t.boolean().nullable().default(null),isConnectable:t.boolean().nullable().default(null),lastConnectionAttemptedAt:t.coerce.date().nullable().default(null),lastConnectionError:uz,homepage:I2,transport:PJ1,source_registry:t.any(),categories:t.array(t.string()).nullable().default(null),tools:t.array(BQ0).nullable().default(null),parameters:t.array(JQ0),readme:uz}),QQ0=t.object({name:t.literal("registry"),entryId:I2,entryData:YQ0}),Lz=t.object({name:DQ0,transport:PJ1,source:QQ0.optional(),add_prefix:t.boolean().default(!1).optional()}),XQ0=t.object({id:I2,name:I2,description:uz,servers:t.array(Lz)}),vJ1=t.object({proxies:t.array(XQ0)});var Rz=O1(SJ1(),1);async function IX(D){let F=await UE(D);return vJ1.parse(F)}async function _X(D,F){return await V8(D,F)}class Tz{filePath;constructor(D){this.filePath=D}static async connect(D){let F=new Tz(D);if(!WQ0(D))await _X(D,{proxies:[]});return F}async addProxy(D){let F=await IX(this.filePath);if(F.proxies.find((B)=>B.name===D.name))throw new Error("Proxy already exists");let J={...D,servers:(D.servers||[]).map((B)=>({...B,name:Rz.default(B.name,{lower:!0,strict:!0,trim:!0})})),id:Rz.default(D.name,{lower:!0,strict:!0,trim:!0})};return F.proxies.push(J),await _X(this.filePath,F),J}async getProxy(D){let w=(await IX(this.filePath)).proxies.find((J)=>J.id===D);if(!w)throw new Error("Proxy not found");return w}async deleteProxy(D){let F=await IX(this.filePath);if(!F.proxies.find((J)=>J.id===D))throw new Error("Proxy not found");F.proxies=F.proxies.filter((J)=>J.id!==D),await _X(this.filePath,F)}async updateProxy(D,F){let w=await IX(this.filePath),J=w.proxies.find((B)=>B.id===D);if(!J)throw new Error("Proxy not found");return Object.assign(J,{...F,servers:(F.servers||J.servers||[]).map((B)=>({...B,name:Rz.default(B.name,{lower:!0,trim:!0})}))}),await _X(this.filePath,w),J}async getAll(){return(await IX(this.filePath)).proxies}async purge(){await _X(this.filePath,{proxies:[]})}}var pD=P1("ProxyServerStore");class Pz{proxyServers=new Map;db;telemetry;constructor(D){this.db=D.db,this.telemetry=D.telemetry||S5.noTelemetry()}static async create(D,F){pD.debug("initializing ProxyServerStore");let w=new Pz({db:D,telemetry:F});return await w.initialize(),pD.debug("initialization complete"),w}async initialize(){let D=await this.db.getAll();for(let F of D){let w=F.id;pD.debug({message:`initializing ${w}`,proxyId:w});let J=new lw({id:w,name:F.name,description:F.description??void 0,servers:F.servers});await J.connectTargets(),this.proxyServers.set(w,J)}}get(D){let F=this.proxyServers.get(D);if(!F)throw new I1("NOT_FOUND",`proxy server '${D}' not found or failed to initialize.`);return F}async delete(D){this.telemetry.trackEvent("proxy_deleted"),await this.get(D).close(),await this.db.deleteProxy(D),this.proxyServers.delete(D),pD.info(`successfully deleted proxy server configuration: ${D}`)}async purge(){await this.closeAll(),await this.db.purge(),this.proxyServers.clear()}async closeAll(){pD.info("cleaning up all proxy servers..."),await Promise.all(Array.from(this.proxyServers.values()).map((D)=>D.close())),pD.info("finished cleaning up all proxy servers.")}getAll(){return Array.from(this.proxyServers.values())}async create({name:D,description:F,servers:w,source:J}){this.telemetry.trackEvent("proxy_created");let B=await this.db.addProxy({name:D,description:F,servers:w??[]}),Y=new lw({name:D,id:B.id,servers:B.servers,description:B.description??void 0});return await Y.connectTargets(),this.proxyServers.set(B.id,Y),pD.info({message:"Created new proxy",proxyId:B.id}),Y}async addServer(D,F){this.telemetry.trackEvent("server_added");let w=this.get(D);return await w.addTarget(F,{throwOnError:!0}),await this.db.updateProxy(D,{servers:w.attributes.servers}),w}async removeServer(D,F){this.telemetry.trackEvent("server_removed");let w=this.get(D);return await w.removeTarget(F),await this.db.updateProxy(D,{servers:w.attributes.servers}),w}async update(D,F){this.telemetry.trackEvent("proxy_updated");let w=this.get(D);return await w.update(F),await this.db.updateProxy(D,F),w}}var IJ1=O1(e9(),1),_J1=O1(OV(),1),HQ0="4mb";async function xJ1(D){let F=IJ1.default.parse(D.headers["content-type"]??"");if(F.type!=="application/json")throw new Error(`Unsupported content-type: ${F}`);let w=await _J1.default(D,{limit:HQ0,encoding:F.parameters.charset??"utf-8"});return JSON.parse(w)}var jJ1=O1(OQ(),1),vz=P1("mcp/sse"),fJ1=({proxyStore:D,telemetry:F})=>{let w=jJ1.default.Router(),J=new Map;return w.get("/:proxy_id/sse",YJ(async(B,Y)=>{let Q=B.params.proxy_id,X=D.get(Q),W=new CV(`/${X.id}/message`,Y);J.set(W.sessionId,W),vz.info({message:"SSE connection started",sessionId:W.sessionId,proxyId:X.id,userAgent:B.headers["user-agent"],host:B.headers.host}),F.trackEvent("connection_started",{transport:"sse"}),B.socket.on("close",()=>{vz.info({message:"SSE connection closed",sessionId:W.sessionId,proxyId:X.id}),J.delete(W.sessionId)}),await X.connect(W)})),w.post("/:proxy_id/message",YJ(async(B,Y)=>{let Q=B.params.proxy_id,X=D.get(Q),W=B.query.sessionId?.toString();if(!W)throw new I1("BAD_REQUEST","No sessionId provided");let E=await xJ1(B);vz.info({message:"Message received",proxyId:X.id,sessionId:W,method:E.method,params:E.params});let V=J.get(W);if(!V)throw vz.warn({message:"Transport not found",sessionId:W,proxyId:X.id}),new I1("NOT_FOUND","Transport not found");F.trackEvent("method_called",{method:E.method,transport:"sse"}),await V.handlePostMessage(B,Y,E)})),w};var SR=O1(OQ(),1),xX=P1("mcp/streamable"),mJ1=({proxyStore:D,telemetry:F})=>{let w=SR.default.Router(),J=new Map;w.use(SR.default.json()),w.post("/:proxy_id/mcp",YJ(async(Y,Q)=>{let X=Y.params.proxy_id,W=await D.get(X),E=Y.headers["mcp-session-id"],V;if(E&&J.has(E)){let K=J.get(E);if(!K)throw new I1("NOT_FOUND","Transport not found");V=K}else if(!E&&GY(Y.body))xX.info(`[${W.id}] new initialization request`),F.trackEvent("connection_started",{transport:"streamable"}),V=new uV({sessionIdGenerator:()=>crypto.randomUUID(),onsessioninitialized:(K)=>{J.set(K,V)}}),V.onclose=()=>{if(xX.info(`[${W.id}] transport closed`,{proxyId:W.id,sessionId:V.sessionId}),V.sessionId)J.delete(V.sessionId)},Y.socket.on("close",()=>{xX.info(`[${W.id}] socket closed'`,{proxyId:W.id,sessionId:V.sessionId})}),await W.connect(V);else throw new I1("BAD_REQUEST","No valid session ID provided");xX.info({message:`[${W.id}] '${Y.body.method}' called`,proxyId:W.id,sessionId:V.sessionId,method:Y.body.method,body:Y.body}),F.trackEvent("method_called",{method:Y.body.method,transport:"streamable"}),await V.handleRequest(Y,Q,Y.body)}));let B=YJ(async(Y,Q)=>{let X=Y.params.proxy_id,W=D.get(X),E=Y.headers["mcp-session-id"];if(!E||!J.has(E))throw new I1("BAD_REQUEST","Invalid or missing session ID");let V=J.get(E);if(!V)throw new I1("NOT_FOUND","Transport not found");let K=V;xX.info({message:"MCP handleSessionRequest",proxyId:W.id,sessionId:K.sessionId,body:Y.body}),await K.handleRequest(Y,Q)});return w.get("/:proxy_id/mcp",B),w.delete("/:proxy_id/mcp",B),w};function EQ0(D,F){if("body"in D){if(D.body===void 0)return;if(typeof D.body==="string")return D.body;return JSON.stringify(D.body)}let w=0,J=!1;return new ReadableStream({start(B){let Y=(X)=>{if(w+=X.length,!F.maxBodySize||w<=F.maxBodySize){B.enqueue(new Uint8Array(X.buffer,X.byteOffset,X.byteLength));return}B.error(new p0({code:"PAYLOAD_TOO_LARGE"})),J=!0,D.off("data",Y),D.off("end",Q)},Q=()=>{if(J)return;J=!0,D.off("data",Y),D.off("end",Q),B.close()};D.on("data",Y),D.on("end",Q)},cancel(){D.destroy()}})}function VQ0(D){try{var F,w;let J=D.headers[":scheme"]&&D.headers[":scheme"]==="https"||D.socket&&"encrypted"in D.socket&&D.socket.encrypted?"https:":"http:",B=(F=(w=D.headers.host)!==null&&w!==void 0?w:D.headers[":authority"])!==null&&F!==void 0?F:"localhost";return new URL(D.url,`${J}//${B}`)}catch(J){throw new p0({code:"BAD_REQUEST",message:"Invalid URL",cause:J})}}function GQ0(D){let F=new Headers;for(let w in D){let J=D[w];if(typeof w==="string"&&w.startsWith(":"))continue;if(Array.isArray(J))for(let B of J)F.append(w,B);else if(J!=null)F.append(w,J)}return F}function KQ0(D,F,w){let J=new AbortController,B=()=>{F.off("close",B),D.off("aborted",B),J.abort()};F.once("close",B),D.once("aborted",B);let Y=VQ0(D),Q={headers:GQ0(D.headers),method:D.method,signal:J.signal};if(D.method!=="GET"&&D.method!=="HEAD")Q.body=EQ0(D,w),Q.duplex="half";return new Request(Y,Q)}async function zQ0(D,F){if(D.write(F)===!1)await new Promise((w,J)=>{let B=(X)=>{J(X),Q()},Y=()=>{w(),Q()},Q=()=>{D.off("error",B),D.off("drain",Y)};D.once("error",B),D.once("drain",Y)})}async function NQ0(D){let{res:F}=D;try{let w=new WritableStream({async write(J){var B;await zQ0(F,J),(B=F.flush)===null||B===void 0||B.call(F)}});await D.body.pipeTo(w,{signal:D.signal})}catch(w){if(PE(w))return;throw w}}async function UQ0(D){let{response:F,rawResponse:w}=D;if(w.statusCode===200)w.statusCode=F.status;for(let[J,B]of F.headers)w.setHeader(J,B);try{if(F.body)await NQ0({res:w,signal:D.request.signal,body:F.body})}catch(J){if(!w.headersSent)w.statusCode=500;throw J}finally{w.end()}}var ZJ=r1(R6(),1);function IR(D){return(F)=>{var w;let{res:J,req:B}=D,Y=G6(F),Q=D3({config:D.router._def._config,error:Y,type:"unknown",path:void 0,input:void 0,ctx:void 0});(w=D.onError)===null||w===void 0||w.call(D,{req:B,error:Y,type:"unknown",path:void 0,input:void 0,ctx:void 0});let X=C7(D.router._def._config,{error:Q});J.statusCode=Q.data.httpStatus,J.end(JSON.stringify(X))}}async function dJ1(D){return new Promise((F)=>{var w;let J=(w=D.middleware)!==null&&w!==void 0?w:(B,Y,Q)=>Q();return D.res.once("finish",()=>{F()}),J(D.req,D.res,(B)=>{K8(async()=>{var Y;let Q=KQ0(D.req,D.res,{maxBodySize:(Y=D.maxBodySize)!==null&&Y!==void 0?Y:null}),X=async(E)=>{var V;return await((V=D.createContext)===null||V===void 0?void 0:V.call(D,ZJ.default(ZJ.default({},D),E)))},W=await Ah(ZJ.default(ZJ.default({},D),{},{req:Q,error:B?G6(B):null,createContext:X,onError(E){var V;D===null||D===void 0||(V=D.onError)===null||V===void 0||V.call(D,ZJ.default(ZJ.default({},E),{},{req:D.req}))}}));await UQ0({request:Q,response:W,rawResponse:D.res})}).catch(IR(D))})})}var _R=r1(R6(),1);function kJ1(D){return(F,w)=>{let J="";K8(async()=>{J=F.path.slice(F.path.lastIndexOf("/")+1),await dJ1(_R.default(_R.default({},D),{},{req:F,res:w,path:J}))}).catch(IR(_R.default({req:F,res:w,path:J},D)))}}function bJ1({proxyStore:D}){return h0.router({allClients:h0.procedure.query(()=>CF()),byProxy:h0.router({list:h0.procedure.input(t.object({proxyId:t.string()})).query(async({input:F})=>{return await Ib(F.proxyId)}),install:h0.procedure.input(t.object({client:t.nativeEnum(bB),proxyId:t.string(),baseUrl:t.string()})).mutation(async({input:F})=>{let w=D.get(F.proxyId);await(await e2(F.client)).install({name:w.id,url:B4(F.baseUrl,HX(w.id))})}),uninstall:h0.procedure.input(t.object({client:t.nativeEnum(bB),proxyId:t.string()})).mutation(async({input:F})=>{let w=D.get(F.proxyId);await(await e2(F.client)).uninstall(w.id)})})})}function hJ1({registryURL:D,proxyStore:F}){let w=CK(D);return h0.router({getEntries:h0.procedure.input(t.object({pageIndex:t.number().min(0),pageSize:t.number().min(1)})).query(({input:J})=>w.entries.getEntries.query(J)),getEntryByName:h0.procedure.input(t.object({name:t.string()})).query(({input:J})=>w.entries.getEntryByName.query(J)),getTransportForEntry:h0.procedure.input(t.object({entryName:t.string(),parameters:t.record(t.string(),t.string()).optional()})).mutation(async({input:J})=>{return await w.entries.getTransportForEntry.query({entryName:J.entryName,parameters:J.parameters})})})}var yJ1=t.object({name:t.string(),description:t.string().optional(),servers:t.array(Lz).optional()}),qQ0=yJ1.omit({servers:!0}).partial();function gJ1({proxyStore:D}){return h0.router({getAll:h0.procedure.query(async()=>{return(await D.getAll()).map((F)=>({...F.toPlainObject(),path:WX(F.id)}))}),get:h0.procedure.input(t.object({proxyId:t.string()})).query(({input:F})=>{return{...D.get(F.proxyId).toPlainObject(),path:WX(F.proxyId)}}),create:h0.procedure.input(yJ1).mutation(async({input:F})=>{return(await D.create({name:F.name,description:F.description??void 0,servers:F.servers})).toPlainObject()}),update:h0.procedure.input(t.object({proxyId:t.string(),attributes:qQ0})).mutation(async({input:F})=>{return(await D.update(F.proxyId,{name:F.attributes.name,description:F.attributes.description??void 0})).toPlainObject()}),delete:h0.procedure.input(t.object({proxyId:t.string()})).mutation(async({input:F})=>{return await D.delete(F.proxyId),{success:!0}}),addServer:h0.procedure.input(t.object({proxyId:t.string(),server:Lz})).mutation(async({input:F})=>{let w=await D.addServer(F.proxyId,F.server);return await Iu(w),w.toPlainObject()}),purge:h0.procedure.mutation(()=>D.purge()),removeServer:h0.procedure.input(t.object({proxyId:t.string(),serverName:t.string()})).mutation(async({input:F})=>{let w=await D.removeServer(F.proxyId,F.serverName);return await Iu(w),w.toPlainObject()})})}function MQ0({proxyStore:D,registryURL:F}){return h0.router({health:h0.procedure.query(()=>wJ()),store:gJ1({proxyStore:D}),installer:bJ1({proxyStore:D}),registry:hJ1({registryURL:F,proxyStore:D})})}function lJ1({proxyStore:D,registryURL:F}){return kJ1({router:MQ0({proxyStore:D,registryURL:F})})}var xR=P1("Gateway");class Sz{proxyStore;port;server;constructor(D){this.port=D.port,this.proxyStore=D.proxyStore,this.server=D.server}static async start(D,F){xR.info("starting director gateway");let w=await Tz.connect(D.databaseFilePath),J=D.telemetry||S5.noTelemetry(),B=await Pz.create(w,J),Y=cJ1.default(),Q=D.registryURL;Y.use(iJ1.default({origin:D.allowedOrigins})),Y.use(D81()),Y.use("/",fJ1({proxyStore:B,telemetry:J})),Y.use("/",mJ1({proxyStore:B,telemetry:J})),Y.use("/trpc",lJ1({proxyStore:B,registryURL:Q})),Y.all("*",e41),Y.use(t41),J.trackEvent("gateway_start");let X=Y.listen(D.port,()=>{xR.info(`director gateway running on port ${D.port}`),F?.()}),W=new Sz({port:D.port,db:w,proxyStore:B,server:X});return process.on("SIGINT",async()=>{xR.info("received SIGINT, cleaning up proxy servers..."),await W.stop(),process.exit(0)}),W}async stop(){await this.proxyStore.closeAll(),await new Promise((D)=>{this.server.closeAllConnections(),this.server.close(()=>D())})}}function aJ1(D){D.command("serve").description("Start the web service").action(g1(async()=>{try{await jR()}catch(F){console.error("Fatal error starting gateway",F),process.exit(1)}}))}async function jR(D){console.log(`v${f9.version}`),xy(),await Sz.start({port:$0.GATEWAY_PORT,databaseFilePath:$0.CONFIG_FILE_PATH,registryURL:$0.REGISTRY_API_URL,allowedOrigins:[$0.STUDIO_URL,/^https?:\/\/localhost(:\d+)?$/],telemetry:new S5({writeKey:$0.SEGMENT_WRITE_KEY,enabled:$0.SEND_TELEMETRY,traits:{cliVersion:f9.version}})},D)}function nJ1(D){D.command("studio").description("Open the UI in your browser").action(g1(async()=>{let F=DX();F.start("opening studio...");try{await g2.health.query()}catch(w){F.fail("Failed to connect to gateway. Have you ran `director serve`?"),process.exit(1)}try{fR()}catch(w){F.fail(`failed to open ${$0.STUDIO_URL}, try manually`)}F.stop()}))}async function fR(){await i41($0.STUDIO_URL)}var AQ0=P1("quickstart");function sJ1(D){D.command("quickstart").description("Start the gateway and open the studio in your browser").action(g1(async()=>{await pQ0(),await jR(async()=>{AQ0.info(`gateway started, opening ${$0.STUDIO_URL} in your browser...`),await fR()})}))}async function pQ0(){let D=DX();D.start("checking prerequisites...");let F=await wJ();D.stop();let w=[],J=[];w.push(""),w.push(u2("Dependency Check")),w.push("The following dependencies are required by some MCP servers that use Stdout. It's best to have them all installed."),w.push("");for(let Q of F.dependencies)w.push(oJ1({name:Q.name,installed:Q.installed,successText:`${Q.name} is installed`,failureText:`${Q.name} is not available in $PATH. ${OQ0(Q)}`}));if(F.dependencies.filter((Q)=>Q.installed).length<F.dependencies.length)J.push("Some dependencies are not available in $PATH, MCP servers that depend on them will not work.");w.push(""),w.push(u2("MCP Clients Check")),w.push("Director can automatically configure the following MCP clients for you. It's best to have at least one installed."),w.push("");for(let Q of F.clients)w.push(oJ1({name:Q.name,installed:Q.installed}));if(F.clients.filter((Q)=>Q.installed).length===0)J.push("No MCP clients found. It's best to have at least one MCP client installed in order to use the automatic client configuration.");if(w.push(""),w.push(u2("Summary")),w.push(""),console.log(w.join(`
623
+ `);f60.writeFileSync(eJ,w)}else jv()&&console.log(l8(`using env file: ${vW()}`)),console.log(),console.log("env",$0)}))}import{exec as m60,execSync as d60}from"node:child_process";import{promisify as k60}from"node:util";var b60=k60(m60),lP0=P1("restartApp");function _u(D){if(process.platform==="win32")return!1;try{return d60(`which ${D}`,{stdio:"pipe"}).toString().trim().length>0}catch(w){return!1}}async function i41(D){if(!D||typeof D!=="string")throw new Error("Invalid URL provided");let F=D.startsWith("http://")||D.startsWith("https://")?D:`https://${D}`,w=process.platform,J;switch(w){case"darwin":J=`open "${F}"`;break;case"win32":J=`start "" "${F}"`;break;case"linux":J=`xdg-open "${F}"`;break;default:throw new Error(`Unsupported platform: ${w}`)}try{await b60(J)}catch(B){throw new Error(`Failed to open URL: ${B instanceof Error?B.message:"Unknown error"}`)}}async function wJ(){return{platform:process.platform,dependencies:[{name:"npx",installed:_u("npx")},{name:"uvx",installed:_u("uvx")}],clients:await CF()}}var s41=O1(o41(),1),r41=P1("http/middleware"),t41=(D,F,w,J)=>{let{status:B,message:Y,code:Q}=r60(D);r41.error({message:`${F.method} ${F.originalUrl} failed: ${Y}`,code:Q}),w.status(B).json({message:Y,code:Q})};function r60(D){if(jH(D))return t60(D);if(jf(D))return{status:D.statusCode,message:D.message};else return{status:500,message:"Something unexpected happened :("}}function t60(D){let F;switch(D.code){case"NOT_FOUND":F=404;break;case"BAD_REQUEST":F=400;break;default:F=500}return{status:F,message:D.message,code:D.code}}function e41(){throw new I1("NOT_FOUND","there's nothing here")}function YJ(D){return(F,w,J)=>{Promise.resolve(D(F,w,J)).catch(J)}}function D81(){return s41.default({logger:r41,useLevel:"trace",autoLogging:{ignore:(D)=>D.originalUrl?.startsWith("/trpc")},serializers:{req:(D)=>({id:D.id,ip:D.ip||D.connection?.remoteAddress,userAgent:D.headers["user-agent"]}),res:(D)=>({status:D.statusCode})},customReceivedMessage:(D)=>`→ ${D.method} ${D.originalUrl}`,customSuccessMessage:(D,F)=>{let w=F.statusCode,J=w>=500?"\uD83D\uDD34":w>=400?"\uD83D\uDFE1":"\uD83D\uDFE2";return`← ${D.method} ${D.originalUrl} ${J} ${w}`},customErrorMessage:(D,F)=>`← ${D.method} ${D.originalUrl} \uD83D\uDD34 ${F.statusCode}`})}var OJ1=O1(AJ1(),1),CJ1=O1(pJ1(),1);import TR from"os";class S5{analytics;machineId;enabled;traits;constructor(D){this.analytics=new OJ1.Analytics({writeKey:D.writeKey}),this.enabled=D.enabled,this.traits=D.traits||{}}async initialize(){if(this.machineId)return;if(this.machineId=await CJ1.machineId(),this.enabled)this.analytics.identify({userId:this.machineId,traits:{...this.traits,os:TR.platform(),osVersion:TR.release(),arch:TR.arch()}})}static noTelemetry(){return new S5({writeKey:"--",enabled:!1})}async trackEvent(D,F={}){if(await this.initialize(),this.enabled)this.analytics.track({userId:this.machineId,event:D,properties:F})}}var iJ1=O1(TJ1(),1),cJ1=O1(OQ(),1);import{existsSync as WQ0}from"node:fs";var I2=t.string().trim().min(1,"Required"),uz=I2.nullish(),DQ0=t.string().trim().min(1,"Required").regex(/^[a-z0-9._-]+$/,"Only lowercase ASCII letters, digits, and characters ., -, _ are allowed"),FQ0=t.object({type:t.literal("http"),url:I2.url(),headers:t.record(I2,t.string()).optional()}),wQ0=t.object({type:t.literal("stdio"),command:I2,args:t.array(t.string()).default([]),env:t.record(I2,t.string()).optional()}),PJ1=t.discriminatedUnion("type",[FQ0,wQ0]),JQ0=t.object({name:I2,description:I2,required:t.boolean(),type:t.enum(["string"]),password:t.boolean().optional()}),BQ0=t.object({name:I2,description:I2,inputSchema:t.object({type:I2,required:t.array(t.string()).optional(),properties:t.record(I2,t.object({type:t.string().optional(),description:t.string().optional(),default:t.unknown().optional(),title:t.string().optional(),anyOf:t.unknown().optional()})).optional()})}),YQ0=t.object({id:I2,name:I2,title:I2,description:I2,icon:uz,createdAt:t.coerce.date().nullable().default(null),isOfficial:t.boolean().nullable().default(null),isEnriched:t.boolean().nullable().default(null),isConnectable:t.boolean().nullable().default(null),lastConnectionAttemptedAt:t.coerce.date().nullable().default(null),lastConnectionError:uz,homepage:I2,transport:PJ1,source_registry:t.any(),categories:t.array(t.string()).nullable().default(null),tools:t.array(BQ0).nullable().default(null),parameters:t.array(JQ0),readme:uz}),QQ0=t.object({name:t.literal("registry"),entryId:I2,entryData:YQ0}),Lz=t.object({name:DQ0,transport:PJ1,source:QQ0.optional(),add_prefix:t.boolean().default(!1).optional()}),XQ0=t.object({id:I2,name:I2,description:uz,servers:t.array(Lz)}),vJ1=t.object({proxies:t.array(XQ0)});var Rz=O1(SJ1(),1);async function IX(D){let F=await UE(D);return vJ1.parse(F)}async function _X(D,F){return await V8(D,F)}class Tz{filePath;constructor(D){this.filePath=D}static async connect(D){let F=new Tz(D);if(!WQ0(D))await _X(D,{proxies:[]});return F}async addProxy(D){let F=await IX(this.filePath);if(F.proxies.find((B)=>B.name===D.name))throw new Error("Proxy already exists");let J={...D,servers:(D.servers||[]).map((B)=>({...B,name:Rz.default(B.name,{lower:!0,strict:!0,trim:!0})})),id:Rz.default(D.name,{lower:!0,strict:!0,trim:!0})};return F.proxies.push(J),await _X(this.filePath,F),J}async getProxy(D){let w=(await IX(this.filePath)).proxies.find((J)=>J.id===D);if(!w)throw new Error("Proxy not found");return w}async deleteProxy(D){let F=await IX(this.filePath);if(!F.proxies.find((J)=>J.id===D))throw new Error("Proxy not found");F.proxies=F.proxies.filter((J)=>J.id!==D),await _X(this.filePath,F)}async updateProxy(D,F){let w=await IX(this.filePath),J=w.proxies.find((B)=>B.id===D);if(!J)throw new Error("Proxy not found");return Object.assign(J,{...F,servers:(F.servers||J.servers||[]).map((B)=>({...B,name:Rz.default(B.name,{lower:!0,trim:!0})}))}),await _X(this.filePath,w),J}async getAll(){return(await IX(this.filePath)).proxies}async purge(){await _X(this.filePath,{proxies:[]})}}var pD=P1("ProxyServerStore");class Pz{proxyServers=new Map;db;telemetry;constructor(D){this.db=D.db,this.telemetry=D.telemetry||S5.noTelemetry()}static async create(D,F){pD.debug("initializing ProxyServerStore");let w=new Pz({db:D,telemetry:F});return await w.initialize(),pD.debug("initialization complete"),w}async initialize(){let D=await this.db.getAll();for(let F of D){let w=F.id;pD.debug({message:`initializing ${w}`,proxyId:w});let J=new lw({id:w,name:F.name,description:F.description??void 0,servers:F.servers});await J.connectTargets(),this.proxyServers.set(w,J)}}get(D){let F=this.proxyServers.get(D);if(!F)throw new I1("NOT_FOUND",`proxy server '${D}' not found or failed to initialize.`);return F}async delete(D){this.telemetry.trackEvent("proxy_deleted"),await this.get(D).close(),await this.db.deleteProxy(D),this.proxyServers.delete(D),pD.info(`successfully deleted proxy server configuration: ${D}`)}async purge(){await this.closeAll(),await this.db.purge(),this.proxyServers.clear()}async closeAll(){pD.info("cleaning up all proxy servers..."),await Promise.all(Array.from(this.proxyServers.values()).map((D)=>D.close())),pD.info("finished cleaning up all proxy servers.")}getAll(){return Array.from(this.proxyServers.values())}async create({name:D,description:F,servers:w,source:J}){this.telemetry.trackEvent("proxy_created");let B=await this.db.addProxy({name:D,description:F,servers:w??[]}),Y=new lw({name:D,id:B.id,servers:B.servers,description:B.description??void 0});return await Y.connectTargets(),this.proxyServers.set(B.id,Y),pD.info({message:"Created new proxy",proxyId:B.id}),Y}async addServer(D,F){this.telemetry.trackEvent("server_added");let w=this.get(D);return await w.addTarget(F,{throwOnError:!0}),await this.db.updateProxy(D,{servers:w.attributes.servers}),w}async removeServer(D,F){this.telemetry.trackEvent("server_removed");let w=this.get(D);return await w.removeTarget(F),await this.db.updateProxy(D,{servers:w.attributes.servers}),w}async update(D,F){this.telemetry.trackEvent("proxy_updated");let w=this.get(D);return await w.update(F),await this.db.updateProxy(D,F),w}}var IJ1=O1(e9(),1),_J1=O1(OV(),1),HQ0="4mb";async function xJ1(D){let F=IJ1.default.parse(D.headers["content-type"]??"");if(F.type!=="application/json")throw new Error(`Unsupported content-type: ${F}`);let w=await _J1.default(D,{limit:HQ0,encoding:F.parameters.charset??"utf-8"});return JSON.parse(w)}var jJ1=O1(OQ(),1),vz=P1("mcp/sse"),fJ1=({proxyStore:D,telemetry:F})=>{let w=jJ1.default.Router(),J=new Map;return w.get("/:proxy_id/sse",YJ(async(B,Y)=>{let Q=B.params.proxy_id,X=D.get(Q),W=new CV(`/${X.id}/message`,Y);J.set(W.sessionId,W),vz.info({message:"SSE connection started",sessionId:W.sessionId,proxyId:X.id,userAgent:B.headers["user-agent"],host:B.headers.host}),F.trackEvent("connection_started",{transport:"sse"}),B.socket.on("close",()=>{vz.info({message:"SSE connection closed",sessionId:W.sessionId,proxyId:X.id}),J.delete(W.sessionId)}),await X.connect(W)})),w.post("/:proxy_id/message",YJ(async(B,Y)=>{let Q=B.params.proxy_id,X=D.get(Q),W=B.query.sessionId?.toString();if(!W)throw new I1("BAD_REQUEST","No sessionId provided");let E=await xJ1(B);vz.info({message:"Message received",proxyId:X.id,sessionId:W,method:E.method,params:E.params});let V=J.get(W);if(!V)throw vz.warn({message:"Transport not found",sessionId:W,proxyId:X.id}),new I1("NOT_FOUND","Transport not found");F.trackEvent("method_called",{method:E.method,transport:"sse"}),await V.handlePostMessage(B,Y,E)})),w};var SR=O1(OQ(),1),xX=P1("mcp/streamable"),mJ1=({proxyStore:D,telemetry:F})=>{let w=SR.default.Router(),J=new Map;w.use(SR.default.json()),w.post("/:proxy_id/mcp",YJ(async(Y,Q)=>{let X=Y.params.proxy_id,W=await D.get(X),E=Y.headers["mcp-session-id"],V;if(E&&J.has(E)){let K=J.get(E);if(!K)throw new I1("NOT_FOUND","Transport not found");V=K}else if(!E&&GY(Y.body))xX.info(`[${W.id}] new initialization request`),F.trackEvent("connection_started",{transport:"streamable"}),V=new uV({sessionIdGenerator:()=>crypto.randomUUID(),onsessioninitialized:(K)=>{J.set(K,V)}}),V.onclose=()=>{if(xX.info(`[${W.id}] transport closed`,{proxyId:W.id,sessionId:V.sessionId}),V.sessionId)J.delete(V.sessionId)},Y.socket.on("close",()=>{xX.info(`[${W.id}] socket closed'`,{proxyId:W.id,sessionId:V.sessionId})}),await W.connect(V);else throw new I1("BAD_REQUEST","No valid session ID provided");xX.info({message:`[${W.id}] '${Y.body.method}' called`,proxyId:W.id,sessionId:V.sessionId,method:Y.body.method,body:Y.body}),F.trackEvent("method_called",{method:Y.body.method,transport:"streamable"}),await V.handleRequest(Y,Q,Y.body)}));let B=YJ(async(Y,Q)=>{let X=Y.params.proxy_id,W=D.get(X),E=Y.headers["mcp-session-id"];if(!E||!J.has(E))throw new I1("BAD_REQUEST","Invalid or missing session ID");let V=J.get(E);if(!V)throw new I1("NOT_FOUND","Transport not found");let K=V;xX.info({message:"MCP handleSessionRequest",proxyId:W.id,sessionId:K.sessionId,body:Y.body}),await K.handleRequest(Y,Q)});return w.get("/:proxy_id/mcp",B),w.delete("/:proxy_id/mcp",B),w};function EQ0(D,F){if("body"in D){if(D.body===void 0)return;if(typeof D.body==="string")return D.body;return JSON.stringify(D.body)}let w=0,J=!1;return new ReadableStream({start(B){let Y=(X)=>{if(w+=X.length,!F.maxBodySize||w<=F.maxBodySize){B.enqueue(new Uint8Array(X.buffer,X.byteOffset,X.byteLength));return}B.error(new p0({code:"PAYLOAD_TOO_LARGE"})),J=!0,D.off("data",Y),D.off("end",Q)},Q=()=>{if(J)return;J=!0,D.off("data",Y),D.off("end",Q),B.close()};D.on("data",Y),D.on("end",Q)},cancel(){D.destroy()}})}function VQ0(D){try{var F,w;let J=D.headers[":scheme"]&&D.headers[":scheme"]==="https"||D.socket&&"encrypted"in D.socket&&D.socket.encrypted?"https:":"http:",B=(F=(w=D.headers.host)!==null&&w!==void 0?w:D.headers[":authority"])!==null&&F!==void 0?F:"localhost";return new URL(D.url,`${J}//${B}`)}catch(J){throw new p0({code:"BAD_REQUEST",message:"Invalid URL",cause:J})}}function GQ0(D){let F=new Headers;for(let w in D){let J=D[w];if(typeof w==="string"&&w.startsWith(":"))continue;if(Array.isArray(J))for(let B of J)F.append(w,B);else if(J!=null)F.append(w,J)}return F}function KQ0(D,F,w){let J=new AbortController,B=()=>{F.off("close",B),D.off("aborted",B),J.abort()};F.once("close",B),D.once("aborted",B);let Y=VQ0(D),Q={headers:GQ0(D.headers),method:D.method,signal:J.signal};if(D.method!=="GET"&&D.method!=="HEAD")Q.body=EQ0(D,w),Q.duplex="half";return new Request(Y,Q)}async function zQ0(D,F){if(D.write(F)===!1)await new Promise((w,J)=>{let B=(X)=>{J(X),Q()},Y=()=>{w(),Q()},Q=()=>{D.off("error",B),D.off("drain",Y)};D.once("error",B),D.once("drain",Y)})}async function NQ0(D){let{res:F}=D;try{let w=new WritableStream({async write(J){var B;await zQ0(F,J),(B=F.flush)===null||B===void 0||B.call(F)}});await D.body.pipeTo(w,{signal:D.signal})}catch(w){if(PE(w))return;throw w}}async function UQ0(D){let{response:F,rawResponse:w}=D;if(w.statusCode===200)w.statusCode=F.status;for(let[J,B]of F.headers)w.setHeader(J,B);try{if(F.body)await NQ0({res:w,signal:D.request.signal,body:F.body})}catch(J){if(!w.headersSent)w.statusCode=500;throw J}finally{w.end()}}var ZJ=r1(R6(),1);function IR(D){return(F)=>{var w;let{res:J,req:B}=D,Y=G6(F),Q=D3({config:D.router._def._config,error:Y,type:"unknown",path:void 0,input:void 0,ctx:void 0});(w=D.onError)===null||w===void 0||w.call(D,{req:B,error:Y,type:"unknown",path:void 0,input:void 0,ctx:void 0});let X=C7(D.router._def._config,{error:Q});J.statusCode=Q.data.httpStatus,J.end(JSON.stringify(X))}}async function dJ1(D){return new Promise((F)=>{var w;let J=(w=D.middleware)!==null&&w!==void 0?w:(B,Y,Q)=>Q();return D.res.once("finish",()=>{F()}),J(D.req,D.res,(B)=>{K8(async()=>{var Y;let Q=KQ0(D.req,D.res,{maxBodySize:(Y=D.maxBodySize)!==null&&Y!==void 0?Y:null}),X=async(E)=>{var V;return await((V=D.createContext)===null||V===void 0?void 0:V.call(D,ZJ.default(ZJ.default({},D),E)))},W=await Ah(ZJ.default(ZJ.default({},D),{},{req:Q,error:B?G6(B):null,createContext:X,onError(E){var V;D===null||D===void 0||(V=D.onError)===null||V===void 0||V.call(D,ZJ.default(ZJ.default({},E),{},{req:D.req}))}}));await UQ0({request:Q,response:W,rawResponse:D.res})}).catch(IR(D))})})}var _R=r1(R6(),1);function kJ1(D){return(F,w)=>{let J="";K8(async()=>{J=F.path.slice(F.path.lastIndexOf("/")+1),await dJ1(_R.default(_R.default({},D),{},{req:F,res:w,path:J}))}).catch(IR(_R.default({req:F,res:w,path:J},D)))}}function bJ1({proxyStore:D}){return h0.router({allClients:h0.procedure.query(()=>CF()),byProxy:h0.router({list:h0.procedure.input(t.object({proxyId:t.string()})).query(async({input:F})=>{return await Ib(F.proxyId)}),install:h0.procedure.input(t.object({client:t.nativeEnum(bB),proxyId:t.string(),baseUrl:t.string()})).mutation(async({input:F})=>{let w=D.get(F.proxyId);await(await e2(F.client)).install({name:w.id,url:B4(F.baseUrl,HX(w.id))})}),uninstall:h0.procedure.input(t.object({client:t.nativeEnum(bB),proxyId:t.string()})).mutation(async({input:F})=>{let w=D.get(F.proxyId);await(await e2(F.client)).uninstall(w.id)})})})}function hJ1({registryURL:D,proxyStore:F}){let w=CK(D);return h0.router({getEntries:h0.procedure.input(t.object({pageIndex:t.number().min(0),pageSize:t.number().min(1),searchQuery:t.string().trim().optional()})).query(({input:J})=>w.entries.getEntries.query(J)),getEntryByName:h0.procedure.input(t.object({name:t.string()})).query(({input:J})=>w.entries.getEntryByName.query(J)),getTransportForEntry:h0.procedure.input(t.object({entryName:t.string(),parameters:t.record(t.string(),t.string()).optional()})).mutation(async({input:J})=>{return await w.entries.getTransportForEntry.query({entryName:J.entryName,parameters:J.parameters})})})}var yJ1=t.object({name:t.string(),description:t.string().optional(),servers:t.array(Lz).optional()}),qQ0=yJ1.omit({servers:!0}).partial();function gJ1({proxyStore:D}){return h0.router({getAll:h0.procedure.query(async()=>{return(await D.getAll()).map((F)=>({...F.toPlainObject(),path:WX(F.id)}))}),get:h0.procedure.input(t.object({proxyId:t.string()})).query(({input:F})=>{return{...D.get(F.proxyId).toPlainObject(),path:WX(F.proxyId)}}),create:h0.procedure.input(yJ1).mutation(async({input:F})=>{return(await D.create({name:F.name,description:F.description??void 0,servers:F.servers})).toPlainObject()}),update:h0.procedure.input(t.object({proxyId:t.string(),attributes:qQ0})).mutation(async({input:F})=>{return(await D.update(F.proxyId,{name:F.attributes.name,description:F.attributes.description??void 0})).toPlainObject()}),delete:h0.procedure.input(t.object({proxyId:t.string()})).mutation(async({input:F})=>{return await D.delete(F.proxyId),{success:!0}}),addServer:h0.procedure.input(t.object({proxyId:t.string(),server:Lz})).mutation(async({input:F})=>{let w=await D.addServer(F.proxyId,F.server);return await Iu(w),w.toPlainObject()}),purge:h0.procedure.mutation(()=>D.purge()),removeServer:h0.procedure.input(t.object({proxyId:t.string(),serverName:t.string()})).mutation(async({input:F})=>{let w=await D.removeServer(F.proxyId,F.serverName);return await Iu(w),w.toPlainObject()})})}function MQ0({proxyStore:D,registryURL:F}){return h0.router({health:h0.procedure.query(()=>wJ()),store:gJ1({proxyStore:D}),installer:bJ1({proxyStore:D}),registry:hJ1({registryURL:F,proxyStore:D})})}function lJ1({proxyStore:D,registryURL:F}){return kJ1({router:MQ0({proxyStore:D,registryURL:F})})}var xR=P1("Gateway");class Sz{proxyStore;port;server;constructor(D){this.port=D.port,this.proxyStore=D.proxyStore,this.server=D.server}static async start(D,F){xR.info("starting director gateway");let w=await Tz.connect(D.databaseFilePath),J=D.telemetry||S5.noTelemetry(),B=await Pz.create(w,J),Y=cJ1.default(),Q=D.registryURL;Y.use(iJ1.default({origin:D.allowedOrigins})),Y.use(D81()),Y.use("/",fJ1({proxyStore:B,telemetry:J})),Y.use("/",mJ1({proxyStore:B,telemetry:J})),Y.use("/trpc",lJ1({proxyStore:B,registryURL:Q})),Y.all("*",e41),Y.use(t41),J.trackEvent("gateway_start");let X=Y.listen(D.port,()=>{xR.info(`director gateway running on port ${D.port}`),F?.()}),W=new Sz({port:D.port,db:w,proxyStore:B,server:X});return process.on("SIGINT",async()=>{xR.info("received SIGINT, cleaning up proxy servers..."),await W.stop(),process.exit(0)}),W}async stop(){await this.proxyStore.closeAll(),await new Promise((D)=>{this.server.closeAllConnections(),this.server.close(()=>D())})}}function aJ1(D){D.command("serve").description("Start the web service").action(g1(async()=>{try{await jR()}catch(F){console.error("Fatal error starting gateway",F),process.exit(1)}}))}async function jR(D){console.log(`v${f9.version}`),xy(),await Sz.start({port:$0.GATEWAY_PORT,databaseFilePath:$0.CONFIG_FILE_PATH,registryURL:$0.REGISTRY_API_URL,allowedOrigins:[$0.STUDIO_URL,/^https?:\/\/localhost(:\d+)?$/],telemetry:new S5({writeKey:$0.SEGMENT_WRITE_KEY,enabled:$0.SEND_TELEMETRY,traits:{cliVersion:f9.version}})},D)}function nJ1(D){D.command("studio").description("Open the UI in your browser").action(g1(async()=>{let F=DX();F.start("opening studio...");try{await g2.health.query()}catch(w){F.fail("Failed to connect to gateway. Have you ran `director serve`?"),process.exit(1)}try{fR()}catch(w){F.fail(`failed to open ${$0.STUDIO_URL}, try manually`)}F.stop()}))}async function fR(){await i41($0.STUDIO_URL)}var AQ0=P1("quickstart");function sJ1(D){D.command("quickstart").description("Start the gateway and open the studio in your browser").action(g1(async()=>{await pQ0(),await jR(async()=>{AQ0.info(`gateway started, opening ${$0.STUDIO_URL} in your browser...`),await fR()})}))}async function pQ0(){let D=DX();D.start("checking prerequisites...");let F=await wJ();D.stop();let w=[],J=[];w.push(""),w.push(u2("Dependency Check")),w.push("The following dependencies are required by some MCP servers that use Stdout. It's best to have them all installed."),w.push("");for(let Q of F.dependencies)w.push(oJ1({name:Q.name,installed:Q.installed,successText:`${Q.name} is installed`,failureText:`${Q.name} is not available in $PATH. ${OQ0(Q)}`}));if(F.dependencies.filter((Q)=>Q.installed).length<F.dependencies.length)J.push("Some dependencies are not available in $PATH, MCP servers that depend on them will not work.");w.push(""),w.push(u2("MCP Clients Check")),w.push("Director can automatically configure the following MCP clients for you. It's best to have at least one installed."),w.push("");for(let Q of F.clients)w.push(oJ1({name:Q.name,installed:Q.installed}));if(F.clients.filter((Q)=>Q.installed).length===0)J.push("No MCP clients found. It's best to have at least one MCP client installed in order to use the automatic client configuration.");if(w.push(""),w.push(u2("Summary")),w.push(""),console.log(w.join(`
624
624
  `)),J.length>0)if(console.log(J.map((X)=>`${a5("✗")} ${a5(X)}`).join(`
625
625
  `)),console.log(""),await Su({message:"Would you like to continue with a degraded experience?",choices:["No","Yes"]})==="Yes")console.log(JB("Continuing with a degraded experience..."));else console.log("Exiting..."),process.exit(1);else console.log(JB("All systems go!")),console.log("")}function oJ1(D){let F=`[${D.installed?JB("✓"):a5("✗")}]`,w=D.successText??`${D.name} is installed`,J=D.failureText??`${D.name} is not installed`;return`${F} ${D.installed?w:J}`}function OQ0(D){switch(D.name){case"npx":return"Follow the installation instructions here: https://docs.npmjs.com/downloading-and-installing-node-js-and-npm.";case"uvx":return"Follow the installation instructions here: https://docs.astral.sh/uv/getting-started/installation/.";default:return}}function rJ1(D){return D.command("remove <proxyId> <serverName>").description("Remove a server from a proxy").action(g1(async(F,w)=>{let J=await Y4(()=>g2.store.removeServer.mutate({proxyId:F,serverName:w})).start("removing server...").succeed(`Server ${w} removed from ${F}`).run()}))}function tJ1(D){D.command("status").description("Get the status of the director").action(g1(async()=>{let F=await wJ();console.log(F)}))}function eJ1(D){sJ1(D),aJ1(D),nJ1(D),D.command("ls").alias("list").description("List proxies").action(g1(async()=>{let F=await g2.store.getAll.query();if(F.length===0)console.log("no proxies configured yet.");else{let w=n3(["id","name","path"]);w.push(...F.map((J)=>[J.id,J.name,B4($0.GATEWAY_URL,J.path)])),console.log(w.toString())}})),D.command("get <proxyId>").description("Show proxy details").action(g1(async(F)=>{let w=await g2.store.get.query({proxyId:F});if(!w){console.error(`proxy ${F} not found`);return}console.log(`id=${w.id}`),console.log(`name=${w.name}`);let J=n3(["name","transport","url/command"]);J.push(...w.servers.map((B)=>[B.name,B.transport.type,B.transport.type==="http"?B.transport.url:[B.transport.command,...B.transport.args??[]].join(" ")])),console.log(J.toString())})),D.command("create <name>").description("Create a new proxy").action(g1(async(F)=>{let w=await g2.store.create.mutate({name:F,servers:[]});console.log(`proxy ${w.id} created`)})),D.command("destroy <proxyId>").description("Delete a proxy").action(g1(async(F)=>{await g2.store.delete.mutate({proxyId:F}),console.log(`proxy ${F} deleted`)})),y41(D),D.command("disconnect <proxyId>").description("Disconnect a proxy from an MCP client").addOption(i8({flags:"-t,--target <target>",description:"target client",choices:["claude","cursor","vscode"]}).makeOptionMandatory()).action(g1(async(F,w)=>{let J=await g2.store.get.query({proxyId:F}),Y=await(await e2(w.target)).uninstall(J.id);console.log(Y)})),b41(D),rJ1(D),D.command("http2stdio <url>").description("Proxy an HTTP connection (sse or streamable) to a stdio stream").action(async(F)=>{await Y61(F)}),l41(D),tJ1(D),g41(D)}var Iz=P1("enrich/tools");async function DB1(D){let F=await D.entries.getEntries.query({pageIndex:0,pageSize:100});for(let w of F.entries){if(w.lastConnectionAttemptedAt){Iz.info(`skipping ${w.name}, already processed`);continue}let J;try{J=await CQ0(w)}catch(B){let Y=B instanceof Error?B.message:String(B);Iz.error(`error enriching ${w.name}: ${Y}`),await D.entries.updateEntry.mutate({id:w.id,isConnectable:!1,lastConnectionAttemptedAt:new Date,lastConnectionError:Y});continue}await D.entries.updateEntry.mutate({id:w.id,isConnectable:!0,lastConnectionAttemptedAt:new Date,lastConnectionError:void 0,tools:J})}}async function CQ0(D){let F=D.transport,w=new q3(`${D.name}-client`);if(F.type==="stdio")await w.connectToStdio(F.command,F.args,{...process.env,...F.env});else if(F.type==="http")await w.connectToHTTP(F.url);else return[];Iz.info(`connected to ${D.name}, fetching tools...`);let J=(await w.listTools()).tools.map(({name:B,description:Y,inputSchema:Q})=>({name:B,description:Y??"",inputSchema:{type:"object",properties:Q?.properties??{},required:Q?.required}}));return Iz.info(`closing client ${D.name}`),await w.close(),J}function FB1(D){console.log(`
626
626
  ${u2(D.name.toUpperCase())}
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@director.run/cli",
3
3
  "type": "module",
4
- "version": "0.0.46",
4
+ "version": "0.0.48",
5
5
  "files": ["dist", "README.md"],
6
6
  "bin": {
7
7
  "director": "./dist/cli.js"
8
8
  },
9
- "license": "MIT",
9
+ "author": "Barnaby Malet <barnaby@director.run>",
10
+ "license": "AGPL-3.0",
10
11
  "repository": {
11
12
  "type": "git",
12
13
  "url": "https://github.com/director-run/director"
13
14
  },
14
15
  "description": "The easiest way to manage and deploy MCP servers",
15
- "author": "The Working Company <hello@director.run>",
16
16
  "homepage": "https://director.run",
17
17
  "scripts": {
18
18
  "lint": "biome check .",