@director.run/cli 1.0.0 → 1.0.1
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/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h1 align="center">Director</h1>
|
|
2
|
-
<p align="center">Playbooks for AI agents</p>
|
|
2
|
+
<p align="center">MCP Playbooks for AI agents</p>
|
|
3
3
|
|
|
4
4
|
<p align="center"><code>curl -LsSf https://director.run/install.sh | sh</code></p>
|
|
5
5
|
|
|
@@ -16,12 +16,14 @@
|
|
|
16
16
|
|
|
17
17
|
# Overview
|
|
18
18
|
|
|
19
|
-
Director
|
|
19
|
+
Director allows you to provide <ins>**playbooks**</ins> to AI Agents. A playbook is a set of <ins>**MCP tools**</ins>, <ins>**prompts**</ins> and <ins>**configuration**</ins>, that give agents new <ins>**skills**</ins>. You can connect Claude, Cursor and VSCode in 1-click, or integrate manually through a single MCP endpoint.
|
|
20
20
|
|
|
21
21
|
Playbooks are portable, declarative YAML files that can easily be shared (or committed to version control). Director is local-first - installation and client integration takes 30 seconds. In addition, Director provides all of the MCP management functionality that you'd expect: tool filtering, logging, strong isolation, and unified OAuth.
|
|
22
22
|
|
|
23
23
|
<br />
|
|
24
|
-
|
|
24
|
+
|
|
25
|
+
[](https://player.mux.com/LkXOkiGsfatE6XLxda8ZEm02ydvxJ1K004y5EgqYV7dus)
|
|
26
|
+
|
|
25
27
|
|
|
26
28
|
## Key Features
|
|
27
29
|
|
|
@@ -33,7 +35,7 @@ Playbooks are portable, declarative YAML files that can easily be shared (or com
|
|
|
33
35
|
- 🎯 **Tool Filtering** - Select only the MCP tools that are required for the specific task, preserving context.
|
|
34
36
|
- 📋 **Declarative** - Like terraform for AI agents, Director will enforce playbook to client mapping on startup.
|
|
35
37
|
- 🔧 **Flexibility** - You can configure director through the UI, by editing the config file, through the CLI or even using the Typescript SDK.
|
|
36
|
-
- 📊 **Observability** -
|
|
38
|
+
- 📊 **Observability** - Centralized JSON logging, that allows you to understand exactly what your agent is doing.
|
|
37
39
|
- 🔌 **MCP Compliant** - Just works with any MCP server or client. Up to date with the latest MCP spec.
|
|
38
40
|
|
|
39
41
|
# Quickstart
|
|
@@ -103,7 +105,7 @@ playbooks:
|
|
|
103
105
|
search logs for errors, identify root cause
|
|
104
106
|
```
|
|
105
107
|
|
|
106
|
-
##
|
|
108
|
+
## Architecture
|
|
107
109
|
|
|
108
110
|
At a high level, Director is a service that sits between your agents and MCP servers. It's transparent to clients, requiring no additional tokens. It models playbooks, which can be thought of as standalone, portable skills that enhance your AI agent with new capabilities.
|
|
109
111
|
|
|
@@ -260,7 +262,7 @@ const result = await playbook.callTool('github.create_issue', {
|
|
|
260
262
|
|
|
261
263
|
- [`apps/cli`](./apps/cli/README.md) - The command-line interface, the primary way to interact with Director. Available on [npm](https://www.npmjs.com/package/@director.run/cli).
|
|
262
264
|
- [`apps/sdk`](./apps/sdk/README.md) - The Typescript SDK, available on [npm](https://www.npmjs.com/package/@director.run/sdk).
|
|
263
|
-
- [`apps/docker`](./apps/docker/README.md) - The Director docker image, which allows you to run Director (and all MCP servers)
|
|
265
|
+
- [`apps/docker`](./apps/docker/README.md) - The Director docker image, which allows you to run Director (and all MCP servers) securely inside a container. Available on [Docker Hub](https://hub.docker.com/r/barnaby/director).
|
|
264
266
|
- [`apps/docs`](./apps/docs/README.md) - Project documentation hosted at [https://docs.director.run](https://docs.director.run)
|
|
265
267
|
- [`apps/registry`](./apps/registry/README.md) - Backend for the registry hosted at [https://registry.director.run](https://registry.director.run)
|
|
266
268
|
- [`apps/sandbox`](./apps/sandbox/README.md) - A tool for running Director (and all MCP servers) securely inside a VM. Apple Silicon only.
|
package/dist/cli.js
CHANGED
|
@@ -591,7 +591,7 @@ Please see the 3.x to 4.x migration guide for details on how to update your app.
|
|
|
591
591
|
]))`;continue}else if(J[K]==="$"){Q+=`($|(?=[\r
|
|
592
592
|
]))`;continue}}if(w.s&&J[K]==="."){Q+=Y?`${J[K]}\r
|
|
593
593
|
`:`[${J[K]}\r
|
|
594
|
-
]`;continue}if(Q+=J[K],J[K]==="\\")X=!0;else if(Y&&J[K]==="]")Y=!1;else if(!Y&&J[K]==="[")Y=!0}try{new RegExp(Q)}catch{return console.warn(`Could not convert regex pattern at ${F.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),D.source}return Q}function aH(D,F){if(F.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(F.target==="openApi3"&&D.keyType?._def.typeName===G1.ZodEnum)return{type:"object",required:D.keyType._def.values,properties:D.keyType._def.values.reduce((J,Q)=>({...J,[Q]:f1(D.valueType._def,{...F,currentPath:[...F.currentPath,"properties",Q]})??X2(F)}),{}),additionalProperties:F.rejectedAdditionalProperties};let w={type:"object",additionalProperties:f1(D.valueType._def,{...F,currentPath:[...F.currentPath,"additionalProperties"]})??F.allowedAdditionalProperties};if(F.target==="openApi3")return w;if(D.keyType?._def.typeName===G1.ZodString&&D.keyType._def.checks?.length){let{type:J,...Q}=lH(D.keyType._def,F);return{...w,propertyNames:Q}}else if(D.keyType?._def.typeName===G1.ZodEnum)return{...w,propertyNames:{enum:D.keyType._def.values}};else if(D.keyType?._def.typeName===G1.ZodBranded&&D.keyType._def.type._def.typeName===G1.ZodString&&D.keyType._def.type._def.checks?.length){let{type:J,...Q}=cH(D.keyType._def,F);return{...w,propertyNames:Q}}return w}function Pb(D,F){if(F.mapStrategy==="record")return aH(D,F);let w=f1(D.keyType._def,{...F,currentPath:[...F.currentPath,"items","items","0"]})||X2(F),J=f1(D.valueType._def,{...F,currentPath:[...F.currentPath,"items","items","1"]})||X2(F);return{type:"array",maxItems:125,items:{type:"array",items:[w,J],minItems:2,maxItems:2}}}function Ob(D){let F=D.values,J=Object.keys(D.values).filter((X)=>{return typeof F[F[X]]!=="number"}).map((X)=>F[X]),Q=Array.from(new Set(J.map((X)=>typeof X)));return{type:Q.length===1?Q[0]==="string"?"string":"number":["string","number"],enum:J}}function Ab(D){return D.target==="openAi"?void 0:{not:X2({...D,currentPath:[...D.currentPath,"not"]})}}function vb(D){return D.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var qX={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function Rb(D,F){if(F.target==="openApi3")return Lb(D,F);let w=D.options instanceof Map?Array.from(D.options.values()):D.options;if(w.every((J)=>(J._def.typeName in qX)&&(!J._def.checks||!J._def.checks.length))){let J=w.reduce((Q,X)=>{let Y=qX[X._def.typeName];return Y&&!Q.includes(Y)?[...Q,Y]:Q},[]);return{type:J.length>1?J:J[0]}}else if(w.every((J)=>J._def.typeName==="ZodLiteral"&&!J.description)){let J=w.reduce((Q,X)=>{let Y=typeof X._def.value;switch(Y){case"string":case"number":case"boolean":return[...Q,Y];case"bigint":return[...Q,"integer"];case"object":if(X._def.value===null)return[...Q,"null"];case"symbol":case"undefined":case"function":default:return Q}},[]);if(J.length===w.length){let Q=J.filter((X,Y,W)=>W.indexOf(X)===Y);return{type:Q.length>1?Q:Q[0],enum:w.reduce((X,Y)=>{return X.includes(Y._def.value)?X:[...X,Y._def.value]},[])}}}else if(w.every((J)=>J._def.typeName==="ZodEnum"))return{type:"string",enum:w.reduce((J,Q)=>[...J,...Q._def.values.filter((X)=>!J.includes(X))],[])};return Lb(D,F)}var Lb=(D,F)=>{let w=(D.options instanceof Map?Array.from(D.options.values()):D.options).map((J,Q)=>f1(J._def,{...F,currentPath:[...F.currentPath,"anyOf",`${Q}`]})).filter((J)=>!!J&&(!F.strictUnions||typeof J==="object"&&Object.keys(J).length>0));return w.length?{anyOf:w}:void 0};function xb(D,F){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(D.innerType._def.typeName)&&(!D.innerType._def.checks||!D.innerType._def.checks.length)){if(F.target==="openApi3")return{type:qX[D.innerType._def.typeName],nullable:!0};return{type:[qX[D.innerType._def.typeName],"null"]}}if(F.target==="openApi3"){let J=f1(D.innerType._def,{...F,currentPath:[...F.currentPath]});if(J&&"$ref"in J)return{allOf:[J],nullable:!0};return J&&{...J,nullable:!0}}let w=f1(D.innerType._def,{...F,currentPath:[...F.currentPath,"anyOf","0"]});return w&&{anyOf:[w,{type:"null"}]}}function Tb(D,F){let w={type:"number"};if(!D.checks)return w;for(let J of D.checks)switch(J.kind){case"int":w.type="integer",zM(w,"type",J.message,F);break;case"min":if(F.target==="jsonSchema7")if(J.inclusive)U0(w,"minimum",J.value,J.message,F);else U0(w,"exclusiveMinimum",J.value,J.message,F);else{if(!J.inclusive)w.exclusiveMinimum=!0;U0(w,"minimum",J.value,J.message,F)}break;case"max":if(F.target==="jsonSchema7")if(J.inclusive)U0(w,"maximum",J.value,J.message,F);else U0(w,"exclusiveMaximum",J.value,J.message,F);else{if(!J.inclusive)w.exclusiveMaximum=!0;U0(w,"maximum",J.value,J.message,F)}break;case"multipleOf":U0(w,"multipleOf",J.value,J.message,F);break}return w}function _b(D,F){let w=F.target==="openAi",J={type:"object",properties:{}},Q=[],X=D.shape();for(let W in X){let K=X[W];if(K===void 0||K._def===void 0)continue;let V=Mx1(K);if(V&&w){if(K._def.typeName==="ZodOptional")K=K._def.innerType;if(!K.isNullable())K=K.nullable();V=!1}let B=f1(K._def,{...F,currentPath:[...F.currentPath,"properties",W],propertyPath:[...F.currentPath,"properties",W]});if(B===void 0)continue;if(J.properties[W]=B,!V)Q.push(W)}if(Q.length)J.required=Q;let Y=$x1(D,F);if(Y!==void 0)J.additionalProperties=Y;return J}function $x1(D,F){if(D.catchall._def.typeName!=="ZodNever")return f1(D.catchall._def,{...F,currentPath:[...F.currentPath,"additionalProperties"]});switch(D.unknownKeys){case"passthrough":return F.allowedAdditionalProperties;case"strict":return F.rejectedAdditionalProperties;case"strip":return F.removeAdditionalStrategy==="strict"?F.allowedAdditionalProperties:F.rejectedAdditionalProperties}}function Mx1(D){try{return D.isOptional()}catch{return!0}}var Cb=(D,F)=>{if(F.currentPath.toString()===F.propertyPath?.toString())return f1(D.innerType._def,F);let w=f1(D.innerType._def,{...F,currentPath:[...F.currentPath,"anyOf","1"]});return w?{anyOf:[{not:X2(F)},w]}:X2(F)};var Ib=(D,F)=>{if(F.pipeStrategy==="input")return f1(D.in._def,F);else if(F.pipeStrategy==="output")return f1(D.out._def,F);let w=f1(D.in._def,{...F,currentPath:[...F.currentPath,"allOf","0"]}),J=f1(D.out._def,{...F,currentPath:[...F.currentPath,"allOf",w?"1":"0"]});return{allOf:[w,J].filter((Q)=>Q!==void 0)}};function fb(D,F){return f1(D.type._def,F)}function Sb(D,F){let J={type:"array",uniqueItems:!0,items:f1(D.valueType._def,{...F,currentPath:[...F.currentPath,"items"]})};if(D.minSize)U0(J,"minItems",D.minSize.value,D.minSize.message,F);if(D.maxSize)U0(J,"maxItems",D.maxSize.value,D.maxSize.message,F);return J}function jb(D,F){if(D.rest)return{type:"array",minItems:D.items.length,items:D.items.map((w,J)=>f1(w._def,{...F,currentPath:[...F.currentPath,"items",`${J}`]})).reduce((w,J)=>J===void 0?w:[...w,J],[]),additionalItems:f1(D.rest._def,{...F,currentPath:[...F.currentPath,"additionalItems"]})};else return{type:"array",minItems:D.items.length,maxItems:D.items.length,items:D.items.map((w,J)=>f1(w._def,{...F,currentPath:[...F.currentPath,"items",`${J}`]})).reduce((w,J)=>J===void 0?w:[...w,J],[])}}function mb(D){return{not:X2(D)}}function db(D){return X2(D)}var ub=(D,F)=>{return f1(D.innerType._def,F)};var kb=(D,F,w)=>{switch(F){case G1.ZodString:return lH(D,w);case G1.ZodNumber:return Tb(D,w);case G1.ZodObject:return _b(D,w);case G1.ZodBigInt:return pb(D,w);case G1.ZodBoolean:return Zb();case G1.ZodDate:return qM(D,w);case G1.ZodUndefined:return mb(w);case G1.ZodNull:return vb(w);case G1.ZodArray:return Gb(D,w);case G1.ZodUnion:case G1.ZodDiscriminatedUnion:return Rb(D,w);case G1.ZodIntersection:return $b(D,w);case G1.ZodTuple:return jb(D,w);case G1.ZodRecord:return aH(D,w);case G1.ZodLiteral:return Mb(D,w);case G1.ZodEnum:return qb(D);case G1.ZodNativeEnum:return Ob(D);case G1.ZodNullable:return xb(D,w);case G1.ZodOptional:return Cb(D,w);case G1.ZodMap:return Pb(D,w);case G1.ZodSet:return Sb(D,w);case G1.ZodLazy:return()=>D.getter()._def;case G1.ZodPromise:return fb(D,w);case G1.ZodNaN:case G1.ZodNever:return Ab(w);case G1.ZodEffects:return zb(D,w);case G1.ZodAny:return X2(w);case G1.ZodUnknown:return db(w);case G1.ZodDefault:return Ub(D,w);case G1.ZodBranded:return cH(D,w);case G1.ZodReadonly:return ub(D,w);case G1.ZodCatch:return Nb(D,w);case G1.ZodPipeline:return Ib(D,w);case G1.ZodFunction:case G1.ZodVoid:case G1.ZodSymbol:return;default:return((J)=>{return})(F)}};function f1(D,F,w=!1){let J=F.seen.get(D);if(F.override){let W=F.override?.(D,F,J,w);if(W!==Vb)return W}if(J&&!w){let W=Ex1(J,F);if(W!==void 0)return W}let Q={def:D,path:F.currentPath,jsonSchema:void 0};F.seen.set(D,Q);let X=kb(D,D.typeName,F),Y=typeof X==="function"?f1(X(),F):X;if(Y)Px1(D,F,Y);if(F.postProcess){let W=F.postProcess(Y,D,F);return Q.jsonSchema=Y,W}return Q.jsonSchema=Y,Y}var Ex1=(D,F)=>{switch(F.$refStrategy){case"root":return{$ref:D.path.join("/")};case"relative":return{$ref:gH(F.currentPath,D.path)};case"none":case"seen":{if(D.path.length<F.currentPath.length&&D.path.every((w,J)=>F.currentPath[J]===w))return console.warn(`Recursive reference detected at ${F.currentPath.join("/")}! Defaulting to any`),X2(F);return F.$refStrategy==="seen"?X2(F):void 0}}},Px1=(D,F,w)=>{if(D.description){if(w.description=D.description,F.markdownDescription)w.markdownDescription=D.description}return w};var iH=(D,F)=>{let w=Bb(F),J=typeof F==="object"&&F.definitions?Object.entries(F.definitions).reduce((K,[V,B])=>({...K,[V]:f1(B._def,{...w,currentPath:[...w.basePath,w.definitionPath,V]},!0)??X2(w)}),{}):void 0,Q=typeof F==="string"?F:F?.nameStrategy==="title"?void 0:F?.name,X=f1(D._def,Q===void 0?w:{...w,currentPath:[...w.basePath,w.definitionPath,Q]},!1)??X2(w),Y=typeof F==="object"&&F.name!==void 0&&F.nameStrategy==="title"?F.name:void 0;if(Y!==void 0)X.title=Y;if(w.flags.hasReferencedOpenAiAnyType){if(!J)J={};if(!J[w.openAiAnyTypeName])J[w.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:w.$refStrategy==="relative"?"1":[...w.basePath,w.definitionPath,w.openAiAnyTypeName].join("/")}}}let W=Q===void 0?J?{...X,[w.definitionPath]:J}:X:{$ref:[...w.$refStrategy==="relative"?[]:w.basePath,w.definitionPath,Q].join("/"),[w.definitionPath]:{...J,[Q]:X}};if(w.target==="jsonSchema7")W.$schema="http://json-schema.org/draft-07/schema#";else if(w.target==="jsonSchema2019-09"||w.target==="openAi")W.$schema="https://json-schema.org/draft/2019-09/schema#";if(w.target==="openAi"&&(("anyOf"in W)||("oneOf"in W)||("allOf"in W)||("type"in W)&&Array.isArray(W.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return W};var EM;(function(D){D.Completable="McpCompletable"})(EM||(EM={}));class $X extends s1{_parse(D){let{ctx:F}=this._processInputParams(D),w=F.data;return this._def.type._parse({data:w,path:F.path,parent:F})}unwrap(){return this._def.type}}$X.create=(D,F)=>{return new $X({type:D,typeName:EM.Completable,complete:F.complete,...Ox1(F)})};function Ox1(D){if(!D)return{};let{errorMap:F,invalid_type_error:w,required_error:J,description:Q}=D;if(F&&(w||J))throw Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);if(F)return{errorMap:F,description:Q};return{errorMap:(Y,W)=>{var K,V;let{message:B}=D;if(Y.code==="invalid_enum_value")return{message:B!==null&&B!==void 0?B:W.defaultError};if(typeof W.data>"u")return{message:(K=B!==null&&B!==void 0?B:J)!==null&&K!==void 0?K:W.defaultError};if(Y.code!=="invalid_type")return{message:W.defaultError};return{message:(V=B!==null&&B!==void 0?B:w)!==null&&V!==void 0?V:W.defaultError}},description:Q}}class PM{constructor(D,F){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new zX(D,F)}async connect(D){return await this.server.connect(D)}async close(){await this.server.close()}setToolRequestHandlers(){if(this._toolHandlersInitialized)return;this.server.assertCanSetRequestHandler(eF.shape.method.value),this.server.assertCanSetRequestHandler(Dw.shape.method.value),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(eF,()=>({tools:Object.entries(this._registeredTools).filter(([,D])=>D.enabled).map(([D,F])=>{let w={name:D,title:F.title,description:F.description,inputSchema:F.inputSchema?iH(F.inputSchema,{strictUnions:!0}):Ax1,annotations:F.annotations,_meta:F._meta};if(F.outputSchema)w.outputSchema=iH(F.outputSchema,{strictUnions:!0});return w})})),this.server.setRequestHandler(Dw,async(D,F)=>{let w=this._registeredTools[D.params.name];if(!w)throw new S1(j1.InvalidParams,`Tool ${D.params.name} not found`);if(!w.enabled)throw new S1(j1.InvalidParams,`Tool ${D.params.name} disabled`);let J;if(w.inputSchema){let Q=await w.inputSchema.safeParseAsync(D.params.arguments);if(!Q.success)throw new S1(j1.InvalidParams,`Invalid arguments for tool ${D.params.name}: ${Q.error.message}`);let X=Q.data,Y=w.callback;try{J=await Promise.resolve(Y(X,F))}catch(W){J={content:[{type:"text",text:W instanceof Error?W.message:String(W)}],isError:!0}}}else{let Q=w.callback;try{J=await Promise.resolve(Q(F))}catch(X){J={content:[{type:"text",text:X instanceof Error?X.message:String(X)}],isError:!0}}}if(w.outputSchema&&!J.isError){if(!J.structuredContent)throw new S1(j1.InvalidParams,`Tool ${D.params.name} has an output schema but no structured content was provided`);let Q=await w.outputSchema.safeParseAsync(J.structuredContent);if(!Q.success)throw new S1(j1.InvalidParams,`Invalid structured content for tool ${D.params.name}: ${Q.error.message}`)}return J}),this._toolHandlersInitialized=!0}setCompletionRequestHandler(){if(this._completionHandlerInitialized)return;this.server.assertCanSetRequestHandler(wH.shape.method.value),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(wH,async(D)=>{switch(D.params.ref.type){case"ref/prompt":return this.handlePromptCompletion(D,D.params.ref);case"ref/resource":return this.handleResourceCompletion(D,D.params.ref);default:throw new S1(j1.InvalidParams,`Invalid completion reference: ${D.params.ref}`)}}),this._completionHandlerInitialized=!0}async handlePromptCompletion(D,F){let w=this._registeredPrompts[F.name];if(!w)throw new S1(j1.InvalidParams,`Prompt ${F.name} not found`);if(!w.enabled)throw new S1(j1.InvalidParams,`Prompt ${F.name} disabled`);if(!w.argsSchema)return nH;let J=w.argsSchema.shape[D.params.argument.name];if(!(J instanceof $X))return nH;let X=await J._def.complete(D.params.argument.value,D.params.context);return hb(X)}async handleResourceCompletion(D,F){let w=Object.values(this._registeredResourceTemplates).find((X)=>X.resourceTemplate.uriTemplate.toString()===F.uri);if(!w){if(this._registeredResources[F.uri])return nH;throw new S1(j1.InvalidParams,`Resource template ${D.params.ref.uri} not found`)}let J=w.resourceTemplate.completeCallback(D.params.argument.name);if(!J)return nH;let Q=await J(D.params.argument.value,D.params.context);return hb(Q)}setResourceRequestHandlers(){if(this._resourceHandlersInitialized)return;this.server.assertCanSetRequestHandler(nF.shape.method.value),this.server.assertCanSetRequestHandler(sF.shape.method.value),this.server.assertCanSetRequestHandler(oF.shape.method.value),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(nF,async(D,F)=>{let w=Object.entries(this._registeredResources).filter(([Q,X])=>X.enabled).map(([Q,X])=>({uri:Q,name:X.name,...X.metadata})),J=[];for(let Q of Object.values(this._registeredResourceTemplates)){if(!Q.resourceTemplate.listCallback)continue;let X=await Q.resourceTemplate.listCallback(F);for(let Y of X.resources)J.push({...Q.metadata,...Y})}return{resources:[...w,...J]}}),this.server.setRequestHandler(sF,async()=>{return{resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([F,w])=>({name:F,uriTemplate:w.resourceTemplate.uriTemplate.toString(),...w.metadata}))}}),this.server.setRequestHandler(oF,async(D,F)=>{let w=new URL(D.params.uri),J=this._registeredResources[w.toString()];if(J){if(!J.enabled)throw new S1(j1.InvalidParams,`Resource ${w} disabled`);return J.readCallback(w,F)}for(let Q of Object.values(this._registeredResourceTemplates)){let X=Q.resourceTemplate.uriTemplate.match(w.toString());if(X)return Q.readCallback(w,X,F)}throw new S1(j1.InvalidParams,`Resource ${w} not found`)}),this.setCompletionRequestHandler(),this._resourceHandlersInitialized=!0}setPromptRequestHandlers(){if(this._promptHandlersInitialized)return;this.server.assertCanSetRequestHandler(rF.shape.method.value),this.server.assertCanSetRequestHandler(tF.shape.method.value),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(rF,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,D])=>D.enabled).map(([D,F])=>{return{name:D,title:F.title,description:F.description,arguments:F.argsSchema?Lx1(F.argsSchema):void 0}})})),this.server.setRequestHandler(tF,async(D,F)=>{let w=this._registeredPrompts[D.params.name];if(!w)throw new S1(j1.InvalidParams,`Prompt ${D.params.name} not found`);if(!w.enabled)throw new S1(j1.InvalidParams,`Prompt ${D.params.name} disabled`);if(w.argsSchema){let J=await w.argsSchema.safeParseAsync(D.params.arguments);if(!J.success)throw new S1(j1.InvalidParams,`Invalid arguments for prompt ${D.params.name}: ${J.error.message}`);let Q=J.data,X=w.callback;return await Promise.resolve(X(Q,F))}else{let J=w.callback;return await Promise.resolve(J(F))}}),this.setCompletionRequestHandler(),this._promptHandlersInitialized=!0}resource(D,F,...w){let J;if(typeof w[0]==="object")J=w.shift();let Q=w[0];if(typeof F==="string"){if(this._registeredResources[F])throw Error(`Resource ${F} is already registered`);let X=this._createRegisteredResource(D,void 0,F,J,Q);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),X}else{if(this._registeredResourceTemplates[D])throw Error(`Resource template ${D} is already registered`);let X=this._createRegisteredResourceTemplate(D,void 0,F,J,Q);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),X}}registerResource(D,F,w,J){if(typeof F==="string"){if(this._registeredResources[F])throw Error(`Resource ${F} is already registered`);let Q=this._createRegisteredResource(D,w.title,F,w,J);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),Q}else{if(this._registeredResourceTemplates[D])throw Error(`Resource template ${D} is already registered`);let Q=this._createRegisteredResourceTemplate(D,w.title,F,w,J);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),Q}}_createRegisteredResource(D,F,w,J,Q){let X={name:D,title:F,metadata:J,readCallback:Q,enabled:!0,disable:()=>X.update({enabled:!1}),enable:()=>X.update({enabled:!0}),remove:()=>X.update({uri:null}),update:(Y)=>{if(typeof Y.uri<"u"&&Y.uri!==w){if(delete this._registeredResources[w],Y.uri)this._registeredResources[Y.uri]=X}if(typeof Y.name<"u")X.name=Y.name;if(typeof Y.title<"u")X.title=Y.title;if(typeof Y.metadata<"u")X.metadata=Y.metadata;if(typeof Y.callback<"u")X.readCallback=Y.callback;if(typeof Y.enabled<"u")X.enabled=Y.enabled;this.sendResourceListChanged()}};return this._registeredResources[w]=X,X}_createRegisteredResourceTemplate(D,F,w,J,Q){let X={resourceTemplate:w,title:F,metadata:J,readCallback:Q,enabled:!0,disable:()=>X.update({enabled:!1}),enable:()=>X.update({enabled:!0}),remove:()=>X.update({name:null}),update:(Y)=>{if(typeof Y.name<"u"&&Y.name!==D){if(delete this._registeredResourceTemplates[D],Y.name)this._registeredResourceTemplates[Y.name]=X}if(typeof Y.title<"u")X.title=Y.title;if(typeof Y.template<"u")X.resourceTemplate=Y.template;if(typeof Y.metadata<"u")X.metadata=Y.metadata;if(typeof Y.callback<"u")X.readCallback=Y.callback;if(typeof Y.enabled<"u")X.enabled=Y.enabled;this.sendResourceListChanged()}};return this._registeredResourceTemplates[D]=X,X}_createRegisteredPrompt(D,F,w,J,Q){let X={title:F,description:w,argsSchema:J===void 0?void 0:M.object(J),callback:Q,enabled:!0,disable:()=>X.update({enabled:!1}),enable:()=>X.update({enabled:!0}),remove:()=>X.update({name:null}),update:(Y)=>{if(typeof Y.name<"u"&&Y.name!==D){if(delete this._registeredPrompts[D],Y.name)this._registeredPrompts[Y.name]=X}if(typeof Y.title<"u")X.title=Y.title;if(typeof Y.description<"u")X.description=Y.description;if(typeof Y.argsSchema<"u")X.argsSchema=M.object(Y.argsSchema);if(typeof Y.callback<"u")X.callback=Y.callback;if(typeof Y.enabled<"u")X.enabled=Y.enabled;this.sendPromptListChanged()}};return this._registeredPrompts[D]=X,X}_createRegisteredTool(D,F,w,J,Q,X,Y,W){let K={title:F,description:w,inputSchema:J===void 0?void 0:M.object(J),outputSchema:Q===void 0?void 0:M.object(Q),annotations:X,_meta:Y,callback:W,enabled:!0,disable:()=>K.update({enabled:!1}),enable:()=>K.update({enabled:!0}),remove:()=>K.update({name:null}),update:(V)=>{if(typeof V.name<"u"&&V.name!==D){if(delete this._registeredTools[D],V.name)this._registeredTools[V.name]=K}if(typeof V.title<"u")K.title=V.title;if(typeof V.description<"u")K.description=V.description;if(typeof V.paramsSchema<"u")K.inputSchema=M.object(V.paramsSchema);if(typeof V.callback<"u")K.callback=V.callback;if(typeof V.annotations<"u")K.annotations=V.annotations;if(typeof V._meta<"u")K._meta=V._meta;if(typeof V.enabled<"u")K.enabled=V.enabled;this.sendToolListChanged()}};return this._registeredTools[D]=K,this.setToolRequestHandlers(),this.sendToolListChanged(),K}tool(D,...F){if(this._registeredTools[D])throw Error(`Tool ${D} is already registered`);let w,J,Q,X;if(typeof F[0]==="string")w=F.shift();if(F.length>1){let W=F[0];if(bb(W)){if(J=F.shift(),F.length>1&&typeof F[0]==="object"&&F[0]!==null&&!bb(F[0]))X=F.shift()}else if(typeof W==="object"&&W!==null)X=F.shift()}let Y=F[0];return this._createRegisteredTool(D,void 0,w,J,Q,X,void 0,Y)}registerTool(D,F,w){if(this._registeredTools[D])throw Error(`Tool ${D} is already registered`);let{title:J,description:Q,inputSchema:X,outputSchema:Y,annotations:W,_meta:K}=F;return this._createRegisteredTool(D,J,Q,X,Y,W,K,w)}prompt(D,...F){if(this._registeredPrompts[D])throw Error(`Prompt ${D} is already registered`);let w;if(typeof F[0]==="string")w=F.shift();let J;if(F.length>1)J=F.shift();let Q=F[0],X=this._createRegisteredPrompt(D,void 0,w,J,Q);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),X}registerPrompt(D,F,w){if(this._registeredPrompts[D])throw Error(`Prompt ${D} is already registered`);let{title:J,description:Q,argsSchema:X}=F,Y=this._createRegisteredPrompt(D,J,Q,X,w);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),Y}isConnected(){return this.server.transport!==void 0}async sendLoggingMessage(D,F){return this.server.sendLoggingMessage(D,F)}sendResourceListChanged(){if(this.isConnected())this.server.sendResourceListChanged()}sendToolListChanged(){if(this.isConnected())this.server.sendToolListChanged()}sendPromptListChanged(){if(this.isConnected())this.server.sendPromptListChanged()}}var Ax1={type:"object",properties:{}};function bb(D){if(typeof D!=="object"||D===null)return!1;return Object.keys(D).length===0||Object.values(D).some(vx1)}function vx1(D){return D!==null&&typeof D==="object"&&"parse"in D&&typeof D.parse==="function"&&"safeParse"in D&&typeof D.safeParse==="function"}function Lx1(D){return Object.entries(D.shape).map(([F,w])=>({name:F,description:w.description,required:!w.isOptional()}))}function hb(D){return{completion:{values:D.slice(0,100),total:D.length,hasMore:D.length>100}}}var nH={completion:{values:[],hasMore:!1}};var OM=A1(p3(),1);var Zw="__prompts__",AM=M.object({name:p4,title:p4,description:M.string().trim().optional(),body:p4}),Vq0=M.object({prompts:M.array(AM).optional()});class vM extends yH{_promptList;constructor(D=[]){super({name:Zw},{server:yb(OM.default.cloneDeep(D))});this._promptList=OM.default.cloneDeep(D)}get promptList(){return this._promptList}async addPromptEntry(D){if(this._promptList.find((w)=>w.name===D.name))throw new p1("DUPLICATE",`Prompt ${D.name} already exists`);return this._promptList.push(D),await this.reconnectToServer(),D}async updatePrompt(D,F){let w=this._promptList.findIndex((J)=>J.name===D);if(w===-1)throw new p1("NOT_FOUND",`Prompt ${D} not found`);return this._promptList[w]={...this._promptList[w],...F},await this.reconnectToServer(),this._promptList[w]}async removePromptEntry(D){let F=this._promptList.findIndex((w)=>w.name===D);if(F===-1)throw new p1("NOT_FOUND",`Prompt ${D} not found`);this._promptList.splice(F,1),await this.reconnectToServer()}getPromptEntry(D){let F=this._promptList.find((w)=>w.name===D);if(!F)throw new p1("NOT_FOUND",`Prompt ${D} not found`);return F}async reconnectToServer(){await this.close(),await this.server.close(),this.server=yb(this._promptList),await this.connectToTarget({throwOnError:!0})}}function yb(D){let F=new PM({name:"prompt-manager",version:"1.0.0"},{capabilities:{logging:{}}});for(let w of D)F.registerPrompt(w.name,{title:w.title,description:w.description},async()=>{return await{messages:[{role:"user",content:{type:"text",text:w.body}}]}});return F.server}var gb=Uk.extend({type:M.literal("http")}),cb=Yb.extend({type:M.literal("stdio")}),lb=M.union([gb,cb]),LM=M.object({id:p4,name:p4,description:um,prompts:M.array(AM).optional(),servers:M.array(lb)});var g2=A1(p3(),1);class RM{schema;storage;defaults;constructor(D){this.schema=D.schema,this.storage=D.storage,this.defaults=D.defaults??{}}get data(){return this.storage.getData()}async init(){await this.storage.init(),this.validate({...this.defaults,...this.storage.getData()})}async set(D,F){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let J=this.schema[D].parse(F),Q=this.storage.getData();g2.set(Q,D,J),this.storage.setData(Q),await this.storage.persist()}get(D){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let F=g2.get({...this.defaults,...this.storage.getData()},D);if(F!==void 0)return F;let J=this.schema[D].safeParse(void 0);if(J.success)return J.data;return}async purge(){await this.storage.purge()}async push(D,F){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let w=this.schema[D],J=this.unwrapArraySchema(w);if(!J)throw new p1("INVALID_ARGUMENT",`Key "${D}" is not an array`,{key:D});let Q=J.element.parse(F),X=this.storage.getData(),W=[...g2.get({...this.defaults,...X},D)??[],Q];g2.set(X,D,W),this.storage.setData(X),await this.storage.persist()}async remove(D,F){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let w=this.schema[D];if(!this.unwrapArraySchema(w))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not an array`,{key:D});let Q=this.storage.getData(),W=[...g2.get({...this.defaults,...Q},D)??[]].filter((K)=>{if(!g2.isObject(K)||K===null)return!g2.isEqual(K,F);return!g2.isMatch(K,F)});g2.set(Q,D,W),this.storage.setData(Q),await this.storage.persist()}find(D,F){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let w=this.schema[D];if(!this.unwrapArraySchema(w))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not an array`,{key:D});let Q=this.storage.getData();return[...g2.get({...this.defaults,...Q},D)??[]].find((K)=>{if(!g2.isObject(K)||K===null)return g2.isEqual(K,F);return g2.isMatch(K,F)})}unwrapArraySchema(D){while(!0){if(D instanceof M.ZodArray)return D;if(D instanceof M.ZodDefault){D=D._def.innerType;continue}if(D instanceof M.ZodOptional||D instanceof M.ZodNullable){D=D._def.innerType;continue}if(D instanceof M.ZodEffects){D=D._def.schema;continue}return null}}validate(D){let F={...this.defaults,...D};for(let w in this.schema){let J=g2.get(F,w),Q=this.schema[w];try{Q.parse(J)}catch(X){throw new p1("INVALID_CONFIGURATION",`Invalid data for key "${w}": ${X instanceof Error?X.message:String(X)}`,{key:w,value:J})}}}}var mB=A1(Dg(),1);import Fg from"fs";import{existsSync as Ld1}from"node:fs";class kE{data;constructor(D){this.data={...D?.data}}init(){return Promise.resolve()}persist(){return Promise.resolve()}purge(){return this.data={},Promise.resolve()}getData(){return structuredClone(this.data)}setData(D){this.data=structuredClone(D)}toPlainObject(){return{type:"in-memory",data:this.data}}}class bE{filePath;data={};constructor(D){if(!D.filePath)throw Error("Config filePath is not defined");this.filePath=D.filePath}async init(){if(Ld1(this.filePath)){let D=await Fg.promises.readFile(this.filePath,"utf8"),F=mB.default.parse(D);this.data=F&&typeof F==="object"&&!Array.isArray(F)?F:{}}}async persist(){let F=this.filePath.endsWith(".json")?JSON.stringify(this.data):mB.default.stringify(this.data);await Fg.promises.writeFile(this.filePath,F)}async purge(){this.data={},await this.persist()}getData(){return structuredClone(this.data)}setData(D){this.data=structuredClone(D)}toPlainObject(){return{type:"yaml",path:this.filePath,data:this.data}}}class cX extends RM{playbooks;constructor(D){super({schema:Rd1,storage:D.storage,defaults:D.defaults});this.playbooks=new Qg(this)}static async createFileBasedConfig(D){let F=new cX({storage:new bE({filePath:D.filePath}),defaults:D.defaults});return await F.init(),F}static async createMemoryBasedConfig(D){let F=new cX({storage:new kE,defaults:D.defaults});return await F.init(),F}toPlainObject(){return{defaults:this.defaults,storage:this.storage.toPlainObject()}}prettyPrint(){console.log("*************************************************"),console.log(),console.log(g0("STORAGE")),console.log(JSON.stringify(dB.default.omit(this.storage.toPlainObject(),"data"),null,2)),console.log(),console.log(g0("DEFAULTS")),console.log(JSON.stringify(this.defaults,null,2)),console.log(),console.log("*************************************************")}}class Qg{config;constructor(D){this.config=D}async create(D){let F=wg(D.name);if(await this.config.find("playbooks",{id:F}))throw new p1("DUPLICATE","Playbook with this name already exists");let w={id:F,...D,servers:dB.default.map(D.servers||[],(J)=>({...J,name:wg(J.name)}))};return await this.config.push("playbooks",w),w}async getPlaybook(D){let F=await this.all(),w=dB.default.find(F,{id:D});if(!w)throw Error("Playbook not found");return w}async update(D,F){if(F.id!==D)throw Error("Id mismatch");return await this.config.remove("playbooks",{id:D}),await this.config.push("playbooks",F),F}async remove(D){await this.config.remove("playbooks",{id:D})}async count(){return(await this.all()).length}async all(){return await this.config.get("playbooks")||[]}}function wg(D){return Jg.default(D,{lower:!0,strict:!0,trim:!0})}var Rd1={version:M.string().default("1.0.0"),playbooks:M.array(LM).default([]),debug:M.boolean().default(!1),"server.port":M.number().min(0),"registry.url":M.string(),"registry.apiKey":M.string().optional(),"telemetry.writeKey":M.string(),"telemetry.enabled":M.boolean(),"oauth.storage":M.literal("disk").or(M.literal("memory")).default("disk"),"oauth.tokenDirectory":M.string().default("./tokens"),"clients.claude":M.array(M.string()).default([]),"clients.claude-code":M.array(M.string()).default([]),"clients.cursor":M.array(M.string()).default([]),"clients.vscode":M.array(M.string()).default([])};import xd1 from"fs";function uB(D){for(let F of D)try{if(xd1.existsSync(F))return F}catch{continue}return}var xr=A1(Lr(),1),Tr=A1(Rr(),1);import SO from"os";class cw{analytics;machineId;enabled;traits;constructor(D){this.analytics=new xr.Analytics({writeKey:D.writeKey}),this.enabled=D.enabled,this.traits=D.traits||{}}async initialize(){if(this.machineId)return;if(this.machineId=await Tr.machineId(),this.enabled)this.analytics.identify({userId:this.machineId,traits:{...this.traits,os:SO.platform(),osVersion:SO.release(),arch:SO.arch()}})}static noTelemetry(){return new cw({writeKey:"--",enabled:!1})}async trackEvent(D,F={}){if(await this.initialize(),this.enabled)this.analytics.track({userId:this.machineId,event:D,properties:F})}}var C6={name:"@director.run/cli",type:"module",version:"1.0.0",files:["dist","README.md","package.json"],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:"Playbooks for AI agents",homepage:"https://director.run",publishConfig:{access:"public"},scripts:{lint:"biome check .",format:"biome format --write .",clean:"rm -rf .turbo dist/*",test:"bun run vitest --fileParallelism=false",cli:"LOG_LEVEL=debug NODE_ENV=development bun run bin/cli.ts","cli:dev":"NODE_ENV=development bun --watch bin/cli.ts",typecheck:"tsc --noEmit",build:"bun run clean && bun build --production --target=node bin/cli.ts --outdir dist && cp -r ../studio/dist dist/studio",release:"changeset publish",dev:"bun --watch bin/cli.ts"},peerDependencies:{typescript:"^5"},devDependencies:{"@director.run/gateway":"workspace:*","@director.run/client-configurator":"workspace:*","@director.run/mcp":"workspace:*","@director.run/registry":"workspace:*","@director.run/utilities":"workspace:*","@inquirer/prompts":"^7.5.2","@modelcontextprotocol/sdk":"1.20.0","@segment/analytics-node":"^2.3.0","@trpc/server":"^11.0.2","@types/semver":"^7.5.8","@types/update-notifier":"^6.0.8",boxen:"^8.0.1",chalk:"^5.4.1","cli-table3":"^0.6.5",commander:"^13.1.0","node-machine-id":"^1.1.12",semver:"^7.7.2",superjson:"^2.2.2","type-fest":"^4.40.0",typescript:"^5.8.3","update-notifier":"^7.3.1",vitest:"^3.1.1",zod:"^3.25.76",zx:"^8.8.0"}};var __dirname="/home/runner/work/director/director/apps/cli/src",Ts1="Z8wjEfWMFnlltCpGPPWlvsEQH1aVEUH3";function KD(){if(t6())return WD.join(__dirname,"../../../director.config.test.yaml");else if(aF())return WD.join(__dirname,"../../../director.config.development.yaml");else{let D=WD.join(xs1.homedir(),".director/director.config.yaml"),F=WD.join(process.cwd(),"director.config.yaml");return uB([F,D])??D}}function _s1(){if(t6())return{storage:"memory"};else return{storage:"disk",tokenDirectory:WD.join(WD.dirname(KD()),".secrets/director-oauth-tokens")}}var Cs1=WD.dirname(KD());await Rs1.mkdir(Cs1,{recursive:!0});var n4=await cX.createFileBasedConfig({filePath:KD(),defaults:{debug:aF(),registry:{url:"https://registry.director.run"},server:{port:t6()?3675:parseInt(process.env.GATEWAY_PORT??"3673")},telemetry:{writeKey:oq()?Ts1:"--",enabled:oq()},oauth:_s1()}});function a2(){return`http://localhost:${n4.get("server.port")}`}function jO(){return`${a2()}/studio`}function _r(){return new cw({writeKey:n4.get("telemetry.writeKey")??"--",enabled:!!n4.get("telemetry.enabled"),traits:{cliVersion:C6.version}})}var ir=A1(ar(),1),{program:IO0,createCommand:fO0,createArgument:SO0,createOption:jO0,CommanderError:mO0,InvalidArgumentError:dO0,InvalidOptionArgumentError:uO0,Command:cO,Argument:kO0,Option:nr,Help:bO0}=ir.default;var lO=" ".repeat(2);function rr(D){let F=[];if(D._enableDebugCommands)F.push(B4("\uD83D\uDEA7 debug commands appear in yellow \uD83D\uDEA7")),F.push("");if(F.push(D.description().trim()),F.push(""),F.push(lw("usage")),F.push(lO+ZY([D.parent?D.parent.name():"",D.name(),er("command"),"[subcommand]","[flags]"])),F.push(""),D.parent)F.push(lw(`${D.name()} commands`));else F.push(lw("core commands"));D.commands.toSorted((J,Q)=>Number(!!J.commands.length)-Number(!!Q.commands.length)).forEach((J)=>{if(J.commands.length)F.push(""),F.push(lw(J.name())),J.commands.forEach((Q)=>{F.push(sr(Q))});else F.push(sr(J))}),F.push("");let w=[D._helpOption,...D.options].filter((J)=>J!==void 0);if(w.length)F.push(lw("flags")),w.forEach((J)=>{F.push(ZY([lO,J.flags,tr(J.description,J.flags.length)]))}),F.push("");if(D.examples)F.push(lw("examples")),F.push(" "+D.examples.trim()),F.push("");return F.push(""),F.join(`
|
|
594
|
+
]`;continue}if(Q+=J[K],J[K]==="\\")X=!0;else if(Y&&J[K]==="]")Y=!1;else if(!Y&&J[K]==="[")Y=!0}try{new RegExp(Q)}catch{return console.warn(`Could not convert regex pattern at ${F.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),D.source}return Q}function aH(D,F){if(F.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(F.target==="openApi3"&&D.keyType?._def.typeName===G1.ZodEnum)return{type:"object",required:D.keyType._def.values,properties:D.keyType._def.values.reduce((J,Q)=>({...J,[Q]:f1(D.valueType._def,{...F,currentPath:[...F.currentPath,"properties",Q]})??X2(F)}),{}),additionalProperties:F.rejectedAdditionalProperties};let w={type:"object",additionalProperties:f1(D.valueType._def,{...F,currentPath:[...F.currentPath,"additionalProperties"]})??F.allowedAdditionalProperties};if(F.target==="openApi3")return w;if(D.keyType?._def.typeName===G1.ZodString&&D.keyType._def.checks?.length){let{type:J,...Q}=lH(D.keyType._def,F);return{...w,propertyNames:Q}}else if(D.keyType?._def.typeName===G1.ZodEnum)return{...w,propertyNames:{enum:D.keyType._def.values}};else if(D.keyType?._def.typeName===G1.ZodBranded&&D.keyType._def.type._def.typeName===G1.ZodString&&D.keyType._def.type._def.checks?.length){let{type:J,...Q}=cH(D.keyType._def,F);return{...w,propertyNames:Q}}return w}function Pb(D,F){if(F.mapStrategy==="record")return aH(D,F);let w=f1(D.keyType._def,{...F,currentPath:[...F.currentPath,"items","items","0"]})||X2(F),J=f1(D.valueType._def,{...F,currentPath:[...F.currentPath,"items","items","1"]})||X2(F);return{type:"array",maxItems:125,items:{type:"array",items:[w,J],minItems:2,maxItems:2}}}function Ob(D){let F=D.values,J=Object.keys(D.values).filter((X)=>{return typeof F[F[X]]!=="number"}).map((X)=>F[X]),Q=Array.from(new Set(J.map((X)=>typeof X)));return{type:Q.length===1?Q[0]==="string"?"string":"number":["string","number"],enum:J}}function Ab(D){return D.target==="openAi"?void 0:{not:X2({...D,currentPath:[...D.currentPath,"not"]})}}function vb(D){return D.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}var qX={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"};function Rb(D,F){if(F.target==="openApi3")return Lb(D,F);let w=D.options instanceof Map?Array.from(D.options.values()):D.options;if(w.every((J)=>(J._def.typeName in qX)&&(!J._def.checks||!J._def.checks.length))){let J=w.reduce((Q,X)=>{let Y=qX[X._def.typeName];return Y&&!Q.includes(Y)?[...Q,Y]:Q},[]);return{type:J.length>1?J:J[0]}}else if(w.every((J)=>J._def.typeName==="ZodLiteral"&&!J.description)){let J=w.reduce((Q,X)=>{let Y=typeof X._def.value;switch(Y){case"string":case"number":case"boolean":return[...Q,Y];case"bigint":return[...Q,"integer"];case"object":if(X._def.value===null)return[...Q,"null"];case"symbol":case"undefined":case"function":default:return Q}},[]);if(J.length===w.length){let Q=J.filter((X,Y,W)=>W.indexOf(X)===Y);return{type:Q.length>1?Q:Q[0],enum:w.reduce((X,Y)=>{return X.includes(Y._def.value)?X:[...X,Y._def.value]},[])}}}else if(w.every((J)=>J._def.typeName==="ZodEnum"))return{type:"string",enum:w.reduce((J,Q)=>[...J,...Q._def.values.filter((X)=>!J.includes(X))],[])};return Lb(D,F)}var Lb=(D,F)=>{let w=(D.options instanceof Map?Array.from(D.options.values()):D.options).map((J,Q)=>f1(J._def,{...F,currentPath:[...F.currentPath,"anyOf",`${Q}`]})).filter((J)=>!!J&&(!F.strictUnions||typeof J==="object"&&Object.keys(J).length>0));return w.length?{anyOf:w}:void 0};function xb(D,F){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(D.innerType._def.typeName)&&(!D.innerType._def.checks||!D.innerType._def.checks.length)){if(F.target==="openApi3")return{type:qX[D.innerType._def.typeName],nullable:!0};return{type:[qX[D.innerType._def.typeName],"null"]}}if(F.target==="openApi3"){let J=f1(D.innerType._def,{...F,currentPath:[...F.currentPath]});if(J&&"$ref"in J)return{allOf:[J],nullable:!0};return J&&{...J,nullable:!0}}let w=f1(D.innerType._def,{...F,currentPath:[...F.currentPath,"anyOf","0"]});return w&&{anyOf:[w,{type:"null"}]}}function Tb(D,F){let w={type:"number"};if(!D.checks)return w;for(let J of D.checks)switch(J.kind){case"int":w.type="integer",zM(w,"type",J.message,F);break;case"min":if(F.target==="jsonSchema7")if(J.inclusive)U0(w,"minimum",J.value,J.message,F);else U0(w,"exclusiveMinimum",J.value,J.message,F);else{if(!J.inclusive)w.exclusiveMinimum=!0;U0(w,"minimum",J.value,J.message,F)}break;case"max":if(F.target==="jsonSchema7")if(J.inclusive)U0(w,"maximum",J.value,J.message,F);else U0(w,"exclusiveMaximum",J.value,J.message,F);else{if(!J.inclusive)w.exclusiveMaximum=!0;U0(w,"maximum",J.value,J.message,F)}break;case"multipleOf":U0(w,"multipleOf",J.value,J.message,F);break}return w}function _b(D,F){let w=F.target==="openAi",J={type:"object",properties:{}},Q=[],X=D.shape();for(let W in X){let K=X[W];if(K===void 0||K._def===void 0)continue;let V=Mx1(K);if(V&&w){if(K._def.typeName==="ZodOptional")K=K._def.innerType;if(!K.isNullable())K=K.nullable();V=!1}let B=f1(K._def,{...F,currentPath:[...F.currentPath,"properties",W],propertyPath:[...F.currentPath,"properties",W]});if(B===void 0)continue;if(J.properties[W]=B,!V)Q.push(W)}if(Q.length)J.required=Q;let Y=$x1(D,F);if(Y!==void 0)J.additionalProperties=Y;return J}function $x1(D,F){if(D.catchall._def.typeName!=="ZodNever")return f1(D.catchall._def,{...F,currentPath:[...F.currentPath,"additionalProperties"]});switch(D.unknownKeys){case"passthrough":return F.allowedAdditionalProperties;case"strict":return F.rejectedAdditionalProperties;case"strip":return F.removeAdditionalStrategy==="strict"?F.allowedAdditionalProperties:F.rejectedAdditionalProperties}}function Mx1(D){try{return D.isOptional()}catch{return!0}}var Cb=(D,F)=>{if(F.currentPath.toString()===F.propertyPath?.toString())return f1(D.innerType._def,F);let w=f1(D.innerType._def,{...F,currentPath:[...F.currentPath,"anyOf","1"]});return w?{anyOf:[{not:X2(F)},w]}:X2(F)};var Ib=(D,F)=>{if(F.pipeStrategy==="input")return f1(D.in._def,F);else if(F.pipeStrategy==="output")return f1(D.out._def,F);let w=f1(D.in._def,{...F,currentPath:[...F.currentPath,"allOf","0"]}),J=f1(D.out._def,{...F,currentPath:[...F.currentPath,"allOf",w?"1":"0"]});return{allOf:[w,J].filter((Q)=>Q!==void 0)}};function fb(D,F){return f1(D.type._def,F)}function Sb(D,F){let J={type:"array",uniqueItems:!0,items:f1(D.valueType._def,{...F,currentPath:[...F.currentPath,"items"]})};if(D.minSize)U0(J,"minItems",D.minSize.value,D.minSize.message,F);if(D.maxSize)U0(J,"maxItems",D.maxSize.value,D.maxSize.message,F);return J}function jb(D,F){if(D.rest)return{type:"array",minItems:D.items.length,items:D.items.map((w,J)=>f1(w._def,{...F,currentPath:[...F.currentPath,"items",`${J}`]})).reduce((w,J)=>J===void 0?w:[...w,J],[]),additionalItems:f1(D.rest._def,{...F,currentPath:[...F.currentPath,"additionalItems"]})};else return{type:"array",minItems:D.items.length,maxItems:D.items.length,items:D.items.map((w,J)=>f1(w._def,{...F,currentPath:[...F.currentPath,"items",`${J}`]})).reduce((w,J)=>J===void 0?w:[...w,J],[])}}function mb(D){return{not:X2(D)}}function db(D){return X2(D)}var ub=(D,F)=>{return f1(D.innerType._def,F)};var kb=(D,F,w)=>{switch(F){case G1.ZodString:return lH(D,w);case G1.ZodNumber:return Tb(D,w);case G1.ZodObject:return _b(D,w);case G1.ZodBigInt:return pb(D,w);case G1.ZodBoolean:return Zb();case G1.ZodDate:return qM(D,w);case G1.ZodUndefined:return mb(w);case G1.ZodNull:return vb(w);case G1.ZodArray:return Gb(D,w);case G1.ZodUnion:case G1.ZodDiscriminatedUnion:return Rb(D,w);case G1.ZodIntersection:return $b(D,w);case G1.ZodTuple:return jb(D,w);case G1.ZodRecord:return aH(D,w);case G1.ZodLiteral:return Mb(D,w);case G1.ZodEnum:return qb(D);case G1.ZodNativeEnum:return Ob(D);case G1.ZodNullable:return xb(D,w);case G1.ZodOptional:return Cb(D,w);case G1.ZodMap:return Pb(D,w);case G1.ZodSet:return Sb(D,w);case G1.ZodLazy:return()=>D.getter()._def;case G1.ZodPromise:return fb(D,w);case G1.ZodNaN:case G1.ZodNever:return Ab(w);case G1.ZodEffects:return zb(D,w);case G1.ZodAny:return X2(w);case G1.ZodUnknown:return db(w);case G1.ZodDefault:return Ub(D,w);case G1.ZodBranded:return cH(D,w);case G1.ZodReadonly:return ub(D,w);case G1.ZodCatch:return Nb(D,w);case G1.ZodPipeline:return Ib(D,w);case G1.ZodFunction:case G1.ZodVoid:case G1.ZodSymbol:return;default:return((J)=>{return})(F)}};function f1(D,F,w=!1){let J=F.seen.get(D);if(F.override){let W=F.override?.(D,F,J,w);if(W!==Vb)return W}if(J&&!w){let W=Ex1(J,F);if(W!==void 0)return W}let Q={def:D,path:F.currentPath,jsonSchema:void 0};F.seen.set(D,Q);let X=kb(D,D.typeName,F),Y=typeof X==="function"?f1(X(),F):X;if(Y)Px1(D,F,Y);if(F.postProcess){let W=F.postProcess(Y,D,F);return Q.jsonSchema=Y,W}return Q.jsonSchema=Y,Y}var Ex1=(D,F)=>{switch(F.$refStrategy){case"root":return{$ref:D.path.join("/")};case"relative":return{$ref:gH(F.currentPath,D.path)};case"none":case"seen":{if(D.path.length<F.currentPath.length&&D.path.every((w,J)=>F.currentPath[J]===w))return console.warn(`Recursive reference detected at ${F.currentPath.join("/")}! Defaulting to any`),X2(F);return F.$refStrategy==="seen"?X2(F):void 0}}},Px1=(D,F,w)=>{if(D.description){if(w.description=D.description,F.markdownDescription)w.markdownDescription=D.description}return w};var iH=(D,F)=>{let w=Bb(F),J=typeof F==="object"&&F.definitions?Object.entries(F.definitions).reduce((K,[V,B])=>({...K,[V]:f1(B._def,{...w,currentPath:[...w.basePath,w.definitionPath,V]},!0)??X2(w)}),{}):void 0,Q=typeof F==="string"?F:F?.nameStrategy==="title"?void 0:F?.name,X=f1(D._def,Q===void 0?w:{...w,currentPath:[...w.basePath,w.definitionPath,Q]},!1)??X2(w),Y=typeof F==="object"&&F.name!==void 0&&F.nameStrategy==="title"?F.name:void 0;if(Y!==void 0)X.title=Y;if(w.flags.hasReferencedOpenAiAnyType){if(!J)J={};if(!J[w.openAiAnyTypeName])J[w.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:w.$refStrategy==="relative"?"1":[...w.basePath,w.definitionPath,w.openAiAnyTypeName].join("/")}}}let W=Q===void 0?J?{...X,[w.definitionPath]:J}:X:{$ref:[...w.$refStrategy==="relative"?[]:w.basePath,w.definitionPath,Q].join("/"),[w.definitionPath]:{...J,[Q]:X}};if(w.target==="jsonSchema7")W.$schema="http://json-schema.org/draft-07/schema#";else if(w.target==="jsonSchema2019-09"||w.target==="openAi")W.$schema="https://json-schema.org/draft/2019-09/schema#";if(w.target==="openAi"&&(("anyOf"in W)||("oneOf"in W)||("allOf"in W)||("type"in W)&&Array.isArray(W.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return W};var EM;(function(D){D.Completable="McpCompletable"})(EM||(EM={}));class $X extends s1{_parse(D){let{ctx:F}=this._processInputParams(D),w=F.data;return this._def.type._parse({data:w,path:F.path,parent:F})}unwrap(){return this._def.type}}$X.create=(D,F)=>{return new $X({type:D,typeName:EM.Completable,complete:F.complete,...Ox1(F)})};function Ox1(D){if(!D)return{};let{errorMap:F,invalid_type_error:w,required_error:J,description:Q}=D;if(F&&(w||J))throw Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);if(F)return{errorMap:F,description:Q};return{errorMap:(Y,W)=>{var K,V;let{message:B}=D;if(Y.code==="invalid_enum_value")return{message:B!==null&&B!==void 0?B:W.defaultError};if(typeof W.data>"u")return{message:(K=B!==null&&B!==void 0?B:J)!==null&&K!==void 0?K:W.defaultError};if(Y.code!=="invalid_type")return{message:W.defaultError};return{message:(V=B!==null&&B!==void 0?B:w)!==null&&V!==void 0?V:W.defaultError}},description:Q}}class PM{constructor(D,F){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new zX(D,F)}async connect(D){return await this.server.connect(D)}async close(){await this.server.close()}setToolRequestHandlers(){if(this._toolHandlersInitialized)return;this.server.assertCanSetRequestHandler(eF.shape.method.value),this.server.assertCanSetRequestHandler(Dw.shape.method.value),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(eF,()=>({tools:Object.entries(this._registeredTools).filter(([,D])=>D.enabled).map(([D,F])=>{let w={name:D,title:F.title,description:F.description,inputSchema:F.inputSchema?iH(F.inputSchema,{strictUnions:!0}):Ax1,annotations:F.annotations,_meta:F._meta};if(F.outputSchema)w.outputSchema=iH(F.outputSchema,{strictUnions:!0});return w})})),this.server.setRequestHandler(Dw,async(D,F)=>{let w=this._registeredTools[D.params.name];if(!w)throw new S1(j1.InvalidParams,`Tool ${D.params.name} not found`);if(!w.enabled)throw new S1(j1.InvalidParams,`Tool ${D.params.name} disabled`);let J;if(w.inputSchema){let Q=await w.inputSchema.safeParseAsync(D.params.arguments);if(!Q.success)throw new S1(j1.InvalidParams,`Invalid arguments for tool ${D.params.name}: ${Q.error.message}`);let X=Q.data,Y=w.callback;try{J=await Promise.resolve(Y(X,F))}catch(W){J={content:[{type:"text",text:W instanceof Error?W.message:String(W)}],isError:!0}}}else{let Q=w.callback;try{J=await Promise.resolve(Q(F))}catch(X){J={content:[{type:"text",text:X instanceof Error?X.message:String(X)}],isError:!0}}}if(w.outputSchema&&!J.isError){if(!J.structuredContent)throw new S1(j1.InvalidParams,`Tool ${D.params.name} has an output schema but no structured content was provided`);let Q=await w.outputSchema.safeParseAsync(J.structuredContent);if(!Q.success)throw new S1(j1.InvalidParams,`Invalid structured content for tool ${D.params.name}: ${Q.error.message}`)}return J}),this._toolHandlersInitialized=!0}setCompletionRequestHandler(){if(this._completionHandlerInitialized)return;this.server.assertCanSetRequestHandler(wH.shape.method.value),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(wH,async(D)=>{switch(D.params.ref.type){case"ref/prompt":return this.handlePromptCompletion(D,D.params.ref);case"ref/resource":return this.handleResourceCompletion(D,D.params.ref);default:throw new S1(j1.InvalidParams,`Invalid completion reference: ${D.params.ref}`)}}),this._completionHandlerInitialized=!0}async handlePromptCompletion(D,F){let w=this._registeredPrompts[F.name];if(!w)throw new S1(j1.InvalidParams,`Prompt ${F.name} not found`);if(!w.enabled)throw new S1(j1.InvalidParams,`Prompt ${F.name} disabled`);if(!w.argsSchema)return nH;let J=w.argsSchema.shape[D.params.argument.name];if(!(J instanceof $X))return nH;let X=await J._def.complete(D.params.argument.value,D.params.context);return hb(X)}async handleResourceCompletion(D,F){let w=Object.values(this._registeredResourceTemplates).find((X)=>X.resourceTemplate.uriTemplate.toString()===F.uri);if(!w){if(this._registeredResources[F.uri])return nH;throw new S1(j1.InvalidParams,`Resource template ${D.params.ref.uri} not found`)}let J=w.resourceTemplate.completeCallback(D.params.argument.name);if(!J)return nH;let Q=await J(D.params.argument.value,D.params.context);return hb(Q)}setResourceRequestHandlers(){if(this._resourceHandlersInitialized)return;this.server.assertCanSetRequestHandler(nF.shape.method.value),this.server.assertCanSetRequestHandler(sF.shape.method.value),this.server.assertCanSetRequestHandler(oF.shape.method.value),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(nF,async(D,F)=>{let w=Object.entries(this._registeredResources).filter(([Q,X])=>X.enabled).map(([Q,X])=>({uri:Q,name:X.name,...X.metadata})),J=[];for(let Q of Object.values(this._registeredResourceTemplates)){if(!Q.resourceTemplate.listCallback)continue;let X=await Q.resourceTemplate.listCallback(F);for(let Y of X.resources)J.push({...Q.metadata,...Y})}return{resources:[...w,...J]}}),this.server.setRequestHandler(sF,async()=>{return{resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([F,w])=>({name:F,uriTemplate:w.resourceTemplate.uriTemplate.toString(),...w.metadata}))}}),this.server.setRequestHandler(oF,async(D,F)=>{let w=new URL(D.params.uri),J=this._registeredResources[w.toString()];if(J){if(!J.enabled)throw new S1(j1.InvalidParams,`Resource ${w} disabled`);return J.readCallback(w,F)}for(let Q of Object.values(this._registeredResourceTemplates)){let X=Q.resourceTemplate.uriTemplate.match(w.toString());if(X)return Q.readCallback(w,X,F)}throw new S1(j1.InvalidParams,`Resource ${w} not found`)}),this.setCompletionRequestHandler(),this._resourceHandlersInitialized=!0}setPromptRequestHandlers(){if(this._promptHandlersInitialized)return;this.server.assertCanSetRequestHandler(rF.shape.method.value),this.server.assertCanSetRequestHandler(tF.shape.method.value),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(rF,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,D])=>D.enabled).map(([D,F])=>{return{name:D,title:F.title,description:F.description,arguments:F.argsSchema?Lx1(F.argsSchema):void 0}})})),this.server.setRequestHandler(tF,async(D,F)=>{let w=this._registeredPrompts[D.params.name];if(!w)throw new S1(j1.InvalidParams,`Prompt ${D.params.name} not found`);if(!w.enabled)throw new S1(j1.InvalidParams,`Prompt ${D.params.name} disabled`);if(w.argsSchema){let J=await w.argsSchema.safeParseAsync(D.params.arguments);if(!J.success)throw new S1(j1.InvalidParams,`Invalid arguments for prompt ${D.params.name}: ${J.error.message}`);let Q=J.data,X=w.callback;return await Promise.resolve(X(Q,F))}else{let J=w.callback;return await Promise.resolve(J(F))}}),this.setCompletionRequestHandler(),this._promptHandlersInitialized=!0}resource(D,F,...w){let J;if(typeof w[0]==="object")J=w.shift();let Q=w[0];if(typeof F==="string"){if(this._registeredResources[F])throw Error(`Resource ${F} is already registered`);let X=this._createRegisteredResource(D,void 0,F,J,Q);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),X}else{if(this._registeredResourceTemplates[D])throw Error(`Resource template ${D} is already registered`);let X=this._createRegisteredResourceTemplate(D,void 0,F,J,Q);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),X}}registerResource(D,F,w,J){if(typeof F==="string"){if(this._registeredResources[F])throw Error(`Resource ${F} is already registered`);let Q=this._createRegisteredResource(D,w.title,F,w,J);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),Q}else{if(this._registeredResourceTemplates[D])throw Error(`Resource template ${D} is already registered`);let Q=this._createRegisteredResourceTemplate(D,w.title,F,w,J);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),Q}}_createRegisteredResource(D,F,w,J,Q){let X={name:D,title:F,metadata:J,readCallback:Q,enabled:!0,disable:()=>X.update({enabled:!1}),enable:()=>X.update({enabled:!0}),remove:()=>X.update({uri:null}),update:(Y)=>{if(typeof Y.uri<"u"&&Y.uri!==w){if(delete this._registeredResources[w],Y.uri)this._registeredResources[Y.uri]=X}if(typeof Y.name<"u")X.name=Y.name;if(typeof Y.title<"u")X.title=Y.title;if(typeof Y.metadata<"u")X.metadata=Y.metadata;if(typeof Y.callback<"u")X.readCallback=Y.callback;if(typeof Y.enabled<"u")X.enabled=Y.enabled;this.sendResourceListChanged()}};return this._registeredResources[w]=X,X}_createRegisteredResourceTemplate(D,F,w,J,Q){let X={resourceTemplate:w,title:F,metadata:J,readCallback:Q,enabled:!0,disable:()=>X.update({enabled:!1}),enable:()=>X.update({enabled:!0}),remove:()=>X.update({name:null}),update:(Y)=>{if(typeof Y.name<"u"&&Y.name!==D){if(delete this._registeredResourceTemplates[D],Y.name)this._registeredResourceTemplates[Y.name]=X}if(typeof Y.title<"u")X.title=Y.title;if(typeof Y.template<"u")X.resourceTemplate=Y.template;if(typeof Y.metadata<"u")X.metadata=Y.metadata;if(typeof Y.callback<"u")X.readCallback=Y.callback;if(typeof Y.enabled<"u")X.enabled=Y.enabled;this.sendResourceListChanged()}};return this._registeredResourceTemplates[D]=X,X}_createRegisteredPrompt(D,F,w,J,Q){let X={title:F,description:w,argsSchema:J===void 0?void 0:M.object(J),callback:Q,enabled:!0,disable:()=>X.update({enabled:!1}),enable:()=>X.update({enabled:!0}),remove:()=>X.update({name:null}),update:(Y)=>{if(typeof Y.name<"u"&&Y.name!==D){if(delete this._registeredPrompts[D],Y.name)this._registeredPrompts[Y.name]=X}if(typeof Y.title<"u")X.title=Y.title;if(typeof Y.description<"u")X.description=Y.description;if(typeof Y.argsSchema<"u")X.argsSchema=M.object(Y.argsSchema);if(typeof Y.callback<"u")X.callback=Y.callback;if(typeof Y.enabled<"u")X.enabled=Y.enabled;this.sendPromptListChanged()}};return this._registeredPrompts[D]=X,X}_createRegisteredTool(D,F,w,J,Q,X,Y,W){let K={title:F,description:w,inputSchema:J===void 0?void 0:M.object(J),outputSchema:Q===void 0?void 0:M.object(Q),annotations:X,_meta:Y,callback:W,enabled:!0,disable:()=>K.update({enabled:!1}),enable:()=>K.update({enabled:!0}),remove:()=>K.update({name:null}),update:(V)=>{if(typeof V.name<"u"&&V.name!==D){if(delete this._registeredTools[D],V.name)this._registeredTools[V.name]=K}if(typeof V.title<"u")K.title=V.title;if(typeof V.description<"u")K.description=V.description;if(typeof V.paramsSchema<"u")K.inputSchema=M.object(V.paramsSchema);if(typeof V.callback<"u")K.callback=V.callback;if(typeof V.annotations<"u")K.annotations=V.annotations;if(typeof V._meta<"u")K._meta=V._meta;if(typeof V.enabled<"u")K.enabled=V.enabled;this.sendToolListChanged()}};return this._registeredTools[D]=K,this.setToolRequestHandlers(),this.sendToolListChanged(),K}tool(D,...F){if(this._registeredTools[D])throw Error(`Tool ${D} is already registered`);let w,J,Q,X;if(typeof F[0]==="string")w=F.shift();if(F.length>1){let W=F[0];if(bb(W)){if(J=F.shift(),F.length>1&&typeof F[0]==="object"&&F[0]!==null&&!bb(F[0]))X=F.shift()}else if(typeof W==="object"&&W!==null)X=F.shift()}let Y=F[0];return this._createRegisteredTool(D,void 0,w,J,Q,X,void 0,Y)}registerTool(D,F,w){if(this._registeredTools[D])throw Error(`Tool ${D} is already registered`);let{title:J,description:Q,inputSchema:X,outputSchema:Y,annotations:W,_meta:K}=F;return this._createRegisteredTool(D,J,Q,X,Y,W,K,w)}prompt(D,...F){if(this._registeredPrompts[D])throw Error(`Prompt ${D} is already registered`);let w;if(typeof F[0]==="string")w=F.shift();let J;if(F.length>1)J=F.shift();let Q=F[0],X=this._createRegisteredPrompt(D,void 0,w,J,Q);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),X}registerPrompt(D,F,w){if(this._registeredPrompts[D])throw Error(`Prompt ${D} is already registered`);let{title:J,description:Q,argsSchema:X}=F,Y=this._createRegisteredPrompt(D,J,Q,X,w);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),Y}isConnected(){return this.server.transport!==void 0}async sendLoggingMessage(D,F){return this.server.sendLoggingMessage(D,F)}sendResourceListChanged(){if(this.isConnected())this.server.sendResourceListChanged()}sendToolListChanged(){if(this.isConnected())this.server.sendToolListChanged()}sendPromptListChanged(){if(this.isConnected())this.server.sendPromptListChanged()}}var Ax1={type:"object",properties:{}};function bb(D){if(typeof D!=="object"||D===null)return!1;return Object.keys(D).length===0||Object.values(D).some(vx1)}function vx1(D){return D!==null&&typeof D==="object"&&"parse"in D&&typeof D.parse==="function"&&"safeParse"in D&&typeof D.safeParse==="function"}function Lx1(D){return Object.entries(D.shape).map(([F,w])=>({name:F,description:w.description,required:!w.isOptional()}))}function hb(D){return{completion:{values:D.slice(0,100),total:D.length,hasMore:D.length>100}}}var nH={completion:{values:[],hasMore:!1}};var OM=A1(p3(),1);var Zw="__prompts__",AM=M.object({name:p4,title:p4,description:M.string().trim().optional(),body:p4}),Vq0=M.object({prompts:M.array(AM).optional()});class vM extends yH{_promptList;constructor(D=[]){super({name:Zw},{server:yb(OM.default.cloneDeep(D))});this._promptList=OM.default.cloneDeep(D)}get promptList(){return this._promptList}async addPromptEntry(D){if(this._promptList.find((w)=>w.name===D.name))throw new p1("DUPLICATE",`Prompt ${D.name} already exists`);return this._promptList.push(D),await this.reconnectToServer(),D}async updatePrompt(D,F){let w=this._promptList.findIndex((J)=>J.name===D);if(w===-1)throw new p1("NOT_FOUND",`Prompt ${D} not found`);return this._promptList[w]={...this._promptList[w],...F},await this.reconnectToServer(),this._promptList[w]}async removePromptEntry(D){let F=this._promptList.findIndex((w)=>w.name===D);if(F===-1)throw new p1("NOT_FOUND",`Prompt ${D} not found`);this._promptList.splice(F,1),await this.reconnectToServer()}getPromptEntry(D){let F=this._promptList.find((w)=>w.name===D);if(!F)throw new p1("NOT_FOUND",`Prompt ${D} not found`);return F}async reconnectToServer(){await this.close(),await this.server.close(),this.server=yb(this._promptList),await this.connectToTarget({throwOnError:!0})}}function yb(D){let F=new PM({name:"prompt-manager",version:"1.0.0"},{capabilities:{logging:{}}});for(let w of D)F.registerPrompt(w.name,{title:w.title,description:w.description},async()=>{return await{messages:[{role:"user",content:{type:"text",text:w.body}}]}});return F.server}var gb=Uk.extend({type:M.literal("http")}),cb=Yb.extend({type:M.literal("stdio")}),lb=M.union([gb,cb]),LM=M.object({id:p4,name:p4,description:um,prompts:M.array(AM).optional(),servers:M.array(lb)});var g2=A1(p3(),1);class RM{schema;storage;defaults;constructor(D){this.schema=D.schema,this.storage=D.storage,this.defaults=D.defaults??{}}get data(){return this.storage.getData()}async init(){await this.storage.init(),this.validate({...this.defaults,...this.storage.getData()})}async set(D,F){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let J=this.schema[D].parse(F),Q=this.storage.getData();g2.set(Q,D,J),this.storage.setData(Q),await this.storage.persist()}get(D){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let F=g2.get({...this.defaults,...this.storage.getData()},D);if(F!==void 0)return F;let J=this.schema[D].safeParse(void 0);if(J.success)return J.data;return}async purge(){await this.storage.purge()}async push(D,F){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let w=this.schema[D],J=this.unwrapArraySchema(w);if(!J)throw new p1("INVALID_ARGUMENT",`Key "${D}" is not an array`,{key:D});let Q=J.element.parse(F),X=this.storage.getData(),W=[...g2.get({...this.defaults,...X},D)??[],Q];g2.set(X,D,W),this.storage.setData(X),await this.storage.persist()}async remove(D,F){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let w=this.schema[D];if(!this.unwrapArraySchema(w))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not an array`,{key:D});let Q=this.storage.getData(),W=[...g2.get({...this.defaults,...Q},D)??[]].filter((K)=>{if(!g2.isObject(K)||K===null)return!g2.isEqual(K,F);return!g2.isMatch(K,F)});g2.set(Q,D,W),this.storage.setData(Q),await this.storage.persist()}find(D,F){if(!(D in this.schema))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not allowed`,{key:D});let w=this.schema[D];if(!this.unwrapArraySchema(w))throw new p1("INVALID_ARGUMENT",`Key "${D}" is not an array`,{key:D});let Q=this.storage.getData();return[...g2.get({...this.defaults,...Q},D)??[]].find((K)=>{if(!g2.isObject(K)||K===null)return g2.isEqual(K,F);return g2.isMatch(K,F)})}unwrapArraySchema(D){while(!0){if(D instanceof M.ZodArray)return D;if(D instanceof M.ZodDefault){D=D._def.innerType;continue}if(D instanceof M.ZodOptional||D instanceof M.ZodNullable){D=D._def.innerType;continue}if(D instanceof M.ZodEffects){D=D._def.schema;continue}return null}}validate(D){let F={...this.defaults,...D};for(let w in this.schema){let J=g2.get(F,w),Q=this.schema[w];try{Q.parse(J)}catch(X){throw new p1("INVALID_CONFIGURATION",`Invalid data for key "${w}": ${X instanceof Error?X.message:String(X)}`,{key:w,value:J})}}}}var mB=A1(Dg(),1);import Fg from"fs";import{existsSync as Ld1}from"node:fs";class kE{data;constructor(D){this.data={...D?.data}}init(){return Promise.resolve()}persist(){return Promise.resolve()}purge(){return this.data={},Promise.resolve()}getData(){return structuredClone(this.data)}setData(D){this.data=structuredClone(D)}toPlainObject(){return{type:"in-memory",data:this.data}}}class bE{filePath;data={};constructor(D){if(!D.filePath)throw Error("Config filePath is not defined");this.filePath=D.filePath}async init(){if(Ld1(this.filePath)){let D=await Fg.promises.readFile(this.filePath,"utf8"),F=mB.default.parse(D);this.data=F&&typeof F==="object"&&!Array.isArray(F)?F:{}}}async persist(){let F=this.filePath.endsWith(".json")?JSON.stringify(this.data):mB.default.stringify(this.data);await Fg.promises.writeFile(this.filePath,F)}async purge(){this.data={},await this.persist()}getData(){return structuredClone(this.data)}setData(D){this.data=structuredClone(D)}toPlainObject(){return{type:"yaml",path:this.filePath,data:this.data}}}class cX extends RM{playbooks;constructor(D){super({schema:Rd1,storage:D.storage,defaults:D.defaults});this.playbooks=new Qg(this)}static async createFileBasedConfig(D){let F=new cX({storage:new bE({filePath:D.filePath}),defaults:D.defaults});return await F.init(),F}static async createMemoryBasedConfig(D){let F=new cX({storage:new kE,defaults:D.defaults});return await F.init(),F}toPlainObject(){return{defaults:this.defaults,storage:this.storage.toPlainObject()}}prettyPrint(){console.log("*************************************************"),console.log(),console.log(g0("STORAGE")),console.log(JSON.stringify(dB.default.omit(this.storage.toPlainObject(),"data"),null,2)),console.log(),console.log(g0("DEFAULTS")),console.log(JSON.stringify(this.defaults,null,2)),console.log(),console.log("*************************************************")}}class Qg{config;constructor(D){this.config=D}async create(D){let F=wg(D.name);if(await this.config.find("playbooks",{id:F}))throw new p1("DUPLICATE","Playbook with this name already exists");let w={id:F,...D,servers:dB.default.map(D.servers||[],(J)=>({...J,name:wg(J.name)}))};return await this.config.push("playbooks",w),w}async getPlaybook(D){let F=await this.all(),w=dB.default.find(F,{id:D});if(!w)throw Error("Playbook not found");return w}async update(D,F){if(F.id!==D)throw Error("Id mismatch");return await this.config.remove("playbooks",{id:D}),await this.config.push("playbooks",F),F}async remove(D){await this.config.remove("playbooks",{id:D})}async count(){return(await this.all()).length}async all(){return await this.config.get("playbooks")||[]}}function wg(D){return Jg.default(D,{lower:!0,strict:!0,trim:!0})}var Rd1={version:M.string().default("1.0.0"),playbooks:M.array(LM).default([]),debug:M.boolean().default(!1),"server.port":M.number().min(0),"registry.url":M.string(),"registry.apiKey":M.string().optional(),"telemetry.writeKey":M.string(),"telemetry.enabled":M.boolean(),"oauth.storage":M.literal("disk").or(M.literal("memory")).default("disk"),"oauth.tokenDirectory":M.string().default("./tokens"),"clients.claude":M.array(M.string()).default([]),"clients.claude-code":M.array(M.string()).default([]),"clients.cursor":M.array(M.string()).default([]),"clients.vscode":M.array(M.string()).default([])};import xd1 from"fs";function uB(D){for(let F of D)try{if(xd1.existsSync(F))return F}catch{continue}return}var xr=A1(Lr(),1),Tr=A1(Rr(),1);import SO from"os";class cw{analytics;machineId;enabled;traits;constructor(D){this.analytics=new xr.Analytics({writeKey:D.writeKey}),this.enabled=D.enabled,this.traits=D.traits||{}}async initialize(){if(this.machineId)return;if(this.machineId=await Tr.machineId(),this.enabled)this.analytics.identify({userId:this.machineId,traits:{...this.traits,os:SO.platform(),osVersion:SO.release(),arch:SO.arch()}})}static noTelemetry(){return new cw({writeKey:"--",enabled:!1})}async trackEvent(D,F={}){if(await this.initialize(),this.enabled)this.analytics.track({userId:this.machineId,event:D,properties:F})}}var C6={name:"@director.run/cli",type:"module",version:"1.0.1",files:["dist","README.md","package.json"],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:"Playbooks for AI agents",homepage:"https://director.run",publishConfig:{access:"public"},scripts:{lint:"biome check .",format:"biome format --write .",clean:"rm -rf .turbo dist/*",test:"bun run vitest --fileParallelism=false",cli:"LOG_LEVEL=debug NODE_ENV=development bun run bin/cli.ts","cli:dev":"NODE_ENV=development bun --watch bin/cli.ts",typecheck:"tsc --noEmit",build:"bun run clean && bun build --production --target=node bin/cli.ts --outdir dist && cp -r ../studio/dist dist/studio",release:"changeset publish",dev:"bun --watch bin/cli.ts",spellcheck:'cspell "**"'},peerDependencies:{typescript:"^5"},devDependencies:{"@director.run/gateway":"workspace:*","@director.run/client-configurator":"workspace:*","@director.run/mcp":"workspace:*","@director.run/registry":"workspace:*","@director.run/utilities":"workspace:*","@inquirer/prompts":"^7.5.2","@modelcontextprotocol/sdk":"1.20.0","@segment/analytics-node":"^2.3.0","@trpc/server":"^11.0.2","@types/semver":"^7.5.8","@types/update-notifier":"^6.0.8",boxen:"^8.0.1",chalk:"^5.4.1","cli-table3":"^0.6.5",commander:"^13.1.0","node-machine-id":"^1.1.12",semver:"^7.7.2",superjson:"^2.2.2","type-fest":"^4.40.0",typescript:"^5.8.3","update-notifier":"^7.3.1",vitest:"^3.1.1",zod:"^3.25.76",zx:"^8.8.0",cspell:"^9.2.2"}};var __dirname="/home/runner/work/director/director/apps/cli/src",Ts1="Z8wjEfWMFnlltCpGPPWlvsEQH1aVEUH3";function KD(){if(t6())return WD.join(__dirname,"../../../director.config.test.yaml");else if(aF())return WD.join(__dirname,"../../../director.config.development.yaml");else{let D=WD.join(xs1.homedir(),".director/director.config.yaml"),F=WD.join(process.cwd(),"director.config.yaml");return uB([F,D])??D}}function _s1(){if(t6())return{storage:"memory"};else return{storage:"disk",tokenDirectory:WD.join(WD.dirname(KD()),".secrets/director-oauth-tokens")}}var Cs1=WD.dirname(KD());await Rs1.mkdir(Cs1,{recursive:!0});var n4=await cX.createFileBasedConfig({filePath:KD(),defaults:{debug:aF(),registry:{url:"https://registry.director.run"},server:{port:t6()?3675:parseInt(process.env.GATEWAY_PORT??"3673")},telemetry:{writeKey:oq()?Ts1:"--",enabled:oq()},oauth:_s1()}});function a2(){return`http://localhost:${n4.get("server.port")}`}function jO(){return`${a2()}/studio`}function _r(){return new cw({writeKey:n4.get("telemetry.writeKey")??"--",enabled:!!n4.get("telemetry.enabled"),traits:{cliVersion:C6.version}})}var ir=A1(ar(),1),{program:IO0,createCommand:fO0,createArgument:SO0,createOption:jO0,CommanderError:mO0,InvalidArgumentError:dO0,InvalidOptionArgumentError:uO0,Command:cO,Argument:kO0,Option:nr,Help:bO0}=ir.default;var lO=" ".repeat(2);function rr(D){let F=[];if(D._enableDebugCommands)F.push(B4("\uD83D\uDEA7 debug commands appear in yellow \uD83D\uDEA7")),F.push("");if(F.push(D.description().trim()),F.push(""),F.push(lw("usage")),F.push(lO+ZY([D.parent?D.parent.name():"",D.name(),er("command"),"[subcommand]","[flags]"])),F.push(""),D.parent)F.push(lw(`${D.name()} commands`));else F.push(lw("core commands"));D.commands.toSorted((J,Q)=>Number(!!J.commands.length)-Number(!!Q.commands.length)).forEach((J)=>{if(J.commands.length)F.push(""),F.push(lw(J.name())),J.commands.forEach((Q)=>{F.push(sr(Q))});else F.push(sr(J))}),F.push("");let w=[D._helpOption,...D.options].filter((J)=>J!==void 0);if(w.length)F.push(lw("flags")),w.forEach((J)=>{F.push(ZY([lO,J.flags,tr(J.description,J.flags.length)]))}),F.push("");if(D.examples)F.push(lw("examples")),F.push(" "+D.examples.trim()),F.push("");return F.push(""),F.join(`
|
|
595
595
|
`)}var lw=(D)=>{return g0(D.toLocaleUpperCase())},sr=(D)=>{let F=D.registeredArguments.map((X)=>X.required?er(X.name()):or(X.name())).filter((X)=>X!=="").join(" "),w=ZY([ZY([D.parent&&D.parent.parent?D.parent?.name():void 0,D.name()]),F,D.options.length?or("options"):""]),J=D.description()||K5("TODO"),Q=ZY([lO,w,tr(J,w.length)]);return D._debug?B4(Q):Q},tr=(D,F)=>{return" ".repeat(Math.max(0,45-F))+D},er=(D)=>["<",D,">"].join(""),or=(D)=>["[",D,"]"].join(""),ZY=(D)=>D.filter(Boolean).join(" ");class g8 extends cO{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 cO(D)}helpInformation(D){return rr(this)}addExamples(D){this.examples=D}addCommand(D,F){return D._enableDebugCommands=this._enableDebugCommands,D._debug=this._debug,super.addCommand(D,F)}}function I6({flags:D,description:F,defaultValue:w,choices:J,mandatory:Q,variadic:X}){let Y=new nr(D,F);if(Q&&Y.makeOptionMandatory(),w&&Y.default(w),J&&Y.choices(J),X)Y.argParser((W,K)=>{if(K===void 0||K===null)return[W];return K.concat(W)});return Y}import TG from"node:process";function aO({onlyFirst:D=!1}={}){return new RegExp("(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]",D?void 0:"g")}var Po1=aO();function VD(D){if(typeof D!=="string")throw TypeError(`Expected a \`string\`, got \`${typeof D}\``);return D.replace(Po1,"")}function Dt(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 Ft(D){return D===12288||D>=65281&&D<=65376||D>=65504&&D<=65510}function wt(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<=94198||D>=94208&&D<=101589||D>=101631&&D<=101662||D>=101760&&D<=101874||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<=128728||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<=129674||D>=129678&&D<=129734||D===129736||D>=129741&&D<=129756||D>=129759&&D<=129770||D>=129775&&D<=129784||D>=131072&&D<=196605||D>=196608&&D<=262141}function Oo1(D){if(!Number.isSafeInteger(D))throw TypeError(`Expected a code point, got \`${typeof D}\`.`)}function Jt(D,{ambiguousAsWide:F=!1}={}){if(Oo1(D),Ft(D)||wt(D)||F&&Dt(D))return 2;return 1}var Yt=A1(Xt(),1),Ao1=new Intl.Segmenter,vo1=/^\p{Default_Ignorable_Code_Point}$/u;function z4(D,F={}){if(typeof D!=="string"||D.length===0)return 0;let{ambiguousIsNarrow:w=!0,countAnsiEscapeCodes:J=!1}=F;if(!J)D=VD(D);if(D.length===0)return 0;let Q=0,X={ambiguousAsWide:!w};for(let{segment:Y}of Ao1.segment(D)){let W=Y.codePointAt(0);if(W<=31||W>=127&&W<=159)continue;if(W>=8203&&W<=8207||W===65279)continue;if(W>=768&&W<=879||W>=6832&&W<=6911||W>=7616&&W<=7679||W>=8400&&W<=8447||W>=65056&&W<=65071)continue;if(W>=55296&&W<=57343)continue;if(W>=65024&&W<=65039)continue;if(vo1.test(Y))continue;if(Yt.default().test(Y)){Q+=2;continue}Q+=Jt(W,X)}return Q}function AG(D){let F=0;for(let w of D.split(`
|
|
596
596
|
`))F=Math.max(F,z4(w));return F}var St=A1(nO(),1);var Ro1=/[\p{Lu}]/u,xo1=/[\p{Ll}]/u,Vt=/^[\p{Lu}](?![\p{Lu}])/gu,Gt=/([\p{Alpha}\p{N}_]|$)/u,sO=/[_.\- ]+/,To1=new RegExp("^"+sO.source),Ht=new RegExp(sO.source+Gt.source,"gu"),Bt=new RegExp("\\d+"+Gt.source,"gu"),_o1=(D,F,w,J)=>{let Q=!1,X=!1,Y=!1,W=!1;for(let K=0;K<D.length;K++){let V=D[K];if(W=K>2?D[K-3]==="-":!0,Q&&Ro1.test(V))D=D.slice(0,K)+"-"+D.slice(K),Q=!1,Y=X,X=!0,K++;else if(X&&Y&&xo1.test(V)&&(!W||J))D=D.slice(0,K-1)+"-"+D.slice(K-1),Y=X,X=!1,Q=!0;else Q=F(V)===V&&w(V)!==V,Y=X,X=w(V)===V&&F(V)!==V}return D},Co1=(D,F)=>{return Vt.lastIndex=0,D.replaceAll(Vt,(w)=>F(w))},Io1=(D,F)=>{return Ht.lastIndex=0,Bt.lastIndex=0,D.replaceAll(Bt,(w,J,Q)=>["_","-"].includes(D.charAt(Q+w.length))?w:F(w)).replaceAll(Ht,(w,J)=>F(J))};function oO(D,F){if(!(typeof D==="string"||Array.isArray(D)))throw TypeError("Expected the input to be `string | string[]`");if(F={pascalCase:!1,preserveConsecutiveUppercase:!1,...F},Array.isArray(D))D=D.map((X)=>X.trim()).filter((X)=>X.length).join("-");else D=D.trim();if(D.length===0)return"";let w=F.locale===!1?(X)=>X.toLowerCase():(X)=>X.toLocaleLowerCase(F.locale),J=F.locale===!1?(X)=>X.toUpperCase():(X)=>X.toLocaleUpperCase(F.locale);if(D.length===1){if(sO.test(D))return"";return F.pascalCase?J(D):w(D)}if(D!==w(D))D=_o1(D,w,J,F.preserveConsecutiveUppercase);if(D=D.replace(To1,""),D=F.preserveConsecutiveUppercase?Co1(D,w):w(D),F.pascalCase)D=J(D.charAt(0))+D.slice(1);return Io1(D,J)}var wA=A1(Pt(),1);var Ot=(D=0)=>(F)=>`\x1B[${F+D}m`,At=(D=0)=>(F)=>`\x1B[${38+D};5;${F}m`,vt=(D=0)=>(F,w,J)=>`\x1B[${38+D};2;${F};${w};${J}m`,Y2={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]}},UA0=Object.keys(Y2.modifier),bo1=Object.keys(Y2.color),ho1=Object.keys(Y2.bgColor),zA0=[...bo1,...ho1];function yo1(){let D=new Map;for(let[F,w]of Object.entries(Y2)){for(let[J,Q]of Object.entries(w))Y2[J]={open:`\x1B[${Q[0]}m`,close:`\x1B[${Q[1]}m`},w[J]=Y2[J],D.set(Q[0],Q[1]);Object.defineProperty(Y2,F,{value:w,enumerable:!1})}return Object.defineProperty(Y2,"codes",{value:D,enumerable:!1}),Y2.color.close="\x1B[39m",Y2.bgColor.close="\x1B[49m",Y2.color.ansi=Ot(),Y2.color.ansi256=At(),Y2.color.ansi16m=vt(),Y2.bgColor.ansi=Ot(10),Y2.bgColor.ansi256=At(10),Y2.bgColor.ansi16m=vt(10),Object.defineProperties(Y2,{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((X)=>X+X).join("");let Q=Number.parseInt(J,16);return[Q>>16&255,Q>>8&255,Q&255]},enumerable:!1},hexToAnsi256:{value:(F)=>Y2.rgbToAnsi256(...Y2.hexToRgb(F)),enumerable:!1},ansi256ToAnsi:{value(F){if(F<8)return 30+F;if(F<16)return 90+(F-8);let w,J,Q;if(F>=232)w=((F-232)*10+8)/255,J=w,Q=w;else{F-=16;let W=F%36;w=Math.floor(F/36)/5,J=Math.floor(W/6)/5,Q=W%6/5}let X=Math.max(w,J,Q)*2;if(X===0)return 30;let Y=30+(Math.round(Q)<<2|Math.round(J)<<1|Math.round(w));if(X===2)Y+=60;return Y},enumerable:!1},rgbToAnsi:{value:(F,w,J)=>Y2.ansi256ToAnsi(Y2.rgbToAnsi256(F,w,J)),enumerable:!1},hexToAnsi:{value:(F)=>Y2.ansi256ToAnsi(Y2.hexToAnsi256(F)),enumerable:!1}}),Y2}var go1=yo1(),Lt=go1;var RG=new Set(["\x1B",""]),co1=39,FA="\x07",Tt="[",lo1="]",_t="m",LG=`${lo1}8;;`,Rt=(D)=>`${RG.values().next().value}${Tt}${D}${_t}`,xt=(D)=>`${RG.values().next().value}${LG}${D}${FA}`,ao1=(D)=>D.split(" ").map((F)=>z4(F)),DA=(D,F,w)=>{let J=[...F],Q=!1,X=!1,Y=z4(VD(D.at(-1)));for(let[W,K]of J.entries()){let V=z4(K);if(Y+V<=w)D[D.length-1]+=K;else D.push(K),Y=0;if(RG.has(K))Q=!0,X=J.slice(W+1,W+1+LG.length).join("")===LG;if(Q){if(X){if(K===FA)Q=!1,X=!1}else if(K===_t)Q=!1;continue}if(Y+=V,Y===w&&W<J.length-1)D.push(""),Y=0}if(!Y&&D.at(-1).length>0&&D.length>1)D[D.length-2]+=D.pop()},io1=(D)=>{let F=D.split(" "),w=F.length;while(w>0){if(z4(F[w-1])>0)break;w--}if(w===F.length)return D;return F.slice(0,w).join(" ")+F.slice(w).join("")},no1=(D,F,w={})=>{if(w.trim!==!1&&D.trim()==="")return"";let J="",Q,X,Y=ao1(D),W=[""];for(let[p,N]of D.split(" ").entries()){if(w.trim!==!1)W[W.length-1]=W.at(-1).trimStart();let Z=z4(W.at(-1));if(p!==0){if(Z>=F&&(w.wordWrap===!1||w.trim===!1))W.push(""),Z=0;if(Z>0||w.trim===!1)W[W.length-1]+=" ",Z++}if(w.hard&&Y[p]>F){let U=F-Z,z=1+Math.floor((Y[p]-U-1)/F);if(Math.floor((Y[p]-1)/F)<z)W.push("");DA(W,N,F);continue}if(Z+Y[p]>F&&Z>0&&Y[p]>0){if(w.wordWrap===!1&&Z<F){DA(W,N,F);continue}W.push("")}if(Z+Y[p]>F&&w.wordWrap===!1){DA(W,N,F);continue}W[W.length-1]+=N}if(w.trim!==!1)W=W.map((p)=>io1(p));let K=W.join(`
|
|
597
597
|
`),V=[...K],B=0;for(let[p,N]of V.entries()){if(J+=N,RG.has(N)){let{groups:U}=new RegExp(`(?:\\${Tt}(?<code>\\d+)m|\\${LG}(?<uri>.*)${FA})`).exec(K.slice(B))||{groups:{}};if(U.code!==void 0){let z=Number.parseFloat(U.code);Q=z===co1?void 0:z}else if(U.uri!==void 0)X=U.uri.length===0?void 0:U.uri}let Z=Lt.codes.get(Number(Q));if(V[p+1]===`
|
|
@@ -663,7 +663,7 @@ ${F}`,tY0=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),eY0=Obj
|
|
|
663
663
|
at ${x}`)}let[R,_]=typeof v==="string"?[v]:v;B.render(R,_),DF.run()}catch(v){Z(v)}}),Object.assign(p.then((v)=>{return DF.clearAll(),v},(v)=>{throw DF.clearAll(),v}).finally(()=>{W.forEach((v)=>v()),B.done({clearContent:Boolean(Q.clearPromptOnDone)}),K.end()}).then(()=>p),{cancel:U})})}}var uQ1=A1(qN(),1);class V7{separator=uQ1.default.dim(Array.from({length:15}).join(aJ.line));type="separator";constructor(D){if(D)this.separator=D}static isSeparator(D){return Boolean(D&&typeof D==="object"&&"type"in D&&D.type==="separator")}}var xX1=A1(LX1(),1),xT=A1(oL(),1);import{spawn as $K0,spawnSync as MK0}from"child_process";import{readFileSync as EK0,unlinkSync as PK0,writeFileSync as OK0}from"fs";import RT from"node:path";import AK0 from"node:os";import{randomUUID as vK0}from"node:crypto";class AT extends Error{originalError;constructor(D){super(`Failed to create temporary file. ${D.message}`);this.originalError=D}}class xN extends Error{originalError;constructor(D){super(`Failed to launch editor. ${D.message}`);this.originalError=D}}class vT extends Error{originalError;constructor(D){super(`Failed to read temporary file. ${D.message}`);this.originalError=D}}class LT extends Error{originalError;constructor(D){super(`Failed to remove temporary file. ${D.message}`);this.originalError=D}}function TX1(D="",F,w){let J=new _X1(D,w);J.runAsync((Q,X)=>{if(Q)setImmediate(F,Q,void 0);else try{J.cleanup(),setImmediate(F,void 0,X)}catch(Y){setImmediate(F,Y,void 0)}})}function RX1(D){if(!D)return"";return D.replace(/[^a-zA-Z0-9_.-]/g,"_")}function LK0(D){let F=[],w="";for(let J=0;J<D.length;J++){let Q=D.charAt(J);if(J>0&&Q===" "&&D[J-1]!=="\\"&&w.length>0)F.push(w),w="";else w=`${w}${Q}`}if(w.length>0)F.push(w);return F}class _X1{text="";tempFile;editor;lastExitStatus=0;fileOptions={};get temp_file(){return console.log("DEPRECATED: temp_file. Use tempFile moving forward."),this.tempFile}get last_exit_status(){return console.log("DEPRECATED: last_exit_status. Use lastExitStatus moving forward."),this.lastExitStatus}constructor(D="",F){if(this.text=D,F)this.fileOptions=F;this.determineEditor(),this.createTemporaryFile()}run(){return this.launchEditor(),this.readTemporaryFile(),this.text}runAsync(D){try{this.launchEditorAsync(()=>{try{this.readTemporaryFile(),setImmediate(D,void 0,this.text)}catch(F){setImmediate(D,F,void 0)}})}catch(F){setImmediate(D,F,void 0)}}cleanup(){this.removeTemporaryFile()}determineEditor(){let D=process.env.VISUAL?process.env.VISUAL:process.env.EDITOR?process.env.EDITOR:process.platform.startsWith("win")?"notepad":"vim",F=LK0(D).map((J)=>J.replace("\\ "," ")),w=F.shift();this.editor={args:F,bin:w}}createTemporaryFile(){try{let D=this.fileOptions.dir??AK0.tmpdir(),F=vK0(),w=RX1(this.fileOptions.prefix),J=RX1(this.fileOptions.postfix),Q=`${w}${F}${J}`,X=RT.resolve(D,Q),Y=RT.resolve(D)+RT.sep;if(!X.startsWith(Y))throw Error("Resolved temporary file escaped the base directory");this.tempFile=X;let W={encoding:"utf8",flag:"wx"};if(Object.prototype.hasOwnProperty.call(this.fileOptions,"mode"))W.mode=this.fileOptions.mode;OK0(this.tempFile,this.text,W)}catch(D){throw new AT(D)}}readTemporaryFile(){try{let D=EK0(this.tempFile);if(D.length===0)this.text="";else{let F=xX1.detect(D)??"utf8";if(!xT.default.encodingExists(F))F="utf8";this.text=xT.default.decode(D,F)}}catch(D){throw new vT(D)}}removeTemporaryFile(){try{PK0(this.tempFile)}catch(D){throw new LT(D)}}launchEditor(){try{let D=MK0(this.editor.bin,this.editor.args.concat([this.tempFile]),{stdio:"inherit"});this.lastExitStatus=D.status??0}catch(D){throw new xN(D)}}launchEditorAsync(D){try{$K0(this.editor.bin,this.editor.args.concat([this.tempFile]),{stdio:"inherit"}).on("exit",(w)=>{this.lastExitStatus=w,setImmediate(D)})}catch(F){throw new xN(F)}}}var RK0={validationFailureMode:"keep"},TN=w9((D,F)=>{let{waitForUseInput:w=!0,file:{postfix:J=D.postfix??".txt",...Q}={},validate:X=()=>!0}=D,Y=u6(RK0,D.theme),[W,K]=t0("idle"),[V="",B]=t0(D.default),[p,N]=t0(),Z=D9({status:W,theme:Y});function U(A){A.pause();let v=async(R,_)=>{if(A.resume(),R)N(R.toString());else{K("loading");let x=_??"",j=await X(x);if(j===!0)N(void 0),K("done"),F(x);else{if(Y.validationFailureMode==="clear")B(D.default);else B(x);N(j||"You must provide a valid value"),K("idle")}}};TX1(V,(R,_)=>void v(R,_),{postfix:J,...Q})}e8((A)=>{if(!w)U(A)},[]),F9((A,v)=>{if(W!=="idle")return;if(g9(A))U(v)});let z=Y.style.message(D.message,W),$="";if(W==="loading")$=Y.style.help("Received");else if(W==="idle"){let A=Y.style.key("enter");$=Y.style.help(`Press ${A} to launch your preferred editor.`)}let P="";if(p)P=Y.style.error(p);return[[Z,z,$].filter(Boolean).join(" "),P]});function CX1(D,F){let w=F!==!1;if(/^(y|yes)/i.test(D))w=!0;else if(/^(n|no)/i.test(D))w=!1;return w}function IX1(D){return D?"Yes":"No"}var H7=w9((D,F)=>{let{transformer:w=IX1}=D,[J,Q]=t0("idle"),[X,Y]=t0(""),W=u6(D.theme),K=D9({status:J,theme:W});F9((N,Z)=>{if(J!=="idle")return;if(g9(N)){let U=CX1(X,D.default);Y(w(U)),Q("done"),F(U)}else if(UN(N)){let U=IX1(!CX1(X,D.default));Z.clearLine(0),Z.write(U),Y(U)}else Y(Z.line)});let V=X,B="";if(J==="done")V=W.style.answer(X);else B=` ${W.style.defaultAnswer(D.default===!1?"y/N":"Y/n")}`;let p=W.style.message(D.message,J);return`${K} ${p}${B} ${V}`});var xK0={validationFailureMode:"keep"},Q9=w9((D,F)=>{let{required:w,validate:J=()=>!0,prefill:Q="tab"}=D,X=u6(xK0,D.theme),[Y,W]=t0("idle"),[K="",V]=t0(D.default),[B,p]=t0(),[N,Z]=t0(""),U=D9({status:Y,theme:X});F9(async(v,R)=>{if(Y!=="idle")return;if(g9(v)){let _=N||K;W("loading");let x=w&&!_?"You must provide a value":await J(_);if(x===!0)Z(_),W("done"),F(_);else{if(X.validationFailureMode==="clear")Z("");else R.write(N);p(x||"You must provide a valid value"),W("idle")}}else if(NN(v)&&!N)V(void 0);else if(UN(v)&&!N)V(void 0),R.clearLine(0),R.write(K),Z(K);else Z(R.line),p(void 0)}),e8((v)=>{if(Q==="editable"&&K)v.write(K),Z(K)},[]);let z=X.style.message(D.message,Y),$=N;if(typeof D.transformer==="function")$=D.transformer(N,{isFinal:Y==="done"});else if(Y==="done")$=X.style.answer(N);let P;if(K&&Y!=="done"&&!N)P=X.style.defaultAnswer(K);let A="";if(B)A=X.style.error(B);return[[U,z,P,$].filter((v)=>v!==void 0).join(" "),A]});var TT=w9((D,F)=>{let{validate:w=()=>!0}=D,J=u6(D.theme),[Q,X]=t0("idle"),[Y,W]=t0(),[K,V]=t0(""),B=D9({status:Q,theme:J});F9(async(z,$)=>{if(Q!=="idle")return;if(g9(z)){let P=K;X("loading");let A=await w(P);if(A===!0)V(P),X("done"),F(P);else $.write(K),W(A||"You must provide a valid value"),X("idle")}else V($.line),W(void 0)});let p=J.style.message(D.message,Q),N="",Z;if(D.mask)N=(typeof D.mask==="string"?D.mask:"*").repeat(K.length);else if(Q!=="done")Z=`${J.style.help("[input is masked]")}${PN}`;if(Q==="done")N=J.style.answer(N);let U="";if(Y)U=J.style.error(Y);return[[B,p,D.mask?N:Z].join(" "),U]});var _T=A1(qN(),1);var TK0={icon:{cursor:aJ.pointer},style:{disabled:(D)=>_T.default.dim(`- ${D}`),description:(D)=>_T.default.cyan(D)},helpMode:"auto",indexMode:"hidden"};function rJ(D){return!V7.isSeparator(D)&&!D.disabled}function _K0(D){return D.map((F)=>{if(V7.isSeparator(F))return F;if(typeof F==="string")return{value:F,name:F,short:F,disabled:!1};let w=F.name??String(F.value),J={value:F.value,name:w,short:F.short??w,disabled:F.disabled??!1};if(F.description)J.description=F.description;return J})}var CT=w9((D,F)=>{let{loop:w=!0,pageSize:J=7}=D,Q=K7(!0),X=u6(TK0,D.theme),[Y,W]=t0("idle"),K=D9({status:Y,theme:X}),V=K7(),B=iW(()=>_K0(D.choices),[D.choices]),p=iW(()=>{let x=B.findIndex(rJ),j=B.findLastIndex(rJ);if(x===-1)throw new aW("[select prompt] No selectable choices. All choices are disabled.");return{first:x,last:j}},[B]),N=iW(()=>{if(!("default"in D))return-1;return B.findIndex((x)=>rJ(x)&&x.value===D.default)},[D.default,B]),[Z,U]=t0(N===-1?p.first:N),z=B[Z];F9((x,j)=>{if(clearTimeout(V.current),g9(x))W("done"),F(z.value);else if(ZN(x)||FT(x)){if(j.clearLine(0),w||ZN(x)&&Z!==p.first||FT(x)&&Z!==p.last){let m=ZN(x)?-1:1,T=Z;do T=(T+m+B.length)%B.length;while(!rJ(B[T]));U(T)}}else if(eJ1(x)&&!Number.isNaN(Number(j.line))){let m=Number(j.line)-1,T=-1,k=B.findIndex((c)=>{if(V7.isSeparator(c))return!1;return T++,T===m}),u=B[k];if(u!=null&&rJ(u))U(k);V.current=setTimeout(()=>{j.clearLine(0)},700)}else if(NN(x))j.clearLine(0);else{let m=j.line.toLowerCase(),T=B.findIndex((k)=>{if(V7.isSeparator(k)||!rJ(k))return!1;return k.name.toLowerCase().startsWith(m)});if(T!==-1)U(T);V.current=setTimeout(()=>{j.clearLine(0)},700)}}),e8(()=>()=>{clearTimeout(V.current)},[]);let $=X.style.message(D.message,Y),P="",A="";if(X.helpMode==="always"||X.helpMode==="auto"&&Q.current)if(Q.current=!1,B.length>J)A=`
|
|
664
664
|
${X.style.help(`(${D.instructions?.pager??"Use arrow keys to reveal more choices"})`)}`;else P=X.style.help(`(${D.instructions?.navigation??"Use arrow keys"})`);let v=0,R=GT({items:B,active:Z,renderItem({item:x,isActive:j,index:m}){if(V7.isSeparator(x))return v++,` ${x.separator}`;let T=X.indexMode==="number"?`${m+1-v}. `:"";if(x.disabled){let c=typeof x.disabled==="string"?x.disabled:"(disabled)";return X.style.disabled(`${T}${x.name} ${c}`)}let k=j?X.style.highlight:(c)=>c,u=j?X.icon.cursor:" ";return k(`${u} ${T}${x.name}`)},pageSize:J,loop:w});if(Y==="done")return`${K} ${$} ${X.style.answer(z.short)}`;let _=z.description?`
|
|
665
665
|
${X.style.description(z.description)}`:"";return`${[K,$,P].filter(Boolean).join(" ")}
|
|
666
|
-
${R}${A}${_}${PN}`});function fX1(D){return D.command("add <playbookId>").description("Add a server to a playbook.").addOption(I6({flags:"-e,--entry <entryName>",description:"add a server from the registry by specifying the entry name"})).addOption(I6({flags:"-u,--url <url>",description:"add a streamable or sse server by specifying the url"})).addOption(I6({flags:"-c,--command <command>",description:"add a stdio server by specifying the command"})).addOption(I6({flags:"-n,--name <serverName>",description:"the name of the server as it'll appear in the config file"})).action(L1(async(F,w)=>{if(w.entry)console.log(`adding ${w.entry} to ${F}`),await fK0(F,w.entry);else if(w.url){if(!w.name)throw Error("No server name provided. use --name to specify the name of the server");console.log(`adding ${w.url} to ${F}`),await IK0(F,w.url,w.name)}else if(w.command){if(!w.name)throw Error("No server name provided. use --name to specify the name of the server");console.log(`adding ${w.command} to ${F}`);let[J,...Q]=w.command.split(" ");await CK0(F,J,Q,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(`${g0("CONFIG_FILE_PATH:")} ${KD()}`),console.log()}))}async function CK0(D,F,w,J){await J6(async()=>{await g1.store.addServer.mutate({playbookId:D,server:{name:J,transport:{type:"stdio",command:F,args:w}}})}).start("installing server...").succeed(`Stdio server ${F} added to ${D}`).run()}async function IK0(D,F,w){await J6(async()=>{await g1.store.addServer.mutate({playbookId:D,server:{name:w,transport:{type:"http",url:F}}})}).start("installing server...").succeed(`HTTP server ${F} added to ${D}`).run()}async function fK0(D,F){let w=await J6(()=>m6.entries.getEntryByName.query({name:F})).start("fetching entry...").succeed("Entry fetched.").run(),J=await SK0(w);await J6(async()=>{let Q=await m6.entries.getTransportForEntry.query({entryName:F,parameters:J});await g1.store.addServer.mutate({playbookId:D,server:{name:F,transport:Q,source:{name:"registry",entryId:w.id}}})}).start("installing server...").succeed(`Registry entry ${F} added to ${D}`).run()}async function SK0(D){let F={};if(!D.parameters)return{};for(let w of D.parameters)if(w.required)F[w.name]=await TT({message:w.name,mask:"*"});else F[w.name]=await Q9({message:w.name});return F}import{exec as jK0,execSync as mK0}from"node:child_process";import{promisify as dK0}from"node:util";var uK0=dK0(jK0);function IT(D){if(process.platform==="win32")return!1;try{return mK0(`which ${D}`,{stdio:"pipe"}).toString().trim().length>0}catch(w){return!1}}async function _N(D){if(!D||typeof D!=="string")throw 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 Error(`Unsupported platform: ${w}`)}try{await uK0(J)}catch(Q){throw Error(`Failed to open URL: ${Q instanceof Error?Q.message:"Unknown error"}`)}}function SX1(D){D.command("auth <playbookId> <server>").description("Authenticate a server").action(L1(async(F,w)=>{let J=await g1.store.authenticate.query({playbookId:F,serverName:w});if(J.result==="REDIRECT")_N(J.redirectUrl)})),D.command("logout <playbookId> <serverName>").description("Logout a server").action(L1(async(F,w)=>{await g1.store.logout.mutate({playbookId:F,serverName:w})}))}function jX1(D){D.command("config").description("Print config").action(L1(()=>{n4.prettyPrint()}))}function g3(D){return`/${D}/mcp`}function c3(D){return`/${D}/sse`}function mX1(D){D.command("connect <playbookId>").description("Connect a playbook to a MCP client").addOption(I6({flags:"-t,--target <target>",description:"target client"})).action(L1(async(F,w)=>{if(w.target){let J=await g1.store.get.query({playbookId:F});await g1.clients.install.mutate({clientId:w.target,playbookId:J.id,baseUrl:a2()})}else{console.log(),console.log(R6("--------------------------------")),console.log(R6(`Connection Details for '${F}'`)),console.log(R6("--------------------------------")),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 g1.store.get.query({playbookId:F}),Q=a2(),X=r0(Q,c3(J.id)),Y=r0(Q,g3(J.id)),W={command:"npx",args:["-y","@director.run/cli@latest","http2stdio",Y],env:{LOG_LEVEL:"silent"}};console.log(g0("HTTP Streamable:")+" "+Y),console.log(g0("HTTP SSE:")+" "+X),console.log(g0("Stdio:"),JSON.stringify(W,null,2)),console.log()}}))}function dX1(D){D.debugCommand("reset").description("Delete playbooks, clear the config file, and reset all clients").action(L1(async()=>{console.log("resetting service"),await g1.store.purge.mutate(),console.log("resetting clients"),await g1.clients.resetAll.mutate()}))}function CN(D){return g0(`${D.toUpperCase()}`)}function IN(D){return g0(`${D.toUpperCase()}`)}function fN(D){if(!D||D.length===0)console.log("No prompts configured for this playbook.");else{let F=M4(["name","title","description"]);F.push(...D.map((w)=>[w.name,w.title,w.description||""])),console.log(F.toString())}}function uX1(D){D.command("list-tools <playbookId>").description("List tools on a playbook").action(L1(async(F)=>{let w=await Q2.createAndConnectToHTTP(r0(a2(),`${F}/mcp`));await kK0(w),await w.close()})),D.command("get-tool <playbookId> <toolName>").description("Get the details of a tool").action(L1(async(F,w)=>{let J=await Q2.createAndConnectToHTTP(r0(a2(),`${F}/mcp`));await bK0(J,w),await J.close()})),D.command("call-tool <playbookId> <toolName>").addOption(I6({flags:"-a,--argument <key=value>",description:"set arguments in key=value format (can be used multiple times)",variadic:!0})).description("Call a tool on a playbook").action(L1(async(F,w)=>{let J=await Q2.createAndConnectToHTTP(r0(a2(),`${F}/mcp`));await hK0(J,w),await J.close()}))}async function kK0(D){console.log(""),console.log(CN("tools")),console.log("");let{tools:F}=await D.listTools();if(F.length===0){console.log(B4("no tools found"));return}console.log(fT(F).toString()),console.log("")}function fT(D){let F=M4(["name","required args?","description"]);for(let w of D)F.push([w.name,(w.inputSchema.required?.length??0)>0?B4("yes"):"no",w?.description?.slice(0,80)]);return F}async function bK0(D,F){let{tools:w}=await D.listTools(),J=w.find((Q)=>Q.name===F);if(!J)throw Error("Tool not found");if(console.log(),console.log(R6(J.name)),console.log(J?.description),console.log(),J.inputSchema.type==="object"&&J.inputSchema.properties){let Q=M4(["property","type","required","description"]);for(let[X,Y]of Object.entries(J.inputSchema.properties)){let W=Y;Q.push([X,W?.type||"--",J.inputSchema.required?.includes(X)?B4("yes"):"no",W?.description||"--"])}console.log(Q.toString())}else console.log(J.inputSchema);console.log()}async function hK0(D,F){console.log(B4("******************")),console.log(B4(`* TOOL CALL: ${F} *`)),console.log(B4("******************")),console.log("");let{tools:w}=await D.listTools(),J=w.find((W)=>W.name===F);if(!J){console.log(B4("Tool not found"));return}console.log(B4("* INPUT SCHEMA *")),console.log(J.inputSchema),console.log("");let Q=J.inputSchema.required||[],X={};console.log(B4("* ENTER ARGUMENTS *"));for(let W of Q){let K=await Q9({message:W});X[W]=K}console.log(B4("* EXECUTING TOOL CALL *")),console.log(""),console.log(`calling ${F} with arguments: ${JSON.stringify(X)}`),console.log("");let Y=await D.callTool({name:F,arguments:X});console.log(B4("* RESULT *")),console.log(Y),console.log("")}function kX1(D){D.command("get <playbookId> [serverName]").description("Show playbook details").action(L1(async(F,w)=>{if(w){let J=await g1.store.getServer.query({playbookId:F,serverName:w,queryParams:{includeTools:!0}});ST(F,J)}else{let J=await g1.store.get.query({playbookId:F,queryParams:{includeInMemoryTargets:!0}});if(!J){console.error(`playbook ${F} not found`);return}jT(J)}}))}function ST(D,F){let{name:w,type:J,connectionInfo:Q,source:X,tools:Y,disabled:W,toolsList:K}=F;console.log(),console.log(g0(`PLAYBOOKS > ${D} > ${R6(w)}`)),console.log();let V={};if(J==="http")V={url:F.url,headers:F.headers};else if(J==="stdio")V={command:F.command,args:F.args,env:F.env};if(console.log(eY({name:w,status:bX1(Q?.status??"--"),type:J,transport:JSON.stringify(V,null,2),lastConnectedAt:Q?.lastConnectedAt?.toISOString()??"--",lastErrorMessage:Q?.lastErrorMessage??"--",sourceName:X?.name??"--",sourceId:X?.entryId??"--",toolsPrefix:Y?.prefix??"''",toolsInclude:Y?.include?JSON.stringify(Y.include):"[]",toolsExclude:Y?.exclude?JSON.stringify(Y.exclude):"[]",disabled:W?"yes":"no"})),console.log(),K)console.log(IN("tools")),console.log(),console.log(fT(K).toString()),console.log()}function jT(D){let{id:F,name:w,description:J,prompts:Q}=D;console.log(),console.log(g0(`PLAYBOOKS > ${R6(w)}`)),console.log(),console.log(eY({id:F,name:w,description:J??"--",streamableURL:r0(a2(),g3(D.id)),sseURL:r0(a2(),c3(D.id))})),console.log(),console.log(IN("targets")),console.log();let X=M4(["name","type","status","lastConnectedAt","lastErrorMessage"]);X.push(...D.servers.map((Y)=>[Y.name,Y.type,bX1(Y.connectionInfo?.status??"--"),Y.connectionInfo?.lastConnectedAt?.toISOString()??"--",Y.connectionInfo?.lastErrorMessage??"--"])),console.log(X.toString()),console.log(),console.log(IN("prompts")),console.log(),fN(Q)}function bX1(D){return D==="connected"?OF(D):K5(D)}import mT from"node:fs";import{existsSync as yK0}from"node:fs";import{dirname as gK0}from"node:path";async function hX1(D){if(!yK0(D))throw new p1("NOT_FOUND",`file not found at: ${D}`);let F=await mT.promises.readFile(D),w=new TextDecoder().decode(F);return JSON.parse(w)}async function $8(D,F){return await mT.promises.mkdir(gK0(D),{recursive:!0}),mT.promises.writeFile(D,JSON.stringify(F,null,2))}class wF{}import{exec as cK0,execSync as lK0}from"node:child_process";import{existsSync as aK0}from"node:fs";import{homedir as yX1}from"node:os";import gX1 from"node:path";import{promisify as iK0}from"node:util";var cX1=iK0(cK0),tJ=R1("os/linux");class dT extends wF{restartApp(D){return tJ.warn(`restarting ${D} is not supported on Linux`),Promise.resolve()}async openFileInCode(D){tJ.info(`opening ${D}`),await cX1(`code "${D}"`)}isCommandInPath(D){try{return lK0(`which ${D}`,{stdio:"pipe"}).toString().trim().length>0}catch(F){return!1}}isAppInstalled(D){switch(D){case"Claude":return tJ.warn(`${D} is not supported on Linux`),!1;case"Cursor":return tJ.warn(`${D} is not supported on Linux, yet`),!1;case"Visual Studio Code":return this.isCommandInPath("code");case"Claude Code":return this.isCommandInPath("claude");default:throw new p1("INVALID_ARGUMENT",`unknown app: ${D}`)}}isFilePresent(D){return aK0(D)}async openUrl(D){if(!D||typeof D!=="string")throw Error("Invalid URL provided");let F=D.startsWith("http://")||D.startsWith("https://")?D:`https://${D}`;try{await cX1(`xdg-open "${F}"`)}catch(w){throw Error(`Failed to open URL: ${w instanceof Error?w.message:"Unknown error"}`)}}getConfigFileForApp(D){switch(D){case"Claude":return tJ.warn(`${D} is not supported on Linux, yet`),"";case"Cursor":return tJ.warn(`${D} is not supported on Linux, yet`),"";case"Visual Studio Code":return gX1.join(yX1(),".config/Code/User/settings.json");case"Claude Code":return gX1.join(yX1(),".claude.json")}}}import{exec as nK0,execSync as uT}from"node:child_process";import{existsSync as sK0}from"node:fs";import{homedir as jN}from"node:os";import mN from"node:path";import{promisify as oK0}from"node:util";function SN(D){return new Promise((F)=>setTimeout(F,D))}var dN=oK0(nK0),uN=R1("os/macos");class kT extends wF{async restartApp(D){if(D==="Claude Code")throw new p1("INVALID_ARGUMENT",`restarting ${D} is not supported`);if(uN.info(`restarting ${D}...`),!this.isAppRunning(D)){uN.info(`${D} is not running, skipping restart`);return}await dN(`osascript -e 'tell application "${D}" to quit'`),await SN(2000),await dN(`open -a ${D}`),uN.info(`${D} has been restarted`)}async openFileInCode(D){uN.info(`opening ${D}`),await dN(`code "${D}"`)}isCommandInPath(D){try{return uT(`which ${D}`,{stdio:"pipe"}).toString().trim().length>0}catch(F){return!1}}isAppInstalled(D){try{let F;switch(D){case"Claude":F="Claude";break;case"Cursor":F="Cursor";break;case"Visual Studio Code":F="Visual Studio Code";break;case"Claude Code":return this.isCommandInPath("claude");default:throw new p1("INVALID_ARGUMENT",`unknown app: ${D}`)}return uT(`mdfind "kMDItemDisplayName == '${F}'"`,{stdio:"pipe",encoding:"utf8"}).trim().length>0}catch(F){return!1}}isFilePresent(D){return sK0(D)}isAppRunning(D){try{return uT(`pgrep -x "${D}"`,{stdio:"pipe"}),!0}catch(F){return!1}}async openUrl(D){if(!D||typeof D!=="string")throw Error("Invalid URL provided");let F=D.startsWith("http://")||D.startsWith("https://")?D:`https://${D}`;try{await dN(`open "${F}"`)}catch(w){throw Error(`Failed to open URL: ${w instanceof Error?w.message:"Unknown error"}`)}}getConfigFileForApp(D){switch(D){case"Claude":return mN.join(jN(),"Library/Application Support/Claude/claude_desktop_config.json");case"Cursor":return mN.join(jN(),".cursor/mcp.json");case"Visual Studio Code":return mN.join(jN(),"Library/Application Support/Code/User/settings.json");case"Claude Code":return mN.join(jN(),".claude.json")}}}class bT extends wF{restartApp(D){return Promise.resolve()}openFileInCode(D){return Promise.resolve()}isCommandInPath(D){return!1}isAppInstalled(D){return!1}isFilePresent(D){return!1}isAppRunning(D){return!1}openUrl(D){return Promise.resolve()}getConfigFileForApp(D){return""}}var kN,rK0=R1("os");if(process.platform==="darwin")kN=new kT;else if(process.platform==="linux")kN=new dT;else rK0.warn(`unsupported platform: ${process.platform}, automatic client configuration will not work`),kN=new bT;var U2=kN;var hT="director__";class l3{config;isInitialized;logger;configPath;name;constructor(D){this.configPath=D.configPath,this.isInitialized=!1,this.name=D.name,this.logger=R1(`client-configurator/${this.name}`)}async initialize(){if(this.isInitialized&&this.config)return;if(this.logger.debug("initializing"),!await this.isClientPresent())throw new p1("COMMAND_NOT_FOUND",`${this.name} doesn't appear to be installed`,{name:this.name,configPath:this.configPath});if(!await this.isClientConfigPresent())await this.createConfig();try{this.config=await hX1(this.configPath),this.isInitialized=!0}catch(D){if(D instanceof SyntaxError)throw new p1("JSON_PARSE_ERROR",`syntax error in config file: ${D.message}`,{path:this.configPath});else throw D}}async getStatus(){let D=await this.isClientPresent(),F=await this.isClientConfigPresent(),w=F&&D?(await this.list()).map((J)=>({id:J.name})):[];return{name:this.name,installed:D,configExists:F,configPath:this.configPath,playbooks:w}}createServerConfigKey(D){return`${hT}${D}`}isManagedConfigKey(D){return D.startsWith(hT)}toDisplayName(D){return this.isManagedConfigKey(D)?D.replace(hT,""):D}}class yT extends l3{async isClientPresent(){return await U2.isAppInstalled("Claude")}async isClientConfigPresent(){return await U2.isFilePresent(this.configPath)}constructor(D){super({configPath:D.configPath||U2.getConfigFileForApp("Claude"),name:"claude"})}async initialize(){if(await super.initialize(),!this.config?.mcpServers)await this.updateConfig({...this.config,mcpServers:{}})}async isInstalled(D){if(!await this.isClientPresent())return!1;return await this.initialize(),this.config?.mcpServers?.[this.createServerConfigKey(D)]!==void 0}async uninstall(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.uninstall(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),!await this.isInstalled(D))throw new p1("BAD_REQUEST",`server '${D}' is not installed`);this.logger.debug(`uninstalling ${D}`);let F={...this.config,mcpServers:{...this.config?.mcpServers}};return delete F.mcpServers?.[this.createServerConfigKey(D)],await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async install(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.install(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),await this.isInstalled(D.name))throw new p1("BAD_REQUEST",`server '${D.name}' is already installed`);this.logger.debug(`installing ${D.name}`);let F={...this.config,mcpServers:{...this.config?.mcpServers}};return F.mcpServers[this.createServerConfigKey(D.name)]={command:"npx",args:["-y","@director.run/cli@latest","http2stdio",D.sseURL],env:{LOG_LEVEL:"silent"}},await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async reset(D){await this.initialize(),this.logger.debug("purging claude config");let F={...this.config,mcpServers:{}};if(!D?.includeUnmanaged){for(let[J,Q]of Object.entries(this.config?.mcpServers??{}))if(!this.isManagedConfigKey(J))F.mcpServers[J]=Q}if(JSON.stringify(F)===JSON.stringify(this.config))return{requiresRestart:!1};return await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async list(D){return await this.initialize(),this.logger.debug("listing servers"),Object.entries(this.config?.mcpServers??{}).filter(([F])=>D?.includeUnmanaged?!0:this.isManagedConfigKey(F)).map(([F,w])=>({name:this.toDisplayName(F),url:w.args[3]}))}async openConfig(){this.logger.debug("opening claude config"),await U2.openFileInCode(this.configPath)}async restart(){if(await this.initialize(),!t6())this.logger.debug("restarting claude"),await U2.restartApp("Claude");else this.logger.warn("skipping restart of claude in test environment")}async updateConfig(D){this.config=D,this.logger.debug(`writing config to ${this.configPath}`),await $8(this.configPath,this.config)}async createConfig(){this.logger.debug("initializing claude config"),await $8(this.configPath,{mcpServers:{}})}getCapabilities(){return{requiresRestartOnInstallOrUninstall:!0,requiresRestartOnUpdate:!0,programaticRestartSupported:!0}}}var tK0=M.object({command:M.string().describe('The command to execute (e.g., "bun", "node")'),args:M.array(M.string()).describe("Command line arguments"),env:M.record(M.string()).optional().describe("Environment variables")}),ob0=M.object({mcpServers:M.record(M.string(),tK0).describe("Map of MCP server configurations")});class gT extends l3{async isClientPresent(){return await U2.isAppInstalled("Claude Code")}async isClientConfigPresent(){return await U2.isFilePresent(this.configPath)}constructor(D){super({configPath:D.configPath||U2.getConfigFileForApp("Claude Code"),name:"claude-code"})}async initialize(){if(await super.initialize(),!this.config?.mcpServers)await this.updateConfig({...this.config,mcpServers:{}})}async isInstalled(D){if(!await this.isClientPresent())return!1;return await this.initialize(),this.config?.mcpServers?.[this.createServerConfigKey(D)]!==void 0}async uninstall(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.uninstall(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),!await this.isInstalled(D))throw new p1("BAD_REQUEST",`server '${D}' is not installed`);this.logger.debug(`uninstalling ${D}`);let F={...this.config,mcpServers:{...this.config?.mcpServers}};return delete F.mcpServers?.[this.createServerConfigKey(D)],await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async install(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.install(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),await this.isInstalled(D.name))throw new p1("BAD_REQUEST",`server '${D.name}' is already installed`);this.logger.debug(`installing ${D.name}`);let F={...this.config,mcpServers:{...this.config?.mcpServers}};return F.mcpServers[this.createServerConfigKey(D.name)]={type:"http",url:D.streamableURL},await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async reset(D){await this.initialize(),this.logger.debug("purging claude config");let F={...this.config,mcpServers:{}};if(!D?.includeUnmanaged){for(let[J,Q]of Object.entries(this.config?.mcpServers??{}))if(!this.isManagedConfigKey(J))F.mcpServers[J]=Q}if(JSON.stringify(F)===JSON.stringify(this.config))return{requiresRestart:!1};return await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async list(D){return await this.initialize(),this.logger.debug("listing servers"),Object.entries(this.config?.mcpServers??{}).filter(([F])=>D?.includeUnmanaged?!0:this.isManagedConfigKey(F)).map(([F,{url:w}])=>({name:this.toDisplayName(F),url:w}))}async openConfig(){this.logger.debug("opening code config"),await U2.openFileInCode(this.configPath)}async restart(){await this.initialize(),this.logger.error("restarting claude code not supported")}async updateConfig(D){this.config=D,this.logger.debug(`writing config to ${this.configPath}`),await $8(this.configPath,this.config)}async createConfig(){this.logger.debug("initializing claude config"),await $8(this.configPath,{mcpServers:{}})}getCapabilities(){return{requiresRestartOnInstallOrUninstall:!0,requiresRestartOnUpdate:!0,programaticRestartSupported:!1}}}var eK0=M.object({type:M.literal("http"),url:M.string().describe("The URL of the MCP server")}),Jh0=M.object({mcpServers:M.record(M.string(),eK0).describe("Map of MCP server configurations")});class cT extends l3{async isClientPresent(){return await U2.isAppInstalled("Cursor")}async isClientConfigPresent(){return await U2.isFilePresent(this.configPath)}constructor(D){super({configPath:D.configPath||U2.getConfigFileForApp("Cursor"),name:"cursor"})}async isInstalled(D){if(!await this.isClientPresent())return!1;return await this.initialize(),this.config?.mcpServers?.[this.createServerConfigKey(D)]!==void 0}async uninstall(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.uninstall(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),!await this.isInstalled(D))throw new p1("BAD_REQUEST",`server '${D}' is not installed`);this.logger.debug(`uninstalling ${D}`);let F={...this.config,mcpServers:{...this.config?.mcpServers??{}}};return delete F.mcpServers[this.createServerConfigKey(D)],await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async install(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.install(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),await this.isInstalled(D.name))throw new p1("BAD_REQUEST",`server '${D.name}' is already installed`);this.logger.debug(`installing ${D.name}`);let F={...this.config,mcpServers:{...this.config?.mcpServers??{}}};return F.mcpServers[this.createServerConfigKey(D.name)]={url:D.streamableURL},await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async restart(){if(await this.initialize(),!t6())this.logger.debug("restarting cursor"),await U2.restartApp("Cursor");else this.logger.warn("skipping restart of cursor in test environment")}async list(D){return await this.initialize(),this.logger.debug("listing servers"),Object.entries(this.config?.mcpServers??{}).filter(([F])=>D?.includeUnmanaged?!0:this.isManagedConfigKey(F)).map(([F,w])=>({name:this.toDisplayName(F),url:w.url}))}async initialize(){if(await super.initialize(),!this.config?.mcpServers)await this.updateConfig({...this.config,mcpServers:{}})}async openConfig(){this.logger.debug("opening cursor config"),await U2.openFileInCode(this.configPath)}async reset(D){await this.initialize(),this.logger.debug("purging cursor config");let F={...this.config,mcpServers:{}};if(!D?.includeUnmanaged){for(let[J,Q]of Object.entries(this.config?.mcpServers??{}))if(!this.isManagedConfigKey(J))F.mcpServers[J]=Q}if(JSON.stringify(F)===JSON.stringify(this.config))return{requiresRestart:!1};return await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async updateConfig(D){this.logger.debug(`writing config to ${this.configPath}`),await $8(this.configPath,D),this.config=D}async createConfig(){this.logger.debug("initializing cursor config"),await $8(this.configPath,{mcpServers:{}})}getCapabilities(){return{requiresRestartOnInstallOrUninstall:!1,requiresRestartOnUpdate:!1,programaticRestartSupported:!0}}}import DV0 from"node:fs";import FV0 from"node:path";class lT extends l3{async isClientPresent(){return await U2.isAppInstalled("Visual Studio Code")}async isClientConfigPresent(){return await U2.isFilePresent(this.configPath)}constructor(D){super({configPath:D.configPath||U2.getConfigFileForApp("Visual Studio Code"),name:"vscode"})}async initialize(){if(await super.initialize(),!this.config?.mcp?.servers)await this.updateConfig({...this.config,mcp:{servers:{}}})}async isInstalled(D){if(!await this.isClientPresent())return!1;return await this.initialize(),this.config?.mcp.servers[this.createServerConfigKey(D)]!==void 0}async uninstall(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.uninstall(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),!await this.isInstalled(D))throw new p1("BAD_REQUEST",`server '${D}' is not installed`);this.logger.debug(`uninstalling ${D}`);let F={...this.config,mcp:{servers:{...this.config?.mcp?.servers??{}}}};return delete F.mcp.servers[this.createServerConfigKey(D)],await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async install(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.install(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),await this.isInstalled(D.name))throw new p1("BAD_REQUEST",`server '${D.name}' is already installed`);this.logger.debug(`installing ${D.name}`);let F={...this.config,mcp:{servers:{...this.config?.mcp?.servers??{}}}};return F.mcp.servers[this.createServerConfigKey(D.name)]={url:D.sseURL},await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async restart(){if(await this.initialize(),!t6())this.logger.debug("restarting vscode"),await U2.restartApp("Visual Studio Code");else this.logger.warn("skipping restart of vscode in test environment")}async list(D){return await this.initialize(),this.logger.debug("listing servers"),Object.entries(this.config?.mcp.servers??{}).filter(([F])=>D?.includeUnmanaged?!0:this.isManagedConfigKey(F)).map(([F,w])=>({name:this.toDisplayName(F),url:w.url}))}async openConfig(){this.logger.debug("opening vscode config"),await U2.openFileInCode(this.configPath)}async reset(D){await this.initialize(),this.logger.debug("purging vscode config");let F={...this.config,mcp:{servers:{}}};if(!D?.includeUnmanaged){for(let[J,Q]of Object.entries(this.config?.mcp?.servers??{}))if(!this.isManagedConfigKey(J))F.mcp.servers[J]=Q}if(JSON.stringify(F)===JSON.stringify(this.config))return{requiresRestart:!1};return await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async updateConfig(D){this.logger.debug(`writing config to ${this.configPath}`);let F=FV0.dirname(this.configPath);await DV0.promises.mkdir(F,{recursive:!0}),await $8(this.configPath,D),this.config=D}async createConfig(){this.logger.debug("initializing vscode config"),await $8(this.configPath,{mcp:{servers:{}}})}getCapabilities(){return{requiresRestartOnInstallOrUninstall:!0,requiresRestartOnUpdate:!0,programaticRestartSupported:!0}}}var DQ=R1("ClientStore");class DK{_config;constructor(D){this._config=D.config}async enforceClientConfigs({playbookStore:D,baseUrl:F}){DQ.debug({message:"Enforcing client configs"}),await this.resetAll({restartIfNeeded:!1}),DQ.debug({message:"Waiting for 1 second"}),await SN(1000),DQ.debug({message:"Adding back"});for(let w of this.all()){let J=this._config.get(`clients.${w.name}`)??[];for(let Q of J){DQ.debug({message:`Installing ${Q} on ${w.name}`});try{let X=D.get(Q);if((await w.install({name:X.id,sseURL:r0(F,c3(X.id)),streamableURL:r0(F,g3(X.id))})).requiresRestart)await w.restart()}catch(X){if(X instanceof p1&&X.code==="NOT_FOUND"){DQ.warn({message:`Playbook '${Q}' not found, skipping installation on ${w.name}`});continue}throw X}}}}async getClientsByPlaybook(D){let F=[];for(let w of this.all()){if(!await w.isClientPresent())continue;if((await w.list()).some((Q)=>Q.name===D))F.push(w)}return F}get(D){let w=this.all().find((J)=>J.name===D);if(!w)throw new p1("BAD_REQUEST",`Client ${D} is not supported`);return w}all(){return[new yT({}),new cT({}),new lT({}),new gT({})]}async resetAll({restartIfNeeded:D}={restartIfNeeded:!0}){for(let F of this.all()){if(!await F.isClientPresent())continue;if((await F.reset()).requiresRestart&&D)await F.restart()}}async install({clientId:D,playbook:F,baseUrl:w}){let J=this.get(D),Q=await J.install({name:F.id,sseURL:r0(w,c3(F.id)),streamableURL:r0(w,g3(F.id))});if(await this._config.push(`clients.${D}`,F.id),Q.requiresRestart)await J.restart()}async uninstall(D,F){let w=this.get(D),J=await w.uninstall(F);if(await this._config.remove(`clients.${D}`,F),J.requiresRestart)await w.restart()}async toPlainObject(){return await Promise.all(this.all().map((D)=>D.getStatus()))}async handlePlaybookListChange(D){let F=await this.getClientsByPlaybook(D);for(let w of F){if(!await w.isClientPresent())continue;if(w.getCapabilities().requiresRestartOnUpdate)DQ.debug({message:`restarting ${w.name}`}),await w.restart()}}async handlePlaybookRemove(D){let F=await this.getClientsByPlaybook(D);for(let w of F){if(!await w.isClientPresent())continue;if((await w.uninstall(D)).requiresRestart)await w.restart()}}}function FQ(D){return{platform:process.platform,dependencies:[{name:"npx",installed:IT("npx")},{name:"uvx",installed:IT("uvx")}],cliVersion:D}}import w_ from"path";import{dirname as gV0}from"path";import{fileURLToPath as cV0}from"url";var sX1=A1(nX1(),1),GV0=R1("http/middleware"),oX1=(D,F,w,J)=>{let{status:Q,message:X,code:Y}=pV0(D);GV0.error({message:`${F.method} ${F.originalUrl} failed: ${X}`,code:Y,error:D}),w.status(Q).json({message:X,code:Y})};function pV0(D){if(SQ(D))return ZV0(D);if(SI(D))return{status:D.statusCode,message:D.message};else return{status:500,message:"Something unexpected happened :("}}function ZV0(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 rX1(){throw new p1("NOT_FOUND","there's nothing here")}function B7(D){return(F,w,J)=>{Promise.resolve(D(F,w,J)).catch(J)}}function tX1(){return sX1.default({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 eX1=A1(rD(),1),iT=R1("oauth/callback-router");function DY1(D){let F=eX1.default.Router();return F.get("/oauth/:factoryId/:providerId/callback",B7(async(w,J)=>{let Q=w.query.code?.toString(),X=w.query.error?.toString(),Y=w.params.factoryId,W=w.params.providerId;if(Q){iT.info({message:"received oauth callback, authorization successful"});let K=await D.onAuthorizationSuccess(Y,W,Q);if(K?.redirectUrl)J.redirect(K.redirectUrl);else J.send({status:"success",message:"Authorization successful, you can close this window and return to the terminal."})}else if(X){iT.error({message:"received oauth callback, authorization failed",error:X});let K=await D.onAuthorizationError(Y,W,Error(`OAuth authorization failed: ${X}`));if(K?.redirectUrl)J.redirect(K.redirectUrl);else J.status(400).send({status:"error",message:`oauth authorization failed: ${X}`})}else{iT.error({message:"received oauth callback, no authorization code or error"});let K=await D.onAuthorizationError(Y,W,Error("No authorization code provided"));if(K?.redirectUrl)J.redirect(K.redirectUrl);else J.status(400).send({status:"error",message:"no authorization code or error in callback"})}})),F}var nT=A1(rD(),1);import FY1 from"fs";import NV0 from"path";var wY1=(D)=>{let{distPath:F,config:w}=D,J=NV0.join(F,"index.html"),Q=nT.default.Router(),X=(Y,W)=>{if(!FY1.existsSync(J))return W.status(404).send("index.html not found");let K=FY1.readFileSync(J,"utf-8");if(w)K=K.replace("</head>",` <script>
|
|
666
|
+
${R}${A}${_}${PN}`});function fX1(D){return D.command("add <playbookId>").description("Add a server to a playbook.").addOption(I6({flags:"-e,--entry <entryName>",description:"add a server from the registry by specifying the entry name"})).addOption(I6({flags:"-u,--url <url>",description:"add a streamable or sse server by specifying the url"})).addOption(I6({flags:"-c,--command <command>",description:"add a stdio server by specifying the command"})).addOption(I6({flags:"-n,--name <serverName>",description:"the name of the server as it'll appear in the config file"})).action(L1(async(F,w)=>{if(w.entry)console.log(`adding ${w.entry} to ${F}`),await fK0(F,w.entry);else if(w.url){if(!w.name)throw Error("No server name provided. use --name to specify the name of the server");console.log(`adding ${w.url} to ${F}`),await IK0(F,w.url,w.name)}else if(w.command){if(!w.name)throw Error("No server name provided. use --name to specify the name of the server");console.log(`adding ${w.command} to ${F}`);let[J,...Q]=w.command.split(" ");await CK0(F,J,Q,w.name)}else console.warn("No entry name or url provided. You must specify --entry or --url and --name, alternatively update the config file directly and restart the gateway:"),console.log(),console.log(`${g0("CONFIG_FILE_PATH:")} ${KD()}`),console.log()}))}async function CK0(D,F,w,J){await J6(async()=>{await g1.store.addServer.mutate({playbookId:D,server:{name:J,transport:{type:"stdio",command:F,args:w}}})}).start("installing server...").succeed(`Stdio server ${F} added to ${D}`).run()}async function IK0(D,F,w){await J6(async()=>{await g1.store.addServer.mutate({playbookId:D,server:{name:w,transport:{type:"http",url:F}}})}).start("installing server...").succeed(`HTTP server ${F} added to ${D}`).run()}async function fK0(D,F){let w=await J6(()=>m6.entries.getEntryByName.query({name:F})).start("fetching entry...").succeed("Entry fetched.").run(),J=await SK0(w);await J6(async()=>{let Q=await m6.entries.getTransportForEntry.query({entryName:F,parameters:J});await g1.store.addServer.mutate({playbookId:D,server:{name:F,transport:Q,source:{name:"registry",entryId:w.id}}})}).start("installing server...").succeed(`Registry entry ${F} added to ${D}`).run()}async function SK0(D){let F={};if(!D.parameters)return{};for(let w of D.parameters)if(w.required)F[w.name]=await TT({message:w.name,mask:"*"});else F[w.name]=await Q9({message:w.name});return F}import{exec as jK0,execSync as mK0}from"node:child_process";import{promisify as dK0}from"node:util";var uK0=dK0(jK0);function IT(D){if(process.platform==="win32")return!1;try{return mK0(`which ${D}`,{stdio:"pipe"}).toString().trim().length>0}catch(w){return!1}}async function _N(D){if(!D||typeof D!=="string")throw 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 Error(`Unsupported platform: ${w}`)}try{await uK0(J)}catch(Q){throw Error(`Failed to open URL: ${Q instanceof Error?Q.message:"Unknown error"}`)}}function SX1(D){D.command("auth <playbookId> <server>").description("Authenticate a server").action(L1(async(F,w)=>{let J=await g1.store.authenticate.query({playbookId:F,serverName:w});if(J.result==="REDIRECT")_N(J.redirectUrl)})),D.command("logout <playbookId> <serverName>").description("Logout a server").action(L1(async(F,w)=>{await g1.store.logout.mutate({playbookId:F,serverName:w})}))}function jX1(D){D.command("config").description("Print config").action(L1(()=>{n4.prettyPrint()}))}function g3(D){return`/${D}/mcp`}function c3(D){return`/${D}/sse`}function mX1(D){D.command("connect <playbookId>").description("Connect a playbook to a MCP client").addOption(I6({flags:"-t,--target <target>",description:"target client"})).action(L1(async(F,w)=>{if(w.target){let J=await g1.store.get.query({playbookId:F});await g1.clients.install.mutate({clientId:w.target,playbookId:J.id,baseUrl:a2()})}else{console.log(),console.log(R6("--------------------------------")),console.log(R6(`Connection Details for '${F}'`)),console.log(R6("--------------------------------")),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 g1.store.get.query({playbookId:F}),Q=a2(),X=r0(Q,c3(J.id)),Y=r0(Q,g3(J.id)),W={command:"npx",args:["-y","@director.run/cli@latest","http2stdio",Y],env:{LOG_LEVEL:"silent"}};console.log(g0("HTTP Streamable:")+" "+Y),console.log(g0("HTTP SSE:")+" "+X),console.log(g0("Stdio:"),JSON.stringify(W,null,2)),console.log()}}))}function dX1(D){D.debugCommand("reset").description("Delete playbooks, clear the config file, and reset all clients").action(L1(async()=>{console.log("resetting service"),await g1.store.purge.mutate(),console.log("resetting clients"),await g1.clients.resetAll.mutate()}))}function CN(D){return g0(`${D.toUpperCase()}`)}function IN(D){return g0(`${D.toUpperCase()}`)}function fN(D){if(!D||D.length===0)console.log("No prompts configured for this playbook.");else{let F=M4(["name","title","description"]);F.push(...D.map((w)=>[w.name,w.title,w.description||""])),console.log(F.toString())}}function uX1(D){D.command("list-tools <playbookId>").description("List tools on a playbook").action(L1(async(F)=>{let w=await Q2.createAndConnectToHTTP(r0(a2(),`${F}/mcp`));await kK0(w),await w.close()})),D.command("get-tool <playbookId> <toolName>").description("Get the details of a tool").action(L1(async(F,w)=>{let J=await Q2.createAndConnectToHTTP(r0(a2(),`${F}/mcp`));await bK0(J,w),await J.close()})),D.command("call-tool <playbookId> <toolName>").addOption(I6({flags:"-a,--argument <key=value>",description:"set arguments in key=value format (can be used multiple times)",variadic:!0})).description("Call a tool on a playbook").action(L1(async(F,w)=>{let J=await Q2.createAndConnectToHTTP(r0(a2(),`${F}/mcp`));await hK0(J,w),await J.close()}))}async function kK0(D){console.log(""),console.log(CN("tools")),console.log("");let{tools:F}=await D.listTools();if(F.length===0){console.log(B4("no tools found"));return}console.log(fT(F).toString()),console.log("")}function fT(D){let F=M4(["name","required args?","description"]);for(let w of D)F.push([w.name,(w.inputSchema.required?.length??0)>0?B4("yes"):"no",w?.description?.slice(0,80)]);return F}async function bK0(D,F){let{tools:w}=await D.listTools(),J=w.find((Q)=>Q.name===F);if(!J)throw Error("Tool not found");if(console.log(),console.log(R6(J.name)),console.log(J?.description),console.log(),J.inputSchema.type==="object"&&J.inputSchema.properties){let Q=M4(["property","type","required","description"]);for(let[X,Y]of Object.entries(J.inputSchema.properties)){let W=Y;Q.push([X,W?.type||"--",J.inputSchema.required?.includes(X)?B4("yes"):"no",W?.description||"--"])}console.log(Q.toString())}else console.log(J.inputSchema);console.log()}async function hK0(D,F){console.log(B4("******************")),console.log(B4(`* TOOL CALL: ${F} *`)),console.log(B4("******************")),console.log("");let{tools:w}=await D.listTools(),J=w.find((W)=>W.name===F);if(!J){console.log(B4("Tool not found"));return}console.log(B4("* INPUT SCHEMA *")),console.log(J.inputSchema),console.log("");let Q=J.inputSchema.required||[],X={};console.log(B4("* ENTER ARGUMENTS *"));for(let W of Q){let K=await Q9({message:W});X[W]=K}console.log(B4("* EXECUTING TOOL CALL *")),console.log(""),console.log(`calling ${F} with arguments: ${JSON.stringify(X)}`),console.log("");let Y=await D.callTool({name:F,arguments:X});console.log(B4("* RESULT *")),console.log(Y),console.log("")}function kX1(D){D.command("get <playbookId> [serverName]").description("Show playbook details").action(L1(async(F,w)=>{if(w){let J=await g1.store.getServer.query({playbookId:F,serverName:w,queryParams:{includeTools:!0}});ST(F,J)}else{let J=await g1.store.get.query({playbookId:F,queryParams:{includeInMemoryTargets:!0}});if(!J){console.error(`playbook ${F} not found`);return}jT(J)}}))}function ST(D,F){let{name:w,type:J,connectionInfo:Q,source:X,tools:Y,disabled:W,toolsList:K}=F;console.log(),console.log(g0(`PLAYBOOKS > ${D} > ${R6(w)}`)),console.log();let V={};if(J==="http")V={url:F.url,headers:F.headers};else if(J==="stdio")V={command:F.command,args:F.args,env:F.env};if(console.log(eY({name:w,status:bX1(Q?.status??"--"),type:J,transport:JSON.stringify(V,null,2),lastConnectedAt:Q?.lastConnectedAt?.toISOString()??"--",lastErrorMessage:Q?.lastErrorMessage??"--",sourceName:X?.name??"--",sourceId:X?.entryId??"--",toolsPrefix:Y?.prefix??"''",toolsInclude:Y?.include?JSON.stringify(Y.include):"[]",toolsExclude:Y?.exclude?JSON.stringify(Y.exclude):"[]",disabled:W?"yes":"no"})),console.log(),K)console.log(IN("tools")),console.log(),console.log(fT(K).toString()),console.log()}function jT(D){let{id:F,name:w,description:J,prompts:Q}=D;console.log(),console.log(g0(`PLAYBOOKS > ${R6(w)}`)),console.log(),console.log(eY({id:F,name:w,description:J??"--",streamableURL:r0(a2(),g3(D.id)),sseURL:r0(a2(),c3(D.id))})),console.log(),console.log(IN("targets")),console.log();let X=M4(["name","type","status","lastConnectedAt","lastErrorMessage"]);X.push(...D.servers.map((Y)=>[Y.name,Y.type,bX1(Y.connectionInfo?.status??"--"),Y.connectionInfo?.lastConnectedAt?.toISOString()??"--",Y.connectionInfo?.lastErrorMessage??"--"])),console.log(X.toString()),console.log(),console.log(IN("prompts")),console.log(),fN(Q)}function bX1(D){return D==="connected"?OF(D):K5(D)}import mT from"node:fs";import{existsSync as yK0}from"node:fs";import{dirname as gK0}from"node:path";async function hX1(D){if(!yK0(D))throw new p1("NOT_FOUND",`file not found at: ${D}`);let F=await mT.promises.readFile(D),w=new TextDecoder().decode(F);return JSON.parse(w)}async function $8(D,F){return await mT.promises.mkdir(gK0(D),{recursive:!0}),mT.promises.writeFile(D,JSON.stringify(F,null,2))}class wF{}import{exec as cK0,execSync as lK0}from"node:child_process";import{existsSync as aK0}from"node:fs";import{homedir as yX1}from"node:os";import gX1 from"node:path";import{promisify as iK0}from"node:util";var cX1=iK0(cK0),tJ=R1("os/linux");class dT extends wF{restartApp(D){return tJ.warn(`restarting ${D} is not supported on Linux`),Promise.resolve()}async openFileInCode(D){tJ.info(`opening ${D}`),await cX1(`code "${D}"`)}isCommandInPath(D){try{return lK0(`which ${D}`,{stdio:"pipe"}).toString().trim().length>0}catch(F){return!1}}isAppInstalled(D){switch(D){case"Claude":return tJ.warn(`${D} is not supported on Linux`),!1;case"Cursor":return tJ.warn(`${D} is not supported on Linux, yet`),!1;case"Visual Studio Code":return this.isCommandInPath("code");case"Claude Code":return this.isCommandInPath("claude");default:throw new p1("INVALID_ARGUMENT",`unknown app: ${D}`)}}isFilePresent(D){return aK0(D)}async openUrl(D){if(!D||typeof D!=="string")throw Error("Invalid URL provided");let F=D.startsWith("http://")||D.startsWith("https://")?D:`https://${D}`;try{await cX1(`xdg-open "${F}"`)}catch(w){throw Error(`Failed to open URL: ${w instanceof Error?w.message:"Unknown error"}`)}}getConfigFileForApp(D){switch(D){case"Claude":return tJ.warn(`${D} is not supported on Linux, yet`),"";case"Cursor":return tJ.warn(`${D} is not supported on Linux, yet`),"";case"Visual Studio Code":return gX1.join(yX1(),".config/Code/User/settings.json");case"Claude Code":return gX1.join(yX1(),".claude.json")}}}import{exec as nK0,execSync as uT}from"node:child_process";import{existsSync as sK0}from"node:fs";import{homedir as jN}from"node:os";import mN from"node:path";import{promisify as oK0}from"node:util";function SN(D){return new Promise((F)=>setTimeout(F,D))}var dN=oK0(nK0),uN=R1("os/macos");class kT extends wF{async restartApp(D){if(D==="Claude Code")throw new p1("INVALID_ARGUMENT",`restarting ${D} is not supported`);if(uN.info(`restarting ${D}...`),!this.isAppRunning(D)){uN.info(`${D} is not running, skipping restart`);return}await dN(`osascript -e 'tell application "${D}" to quit'`),await SN(2000),await dN(`open -a ${D}`),uN.info(`${D} has been restarted`)}async openFileInCode(D){uN.info(`opening ${D}`),await dN(`code "${D}"`)}isCommandInPath(D){try{return uT(`which ${D}`,{stdio:"pipe"}).toString().trim().length>0}catch(F){return!1}}isAppInstalled(D){try{let F;switch(D){case"Claude":F="Claude";break;case"Cursor":F="Cursor";break;case"Visual Studio Code":F="Visual Studio Code";break;case"Claude Code":return this.isCommandInPath("claude");default:throw new p1("INVALID_ARGUMENT",`unknown app: ${D}`)}return uT(`mdfind "kMDItemDisplayName == '${F}'"`,{stdio:"pipe",encoding:"utf8"}).trim().length>0}catch(F){return!1}}isFilePresent(D){return sK0(D)}isAppRunning(D){try{return uT(`pgrep -x "${D}"`,{stdio:"pipe"}),!0}catch(F){return!1}}async openUrl(D){if(!D||typeof D!=="string")throw Error("Invalid URL provided");let F=D.startsWith("http://")||D.startsWith("https://")?D:`https://${D}`;try{await dN(`open "${F}"`)}catch(w){throw Error(`Failed to open URL: ${w instanceof Error?w.message:"Unknown error"}`)}}getConfigFileForApp(D){switch(D){case"Claude":return mN.join(jN(),"Library/Application Support/Claude/claude_desktop_config.json");case"Cursor":return mN.join(jN(),".cursor/mcp.json");case"Visual Studio Code":return mN.join(jN(),"Library/Application Support/Code/User/settings.json");case"Claude Code":return mN.join(jN(),".claude.json")}}}class bT extends wF{restartApp(D){return Promise.resolve()}openFileInCode(D){return Promise.resolve()}isCommandInPath(D){return!1}isAppInstalled(D){return!1}isFilePresent(D){return!1}isAppRunning(D){return!1}openUrl(D){return Promise.resolve()}getConfigFileForApp(D){return""}}var kN,rK0=R1("os");if(process.platform==="darwin")kN=new kT;else if(process.platform==="linux")kN=new dT;else rK0.warn(`unsupported platform: ${process.platform}, automatic client configuration will not work`),kN=new bT;var U2=kN;var hT="director__";class l3{config;isInitialized;logger;configPath;name;constructor(D){this.configPath=D.configPath,this.isInitialized=!1,this.name=D.name,this.logger=R1(`client-configurator/${this.name}`)}async initialize(){if(this.isInitialized&&this.config)return;if(this.logger.debug("initializing"),!await this.isClientPresent())throw new p1("COMMAND_NOT_FOUND",`${this.name} doesn't appear to be installed`,{name:this.name,configPath:this.configPath});if(!await this.isClientConfigPresent())await this.createConfig();try{this.config=await hX1(this.configPath),this.isInitialized=!0}catch(D){if(D instanceof SyntaxError)throw new p1("JSON_PARSE_ERROR",`syntax error in config file: ${D.message}`,{path:this.configPath});else throw D}}async getStatus(){let D=await this.isClientPresent(),F=await this.isClientConfigPresent(),w=F&&D?(await this.list()).map((J)=>({id:J.name})):[];return{name:this.name,installed:D,configExists:F,configPath:this.configPath,playbooks:w}}createServerConfigKey(D){return`${hT}${D}`}isManagedConfigKey(D){return D.startsWith(hT)}toDisplayName(D){return this.isManagedConfigKey(D)?D.replace(hT,""):D}}class yT extends l3{async isClientPresent(){return await U2.isAppInstalled("Claude")}async isClientConfigPresent(){return await U2.isFilePresent(this.configPath)}constructor(D){super({configPath:D.configPath||U2.getConfigFileForApp("Claude"),name:"claude"})}async initialize(){if(await super.initialize(),!this.config?.mcpServers)await this.updateConfig({...this.config,mcpServers:{}})}async isInstalled(D){if(!await this.isClientPresent())return!1;return await this.initialize(),this.config?.mcpServers?.[this.createServerConfigKey(D)]!==void 0}async uninstall(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.uninstall(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),!await this.isInstalled(D))throw new p1("BAD_REQUEST",`server '${D}' is not installed`);this.logger.debug(`uninstalling ${D}`);let F={...this.config,mcpServers:{...this.config?.mcpServers}};return delete F.mcpServers?.[this.createServerConfigKey(D)],await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async install(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.install(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),await this.isInstalled(D.name))throw new p1("BAD_REQUEST",`server '${D.name}' is already installed`);this.logger.debug(`installing ${D.name}`);let F={...this.config,mcpServers:{...this.config?.mcpServers}};return F.mcpServers[this.createServerConfigKey(D.name)]={command:"npx",args:["-y","@director.run/cli@latest","http2stdio",D.sseURL],env:{LOG_LEVEL:"silent"}},await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async reset(D){await this.initialize(),this.logger.debug("purging claude config");let F={...this.config,mcpServers:{}};if(!D?.includeUnmanaged){for(let[J,Q]of Object.entries(this.config?.mcpServers??{}))if(!this.isManagedConfigKey(J))F.mcpServers[J]=Q}if(JSON.stringify(F)===JSON.stringify(this.config))return{requiresRestart:!1};return await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async list(D){return await this.initialize(),this.logger.debug("listing servers"),Object.entries(this.config?.mcpServers??{}).filter(([F])=>D?.includeUnmanaged?!0:this.isManagedConfigKey(F)).map(([F,w])=>({name:this.toDisplayName(F),url:w.args[3]}))}async openConfig(){this.logger.debug("opening claude config"),await U2.openFileInCode(this.configPath)}async restart(){if(await this.initialize(),!t6())this.logger.debug("restarting claude"),await U2.restartApp("Claude");else this.logger.warn("skipping restart of claude in test environment")}async updateConfig(D){this.config=D,this.logger.debug(`writing config to ${this.configPath}`),await $8(this.configPath,this.config)}async createConfig(){this.logger.debug("initializing claude config"),await $8(this.configPath,{mcpServers:{}})}getCapabilities(){return{requiresRestartOnInstallOrUninstall:!0,requiresRestartOnUpdate:!0,programaticRestartSupported:!0}}}var tK0=M.object({command:M.string().describe('The command to execute (e.g., "bun", "node")'),args:M.array(M.string()).describe("Command line arguments"),env:M.record(M.string()).optional().describe("Environment variables")}),ob0=M.object({mcpServers:M.record(M.string(),tK0).describe("Map of MCP server configurations")});class gT extends l3{async isClientPresent(){return await U2.isAppInstalled("Claude Code")}async isClientConfigPresent(){return await U2.isFilePresent(this.configPath)}constructor(D){super({configPath:D.configPath||U2.getConfigFileForApp("Claude Code"),name:"claude-code"})}async initialize(){if(await super.initialize(),!this.config?.mcpServers)await this.updateConfig({...this.config,mcpServers:{}})}async isInstalled(D){if(!await this.isClientPresent())return!1;return await this.initialize(),this.config?.mcpServers?.[this.createServerConfigKey(D)]!==void 0}async uninstall(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.uninstall(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),!await this.isInstalled(D))throw new p1("BAD_REQUEST",`server '${D}' is not installed`);this.logger.debug(`uninstalling ${D}`);let F={...this.config,mcpServers:{...this.config?.mcpServers}};return delete F.mcpServers?.[this.createServerConfigKey(D)],await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async install(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.install(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),await this.isInstalled(D.name))throw new p1("BAD_REQUEST",`server '${D.name}' is already installed`);this.logger.debug(`installing ${D.name}`);let F={...this.config,mcpServers:{...this.config?.mcpServers}};return F.mcpServers[this.createServerConfigKey(D.name)]={type:"http",url:D.streamableURL},await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async reset(D){await this.initialize(),this.logger.debug("purging claude config");let F={...this.config,mcpServers:{}};if(!D?.includeUnmanaged){for(let[J,Q]of Object.entries(this.config?.mcpServers??{}))if(!this.isManagedConfigKey(J))F.mcpServers[J]=Q}if(JSON.stringify(F)===JSON.stringify(this.config))return{requiresRestart:!1};return await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async list(D){return await this.initialize(),this.logger.debug("listing servers"),Object.entries(this.config?.mcpServers??{}).filter(([F])=>D?.includeUnmanaged?!0:this.isManagedConfigKey(F)).map(([F,{url:w}])=>({name:this.toDisplayName(F),url:w}))}async openConfig(){this.logger.debug("opening code config"),await U2.openFileInCode(this.configPath)}async restart(){await this.initialize(),this.logger.error("restarting claude code not supported")}async updateConfig(D){this.config=D,this.logger.debug(`writing config to ${this.configPath}`),await $8(this.configPath,this.config)}async createConfig(){this.logger.debug("initializing claude config"),await $8(this.configPath,{mcpServers:{}})}getCapabilities(){return{requiresRestartOnInstallOrUninstall:!0,requiresRestartOnUpdate:!0,programaticRestartSupported:!1}}}var eK0=M.object({type:M.literal("http"),url:M.string().describe("The URL of the MCP server")}),Jh0=M.object({mcpServers:M.record(M.string(),eK0).describe("Map of MCP server configurations")});class cT extends l3{async isClientPresent(){return await U2.isAppInstalled("Cursor")}async isClientConfigPresent(){return await U2.isFilePresent(this.configPath)}constructor(D){super({configPath:D.configPath||U2.getConfigFileForApp("Cursor"),name:"cursor"})}async isInstalled(D){if(!await this.isClientPresent())return!1;return await this.initialize(),this.config?.mcpServers?.[this.createServerConfigKey(D)]!==void 0}async uninstall(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.uninstall(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),!await this.isInstalled(D))throw new p1("BAD_REQUEST",`server '${D}' is not installed`);this.logger.debug(`uninstalling ${D}`);let F={...this.config,mcpServers:{...this.config?.mcpServers??{}}};return delete F.mcpServers[this.createServerConfigKey(D)],await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async install(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.install(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),await this.isInstalled(D.name))throw new p1("BAD_REQUEST",`server '${D.name}' is already installed`);this.logger.debug(`installing ${D.name}`);let F={...this.config,mcpServers:{...this.config?.mcpServers??{}}};return F.mcpServers[this.createServerConfigKey(D.name)]={url:D.streamableURL},await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async restart(){if(await this.initialize(),!t6())this.logger.debug("restarting cursor"),await U2.restartApp("Cursor");else this.logger.warn("skipping restart of cursor in test environment")}async list(D){return await this.initialize(),this.logger.debug("listing servers"),Object.entries(this.config?.mcpServers??{}).filter(([F])=>D?.includeUnmanaged?!0:this.isManagedConfigKey(F)).map(([F,w])=>({name:this.toDisplayName(F),url:w.url}))}async initialize(){if(await super.initialize(),!this.config?.mcpServers)await this.updateConfig({...this.config,mcpServers:{}})}async openConfig(){this.logger.debug("opening cursor config"),await U2.openFileInCode(this.configPath)}async reset(D){await this.initialize(),this.logger.debug("purging cursor config");let F={...this.config,mcpServers:{}};if(!D?.includeUnmanaged){for(let[J,Q]of Object.entries(this.config?.mcpServers??{}))if(!this.isManagedConfigKey(J))F.mcpServers[J]=Q}if(JSON.stringify(F)===JSON.stringify(this.config))return{requiresRestart:!1};return await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async updateConfig(D){this.logger.debug(`writing config to ${this.configPath}`),await $8(this.configPath,D),this.config=D}async createConfig(){this.logger.debug("initializing cursor config"),await $8(this.configPath,{mcpServers:{}})}getCapabilities(){return{requiresRestartOnInstallOrUninstall:!1,requiresRestartOnUpdate:!1,programaticRestartSupported:!0}}}import DV0 from"node:fs";import FV0 from"node:path";class lT extends l3{async isClientPresent(){return await U2.isAppInstalled("Visual Studio Code")}async isClientConfigPresent(){return await U2.isFilePresent(this.configPath)}constructor(D){super({configPath:D.configPath||U2.getConfigFileForApp("Visual Studio Code"),name:"vscode"})}async initialize(){if(await super.initialize(),!this.config?.mcp?.servers)await this.updateConfig({...this.config,mcp:{servers:{}}})}async isInstalled(D){if(!await this.isClientPresent())return!1;return await this.initialize(),this.config?.mcp.servers[this.createServerConfigKey(D)]!==void 0}async uninstall(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.uninstall(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),!await this.isInstalled(D))throw new p1("BAD_REQUEST",`server '${D}' is not installed`);this.logger.debug(`uninstalling ${D}`);let F={...this.config,mcp:{servers:{...this.config?.mcp?.servers??{}}}};return delete F.mcp.servers[this.createServerConfigKey(D)],await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async install(D){if(Array.isArray(D)){let w=!1;for(let J of D){let Q=await this.install(J);w=w||Q.requiresRestart}return{requiresRestart:w}}if(await this.initialize(),await this.isInstalled(D.name))throw new p1("BAD_REQUEST",`server '${D.name}' is already installed`);this.logger.debug(`installing ${D.name}`);let F={...this.config,mcp:{servers:{...this.config?.mcp?.servers??{}}}};return F.mcp.servers[this.createServerConfigKey(D.name)]={url:D.sseURL},await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async restart(){if(await this.initialize(),!t6())this.logger.debug("restarting vscode"),await U2.restartApp("Visual Studio Code");else this.logger.warn("skipping restart of vscode in test environment")}async list(D){return await this.initialize(),this.logger.debug("listing servers"),Object.entries(this.config?.mcp.servers??{}).filter(([F])=>D?.includeUnmanaged?!0:this.isManagedConfigKey(F)).map(([F,w])=>({name:this.toDisplayName(F),url:w.url}))}async openConfig(){this.logger.debug("opening vscode config"),await U2.openFileInCode(this.configPath)}async reset(D){await this.initialize(),this.logger.debug("purging vscode config");let F={...this.config,mcp:{servers:{}}};if(!D?.includeUnmanaged){for(let[J,Q]of Object.entries(this.config?.mcp?.servers??{}))if(!this.isManagedConfigKey(J))F.mcp.servers[J]=Q}if(JSON.stringify(F)===JSON.stringify(this.config))return{requiresRestart:!1};return await this.updateConfig(F),{requiresRestart:this.getCapabilities().requiresRestartOnInstallOrUninstall}}async updateConfig(D){this.logger.debug(`writing config to ${this.configPath}`);let F=FV0.dirname(this.configPath);await DV0.promises.mkdir(F,{recursive:!0}),await $8(this.configPath,D),this.config=D}async createConfig(){this.logger.debug("initializing vscode config"),await $8(this.configPath,{mcp:{servers:{}}})}getCapabilities(){return{requiresRestartOnInstallOrUninstall:!0,requiresRestartOnUpdate:!0,programaticRestartSupported:!0}}}var DQ=R1("ClientStore");class DK{_config;constructor(D){this._config=D.config}async enforceClientConfigs({playbookStore:D,baseUrl:F}){DQ.debug({message:"Enforcing client configs"}),await this.resetAll({restartIfNeeded:!1}),DQ.debug({message:"Waiting for 1 second"}),await SN(1000),DQ.debug({message:"Adding back"});for(let w of this.all()){let J=this._config.get(`clients.${w.name}`)??[];for(let Q of J){DQ.debug({message:`Installing ${Q} on ${w.name}`});try{let X=D.get(Q);if((await w.install({name:X.id,sseURL:r0(F,c3(X.id)),streamableURL:r0(F,g3(X.id))})).requiresRestart)await w.restart()}catch(X){if(X instanceof p1&&X.code==="NOT_FOUND"){DQ.warn({message:`Playbook '${Q}' not found, skipping installation on ${w.name}`});continue}throw X}}}}async getClientsByPlaybook(D){let F=[];for(let w of this.all()){if(!await w.isClientPresent())continue;if((await w.list()).some((Q)=>Q.name===D))F.push(w)}return F}get(D){let w=this.all().find((J)=>J.name===D);if(!w)throw new p1("BAD_REQUEST",`Client ${D} is not supported`);return w}all(){return[new yT({}),new cT({}),new lT({}),new gT({})]}async resetAll({restartIfNeeded:D}={restartIfNeeded:!0}){for(let F of this.all()){if(!await F.isClientPresent())continue;if((await F.reset()).requiresRestart&&D)await F.restart()}}async install({clientId:D,playbook:F,baseUrl:w}){let J=this.get(D),Q=await J.install({name:F.id,sseURL:r0(w,c3(F.id)),streamableURL:r0(w,g3(F.id))});if(await this._config.push(`clients.${D}`,F.id),Q.requiresRestart)await J.restart()}async uninstall(D,F){let w=this.get(D),J=await w.uninstall(F);if(await this._config.remove(`clients.${D}`,F),J.requiresRestart)await w.restart()}async toPlainObject(){return await Promise.all(this.all().map((D)=>D.getStatus()))}async handlePlaybookListChange(D){let F=await this.getClientsByPlaybook(D);for(let w of F){if(!await w.isClientPresent())continue;if(w.getCapabilities().requiresRestartOnUpdate)DQ.debug({message:`restarting ${w.name}`}),await w.restart()}}async handlePlaybookRemove(D){let F=await this.getClientsByPlaybook(D);for(let w of F){if(!await w.isClientPresent())continue;if((await w.uninstall(D)).requiresRestart)await w.restart()}}}function FQ(D){return{platform:process.platform,dependencies:[{name:"npx",installed:IT("npx")},{name:"uvx",installed:IT("uvx")}],cliVersion:D}}import w_ from"path";import{dirname as gV0}from"path";import{fileURLToPath as cV0}from"url";var sX1=A1(nX1(),1),GV0=R1("http/middleware"),oX1=(D,F,w,J)=>{let{status:Q,message:X,code:Y}=pV0(D);GV0.error({message:`${F.method} ${F.originalUrl} failed: ${X}`,code:Y,error:D}),w.status(Q).json({message:X,code:Y})};function pV0(D){if(SQ(D))return ZV0(D);if(SI(D))return{status:D.statusCode,message:D.message};else return{status:500,message:"Something unexpected happened :("}}function ZV0(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 rX1(){throw new p1("NOT_FOUND","there's nothing here")}function B7(D){return(F,w,J)=>{Promise.resolve(D(F,w,J)).catch(J)}}function tX1(){return sX1.default({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 eX1=A1(rD(),1),iT=R1("oauth/callback-router");function DY1(D){let F=eX1.default.Router();return F.get("/oauth/:factoryId/:providerId/callback",B7(async(w,J)=>{let Q=w.query.code?.toString(),X=w.query.error?.toString(),Y=w.params.factoryId,W=w.params.providerId;if(Q){iT.info({message:"received oauth callback, authorization successful"});let K=await D.onAuthorizationSuccess(Y,W,Q);if(K?.redirectUrl)J.redirect(K.redirectUrl);else J.send({status:"success",message:"Authorization successful, you can close this window and return to the terminal."})}else if(X){iT.error({message:"received oauth callback, authorization failed",error:X});let K=await D.onAuthorizationError(Y,W,Error(`OAuth authorization failed: ${X}`));if(K?.redirectUrl)J.redirect(K.redirectUrl);else J.status(400).send({status:"error",message:`oauth authorization failed: ${X}`})}else{iT.error({message:"received oauth callback, no authorization code or error"});let K=await D.onAuthorizationError(Y,W,Error("No authorization code provided"));if(K?.redirectUrl)J.redirect(K.redirectUrl);else J.status(400).send({status:"error",message:"no authorization code or error in callback"})}})),F}var nT=A1(rD(),1);import FY1 from"fs";import NV0 from"path";var wY1=(D)=>{let{distPath:F,config:w}=D,J=NV0.join(F,"index.html"),Q=nT.default.Router(),X=(Y,W)=>{if(!FY1.existsSync(J))return W.status(404).send("index.html not found");let K=FY1.readFileSync(J,"utf-8");if(w)K=K.replace("</head>",` <script>
|
|
667
667
|
window.__APP_CONFIG__ = ${JSON.stringify(w)};
|
|
668
668
|
</script>
|
|
669
669
|
</head>`);W.type("html").send(K)};return Q.get(["/","/index.html"],X),Q.use(nT.default.static(F)),Q.get("*",X),Q};var CY1=A1(WY1(),1),IY1=A1(rD(),1);class FK{}var wK=R1("oauth/storage/memory");class sT extends FK{_data=new Map;constructor(){super()}getClientInformation(D){let F=this._data.get(D);return Promise.resolve(F?.clientInformation)}saveClientInformation(D,F){wK.info({message:"saveClientInformation",providerId:D,clientInformation:F});let w=this._data.get(D)||{};return w.clientInformation=F,this._data.set(D,w),Promise.resolve()}getTokens(D){wK.info({message:"getting tokens...",providerId:D});let F=this._data.get(D);return Promise.resolve(F?.tokens)}saveTokens(D,F){wK.info({message:"saving tokens",providerId:D});let w=this._data.get(D)||{};return w.tokens=F,this._data.set(D,w),Promise.resolve()}deleteTokens(D){return wK.info({message:"deleting tokens",providerId:D}),this._data.delete(D),Promise.resolve()}getCodeVerifier(D){let F=this._data.get(D);return Promise.resolve(F?.codeVerifier)}saveCodeVerifier(D,F){wK.info({message:"saving code verifier",providerId:D,codeVerifier:F});let w=this._data.get(D)||{};return w.codeVerifier=F,this._data.set(D,w),Promise.resolve()}}import PV0 from"node:fs/promises";import GY1 from"node:path";import hN from"node:fs";import{dirname as EV0}from"node:path";import JK from"node:fs";function MV0(D){try{let w=JK.statSync(D).mode&511;return w===384||w===256}catch(F){return!0}}function KY1(D){try{JK.chmodSync(D,384)}catch(F){throw new p1("INVALID_ARGUMENT",`Failed to set secure permissions on ${D}: ${F instanceof Error?F.message:String(F)}`)}}function VY1(D){if(!MV0(D)){let w=JK.statSync(D).mode&511;throw new p1("INSECURE_FILE_PERMISSIONS",`File ${D} has insecure permissions (${w.toString(8)}). Expected 600 or 400. Please run: chmod 600 ${D}`,{filePath:D,currentMode:w.toString(8)})}}async function HY1(D){if(!hN.existsSync(D))throw new p1("NOT_FOUND",`file not found at: ${D}`);VY1(D);let F=await hN.promises.readFile(D),w=new TextDecoder().decode(F);return JSON.parse(w)}async function BY1(D,F){await hN.promises.mkdir(EV0(D),{recursive:!0}),await hN.promises.writeFile(D,JSON.stringify(F,null,2)),KY1(D)}var i3=R1("oauth/storage/disk");class oT extends FK{_directory;_filePrefix;constructor(D){super();this._directory=D.directory||GY1.join(process.cwd(),"oauth"),this._filePrefix=D.filePrefix||"oauth"}_getFilePath(D){return GY1.join(this._directory,`${this._filePrefix}-${D}.json`)}async getClientInformation(D){let F=this._getFilePath(D);try{let w=await this._loadData(F);if(w.clientInformation)i3.info({message:"loaded client information from disk",providerId:D,path:F});return w.clientInformation}catch(w){if(w instanceof Error&&"code"in w&&w.code==="NOT_FOUND"){i3.debug({message:"no client information found on disk",providerId:D,path:F});return}throw w}}async saveClientInformation(D,F){let w=this._getFilePath(D);i3.info({message:"saving client information to disk",providerId:D,path:w}),await this._saveData(w,{clientInformation:F})}async getTokens(D){let F=this._getFilePath(D);try{let w=await this._loadData(F);if(w.tokens)i3.info({message:"loaded tokens from disk",providerId:D,path:F});return w.tokens}catch(w){if(w instanceof Error&&"code"in w&&w.code==="NOT_FOUND"){i3.debug({message:"no tokens found on disk",providerId:D,path:F});return}throw w}}async saveTokens(D,F){let w=this._getFilePath(D);i3.info({message:"saving tokens to disk",providerId:D,path:w}),await this._saveData(w,{tokens:F})}async deleteTokens(D){let F=this._getFilePath(D);i3.info({message:"deleting tokens from disk",providerId:D,path:F}),await PV0.unlink(F)}async getCodeVerifier(D){let F=this._getFilePath(D);try{let w=await this._loadData(F);if(w.codeVerifier)i3.info({message:"loaded code verifier from disk",providerId:D,path:F});return w.codeVerifier}catch(w){if(w instanceof Error&&"code"in w&&w.code==="NOT_FOUND")return;throw w}}async saveCodeVerifier(D,F){let w=this._getFilePath(D);i3.info({message:"saving code verifier to disk",providerId:D,path:w}),await this._saveData(w,{codeVerifier:F})}async _loadData(D){try{return await HY1(D)}catch(F){if(F instanceof Error&&"code"in F&&F.code==="NOT_FOUND")return{};throw F}}async _saveData(D,F){let J={...await this._loadData(D),...F};await BY1(D,J)}}var OV0=R1("oauth/provider");class pY1{_clientInformation;_tokens;_codeVerifier;_clientMetadata;_id;_redirectUrl;_storage;_onRedirect;constructor(D){this._id=D.id,this._redirectUrl=D.redirectUrl,this._storage=D.storage,this._onRedirect=D.onRedirect,this._clientMetadata={client_name:"Director OAuth Client",redirect_uris:[this._redirectUrl.toString()],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"client_secret_post",scope:"mcp:tools"}}get redirectUrl(){return this._redirectUrl}get clientMetadata(){return this._clientMetadata}async clientInformation(){if(this._clientInformation)return this._clientInformation;return this._clientInformation=await this._storage.getClientInformation(this._id),this._clientInformation}async saveClientInformation(D){this._clientInformation=D,await this._storage.saveClientInformation(this._id,D)}async tokens(){if(this._tokens)return this._tokens;return this._tokens=await this._storage.getTokens(this._id),this._tokens}async saveTokens(D){this._tokens=D,await this._storage.saveTokens(this._id,D)}async deleteTokens(){this._tokens=void 0,await this._storage.deleteTokens(this._id)}redirectToAuthorization(D){if(this._onRedirect)this._onRedirect(D);else OV0.info(`oauth redirect required: ${D.toString()}`)}async saveCodeVerifier(D){this._codeVerifier=D,await this._storage.saveCodeVerifier(this._id,D)}async codeVerifier(){if(this._codeVerifier)return this._codeVerifier;if(this._codeVerifier=await this._storage.getCodeVerifier(this._id),!this._codeVerifier)throw Error("No code verifier saved");return this._codeVerifier}}class rT{_baseCallbackUrl;_storage;_id;constructor(D){if(this._baseCallbackUrl=D.baseCallbackUrl,this._id=D.id||"default",D.storage==="disk")this._storage=new oT({directory:D.tokenDirectory,filePrefix:[D.filePrefix,this._id].filter(Boolean).join("-")});else this._storage=new sT}getProvider({providerId:D,onRedirect:F}){return new pY1({onRedirect:F,id:D,redirectUrl:r0(this._baseCallbackUrl,`oauth/${this._id}/${D}/callback`),storage:this._storage})}}class yN extends yW{_config;_telemetry;_oAuthHandler;_description;_name;constructor(D,F){super({id:D.id,servers:[...D.servers.map((w)=>ZY1({target:w,oAuthHandler:F?.oAuthHandler})),new vM(D.prompts)]});this._name=D.name,this._description=D.description,this._oAuthHandler=F?.oAuthHandler,this._config=F?.config,this._telemetry=F?.telemetry}get description(){return this._description}get name(){return this._name}async addTarget(D,F={throwOnError:!0}){await this.trackEvent("server_added");let w;if(D instanceof P3)w=D;else w=ZY1({target:D,oAuthHandler:this._oAuthHandler});return await super.addTarget(w,F),await this.persistToConfig(),w}async removeTarget(D){await this.trackEvent("server_removed");let F=await super.removeTarget(D);return await this.persistToConfig(),F}async updateTarget(D,F){let w=await super.updateTarget(D,F);return await this.persistToConfig(),w}async addPrompt(D){let w=await(await super.getTarget(Zw)).addPromptEntry(D);return await this.persistToConfig(),await this.sendListChangedEvents(),w}async removePrompt(D){return await(await super.getTarget(Zw)).removePromptEntry(D),await this.persistToConfig(),await this.sendListChangedEvents(),!0}async updatePrompt(D,F){let J=await(await super.getTarget(Zw)).updatePrompt(D,F);return await this.persistToConfig(),await this.sendListChangedEvents(),J}async listPrompts(){return(await super.getTarget(Zw)).promptList}async update(D){await this.trackEvent("playbook_updated");let{name:F,description:w}=D;if(F!==void 0&&F!==this._name){if(F.trim()==="")throw new p1("BAD_REQUEST","Name cannot be empty");this._name=F}if(w!==void 0&&w!==this._description)this._description=w;return await this.persistToConfig(),this}static async fromConfig(D,F){let w=new yN(D,{oAuthHandler:F?.oAuthHandler,config:F?.config,telemetry:F?.telemetry});return await w.connectTargets(),w}async trackEvent(D){if(this._telemetry)await this._telemetry.trackEvent(D)}async persistToConfig(){if(this._config)await this._config.playbooks.update(this.id,await this.toConfig())}async toConfig(){return{id:this.id,name:this.name,description:this.description,prompts:await this.listPrompts(),servers:await Promise.all(this.targets.filter((D)=>D instanceof Q2||D instanceof v5).map((D)=>D.toPlainObject()))}}async toPlainObject(){return{id:this.id,name:this.name,description:this.description,prompts:await this.listPrompts(),servers:await Promise.all(this.targets.filter((D)=>D instanceof Q2||D instanceof v5).map((D)=>D.toPlainObject({connectionInfo:!0}))),paths:{streamable:g3(this.id),sse:c3(this.id)}}}}function ZY1(D){let{target:F,oAuthHandler:w}=D;switch(F.type){case"http":return new Q2({url:F.url,name:F.name,source:F.source,tools:F.tools,prompts:F.prompts,disabled:F.disabled,headers:F.headers},{oAuthHandler:w});case"stdio":return new v5({name:F.name,command:F.command,args:F.args,env:F.env,source:F.source,tools:F.tools,prompts:F.prompts,disabled:F.disabled})}}var JF=R1("PlaybookStore");class gN{playbooks=new Map;config;telemetry;_oauth;_onPlaybookListChange;_onPlaybookRemove;constructor(D){this.config=D.config,this.telemetry=D.telemetry||cw.noTelemetry(),this._oauth=D.oauth,this._onPlaybookListChange=D.onPlaybookListChange,this._onPlaybookRemove=D.onPlaybookRemove}static async create({config:D,telemetry:F,oauth:w,onPlaybookListChange:J,onPlaybookRemove:Q}){JF.debug("initializing PlaybookStore");let X=new gN({config:D,telemetry:F,oauth:w,onPlaybookListChange:J,onPlaybookRemove:Q});return await X.initialize(),JF.debug("initialization complete"),X}async initialize(){let D=await this.config.playbooks.all();for(let F of D){let w=F.id;JF.debug({message:`initializing ${w}`,playbookId:w}),await this.initializeAndAddPlaybook({id:w,name:F.name,description:F.description??void 0,servers:F.servers,prompts:F.prompts})}}get(D){let F=this.playbooks.get(D);if(!F)throw new p1("NOT_FOUND",`playbook '${D}' not found or failed to initialize.`);return F}async delete(D){this.telemetry.trackEvent("playbook_deleted");let F=this.get(D);for(let w of F.targets)if(w instanceof Q2&&await w.isAuthenticated())await w.logout();await F.close(),await this.config.playbooks.remove(D),this.playbooks.delete(D),await this._onPlaybookRemove?.(D),JF.info(`successfully deleted playbook configuration: ${D}`)}async purge(){await this.closeAll(),await this.config.purge(),this.playbooks.clear()}async closeAll(){JF.info("cleaning up all playbooks..."),await Promise.all(Array.from(this.playbooks.values()).map((D)=>D.close())),JF.info("finished cleaning up all playbooks.")}getAll(){return Array.from(this.playbooks.values())}async onAuthorizationSuccess(D,F,w){let Q=await(await this.get(D)).getTarget(F);if(Q instanceof Q2)await Q.completeAuthFlow(w);else throw new p1("BAD_REQUEST",`target ${F} is not an HTTP client`)}async create({name:D,description:F,servers:w}){this.telemetry.trackEvent("playbook_created");let J=await this.config.playbooks.create({name:D,description:F,servers:w??[]}),Q=await this.initializeAndAddPlaybook({name:D,description:F,servers:w??[],id:J.id});return JF.info({message:"Created new playbook",playbookId:J.id}),Q}async initializeAndAddPlaybook(D){let F=await yN.fromConfig(D,{oAuthHandler:this._oauth?new rT({...this._oauth,id:D.id}):void 0,config:this.config});if(this.playbooks.set(F.id,F),this._onPlaybookListChange)F.setListChangeListner(this._onPlaybookListChange);return F}}var NY1=A1(D7(),1),UY1=A1(KZ(),1),AV0="4mb";async function zY1(D){let F=NY1.default.parse(D.headers["content-type"]??"");if(F.type!=="application/json")throw Error(`Unsupported content-type: ${F}`);let w=await UY1.default(D,{limit:AV0,encoding:F.parameters.charset??"utf-8"});return JSON.parse(w)}var qY1=A1(rD(),1),cN=R1("mcp/sse"),$Y1=({playbookStore:D,telemetry:F})=>{let w=qY1.default.Router(),J=new Map;return w.get("/:playbook_id/sse",B7(async(Q,X)=>{let Y=Q.params.playbook_id,W=D.get(Y),K=new VZ(`/${W.id}/message`,X);J.set(K.sessionId,K),cN.info({message:"SSE connection started",sessionId:K.sessionId,playbookId:W.id,userAgent:Q.headers["user-agent"],host:Q.headers.host}),F?.trackEvent("connection_started",{transport:"sse"}),Q.socket.on("close",()=>{cN.info({message:"SSE connection closed",sessionId:K.sessionId,playbookId:W.id}),J.delete(K.sessionId)}),await W.connect(K)})),w.post("/:playbook_id/message",B7(async(Q,X)=>{let Y=Q.params.playbook_id,W=D.get(Y),K=Q.query.sessionId?.toString();if(!K)throw new p1("BAD_REQUEST","No sessionId provided");let V=await zY1(Q);cN.info({message:"Message received",playbookId:W.id,sessionId:K,method:V.method,params:V.params});let B=J.get(K);if(!B)throw cN.warn({message:"Transport not found",sessionId:K,playbookId:W.id}),new p1("NOT_FOUND","Transport not found");F?.trackEvent("method_called",{method:V.method,transport:"sse"}),await B.handlePostMessage(Q,X,V)})),w};var tT=A1(rD(),1),QK=R1("mcp/streamable"),MY1=({playbookStore:D,telemetry:F})=>{let w=tT.default.Router(),J=new Map;w.use(tT.default.json()),w.post("/:playbook_id/mcp",B7(async(X,Y)=>{let W=X.params.playbook_id,K=await D.get(W),V=X.headers["mcp-session-id"],B;if(V&&J.has(V)){let p=J.get(V);if(!p)throw new p1("NOT_FOUND","Transport not found");B=p}else if(!V&&wX(X.body))QK.info(`[${K.id}] new initialization request`),F?.trackEvent("connection_started",{transport:"streamable"}),B=new HZ({sessionIdGenerator:()=>crypto.randomUUID(),onsessioninitialized:(p)=>{J.set(p,B)}}),B.onclose=()=>{if(QK.info({message:`[${K.id}] transport closed`,playbookId:K.id,sessionId:B.sessionId}),B.sessionId)J.delete(B.sessionId)},X.socket.on("close",()=>{QK.info({message:`[${K.id}] socket closed'`,playbookId:K.id,sessionId:B.sessionId})}),await K.connect(B);else throw new p1("BAD_REQUEST","No valid session ID provided");QK.info({message:`[${K.id}] '${X.body.method}' called`,playbookId:K.id,sessionId:B.sessionId,method:X.body.method,body:X.body}),F?.trackEvent("method_called",{method:X.body.method,transport:"streamable"}),await B.handleRequest(X,Y,X.body)}));let Q=B7(async(X,Y)=>{let W=X.params.playbook_id,K=D.get(W),V=X.headers["mcp-session-id"];if(!V||!J.has(V))throw new p1("BAD_REQUEST","Invalid or missing session ID");let B=J.get(V);if(!B)throw new p1("NOT_FOUND","Transport not found");let p=B;QK.info({message:"MCP handleSessionRequest",playbookId:K.id,sessionId:p.sessionId,body:X.body}),await p.handleRequest(X,Y)});return w.get("/:playbook_id/mcp",Q),w.delete("/:playbook_id/mcp",Q),w};var lN=R1("trpc"),vV0=async({path:D,type:F,next:w,input:J})=>{if(D==="health")return w();let Q=Date.now();lN.trace({path:D,type:F,input:J},"trpc request received");try{let X=await w(),Y=Date.now()-Q;if(X.ok)lN.trace({path:D,type:F,duration:Y},"trpc request successful");else lN.error({path:D,type:F,duration:Y,error:X.error},"trpc request failed");return X}catch(X){let Y=Date.now()-Q;throw lN.error({path:D,type:F,duration:Y,error:X instanceof Error?X.message:"Unknown error"},"trpc request failed"),X}},eT=jv.context().create({transformer:a1,errorFormatter:({shape:D})=>{return{...D,data:{...D.data}}}}),LV0=eT.procedure.use(vV0),E0={router:eT.router,procedure:LV0,middleware:eT.middleware};function RV0(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(Q){let X=(W)=>{if(w+=W.length,!F.maxBodySize||w<=F.maxBodySize){Q.enqueue(new Uint8Array(W.buffer,W.byteOffset,W.byteLength));return}Q.error(new T0({code:"PAYLOAD_TOO_LARGE"})),J=!0,D.off("data",X),D.off("end",Y)},Y=()=>{if(J)return;J=!0,D.off("data",X),D.off("end",Y),Q.close()};D.on("data",X),D.on("end",Y)},cancel(){D.destroy()}})}function xV0(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:",Q=(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}//${Q}`)}catch(J){throw new T0({code:"BAD_REQUEST",message:"Invalid URL",cause:J})}}function TV0(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 Q of J)F.append(w,Q);else if(J!=null)F.append(w,J)}return F}function _V0(D,F,w){let J=new AbortController,Q=()=>{F.off("close",Q),D.off("aborted",Q),J.abort()};F.once("close",Q),D.once("aborted",Q);let X=xV0(D),Y={headers:TV0(D.headers),method:D.method,signal:J.signal};if(D.method!=="GET"&&D.method!=="HEAD")Y.body=RV0(D,w),Y.duplex="half";return new Request(X,Y)}async function CV0(D,F){if(D.write(F)===!1)await new Promise((w,J)=>{let Q=(W)=>{J(W),Y()},X=()=>{w(),Y()},Y=()=>{D.off("error",Q),D.off("drain",X)};D.once("error",Q),D.once("drain",X)})}async function IV0(D){let{res:F}=D;try{let w=new WritableStream({async write(J){var Q;await CV0(F,J),(Q=F.flush)===null||Q===void 0||Q.call(F)}});await D.body.pipeTo(w,{signal:D.signal})}catch(w){if(xp(w))return;throw w}}async function fV0(D){let{response:F,rawResponse:w}=D;if(w.statusCode===200)w.statusCode=F.status;for(let[J,Q]of F.headers)w.setHeader(J,Q);try{if(F.body)await IV0({res:w,signal:D.request.signal,body:F.body})}catch(J){if(!w.headersSent)w.statusCode=500;throw J}finally{w.end()}}var QQ=w0(t4(),1);function D_(D){return(F)=>{var w;let{res:J,req:Q}=D,X=j4(F),Y=T9({config:D.router._def._config,error:X,type:"unknown",path:void 0,input:void 0,ctx:void 0});(w=D.onError)===null||w===void 0||w.call(D,{req:Q,error:X,type:"unknown",path:void 0,input:void 0,ctx:void 0});let W=TD(D.router._def._config,{error:Y});J.statusCode=Y.data.httpStatus,J.end(JSON.stringify(W))}}async function EY1(D){return new Promise((F)=>{var w;let J=(w=D.middleware)!==null&&w!==void 0?w:(Q,X,Y)=>Y();return D.res.once("finish",()=>{F()}),J(D.req,D.res,(Q)=>{a8(async()=>{var X;let Y=_V0(D.req,D.res,{maxBodySize:(X=D.maxBodySize)!==null&&X!==void 0?X:null}),W=async(V)=>{var B;return await((B=D.createContext)===null||B===void 0?void 0:B.call(D,(0,QQ.default)((0,QQ.default)({},D),V)))},K=await e41((0,QQ.default)((0,QQ.default)({},D),{},{req:Y,error:Q?j4(Q):null,createContext:W,onError(V){var B;D===null||D===void 0||(B=D.onError)===null||B===void 0||B.call(D,(0,QQ.default)((0,QQ.default)({},V),{},{req:D.req}))}}));await fV0({request:Y,response:K,rawResponse:D.res})}).catch(D_(D))})})}var F_=w0(t4(),1);function PY1(D){return(F,w)=>{let J="";a8(async()=>{J=F.path.slice(F.path.lastIndexOf("/")+1),await EY1((0,F_.default)((0,F_.default)({},D),{},{req:F,res:w,path:J}))}).catch(D_((0,F_.default)({req:F,res:w,path:J},D)))}}function OY1({playbookStore:D,clientStore:F}){return E0.router({allClients:E0.procedure.query(()=>F.toPlainObject()),install:E0.procedure.input(M.object({clientId:M.string(),playbookId:M.string(),baseUrl:M.string()})).mutation(async({input:w})=>{await F.install({clientId:w.clientId,playbook:D.get(w.playbookId),baseUrl:w.baseUrl})}),uninstall:E0.procedure.input(M.object({clientId:M.string(),playbookId:M.string()})).mutation(async({input:w})=>{let J=D.get(w.playbookId);await F.uninstall(w.clientId,J.id)}),resetAll:E0.procedure.mutation(async()=>{await F.resetAll()})})}var G7=M.string().trim().min(1,"Required"),Vg0=G7.nullish(),jV0=M.string().trim().min(1,"Required").regex(/^[a-z0-9._-]+$/,"Only lowercase ASCII letters, digits, and characters ., -, _ are allowed"),mV0=M.object({type:M.literal("http"),url:G7.url(),headers:M.record(G7,M.string()).optional()}),dV0=M.object({type:M.literal("stdio"),command:G7,args:M.array(M.string()).default([]),env:M.record(G7,M.string()).optional()}),uV0=M.object({include:M.array(G7).optional(),exclude:M.array(G7).optional(),prefix:M.string().trim().optional()}).refine((D)=>!(D.include&&D.exclude),{message:"Cannot use both 'include' and 'exclude' at the same time",path:["include","exclude"]}),aN=M.object({name:jV0,transport:M.discriminatedUnion("type",[mV0,dV0]),source:M.object({name:M.literal("registry"),entryId:G7}).optional(),tools:uV0.optional(),disabled:M.boolean().optional()});var LY1=M.object({name:M.string(),description:M.string().optional(),servers:M.array(aN).optional(),addToolPrefix:M.boolean().optional()}),kV0=LY1.omit({servers:!0}).partial(),bV0=aN.omit({transport:!0}).partial(),AY1=M.object({name:M.string(),title:M.string(),description:M.string().optional(),body:M.string()});function RY1({playbookStore:D}){return E0.router({getAll:E0.procedure.query(async()=>{return await Promise.all(await D.getAll().map((F)=>F.toPlainObject()))}),get:E0.procedure.input(M.object({playbookId:M.string(),queryParams:M.object({}).optional()})).query(async({input:F})=>{return await(await D.get(F.playbookId)).toPlainObject()}),create:E0.procedure.input(LY1).mutation(async({input:F})=>{return(await D.create({name:F.name,description:F.description??void 0,servers:F.servers?.map(vY1)})).toPlainObject()}),update:E0.procedure.input(M.object({playbookId:M.string(),attributes:kV0})).mutation(async({input:F})=>{return await(await(await D.get(F.playbookId)).update({name:F.attributes.name,description:F.attributes.description??void 0})).toPlainObject()}),delete:E0.procedure.input(M.object({playbookId:M.string()})).mutation(async({input:F})=>{return await D.delete(F.playbookId),{success:!0}}),addServer:E0.procedure.input(M.object({playbookId:M.string(),server:aN,queryParams:M.object({includeTools:M.boolean().optional()}).optional()})).mutation(async({input:F})=>{return await(await(await D.get(F.playbookId)).addTarget({...vY1(F.server),prompts:{include:[]}})).toPlainObject({tools:F.queryParams?.includeTools,connectionInfo:!0})}),updateServer:E0.procedure.input(M.object({playbookId:M.string(),serverName:M.string(),attributes:bV0,queryParams:M.object({includeTools:M.boolean().optional()}).optional()})).mutation(async({input:F})=>{return await(await(await D.get(F.playbookId)).updateTarget(F.serverName,F.attributes)).toPlainObject({tools:F.queryParams?.includeTools,connectionInfo:!0})}),getServer:E0.procedure.input(M.object({playbookId:M.string(),serverName:M.string(),queryParams:M.object({includeTools:M.boolean().optional()}).optional()})).query(async({input:F})=>{return await(await(await D.get(F.playbookId)).getTarget(F.serverName)).toPlainObject({tools:F.queryParams?.includeTools,connectionInfo:!0})}),authenticate:E0.procedure.input(M.object({playbookId:M.string(),serverName:M.string()})).query(async({input:F})=>{let J=await(await D.get(F.playbookId)).getTarget(F.serverName);if(J instanceof Q2)if(J.status==="connected")throw new p1("BAD_REQUEST","target is already connected");else return await J.startAuthFlow();else throw new p1("BAD_REQUEST","can only authenticate http clients")}),logout:E0.procedure.input(M.object({playbookId:M.string(),serverName:M.string()})).mutation(async({input:F})=>{let J=await(await D.get(F.playbookId)).getTarget(F.serverName);if(J instanceof Q2)await J.logout();else throw new p1("BAD_REQUEST","can only logout http clients")}),purge:E0.procedure.mutation(()=>D.purge()),removeServer:E0.procedure.input(M.object({playbookId:M.string(),serverName:M.string()})).mutation(async({input:F})=>{return await(await(await D.get(F.playbookId)).removeTarget(F.serverName)).toPlainObject({connectionInfo:!0})}),addPrompt:E0.procedure.input(M.object({playbookId:M.string(),prompt:AY1})).mutation(async({input:F})=>{return await(await D.get(F.playbookId)).addPrompt(F.prompt)}),removePrompt:E0.procedure.input(M.object({playbookId:M.string(),promptName:M.string()})).mutation(async({input:F})=>{return await(await D.get(F.playbookId)).removePrompt(F.promptName)}),updatePrompt:E0.procedure.input(M.object({playbookId:M.string(),promptName:M.string(),prompt:AY1.partial()})).mutation(async({input:F})=>{return await(await D.get(F.playbookId)).updatePrompt(F.promptName,F.prompt)}),listPrompts:E0.procedure.input(M.object({playbookId:M.string()})).query(async({input:F})=>{return await(await D.get(F.playbookId)).listPrompts()})})}var vY1=(D)=>{if(D.transport.type==="http")return{type:D.transport.type,name:D.name,url:D.transport.url,headers:D.transport.headers,tools:D.tools,disabled:D.disabled};else if(D.transport.type==="stdio")return{type:D.transport.type,name:D.name,command:D.transport.command,args:D.transport.args,env:D.transport.env,tools:D.tools,disabled:D.disabled};else throw new p1("BAD_REQUEST","invalid server transport type")};var xY1=A1(p3(),1);function TY1({playbookStore:D}){return E0.router({callTool:E0.procedure.input(M.object({playbookId:M.string(),serverName:M.string(),toolName:M.string(),arguments:M.any()})).mutation(async({input:F})=>{return await(await(await D.get(F.playbookId)).getTarget(F.serverName)).originalCallTool({name:F.toolName,arguments:F.arguments})}),list:E0.procedure.input(M.object({playbookId:M.string(),serverName:M.string().optional()})).query(async({input:F})=>{let w=await D.get(F.playbookId),J=[];for(let Q of w.targets){if(F.serverName&&F.serverName!==Q.name)continue;let X=await Q.originalListTools();J.push(...X.tools.map((Y)=>{let W=Q.tools?.exclude?.includes(Y.name)??!1,K=Q.tools?.include&&Q.tools.include.length>0&&!Q.tools.include.includes(Y.name),V=W||!!K;return{...Y,serverName:Q.name,disabled:V}}))}return J.sort((Q,X)=>Q.name.localeCompare(X.name))}),updateBatch:E0.procedure.input(M.object({playbookId:M.string(),tools:M.array(M.object({serverName:M.string(),name:M.string(),disabled:M.boolean()}))})).mutation(async({input:F})=>{let w=await D.get(F.playbookId),J=xY1.default.groupBy(F.tools,"serverName");for(let Q in J)await w.updateTarget(Q,{tools:{exclude:J[Q].filter((X)=>X.disabled).map((X)=>X.name)}})})})}function hV0({playbookStore:D,clientStore:F}){return E0.router({health:E0.procedure.query(({ctx:w})=>{return FQ(w.cliVersion)}),store:RY1({playbookStore:D}),clients:OY1({playbookStore:D,clientStore:F}),tools:TY1({playbookStore:D})})}function _Y1({playbookStore:D,clientStore:F}){return PY1({router:hV0({playbookStore:D,clientStore:F}),createContext:({res:w})=>{return{cliVersion:w.getHeader("x-cli-version")??null}}})}var XQ=R1("Gateway"),yV0=[/^https?:\/\/localhost(:\d+)?$/];class iN{playbookStore;server;config;app;telemetry;studioAssetsPath;baseUrl;clientStore;get port(){return this.config.get("server.port")}constructor(D){if(this.playbookStore=D.playbookStore,this.config=D.config,this.telemetry=D.telemetry,this.studioAssetsPath=D.studioAssetsPath,this.baseUrl=D.baseUrl,this.clientStore=D.clientStore,this.app=IY1.default(),this.app.use(CY1.default({origin:yV0})),this.app.use(tX1()),this.studioAssetsPath)XQ.debug({message:"serving studio assets from",distPath:this.studioAssetsPath}),this.app.use("/studio",wY1({distPath:this.studioAssetsPath,config:{basePath:"/studio"}}));else XQ.warn({message:"studioAssetsPath not provided, studio will not be available"});this.app.use("/",$Y1({playbookStore:this.playbookStore,telemetry:this.telemetry})),this.app.use("/",MY1({playbookStore:this.playbookStore,telemetry:this.telemetry})),this.app.use("/",DY1({onAuthorizationSuccess:async(F,w,J)=>{if(await this.playbookStore.onAuthorizationSuccess(F,w,J),this.studioAssetsPath)return{redirectUrl:`${this.baseUrl}/studio/oauth/${F}/${w}/callback`};else if(aF())return{redirectUrl:`http://localhost:3000/oauth/${F}/${w}/callback`}},onAuthorizationError:(F,w,J)=>{if(XQ.error({error:J,message:`failed to authorize ${F} ${w}: ${J.message}`}),this.studioAssetsPath)return{redirectUrl:`${this.baseUrl}/studio/oauth/${F}/${w}/callback?error=${JSON.stringify(J)}`};else if(aF())return{redirectUrl:`http://localhost:3000/oauth/${F}/${w}/callback?error=${JSON.stringify(J)}`}}})),this.app.use("/trpc",_Y1({playbookStore:this.playbookStore,clientStore:this.clientStore})),this.app.get("/",(F,w,J)=>{if(this.studioAssetsPath)w.redirect("/studio");else return J()}),this.app.all("*",rX1),this.app.use(oX1)}static async start(D,F){XQ.info("starting director gateway");let w=new DK({config:D.config}),J=await gN.create({config:D.config,telemetry:D.telemetry,oauth:D.config.get("oauth.storage")==="disk"?{storage:"disk",tokenDirectory:D.config.get("oauth.tokenDirectory"),baseCallbackUrl:D.baseUrl}:{storage:"memory",baseCallbackUrl:D.baseUrl},onPlaybookListChange:async(X)=>{await w.handlePlaybookListChange(X)},onPlaybookRemove:async(X)=>{await w.handlePlaybookRemove(X)}});D.telemetry?.trackEvent("gateway_start");let Q=new iN({config:D.config,playbookStore:J,telemetry:D.telemetry,studioAssetsPath:D.studioAssetsPath,baseUrl:D.baseUrl,clientStore:w});return await Q.start(F),process.on("SIGINT",async()=>{XQ.info("received SIGINT, cleaning up playbooks..."),await Q.stop(),process.exit(0)}),Q}async start(D){this.server=this.app.listen(this.port,()=>{XQ.info(`director gateway running on port ${this.port}`),this.clientStore.enforceClientConfigs({playbookStore:this.playbookStore,baseUrl:this.baseUrl}),D?.()})}async stop(){await this.playbookStore.closeAll(),await new Promise((D)=>{this.server?.closeAllConnections(),this.server?.close(()=>D())})}}function fY1(D){D.command("serve").description("Start the web service").action(L1(async()=>{try{await J_()}catch(F){console.error("Fatal error starting gateway",F),process.exit(1)}}))}async function J_(D){console.log(`version: v${C6.version}`),console.log(`config: ${KD()}`),Y81(),await iN.start({config:n4,studioAssetsPath:lV0(),telemetry:_r(),baseUrl:a2()},D)}var lV0=()=>{let D=R1("resolveStudioDistPath"),F=gV0(cV0(import.meta.url)),w=[w_.join(F,"../../../dist/studio/index.html"),w_.join(F,"./studio/index.html")];D.debug({message:"attempting to resolve studio dist path",candidates:w});let J=uB(w);return J?w_.dirname(J):void 0};function SY1(D){D.command("studio").description("Open the UI in your browser").action(L1(async()=>{let F=lW();F.start("opening studio...");try{await g1.health.query()}catch(w){F.fail("Failed to connect to gateway. Have you ran `director serve`?"),process.exit(1)}try{Q_()}catch(w){F.fail(`failed to open ${jO()}, try manually`)}F.stop()}))}async function Q_(){await _N(jO())}var aV0=R1("quickstart");function mY1(D){D.command("quickstart").description("Start the gateway and open the studio in your browser").action(L1(async()=>{await iV0(),await J_(async()=>{aV0.info("gateway started, opening the studio in your browser..."),await Q_()})}))}async function iV0(){let D=lW();D.start("checking prerequisites...");let F=await FQ(C6.version),w=new DK({config:n4});D.stop();let J=[],Q=[];J.push(""),J.push(g0("Dependency Check")),J.push("The following dependencies are required by some MCP servers that use Stdout. It's best to have them all installed."),J.push("");for(let W of F.dependencies)J.push(jY1({name:W.name,installed:W.installed,successText:`${W.name} is installed`,failureText:`${W.name} is not available in $PATH. ${nV0(W)}`}));if(F.dependencies.filter((W)=>W.installed).length<F.dependencies.length)Q.push("Some dependencies are not available in $PATH, MCP servers that depend on them will not work.");J.push(""),J.push(g0("MCP Clients Check")),J.push("Director can automatically configure the following MCP clients for you. It's best to have at least one installed."),J.push("");for(let W of w.all())J.push(jY1({name:W.name,installed:await W.isClientPresent()}));if((await Promise.all(w.all().map(async(W)=>await W.isClientPresent()))).filter((W)=>W).length===0)Q.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(J.push(""),J.push(g0("Summary")),J.push(""),console.log(J.join(`
|