| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 | package pluginimport (	"fmt"	"html/template"	"os"	"path/filepath"	"github.com/langgenius/dify-plugin-daemon/internal/utils/log"	"github.com/langgenius/dify-plugin-daemon/pkg/entities/constants"	"github.com/langgenius/dify-plugin-daemon/pkg/plugin_packager/decoder")const TOOL_MODULE_TEMPLATE = `========== {{.Identity.Name}} ==========Author: {{.Identity.Author}}Label: {{.Identity.Label.EnUS}}Description: {{.Description.Human.EnUS}}Parameters:{{- range .Parameters}}  - Name: {{.Name}}    Type: {{.Type}}    Required: {{.Required}}    Description: {{.HumanDescription.EnUS}}    {{- if .Default}}    Default: {{.Default}}    {{- end}}    {{- if .Options}}    Options:      {{- range .Options}}      - Value: {{.Value}}        Label: {{.Label.EnUS}}      {{- end}}    {{- end}}{{- end}}`const AGENT_MODULE_TEMPLATE = `========== {{.Identity.Name}} ==========Author: {{.Identity.Author}}Label: {{.Identity.Label.EnUS}}Description: {{.Description.EnUS}}Parameters:{{- range .Parameters}}  - Name: {{.Name}}    Type: {{.Type}}    Required: {{.Required}}    {{- if .Default}}    Default: {{.Default}}    {{- end}}{{- end}}`const MODEL_MODULE_TEMPLATE = `========== {{.Model}} ==========Name: {{.Model}}Type: {{.ModelType}}Label: {{.Label.EnUS}}Parameters:{{- range .ParameterRules}}  - Name: {{.Name}}    Type: {{.Type}}    Required: {{.Required}}    Description: {{.Help.EnUS}}    {{- if .Default}}    Default: {{.Default}}    {{- end}}    {{- if .Min}}    Min: {{.Min}}    {{- end}}    {{- if .Max}}    Max: {{.Max}}    {{- end}}    {{- if .Options}}    Options: {{range .Options}}{{.}}, {{end}}    {{- end}}{{- end}}`const ENDPOINT_MODULE_TEMPLATE = `========== Endpoints ==========Path: {{.Path}}Method: {{.Method}}`const PLUGIN_MODULE_TEMPLATE = `========== Plugin ==========Name: {{.Name}}Version: {{.Version}}Description: {{.Description.EnUS}}Author: {{.Author}}Icon: {{.Icon}}Tags: {{range .Tags}}{{.}}, {{end}}Category: {{.Category}}Resource:  Memory: {{.Resource.Memory}} bytesPermissions:  {{- if .Resource.Permission.Tool}}  Tool: {{.Resource.Permission.Tool.Enabled}}  {{- end}}  {{- if .Resource.Permission.Model}}  Model:    Enabled: {{.Resource.Permission.Model.Enabled}}    LLM: {{.Resource.Permission.Model.LLM}}    TextEmbedding: {{.Resource.Permission.Model.TextEmbedding}}    Rerank: {{.Resource.Permission.Model.Rerank}}    TTS: {{.Resource.Permission.Model.TTS}}    Speech2text: {{.Resource.Permission.Model.Speech2text}}    Moderation: {{.Resource.Permission.Model.Moderation}}  {{- end}}  {{- if .Resource.Permission.Node}}  Node: {{.Resource.Permission.Node.Enabled}}  {{- end}}  {{- if .Resource.Permission.Endpoint}}  Endpoint: {{.Resource.Permission.Endpoint.Enabled}}  {{- end}}  {{- if .Resource.Permission.App}}  App: {{.Resource.Permission.App.Enabled}}  {{- end}}  {{- if .Resource.Permission.Storage}}  Storage:    Enabled: {{.Resource.Permission.Storage.Enabled}}    Size: {{.Resource.Permission.Storage.Size}} bytes  {{- end}}`func ModuleList(pluginPath string) {	var pluginDecoder decoder.PluginDecoder	var err error	stat, err := os.Stat(pluginPath)	if err != nil {		log.Error("failed to get plugin file stat: %s", err)		return	}	if stat.IsDir() {		pluginDecoder, err = decoder.NewFSPluginDecoder(pluginPath)	} else {		fileContent, err := os.ReadFile(pluginPath)		if err != nil {			log.Error("failed to read plugin file: %s", err)			return		}		pluginDecoder, err = decoder.NewZipPluginDecoder(fileContent)		if err != nil {			log.Error("failed to create zip plugin decoder: %s", err)			return		}	}	if err != nil {		log.Error("your plugin is not a valid plugin: %s", err)		return	}	manifest, err := pluginDecoder.Manifest()	if err != nil {		log.Error("failed to get manifest: %s", err)		return	}	if manifest.Tool != nil {		for _, tool := range manifest.Tool.Tools {			tmpl, err := template.New("tool").Parse(TOOL_MODULE_TEMPLATE)			if err != nil {				log.Error("failed to parse template: %s", err)				return			}			err = tmpl.Execute(os.Stdout, tool)			if err != nil {				log.Error("failed to execute template: %s", err)				return			}		}	}	if manifest.AgentStrategy != nil {		for _, strategy := range manifest.AgentStrategy.Strategies {			tmpl, err := template.New("agent").Parse(AGENT_MODULE_TEMPLATE)			if err != nil {				log.Error("failed to parse template: %s", err)				return			}			err = tmpl.Execute(os.Stdout, strategy)			if err != nil {				log.Error("failed to execute template: %s", err)				return			}		}	}	if manifest.Model != nil {		for _, model := range manifest.Model.Models {			tmpl, err := template.New("model").Parse(MODEL_MODULE_TEMPLATE)			if err != nil {				log.Error("failed to parse template: %s", err)				return			}			err = tmpl.Execute(os.Stdout, model)			if err != nil {				log.Error("failed to execute template: %s", err)				return			}		}	}	if manifest.Endpoint != nil {		for _, endpoint := range manifest.Endpoint.Endpoints {			tmpl, err := template.New("endpoint").Parse(ENDPOINT_MODULE_TEMPLATE)			if err != nil {				log.Error("failed to parse template: %s", err)				return			}			err = tmpl.Execute(os.Stdout, endpoint)			if err != nil {				log.Error("failed to execute template: %s", err)				return			}		}	}}func ModuleAppendTools(pluginPath string) {	decoder, err := decoder.NewFSPluginDecoder(pluginPath)	if err != nil {		log.Error("your plugin is not a valid plugin: %s", err)		return	}	manifest, err := decoder.Manifest()	if err != nil {		log.Error("failed to get manifest: %s", err)		return	}	if manifest.Tool != nil {		log.Error("you have already declared tools in this plugin, " +			"you can add new tool by modifying the `provider.yaml` file to add new tools, " +			"this command is used to create new module that never been declared in this plugin.")		return	}	if manifest.Model != nil {		log.Error("model plugin dose not support declare tools.")		return	}	if manifest.Plugins.Tools == nil {		manifest.Plugins.Tools = []string{}	}	manifest.Plugins.Tools = append(manifest.Plugins.Tools, fmt.Sprintf("provider/%s.yaml", manifest.Name))	if manifest.Meta.Runner.Language == constants.Python {		if err := createPythonTool(pluginPath, &manifest); err != nil {			log.Error("failed to create python tool: %s", err)			return		}		if err := createPythonToolProvider(pluginPath, &manifest); err != nil {			log.Error("failed to create python tool provider: %s", err)			return		}	}	// save manifest	manifest_file := marshalYamlBytes(manifest.PluginDeclarationWithoutAdvancedFields)	if err := writeFile(filepath.Join(pluginPath, "manifest.yaml"), string(manifest_file)); err != nil {		log.Error("failed to save manifest: %s", err)		return	}	log.Info("created tool module successfully")}func ModuleAppendEndpoints(pluginPath string) {	decoder, err := decoder.NewFSPluginDecoder(pluginPath)	if err != nil {		log.Error("your plugin is not a valid plugin: %s", err)		return	}	manifest, err := decoder.Manifest()	if err != nil {		log.Error("failed to get manifest: %s", err)		return	}	if manifest.Endpoint != nil {		log.Error("you have already declared endpoints in this plugin, " +			"you can add new endpoint by modifying the `provider.yaml` file to add new endpoints, " +			"this command is used to create new module that never been declared in this plugin.")		return	}	if manifest.Model != nil {		log.Error("model plugin dose not support declare endpoints.")		return	}	if manifest.Plugins.Endpoints == nil {		manifest.Plugins.Endpoints = []string{}	}	manifest.Plugins.Endpoints = append(manifest.Plugins.Endpoints, fmt.Sprintf("group/%s.yaml", manifest.Name))	if manifest.Meta.Runner.Language == constants.Python {		if err := createPythonEndpoint(pluginPath, &manifest); err != nil {			log.Error("failed to create python endpoint: %s", err)			return		}		if err := createPythonEndpointGroup(pluginPath, &manifest); err != nil {			log.Error("failed to create python group: %s", err)			return		}	}	// save manifest	manifest_file := marshalYamlBytes(manifest.PluginDeclarationWithoutAdvancedFields)	if err := writeFile(filepath.Join(pluginPath, "manifest.yaml"), string(manifest_file)); err != nil {		log.Error("failed to save manifest: %s", err)		return	}	log.Info("created endpoint module successfully")}
 |