Full Code of 1Panel-dev/1Panel for AI

dev-v2 b05ed1a0ca2a cached
1456 files
14.5 MB
3.9M tokens
7280 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (15,487K chars total). Download the full file to get everything.
Repository: 1Panel-dev/1Panel
Branch: dev-v2
Commit: b05ed1a0ca2a
Files: 1456
Total size: 14.5 MB

Directory structure:
gitextract_ro__1khy/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1_bug_report.yml
│   │   ├── 2_feature_request.yml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── add-labels-for-pr.yml
│       ├── build-and-publish.yml
│       ├── issue-translator.yml
│       ├── llm-code-review.yml
│       ├── sonarcloud-scan.yml
│       ├── sync2gitee.yml
│       └── tyops-check.yml
├── .gitignore
├── .goreleaser.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── SECURITY.md
├── agent/
│   ├── app/
│   │   ├── api/
│   │   │   └── v2/
│   │   │       ├── agents.go
│   │   │       ├── ai.go
│   │   │       ├── alert.go
│   │   │       ├── app.go
│   │   │       ├── app_ignore_upgrade.go
│   │   │       ├── app_install.go
│   │   │       ├── backup.go
│   │   │       ├── clam.go
│   │   │       ├── compose_template.go
│   │   │       ├── container.go
│   │   │       ├── cronjob.go
│   │   │       ├── dashboard.go
│   │   │       ├── database.go
│   │   │       ├── database_common.go
│   │   │       ├── database_mysql.go
│   │   │       ├── database_postgresql.go
│   │   │       ├── database_redis.go
│   │   │       ├── device.go
│   │   │       ├── disk.go
│   │   │       ├── docker.go
│   │   │       ├── entry.go
│   │   │       ├── fail2ban.go
│   │   │       ├── favorite.go
│   │   │       ├── file.go
│   │   │       ├── firewall.go
│   │   │       ├── ftp.go
│   │   │       ├── group.go
│   │   │       ├── health.go
│   │   │       ├── helper/
│   │   │       │   └── helper.go
│   │   │       ├── host.go
│   │   │       ├── host_tool.go
│   │   │       ├── image.go
│   │   │       ├── image_repo.go
│   │   │       ├── logs.go
│   │   │       ├── mcp_server.go
│   │   │       ├── monitor.go
│   │   │       ├── nginx.go
│   │   │       ├── php_extensions.go
│   │   │       ├── process.go
│   │   │       ├── recycle_bin.go
│   │   │       ├── runtime.go
│   │   │       ├── setting.go
│   │   │       ├── snapshot.go
│   │   │       ├── ssh.go
│   │   │       ├── system.go
│   │   │       ├── task.go
│   │   │       ├── tensorrt_llm.go
│   │   │       ├── terminal.go
│   │   │       ├── website.go
│   │   │       ├── website_acme_account.go
│   │   │       ├── website_ca.go
│   │   │       ├── website_dns_account.go
│   │   │       ├── website_domain.go
│   │   │       └── website_ssl.go
│   │   ├── dto/
│   │   │   ├── agents.go
│   │   │   ├── ai.go
│   │   │   ├── alert.go
│   │   │   ├── app.go
│   │   │   ├── backup.go
│   │   │   ├── clam.go
│   │   │   ├── command.go
│   │   │   ├── common_req.go
│   │   │   ├── common_res.go
│   │   │   ├── compose_template.go
│   │   │   ├── container.go
│   │   │   ├── cronjob.go
│   │   │   ├── dashboard.go
│   │   │   ├── database.go
│   │   │   ├── database_postgresql.go
│   │   │   ├── device.go
│   │   │   ├── disk.go
│   │   │   ├── docker.go
│   │   │   ├── fail2ban.go
│   │   │   ├── file.go
│   │   │   ├── firewall.go
│   │   │   ├── ftp.go
│   │   │   ├── group.go
│   │   │   ├── host.go
│   │   │   ├── image.go
│   │   │   ├── image_repo.go
│   │   │   ├── logs.go
│   │   │   ├── monitor.go
│   │   │   ├── nginx.go
│   │   │   ├── request/
│   │   │   │   ├── app.go
│   │   │   │   ├── app_ignore_upgrade.go
│   │   │   │   ├── common.go
│   │   │   │   ├── disk.go
│   │   │   │   ├── favorite.go
│   │   │   │   ├── file.go
│   │   │   │   ├── host_tool.go
│   │   │   │   ├── mcp_server.go
│   │   │   │   ├── nginx.go
│   │   │   │   ├── php_extensions.go
│   │   │   │   ├── process.go
│   │   │   │   ├── recycle_bin.go
│   │   │   │   ├── runtime.go
│   │   │   │   ├── task.go
│   │   │   │   ├── tensorrt_llm.go
│   │   │   │   ├── website.go
│   │   │   │   └── website_ssl.go
│   │   │   ├── response/
│   │   │   │   ├── app.go
│   │   │   │   ├── app_ignore_upgrade.go
│   │   │   │   ├── disk.go
│   │   │   │   ├── favorite.go
│   │   │   │   ├── file.go
│   │   │   │   ├── host_tool.go
│   │   │   │   ├── mcp_server.go
│   │   │   │   ├── nginx.go
│   │   │   │   ├── php_extensions.go
│   │   │   │   ├── recycle_bin.go
│   │   │   │   ├── runtime.go
│   │   │   │   ├── system.go
│   │   │   │   ├── task.go
│   │   │   │   ├── tensorrt_llm.go
│   │   │   │   ├── website.go
│   │   │   │   └── website_ssl.go
│   │   │   ├── setting.go
│   │   │   ├── snapshot.go
│   │   │   └── ssh.go
│   │   ├── model/
│   │   │   ├── agent.go
│   │   │   ├── agent_account.go
│   │   │   ├── agent_account_model.go
│   │   │   ├── ai.go
│   │   │   ├── alert.go
│   │   │   ├── app.go
│   │   │   ├── app_detail.go
│   │   │   ├── app_ignore_upgrade.go
│   │   │   ├── app_install.go
│   │   │   ├── app_install_resource.go
│   │   │   ├── app_launcher.go
│   │   │   ├── app_tag.go
│   │   │   ├── backup.go
│   │   │   ├── base.go
│   │   │   ├── clam.go
│   │   │   ├── compose_template.go
│   │   │   ├── cronjob.go
│   │   │   ├── database.go
│   │   │   ├── database_mysql.go
│   │   │   ├── database_postgresql.go
│   │   │   ├── favorite.go
│   │   │   ├── firewall.go
│   │   │   ├── ftp.go
│   │   │   ├── group.go
│   │   │   ├── host.go
│   │   │   ├── image_repo.go
│   │   │   ├── mcp_server.go
│   │   │   ├── monitor.go
│   │   │   ├── php_extensions.go
│   │   │   ├── runtime.go
│   │   │   ├── setting.go
│   │   │   ├── snapshot.go
│   │   │   ├── ssh.go
│   │   │   ├── tag.go
│   │   │   ├── task.go
│   │   │   ├── tensorrt_llm.go
│   │   │   ├── website.go
│   │   │   ├── website_acme_account.go
│   │   │   ├── website_ca.go
│   │   │   ├── website_dns_account.go
│   │   │   ├── website_domain.go
│   │   │   └── website_ssl.go
│   │   ├── provider/
│   │   │   ├── catalog.go
│   │   │   ├── openclaw.go
│   │   │   └── verify.go
│   │   ├── repo/
│   │   │   ├── agent.go
│   │   │   ├── agent_account.go
│   │   │   ├── agent_account_model.go
│   │   │   ├── ai.go
│   │   │   ├── alert.go
│   │   │   ├── app.go
│   │   │   ├── app_detail.go
│   │   │   ├── app_ignore_upgrade.go
│   │   │   ├── app_install.go
│   │   │   ├── app_install_resource.go
│   │   │   ├── app_launcher.go
│   │   │   ├── app_tag.go
│   │   │   ├── backup.go
│   │   │   ├── clam.go
│   │   │   ├── common.go
│   │   │   ├── compose_template.go
│   │   │   ├── cronjob.go
│   │   │   ├── database.go
│   │   │   ├── database_mysql.go
│   │   │   ├── database_postgresql.go
│   │   │   ├── favorite.go
│   │   │   ├── ftp.go
│   │   │   ├── group.go
│   │   │   ├── host.go
│   │   │   ├── image_repo.go
│   │   │   ├── mcp_server.go
│   │   │   ├── monitor.go
│   │   │   ├── php_extensions.go
│   │   │   ├── runtime.go
│   │   │   ├── script.go
│   │   │   ├── setting.go
│   │   │   ├── snapshot.go
│   │   │   ├── tag.go
│   │   │   ├── task.go
│   │   │   ├── tensorrt_llm.go
│   │   │   ├── website.go
│   │   │   ├── website_acme_account.go
│   │   │   ├── website_ca.go
│   │   │   ├── website_dns_account.go
│   │   │   ├── website_domain.go
│   │   │   └── website_ssl.go
│   │   ├── service/
│   │   │   ├── agents.go
│   │   │   ├── agents_utils.go
│   │   │   ├── ai.go
│   │   │   ├── alert.go
│   │   │   ├── alert_helper.go
│   │   │   ├── alert_sender.go
│   │   │   ├── app.go
│   │   │   ├── app_ingore_upgrade.go
│   │   │   ├── app_install.go
│   │   │   ├── app_sync_task.go
│   │   │   ├── app_utils.go
│   │   │   ├── backup.go
│   │   │   ├── backup_app.go
│   │   │   ├── backup_compose.go
│   │   │   ├── backup_container.go
│   │   │   ├── backup_mysql.go
│   │   │   ├── backup_postgresql.go
│   │   │   ├── backup_record.go
│   │   │   ├── backup_redis.go
│   │   │   ├── backup_runtime.go
│   │   │   ├── backup_website.go
│   │   │   ├── clam.go
│   │   │   ├── compose_template.go
│   │   │   ├── container.go
│   │   │   ├── container_compose.go
│   │   │   ├── container_network.go
│   │   │   ├── container_volume.go
│   │   │   ├── cronjob.go
│   │   │   ├── cronjob_backup.go
│   │   │   ├── cronjob_helper.go
│   │   │   ├── dashboard.go
│   │   │   ├── database.go
│   │   │   ├── database_common.go
│   │   │   ├── database_mysql.go
│   │   │   ├── database_postgresql.go
│   │   │   ├── database_redis.go
│   │   │   ├── device.go
│   │   │   ├── device_clean.go
│   │   │   ├── disk.go
│   │   │   ├── disk_utils.go
│   │   │   ├── docker.go
│   │   │   ├── entry.go
│   │   │   ├── fail2ban.go
│   │   │   ├── favorite.go
│   │   │   ├── file.go
│   │   │   ├── firewall.go
│   │   │   ├── ftp.go
│   │   │   ├── group.go
│   │   │   ├── helper.go
│   │   │   ├── host.go
│   │   │   ├── host_tool.go
│   │   │   ├── image.go
│   │   │   ├── image_repo.go
│   │   │   ├── iptables.go
│   │   │   ├── logs.go
│   │   │   ├── mcp_server.go
│   │   │   ├── monitor.go
│   │   │   ├── nginx.go
│   │   │   ├── nginx_utils.go
│   │   │   ├── php_extensions.go
│   │   │   ├── process.go
│   │   │   ├── recycle_bin.go
│   │   │   ├── runtime.go
│   │   │   ├── runtime_utils.go
│   │   │   ├── setting.go
│   │   │   ├── snapshot.go
│   │   │   ├── snapshot_create.go
│   │   │   ├── snapshot_recover.go
│   │   │   ├── snapshot_rollback.go
│   │   │   ├── ssh.go
│   │   │   ├── system.go
│   │   │   ├── task.go
│   │   │   ├── tensorrt_llm.go
│   │   │   ├── website.go
│   │   │   ├── website_acme_account.go
│   │   │   ├── website_auth_basic.go
│   │   │   ├── website_ca.go
│   │   │   ├── website_dns_account.go
│   │   │   ├── website_domain.go
│   │   │   ├── website_lb.go
│   │   │   ├── website_op.go
│   │   │   ├── website_proxy.go
│   │   │   ├── website_rewrite.go
│   │   │   ├── website_ssl.go
│   │   │   └── website_utils.go
│   │   └── task/
│   │       └── task.go
│   ├── buserr/
│   │   ├── errors.go
│   │   └── multi_err.go
│   ├── cmd/
│   │   └── server/
│   │       ├── ai/
│   │       │   ├── ai.go
│   │       │   ├── compose.yml
│   │       │   └── llm-compose.yml
│   │       ├── cmd/
│   │       │   └── root.go
│   │       ├── conf/
│   │       │   ├── app.yaml
│   │       │   └── conf.go
│   │       ├── docs/
│   │       │   ├── swagger.go
│   │       │   └── x-log.json
│   │       ├── main.go
│   │       └── nginx_conf/
│   │           ├── 404.html
│   │           ├── cache.conf
│   │           ├── domain404.html
│   │           ├── gzip.conf
│   │           ├── index.html
│   │           ├── index.php
│   │           ├── nginx_conf.go
│   │           ├── path_auth.conf
│   │           ├── php-fpm.conf
│   │           ├── php_extensions.json
│   │           ├── proxy.conf
│   │           ├── proxy_cache.conf
│   │           ├── proxy_no_cache.conf
│   │           ├── rewrite/
│   │           │   ├── crmeb.conf
│   │           │   ├── dabr.conf
│   │           │   ├── dbshop.conf
│   │           │   ├── dedecms.conf
│   │           │   ├── default.conf
│   │           │   ├── discuz.conf
│   │           │   ├── discuzx.conf
│   │           │   ├── discuzx2.conf
│   │           │   ├── discuzx3.conf
│   │           │   ├── drupal.conf
│   │           │   ├── ecshop.conf
│   │           │   ├── edusoho.conf
│   │           │   ├── emlog.conf
│   │           │   ├── empirecms.conf
│   │           │   ├── laravel5.conf
│   │           │   ├── maccms.conf
│   │           │   ├── mvc.conf
│   │           │   ├── niushop.conf
│   │           │   ├── phpcms.conf
│   │           │   ├── phpwind.conf
│   │           │   ├── sablog.conf
│   │           │   ├── seacms.conf
│   │           │   ├── shopex.conf
│   │           │   ├── shopwind.conf
│   │           │   ├── thinkphp.conf
│   │           │   ├── typecho.conf
│   │           │   ├── typecho2.conf
│   │           │   ├── wordpress.conf
│   │           │   ├── wp2.conf
│   │           │   ├── yii2.conf
│   │           │   └── zblog.conf
│   │           ├── root_ssl.conf
│   │           ├── sse.conf
│   │           ├── ssl.conf
│   │           ├── stop.html
│   │           ├── stream_default.conf
│   │           ├── upstream.conf
│   │           └── website_default.conf
│   ├── constant/
│   │   ├── alert.go
│   │   ├── app.go
│   │   ├── backup.go
│   │   ├── common.go
│   │   ├── container.go
│   │   ├── host_tool.go
│   │   ├── nginx.go
│   │   ├── runtime.go
│   │   ├── status.go
│   │   ├── task.go
│   │   └── website.go
│   ├── cron/
│   │   ├── cron.go
│   │   └── job/
│   │       ├── app.go
│   │       ├── backup.go
│   │       ├── ssl.go
│   │       └── website.go
│   ├── global/
│   │   ├── config.go
│   │   └── global.go
│   ├── go.mod
│   ├── go.sum
│   ├── i18n/
│   │   ├── i18n.go
│   │   └── lang/
│   │       ├── en.yaml
│   │       ├── es-ES.yaml
│   │       ├── ja.yaml
│   │       ├── ko.yaml
│   │       ├── ms.yaml
│   │       ├── pt-BR.yaml
│   │       ├── ru.yaml
│   │       ├── tr.yaml
│   │       ├── zh-Hant.yaml
│   │       └── zh.yaml
│   ├── init/
│   │   ├── app/
│   │   │   └── app.go
│   │   ├── business/
│   │   │   └── business.go
│   │   ├── cache/
│   │   │   ├── cache.go
│   │   │   └── db/
│   │   │       └── db.go
│   │   ├── db/
│   │   │   └── db.go
│   │   ├── dir/
│   │   │   └── dir.go
│   │   ├── firewall/
│   │   │   └── firewall.go
│   │   ├── hook/
│   │   │   └── hook.go
│   │   ├── lang/
│   │   │   └── lang.go
│   │   ├── log/
│   │   │   └── log.go
│   │   ├── migration/
│   │   │   ├── migrate.go
│   │   │   └── migrations/
│   │   │       ├── init.go
│   │   │       └── utils/
│   │   │           ├── agent_account_model_pool.go
│   │   │           ├── openclaw_agent.go
│   │   │           └── openclaw_caddyfile.go
│   │   ├── router/
│   │   │   └── router.go
│   │   ├── validator/
│   │   │   └── validator.go
│   │   └── viper/
│   │       └── viper.go
│   ├── log/
│   │   ├── config.go
│   │   ├── dup_write_darwin.go
│   │   ├── dup_write_linux.go
│   │   ├── dup_write_windows.go
│   │   ├── manager.go
│   │   └── writer.go
│   ├── middleware/
│   │   ├── certificate.go
│   │   └── operation.go
│   ├── router/
│   │   ├── backup.go
│   │   ├── common.go
│   │   ├── entry.go
│   │   ├── ro_ai.go
│   │   ├── ro_alert.go
│   │   ├── ro_app.go
│   │   ├── ro_container.go
│   │   ├── ro_cronjob.go
│   │   ├── ro_dashboard.go
│   │   ├── ro_database.go
│   │   ├── ro_file.go
│   │   ├── ro_group.go
│   │   ├── ro_host.go
│   │   ├── ro_log.go
│   │   ├── ro_nginx.go
│   │   ├── ro_process.go
│   │   ├── ro_router.go
│   │   ├── ro_runtime.go
│   │   ├── ro_setting.go
│   │   ├── ro_toolbox.go
│   │   ├── ro_website.go
│   │   ├── ro_website_acme_account.go
│   │   ├── ro_website_ca.go
│   │   ├── ro_website_dns_account.go
│   │   └── ro_website_ssl.go
│   ├── server/
│   │   ├── init.go
│   │   └── server.go
│   └── utils/
│       ├── ai_tools/
│       │   ├── gpu/
│       │   │   ├── common/
│       │   │   │   └── gpu_info.go
│       │   │   ├── gpu.go
│       │   │   └── schema/
│       │   │       ├── parser.go
│       │   │       └── types.go
│       │   └── xpu/
│       │       ├── types.go
│       │       ├── xpu.go
│       │       └── xpu_info.go
│       ├── alert/
│       │   └── alert.go
│       ├── alert_push/
│       │   └── alert_push.go
│       ├── appicon/
│       │   └── appicon.go
│       ├── clam/
│       │   └── clam.go
│       ├── cloud_storage/
│       │   ├── client/
│       │   │   ├── ali.go
│       │   │   ├── cos.go
│       │   │   ├── google_drive.go
│       │   │   ├── helper/
│       │   │   │   └── webdav/
│       │   │   │       ├── auth.go
│       │   │   │       ├── auth_basic.go
│       │   │   │       ├── auth_digest.go
│       │   │   │       ├── auth_passport.go
│       │   │   │       ├── errors.go
│       │   │   │       ├── file.go
│       │   │   │       ├── reques.go
│       │   │   │       ├── utils.go
│       │   │   │       └── webdav.go
│       │   │   ├── helper.go
│       │   │   ├── kodo.go
│       │   │   ├── local.go
│       │   │   ├── minio.go
│       │   │   ├── onedrive.go
│       │   │   ├── oss.go
│       │   │   ├── s3.go
│       │   │   ├── sftp.go
│       │   │   ├── up.go
│       │   │   └── webdav.go
│       │   └── cloud_storage_client.go
│       ├── cmd/
│       │   ├── cmd.go
│       │   └── cmdx.go
│       ├── common/
│       │   ├── common.go
│       │   └── sqlite.go
│       ├── compose/
│       │   └── compose.go
│       ├── controller/
│       │   ├── controller.go
│       │   └── manager/
│       │       ├── common.go
│       │       ├── openrc.go
│       │       ├── snap.go
│       │       ├── systemd.go
│       │       └── sysvinit.go
│       ├── convert/
│       │   └── convert.go
│       ├── copier/
│       │   └── copier.go
│       ├── csv_export/
│       │   └── ssh_log.go
│       ├── docker/
│       │   ├── compose.go
│       │   └── docker.go
│       ├── email/
│       │   └── smtp_sender.go
│       ├── encrypt/
│       │   └── encrypt.go
│       ├── env/
│       │   └── env.go
│       ├── files/
│       │   ├── archiver.go
│       │   ├── file_op.go
│       │   ├── fileinfo.go
│       │   ├── rar.go
│       │   ├── tar.go
│       │   ├── tar_gz.go
│       │   ├── utils.go
│       │   ├── x7z.go
│       │   └── zip.go
│       ├── firewall/
│       │   ├── client/
│       │   │   ├── firewalld.go
│       │   │   ├── info.go
│       │   │   ├── iptables/
│       │   │   │   ├── common.go
│       │   │   │   ├── filter.go
│       │   │   │   ├── forward.go
│       │   │   │   └── persistence.go
│       │   │   ├── iptables.go
│       │   │   └── ufw.go
│       │   └── client.go
│       ├── geo/
│       │   └── geo.go
│       ├── ini_conf/
│       │   └── ini.go
│       ├── mysql/
│       │   ├── client/
│       │   │   ├── info.go
│       │   │   ├── local.go
│       │   │   └── remote.go
│       │   └── client.go
│       ├── nginx/
│       │   ├── components/
│       │   │   ├── block.go
│       │   │   ├── comment.go
│       │   │   ├── config.go
│       │   │   ├── directive.go
│       │   │   ├── http.go
│       │   │   ├── location.go
│       │   │   ├── lua_block.go
│       │   │   ├── server.go
│       │   │   ├── server_listen.go
│       │   │   ├── statement.go
│       │   │   ├── upstream.go
│       │   │   └── upstream_server.go
│       │   ├── dumper.go
│       │   └── parser/
│       │       ├── flag/
│       │       │   └── flag.go
│       │       ├── lexer.go
│       │       └── parser.go
│       ├── ntp/
│       │   └── ntp.go
│       ├── openclaw/
│       │   └── caddyfile.go
│       ├── postgresql/
│       │   ├── client/
│       │   │   ├── info.go
│       │   │   ├── local.go
│       │   │   └── remote.go
│       │   └── client.go
│       ├── psutil/
│       │   ├── cpu.go
│       │   ├── disk.go
│       │   ├── global.go
│       │   └── host.go
│       ├── re/
│       │   └── re.go
│       ├── redis/
│       │   └── redis.go
│       ├── req_helper/
│       │   ├── core.go
│       │   └── request.go
│       ├── ssh/
│       │   └── ssh.go
│       ├── ssl/
│       │   ├── acme.go
│       │   ├── client.go
│       │   ├── dns_provider.go
│       │   └── manual_client.go
│       ├── terminal/
│       │   ├── ai/
│       │   │   ├── client.go
│       │   │   ├── command_generator.go
│       │   │   ├── config_runtime.go
│       │   │   └── validate.go
│       │   ├── ai_interceptor.go
│       │   ├── local_cmd.go
│       │   ├── ws_local_session.go
│       │   └── ws_session.go
│       ├── toolbox/
│       │   ├── fail2ban.go
│       │   ├── helper/
│       │   │   └── sha512_crypt.go
│       │   └── pure-ftpd.go
│       ├── version/
│       │   └── version.go
│       ├── websocket/
│       │   ├── client.go
│       │   └── process_data.go
│       └── xpack/
│           └── community.go
├── ci/
│   └── script.sh
├── core/
│   ├── app/
│   │   ├── api/
│   │   │   └── v2/
│   │   │       ├── auth.go
│   │   │       ├── backup.go
│   │   │       ├── command.go
│   │   │       ├── entry.go
│   │   │       ├── group.go
│   │   │       ├── helper/
│   │   │       │   └── helper.go
│   │   │       ├── logs.go
│   │   │       ├── script_library.go
│   │   │       ├── setting.go
│   │   │       └── upgrade.go
│   │   ├── dto/
│   │   │   ├── auth.go
│   │   │   ├── backup.go
│   │   │   ├── command.go
│   │   │   ├── common.go
│   │   │   ├── group.go
│   │   │   ├── logs.go
│   │   │   ├── script_library.go
│   │   │   └── setting.go
│   │   ├── model/
│   │   │   ├── agent.go
│   │   │   ├── alert.go
│   │   │   ├── backup.go
│   │   │   ├── base.go
│   │   │   ├── command.go
│   │   │   ├── group.go
│   │   │   ├── logs.go
│   │   │   ├── script_library.go
│   │   │   ├── setting.go
│   │   │   ├── task.go
│   │   │   └── upgrade_log.go
│   │   ├── repo/
│   │   │   ├── agent.go
│   │   │   ├── backup.go
│   │   │   ├── command.go
│   │   │   ├── common.go
│   │   │   ├── group.go
│   │   │   ├── logs.go
│   │   │   ├── script_library.go
│   │   │   ├── setting.go
│   │   │   ├── task.go
│   │   │   └── upgrade_log.go
│   │   ├── service/
│   │   │   ├── auth.go
│   │   │   ├── backup.go
│   │   │   ├── command.go
│   │   │   ├── entry.go
│   │   │   ├── group.go
│   │   │   ├── logs.go
│   │   │   ├── script_library.go
│   │   │   ├── setting.go
│   │   │   └── upgrade.go
│   │   └── task/
│   │       └── task.go
│   ├── buserr/
│   │   ├── errors.go
│   │   └── multi_err.go
│   ├── cmd/
│   │   └── server/
│   │       ├── app/
│   │       │   ├── app_config.go
│   │       │   ├── app_config.yml
│   │       │   └── app_param.yml
│   │       ├── cmd/
│   │       │   ├── app.go
│   │       │   ├── listen-ip.go
│   │       │   ├── reset.go
│   │       │   ├── restore.go
│   │       │   ├── root.go
│   │       │   ├── update.go
│   │       │   ├── user-info.go
│   │       │   └── version.go
│   │       ├── conf/
│   │       │   ├── app.yaml
│   │       │   └── conf.go
│   │       ├── docs/
│   │       │   ├── docs.go
│   │       │   ├── swagger.go
│   │       │   ├── swagger.json
│   │       │   ├── swagger_test.go
│   │       │   └── x-log.json
│   │       ├── main.go
│   │       ├── res/
│   │       │   ├── error_msg.go
│   │       │   └── html/
│   │       │       ├── 200.html
│   │       │       ├── 200_err_domain.html
│   │       │       ├── 200_err_ip_limit.html
│   │       │       ├── 400.html
│   │       │       ├── 401.html
│   │       │       ├── 403.html
│   │       │       ├── 404.html
│   │       │       ├── 408.html
│   │       │       ├── 416.html
│   │       │       └── 500.html
│   │       └── web/
│   │           ├── static/
│   │           │   ├── china.json
│   │           │   └── world.json
│   │           └── web.go
│   ├── constant/
│   │   ├── alert.go
│   │   ├── common.go
│   │   ├── session.go
│   │   └── status.go
│   ├── deps/
│   │   └── keepdeps.go
│   ├── global/
│   │   ├── config.go
│   │   └── global.go
│   ├── go.mod
│   ├── go.sum
│   ├── i18n/
│   │   ├── i18n.go
│   │   └── lang/
│   │       ├── en.yaml
│   │       ├── es-ES.yaml
│   │       ├── ja.yaml
│   │       ├── ko.yaml
│   │       ├── ms.yaml
│   │       ├── pt-BR.yaml
│   │       ├── ru.yaml
│   │       ├── tr.yaml
│   │       ├── zh-Hant.yaml
│   │       └── zh.yaml
│   ├── init/
│   │   ├── auth/
│   │   │   └── ip_tracker.go
│   │   ├── cron/
│   │   │   ├── cron.go
│   │   │   └── job/
│   │   │       └── backup.go
│   │   ├── db/
│   │   │   └── db.go
│   │   ├── geo/
│   │   │   └── lang.go
│   │   ├── hook/
│   │   │   └── hook.go
│   │   ├── log/
│   │   │   └── log.go
│   │   ├── migration/
│   │   │   ├── helper/
│   │   │   │   └── menu.go
│   │   │   ├── migrate.go
│   │   │   └── migrations/
│   │   │       └── init.go
│   │   ├── proxy/
│   │   │   └── proxy.go
│   │   ├── router/
│   │   │   ├── proxy.go
│   │   │   └── router.go
│   │   ├── run/
│   │   │   └── run.go
│   │   ├── session/
│   │   │   ├── psession/
│   │   │   │   └── psession.go
│   │   │   └── session.go
│   │   ├── swagger/
│   │   │   └── swag.go
│   │   ├── validator/
│   │   │   └── validator.go
│   │   └── viper/
│   │       └── viper.go
│   ├── log/
│   │   ├── config.go
│   │   ├── dup_write_darwin.go
│   │   ├── dup_write_linux.go
│   │   ├── dup_write_windows.go
│   │   ├── manager.go
│   │   └── writer.go
│   ├── middleware/
│   │   ├── api_auth.go
│   │   ├── bind_domain.go
│   │   ├── demo_handle.go
│   │   ├── helper.go
│   │   ├── ip_limit.go
│   │   ├── loading.go
│   │   ├── operation.go
│   │   ├── password_expired.go
│   │   ├── password_rsa.go
│   │   └── session.go
│   ├── router/
│   │   ├── command.go
│   │   ├── common.go
│   │   ├── entry.go
│   │   ├── ro_backup.go
│   │   ├── ro_base.go
│   │   ├── ro_group.go
│   │   ├── ro_log.go
│   │   ├── ro_router.go
│   │   ├── ro_script_library.go
│   │   └── ro_setting.go
│   ├── server/
│   │   ├── init.go
│   │   └── server.go
│   └── utils/
│       ├── captcha/
│       │   └── captcha.go
│       ├── cloud_storage/
│       │   └── refresh_token.go
│       ├── cmd/
│       │   ├── cmd.go
│       │   └── cmdx.go
│       ├── common/
│       │   ├── common.go
│       │   └── sqlite.go
│       ├── controller/
│       │   ├── controller.go
│       │   └── manager/
│       │       ├── common.go
│       │       ├── openrc.go
│       │       ├── snap.go
│       │       ├── systemd.go
│       │       └── sysvinit.go
│       ├── copier/
│       │   └── copier.go
│       ├── csv/
│       │   └── command.go
│       ├── encrypt/
│       │   └── encrypt.go
│       ├── files/
│       │   └── files.go
│       ├── firewall/
│       │   └── firewall.go
│       ├── geo/
│       │   └── geo.go
│       ├── mfa/
│       │   └── mfa.go
│       ├── passkey/
│       │   ├── passkey_record.go
│       │   ├── passkey_store.go
│       │   └── passkey_user.go
│       ├── re/
│       │   └── re.go
│       ├── req_helper/
│       │   ├── proxy_local/
│       │   │   └── req_to_local.go
│       │   └── requset.go
│       ├── security/
│       │   └── security.go
│       ├── ssh/
│       │   ├── http.go
│       │   └── ssh.go
│       ├── terminal/
│       │   ├── local_cmd.go
│       │   ├── ws_local_session.go
│       │   └── ws_session.go
│       └── xpack/
│           └── community.go
├── docs/
│   ├── README.ar.md
│   ├── README.de.md
│   ├── README.es-es.md
│   ├── README.fr.md
│   ├── README.id.md
│   ├── README.ja.md
│   ├── README.ko.md
│   ├── README.ms.md
│   ├── README.pt-br.md
│   ├── README.ru.md
│   ├── README.tr.md
│   ├── README.zh-Hans.md
│   └── README.zh-Hant.md
├── frontend/
│   ├── .editorconfig
│   ├── .eslintignore
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .prettierrc.js
│   ├── index.html
│   ├── lint-staged.config.js
│   ├── package.json
│   ├── postcss.config.cjs
│   ├── src/
│   │   ├── App.vue
│   │   ├── api/
│   │   │   ├── config/
│   │   │   │   └── service-port.ts
│   │   │   ├── helper/
│   │   │   │   ├── axios-cancel.ts
│   │   │   │   └── check-status.ts
│   │   │   ├── index.ts
│   │   │   ├── interface/
│   │   │   │   ├── ai.ts
│   │   │   │   ├── alert.ts
│   │   │   │   ├── app.ts
│   │   │   │   ├── auth.ts
│   │   │   │   ├── backup.ts
│   │   │   │   ├── command.ts
│   │   │   │   ├── container.ts
│   │   │   │   ├── cronjob.ts
│   │   │   │   ├── dashboard.ts
│   │   │   │   ├── database.ts
│   │   │   │   ├── file.ts
│   │   │   │   ├── group.ts
│   │   │   │   ├── host-tool.ts
│   │   │   │   ├── host.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── log.ts
│   │   │   │   ├── nginx.ts
│   │   │   │   ├── process.ts
│   │   │   │   ├── runtime.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── terminal.ts
│   │   │   │   ├── toolbox.ts
│   │   │   │   └── website.ts
│   │   │   └── modules/
│   │   │       ├── ai.ts
│   │   │       ├── alert.ts
│   │   │       ├── app.ts
│   │   │       ├── auth.ts
│   │   │       ├── backup.ts
│   │   │       ├── command.ts
│   │   │       ├── container.ts
│   │   │       ├── cronjob.ts
│   │   │       ├── dashboard.ts
│   │   │       ├── database.ts
│   │   │       ├── files.ts
│   │   │       ├── group.ts
│   │   │       ├── host-tool.ts
│   │   │       ├── host.ts
│   │   │       ├── log.ts
│   │   │       ├── nginx.ts
│   │   │       ├── process.ts
│   │   │       ├── runtime.ts
│   │   │       ├── setting.ts
│   │   │       ├── terminal.ts
│   │   │       ├── toolbox.ts
│   │   │       └── website.ts
│   │   ├── assets/
│   │   │   ├── iconfont/
│   │   │   │   ├── iconfont.css
│   │   │   │   ├── iconfont.js
│   │   │   │   └── iconfont.json
│   │   │   └── json/
│   │   │       └── iso.json
│   │   ├── components/
│   │   │   ├── advanced-setting/
│   │   │   │   └── index.vue
│   │   │   ├── agent-group/
│   │   │   │   ├── change.vue
│   │   │   │   └── index.vue
│   │   │   ├── app-status/
│   │   │   │   └── index.vue
│   │   │   ├── back-button/
│   │   │   │   └── index.vue
│   │   │   ├── backup/
│   │   │   │   └── index.vue
│   │   │   ├── card-with-header/
│   │   │   │   └── index.vue
│   │   │   ├── codemirror-pro/
│   │   │   │   ├── drawer.vue
│   │   │   │   ├── index.vue
│   │   │   │   └── nginx.ts
│   │   │   ├── complex-table/
│   │   │   │   └── index.vue
│   │   │   ├── config-card/
│   │   │   │   └── index.vue
│   │   │   ├── confirm-dialog/
│   │   │   │   └── index.vue
│   │   │   ├── copy-button/
│   │   │   │   └── index.vue
│   │   │   ├── del-dialog/
│   │   │   │   └── index.vue
│   │   │   ├── detail-show/
│   │   │   │   └── index.vue
│   │   │   ├── dialog-pro/
│   │   │   │   └── index.vue
│   │   │   ├── docker-proxy/
│   │   │   │   ├── dialog.vue
│   │   │   │   ├── docker-restart.vue
│   │   │   │   └── index.vue
│   │   │   ├── drawer-pro/
│   │   │   │   └── index.vue
│   │   │   ├── error-message/
│   │   │   │   ├── 404.vue
│   │   │   │   ├── err_domain.vue
│   │   │   │   ├── err_ip.vue
│   │   │   │   ├── error_code.vue
│   │   │   │   └── unsafe.vue
│   │   │   ├── error-prompt/
│   │   │   │   └── index.vue
│   │   │   ├── exist-file/
│   │   │   │   └── index.vue
│   │   │   ├── file-list/
│   │   │   │   └── index.vue
│   │   │   ├── file-role/
│   │   │   │   └── index.vue
│   │   │   ├── group/
│   │   │   │   └── index.vue
│   │   │   ├── index.ts
│   │   │   ├── input-tag/
│   │   │   │   └── index.vue
│   │   │   ├── layout-col/
│   │   │   │   └── form.vue
│   │   │   ├── layout-content/
│   │   │   │   ├── form-button.vue
│   │   │   │   ├── index.vue
│   │   │   │   └── no-such-service.vue
│   │   │   ├── license-import/
│   │   │   │   └── index.vue
│   │   │   ├── log/
│   │   │   │   ├── compose/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── container/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── container-drawer/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── custom-hightlight/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── file/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── file-drawer/
│   │   │   │   │   └── index.vue
│   │   │   │   └── task/
│   │   │   │       ├── index.vue
│   │   │   │       └── log-without-dialog.vue
│   │   │   ├── main-div/
│   │   │   │   └── index.vue
│   │   │   ├── mkdown-editor/
│   │   │   │   └── index.vue
│   │   │   ├── msg-info/
│   │   │   │   └── index.vue
│   │   │   ├── node-select/
│   │   │   │   └── index.vue
│   │   │   ├── port-jump/
│   │   │   │   └── index.vue
│   │   │   ├── router-button/
│   │   │   │   └── index.vue
│   │   │   ├── status/
│   │   │   │   └── index.vue
│   │   │   ├── svg-icon/
│   │   │   │   └── svg-icon.vue
│   │   │   ├── system-upgrade/
│   │   │   │   ├── index.vue
│   │   │   │   ├── releases/
│   │   │   │   │   └── index.vue
│   │   │   │   └── upgrade/
│   │   │   │       └── index.vue
│   │   │   ├── table-refresh/
│   │   │   │   └── index.vue
│   │   │   ├── table-search/
│   │   │   │   └── index.vue
│   │   │   ├── table-setting/
│   │   │   │   └── index.vue
│   │   │   ├── task-list/
│   │   │   │   └── index.vue
│   │   │   ├── terminal/
│   │   │   │   ├── database.vue
│   │   │   │   └── index.vue
│   │   │   ├── tooltip/
│   │   │   │   └── index.vue
│   │   │   ├── upload/
│   │   │   │   └── index.vue
│   │   │   ├── v-charts/
│   │   │   │   ├── components/
│   │   │   │   │   ├── Line.vue
│   │   │   │   │   └── Pie.vue
│   │   │   │   └── index.vue
│   │   │   └── vscode-open/
│   │   │       └── index.vue
│   │   ├── composables/
│   │   │   └── useGlobalStore.ts
│   │   ├── config/
│   │   │   ├── nprogress.ts
│   │   │   └── pinia-persist.ts
│   │   ├── directives/
│   │   │   ├── index.ts
│   │   │   └── modules/
│   │   │       └── integer.ts
│   │   ├── enums/
│   │   │   ├── app.ts
│   │   │   ├── files.ts
│   │   │   └── http-enum.ts
│   │   ├── env.d.ts
│   │   ├── global/
│   │   │   ├── bus.ts
│   │   │   ├── form-rules.ts
│   │   │   ├── mimetype.ts
│   │   │   ├── use-logo.ts
│   │   │   └── use-theme.ts
│   │   ├── lang/
│   │   │   ├── index.ts
│   │   │   └── modules/
│   │   │       ├── en.ts
│   │   │       ├── es-es.ts
│   │   │       ├── ja.ts
│   │   │       ├── ko.ts
│   │   │       ├── ms.ts
│   │   │       ├── pt-br.ts
│   │   │       ├── ru.ts
│   │   │       ├── tr.ts
│   │   │       ├── zh-Hant.ts
│   │   │       └── zh.ts
│   │   ├── layout/
│   │   │   ├── components/
│   │   │   │   ├── AppFooter.vue
│   │   │   │   ├── AppMain.vue
│   │   │   │   ├── MobileHeader.vue
│   │   │   │   ├── Sidebar/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── Collapse.vue
│   │   │   │   │   │   ├── Logo.vue
│   │   │   │   │   │   └── SubItem.vue
│   │   │   │   │   ├── index.scss
│   │   │   │   │   └── index.vue
│   │   │   │   ├── Tabs/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── TabItem.vue
│   │   │   │   │   └── index.vue
│   │   │   │   └── index.ts
│   │   │   ├── hooks/
│   │   │   │   └── useResize.ts
│   │   │   └── index.vue
│   │   ├── main.ts
│   │   ├── routers/
│   │   │   ├── cache-router.ts
│   │   │   ├── constant.ts
│   │   │   ├── index.ts
│   │   │   ├── modules/
│   │   │   │   ├── ai.ts
│   │   │   │   ├── app-store.ts
│   │   │   │   ├── container.ts
│   │   │   │   ├── cronjob.ts
│   │   │   │   ├── database.ts
│   │   │   │   ├── error.ts
│   │   │   │   ├── host.ts
│   │   │   │   ├── log.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── terminal.ts
│   │   │   │   ├── toolbox.ts
│   │   │   │   └── website.ts
│   │   │   └── router.ts
│   │   ├── store/
│   │   │   ├── index.ts
│   │   │   ├── interface/
│   │   │   │   └── index.ts
│   │   │   └── modules/
│   │   │       ├── global.ts
│   │   │       ├── menu.ts
│   │   │       ├── process.ts
│   │   │       ├── tabs.ts
│   │   │       └── terminal.ts
│   │   ├── styles/
│   │   │   ├── common.scss
│   │   │   ├── element-dark.scss
│   │   │   ├── element.scss
│   │   │   ├── index.scss
│   │   │   ├── mixins.scss
│   │   │   ├── moblie.scss
│   │   │   ├── reset.scss
│   │   │   ├── style.css
│   │   │   └── var.scss
│   │   ├── typings/
│   │   │   ├── global.d.ts
│   │   │   ├── plugins.d.ts
│   │   │   └── window.d.ts
│   │   ├── utils/
│   │   │   ├── agent.ts
│   │   │   ├── app.ts
│   │   │   ├── bus.ts
│   │   │   ├── dashboardCache.ts
│   │   │   ├── docker.ts
│   │   │   ├── echarts.ts
│   │   │   ├── get-env.ts
│   │   │   ├── message.ts
│   │   │   ├── node.ts
│   │   │   ├── router.ts
│   │   │   ├── runtime.ts
│   │   │   ├── shortcuts.ts
│   │   │   ├── svg.ts
│   │   │   ├── theme.ts
│   │   │   ├── util.ts
│   │   │   ├── version.ts
│   │   │   └── xpack.ts
│   │   └── views/
│   │       ├── ai/
│   │       │   ├── agents/
│   │       │   │   ├── agent/
│   │       │   │   │   ├── add/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── components/
│   │       │   │   │   │   └── terminal.vue
│   │       │   │   │   ├── config/
│   │       │   │   │   │   ├── index.vue
│   │       │   │   │   │   └── tabs/
│   │       │   │   │   │       ├── channels/
│   │       │   │   │   │       │   ├── dingtalk.vue
│   │       │   │   │   │       │   ├── discord.vue
│   │       │   │   │   │       │   ├── feishu.vue
│   │       │   │   │   │       │   ├── qq.vue
│   │       │   │   │   │       │   ├── telegram.vue
│   │       │   │   │   │       │   └── wecom.vue
│   │       │   │   │   │       ├── channels.vue
│   │       │   │   │   │       ├── model.vue
│   │       │   │   │   │       ├── settings/
│   │       │   │   │   │       │   ├── other.vue
│   │       │   │   │   │       │   └── security.vue
│   │       │   │   │   │       └── settings.vue
│   │       │   │   │   ├── delete/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── model/
│   │       │   │       ├── add/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── index.vue
│   │       │   │       └── pool/
│   │       │   │           └── index.vue
│   │       │   ├── gpu/
│   │       │   │   ├── current/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── history/
│   │       │   │   │   └── index.vue
│   │       │   │   └── index.vue
│   │       │   ├── mcp/
│   │       │   │   ├── index.vue
│   │       │   │   └── server/
│   │       │   │       ├── bind/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── config/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── import/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── index.vue
│   │       │   │       ├── operate/
│   │       │   │       │   └── index.vue
│   │       │   │       └── volume/
│   │       │   │           └── index.vue
│   │       │   └── model/
│   │       │       ├── index.vue
│   │       │       ├── ollama/
│   │       │       │   ├── add/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── conn/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── del/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── domain/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── index.vue
│   │       │       │   └── terminal/
│   │       │       │       └── index.vue
│   │       │       ├── router-menu.vue
│   │       │       ├── tensorrt/
│   │       │       │   ├── index.vue
│   │       │       │   └── operate/
│   │       │       │       └── index.vue
│   │       │       └── vllm/
│   │       │           └── index.vue
│   │       ├── app-store/
│   │       │   ├── apps/
│   │       │   │   ├── app/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── no-app/
│   │       │   │       └── index.vue
│   │       │   ├── components/
│   │       │   │   └── tag.vue
│   │       │   ├── detail/
│   │       │   │   ├── form/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── install/
│   │       │   │   │   └── index.vue
│   │       │   │   └── params/
│   │       │   │       └── index.vue
│   │       │   ├── index.scss
│   │       │   ├── index.vue
│   │       │   ├── installed/
│   │       │   │   ├── app/
│   │       │   │   │   ├── card.vue
│   │       │   │   │   ├── header.vue
│   │       │   │   │   ├── icon.vue
│   │       │   │   │   └── info.vue
│   │       │   │   ├── check/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── detail/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── ignore/
│   │       │   │   │   ├── create/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── upgrade/
│   │       │   │       ├── diff/
│   │       │   │       │   └── index.vue
│   │       │   │       └── index.vue
│   │       │   └── setting/
│   │       │       └── index.vue
│   │       ├── container/
│   │       │   ├── compose/
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   └── index.vue
│   │       │   ├── container/
│   │       │   │   ├── commit/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── file-browser/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── inspect/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── monitor/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── operate/
│   │       │   │   │   ├── confirm.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   ├── network.vue
│   │       │   │   │   └── volume.vue
│   │       │   │   ├── prune/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── rename/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── terminal/
│   │       │   │   │   └── index.vue
│   │       │   │   └── upgrade/
│   │       │   │       └── index.vue
│   │       │   ├── dashboard/
│   │       │   │   └── index.vue
│   │       │   ├── docker-status/
│   │       │   │   └── index.vue
│   │       │   ├── image/
│   │       │   │   ├── build/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── load/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── prune/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── pull/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── push/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── save/
│   │       │   │   │   └── index.vue
│   │       │   │   └── tag/
│   │       │   │       └── index.vue
│   │       │   ├── index.vue
│   │       │   ├── network/
│   │       │   │   ├── create/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── detail/
│   │       │   │   │   └── index.vue
│   │       │   │   └── index.vue
│   │       │   ├── repo/
│   │       │   │   ├── index.vue
│   │       │   │   └── operator/
│   │       │   │       └── index.vue
│   │       │   ├── setting/
│   │       │   │   ├── index.vue
│   │       │   │   ├── ipv6/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── log/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── mirror/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── registry/
│   │       │   │   │   └── index.vue
│   │       │   │   └── sock-path/
│   │       │   │       └── index.vue
│   │       │   ├── template/
│   │       │   │   ├── detail/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── import/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── operator/
│   │       │   │       └── index.vue
│   │       │   └── volume/
│   │       │       ├── create/
│   │       │       │   └── index.vue
│   │       │       └── index.vue
│   │       ├── cronjob/
│   │       │   ├── cronjob/
│   │       │   │   ├── backup/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── config/
│   │       │   │   │   └── clean-log.vue
│   │       │   │   ├── helper.ts
│   │       │   │   ├── import/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── operate/
│   │       │   │   │   └── index.vue
│   │       │   │   └── record/
│   │       │   │       └── index.vue
│   │       │   ├── index.vue
│   │       │   └── library/
│   │       │       ├── index.vue
│   │       │       ├── operate/
│   │       │       │   └── index.vue
│   │       │       └── run/
│   │       │           └── index.vue
│   │       ├── database/
│   │       │   ├── index.vue
│   │       │   ├── mysql/
│   │       │   │   ├── bind/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── check/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── conn/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── create/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── password/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── remote/
│   │       │   │   │   ├── delete/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   └── setting/
│   │       │   │       ├── helper.ts
│   │       │   │       ├── index.vue
│   │       │   │       ├── slow-log/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── status/
│   │       │   │       │   └── index.vue
│   │       │   │       └── variables/
│   │       │   │           └── index.vue
│   │       │   ├── postgresql/
│   │       │   │   ├── bind/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── check/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── conn/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── create/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── password/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── privileges/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── remote/
│   │       │   │   │   ├── delete/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   └── setting/
│   │       │   │       └── index.vue
│   │       │   └── redis/
│   │       │       ├── check/
│   │       │       │   └── index.vue
│   │       │       ├── command/
│   │       │       │   └── index.vue
│   │       │       ├── conn/
│   │       │       │   └── index.vue
│   │       │       ├── index.vue
│   │       │       ├── remote/
│   │       │       │   ├── delete/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── index.vue
│   │       │       │   └── operate/
│   │       │       │       └── index.vue
│   │       │       └── setting/
│   │       │           ├── index.vue
│   │       │           ├── persistence/
│   │       │           │   └── index.vue
│   │       │           └── status/
│   │       │               └── index.vue
│   │       ├── home/
│   │       │   ├── app/
│   │       │   │   └── index.vue
│   │       │   ├── index.vue
│   │       │   ├── quick/
│   │       │   │   └── index.vue
│   │       │   └── status/
│   │       │       └── index.vue
│   │       ├── host/
│   │       │   ├── disk-management/
│   │       │   │   ├── components/
│   │       │   │   │   └── disk-card.vue
│   │       │   │   ├── disk/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── partition/
│   │       │   │       └── index.vue
│   │       │   ├── file-management/
│   │       │   │   ├── batch-role/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── change-role/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── chown/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── code-editor/
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── tabs/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── compress/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── convert/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── create/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── decompress/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── detail/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── download/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── favorite/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── hooks/
│   │       │   │   │   └── searchable.ts
│   │       │   │   ├── index.vue
│   │       │   │   ├── move/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── preview/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── process/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── recycle-bin/
│   │       │   │   │   ├── delete/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── reduce/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── rename/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── terminal/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── text-preview/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── upload/
│   │       │   │   │   └── index.vue
│   │       │   │   └── wget/
│   │       │   │       └── index.vue
│   │       │   ├── firewall/
│   │       │   │   ├── advance/
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── forward/
│   │       │   │   │   ├── import/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── ip/
│   │       │   │   │   ├── import/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── port/
│   │       │   │   │   ├── import/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   └── status/
│   │       │   │       └── index.vue
│   │       │   ├── monitor/
│   │       │   │   ├── index.vue
│   │       │   │   ├── monitor/
│   │       │   │   │   └── index.vue
│   │       │   │   └── setting/
│   │       │   │       ├── days/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── default-io/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── default-network/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── index.vue
│   │       │   │       └── interval/
│   │       │   │           └── index.vue
│   │       │   ├── process/
│   │       │   │   ├── index.vue
│   │       │   │   ├── network/
│   │       │   │   │   └── index.vue
│   │       │   │   └── process/
│   │       │   │       ├── detail/
│   │       │   │       │   └── index.vue
│   │       │   │       └── index.vue
│   │       │   └── ssh/
│   │       │       ├── index.vue
│   │       │       ├── log/
│   │       │       │   ├── index.vue
│   │       │       │   └── log.vue
│   │       │       ├── session/
│   │       │       │   └── index.vue
│   │       │       └── ssh/
│   │       │           ├── address/
│   │       │           │   └── index.vue
│   │       │           ├── auth-keys/
│   │       │           │   └── index.vue
│   │       │           ├── certification/
│   │       │           │   ├── index.vue
│   │       │           │   └── operate/
│   │       │           │       └── index.vue
│   │       │           ├── index.vue
│   │       │           ├── port/
│   │       │           │   └── index.vue
│   │       │           └── root/
│   │       │               └── index.vue
│   │       ├── log/
│   │       │   ├── index.vue
│   │       │   ├── login/
│   │       │   │   └── index.vue
│   │       │   ├── operation/
│   │       │   │   └── index.vue
│   │       │   ├── router/
│   │       │   │   └── index.vue
│   │       │   ├── system/
│   │       │   │   └── index.vue
│   │       │   ├── task/
│   │       │   │   └── index.vue
│   │       │   └── website/
│   │       │       └── index.vue
│   │       ├── login/
│   │       │   ├── components/
│   │       │   │   └── login-form.vue
│   │       │   └── index.vue
│   │       ├── setting/
│   │       │   ├── about/
│   │       │   │   └── index.vue
│   │       │   ├── alert/
│   │       │   │   ├── dash/
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── task/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── log/
│   │       │   │   │   └── index.vue
│   │       │   │   └── setting/
│   │       │   │       ├── email/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── index.vue
│   │       │   │       ├── phone/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── time-range/
│   │       │   │       │   └── index.vue
│   │       │   │       └── webhook/
│   │       │   │           └── index.vue
│   │       │   ├── backup-account/
│   │       │   │   ├── helper.ts
│   │       │   │   ├── index.vue
│   │       │   │   └── operate/
│   │       │   │       └── index.vue
│   │       │   ├── expired.vue
│   │       │   ├── index.vue
│   │       │   ├── license/
│   │       │   │   ├── bind/
│   │       │   │   │   ├── free.vue
│   │       │   │   │   └── xpack.vue
│   │       │   │   └── index.vue
│   │       │   ├── panel/
│   │       │   │   ├── api-interface/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── edition/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── hidemenu/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── name/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── password/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── proxy/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── systemip/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── theme-color/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── timeout/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── username/
│   │       │   │   │   └── index.vue
│   │       │   │   └── watermark/
│   │       │   │       └── index.vue
│   │       │   ├── safe/
│   │       │   │   ├── allowips/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── bind/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── domain/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── entrance/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── mfa/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── passkey/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── port/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── response/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── ssl/
│   │       │   │   │   └── index.vue
│   │       │   │   └── timeout/
│   │       │   │       └── index.vue
│   │       │   └── snapshot/
│   │       │       ├── create/
│   │       │       │   └── index.vue
│   │       │       ├── import/
│   │       │       │   └── index.vue
│   │       │       ├── index.vue
│   │       │       ├── recover/
│   │       │       │   └── index.vue
│   │       │       └── status/
│   │       │           └── index.vue
│   │       ├── terminal/
│   │       │   ├── command/
│   │       │   │   ├── import/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── operate/
│   │       │   │       └── index.vue
│   │       │   ├── host/
│   │       │   │   ├── index.vue
│   │       │   │   └── operate/
│   │       │   │       └── index.vue
│   │       │   ├── index.vue
│   │       │   ├── setting/
│   │       │   │   ├── ai/
│   │       │   │   │   ├── helper.ts
│   │       │   │   │   └── index.vue
│   │       │   │   ├── default_conn/
│   │       │   │   │   └── index.vue
│   │       │   │   └── index.vue
│   │       │   └── terminal/
│   │       │       ├── host-create.vue
│   │       │       └── index.vue
│   │       ├── toolbox/
│   │       │   ├── clam/
│   │       │   │   ├── index.vue
│   │       │   │   ├── operate/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── record/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── setting/
│   │       │   │   │   └── index.vue
│   │       │   │   └── status/
│   │       │   │       └── index.vue
│   │       │   ├── clean/
│   │       │   │   └── index.vue
│   │       │   ├── device/
│   │       │   │   ├── dns/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── hostname/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── hosts/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── ntp/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── passwd/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── swap/
│   │       │   │   │   └── index.vue
│   │       │   │   └── time-zone/
│   │       │   │       └── index.vue
│   │       │   ├── fail2ban/
│   │       │   │   ├── ban-action/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── ban-time/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── find-time/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── ips/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── log-path/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── max-retry/
│   │       │   │   │   └── index.vue
│   │       │   │   └── port/
│   │       │   │       └── index.vue
│   │       │   ├── ftp/
│   │       │   │   ├── index.vue
│   │       │   │   ├── log/
│   │       │   │   │   └── index.vue
│   │       │   │   └── operate/
│   │       │   │       └── index.vue
│   │       │   ├── index.vue
│   │       │   └── supervisor/
│   │       │       ├── config/
│   │       │       │   ├── basic/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── index.vue
│   │       │       │   └── source/
│   │       │       │       └── index.vue
│   │       │       ├── create/
│   │       │       │   └── index.vue
│   │       │       ├── file/
│   │       │       │   └── index.vue
│   │       │       ├── index.vue
│   │       │       ├── log/
│   │       │       │   └── index.vue
│   │       │       └── status/
│   │       │           ├── index.vue
│   │       │           └── init/
│   │       │               └── index.vue
│   │       └── website/
│   │           ├── runtime/
│   │           │   ├── app/
│   │           │   │   └── index.vue
│   │           │   ├── common/
│   │           │   │   └── utils.ts
│   │           │   ├── components/
│   │           │   │   ├── dir/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── environment/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── extra_hosts/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── node-config.vue
│   │           │   │   ├── port/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── port-jump.vue
│   │           │   │   ├── runtime-status.vue
│   │           │   │   ├── terminal.vue
│   │           │   │   └── volume/
│   │           │   │       └── index.vue
│   │           │   ├── delete/
│   │           │   │   └── index.vue
│   │           │   ├── dotnet/
│   │           │   │   ├── index.vue
│   │           │   │   └── operate/
│   │           │   │       └── index.vue
│   │           │   ├── go/
│   │           │   │   ├── index.vue
│   │           │   │   └── operate/
│   │           │   │       └── index.vue
│   │           │   ├── index.vue
│   │           │   ├── java/
│   │           │   │   ├── index.vue
│   │           │   │   └── operate/
│   │           │   │       └── index.vue
│   │           │   ├── node/
│   │           │   │   ├── index.vue
│   │           │   │   ├── module/
│   │           │   │   │   └── index.vue
│   │           │   │   └── operate/
│   │           │   │       └── index.vue
│   │           │   ├── php/
│   │           │   │   ├── check/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── config/
│   │           │   │   │   ├── config/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── container/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── fpm-status/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── function/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── index.vue
│   │           │   │   │   ├── performance/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── php-fpm/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── slow-log/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── timeout/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   └── upload/
│   │           │   │   │       └── index.vue
│   │           │   │   ├── create/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── extension-management/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── extension-template/
│   │           │   │   │   ├── index.vue
│   │           │   │   │   └── operate/
│   │           │   │   │       └── index.vue
│   │           │   │   ├── index.vue
│   │           │   │   └── supervisor/
│   │           │   │       ├── create/
│   │           │   │       │   └── index.vue
│   │           │   │       ├── file/
│   │           │   │       │   └── index.vue
│   │           │   │       └── index.vue
│   │           │   └── python/
│   │           │       ├── index.vue
│   │           │       └── operate/
│   │           │           └── index.vue
│   │           ├── ssl/
│   │           │   ├── acme-account/
│   │           │   │   ├── create/
│   │           │   │   │   └── index.vue
│   │           │   │   └── index.vue
│   │           │   ├── apply/
│   │           │   │   └── index.vue
│   │           │   ├── ca/
│   │           │   │   ├── create/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── detail/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── index.vue
│   │           │   │   └── obtain/
│   │           │   │       └── index.vue
│   │           │   ├── create/
│   │           │   │   └── index.vue
│   │           │   ├── detail/
│   │           │   │   └── index.vue
│   │           │   ├── dns-account/
│   │           │   │   ├── create/
│   │           │   │   │   └── index.vue
│   │           │   │   └── index.vue
│   │           │   ├── index.vue
│   │           │   ├── obtain/
│   │           │   │   └── index.vue
│   │           │   └── upload/
│   │           │       └── index.vue
│   │           └── website/
│   │               ├── batch-op/
│   │               │   ├── group.vue
│   │               │   └── https.vue
│   │               ├── check/
│   │               │   └── index.vue
│   │               ├── components/
│   │               │   ├── group/
│   │               │   │   └── index.vue
│   │               │   ├── https/
│   │               │   │   └── index.vue
│   │               │   └── website-ssl/
│   │               │       └── index.vue
│   │               ├── config/
│   │               │   ├── basic/
│   │               │   │   ├── anti-Leech/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── auth-basic/
│   │               │   │   │   ├── create/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── cors/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── default-doc/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── domain/
│   │               │   │   │   ├── create/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── https/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── index.vue
│   │               │   │   ├── limit-conn/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── load-balance/
│   │               │   │   │   ├── file/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── form/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── index.vue
│   │               │   │   │   └── operate/
│   │               │   │   │       └── index.vue
│   │               │   │   ├── other/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── php/
│   │               │   │   │   ├── composer/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── proxy/
│   │               │   │   │   ├── cache/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── create/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── file/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── real-ip/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── redirect/
│   │               │   │   │   ├── create/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── file/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── resource/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── rewrite/
│   │               │   │   │   ├── custom/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── site-folder/
│   │               │   │   │   └── index.vue
│   │               │   │   └── stream/
│   │               │   │       └── index.vue
│   │               │   ├── index.vue
│   │               │   ├── log/
│   │               │   │   ├── index.vue
│   │               │   │   └── log-fiile/
│   │               │   │       └── index.vue
│   │               │   └── resource/
│   │               │       ├── index.vue
│   │               │       └── nginx/
│   │               │           └── index.vue
│   │               ├── cors/
│   │               │   └── index.vue
│   │               ├── create/
│   │               │   ├── index.vue
│   │               │   └── site-alert/
│   │               │       └── index.vue
│   │               ├── default/
│   │               │   └── index.vue
│   │               ├── delete/
│   │               │   └── index.vue
│   │               ├── domain/
│   │               │   └── index.vue
│   │               ├── domain-create/
│   │               │   └── index.vue
│   │               ├── html/
│   │               │   └── index.vue
│   │               ├── index.vue
│   │               ├── nginx/
│   │               │   ├── index.vue
│   │               │   ├── module/
│   │               │   │   ├── build/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── index.vue
│   │               │   │   └── operate/
│   │               │   │       └── index.vue
│   │               │   ├── other/
│   │               │   │   ├── https/
│   │               │   │   │   └── index.vue
│   │               │   │   └── index.vue
│   │               │   ├── performance/
│   │               │   │   └── index.vue
│   │               │   ├── source/
│   │               │   │   └── index.vue
│   │               │   └── status/
│   │               │       └── index.vue
│   │               └── status/
│   │                   └── index.vue
│   ├── tailwind.config.js
│   ├── tsconfig.json
│   ├── vite-env.d.ts
│   └── vite.config.ts
└── sonar-project.properties

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.ts linguist-language=Go
*.js linguist-language=Go
*.css linguist-language=Go
*.scss linguist-language=Go
*.html linguist-language=Go


================================================
FILE: .github/ISSUE_TEMPLATE/1_bug_report.yml
================================================
name: 'Bug Report'
description: 'Report an Bug'
title: '[Bug] '
assignees: wanghe-fit2cloud
body:
  - type: markdown
    attributes:
      value: "## Contact Information"
  - type: input
    validations:
      required: false
    attributes:
      label: "Contact Information"
      description: "The ways to quickly contact you: WeChat group number and nickname, email, etc."
  - type: markdown
    attributes:
      value: "## Environment Information"
  - type: input
    validations:
      required: true
    attributes:
      label: "1Panel Version"
      description: "Log in to the 1Panel Web console and check the current version at the bottom right of the page."
  - type: markdown
    attributes:
      value: "## Detailed information"
  - type: textarea
    attributes:
      label: "Problem Description"
      description: "Briefly describe the issue you’ve encountered."
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Steps to Reproduce"
      description: "How can this issue be reproduced."
    validations:
      required: true
  - type: textarea
    attributes:
      label: "The expected correct result"
  - type: textarea
    attributes:
      label: "Related log output"
      description: "Please paste any relevant log output here. It will automatically be formatted as code, so no backticks are necessary."
      render: shell
  - type: textarea
    attributes:
      label: "Additional Information"
      description: "If you have any additional information to provide, you can include it here (screenshots, videos, etc., are welcome)."

================================================
FILE: .github/ISSUE_TEMPLATE/2_feature_request.yml
================================================
name: 'Feature Request'
description: 'Suggest an idea'
title: '[Feature] '
assignees: wanghe-fit2cloud
body:
  - type: markdown
    attributes:
      value: "## Environment Information"
  - type: input
    validations:
      required: true
    attributes:
      label: "1Panel Version"
      description: "Log in to the 1Panel Web console and check the current version at the bottom right of the page."
  - type: markdown
    attributes:
      value: "## Detailed information"
  - type: textarea
    attributes:
      label: "Please describe your needs or suggestions for improvements"
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Please describe the solution you suggest"
  - type: textarea
    attributes:
      label: "Additional Information"
      description: "If you have any additional information to provide, you can include it here (screenshots, videos, etc., are welcome)."

================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Questions & Discussions
    url: https://github.com/1Panel-dev/1Panel/discussions
    about: Raise questions about the installation, deployment, use and other aspects of the project.

================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
#### What this PR does / why we need it?

#### Summary of your change

#### Please indicate you've done the following:

- [ ] Made sure tests are passing and test coverage is added if needed.
- [ ] Made sure commit message follow the rule of [Conventional Commits specification](https://www.conventionalcommits.org/).
- [ ] Considered the docs impact and opened a new docs issue or PR with docs changes if needed.

================================================
FILE: .github/workflows/add-labels-for-pr.yml
================================================

name: General PR Handling for 1Panel
on: pull_request
permissions:
  pull-requests: write
jobs:
  generic_handler:
    name: Add Labels to PR
    if: github.repository == '1Panel-dev/1Panel'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions-ecosystem/action-add-labels@v1
        with:
          github_token: ${{ secrets.GITHUBTOKEN }}
          labels: ${{ github.base_ref }}


================================================
FILE: .github/workflows/build-and-publish.yml
================================================
name: Build And Publish (OSS + R2)

on:
  push:
    tags:
      - 'v*'

jobs:
  create-release:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: '22.19.0'

      - name: Build Web
        run: |
          cd frontend && npm install && npm run build:pro
        env:
          NODE_OPTIONS: --max-old-space-size=8192

      - name: Setup Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.24'
          cache-dependency-path: |
            core/go.sum
            agent/go.sum

      - name: Build Release
        uses: goreleaser/goreleaser-action@v6
        with:
          distribution: goreleaser
          version: '~> v2'
          args: release --skip=publish --clean

      - name: Upload Assets
        uses: softprops/action-gh-release@v1
        if: startsWith(github.ref, 'refs/tags/')
        with:
          draft: true
          files: |
            dist/*.tar.gz
            dist/checksums.txt

      - name: Setup OSSUTIL
        uses: yizhoumo/setup-ossutil@v2
        with:
          endpoint: ${{ secrets.OSS_ENDPOINT }}
          access-key-id: ${{ secrets.OSS_ACCESS_KEY_ID }}
          access-key-secret: ${{ secrets.OSS_ACCESS_KEY_SECRET }}
          ossutil-version: '1.7.18'

      - name: Upload Assets to OSS
        run: |
          ossutil cp -r dist/ oss://resource-fit2cloud-com/1panel/package/v2/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --only-current-dir --force

      - name: Setup Rclone
        uses: AnimMouse/setup-rclone@v1
        with:
          rclone_config: ${{ secrets.RCLONE_CONFIG }}

      - name: Upload to Cloudflare R2
        run: |
          rclone copy dist/ cloudflare_r2:package/v2/stable/${{ github.ref_name }}/release/ --include "*.tar.gz" --include "checksums.txt" --progress


================================================
FILE: .github/workflows/issue-translator.yml
================================================
name: Issue Translator
on: 
  issue_comment: 
    types: [created]
  issues: 
    types: [opened]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: usthe/issues-translate-action@v2.7
        with:
          IS_MODIFY_TITLE: true
          BOT_GITHUB_TOKEN: ${{ secrets.ISSUE_TRANSLATOR_TOKEN }} 

================================================
FILE: .github/workflows/llm-code-review.yml
================================================
name: LLM Code Review
permissions:
  contents: read
  pull-requests: write
on:
  pull_request:
    types: [opened, reopened, synchronize]
jobs:
  llm-code-review:
    runs-on: ubuntu-latest
    steps:
      - uses: fit2cloud/LLM-CodeReview-Action@main
        env:
          GITHUB_TOKEN: ${{ secrets.FIT2CLOUDRD_LLM_CODE_REVIEW_TOKEN }}
          OPENAI_API_KEY: ${{ secrets.ALIYUN_LLM_API_KEY }}
          LANGUAGE: English
          OPENAI_API_ENDPOINT: https://dashscope.aliyuncs.com/compatible-mode/v1
          MODEL: qwen2.5-coder-3b-instruct
          PROMPT: "Please check the following code differences for any irregularities, potential issues, or optimization suggestions, and provide your answers in English."
          top_p: 1
          temperature: 1
          # max_tokens: 10000
          MAX_PATCH_LENGTH: 10000 
          IGNORE_PATTERNS: "/node_modules,*.md,/dist,/.github"
          FILE_PATTERNS: "*.java,*.go,*.py,*.vue,*.ts,*.js,*.css,*.scss,*.html"

================================================
FILE: .github/workflows/sonarcloud-scan.yml
================================================
name: SonarCloud Scan
on:
  push:
    branches:
      - dev
  pull_request:
    types: [opened, synchronize, reopened]
jobs:
  sonarcloud:
    name: SonarCloud
    if: github.repository == '1Panel-dev/1Panel'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: SonarCloud Scan
        uses: SonarSource/sonarcloud-github-action@master
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUBTOKEN }}
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

================================================
FILE: .github/workflows/sync2gitee.yml
================================================
name: Synchronize to Gitee
on: [push]
jobs:
  repo-sync:
    if: github.repository == '1Panel-dev/1Panel'
    runs-on: ubuntu-latest
    steps:
      - name: Mirror the Github organization repos to Gitee.
        uses: Yikun/hub-mirror-action@master
        with:
          src: 'github/1Panel-dev'
          dst: 'gitee/fit2cloud-feizhiyun'
          dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
          dst_token:  ${{ secrets.GITEE_TOKEN }}
          static_list: "1Panel"
          force_update: true

================================================
FILE: .github/workflows/tyops-check.yml
================================================
name: Typos Check
on: pull_request
jobs:
  run:
    name: Spell Check with Typos
    runs-on: ubuntu-latest
    steps:
    - name: Checkout Actions Repository
      uses: actions/checkout@v2
    - name: Check spelling
      uses: crate-ci/typos@master

================================================
FILE: .gitignore
================================================
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
build/1panel-agent
build/1panel-core

# Mac
.DS_Store
*/.DS_Store

# VS Code
.vscode
*.project
*.factorypath
__debug*

# IntelliJ IDEA
.idea/*
!.idea/icon.png
*.iws
*.iml
*.ipr


# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Dependency directories
/pkg/
backend/__debug_bin
core/cmd/server/__debug_bin
core/cmd/server/web/assets
core/cmd/server/web/monacoeditorwork
core/cmd/server/web/index.html
frontend/auto-imports.d.ts
frontend/components.d.ts
frontend/src/xpack
agent/xpack
agent/router/entry_xpack.go
agent/server/init_xpack.go
agent/utils/xpack/xpack.go
agent/utils/xpack/xpack_xpack.go
core/xpack
core/router/entry_xpack.go
core/server/init_xpack.go
core/utils/xpack/xpack.go
core/utils/xpack/xpack_xpack.go
core/xpack-ee
core/router/entry_xpackee.go
core/server/init_xpackee.go
core/utils/xpack/xpack_xpackee.go

.history/
dist/
1pctl
1panel.service
install.sh
quick_start.sh
cmd/server/fileList.txt
.fileList.txt
1Panel.code-workspace

core/.golangci.yml
agent/.golangci.yml

.opencode
openspec
CLAUDE.md
AGENTS.md
opencode.json
superpowers
.worktrees/


================================================
FILE: .goreleaser.yaml
================================================
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=jcroql
version: 2

before:
  hooks:
    # - export NODE_OPTIONS="--max-old-space-size=8192"
    # - make build_web
    - chmod +x ./ci/script.sh
    - ./ci/script.sh
    - sed -i 's@ORIGINAL_VERSION=.*@ORIGINAL_VERSION=v{{ .Version }}@g' 1pctl
    
builds:
  - id: agent
    dir: agent
    main: cmd/server/main.go
    binary: 1panel-agent
    flags:
      - -tags=xpack
      - -trimpath
    ldflags:
      - -w -s
    env:
      - CGO_ENABLED=0
    goos:
      - linux
    goarm:
      - 7
    goarch:
      - amd64
      - arm64
      - arm
      - ppc64le
      - s390x
      - riscv64

  - id: core
    dir: core
    main: cmd/server/main.go
    binary: 1panel-core
    flags:
      - -tags=xpack
      - -trimpath
    ldflags:
      - -w -s
    env:
      - CGO_ENABLED=0
    goos:
      - linux
    goarm:
      - 7
    goarch:
      - amd64
      - arm64
      - arm
      - ppc64le
      - s390x
      - riscv64

archives:
  - formats: [ 'tar.gz' ]
    ids: [core, agent]
    name_template: "1panel-v{{ .Version }}-{{ .Os }}-{{ .Arch }}{{- if .Arm }}v{{ .Arm }}{{ end }}"
    wrap_in_directory: true
    files:
      - 1pctl
      - install.sh
      - 1panel-core.service
      - 1panel-agent.service
      - initscript/*
      - lang/*
      - GeoIP.mmdb

checksum:
  name_template: 'checksums.txt'

changelog:
  sort: asc
  filters:
    exclude:
      - "^docs:"
      - "^test:"


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within
the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

As a contributor, you should agree that:

- The producer can adjust the open-source agreement to be more strict or relaxed as deemed necessary.
- Your contributed code may be used for commercial purposes, including but not limited to its cloud business operations.

## Create pull request
PR are always welcome, even if they only contain small fixes like typos or a few lines of code. If there will be a significant effort, please document it as an issue and get a discussion going before starting to work on it.

Please submit a PR broken down into small changes bit by bit. A PR consisting of a lot of features and code changes may be hard to review. It is recommended to submit PRs in an incremental fashion.

This [development guideline](https://docs.1panel.pro/dev_manual/dev_manual/) contains information about repository structure, how to set up development environment, how to run it, and more.

Note: If you split your pull request to small changes, please make sure any of the changes goes to master will not break anything. Otherwise, it can not be merged until this feature complete.

## Report issues
It is a great way to contribute by reporting an issue. Well-written and complete bug reports are always welcome! Please open an issue and follow the template to fill in required information.

Before opening any issue, please look up the existing issues to avoid submitting a duplication.
If you find a match, you can "subscribe" to it to get notified on updates. If you have additional helpful information about the issue, please leave a comment.

When reporting issues, always include:

* Which version you are using.
* Steps to reproduce the issue.
* Snapshots or log files if needed

Because the issues are open to the public, when submitting files, be sure to remove any sensitive information, e.g. user name, password, IP address, and company name. You can
replace those parts with "REDACTED" or other strings like "****".


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: Makefile
================================================
GOCMD=go
GOBUILD=$(GOCMD) build
GOCLEAN=$(GOCMD) clean
GOARCH=$(shell go env GOARCH)
GOOS=$(shell go env GOOS )

BASE_PATH := $(shell pwd)
BUILD_PATH = $(BASE_PATH)/build
WEB_PATH=$(BASE_PATH)/frontend
ASSERT_PATH= $(BASE_PATH)/core/cmd/server/web/assets

CORE_PATH=$(BASE_PATH)/core
CORE_MAIN=$(CORE_PATH)/cmd/server/main.go
CORE_NAME=1panel-core

AGENT_PATH=$(BASE_PATH)/agent
AGENT_MAIN=$(AGENT_PATH)/cmd/server/main.go
AGENT_NAME=1panel-agent


clean_assets:
	rm -rf $(ASSERT_PATH)

upx_bin:
	upx $(BUILD_PATH)/$(CORE_NAME)
	upx $(BUILD_PATH)/$(AGENT_NAME)

build_frontend:
	cd $(WEB_PATH) && npm install && npm run build:pro

build_core_on_linux:
	cd $(CORE_PATH) \
	&& CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(CORE_NAME) $(CORE_MAIN)

build_agent_on_linux:
	cd $(AGENT_PATH) \
    && CGO_ENABLED=0 GOOS=$(GOOS) GOARCH=$(GOARCH) $(GOBUILD) -trimpath -ldflags '-s -w' -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN)

build_core_on_darwin:
	cd $(CORE_PATH) \
	&&  CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w'  -o $(BUILD_PATH)/$(CORE_NAME) $(CORE_MAIN)

build_agent_on_darwin:
	cd $(AGENT_PATH) \
    &&  CGO_ENABLED=0 GOOS=linux GOARCH=amd64 $(GOBUILD) -trimpath -ldflags '-s -w'  -o $(BUILD_PATH)/$(AGENT_NAME) $(AGENT_MAIN)

build_all: build_frontend build_core_on_linux build_agent_on_linux

build_on_local: clean_assets build_frontend build_core_on_darwin build_agent_on_darwin


================================================
FILE: OWNERS
================================================
reviewers:
- wanghe-fit2cloud
- zhengkunwang223
- ssongliu

approvers:
- wanghe-fit2cloud
- zhengkunwang223
- ssongliu


================================================
FILE: README.md
================================================
<p align="center"><a href="https://1panel.pro"><img src="https://resource.1panel.pro/img/1panel-logo.png" alt="1Panel" width="300" /></a></p>
<h3 align="center">Take control of your VPS with 1Panel</h3>
<p align="center">
  <a href="https://trendshift.io/repositories/2462" target="_blank"><img src="https://trendshift.io/api/badge/repositories/2462" alt="1Panel-dev%2F1Panel | Trendshift" style="width: 240px; height: auto;" /></a>
</p>
<p align="center">
  <a href="https://www.gnu.org/licenses/gpl-3.0.html"><img src="https://shields.io/github/license/1Panel-dev/1Panel?color=%231890FF" alt="License: GPL v3"></a>
  <a href="https://app.codacy.com/gh/1Panel-dev/1Panel?utm_source=github.com&utm_medium=referral&utm_content=1Panel-dev/1Panel&utm_campaign=Badge_Grade_Dashboard"><img src="https://app.codacy.com/project/badge/Grade/da67574fd82b473992781d1386b937ef" alt="Codacy"></a>
  <a href="https://discord.gg/bUpUqWqdRr" target="_blank">
        <img src="https://img.shields.io/discord/1318846410149335080?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
            alt="chat on Discord"></a>
  <a href="https://github.com/1Panel-dev/1Panel/releases"><img src="https://img.shields.io/github/v/release/1Panel-dev/1Panel" alt="GitHub release"></a>
  <a href="https://github.com/1Panel-dev/1Panel"><img src="https://img.shields.io/github/stars/1Panel-dev/1Panel?color=%231890FF&style=flat-square" alt="Stars"></a><br>
</p>
<p align="center">
  <a href="/README.md"><img alt="English" src="https://img.shields.io/badge/English-d9d9d9"></a>
  <a href="/docs/README.zh-Hans.md"><img alt="中文(简体)" src="https://img.shields.io/badge/中文(简体)-d9d9d9"></a>
  <a href="/docs/README.ja.md"><img alt="日本語" src="https://img.shields.io/badge/日本語-d9d9d9"></a>
  <a href="/docs/README.pt-br.md"><img alt="Português (Brasil)" src="https://img.shields.io/badge/Português (Brasil)-d9d9d9"></a>
  <a href="/docs/README.ar.md"><img alt="العربية" src="https://img.shields.io/badge/العربية-d9d9d9"></a>
  <a href="/docs/README.de.md"><img alt="Deutsch" src="https://img.shields.io/badge/Deutsch-d9d9d9"></a>
  <a href="/docs/README.es.md"><img alt="Español" src="https://img.shields.io/badge/Español-d9d9d9"></a><br>
  <a href="/docs/README.fr.md"><img alt="français" src="https://img.shields.io/badge/français-d9d9d9"></a>
  <a href="/docs/README.ko.md"><img alt="한국어" src="https://img.shields.io/badge/한국어-d9d9d9"></a>
  <a href="/docs/README.id.md"><img alt="Bahasa Indonesia" src="https://img.shields.io/badge/Bahasa Indonesia-d9d9d9"></a>
  <a href="/docs/README.zh-Hant.md"><img alt="中文(繁體)" src="https://img.shields.io/badge/中文(繁體)-d9d9d9"></a>
  <a href="/docs/README.tr.md"><img alt="Türkçe" src="https://img.shields.io/badge/Türkçe-d9d9d9"></a>
  <a href="/docs/README.ru.md"><img alt="Русский" src="https://img.shields.io/badge/%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9-d9d9d9"></a>
  <a href="/docs/README.ms.md"><img alt="Bahasa Melayu" src="https://img.shields.io/badge/Bahasa Melayu-d9d9d9"></a>
</p>

------------------------------
## What is 1Panel? 

1Panel is a modern, open-source VPS control panel that streamlines administration through an intuitive, clean web interface. 

## Key Features  

- **One-Click OpenClaw Deployment**: Seamlessly deploy OpenClaw agents, host local LLMs using Ollama, and monitor GPU utilization—all within a unified workspace.  
- **One-Click Website Deployment**: Launch production-ready websites instantly with automatic domain binding, SSL certificate provisioning, and configuration—zero manual setup required.  
- **Curated App Marketplace**: Discover, install, and update trusted open-source applications (Nextcloud, Bitwarden, Umami, and more) with a single click.  
- **Centralized Server Management**: Monitor system resources and manage files, databases, containers, and services effortlessly through a unified, intuitive dashboard.  
- **Enterprise-Grade Security**: Strengthen your defenses with container isolation, firewall controls, audit logging, and secure deployment practices—ensuring compliance and peace of mind.  
- **Intelligent Backup & Restore**: Schedule automated backups or perform instant restores to local storage or major cloud platforms (AWS S3, Cloudflare R2, and more), with flexible retention and destination options.  

## Quick Start

Execute the script below and follow the prompts to install 1Panel:

```bash
bash -c "$(curl -sSL https://resource.1panel.pro/v2/quick_start.sh)"
```

## Screenshot

![UI Display](https://resource.1panel.pro/img/overview_en_v2.png)

## Star History

[![Star History Chart](https://api.star-history.com/svg?repos=1Panel-dev/1Panel&type=Date)](https://star-history.com/#1Panel-dev/1Panel&Date)

## Pro Edition

Compared to the OSS Edition, 1Panel Pro Edition provides users with a wealth of enhanced features and technical support services. Enhanced features include WAF enhancement, website tamper protection, website monitoring, GPU monitoring, custom logo and theme color, etc. [Click to view the detailed introduction of the Pro Edition](https://1panel.pro/pricing).

## Security Information

If you discover any security issues, please refer to [SECURITY.md](/SECURITY.md).

## License

Licensed under The GNU General Public License version 3 (GPLv3)  (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

<https://www.gnu.org/licenses/gpl-3.0.html>

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


================================================
FILE: SECURITY.md
================================================
# Security policy

## Supported versions

| Version | Supported          |
| ------- | ------------------ |
| v1.x     | :white_check_mark: |

## Reporting a vulnerability

We first appreciate and are very thankful that you've found a vulnerability issue in 1Panel! By disclosing such issue to 1Panel development team you are helping 1Panel to become a much more safer project than before! ;)

To protect the existing users of 1Panel, we kindly ask you to not disclose the vulnerability to anyone except the 1Panel development team before a fix has been rolled out. Send an email to `wanghe@fit2cloud.com` instead.


================================================
FILE: agent/app/api/v2/agents.go
================================================
package v2

import (
	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
)

// @Tags AI
// @Summary Create Agent
// @Accept json
// @Param request body dto.AgentCreateReq true "request"
// @Success 200 {object} dto.AgentItem
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents [post]
func (b *BaseApi) CreateAgent(c *gin.Context) {
	var req dto.AgentCreateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	res, err := agentService.Create(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, res)
}

// @Tags AI
// @Summary Page Agents
// @Accept json
// @Param request body dto.SearchWithPage true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/search [post]
func (b *BaseApi) PageAgents(c *gin.Context) {
	var req dto.SearchWithPage
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	total, list, err := agentService.Page(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags AI
// @Summary Delete Agent
// @Accept json
// @Param request body dto.AgentDeleteReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/delete [post]
func (b *BaseApi) DeleteAgent(c *gin.Context) {
	var req dto.AgentDeleteReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.Delete(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Reset Agent token
// @Accept json
// @Param request body dto.AgentTokenResetReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/token/reset [post]
func (b *BaseApi) ResetAgentToken(c *gin.Context) {
	var req dto.AgentTokenResetReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.ResetToken(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Update Agent model config
// @Accept json
// @Param request body dto.AgentModelConfigUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/model/update [post]
func (b *BaseApi) UpdateAgentModelConfig(c *gin.Context) {
	var req dto.AgentModelConfigUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateModelConfig(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Get Providers
// @Success 200 {array} dto.ProviderInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/providers [get]
func (b *BaseApi) GetAgentProviders(c *gin.Context) {
	list, err := agentService.GetProviders()
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, list)
}

// @Tags AI
// @Summary Create Agent account
// @Accept json
// @Param request body dto.AgentAccountCreateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/accounts [post]
func (b *BaseApi) CreateAgentAccount(c *gin.Context) {
	var req dto.AgentAccountCreateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.CreateAccount(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Update Agent account
// @Accept json
// @Param request body dto.AgentAccountUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/accounts/update [post]
func (b *BaseApi) UpdateAgentAccount(c *gin.Context) {
	var req dto.AgentAccountUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateAccount(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Page Agent accounts
// @Accept json
// @Param request body dto.AgentAccountSearch true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/accounts/search [post]
func (b *BaseApi) PageAgentAccounts(c *gin.Context) {
	var req dto.AgentAccountSearch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	total, list, err := agentService.PageAccounts(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags AI
// @Summary List Agent account models
// @Accept json
// @Param request body dto.AgentAccountModelReq true "request"
// @Success 200 {array} dto.AgentAccountModel
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/accounts/models [post]
func (b *BaseApi) GetAgentAccountModels(c *gin.Context) {
	var req dto.AgentAccountModelReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	list, err := agentService.GetAccountModels(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, list)
}

// @Tags AI
// @Summary Create Agent account model
// @Accept json
// @Param request body dto.AgentAccountModelCreateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/accounts/models/create [post]
func (b *BaseApi) CreateAgentAccountModel(c *gin.Context) {
	var req dto.AgentAccountModelCreateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.CreateAccountModel(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Update Agent account model
// @Accept json
// @Param request body dto.AgentAccountModelUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/accounts/models/update [post]
func (b *BaseApi) UpdateAgentAccountModel(c *gin.Context) {
	var req dto.AgentAccountModelUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateAccountModel(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Delete Agent account model
// @Accept json
// @Param request body dto.AgentAccountModelDeleteReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/accounts/models/delete [post]
func (b *BaseApi) DeleteAgentAccountModel(c *gin.Context) {
	var req dto.AgentAccountModelDeleteReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.DeleteAccountModel(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Verify Agent account
// @Accept json
// @Param request body dto.AgentAccountVerifyReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/accounts/verify [post]
func (b *BaseApi) VerifyAgentAccount(c *gin.Context) {
	var req dto.AgentAccountVerifyReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.VerifyAccount(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Delete Agent account
// @Accept json
// @Param request body dto.AgentAccountDeleteReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/accounts/delete [post]
func (b *BaseApi) DeleteAgentAccount(c *gin.Context) {
	var req dto.AgentAccountDeleteReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.DeleteAccount(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Get Agent Feishu channel config
// @Accept json
// @Param request body dto.AgentFeishuConfigReq true "request"
// @Success 200 {object} dto.AgentFeishuConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/feishu/get [post]
func (b *BaseApi) GetAgentFeishuConfig(c *gin.Context) {
	var req dto.AgentFeishuConfigReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := agentService.GetFeishuConfig(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags AI
// @Summary Update Agent Feishu channel config
// @Accept json
// @Param request body dto.AgentFeishuConfigUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/feishu/update [post]
func (b *BaseApi) UpdateAgentFeishuConfig(c *gin.Context) {
	var req dto.AgentFeishuConfigUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateFeishuConfig(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Get Agent Telegram channel config
// @Accept json
// @Param request body dto.AgentTelegramConfigReq true "request"
// @Success 200 {object} dto.AgentTelegramConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/telegram/get [post]
func (b *BaseApi) GetAgentTelegramConfig(c *gin.Context) {
	var req dto.AgentTelegramConfigReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := agentService.GetTelegramConfig(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags AI
// @Summary Update Agent Telegram channel config
// @Accept json
// @Param request body dto.AgentTelegramConfigUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/telegram/update [post]
func (b *BaseApi) UpdateAgentTelegramConfig(c *gin.Context) {
	var req dto.AgentTelegramConfigUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateTelegramConfig(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Get Agent Discord channel config
// @Accept json
// @Param request body dto.AgentDiscordConfigReq true "request"
// @Success 200 {object} dto.AgentDiscordConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/discord/get [post]
func (b *BaseApi) GetAgentDiscordConfig(c *gin.Context) {
	var req dto.AgentDiscordConfigReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := agentService.GetDiscordConfig(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags AI
// @Summary Update Agent Discord channel config
// @Accept json
// @Param request body dto.AgentDiscordConfigUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/discord/update [post]
func (b *BaseApi) UpdateAgentDiscordConfig(c *gin.Context) {
	var req dto.AgentDiscordConfigUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateDiscordConfig(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Get Agent QQ Bot channel config
// @Accept json
// @Param request body dto.AgentWecomConfigReq true "request"
// @Success 200 {object} dto.AgentWecomConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/wecom/get [post]
func (b *BaseApi) GetAgentWecomConfig(c *gin.Context) {
	var req dto.AgentWecomConfigReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := agentService.GetWecomConfig(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags AI
// @Summary Update Agent WeCom channel config
// @Accept json
// @Param request body dto.AgentWecomConfigUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/wecom/update [post]
func (b *BaseApi) UpdateAgentWecomConfig(c *gin.Context) {
	var req dto.AgentWecomConfigUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateWecomConfig(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Get Agent DingTalk channel config
// @Accept json
// @Param request body dto.AgentDingTalkConfigReq true "request"
// @Success 200 {object} dto.AgentDingTalkConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/dingtalk/get [post]
func (b *BaseApi) GetAgentDingTalkConfig(c *gin.Context) {
	var req dto.AgentDingTalkConfigReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := agentService.GetDingTalkConfig(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags AI
// @Summary Update Agent DingTalk channel config
// @Accept json
// @Param request body dto.AgentDingTalkConfigUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/dingtalk/update [post]
func (b *BaseApi) UpdateAgentDingTalkConfig(c *gin.Context) {
	var req dto.AgentDingTalkConfigUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateDingTalkConfig(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Get Agent QQ Bot channel config
// @Accept json
// @Param request body dto.AgentQQBotConfigReq true "request"
// @Success 200 {object} dto.AgentQQBotConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/qqbot/get [post]
func (b *BaseApi) GetAgentQQBotConfig(c *gin.Context) {
	var req dto.AgentQQBotConfigReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := agentService.GetQQBotConfig(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags AI
// @Summary Update Agent QQ Bot channel config
// @Accept json
// @Param request body dto.AgentQQBotConfigUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/qqbot/update [post]
func (b *BaseApi) UpdateAgentQQBotConfig(c *gin.Context) {
	var req dto.AgentQQBotConfigUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateQQBotConfig(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Install Agent plugin
// @Accept json
// @Param request body dto.AgentPluginInstallReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/plugin/install [post]
func (b *BaseApi) InstallAgentPlugin(c *gin.Context) {
	var req dto.AgentPluginInstallReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.InstallPlugin(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Check Agent plugin installation status
// @Accept json
// @Param request body dto.AgentPluginCheckReq true "request"
// @Success 200 {object} dto.AgentPluginStatus
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/plugin/check [post]
func (b *BaseApi) CheckAgentPlugin(c *gin.Context) {
	var req dto.AgentPluginCheckReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := agentService.CheckPlugin(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags AI
// @Summary Get Agent Security config
// @Accept json
// @Param request body dto.AgentSecurityConfigReq true "request"
// @Success 200 {object} dto.AgentSecurityConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/security/get [post]
func (b *BaseApi) GetAgentSecurityConfig(c *gin.Context) {
	var req dto.AgentSecurityConfigReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := agentService.GetSecurityConfig(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags AI
// @Summary Update Agent Security config
// @Accept json
// @Param request body dto.AgentSecurityConfigUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/security/update [post]
func (b *BaseApi) UpdateAgentSecurityConfig(c *gin.Context) {
	var req dto.AgentSecurityConfigUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateSecurityConfig(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Get Agent Other config
// @Accept json
// @Param request body dto.AgentOtherConfigReq true "request"
// @Success 200 {object} dto.AgentOtherConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/other/get [post]
func (b *BaseApi) GetAgentOtherConfig(c *gin.Context) {
	var req dto.AgentOtherConfigReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := agentService.GetOtherConfig(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags AI
// @Summary Update Agent Other config
// @Accept json
// @Param request body dto.AgentOtherConfigUpdateReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/other/update [post]
func (b *BaseApi) UpdateAgentOtherConfig(c *gin.Context) {
	var req dto.AgentOtherConfigUpdateReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.UpdateOtherConfig(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Approve Agent channel pairing code
// @Accept json
// @Param request body dto.AgentChannelPairingApproveReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/agents/channel/pairing/approve [post]
func (b *BaseApi) ApproveAgentChannelPairing(c *gin.Context) {
	var req dto.AgentChannelPairingApproveReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := agentService.ApproveChannelPairing(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/ai.go
================================================
package v2

import (
	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu"
	"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/gpu/common"
	"github.com/1Panel-dev/1Panel/agent/utils/ai_tools/xpu"
	"github.com/gin-gonic/gin"
)

// @Tags AI
// @Summary Create Ollama model
// @Accept json
// @Param request body dto.OllamaModelName true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/ollama/model [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"添加 Ollama 模型 [name]","formatEN":"add Ollama model [name]"}
func (b *BaseApi) CreateOllamaModel(c *gin.Context) {
	var req dto.OllamaModelName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := aiToolService.Create(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, nil)
}

// @Tags AI
// @Summary Rereate Ollama model
// @Accept json
// @Param request body dto.OllamaModelName true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/ollama/model/recreate [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"添加 Ollama 模型重试 [name]","formatEN":"re-add Ollama model [name]"}
func (b *BaseApi) RecreateOllamaModel(c *gin.Context) {
	var req dto.OllamaModelName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := aiToolService.Recreate(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, nil)
}

// @Tags AI
// @Summary Close Ollama model conn
// @Accept json
// @Param request body dto.OllamaModelName true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/ollama/close [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"关闭 Ollama 模型连接 [name]","formatEN":"close conn for Ollama model [name]"}
func (b *BaseApi) CloseOllamaModel(c *gin.Context) {
	var req dto.OllamaModelName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := aiToolService.Close(req.Name); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, nil)
}

// @Tags AI
// @Summary Sync Ollama model list
// @Success 200 {array} dto.OllamaModelDropList
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/ollama/model/sync [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"同步 Ollama 模型列表","formatEN":"sync Ollama model list"}
func (b *BaseApi) SyncOllamaModel(c *gin.Context) {
	list, err := aiToolService.Sync()
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, list)
}

// @Tags AI
// @Summary Page Ollama models
// @Accept json
// @Param request body dto.SearchWithPage true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/ollama/model/search [post]
func (b *BaseApi) SearchOllamaModel(c *gin.Context) {
	var req dto.SearchWithPage
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := aiToolService.Search(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags AI
// @Summary Page Ollama models
// @Accept json
// @Param request body dto.OllamaModelName true "request"
// @Success 200 {string} details
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/ollama/model/load [post]
func (b *BaseApi) LoadOllamaModelDetail(c *gin.Context) {
	var req dto.OllamaModelName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	detail, err := aiToolService.LoadDetail(req.Name)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}

	helper.SuccessWithData(c, detail)
}

// @Tags AI
// @Summary Delete Ollama model
// @Accept json
// @Param request body dto.ForceDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/ollama/model/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"ollama_models","output_column":"name","output_value":"names"}],"formatZH":"删除 Ollama 模型 [names]","formatEN":"remove Ollama model [names]"}
func (b *BaseApi) DeleteOllamaModel(c *gin.Context) {
	var req dto.ForceDelete
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := aiToolService.Delete(req); err != nil {
		helper.BadRequest(c, err)
		return
	}

	helper.Success(c)
}

// @Tags AI
// @Summary Load gpu / xpu info
// @Accept json
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/gpu/load [get]
func (b *BaseApi) LoadGpuInfo(c *gin.Context) {
	ok, client := gpu.New()
	if ok {
		info, err := client.LoadGpuInfo()
		if err != nil {
			helper.BadRequest(c, err)
			return
		}
		helper.SuccessWithData(c, info)
		return
	}
	xpuOK, xpuClient := xpu.New()
	if xpuOK {
		info, err := xpuClient.LoadGpuInfo()
		if err != nil {
			helper.BadRequest(c, err)
			return
		}
		helper.SuccessWithData(c, info)
		return
	}
	helper.SuccessWithData(c, &common.GpuInfo{})
}

// @Tags AI
// @Summary Bind domain
// @Accept json
// @Param request body dto.OllamaBindDomain true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/domain/bind [post]
func (b *BaseApi) BindDomain(c *gin.Context) {
	var req dto.OllamaBindDomain
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := aiToolService.BindDomain(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}

// @Tags AI
// @Summary Get bind domain
// @Accept json
// @Param request body dto.OllamaBindDomainReq true "request"
// @Success 200 {object} dto.OllamaBindDomainRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /ai/domain/get [post]
func (b *BaseApi) GetBindDomain(c *gin.Context) {
	var req dto.OllamaBindDomainReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	res, err := aiToolService.GetBindDomain(req)
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.SuccessWithData(c, res)
}

// Tags AI
// Summary Update bind domain
// Accept json
// Param request body dto.OllamaBindDomain true "request"
// Success 200
// Security ApiKeyAuth
// Security Timestamp
// Router /ai/domain/update [post]
func (b *BaseApi) UpdateBindDomain(c *gin.Context) {
	var req dto.OllamaBindDomain
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := aiToolService.UpdateBindDomain(req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/alert.go
================================================
package v2

import (
	"errors"
	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
)

func (b *BaseApi) PageAlert(c *gin.Context) {
	var req dto.AlertSearch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	total, alerts, err := alertService.PageAlert(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, dto.PageResult{
		Total: total,
		Items: alerts,
	})
}

func (b *BaseApi) GetAlerts(c *gin.Context) {
	alerts, err := alertService.GetAlerts()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, alerts)
}

func (b *BaseApi) CreateAlert(c *gin.Context) {
	var req dto.AlertCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	err := alertService.CreateAlert(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

func (b *BaseApi) DeleteAlert(c *gin.Context) {
	var req dto.DeleteRequest
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	err := alertService.DeleteAlert(req.ID)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

func (b *BaseApi) UpdateAlert(c *gin.Context) {
	var req dto.AlertUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := alertService.UpdateAlert(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

func (b *BaseApi) GetAlert(c *gin.Context) {
	id, err := helper.GetParamID(c)
	if err != nil {
		helper.BadRequest(c, errors.New("no such id in request param"))
		return
	}
	alert, err := alertService.GetAlert(id)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, alert)
}

func (b *BaseApi) UpdateAlertStatus(c *gin.Context) {
	var req dto.AlertUpdateStatus
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := alertService.UpdateStatus(req.ID, req.Status); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

func (b *BaseApi) GetDisks(c *gin.Context) {
	alerts, err := alertService.GetDisks()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, alerts)
}

func (b *BaseApi) PageAlertLogs(c *gin.Context) {
	var req dto.AlertLogSearch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	total, alertLogs, err := alertService.PageAlertLogs(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, dto.PageResult{
		Total: total,
		Items: alertLogs,
	})
}

func (b *BaseApi) CleanAlertLogs(c *gin.Context) {
	if err := alertService.CleanAlertLogs(); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

func (b *BaseApi) GetClams(c *gin.Context) {
	clams, err := alertService.GetClams()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, clams)
}

func (b *BaseApi) GetCronJobs(c *gin.Context) {
	var req dto.CronJobReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	cronJobs, err := alertService.GetCronJobs(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, cronJobs)
}

func (b *BaseApi) GetAlertConfig(c *gin.Context) {
	config, err := alertService.GetAlertConfig()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, config)
}

func (b *BaseApi) UpdateAlertConfig(c *gin.Context) {
	var req dto.AlertConfigUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := alertService.UpdateAlertConfig(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

func (b *BaseApi) DeleteAlertConfig(c *gin.Context) {
	var req dto.DeleteRequest
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	err := alertService.DeleteAlertConfig(req.ID)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

func (b *BaseApi) TestAlertConfig(c *gin.Context) {
	var req dto.AlertConfigTest
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	flag, err := alertService.TestAlertConfig(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, flag)
}


================================================
FILE: agent/app/api/v2/app.go
================================================
package v2

import (
	"net/http"

	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/1Panel-dev/1Panel/agent/app/dto/request"
	"github.com/1Panel-dev/1Panel/agent/i18n"
	"github.com/1Panel-dev/1Panel/agent/utils/appicon"
	"github.com/gin-gonic/gin"
)

// @Tags App
// @Summary List apps
// @Accept json
// @Param request body request.AppSearch true "request"
// @Success 200 {object} response.AppRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/search [post]
func (b *BaseApi) SearchApp(c *gin.Context) {
	var req request.AppSearch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	list, err := appService.PageApp(c, req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithDataGzipped(c, list)
}

// @Tags App
// @Summary Sync remote app list
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/sync/remote [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"应用商店同步","formatEN":"App store synchronization"}
func (b *BaseApi) SyncApp(c *gin.Context) {
	var req dto.OperateWithTask
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	res, err := appService.GetAppUpdate()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	if !res.CanUpdate {
		if res.IsSyncing {
			helper.SuccessWithMsg(c, i18n.GetMsgByKey("AppStoreIsSyncing"))
		} else {
			helper.SuccessWithMsg(c, i18n.GetMsgByKey("AppStoreIsUpToDate"))
		}
		return
	}
	if err = appService.SyncAppListFromRemote(req.TaskID); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags App
// @Summary Sync local  app list
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/sync/local [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"应用商店同步","formatEN":"App store synchronization"}
func (b *BaseApi) SyncLocalApp(c *gin.Context) {
	var req dto.OperateWithTask
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	go appService.SyncAppListFromLocal(req.TaskID)
	helper.Success(c)
}

// @Tags App
// @Summary Search app by key
// @Accept json
// @Param key path string true "app key"
// @Success 200 {object} response.AppDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/:key [get]
func (b *BaseApi) GetApp(c *gin.Context) {
	appKey, err := helper.GetStrParamByKey(c, "key")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	appDTO, err := appService.GetApp(c, appKey)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, appDTO)
}

// @Tags App
// @Summary Search app detail by appid
// @Accept json
// @Param appId path integer true "app id"
// @Param version path string true "app 版本"
// @Param version path string true "app 类型"
// @Success 200 {object} response.AppDetailDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/detail/:appId/:version/:type [get]
func (b *BaseApi) GetAppDetail(c *gin.Context) {
	appID, err := helper.GetIntParamByKey(c, "appId")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	version := c.Param("version")
	appType := c.Param("type")
	appDetailDTO, err := appService.GetAppDetail(appID, version, appType)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, appDetailDTO)
}

// @Tags App
// @Summary Get app detail by id
// @Accept json
// @Param appId path integer true "id"
// @Success 200 {object} response.AppDetailDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/details/:id [get]
func (b *BaseApi) GetAppDetailByID(c *gin.Context) {
	appDetailID, err := helper.GetIntParamByKey(c, "id")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	appDetailDTO, err := appService.GetAppDetailByID(appDetailID)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, appDetailDTO)
}

// @Tags App
// @Summary Install app
// @Accept json
// @Param request body request.AppInstallCreate true "request"
// @Success 200 {object} model.AppInstall
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/install [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"安装应用 [name]","formatEN":"Install app [name]"}
func (b *BaseApi) InstallApp(c *gin.Context) {
	var req request.AppInstallCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	install, err := appService.Install(req, true)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, install)
}

func (b *BaseApi) GetAppTags(c *gin.Context) {
	tags, err := appService.GetAppTags(c)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, tags)
}

// @Tags App
// @Summary Get app list update
// @Success 200 {object} response.AppUpdateRes
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/checkupdate [get]
func (b *BaseApi) GetAppListUpdate(c *gin.Context) {
	res, err := appService.GetAppUpdate()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, res)
}

// @Tags App
// @Summary Get app icon by app_id
// @Accept json
// @Param appId path integer true "app id"
// @Success 200 {file} file "app icon"
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/icon/:key [get]
func (b *BaseApi) GetAppIcon(c *gin.Context) {
	appKey, err := helper.GetStrParamByKey(c, "key")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	iconBytes, filename, etag, err := appService.GetAppIcon(appKey)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	if len(iconBytes) == 0 {
		c.Status(http.StatusNoContent)
		return
	}

	c.Header("Cache-Control", "public, max-age=2592000")

	if etag != "" && filename != "" {
		c.Header("ETag", etag)
		if c.GetHeader("If-None-Match") == etag {
			c.Status(http.StatusNotModified)
			return
		}
	}

	c.Data(http.StatusOK, appicon.ContentTypePNG, iconBytes)
}

// @Tags App
// @Summary Search app detail by appkey and version
// @Accept json
// @Param appId path integer true "app key"
// @Param version path string true "app version"
// @Success 200 {object} response.AppDetailSimpleDTO
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/detail/node/:appKey/:version [get]
func (b *BaseApi) GetAppDetailForNode(c *gin.Context) {
	appKey := c.Param("appKey")
	version := c.Param("version")
	appDetailDTO, err := appService.GetAppDetailByKey(appKey, version)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, appDetailDTO)
}


================================================
FILE: agent/app/api/v2/app_ignore_upgrade.go
================================================
package v2

import (
	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto/request"
	"github.com/gin-gonic/gin"
)

// @Tags App
// @Summary List Upgrade Ignored App
// @Accept json
// @Success 200 {array} model.AppIgnoreUpgrade
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/ignored/detail [get]
func (b *BaseApi) ListAppIgnored(c *gin.Context) {
	res, err := appIgnoreUpgradeService.List()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, res)
}

// @Tags App
// @Summary Ignore Upgrade App
// @Accept json
// @Param request body request.AppIgnoreUpgradeReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/ignore [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"忽略应用升级","formatEN":"Ignore application upgrade"}
func (b *BaseApi) IgnoreAppUpgrade(c *gin.Context) {
	var req request.AppIgnoreUpgradeReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := appIgnoreUpgradeService.CreateAppIgnore(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// 写一个去掉忽略的接口
// @Tags App
// @Summary Cancel Ignore Upgrade App
// @Accept json
// @Param request body request.ReqWithID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/ignored/cancel [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"取消忽略应用升级","formatEN":"Cancel ignore application upgrade"}
func (b *BaseApi) CancelIgnoreAppUpgrade(c *gin.Context) {
	var req request.ReqWithID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := appIgnoreUpgradeService.Delete(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/app_install.go
================================================
package v2

import (
	"github.com/1Panel-dev/1Panel/agent/app/dto/request"

	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
)

// @Tags App
// @Summary Page app installed
// @Accept json
// @Param request body request.AppInstalledSearch true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/search [post]
func (b *BaseApi) SearchAppInstalled(c *gin.Context) {
	var req request.AppInstalledSearch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if req.All {
		list, err := appInstallService.SearchForWebsite(req)
		if err != nil {
			helper.InternalServer(c, err)
			return
		}
		helper.SuccessWithData(c, dto.PageResult{
			Items: list,
			Total: int64(len(list)),
		})
	} else {
		total, list, err := appInstallService.Page(req)
		if err != nil {
			helper.InternalServer(c, err)
			return
		}
		helper.SuccessWithData(c, dto.PageResult{
			Items: list,
			Total: total,
		})
	}
}

// @Tags App
// @Summary List app installed
// @Accept json
// @Success 200 {array} dto.AppInstallInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/list [get]
func (b *BaseApi) ListAppInstalled(c *gin.Context) {
	list, err := appInstallService.GetInstallList()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, list)
}

// @Tags App
// @Summary Check app installed
// @Accept json
// @Param request body request.AppInstalledInfo true "request"
// @Success 200 {object} response.AppInstalledCheck
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/check [post]
func (b *BaseApi) CheckAppInstalled(c *gin.Context) {
	var req request.AppInstalledInfo
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	checkData, err := appInstallService.CheckExist(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, checkData)
}

// @Tags App
// @Summary Search app port by key
// @Accept json
// @Param request body dto.OperationWithNameAndType true "request"
// @Success 200 {integer} port
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/loadport [post]
func (b *BaseApi) LoadPort(c *gin.Context) {
	var req dto.OperationWithNameAndType
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	port, err := appInstallService.LoadPort(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, port)
}

// @Tags App
// @Summary Search app password by key
// @Accept json
// @Param request body dto.OperationWithNameAndType true "request"
// @Success 200 {object} response.DatabaseConn
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/conninfo [post]
func (b *BaseApi) LoadConnInfo(c *gin.Context) {
	var req dto.OperationWithNameAndType
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	conn, err := appInstallService.LoadConnInfo(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, conn)
}

// @Tags App
// @Summary Check before delete
// @Accept json
// @Param appInstallId path integer true "App install id"
// @Success 200 {array} dto.AppResource
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/delete/check/:appInstallId [get]
func (b *BaseApi) DeleteCheck(c *gin.Context) {
	appInstallId, err := helper.GetIntParamByKey(c, "appInstallId")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	checkData, err := appInstallService.DeleteCheck(appInstallId)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, checkData)
}

// Sync app installed
// @Tags App
// @Summary Sync app installed
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/sync [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"同步已安装应用列表","formatEN":"Sync the list of installed apps"}
func (b *BaseApi) SyncInstalled(c *gin.Context) {
	if err := appInstallService.SyncAll(false); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags App
// @Summary Operate installed app
// @Accept json
// @Param request body request.AppInstalledOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/op [post]
// @x-panel-log {"bodyKeys":["installId","operate"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"installId","isList":false,"db":"app_installs","output_column":"app_id","output_value":"appId"},{"input_column":"id","input_value":"installId","isList":false,"db":"app_installs","output_column":"name","output_value":"appName"},{"input_column":"id","input_value":"appId","isList":false,"db":"apps","output_column":"key","output_value":"appKey"}],"formatZH":"[operate] 应用 [appKey][appName]","formatEN":"[operate] App [appKey][appName]"}
func (b *BaseApi) OperateInstalled(c *gin.Context) {
	var req request.AppInstalledOperate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := appInstallService.Operate(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags App
// @Summary Search app service by key
// @Accept json
// @Param key path string true "request"
// @Success 200 {array} response.AppService
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/services/:key [get]
func (b *BaseApi) GetServices(c *gin.Context) {
	key := c.Param("key")
	services, err := appInstallService.GetServices(key)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, services)
}

// @Tags App
// @Summary Search app update version by install id
// @Accept json
// @Param appInstallId path integer true "request"
// @Success 200 {array} dto.AppVersion
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/update/versions [post]
func (b *BaseApi) GetUpdateVersions(c *gin.Context) {
	var req request.AppUpdateVersion
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	versions, err := appInstallService.GetUpdateVersions(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, versions)
}

// @Tags App
// @Summary Change app port
// @Accept json
// @Param request body request.PortUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/port/change [post]
// @x-panel-log {"bodyKeys":["key","name","port"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"应用端口修改 [key]-[name] => [port]","formatEN":"Application port update [key]-[name] => [port]"}
func (b *BaseApi) ChangeAppPort(c *gin.Context) {
	var req request.PortUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := appInstallService.ChangeAppPort(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags App
// @Summary Search default config by key
// @Accept json
// @Param request body dto.OperationWithNameAndType true "request"
// @Success 200 {string} content
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/conf [post]
func (b *BaseApi) GetDefaultConfig(c *gin.Context) {
	var req dto.OperationWithNameAndType
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	content, err := appInstallService.GetDefaultConfigByKey(req.Type, req.Name)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, content)
}

// @Tags App
// @Summary Search params by appInstallId
// @Accept json
// @Param appInstallId path string true "request"
// @Success 200 {object} response.AppConfig
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/params/:appInstallId [get]
func (b *BaseApi) GetParams(c *gin.Context) {
	appInstallId, err := helper.GetIntParamByKey(c, "appInstallId")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	content, err := appInstallService.GetParams(appInstallId)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, content)
}

// @Tags App
// @Summary Change app params
// @Accept json
// @Param request body request.AppInstalledUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/params/update [post]
// @x-panel-log {"bodyKeys":["installId"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"installId","isList":false,"db":"app_installs","output_column":"name","output_value":"name"}],"formatZH":"应用参数修改 [name]","formatEN":"Application param update [name]"}
func (b *BaseApi) UpdateInstalled(c *gin.Context) {
	var req request.AppInstalledUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := appInstallService.Update(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags App
// @Summary Update app config
// @Accept json
// @Param request body request.AppConfigUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/config/update [post]
// @x-panel-log {"bodyKeys":["installID","webUI"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"应用配置更新 [installID]","formatEN":"Application config update [installID]"}
func (b *BaseApi) UpdateAppConfig(c *gin.Context) {
	var req request.AppConfigUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := appInstallService.UpdateAppConfig(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags App
// @Summary Get app install info
// @Accept json
// @Param appInstallId path integer true "App install id"
// @Success 200 {object} dto.AppInstallInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /apps/installed/info/:appInstallId [get]
func (b *BaseApi) GetAppInstallInfo(c *gin.Context) {
	appInstallId, err := helper.GetIntParamByKey(c, "appInstallId")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	info, err := appInstallService.GetAppInstallInfo(appInstallId)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, info)
}

func (b *BaseApi) UpdateAppInstallSort(c *gin.Context) {
	var req request.AppInstallSort
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := appInstallService.UpdateSort(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/backup.go
================================================
package v2

import (
	"fmt"
	"path"

	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/1Panel-dev/1Panel/agent/constant"
	"github.com/gin-gonic/gin"
)

func (b *BaseApi) CheckBackupUsed(c *gin.Context) {
	name, err := helper.GetStrParamByKey(c, "name")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}

	if err := backupService.CheckUsed(name, true); err != nil {
		helper.BadRequest(c, err)
		return
	}

	helper.Success(c)
}

// @Tags Backup Account
// @Summary Check backup account
// @Accept json
// @Param request body dto.BackupOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/check [post]
func (b *BaseApi) CheckBackup(c *gin.Context) {
	var req dto.BackupOperate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	helper.SuccessWithData(c, backupService.CheckConn(req))
}

// @Tags Backup Account
// @Summary Create backup account
// @Accept json
// @Param request body dto.BackupOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups [post]
// @x-panel-log {"bodyKeys":["type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建备份账号 [type]","formatEN":"create backup account [type]"}
func (b *BaseApi) CreateBackup(c *gin.Context) {
	var req dto.BackupOperate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := backupService.Create(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Backup Account
// @Summary Refresh token
// @Accept json
// @Param request body dto.BackupOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/refresh/token [post]
func (b *BaseApi) RefreshToken(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := backupService.RefreshToken(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Backup Account
// @Summary List buckets
// @Accept json
// @Param request body dto.ForBuckets true "request"
// @Success 200 {array} object
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/buckets [post]
func (b *BaseApi) ListBuckets(c *gin.Context) {
	var req dto.ForBuckets
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	buckets, err := backupService.GetBuckets(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, buckets)
}

// @Tags Backup Account
// @Summary Delete backup account
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/del [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"backup_accounts","output_column":"type","output_value":"types"}],"formatZH":"删除备份账号 [types]","formatEN":"delete backup account [types]"}
func (b *BaseApi) DeleteBackup(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := backupService.Delete(req.ID); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Backup Account
// @Summary Update backup account
// @Accept json
// @Param request body dto.BackupOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/update [post]
// @x-panel-log {"bodyKeys":["type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新备份账号 [types]","formatEN":"update backup account [types]"}
func (b *BaseApi) UpdateBackup(c *gin.Context) {
	var req dto.BackupOperate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := backupService.Update(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Backup Account
// @Summary Upload file for recover
// @Accept json
// @Param request body dto.UploadForRecover true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/upload [post]
// @x-panel-log {"bodyKeys":["filePath"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"上传备份文件 [filePath]","formatEN":"upload backup file [filePath]"}
func (b *BaseApi) UploadForRecover(c *gin.Context) {
	var req dto.UploadForRecover
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := backupService.UploadForRecover(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Backup Account
// @Summary Load backup account options
// @Accept json
// @Success 200 {array} dto.BackupOption
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/options [get]
func (b *BaseApi) LoadBackupOptions(c *gin.Context) {
	list, err := backupService.LoadBackupOptions()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, list)
}

// @Tags Backup Account
// @Summary Search backup accounts with page
// @Accept json
// @Param request body dto.SearchPageWithType true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/search [post]
func (b *BaseApi) SearchBackup(c *gin.Context) {
	var req dto.SearchPageWithType
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := backupService.SearchWithPage(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Backup Account
// @Summary get local backup dir
// @Success 200 {string} dir
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/local [get]
func (b *BaseApi) GetLocalDir(c *gin.Context) {
	dir, err := backupService.GetLocalDir()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dir)
}

// @Tags Backup Account
// @Summary Load backup record size
// @Accept json
// @Param request body dto.SearchForSize true "request"
// @Success 200 {array} dto.RecordFileSize
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/record/size [post]
func (b *BaseApi) LoadBackupRecordSize(c *gin.Context) {
	var req dto.SearchForSize
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	list, err := backupRecordService.LoadRecordSize(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, list)
}

// @Tags Backup Account
// @Summary Page backup records
// @Accept json
// @Param request body dto.RecordSearch true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/record/search [post]
func (b *BaseApi) SearchBackupRecords(c *gin.Context) {
	var req dto.RecordSearch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := backupRecordService.SearchRecordsWithPage(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Backup Account
// @Summary Page backup records by cronjob
// @Accept json
// @Param request body dto.RecordSearchByCronjob true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/record/search/bycronjob [post]
func (b *BaseApi) SearchBackupRecordsByCronjob(c *gin.Context) {
	var req dto.RecordSearchByCronjob
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := backupRecordService.SearchRecordsByCronjobWithPage(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Backup Account
// @Summary Download backup record
// @Accept json
// @Param request body dto.DownloadRecord true "request"
// @Success 200 {string} filePath
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/record/download [post]
// @x-panel-log {"bodyKeys":["source","fileName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"下载备份记录 [source][fileName]","formatEN":"download backup records [source][fileName]"}
func (b *BaseApi) DownloadRecord(c *gin.Context) {
	var req dto.DownloadRecord
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	filePath, err := backupRecordService.DownloadRecord(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, filePath)
}

// @Tags Backup Account
// @Summary Update backup record description
// @Accept json
// @Param request body dto.UpdateDescription true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/record/description/update [post]
func (b *BaseApi) UpdateRecordDescription(c *gin.Context) {
	var req dto.UpdateDescription
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := backupRecordService.UpdateDescription(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Backup Account
// @Summary Delete backup record
// @Accept json
// @Param request body dto.BatchDeleteReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/record/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"backup_records","output_column":"file_name","output_value":"files"}],"formatZH":"删除备份记录 [files]","formatEN":"delete backup records [files]"}
func (b *BaseApi) DeleteBackupRecord(c *gin.Context) {
	var req dto.BatchDeleteReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := backupRecordService.BatchDeleteRecord(req.Ids); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Backup Account
// @Summary List files from backup accounts
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200 {array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/search/files [post]
func (b *BaseApi) LoadFilesFromBackup(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	data := backupRecordService.ListFiles(req)
	helper.SuccessWithData(c, data)
}

// @Tags Backup Account
// @Summary Backup system data
// @Accept json
// @Param request body dto.CommonBackup true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/backup [post]
// @x-panel-log {"bodyKeys":["type","name","detailName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"备份 [type] 数据 [name][detailName]","formatEN":"backup [type] data [name][detailName]"}
func (b *BaseApi) Backup(c *gin.Context) {
	var req dto.CommonBackup
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	switch req.Type {
	case "app":
		if _, err := backupService.AppBackup(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "mysql", "mariadb", constant.AppMysqlCluster:
		if err := backupService.MysqlBackup(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case constant.AppPostgresql, constant.AppPostgresqlCluster:
		if err := backupService.PostgresqlBackup(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "website":
		if err := backupService.WebsiteBackup(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "redis", constant.AppRedisCluster:
		if err := backupService.RedisBackup(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "container":
		if err := backupService.ContainerBackup(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "compose":
		if err := backupService.ComposeBackup(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	}
	helper.Success(c)
}

// @Tags Backup Account
// @Summary Recover system data
// @Accept json
// @Param request body dto.CommonRecover true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/recover [post]
// @x-panel-log {"bodyKeys":["type","name","detailName","file"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"从 [file] 恢复 [type] 数据 [name][detailName]","formatEN":"recover [type] data [name][detailName] from [file]"}
func (b *BaseApi) Recover(c *gin.Context) {
	var req dto.CommonRecover
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	downloadPath, err := backupRecordService.DownloadRecord(dto.DownloadRecord{
		DownloadAccountID: req.DownloadAccountID,
		FileDir:           path.Dir(req.File),
		FileName:          path.Base(req.File),
	})
	if err != nil {
		helper.BadRequest(c, fmt.Errorf("download file failed, err: %v", err))
		return
	}
	req.File = downloadPath
	switch req.Type {
	case "mysql", "mariadb", constant.AppMysqlCluster:
		if err := backupService.MysqlRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case constant.AppPostgresql, constant.AppPostgresqlCluster:
		if err := backupService.PostgresqlRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "website":
		if err := backupService.WebsiteRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "redis", constant.AppRedisCluster:
		if err := backupService.RedisRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "app":
		if err := backupService.AppRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "container":
		if err := backupService.ContainerRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "compose":
		if err := backupService.ComposeRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	}
	helper.Success(c)
}

// @Tags Backup Account
// @Summary Recover system data by upload
// @Accept json
// @Param request body dto.CommonRecover true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /backups/recover/byupload [post]
// @x-panel-log {"bodyKeys":["type","name","detailName","file"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"从 [file] 恢复 [type] 数据 [name][detailName]","formatEN":"recover [type] data [name][detailName] from [file]"}
func (b *BaseApi) RecoverByUpload(c *gin.Context) {
	var req dto.CommonRecover
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	switch req.Type {
	case "mysql", "mariadb", constant.AppMysqlCluster:
		if err := backupService.MysqlRecoverByUpload(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case constant.AppPostgresql, constant.AppPostgresqlCluster:
		if err := backupService.PostgresqlRecoverByUpload(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "app":
		if err := backupService.AppRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "website":
		if err := backupService.WebsiteRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "container":
		if err := backupService.ContainerRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	case "compose":
		if err := backupService.ComposeRecover(req); err != nil {
			helper.InternalServer(c, err)
			return
		}
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/clam.go
================================================
package v2

import (
	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
)

// @Tags Clam
// @Summary Create clam
// @Accept json
// @Param request body dto.ClamCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam [post]
// @x-panel-log {"bodyKeys":["name","path"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建扫描规则 [name][path]","formatEN":"create clam [name][path]"}
func (b *BaseApi) CreateClam(c *gin.Context) {
	var req dto.ClamCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := clamService.Create(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Clam
// @Summary Update clam
// @Accept json
// @Param request body dto.ClamUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/update [post]
// @x-panel-log {"bodyKeys":["name","path"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改扫描规则 [name][path]","formatEN":"update clam [name][path]"}
func (b *BaseApi) UpdateClam(c *gin.Context) {
	var req dto.ClamUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := clamService.Update(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Clam
// @Summary Update clam status
// @Accept json
// @Param request body dto.ClamUpdateStatus true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/status/update [post]
// @x-panel-log {"bodyKeys":["id","status"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"clams","output_column":"name","output_value":"name"}],"formatZH":"修改扫描规则 [name] 状态为 [status]","formatEN":"change the status of clam [name] to [status]."}
func (b *BaseApi) UpdateClamStatus(c *gin.Context) {
	var req dto.ClamUpdateStatus
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := clamService.UpdateStatus(req.ID, req.Status); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Clam
// @Summary Page clam
// @Accept json
// @Param request body dto.SearchClamWithPage true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/search [post]
func (b *BaseApi) SearchClam(c *gin.Context) {
	var req dto.SearchClamWithPage
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := clamService.SearchWithPage(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Clam
// @Summary Load clam base info
// @Accept json
// @Success 200 {object} dto.ClamBaseInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/base [post]
func (b *BaseApi) LoadClamBaseInfo(c *gin.Context) {
	info, err := clamService.LoadBaseInfo()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, info)
}

// @Tags Clam
// @Summary Operate Clam
// @Accept json
// @Success 200
// @Param request body dto.Operate true "request"
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/operate [post]
// @x-panel-log {"bodyKeys":["operation"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"[operation] Clam","formatEN":"[operation] FTP"}
func (b *BaseApi) OperateClam(c *gin.Context) {
	var req dto.Operate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := clamService.Operate(req.Operation); err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.Success(c)
}

// @Tags Clam
// @Summary Clean clam record
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/record/clean [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":true,"db":"clams","output_column":"name","output_value":"name"}],"formatZH":"清空扫描报告 [name]","formatEN":"clean clam record [name]"}
func (b *BaseApi) CleanClamRecord(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := clamService.CleanRecord(req.ID); err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.Success(c)
}

// @Tags Clam
// @Summary Page clam record
// @Accept json
// @Param request body dto.ClamLogSearch true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/record/search [post]
func (b *BaseApi) SearchClamRecord(c *gin.Context) {
	var req dto.ClamLogSearch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := clamService.SearchRecords(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Clam
// @Summary Load clam file
// @Accept json
// @Param request body dto.ClamFileReq true "request"
// @Success 200 {string} content
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/file/search [post]
func (b *BaseApi) SearchClamFile(c *gin.Context) {
	var req dto.ClamFileReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	content, err := clamService.LoadFile(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, content)
}

// @Tags Clam
// @Summary Update clam file
// @Accept json
// @Param request body dto.UpdateByNameAndFile true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/file/update [post]
func (b *BaseApi) UpdateFile(c *gin.Context) {
	var req dto.UpdateByNameAndFile
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := clamService.UpdateFile(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Clam
// @Summary Delete clam
// @Accept json
// @Param request body dto.ClamDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"clams","output_column":"name","output_value":"names"}],"formatZH":"删除扫描规则 [names]","formatEN":"delete clam [names]"}
func (b *BaseApi) DeleteClam(c *gin.Context) {
	var req dto.ClamDelete
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := clamService.Delete(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Clam
// @Summary Handle clam scan
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /toolbox/clam/handle [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":true,"db":"clams","output_column":"name","output_value":"name"}],"formatZH":"执行病毒扫描 [name]","formatEN":"handle clam scan [name]"}
func (b *BaseApi) HandleClamScan(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := clamService.HandleOnce(req.ID); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/compose_template.go
================================================
package v2

import (
	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
)

// @Tags Container Compose-template
// @Summary Create compose template
// @Accept json
// @Param request body dto.ComposeTemplateCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/template [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建 compose 模版 [name]","formatEN":"create compose template [name]"}
func (b *BaseApi) CreateComposeTemplate(c *gin.Context) {
	var req dto.ComposeTemplateCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := composeTemplateService.Create(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container Compose-template
// @Summary Bacth compose template
// @Accept json
// @Param request body dto.ComposeTemplateBatch true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/template/batch [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"批量导入编排模版","formatEN":"batch import compose templates"}
func (b *BaseApi) BatchComposeTemplate(c *gin.Context) {
	var req dto.ComposeTemplateBatch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := composeTemplateService.Batch(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container Compose-template
// @Summary Page compose templates
// @Accept json
// @Param request body dto.SearchWithPage true "request"
// @Produce json
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/template/search [post]
func (b *BaseApi) SearchComposeTemplate(c *gin.Context) {
	var req dto.SearchWithPage
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := composeTemplateService.SearchWithPage(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Container Compose-template
// @Summary List compose templates
// @Produce json
// @Success 200 {array} dto.ComposeTemplateInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/template [get]
func (b *BaseApi) ListComposeTemplate(c *gin.Context) {
	list, err := composeTemplateService.List()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, list)
}

// @Tags Container Compose-template
// @Summary Delete compose template
// @Accept json
// @Param request body dto.BatchDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/template/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"compose_templates","output_column":"name","output_value":"names"}],"formatZH":"删除 compose 模版 [names]","formatEN":"delete compose template [names]"}
func (b *BaseApi) DeleteComposeTemplate(c *gin.Context) {
	var req dto.BatchDeleteReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := composeTemplateService.Delete(req.Ids); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container Compose-template
// @Summary Update compose template
// @Accept json
// @Param request body dto.ComposeTemplateUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/template/update [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"compose_templates","output_column":"name","output_value":"name"}],"formatZH":"更新 compose 模版 [name]","formatEN":"update compose template information [name]"}
func (b *BaseApi) UpdateComposeTemplate(c *gin.Context) {
	var req dto.ComposeTemplateUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	upMap := make(map[string]interface{})
	upMap["content"] = req.Content
	upMap["description"] = req.Description
	if err := composeTemplateService.Update(req.ID, upMap); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/container.go
================================================
package v2

import (
	"net/http"
	"net/url"
	"path"
	"strconv"

	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
	"github.com/pkg/errors"
)

// @Tags Container
// @Summary Page containers
// @Accept json
// @Param request body dto.PageContainer true "request"
// @Produce json
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/search [post]
func (b *BaseApi) SearchContainer(c *gin.Context) {
	var req dto.PageContainer
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := containerService.Page(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Container
// @Summary Load container users
// @Accept json
// @Param request body dto.OperationWithName true "request"
// @Produce json
// @Success 200 {array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/users [post]
func (b *BaseApi) LoadContainerUsers(c *gin.Context) {
	var req dto.OperationWithName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	helper.SuccessWithData(c, containerService.LoadUsers(req))
}

// @Tags Container
// @Summary List container files
// @Accept json
// @Param request body dto.ContainerFileReq true "request"
// @Success 200 {array} dto.ContainerFileInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/files/search [post]
func (b *BaseApi) ListContainerFiles(c *gin.Context) {
	var req dto.ContainerFileReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	files, err := containerService.ListContainerFiles(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, files)
}

// @Tags Container
// @Summary Upload container file
// @Accept multipart/form-data
// @Param containerID formData string true "containerID"
// @Param path formData string true "path"
// @Param file formData file true "file"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/files/upload [post]
// @x-panel-log {"bodyKeys":["containerID","path"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"容器 [containerID] 上传文件到 [path]","formatEN":"Upload file to [path] in container [containerID]"}
func (b *BaseApi) UploadContainerFile(c *gin.Context) {
	form, err := c.MultipartForm()
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	containerIDs := form.Value["containerID"]
	paths := form.Value["path"]
	uploadFiles := form.File["file"]
	if len(containerIDs) == 0 || len(paths) == 0 || len(uploadFiles) == 0 {
		helper.BadRequest(c, errors.New("invalid container file upload params"))
		return
	}
	req := dto.ContainerFileReq{
		ContainerID: containerIDs[0],
		Path:        paths[0],
	}
	for _, uploadFile := range uploadFiles {
		file, err := uploadFile.Open()
		if err != nil {
			helper.InternalServer(c, err)
			return
		}
		err = containerService.UploadContainerFile(req, path.Base(uploadFile.Filename), uploadFile.Size, file)
		_ = file.Close()
		if err != nil {
			helper.InternalServer(c, err)
			return
		}
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Get container file content
// @Accept json
// @Param request body dto.ContainerFileReq true "request"
// @Success 200 {object} dto.ContainerFileContent
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/files/content [post]
func (b *BaseApi) GetContainerFileContent(c *gin.Context) {
	var req dto.ContainerFileReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	content, err := containerService.GetContainerFileContent(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, content)
}

// @Tags Container
// @Summary Get container file size
// @Accept json
// @Param request body dto.ContainerFileReq true "request"
// @Success 200 {int} size
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/files/size [post]
func (b *BaseApi) GetContainerFileSize(c *gin.Context) {
	var req dto.ContainerFileReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	size, err := containerService.GetContainerFileSize(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, size)
}

// @Tags Container
// @Summary Delete container file
// @Accept json
// @Param request body dto.ContainerFileBatchDeleteReq true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/files/del [post]
// @x-panel-log {"bodyKeys":["containerID","paths"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"删除容器 [containerID] 文件 [paths]","formatEN":"Delete files [paths] in container [containerID]"}
func (b *BaseApi) DeleteContainerFile(c *gin.Context) {
	var req dto.ContainerFileBatchDeleteReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if err := containerService.DeleteContainerFile(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Download container file
// @Accept json
// @Param request body dto.ContainerFileReq true "request"
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/files/download [post]
// @x-panel-log {"bodyKeys":["containerID","path"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"下载容器 [containerID] 文件 [path]","formatEN":"Download file [path] from container [containerID]"}
func (b *BaseApi) DownloadContainerFile(c *gin.Context) {
	var req dto.ContainerFileReq
	if err := c.ShouldBindJSON(&req); err != nil {
		helper.BadRequest(c, err)
		return
	}
	if req.ContainerID == "" || req.Path == "" {
		helper.BadRequest(c, errors.New("invalid container file download params"))
		return
	}
	reader, fileName, contentType, err := containerService.DownloadContainerFile(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	defer reader.Close()
	c.Header("Content-Disposition", "attachment; filename*=utf-8''"+url.PathEscape(fileName))
	c.DataFromReader(http.StatusOK, -1, contentType, reader, nil)
}

// @Tags Container
// @Summary List containers
// @Accept json
// @Produce json
// @Success 200 {array} dto.ContainerOptions
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/list [post]
func (b *BaseApi) ListContainer(c *gin.Context) {
	helper.SuccessWithData(c, containerService.List())
}

// @Tags Container
// @Summary List containers by image
// @Accept json
// @Produce json
// @Success 200 {array} dto.ContainerOptions
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/list/byimage [post]
func (b *BaseApi) ListContainerByImage(c *gin.Context) {
	var req dto.OperationWithName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	helper.SuccessWithData(c, containerService.ListByImage(req.Name))
}

// @Tags Container
// @Summary Load containers status
// @Accept json
// @Produce json
// @Success 200 {object} dto.ContainerStatus
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/status [get]
func (b *BaseApi) LoadContainerStatus(c *gin.Context) {
	data, err := containerService.LoadStatus()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags Container Compose
// @Summary Page composes
// @Accept json
// @Param request body dto.SearchWithPage true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/compose/search [post]
func (b *BaseApi) SearchCompose(c *gin.Context) {
	var req dto.SearchWithPage
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := containerService.PageCompose(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Container Compose
// @Summary Test compose
// @Accept json
// @Param request body dto.ComposeCreate true "request"
// @Success 200 {boolean} isOK
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/compose/test [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"检测 compose [name] 格式","formatEN":"check compose [name]"}
func (b *BaseApi) TestCompose(c *gin.Context) {
	var req dto.ComposeCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	isOK, err := containerService.TestCompose(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, isOK)
}

// @Tags Container Compose
// @Summary Create compose
// @Accept json
// @Param request body dto.ComposeCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/compose [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建 compose [name]","formatEN":"create compose [name]"}
func (b *BaseApi) CreateCompose(c *gin.Context) {
	var req dto.ComposeCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.CreateCompose(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container Compose
// @Summary Operate compose
// @Accept json
// @Param request body dto.ComposeOperation true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/compose/operate [post]
// @x-panel-log {"bodyKeys":["name","operation"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"compose [operation] [name]","formatEN":"compose [operation] [name]"}
func (b *BaseApi) OperatorCompose(c *gin.Context) {
	var req dto.ComposeOperation
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ComposeOperation(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Update container
// @Accept json
// @Param request body dto.ContainerOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/update [post]
// @x-panel-log {"bodyKeys":["name","image"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新容器 [name][image]","formatEN":"update container [name][image]"}
func (b *BaseApi) ContainerUpdate(c *gin.Context) {
	var req dto.ContainerOperate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ContainerUpdate(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Load container info
// @Accept json
// @Param request body dto.OperationWithName true "request"
// @Success 200 {object} dto.ContainerOperate
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/info [post]
func (b *BaseApi) ContainerInfo(c *gin.Context) {
	var req dto.OperationWithName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	data, err := containerService.ContainerInfo(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Summary Load container limits
// @Success 200 {object} dto.ResourceLimit
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/limit [get]
func (b *BaseApi) LoadResourceLimit(c *gin.Context) {
	data, err := containerService.LoadResourceLimit()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Summary Load container stats
// @Success 200 {array} dto.ContainerListStats
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/list/stats [get]
func (b *BaseApi) ContainerListStats(c *gin.Context) {
	data, err := containerService.ContainerListStats()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Summary Load container stats size
// @Accept json
// @Param request body dto.OperationWithName true "request"
// @Success 200 {object} dto.ContainerItemStats
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/item/stats [post]
func (b *BaseApi) ContainerItemStats(c *gin.Context) {
	var req dto.OperationWithName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	data, err := containerService.ContainerItemStats(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags Container
// @Summary Create container
// @Accept json
// @Param request body dto.ContainerOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers [post]
// @x-panel-log {"bodyKeys":["name","image"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建容器 [name][image]","formatEN":"create container [name][image]"}
func (b *BaseApi) ContainerCreate(c *gin.Context) {
	var req dto.ContainerOperate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ContainerCreate(req, true); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Upgrade container
// @Accept json
// @Param request body dto.ContainerUpgrade true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/upgrade [post]
// @x-panel-log {"bodyKeys":["names","image"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新容器镜像 [names][image]","formatEN":"upgrade container image [names][image]"}
func (b *BaseApi) ContainerUpgrade(c *gin.Context) {
	var req dto.ContainerUpgrade
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ContainerUpgrade(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Clean container
// @Accept json
// @Param request body dto.ContainerPrune true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/prune [post]
// @x-panel-log {"bodyKeys":["pruneType"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清理容器 [pruneType]","formatEN":"clean container [pruneType]"}
func (b *BaseApi) ContainerPrune(c *gin.Context) {
	var req dto.ContainerPrune
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.Prune(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Clean container log
// @Accept json
// @Param request body dto.OperationWithName true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/clean/log [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清理容器 [name] 日志","formatEN":"clean container [name] logs"}
func (b *BaseApi) CleanContainerLog(c *gin.Context) {
	var req dto.OperationWithName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ContainerLogClean(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Clean compose log
// @Accept json
// @Param request body dto.ComposeLogClean true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/compose/clean/log [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"清理容器编排 [name] 日志","formatEN":"clean compose [name] logs"}
func (b *BaseApi) CleanComposeLog(c *gin.Context) {
	var req dto.ComposeLogClean
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ComposeLogClean(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Rename Container
// @Accept json
// @Param request body dto.ContainerRename true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/rename [post]
// @x-panel-log {"bodyKeys":["name","newName"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"容器重命名 [name] => [newName]","formatEN":"rename container [name] => [newName]"}
func (b *BaseApi) ContainerRename(c *gin.Context) {
	var req dto.ContainerRename
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ContainerRename(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Commit Container
// @Accept json
// @Param request body dto.ContainerCommit true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/commit [post]
func (b *BaseApi) ContainerCommit(c *gin.Context) {
	var req dto.ContainerCommit
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ContainerCommit(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Operate Container
// @Accept json
// @Param request body dto.ContainerOperation true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/operate [post]
// @x-panel-log {"bodyKeys":["names","operation"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"容器 [names] 执行 [operation]","formatEN":"container [operation] [names]"}
func (b *BaseApi) ContainerOperation(c *gin.Context) {
	var req dto.ContainerOperation
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ContainerOperation(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container
// @Summary Container stats
// @Param id path string true "容器id"
// @Success 200 {object} dto.ContainerStats
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/stats/:id [get]
func (b *BaseApi) ContainerStats(c *gin.Context) {
	containerID, ok := c.Params.Get("id")
	if !ok {
		helper.BadRequest(c, errors.New("error container id in path"))
		return
	}

	result, err := containerService.ContainerStats(containerID)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, result)
}

// @Tags Container
// @Summary Container inspect
// @Accept json
// @Param request body dto.InspectReq true "request"
// @Success 200 {string} result
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/inspect [post]
func (b *BaseApi) Inspect(c *gin.Context) {
	var req dto.InspectReq
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	result, err := containerService.Inspect(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, result)
}

func (b *BaseApi) DownloadContainerLogs(c *gin.Context) {
	var req dto.ContainerLog
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	err := containerService.DownloadContainerLogs(req.ContainerType, req.Container, req.Since, strconv.Itoa(int(req.Tail)), req.Timestamp, c)
	if err != nil {
		helper.InternalServer(c, err)
	}
}

// @Tags Container Network
// @Summary Page networks
// @Accept json
// @Param request body dto.SearchWithPage true "request"
// @Produce json
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/network/search [post]
func (b *BaseApi) SearchNetwork(c *gin.Context) {
	var req dto.SearchWithPage
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := containerService.PageNetwork(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Container Network
// @Summary List networks
// @Accept json
// @Produce json
// @Success 200 {array} dto.Options
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/network [get]
func (b *BaseApi) ListNetwork(c *gin.Context) {
	list, err := containerService.ListNetwork()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, list)
}

// @Tags Container Network
// @Summary Delete network
// @Accept json
// @Param request body dto.BatchDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/network/del [post]
// @x-panel-log {"bodyKeys":["names"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"删除容器网络 [names]","formatEN":"delete container network [names]"}
func (b *BaseApi) DeleteNetwork(c *gin.Context) {
	var req dto.BatchDelete
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.DeleteNetwork(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container Network
// @Summary Create network
// @Accept json
// @Param request body dto.NetworkCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/network [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建容器网络 name","formatEN":"create container network [name]"}
func (b *BaseApi) CreateNetwork(c *gin.Context) {
	var req dto.NetworkCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.CreateNetwork(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container Volume
// @Summary Page volumes
// @Accept json
// @Param request body dto.SearchWithPage true "request"
// @Produce json
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/volume/search [post]
func (b *BaseApi) SearchVolume(c *gin.Context) {
	var req dto.SearchWithPage
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := containerService.PageVolume(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Container Volume
// @Summary List volumes
// @Accept json
// @Produce json
// @Success 200 {array} dto.Options
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/volume [get]
func (b *BaseApi) ListVolume(c *gin.Context) {
	list, err := containerService.ListVolume()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, list)
}

// @Tags Container Volume
// @Summary Delete volume
// @Accept json
// @Param request body dto.BatchDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/volume/del [post]
// @x-panel-log {"bodyKeys":["names"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"删除容器存储卷 [names]","formatEN":"delete container volume [names]"}
func (b *BaseApi) DeleteVolume(c *gin.Context) {
	var req dto.BatchDelete
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.DeleteVolume(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container Volume
// @Summary Create volume
// @Accept json
// @Param request body dto.VolumeCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/volume [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建容器存储卷 [name]","formatEN":"create container volume [name]"}
func (b *BaseApi) CreateVolume(c *gin.Context) {
	var req dto.VolumeCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.CreateVolume(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container Compose
// @Summary Update compose
// @Accept json
// @Param request body dto.ComposeUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/compose/update [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新 compose [name]","formatEN":"update compose information [name]"}
func (b *BaseApi) ComposeUpdate(c *gin.Context) {
	var req dto.ComposeUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := containerService.ComposeUpdate(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Container Compose
// @Summary Load compose environment variables
// @Accept json
// @Param request body dto.FilePath true "request"
// @Success 200 {array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/compose/env [post]
func (b *BaseApi) LoadComposeEnv(c *gin.Context) {
	var req dto.FilePath
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	data, err := containerService.LoadComposeEnv(req.Path)
	if err != nil {
		helper.InternalServer(c, err)
	}
	helper.SuccessWithData(c, data)
}

// @Tags Container
// @Summary Container logs
// @Param container query string false "容器名称"
// @Param since query string false "时间筛选"
// @Param follow query string false "是否追踪"
// @Param tail query string false "显示行号"
// @Param timestamp query string false "是否显示时间"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /containers/search/log [get]
func (b *BaseApi) ContainerStreamLogs(c *gin.Context) {
	c.Header("Content-Type", "text/event-stream")
	c.Header("Cache-Control", "no-cache")
	c.Header("Connection", "keep-alive")
	c.Header("Transfer-Encoding", "chunked")

	since := c.Query("since")
	follow := c.Query("follow") == "true"
	tail := c.Query("tail")
	timestamp := c.Query("timestamp") == "true"

	container := c.Query("container")
	compose := c.Query("compose")
	streamLog := dto.StreamLog{
		Compose:   compose,
		Container: container,
		Since:     since,
		Follow:    follow,
		Tail:      tail,
		Timestamp: timestamp,
		Type:      "container",
	}
	if compose != "" {
		streamLog.Type = "compose"
	}

	containerService.StreamLogs(c, streamLog)
}


================================================
FILE: agent/app/api/v2/cronjob.go
================================================
package v2

import (
	"net/http"
	"strings"
	"time"

	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/1Panel-dev/1Panel/agent/utils/common"
	"github.com/gin-gonic/gin"
)

// @Tags Cronjob
// @Summary Create cronjob
// @Accept json
// @Param request body dto.CronjobOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs [post]
// @x-panel-log {"bodyKeys":["type","name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建计划任务 [type][name]","formatEN":"create cronjob [type][name]"}
func (b *BaseApi) CreateCronjob(c *gin.Context) {
	var req dto.CronjobOperate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := cronjobService.Create(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Cronjob
// @Summary Load cronjob info
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/load/info [post]
func (b *BaseApi) LoadCronjobInfo(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	data, err := cronjobService.LoadInfo(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags Cronjob
// @Summary Export cronjob list
// @Accept json
// @Param request body dto.OperateByIDs true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/export [post]
func (b *BaseApi) ExportCronjob(c *gin.Context) {
	var req dto.OperateByIDs
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	content, err := cronjobService.Export(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	http.ServeContent(c.Writer, c.Request, "", time.Now(), strings.NewReader(content))
}

// @Tags Cronjob
// @Summary Import cronjob list
// @Accept json
// @Param request body dto.CronjobImport true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/import [post]
func (b *BaseApi) ImportCronjob(c *gin.Context) {
	var req dto.CronjobImport
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := cronjobService.Import(req.Cronjobs); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Cronjob
// @Summary Load script options
// @Success 200 {array} dto.ScriptOptions
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/script/options [get]
func (b *BaseApi) LoadScriptOptions(c *gin.Context) {
	helper.SuccessWithData(c, cronjobService.LoadScriptOptions())
}

// @Tags Cronjob
// @Summary Load cronjob spec time
// @Accept json
// @Param request body dto.CronjobSpec true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/next [post]
func (b *BaseApi) LoadNextHandle(c *gin.Context) {
	var req dto.CronjobSpec
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	list, err := cronjobService.LoadNextHandle(req.Spec)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, list)
}

// @Tags Cronjob
// @Summary Page cronjobs
// @Accept json
// @Param request body dto.PageCronjob true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/search [post]
func (b *BaseApi) SearchCronjob(c *gin.Context) {
	var req dto.PageCronjob
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := cronjobService.SearchWithPage(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Cronjob
// @Summary Page job records
// @Accept json
// @Param request body dto.SearchRecord true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/search/records [post]
func (b *BaseApi) SearchJobRecords(c *gin.Context) {
	var req dto.SearchRecord
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	loc, _ := time.LoadLocation(common.LoadTimeZoneByCmd())
	req.StartTime = req.StartTime.In(loc)
	req.EndTime = req.EndTime.In(loc)

	total, list, err := cronjobService.SearchRecords(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Cronjob
// @Summary Load Cronjob record log
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200 {string} content
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/records/log [post]
func (b *BaseApi) LoadRecordLog(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	content := cronjobService.LoadRecordLog(req)
	helper.SuccessWithData(c, content)
}

// @Tags Cronjob
// @Summary Clean job records
// @Accept json
// @Param request body dto.CronjobClean true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/records/clean [post]
// @x-panel-log {"bodyKeys":["cronjobID"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"cronjobID","isList":false,"db":"cronjobs","output_column":"name","output_value":"name"}],"formatZH":"清空计划任务记录 [name]","formatEN":"clean cronjob [name] records"}
func (b *BaseApi) CleanRecord(c *gin.Context) {
	var req dto.CronjobClean
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := cronjobService.CleanRecord(req); err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.Success(c)
}

// @Tags Cronjob
// @Summary Handle stop job
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/stop [post]
func (b *BaseApi) StopCronJob(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := cronjobService.HandleStop(req.ID); err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.Success(c)
}

// @Tags Cronjob
// @Summary Delete cronjob
// @Accept json
// @Param request body dto.CronjobBatchDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"cronjobs","output_column":"name","output_value":"names"}],"formatZH":"删除计划任务 [names]","formatEN":"delete cronjob [names]"}
func (b *BaseApi) DeleteCronjob(c *gin.Context) {
	var req dto.CronjobBatchDelete
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := cronjobService.Delete(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Cronjob
// @Summary Update cronjob
// @Accept json
// @Param request body dto.CronjobOperate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/update [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"cronjobs","output_column":"name","output_value":"name"}],"formatZH":"更新计划任务 [name]","formatEN":"update cronjob [name]"}
func (b *BaseApi) UpdateCronjob(c *gin.Context) {
	var req dto.CronjobOperate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := cronjobService.Update(req.ID, req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Cronjob
// @Summary Update cronjob group
// @Accept json
// @Param request body dto.ChangeGroup true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/group/update [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"cronjobs","output_column":"name","output_value":"name"}],"formatZH":"更新计划任务分组 [name]","formatEN":"update cronjob group [name]"}
func (b *BaseApi) UpdateCronjobGroup(c *gin.Context) {
	var req dto.ChangeGroup
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := cronjobService.UpdateGroup(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Cronjob
// @Summary Update cronjob status
// @Accept json
// @Param request body dto.CronjobUpdateStatus true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/status [post]
// @x-panel-log {"bodyKeys":["id","status"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"cronjobs","output_column":"name","output_value":"name"}],"formatZH":"修改计划任务 [name] 状态为 [status]","formatEN":"change the status of cronjob [name] to [status]."}
func (b *BaseApi) UpdateCronjobStatus(c *gin.Context) {
	var req dto.CronjobUpdateStatus
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := cronjobService.UpdateStatus(req.ID, req.Status); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Cronjob
// @Summary Handle cronjob once
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /cronjobs/handle [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"cronjobs","output_column":"name","output_value":"name"}],"formatZH":"手动执行计划任务 [name]","formatEN":"manually execute the cronjob [name]"}
func (b *BaseApi) HandleOnce(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := cronjobService.HandleOnce(req.ID); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/dashboard.go
================================================
package v2

import (
	"errors"

	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
)

// @Tags Dashboard
// @Summary Load os info
// @Accept json
// @Success 200 {object} dto.OsInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/base/os [get]
func (b *BaseApi) LoadDashboardOsInfo(c *gin.Context) {
	data, err := dashboardService.LoadOsInfo()
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags Dashboard
// @Summary Load app launcher
// @Accept json
// @Success 200 {array} dto.AppLauncher
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/app/launcher [get]
func (b *BaseApi) LoadAppLauncher(c *gin.Context) {
	data, err := dashboardService.LoadAppLauncher(c)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithDataGzipped(c, data)
}

// @Tags Dashboard
// @Summary Load app launcher options
// @Accept json
// @Param request body dto.SearchByFilter true "request"
// @Success 200 {array} dto.LauncherOption
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/app/launcher/option [post]
func (b *BaseApi) LoadAppLauncherOption(c *gin.Context) {
	var req dto.SearchByFilter
	if err := helper.CheckBind(&req, c); err != nil {
		return
	}
	data, err := dashboardService.ListLauncherOption(req.Filter)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags Dashboard
// @Summary Update app Launcher
// @Accept json
// @Param request body dto.SettingUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/app/launcher/show [post]
// @x-panel-log {"bodyKeys":["key", "value"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"首页应用 [key] => 显示:[value]","formatEN":"app launcher [key] => show: [value]"}
func (b *BaseApi) UpdateAppLauncher(c *gin.Context) {
	var req dto.SettingUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := dashboardService.ChangeShow(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Dashboard
// @Summary Load quick jump options
// @Success 200 {array} dto.QuickJump
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/quick/option [get]
func (b *BaseApi) LoadQuickOption(c *gin.Context) {
	helper.SuccessWithData(c, dashboardService.LoadQuickOptions())
}

// @Tags Dashboard
// @Summary Update quick jump
// @Accept json
// @Param request body dto.ChangeQuicks true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/quick/change [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"切换快速跳转","formatEN":"change quick jump"}
func (b *BaseApi) UpdateQuickJump(c *gin.Context) {
	var req dto.ChangeQuicks
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := dashboardService.ChangeQuick(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Dashboard
// @Summary Load dashboard base info
// @Accept json
// @Param ioOption path string true "request"
// @Param netOption path string true "request"
// @Success 200 {object} dto.DashboardBase
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/base/:ioOption/:netOption [get]
func (b *BaseApi) LoadDashboardBaseInfo(c *gin.Context) {
	ioOption, ok := c.Params.Get("ioOption")
	if !ok {
		helper.BadRequest(c, errors.New("error ioOption in path"))
		return
	}
	netOption, ok := c.Params.Get("netOption")
	if !ok {
		helper.BadRequest(c, errors.New("error ioOption in path"))
		return
	}
	data, err := dashboardService.LoadBaseInfo(ioOption, netOption)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, data)
}

// @Tags Dashboard
// @Summary Load dashboard current info for node
// @Success 200 {object} dto.NodeCurrent
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/current/node [get]
func (b *BaseApi) LoadCurrentInfoForNode(c *gin.Context) {
	data := dashboardService.LoadCurrentInfoForNode()
	helper.SuccessWithData(c, data)
}

// @Tags Dashboard
// @Summary Load dashboard current info
// @Accept json
// @Param ioOption path string true "request"
// @Param netOption path string true "request"
// @Success 200 {object} dto.DashboardCurrent
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/current/:ioOption/:netOption [get]
func (b *BaseApi) LoadDashboardCurrentInfo(c *gin.Context) {
	ioOption, ok := c.Params.Get("ioOption")
	if !ok {
		helper.BadRequest(c, errors.New("error ioOption in path"))
		return
	}
	netOption, ok := c.Params.Get("netOption")
	if !ok {
		helper.BadRequest(c, errors.New("error netOption in path"))
		return
	}

	data := dashboardService.LoadCurrentInfo(ioOption, netOption)
	helper.SuccessWithData(c, data)
}

// @Tags Dashboard
// @Summary Load top cpu processes
// @Success 200 {array} dto.Process
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/current/top/cpu [get]
func (b *BaseApi) LoadDashboardTopCPU(c *gin.Context) {
	data := dashboardService.LoadTopCPU()
	helper.SuccessWithData(c, data)
}

// @Tags Dashboard
// @Summary Load top memory processes
// @Success 200 {array} dto.Process
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/current/top/mem [get]
func (b *BaseApi) LoadDashboardTopMem(c *gin.Context) {
	data := dashboardService.LoadTopMem()
	helper.SuccessWithData(c, data)
}

// @Tags Dashboard
// @Summary System restart
// @Accept json
// @Param operation path string true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /dashboard/system/restart/:operation [post]
func (b *BaseApi) SystemRestart(c *gin.Context) {
	operation, ok := c.Params.Get("operation")
	if !ok {
		helper.BadRequest(c, errors.New("error operation in path"))
		return
	}
	if err := dashboardService.Restart(operation); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/database.go
================================================
package v2

import (
	"encoding/base64"

	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
)

// @Tags Database
// @Summary Create database
// @Accept json
// @Param request body dto.DatabaseCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db [post]
// @x-panel-log {"bodyKeys":["name", "type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建远程数据库 [name][type]","formatEN":"create database [name][type]"}
func (b *BaseApi) CreateDatabase(c *gin.Context) {
	var req dto.DatabaseCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if req.SSL {
		key, _ := base64.StdEncoding.DecodeString(req.ClientKey)
		req.ClientKey = string(key)
		cert, _ := base64.StdEncoding.DecodeString(req.ClientCert)
		req.ClientCert = string(cert)
		ca, _ := base64.StdEncoding.DecodeString(req.RootCert)
		req.RootCert = string(ca)
	}

	if err := databaseService.Create(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Database
// @Summary Check database
// @Accept json
// @Param request body dto.DatabaseCreate true "request"
// @Success 200 {boolean} isOk
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/check [post]
// @x-panel-log {"bodyKeys":["name", "type"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"检测远程数据库 [name][type] 连接性","formatEN":"check if database [name][type] is connectable"}
func (b *BaseApi) CheckDatabase(c *gin.Context) {
	var req dto.DatabaseCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if req.SSL {
		clientKey, _ := base64.StdEncoding.DecodeString(req.ClientKey)
		req.ClientKey = string(clientKey)
		clientCert, _ := base64.StdEncoding.DecodeString(req.ClientCert)
		req.ClientCert = string(clientCert)
		rootCert, _ := base64.StdEncoding.DecodeString(req.RootCert)
		req.RootCert = string(rootCert)
	}

	helper.SuccessWithData(c, databaseService.CheckDatabase(req))
}

// @Tags Database
// @Summary Page databases
// @Accept json
// @Param request body dto.DatabaseSearch true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/search [post]
func (b *BaseApi) SearchDatabase(c *gin.Context) {
	var req dto.DatabaseSearch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := databaseService.SearchWithPage(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Database
// @Summary List databases
// @Success 200 {array} dto.DatabaseOption
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/list/:type [get]
func (b *BaseApi) ListDatabase(c *gin.Context) {
	dbType, err := helper.GetStrParamByKey(c, "type")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	list, err := databaseService.List(dbType)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, list)
}

// @Tags Database
// @Summary List databases
// @Success 200 {array} dto.DatabaseItem
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/item/:type [get]
func (b *BaseApi) LoadDatabaseItems(c *gin.Context) {
	dbType, err := helper.GetStrParamByKey(c, "type")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	list, err := databaseService.LoadItems(dbType)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, list)
}

// @Tags Database
// @Summary Get databases
// @Success 200 {object} dto.DatabaseInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/:name [get]
func (b *BaseApi) GetDatabase(c *gin.Context) {
	name, err := helper.GetStrParamByKey(c, "name")
	if err != nil {
		helper.BadRequest(c, err)
		return
	}
	data, err := databaseService.Get(name)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, data)
}

// @Tags Database
// @Summary Check before delete remote database
// @Accept json
// @Param request body dto.OperateByID true "request"
// @Success 200 {array} string
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/del/check [post]
func (b *BaseApi) DeleteCheckDatabase(c *gin.Context) {
	var req dto.OperateByID
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	apps, err := databaseService.DeleteCheck(req.ID)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, apps)
}

// @Tags Database
// @Summary Delete database
// @Accept json
// @Param request body dto.DatabaseDelete true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/del [post]
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"databases","output_column":"name","output_value":"names"}],"formatZH":"删除远程数据库 [names]","formatEN":"delete database [names]"}
func (b *BaseApi) DeleteDatabase(c *gin.Context) {
	var req dto.DatabaseDelete
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := databaseService.Delete(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Database
// @Summary Update database
// @Accept json
// @Param request body dto.DatabaseUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/db/update [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新远程数据库 [name]","formatEN":"update database [name]"}
func (b *BaseApi) UpdateDatabase(c *gin.Context) {
	var req dto.DatabaseUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	if req.SSL {
		cKey, _ := base64.StdEncoding.DecodeString(req.ClientKey)
		req.ClientKey = string(cKey)
		cCert, _ := base64.StdEncoding.DecodeString(req.ClientCert)
		req.ClientCert = string(cCert)
		ca, _ := base64.StdEncoding.DecodeString(req.RootCert)
		req.RootCert = string(ca)
	}

	if err := databaseService.Update(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/database_common.go
================================================
package v2

import (
	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
)

// @Tags Database Common
// @Summary Load base info
// @Accept json
// @Param request body dto.OperationWithNameAndType true "request"
// @Success 200 {object} dto.DBBaseInfo
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/common/info [post]
func (b *BaseApi) LoadDBBaseInfo(c *gin.Context) {
	var req dto.OperationWithNameAndType
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	data, err := dbCommonService.LoadBaseInfo(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, data)
}

// @Tags Database Common
// @Summary Load Database conf
// @Accept json
// @Param request body dto.OperationWithNameAndType true "request"
// @Success 200 {string} content
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/common/load/file [post]
func (b *BaseApi) LoadDBFile(c *gin.Context) {
	var req dto.OperationWithNameAndType
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	content, err := dbCommonService.LoadDatabaseFile(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.SuccessWithData(c, content)
}

// @Tags Database Common
// @Summary Update conf by upload file
// @Accept json
// @Param request body dto.DBConfUpdateByFile true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/common/update/conf [post]
// @x-panel-log {"bodyKeys":["type","database"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新 [type] 数据库 [database] 配置信息","formatEN":"update the [type] [database] database configuration information"}
func (b *BaseApi) UpdateDBConfByFile(c *gin.Context) {
	var req dto.DBConfUpdateByFile
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := dbCommonService.UpdateConfByFile(req); err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.Success(c)
}


================================================
FILE: agent/app/api/v2/database_mysql.go
================================================
package v2

import (
	"context"
	"encoding/base64"

	"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper"
	"github.com/1Panel-dev/1Panel/agent/app/dto"
	"github.com/gin-gonic/gin"
)

// @Tags Database Mysql
// @Summary Create mysql database
// @Accept json
// @Param request body dto.MysqlDBCreate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases [post]
// @x-panel-log {"bodyKeys":["name"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建 mysql 数据库 [name]","formatEN":"create mysql database [name]"}
func (b *BaseApi) CreateMysql(c *gin.Context) {
	var req dto.MysqlDBCreate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if len(req.Password) != 0 {
		password, err := base64.StdEncoding.DecodeString(req.Password)
		if err != nil {
			helper.BadRequest(c, err)
			return
		}
		req.Password = string(password)
	}

	if _, err := mysqlService.Create(context.Background(), req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Database Mysql
// @Summary Bind user of mysql database
// @Accept json
// @Param request body dto.BindUser true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/bind [post]
// @x-panel-log {"bodyKeys":["database", "username"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"绑定 mysql 数据库名 [database] [username]","formatEN":"bind mysql database [database] [username]"}
func (b *BaseApi) BindUser(c *gin.Context) {
	var req dto.BindUser
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if len(req.Password) != 0 {
		password, err := base64.StdEncoding.DecodeString(req.Password)
		if err != nil {
			helper.BadRequest(c, err)
			return
		}
		req.Password = string(password)
	}

	if err := mysqlService.BindUser(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Database Mysql
// @Summary Update mysql database description
// @Accept json
// @Param request body dto.UpdateDescription true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/description/update [post]
// @x-panel-log {"bodyKeys":["id","description"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"database_mysqls","output_column":"name","output_value":"name"}],"formatZH":"mysql 数据库 [name] 描述信息修改 [description]","formatEN":"The description of the mysql database [name] is modified => [description]"}
func (b *BaseApi) UpdateMysqlDescription(c *gin.Context) {
	var req dto.UpdateDescription
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := mysqlService.UpdateDescription(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Database Mysql
// @Summary Change mysql password
// @Accept json
// @Param request body dto.ChangeDBInfo true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/change/password [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"database_mysqls","output_column":"name","output_value":"name"}],"formatZH":"更新数据库 [name] 密码","formatEN":"Update database [name] password"}
func (b *BaseApi) ChangeMysqlPassword(c *gin.Context) {
	var req dto.ChangeDBInfo
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if len(req.Value) != 0 {
		value, err := base64.StdEncoding.DecodeString(req.Value)
		if err != nil {
			helper.BadRequest(c, err)
			return
		}
		req.Value = string(value)
	}

	if err := mysqlService.ChangePassword(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Database Mysql
// @Summary Change mysql access
// @Accept json
// @Param request body dto.ChangeDBInfo true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/change/access [post]
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":false,"db":"database_mysqls","output_column":"name","output_value":"name"}],"formatZH":"更新数据库 [name] 访问权限","formatEN":"Update database [name] access"}
func (b *BaseApi) ChangeMysqlAccess(c *gin.Context) {
	var req dto.ChangeDBInfo
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := mysqlService.ChangeAccess(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Database Mysql
// @Summary Update mysql variables
// @Accept json
// @Param request body dto.MysqlVariablesUpdate true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/variables/update [post]
// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"调整 mysql 数据库性能参数","formatEN":"adjust mysql database performance parameters"}
func (b *BaseApi) UpdateMysqlVariables(c *gin.Context) {
	var req dto.MysqlVariablesUpdate
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	if err := mysqlService.UpdateVariables(req); err != nil {
		helper.InternalServer(c, err)
		return
	}
	helper.Success(c)
}

// @Tags Database Mysql
// @Summary Page mysql databases
// @Accept json
// @Param request body dto.MysqlDBSearch true "request"
// @Success 200 {object} dto.PageResult
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/search [post]
func (b *BaseApi) SearchMysql(c *gin.Context) {
	var req dto.MysqlDBSearch
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}

	total, list, err := mysqlService.SearchWithPage(req)
	if err != nil {
		helper.InternalServer(c, err)
		return
	}

	helper.SuccessWithData(c, dto.PageResult{
		Items: list,
		Total: total,
	})
}

// @Tags Database Mysql
// @Summary List mysql database format collation options
// @Accept json
// @Param request body dto.OperationWithName true "request"
// @Success 200 {array} dto.MysqlFormatCollationOption
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/format/options [post]
func (b *BaseApi) ListDBFormatCollationOptions(c *gin.Context) {
	var req dto.OperationWithName
	if err := helper.CheckBindAndValidate(&req, c); err != nil {
		return
	}
	helper.SuccessWithData(c, mysqlService.LoadFormatOption(req))
}

// @Tags Database Mysql
// @Summary Load mysql database from remote
// @Accept json
// @Param request body dto.MysqlLoadDB true "request"
// @Success 200
// @Security ApiKeyAuth
// @Security Timestamp
// @Router /databases/load [post]
func (b *BaseApi) LoadDBFromRemote(c *gin.Context) {
	var req dto.My
Download .txt
gitextract_ro__1khy/

├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── 1_bug_report.yml
│   │   ├── 2_feature_request.yml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows/
│       ├── add-labels-for-pr.yml
│       ├── build-and-publish.yml
│       ├── issue-translator.yml
│       ├── llm-code-review.yml
│       ├── sonarcloud-scan.yml
│       ├── sync2gitee.yml
│       └── tyops-check.yml
├── .gitignore
├── .goreleaser.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── SECURITY.md
├── agent/
│   ├── app/
│   │   ├── api/
│   │   │   └── v2/
│   │   │       ├── agents.go
│   │   │       ├── ai.go
│   │   │       ├── alert.go
│   │   │       ├── app.go
│   │   │       ├── app_ignore_upgrade.go
│   │   │       ├── app_install.go
│   │   │       ├── backup.go
│   │   │       ├── clam.go
│   │   │       ├── compose_template.go
│   │   │       ├── container.go
│   │   │       ├── cronjob.go
│   │   │       ├── dashboard.go
│   │   │       ├── database.go
│   │   │       ├── database_common.go
│   │   │       ├── database_mysql.go
│   │   │       ├── database_postgresql.go
│   │   │       ├── database_redis.go
│   │   │       ├── device.go
│   │   │       ├── disk.go
│   │   │       ├── docker.go
│   │   │       ├── entry.go
│   │   │       ├── fail2ban.go
│   │   │       ├── favorite.go
│   │   │       ├── file.go
│   │   │       ├── firewall.go
│   │   │       ├── ftp.go
│   │   │       ├── group.go
│   │   │       ├── health.go
│   │   │       ├── helper/
│   │   │       │   └── helper.go
│   │   │       ├── host.go
│   │   │       ├── host_tool.go
│   │   │       ├── image.go
│   │   │       ├── image_repo.go
│   │   │       ├── logs.go
│   │   │       ├── mcp_server.go
│   │   │       ├── monitor.go
│   │   │       ├── nginx.go
│   │   │       ├── php_extensions.go
│   │   │       ├── process.go
│   │   │       ├── recycle_bin.go
│   │   │       ├── runtime.go
│   │   │       ├── setting.go
│   │   │       ├── snapshot.go
│   │   │       ├── ssh.go
│   │   │       ├── system.go
│   │   │       ├── task.go
│   │   │       ├── tensorrt_llm.go
│   │   │       ├── terminal.go
│   │   │       ├── website.go
│   │   │       ├── website_acme_account.go
│   │   │       ├── website_ca.go
│   │   │       ├── website_dns_account.go
│   │   │       ├── website_domain.go
│   │   │       └── website_ssl.go
│   │   ├── dto/
│   │   │   ├── agents.go
│   │   │   ├── ai.go
│   │   │   ├── alert.go
│   │   │   ├── app.go
│   │   │   ├── backup.go
│   │   │   ├── clam.go
│   │   │   ├── command.go
│   │   │   ├── common_req.go
│   │   │   ├── common_res.go
│   │   │   ├── compose_template.go
│   │   │   ├── container.go
│   │   │   ├── cronjob.go
│   │   │   ├── dashboard.go
│   │   │   ├── database.go
│   │   │   ├── database_postgresql.go
│   │   │   ├── device.go
│   │   │   ├── disk.go
│   │   │   ├── docker.go
│   │   │   ├── fail2ban.go
│   │   │   ├── file.go
│   │   │   ├── firewall.go
│   │   │   ├── ftp.go
│   │   │   ├── group.go
│   │   │   ├── host.go
│   │   │   ├── image.go
│   │   │   ├── image_repo.go
│   │   │   ├── logs.go
│   │   │   ├── monitor.go
│   │   │   ├── nginx.go
│   │   │   ├── request/
│   │   │   │   ├── app.go
│   │   │   │   ├── app_ignore_upgrade.go
│   │   │   │   ├── common.go
│   │   │   │   ├── disk.go
│   │   │   │   ├── favorite.go
│   │   │   │   ├── file.go
│   │   │   │   ├── host_tool.go
│   │   │   │   ├── mcp_server.go
│   │   │   │   ├── nginx.go
│   │   │   │   ├── php_extensions.go
│   │   │   │   ├── process.go
│   │   │   │   ├── recycle_bin.go
│   │   │   │   ├── runtime.go
│   │   │   │   ├── task.go
│   │   │   │   ├── tensorrt_llm.go
│   │   │   │   ├── website.go
│   │   │   │   └── website_ssl.go
│   │   │   ├── response/
│   │   │   │   ├── app.go
│   │   │   │   ├── app_ignore_upgrade.go
│   │   │   │   ├── disk.go
│   │   │   │   ├── favorite.go
│   │   │   │   ├── file.go
│   │   │   │   ├── host_tool.go
│   │   │   │   ├── mcp_server.go
│   │   │   │   ├── nginx.go
│   │   │   │   ├── php_extensions.go
│   │   │   │   ├── recycle_bin.go
│   │   │   │   ├── runtime.go
│   │   │   │   ├── system.go
│   │   │   │   ├── task.go
│   │   │   │   ├── tensorrt_llm.go
│   │   │   │   ├── website.go
│   │   │   │   └── website_ssl.go
│   │   │   ├── setting.go
│   │   │   ├── snapshot.go
│   │   │   └── ssh.go
│   │   ├── model/
│   │   │   ├── agent.go
│   │   │   ├── agent_account.go
│   │   │   ├── agent_account_model.go
│   │   │   ├── ai.go
│   │   │   ├── alert.go
│   │   │   ├── app.go
│   │   │   ├── app_detail.go
│   │   │   ├── app_ignore_upgrade.go
│   │   │   ├── app_install.go
│   │   │   ├── app_install_resource.go
│   │   │   ├── app_launcher.go
│   │   │   ├── app_tag.go
│   │   │   ├── backup.go
│   │   │   ├── base.go
│   │   │   ├── clam.go
│   │   │   ├── compose_template.go
│   │   │   ├── cronjob.go
│   │   │   ├── database.go
│   │   │   ├── database_mysql.go
│   │   │   ├── database_postgresql.go
│   │   │   ├── favorite.go
│   │   │   ├── firewall.go
│   │   │   ├── ftp.go
│   │   │   ├── group.go
│   │   │   ├── host.go
│   │   │   ├── image_repo.go
│   │   │   ├── mcp_server.go
│   │   │   ├── monitor.go
│   │   │   ├── php_extensions.go
│   │   │   ├── runtime.go
│   │   │   ├── setting.go
│   │   │   ├── snapshot.go
│   │   │   ├── ssh.go
│   │   │   ├── tag.go
│   │   │   ├── task.go
│   │   │   ├── tensorrt_llm.go
│   │   │   ├── website.go
│   │   │   ├── website_acme_account.go
│   │   │   ├── website_ca.go
│   │   │   ├── website_dns_account.go
│   │   │   ├── website_domain.go
│   │   │   └── website_ssl.go
│   │   ├── provider/
│   │   │   ├── catalog.go
│   │   │   ├── openclaw.go
│   │   │   └── verify.go
│   │   ├── repo/
│   │   │   ├── agent.go
│   │   │   ├── agent_account.go
│   │   │   ├── agent_account_model.go
│   │   │   ├── ai.go
│   │   │   ├── alert.go
│   │   │   ├── app.go
│   │   │   ├── app_detail.go
│   │   │   ├── app_ignore_upgrade.go
│   │   │   ├── app_install.go
│   │   │   ├── app_install_resource.go
│   │   │   ├── app_launcher.go
│   │   │   ├── app_tag.go
│   │   │   ├── backup.go
│   │   │   ├── clam.go
│   │   │   ├── common.go
│   │   │   ├── compose_template.go
│   │   │   ├── cronjob.go
│   │   │   ├── database.go
│   │   │   ├── database_mysql.go
│   │   │   ├── database_postgresql.go
│   │   │   ├── favorite.go
│   │   │   ├── ftp.go
│   │   │   ├── group.go
│   │   │   ├── host.go
│   │   │   ├── image_repo.go
│   │   │   ├── mcp_server.go
│   │   │   ├── monitor.go
│   │   │   ├── php_extensions.go
│   │   │   ├── runtime.go
│   │   │   ├── script.go
│   │   │   ├── setting.go
│   │   │   ├── snapshot.go
│   │   │   ├── tag.go
│   │   │   ├── task.go
│   │   │   ├── tensorrt_llm.go
│   │   │   ├── website.go
│   │   │   ├── website_acme_account.go
│   │   │   ├── website_ca.go
│   │   │   ├── website_dns_account.go
│   │   │   ├── website_domain.go
│   │   │   └── website_ssl.go
│   │   ├── service/
│   │   │   ├── agents.go
│   │   │   ├── agents_utils.go
│   │   │   ├── ai.go
│   │   │   ├── alert.go
│   │   │   ├── alert_helper.go
│   │   │   ├── alert_sender.go
│   │   │   ├── app.go
│   │   │   ├── app_ingore_upgrade.go
│   │   │   ├── app_install.go
│   │   │   ├── app_sync_task.go
│   │   │   ├── app_utils.go
│   │   │   ├── backup.go
│   │   │   ├── backup_app.go
│   │   │   ├── backup_compose.go
│   │   │   ├── backup_container.go
│   │   │   ├── backup_mysql.go
│   │   │   ├── backup_postgresql.go
│   │   │   ├── backup_record.go
│   │   │   ├── backup_redis.go
│   │   │   ├── backup_runtime.go
│   │   │   ├── backup_website.go
│   │   │   ├── clam.go
│   │   │   ├── compose_template.go
│   │   │   ├── container.go
│   │   │   ├── container_compose.go
│   │   │   ├── container_network.go
│   │   │   ├── container_volume.go
│   │   │   ├── cronjob.go
│   │   │   ├── cronjob_backup.go
│   │   │   ├── cronjob_helper.go
│   │   │   ├── dashboard.go
│   │   │   ├── database.go
│   │   │   ├── database_common.go
│   │   │   ├── database_mysql.go
│   │   │   ├── database_postgresql.go
│   │   │   ├── database_redis.go
│   │   │   ├── device.go
│   │   │   ├── device_clean.go
│   │   │   ├── disk.go
│   │   │   ├── disk_utils.go
│   │   │   ├── docker.go
│   │   │   ├── entry.go
│   │   │   ├── fail2ban.go
│   │   │   ├── favorite.go
│   │   │   ├── file.go
│   │   │   ├── firewall.go
│   │   │   ├── ftp.go
│   │   │   ├── group.go
│   │   │   ├── helper.go
│   │   │   ├── host.go
│   │   │   ├── host_tool.go
│   │   │   ├── image.go
│   │   │   ├── image_repo.go
│   │   │   ├── iptables.go
│   │   │   ├── logs.go
│   │   │   ├── mcp_server.go
│   │   │   ├── monitor.go
│   │   │   ├── nginx.go
│   │   │   ├── nginx_utils.go
│   │   │   ├── php_extensions.go
│   │   │   ├── process.go
│   │   │   ├── recycle_bin.go
│   │   │   ├── runtime.go
│   │   │   ├── runtime_utils.go
│   │   │   ├── setting.go
│   │   │   ├── snapshot.go
│   │   │   ├── snapshot_create.go
│   │   │   ├── snapshot_recover.go
│   │   │   ├── snapshot_rollback.go
│   │   │   ├── ssh.go
│   │   │   ├── system.go
│   │   │   ├── task.go
│   │   │   ├── tensorrt_llm.go
│   │   │   ├── website.go
│   │   │   ├── website_acme_account.go
│   │   │   ├── website_auth_basic.go
│   │   │   ├── website_ca.go
│   │   │   ├── website_dns_account.go
│   │   │   ├── website_domain.go
│   │   │   ├── website_lb.go
│   │   │   ├── website_op.go
│   │   │   ├── website_proxy.go
│   │   │   ├── website_rewrite.go
│   │   │   ├── website_ssl.go
│   │   │   └── website_utils.go
│   │   └── task/
│   │       └── task.go
│   ├── buserr/
│   │   ├── errors.go
│   │   └── multi_err.go
│   ├── cmd/
│   │   └── server/
│   │       ├── ai/
│   │       │   ├── ai.go
│   │       │   ├── compose.yml
│   │       │   └── llm-compose.yml
│   │       ├── cmd/
│   │       │   └── root.go
│   │       ├── conf/
│   │       │   ├── app.yaml
│   │       │   └── conf.go
│   │       ├── docs/
│   │       │   ├── swagger.go
│   │       │   └── x-log.json
│   │       ├── main.go
│   │       └── nginx_conf/
│   │           ├── 404.html
│   │           ├── cache.conf
│   │           ├── domain404.html
│   │           ├── gzip.conf
│   │           ├── index.html
│   │           ├── index.php
│   │           ├── nginx_conf.go
│   │           ├── path_auth.conf
│   │           ├── php-fpm.conf
│   │           ├── php_extensions.json
│   │           ├── proxy.conf
│   │           ├── proxy_cache.conf
│   │           ├── proxy_no_cache.conf
│   │           ├── rewrite/
│   │           │   ├── crmeb.conf
│   │           │   ├── dabr.conf
│   │           │   ├── dbshop.conf
│   │           │   ├── dedecms.conf
│   │           │   ├── default.conf
│   │           │   ├── discuz.conf
│   │           │   ├── discuzx.conf
│   │           │   ├── discuzx2.conf
│   │           │   ├── discuzx3.conf
│   │           │   ├── drupal.conf
│   │           │   ├── ecshop.conf
│   │           │   ├── edusoho.conf
│   │           │   ├── emlog.conf
│   │           │   ├── empirecms.conf
│   │           │   ├── laravel5.conf
│   │           │   ├── maccms.conf
│   │           │   ├── mvc.conf
│   │           │   ├── niushop.conf
│   │           │   ├── phpcms.conf
│   │           │   ├── phpwind.conf
│   │           │   ├── sablog.conf
│   │           │   ├── seacms.conf
│   │           │   ├── shopex.conf
│   │           │   ├── shopwind.conf
│   │           │   ├── thinkphp.conf
│   │           │   ├── typecho.conf
│   │           │   ├── typecho2.conf
│   │           │   ├── wordpress.conf
│   │           │   ├── wp2.conf
│   │           │   ├── yii2.conf
│   │           │   └── zblog.conf
│   │           ├── root_ssl.conf
│   │           ├── sse.conf
│   │           ├── ssl.conf
│   │           ├── stop.html
│   │           ├── stream_default.conf
│   │           ├── upstream.conf
│   │           └── website_default.conf
│   ├── constant/
│   │   ├── alert.go
│   │   ├── app.go
│   │   ├── backup.go
│   │   ├── common.go
│   │   ├── container.go
│   │   ├── host_tool.go
│   │   ├── nginx.go
│   │   ├── runtime.go
│   │   ├── status.go
│   │   ├── task.go
│   │   └── website.go
│   ├── cron/
│   │   ├── cron.go
│   │   └── job/
│   │       ├── app.go
│   │       ├── backup.go
│   │       ├── ssl.go
│   │       └── website.go
│   ├── global/
│   │   ├── config.go
│   │   └── global.go
│   ├── go.mod
│   ├── go.sum
│   ├── i18n/
│   │   ├── i18n.go
│   │   └── lang/
│   │       ├── en.yaml
│   │       ├── es-ES.yaml
│   │       ├── ja.yaml
│   │       ├── ko.yaml
│   │       ├── ms.yaml
│   │       ├── pt-BR.yaml
│   │       ├── ru.yaml
│   │       ├── tr.yaml
│   │       ├── zh-Hant.yaml
│   │       └── zh.yaml
│   ├── init/
│   │   ├── app/
│   │   │   └── app.go
│   │   ├── business/
│   │   │   └── business.go
│   │   ├── cache/
│   │   │   ├── cache.go
│   │   │   └── db/
│   │   │       └── db.go
│   │   ├── db/
│   │   │   └── db.go
│   │   ├── dir/
│   │   │   └── dir.go
│   │   ├── firewall/
│   │   │   └── firewall.go
│   │   ├── hook/
│   │   │   └── hook.go
│   │   ├── lang/
│   │   │   └── lang.go
│   │   ├── log/
│   │   │   └── log.go
│   │   ├── migration/
│   │   │   ├── migrate.go
│   │   │   └── migrations/
│   │   │       ├── init.go
│   │   │       └── utils/
│   │   │           ├── agent_account_model_pool.go
│   │   │           ├── openclaw_agent.go
│   │   │           └── openclaw_caddyfile.go
│   │   ├── router/
│   │   │   └── router.go
│   │   ├── validator/
│   │   │   └── validator.go
│   │   └── viper/
│   │       └── viper.go
│   ├── log/
│   │   ├── config.go
│   │   ├── dup_write_darwin.go
│   │   ├── dup_write_linux.go
│   │   ├── dup_write_windows.go
│   │   ├── manager.go
│   │   └── writer.go
│   ├── middleware/
│   │   ├── certificate.go
│   │   └── operation.go
│   ├── router/
│   │   ├── backup.go
│   │   ├── common.go
│   │   ├── entry.go
│   │   ├── ro_ai.go
│   │   ├── ro_alert.go
│   │   ├── ro_app.go
│   │   ├── ro_container.go
│   │   ├── ro_cronjob.go
│   │   ├── ro_dashboard.go
│   │   ├── ro_database.go
│   │   ├── ro_file.go
│   │   ├── ro_group.go
│   │   ├── ro_host.go
│   │   ├── ro_log.go
│   │   ├── ro_nginx.go
│   │   ├── ro_process.go
│   │   ├── ro_router.go
│   │   ├── ro_runtime.go
│   │   ├── ro_setting.go
│   │   ├── ro_toolbox.go
│   │   ├── ro_website.go
│   │   ├── ro_website_acme_account.go
│   │   ├── ro_website_ca.go
│   │   ├── ro_website_dns_account.go
│   │   └── ro_website_ssl.go
│   ├── server/
│   │   ├── init.go
│   │   └── server.go
│   └── utils/
│       ├── ai_tools/
│       │   ├── gpu/
│       │   │   ├── common/
│       │   │   │   └── gpu_info.go
│       │   │   ├── gpu.go
│       │   │   └── schema/
│       │   │       ├── parser.go
│       │   │       └── types.go
│       │   └── xpu/
│       │       ├── types.go
│       │       ├── xpu.go
│       │       └── xpu_info.go
│       ├── alert/
│       │   └── alert.go
│       ├── alert_push/
│       │   └── alert_push.go
│       ├── appicon/
│       │   └── appicon.go
│       ├── clam/
│       │   └── clam.go
│       ├── cloud_storage/
│       │   ├── client/
│       │   │   ├── ali.go
│       │   │   ├── cos.go
│       │   │   ├── google_drive.go
│       │   │   ├── helper/
│       │   │   │   └── webdav/
│       │   │   │       ├── auth.go
│       │   │   │       ├── auth_basic.go
│       │   │   │       ├── auth_digest.go
│       │   │   │       ├── auth_passport.go
│       │   │   │       ├── errors.go
│       │   │   │       ├── file.go
│       │   │   │       ├── reques.go
│       │   │   │       ├── utils.go
│       │   │   │       └── webdav.go
│       │   │   ├── helper.go
│       │   │   ├── kodo.go
│       │   │   ├── local.go
│       │   │   ├── minio.go
│       │   │   ├── onedrive.go
│       │   │   ├── oss.go
│       │   │   ├── s3.go
│       │   │   ├── sftp.go
│       │   │   ├── up.go
│       │   │   └── webdav.go
│       │   └── cloud_storage_client.go
│       ├── cmd/
│       │   ├── cmd.go
│       │   └── cmdx.go
│       ├── common/
│       │   ├── common.go
│       │   └── sqlite.go
│       ├── compose/
│       │   └── compose.go
│       ├── controller/
│       │   ├── controller.go
│       │   └── manager/
│       │       ├── common.go
│       │       ├── openrc.go
│       │       ├── snap.go
│       │       ├── systemd.go
│       │       └── sysvinit.go
│       ├── convert/
│       │   └── convert.go
│       ├── copier/
│       │   └── copier.go
│       ├── csv_export/
│       │   └── ssh_log.go
│       ├── docker/
│       │   ├── compose.go
│       │   └── docker.go
│       ├── email/
│       │   └── smtp_sender.go
│       ├── encrypt/
│       │   └── encrypt.go
│       ├── env/
│       │   └── env.go
│       ├── files/
│       │   ├── archiver.go
│       │   ├── file_op.go
│       │   ├── fileinfo.go
│       │   ├── rar.go
│       │   ├── tar.go
│       │   ├── tar_gz.go
│       │   ├── utils.go
│       │   ├── x7z.go
│       │   └── zip.go
│       ├── firewall/
│       │   ├── client/
│       │   │   ├── firewalld.go
│       │   │   ├── info.go
│       │   │   ├── iptables/
│       │   │   │   ├── common.go
│       │   │   │   ├── filter.go
│       │   │   │   ├── forward.go
│       │   │   │   └── persistence.go
│       │   │   ├── iptables.go
│       │   │   └── ufw.go
│       │   └── client.go
│       ├── geo/
│       │   └── geo.go
│       ├── ini_conf/
│       │   └── ini.go
│       ├── mysql/
│       │   ├── client/
│       │   │   ├── info.go
│       │   │   ├── local.go
│       │   │   └── remote.go
│       │   └── client.go
│       ├── nginx/
│       │   ├── components/
│       │   │   ├── block.go
│       │   │   ├── comment.go
│       │   │   ├── config.go
│       │   │   ├── directive.go
│       │   │   ├── http.go
│       │   │   ├── location.go
│       │   │   ├── lua_block.go
│       │   │   ├── server.go
│       │   │   ├── server_listen.go
│       │   │   ├── statement.go
│       │   │   ├── upstream.go
│       │   │   └── upstream_server.go
│       │   ├── dumper.go
│       │   └── parser/
│       │       ├── flag/
│       │       │   └── flag.go
│       │       ├── lexer.go
│       │       └── parser.go
│       ├── ntp/
│       │   └── ntp.go
│       ├── openclaw/
│       │   └── caddyfile.go
│       ├── postgresql/
│       │   ├── client/
│       │   │   ├── info.go
│       │   │   ├── local.go
│       │   │   └── remote.go
│       │   └── client.go
│       ├── psutil/
│       │   ├── cpu.go
│       │   ├── disk.go
│       │   ├── global.go
│       │   └── host.go
│       ├── re/
│       │   └── re.go
│       ├── redis/
│       │   └── redis.go
│       ├── req_helper/
│       │   ├── core.go
│       │   └── request.go
│       ├── ssh/
│       │   └── ssh.go
│       ├── ssl/
│       │   ├── acme.go
│       │   ├── client.go
│       │   ├── dns_provider.go
│       │   └── manual_client.go
│       ├── terminal/
│       │   ├── ai/
│       │   │   ├── client.go
│       │   │   ├── command_generator.go
│       │   │   ├── config_runtime.go
│       │   │   └── validate.go
│       │   ├── ai_interceptor.go
│       │   ├── local_cmd.go
│       │   ├── ws_local_session.go
│       │   └── ws_session.go
│       ├── toolbox/
│       │   ├── fail2ban.go
│       │   ├── helper/
│       │   │   └── sha512_crypt.go
│       │   └── pure-ftpd.go
│       ├── version/
│       │   └── version.go
│       ├── websocket/
│       │   ├── client.go
│       │   └── process_data.go
│       └── xpack/
│           └── community.go
├── ci/
│   └── script.sh
├── core/
│   ├── app/
│   │   ├── api/
│   │   │   └── v2/
│   │   │       ├── auth.go
│   │   │       ├── backup.go
│   │   │       ├── command.go
│   │   │       ├── entry.go
│   │   │       ├── group.go
│   │   │       ├── helper/
│   │   │       │   └── helper.go
│   │   │       ├── logs.go
│   │   │       ├── script_library.go
│   │   │       ├── setting.go
│   │   │       └── upgrade.go
│   │   ├── dto/
│   │   │   ├── auth.go
│   │   │   ├── backup.go
│   │   │   ├── command.go
│   │   │   ├── common.go
│   │   │   ├── group.go
│   │   │   ├── logs.go
│   │   │   ├── script_library.go
│   │   │   └── setting.go
│   │   ├── model/
│   │   │   ├── agent.go
│   │   │   ├── alert.go
│   │   │   ├── backup.go
│   │   │   ├── base.go
│   │   │   ├── command.go
│   │   │   ├── group.go
│   │   │   ├── logs.go
│   │   │   ├── script_library.go
│   │   │   ├── setting.go
│   │   │   ├── task.go
│   │   │   └── upgrade_log.go
│   │   ├── repo/
│   │   │   ├── agent.go
│   │   │   ├── backup.go
│   │   │   ├── command.go
│   │   │   ├── common.go
│   │   │   ├── group.go
│   │   │   ├── logs.go
│   │   │   ├── script_library.go
│   │   │   ├── setting.go
│   │   │   ├── task.go
│   │   │   └── upgrade_log.go
│   │   ├── service/
│   │   │   ├── auth.go
│   │   │   ├── backup.go
│   │   │   ├── command.go
│   │   │   ├── entry.go
│   │   │   ├── group.go
│   │   │   ├── logs.go
│   │   │   ├── script_library.go
│   │   │   ├── setting.go
│   │   │   └── upgrade.go
│   │   └── task/
│   │       └── task.go
│   ├── buserr/
│   │   ├── errors.go
│   │   └── multi_err.go
│   ├── cmd/
│   │   └── server/
│   │       ├── app/
│   │       │   ├── app_config.go
│   │       │   ├── app_config.yml
│   │       │   └── app_param.yml
│   │       ├── cmd/
│   │       │   ├── app.go
│   │       │   ├── listen-ip.go
│   │       │   ├── reset.go
│   │       │   ├── restore.go
│   │       │   ├── root.go
│   │       │   ├── update.go
│   │       │   ├── user-info.go
│   │       │   └── version.go
│   │       ├── conf/
│   │       │   ├── app.yaml
│   │       │   └── conf.go
│   │       ├── docs/
│   │       │   ├── docs.go
│   │       │   ├── swagger.go
│   │       │   ├── swagger.json
│   │       │   ├── swagger_test.go
│   │       │   └── x-log.json
│   │       ├── main.go
│   │       ├── res/
│   │       │   ├── error_msg.go
│   │       │   └── html/
│   │       │       ├── 200.html
│   │       │       ├── 200_err_domain.html
│   │       │       ├── 200_err_ip_limit.html
│   │       │       ├── 400.html
│   │       │       ├── 401.html
│   │       │       ├── 403.html
│   │       │       ├── 404.html
│   │       │       ├── 408.html
│   │       │       ├── 416.html
│   │       │       └── 500.html
│   │       └── web/
│   │           ├── static/
│   │           │   ├── china.json
│   │           │   └── world.json
│   │           └── web.go
│   ├── constant/
│   │   ├── alert.go
│   │   ├── common.go
│   │   ├── session.go
│   │   └── status.go
│   ├── deps/
│   │   └── keepdeps.go
│   ├── global/
│   │   ├── config.go
│   │   └── global.go
│   ├── go.mod
│   ├── go.sum
│   ├── i18n/
│   │   ├── i18n.go
│   │   └── lang/
│   │       ├── en.yaml
│   │       ├── es-ES.yaml
│   │       ├── ja.yaml
│   │       ├── ko.yaml
│   │       ├── ms.yaml
│   │       ├── pt-BR.yaml
│   │       ├── ru.yaml
│   │       ├── tr.yaml
│   │       ├── zh-Hant.yaml
│   │       └── zh.yaml
│   ├── init/
│   │   ├── auth/
│   │   │   └── ip_tracker.go
│   │   ├── cron/
│   │   │   ├── cron.go
│   │   │   └── job/
│   │   │       └── backup.go
│   │   ├── db/
│   │   │   └── db.go
│   │   ├── geo/
│   │   │   └── lang.go
│   │   ├── hook/
│   │   │   └── hook.go
│   │   ├── log/
│   │   │   └── log.go
│   │   ├── migration/
│   │   │   ├── helper/
│   │   │   │   └── menu.go
│   │   │   ├── migrate.go
│   │   │   └── migrations/
│   │   │       └── init.go
│   │   ├── proxy/
│   │   │   └── proxy.go
│   │   ├── router/
│   │   │   ├── proxy.go
│   │   │   └── router.go
│   │   ├── run/
│   │   │   └── run.go
│   │   ├── session/
│   │   │   ├── psession/
│   │   │   │   └── psession.go
│   │   │   └── session.go
│   │   ├── swagger/
│   │   │   └── swag.go
│   │   ├── validator/
│   │   │   └── validator.go
│   │   └── viper/
│   │       └── viper.go
│   ├── log/
│   │   ├── config.go
│   │   ├── dup_write_darwin.go
│   │   ├── dup_write_linux.go
│   │   ├── dup_write_windows.go
│   │   ├── manager.go
│   │   └── writer.go
│   ├── middleware/
│   │   ├── api_auth.go
│   │   ├── bind_domain.go
│   │   ├── demo_handle.go
│   │   ├── helper.go
│   │   ├── ip_limit.go
│   │   ├── loading.go
│   │   ├── operation.go
│   │   ├── password_expired.go
│   │   ├── password_rsa.go
│   │   └── session.go
│   ├── router/
│   │   ├── command.go
│   │   ├── common.go
│   │   ├── entry.go
│   │   ├── ro_backup.go
│   │   ├── ro_base.go
│   │   ├── ro_group.go
│   │   ├── ro_log.go
│   │   ├── ro_router.go
│   │   ├── ro_script_library.go
│   │   └── ro_setting.go
│   ├── server/
│   │   ├── init.go
│   │   └── server.go
│   └── utils/
│       ├── captcha/
│       │   └── captcha.go
│       ├── cloud_storage/
│       │   └── refresh_token.go
│       ├── cmd/
│       │   ├── cmd.go
│       │   └── cmdx.go
│       ├── common/
│       │   ├── common.go
│       │   └── sqlite.go
│       ├── controller/
│       │   ├── controller.go
│       │   └── manager/
│       │       ├── common.go
│       │       ├── openrc.go
│       │       ├── snap.go
│       │       ├── systemd.go
│       │       └── sysvinit.go
│       ├── copier/
│       │   └── copier.go
│       ├── csv/
│       │   └── command.go
│       ├── encrypt/
│       │   └── encrypt.go
│       ├── files/
│       │   └── files.go
│       ├── firewall/
│       │   └── firewall.go
│       ├── geo/
│       │   └── geo.go
│       ├── mfa/
│       │   └── mfa.go
│       ├── passkey/
│       │   ├── passkey_record.go
│       │   ├── passkey_store.go
│       │   └── passkey_user.go
│       ├── re/
│       │   └── re.go
│       ├── req_helper/
│       │   ├── proxy_local/
│       │   │   └── req_to_local.go
│       │   └── requset.go
│       ├── security/
│       │   └── security.go
│       ├── ssh/
│       │   ├── http.go
│       │   └── ssh.go
│       ├── terminal/
│       │   ├── local_cmd.go
│       │   ├── ws_local_session.go
│       │   └── ws_session.go
│       └── xpack/
│           └── community.go
├── docs/
│   ├── README.ar.md
│   ├── README.de.md
│   ├── README.es-es.md
│   ├── README.fr.md
│   ├── README.id.md
│   ├── README.ja.md
│   ├── README.ko.md
│   ├── README.ms.md
│   ├── README.pt-br.md
│   ├── README.ru.md
│   ├── README.tr.md
│   ├── README.zh-Hans.md
│   └── README.zh-Hant.md
├── frontend/
│   ├── .editorconfig
│   ├── .eslintignore
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .prettierignore
│   ├── .prettierrc.js
│   ├── index.html
│   ├── lint-staged.config.js
│   ├── package.json
│   ├── postcss.config.cjs
│   ├── src/
│   │   ├── App.vue
│   │   ├── api/
│   │   │   ├── config/
│   │   │   │   └── service-port.ts
│   │   │   ├── helper/
│   │   │   │   ├── axios-cancel.ts
│   │   │   │   └── check-status.ts
│   │   │   ├── index.ts
│   │   │   ├── interface/
│   │   │   │   ├── ai.ts
│   │   │   │   ├── alert.ts
│   │   │   │   ├── app.ts
│   │   │   │   ├── auth.ts
│   │   │   │   ├── backup.ts
│   │   │   │   ├── command.ts
│   │   │   │   ├── container.ts
│   │   │   │   ├── cronjob.ts
│   │   │   │   ├── dashboard.ts
│   │   │   │   ├── database.ts
│   │   │   │   ├── file.ts
│   │   │   │   ├── group.ts
│   │   │   │   ├── host-tool.ts
│   │   │   │   ├── host.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── log.ts
│   │   │   │   ├── nginx.ts
│   │   │   │   ├── process.ts
│   │   │   │   ├── runtime.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── terminal.ts
│   │   │   │   ├── toolbox.ts
│   │   │   │   └── website.ts
│   │   │   └── modules/
│   │   │       ├── ai.ts
│   │   │       ├── alert.ts
│   │   │       ├── app.ts
│   │   │       ├── auth.ts
│   │   │       ├── backup.ts
│   │   │       ├── command.ts
│   │   │       ├── container.ts
│   │   │       ├── cronjob.ts
│   │   │       ├── dashboard.ts
│   │   │       ├── database.ts
│   │   │       ├── files.ts
│   │   │       ├── group.ts
│   │   │       ├── host-tool.ts
│   │   │       ├── host.ts
│   │   │       ├── log.ts
│   │   │       ├── nginx.ts
│   │   │       ├── process.ts
│   │   │       ├── runtime.ts
│   │   │       ├── setting.ts
│   │   │       ├── terminal.ts
│   │   │       ├── toolbox.ts
│   │   │       └── website.ts
│   │   ├── assets/
│   │   │   ├── iconfont/
│   │   │   │   ├── iconfont.css
│   │   │   │   ├── iconfont.js
│   │   │   │   └── iconfont.json
│   │   │   └── json/
│   │   │       └── iso.json
│   │   ├── components/
│   │   │   ├── advanced-setting/
│   │   │   │   └── index.vue
│   │   │   ├── agent-group/
│   │   │   │   ├── change.vue
│   │   │   │   └── index.vue
│   │   │   ├── app-status/
│   │   │   │   └── index.vue
│   │   │   ├── back-button/
│   │   │   │   └── index.vue
│   │   │   ├── backup/
│   │   │   │   └── index.vue
│   │   │   ├── card-with-header/
│   │   │   │   └── index.vue
│   │   │   ├── codemirror-pro/
│   │   │   │   ├── drawer.vue
│   │   │   │   ├── index.vue
│   │   │   │   └── nginx.ts
│   │   │   ├── complex-table/
│   │   │   │   └── index.vue
│   │   │   ├── config-card/
│   │   │   │   └── index.vue
│   │   │   ├── confirm-dialog/
│   │   │   │   └── index.vue
│   │   │   ├── copy-button/
│   │   │   │   └── index.vue
│   │   │   ├── del-dialog/
│   │   │   │   └── index.vue
│   │   │   ├── detail-show/
│   │   │   │   └── index.vue
│   │   │   ├── dialog-pro/
│   │   │   │   └── index.vue
│   │   │   ├── docker-proxy/
│   │   │   │   ├── dialog.vue
│   │   │   │   ├── docker-restart.vue
│   │   │   │   └── index.vue
│   │   │   ├── drawer-pro/
│   │   │   │   └── index.vue
│   │   │   ├── error-message/
│   │   │   │   ├── 404.vue
│   │   │   │   ├── err_domain.vue
│   │   │   │   ├── err_ip.vue
│   │   │   │   ├── error_code.vue
│   │   │   │   └── unsafe.vue
│   │   │   ├── error-prompt/
│   │   │   │   └── index.vue
│   │   │   ├── exist-file/
│   │   │   │   └── index.vue
│   │   │   ├── file-list/
│   │   │   │   └── index.vue
│   │   │   ├── file-role/
│   │   │   │   └── index.vue
│   │   │   ├── group/
│   │   │   │   └── index.vue
│   │   │   ├── index.ts
│   │   │   ├── input-tag/
│   │   │   │   └── index.vue
│   │   │   ├── layout-col/
│   │   │   │   └── form.vue
│   │   │   ├── layout-content/
│   │   │   │   ├── form-button.vue
│   │   │   │   ├── index.vue
│   │   │   │   └── no-such-service.vue
│   │   │   ├── license-import/
│   │   │   │   └── index.vue
│   │   │   ├── log/
│   │   │   │   ├── compose/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── container/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── container-drawer/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── custom-hightlight/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── file/
│   │   │   │   │   └── index.vue
│   │   │   │   ├── file-drawer/
│   │   │   │   │   └── index.vue
│   │   │   │   └── task/
│   │   │   │       ├── index.vue
│   │   │   │       └── log-without-dialog.vue
│   │   │   ├── main-div/
│   │   │   │   └── index.vue
│   │   │   ├── mkdown-editor/
│   │   │   │   └── index.vue
│   │   │   ├── msg-info/
│   │   │   │   └── index.vue
│   │   │   ├── node-select/
│   │   │   │   └── index.vue
│   │   │   ├── port-jump/
│   │   │   │   └── index.vue
│   │   │   ├── router-button/
│   │   │   │   └── index.vue
│   │   │   ├── status/
│   │   │   │   └── index.vue
│   │   │   ├── svg-icon/
│   │   │   │   └── svg-icon.vue
│   │   │   ├── system-upgrade/
│   │   │   │   ├── index.vue
│   │   │   │   ├── releases/
│   │   │   │   │   └── index.vue
│   │   │   │   └── upgrade/
│   │   │   │       └── index.vue
│   │   │   ├── table-refresh/
│   │   │   │   └── index.vue
│   │   │   ├── table-search/
│   │   │   │   └── index.vue
│   │   │   ├── table-setting/
│   │   │   │   └── index.vue
│   │   │   ├── task-list/
│   │   │   │   └── index.vue
│   │   │   ├── terminal/
│   │   │   │   ├── database.vue
│   │   │   │   └── index.vue
│   │   │   ├── tooltip/
│   │   │   │   └── index.vue
│   │   │   ├── upload/
│   │   │   │   └── index.vue
│   │   │   ├── v-charts/
│   │   │   │   ├── components/
│   │   │   │   │   ├── Line.vue
│   │   │   │   │   └── Pie.vue
│   │   │   │   └── index.vue
│   │   │   └── vscode-open/
│   │   │       └── index.vue
│   │   ├── composables/
│   │   │   └── useGlobalStore.ts
│   │   ├── config/
│   │   │   ├── nprogress.ts
│   │   │   └── pinia-persist.ts
│   │   ├── directives/
│   │   │   ├── index.ts
│   │   │   └── modules/
│   │   │       └── integer.ts
│   │   ├── enums/
│   │   │   ├── app.ts
│   │   │   ├── files.ts
│   │   │   └── http-enum.ts
│   │   ├── env.d.ts
│   │   ├── global/
│   │   │   ├── bus.ts
│   │   │   ├── form-rules.ts
│   │   │   ├── mimetype.ts
│   │   │   ├── use-logo.ts
│   │   │   └── use-theme.ts
│   │   ├── lang/
│   │   │   ├── index.ts
│   │   │   └── modules/
│   │   │       ├── en.ts
│   │   │       ├── es-es.ts
│   │   │       ├── ja.ts
│   │   │       ├── ko.ts
│   │   │       ├── ms.ts
│   │   │       ├── pt-br.ts
│   │   │       ├── ru.ts
│   │   │       ├── tr.ts
│   │   │       ├── zh-Hant.ts
│   │   │       └── zh.ts
│   │   ├── layout/
│   │   │   ├── components/
│   │   │   │   ├── AppFooter.vue
│   │   │   │   ├── AppMain.vue
│   │   │   │   ├── MobileHeader.vue
│   │   │   │   ├── Sidebar/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   ├── Collapse.vue
│   │   │   │   │   │   ├── Logo.vue
│   │   │   │   │   │   └── SubItem.vue
│   │   │   │   │   ├── index.scss
│   │   │   │   │   └── index.vue
│   │   │   │   ├── Tabs/
│   │   │   │   │   ├── components/
│   │   │   │   │   │   └── TabItem.vue
│   │   │   │   │   └── index.vue
│   │   │   │   └── index.ts
│   │   │   ├── hooks/
│   │   │   │   └── useResize.ts
│   │   │   └── index.vue
│   │   ├── main.ts
│   │   ├── routers/
│   │   │   ├── cache-router.ts
│   │   │   ├── constant.ts
│   │   │   ├── index.ts
│   │   │   ├── modules/
│   │   │   │   ├── ai.ts
│   │   │   │   ├── app-store.ts
│   │   │   │   ├── container.ts
│   │   │   │   ├── cronjob.ts
│   │   │   │   ├── database.ts
│   │   │   │   ├── error.ts
│   │   │   │   ├── host.ts
│   │   │   │   ├── log.ts
│   │   │   │   ├── setting.ts
│   │   │   │   ├── terminal.ts
│   │   │   │   ├── toolbox.ts
│   │   │   │   └── website.ts
│   │   │   └── router.ts
│   │   ├── store/
│   │   │   ├── index.ts
│   │   │   ├── interface/
│   │   │   │   └── index.ts
│   │   │   └── modules/
│   │   │       ├── global.ts
│   │   │       ├── menu.ts
│   │   │       ├── process.ts
│   │   │       ├── tabs.ts
│   │   │       └── terminal.ts
│   │   ├── styles/
│   │   │   ├── common.scss
│   │   │   ├── element-dark.scss
│   │   │   ├── element.scss
│   │   │   ├── index.scss
│   │   │   ├── mixins.scss
│   │   │   ├── moblie.scss
│   │   │   ├── reset.scss
│   │   │   ├── style.css
│   │   │   └── var.scss
│   │   ├── typings/
│   │   │   ├── global.d.ts
│   │   │   ├── plugins.d.ts
│   │   │   └── window.d.ts
│   │   ├── utils/
│   │   │   ├── agent.ts
│   │   │   ├── app.ts
│   │   │   ├── bus.ts
│   │   │   ├── dashboardCache.ts
│   │   │   ├── docker.ts
│   │   │   ├── echarts.ts
│   │   │   ├── get-env.ts
│   │   │   ├── message.ts
│   │   │   ├── node.ts
│   │   │   ├── router.ts
│   │   │   ├── runtime.ts
│   │   │   ├── shortcuts.ts
│   │   │   ├── svg.ts
│   │   │   ├── theme.ts
│   │   │   ├── util.ts
│   │   │   ├── version.ts
│   │   │   └── xpack.ts
│   │   └── views/
│   │       ├── ai/
│   │       │   ├── agents/
│   │       │   │   ├── agent/
│   │       │   │   │   ├── add/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── components/
│   │       │   │   │   │   └── terminal.vue
│   │       │   │   │   ├── config/
│   │       │   │   │   │   ├── index.vue
│   │       │   │   │   │   └── tabs/
│   │       │   │   │   │       ├── channels/
│   │       │   │   │   │       │   ├── dingtalk.vue
│   │       │   │   │   │       │   ├── discord.vue
│   │       │   │   │   │       │   ├── feishu.vue
│   │       │   │   │   │       │   ├── qq.vue
│   │       │   │   │   │       │   ├── telegram.vue
│   │       │   │   │   │       │   └── wecom.vue
│   │       │   │   │   │       ├── channels.vue
│   │       │   │   │   │       ├── model.vue
│   │       │   │   │   │       ├── settings/
│   │       │   │   │   │       │   ├── other.vue
│   │       │   │   │   │       │   └── security.vue
│   │       │   │   │   │       └── settings.vue
│   │       │   │   │   ├── delete/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── model/
│   │       │   │       ├── add/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── index.vue
│   │       │   │       └── pool/
│   │       │   │           └── index.vue
│   │       │   ├── gpu/
│   │       │   │   ├── current/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── history/
│   │       │   │   │   └── index.vue
│   │       │   │   └── index.vue
│   │       │   ├── mcp/
│   │       │   │   ├── index.vue
│   │       │   │   └── server/
│   │       │   │       ├── bind/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── config/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── import/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── index.vue
│   │       │   │       ├── operate/
│   │       │   │       │   └── index.vue
│   │       │   │       └── volume/
│   │       │   │           └── index.vue
│   │       │   └── model/
│   │       │       ├── index.vue
│   │       │       ├── ollama/
│   │       │       │   ├── add/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── conn/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── del/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── domain/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── index.vue
│   │       │       │   └── terminal/
│   │       │       │       └── index.vue
│   │       │       ├── router-menu.vue
│   │       │       ├── tensorrt/
│   │       │       │   ├── index.vue
│   │       │       │   └── operate/
│   │       │       │       └── index.vue
│   │       │       └── vllm/
│   │       │           └── index.vue
│   │       ├── app-store/
│   │       │   ├── apps/
│   │       │   │   ├── app/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── no-app/
│   │       │   │       └── index.vue
│   │       │   ├── components/
│   │       │   │   └── tag.vue
│   │       │   ├── detail/
│   │       │   │   ├── form/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── install/
│   │       │   │   │   └── index.vue
│   │       │   │   └── params/
│   │       │   │       └── index.vue
│   │       │   ├── index.scss
│   │       │   ├── index.vue
│   │       │   ├── installed/
│   │       │   │   ├── app/
│   │       │   │   │   ├── card.vue
│   │       │   │   │   ├── header.vue
│   │       │   │   │   ├── icon.vue
│   │       │   │   │   └── info.vue
│   │       │   │   ├── check/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── detail/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── ignore/
│   │       │   │   │   ├── create/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── upgrade/
│   │       │   │       ├── diff/
│   │       │   │       │   └── index.vue
│   │       │   │       └── index.vue
│   │       │   └── setting/
│   │       │       └── index.vue
│   │       ├── container/
│   │       │   ├── compose/
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   └── index.vue
│   │       │   ├── container/
│   │       │   │   ├── commit/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── file-browser/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── inspect/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── monitor/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── operate/
│   │       │   │   │   ├── confirm.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   ├── network.vue
│   │       │   │   │   └── volume.vue
│   │       │   │   ├── prune/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── rename/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── terminal/
│   │       │   │   │   └── index.vue
│   │       │   │   └── upgrade/
│   │       │   │       └── index.vue
│   │       │   ├── dashboard/
│   │       │   │   └── index.vue
│   │       │   ├── docker-status/
│   │       │   │   └── index.vue
│   │       │   ├── image/
│   │       │   │   ├── build/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── load/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── prune/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── pull/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── push/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── save/
│   │       │   │   │   └── index.vue
│   │       │   │   └── tag/
│   │       │   │       └── index.vue
│   │       │   ├── index.vue
│   │       │   ├── network/
│   │       │   │   ├── create/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── detail/
│   │       │   │   │   └── index.vue
│   │       │   │   └── index.vue
│   │       │   ├── repo/
│   │       │   │   ├── index.vue
│   │       │   │   └── operator/
│   │       │   │       └── index.vue
│   │       │   ├── setting/
│   │       │   │   ├── index.vue
│   │       │   │   ├── ipv6/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── log/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── mirror/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── registry/
│   │       │   │   │   └── index.vue
│   │       │   │   └── sock-path/
│   │       │   │       └── index.vue
│   │       │   ├── template/
│   │       │   │   ├── detail/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── import/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── operator/
│   │       │   │       └── index.vue
│   │       │   └── volume/
│   │       │       ├── create/
│   │       │       │   └── index.vue
│   │       │       └── index.vue
│   │       ├── cronjob/
│   │       │   ├── cronjob/
│   │       │   │   ├── backup/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── config/
│   │       │   │   │   └── clean-log.vue
│   │       │   │   ├── helper.ts
│   │       │   │   ├── import/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── operate/
│   │       │   │   │   └── index.vue
│   │       │   │   └── record/
│   │       │   │       └── index.vue
│   │       │   ├── index.vue
│   │       │   └── library/
│   │       │       ├── index.vue
│   │       │       ├── operate/
│   │       │       │   └── index.vue
│   │       │       └── run/
│   │       │           └── index.vue
│   │       ├── database/
│   │       │   ├── index.vue
│   │       │   ├── mysql/
│   │       │   │   ├── bind/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── check/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── conn/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── create/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── password/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── remote/
│   │       │   │   │   ├── delete/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   └── setting/
│   │       │   │       ├── helper.ts
│   │       │   │       ├── index.vue
│   │       │   │       ├── slow-log/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── status/
│   │       │   │       │   └── index.vue
│   │       │   │       └── variables/
│   │       │   │           └── index.vue
│   │       │   ├── postgresql/
│   │       │   │   ├── bind/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── check/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── conn/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── create/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── password/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── privileges/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── remote/
│   │       │   │   │   ├── delete/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   └── setting/
│   │       │   │       └── index.vue
│   │       │   └── redis/
│   │       │       ├── check/
│   │       │       │   └── index.vue
│   │       │       ├── command/
│   │       │       │   └── index.vue
│   │       │       ├── conn/
│   │       │       │   └── index.vue
│   │       │       ├── index.vue
│   │       │       ├── remote/
│   │       │       │   ├── delete/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── index.vue
│   │       │       │   └── operate/
│   │       │       │       └── index.vue
│   │       │       └── setting/
│   │       │           ├── index.vue
│   │       │           ├── persistence/
│   │       │           │   └── index.vue
│   │       │           └── status/
│   │       │               └── index.vue
│   │       ├── home/
│   │       │   ├── app/
│   │       │   │   └── index.vue
│   │       │   ├── index.vue
│   │       │   ├── quick/
│   │       │   │   └── index.vue
│   │       │   └── status/
│   │       │       └── index.vue
│   │       ├── host/
│   │       │   ├── disk-management/
│   │       │   │   ├── components/
│   │       │   │   │   └── disk-card.vue
│   │       │   │   ├── disk/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── partition/
│   │       │   │       └── index.vue
│   │       │   ├── file-management/
│   │       │   │   ├── batch-role/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── change-role/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── chown/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── code-editor/
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── tabs/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── compress/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── convert/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── create/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── decompress/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── delete/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── detail/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── download/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── favorite/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── hooks/
│   │       │   │   │   └── searchable.ts
│   │       │   │   ├── index.vue
│   │       │   │   ├── move/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── preview/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── process/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── recycle-bin/
│   │       │   │   │   ├── delete/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── reduce/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── rename/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── terminal/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── text-preview/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── upload/
│   │       │   │   │   └── index.vue
│   │       │   │   └── wget/
│   │       │   │       └── index.vue
│   │       │   ├── firewall/
│   │       │   │   ├── advance/
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── forward/
│   │       │   │   │   ├── import/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── ip/
│   │       │   │   │   ├── import/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── port/
│   │       │   │   │   ├── import/
│   │       │   │   │   │   └── index.vue
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── operate/
│   │       │   │   │       └── index.vue
│   │       │   │   └── status/
│   │       │   │       └── index.vue
│   │       │   ├── monitor/
│   │       │   │   ├── index.vue
│   │       │   │   ├── monitor/
│   │       │   │   │   └── index.vue
│   │       │   │   └── setting/
│   │       │   │       ├── days/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── default-io/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── default-network/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── index.vue
│   │       │   │       └── interval/
│   │       │   │           └── index.vue
│   │       │   ├── process/
│   │       │   │   ├── index.vue
│   │       │   │   ├── network/
│   │       │   │   │   └── index.vue
│   │       │   │   └── process/
│   │       │   │       ├── detail/
│   │       │   │       │   └── index.vue
│   │       │   │       └── index.vue
│   │       │   └── ssh/
│   │       │       ├── index.vue
│   │       │       ├── log/
│   │       │       │   ├── index.vue
│   │       │       │   └── log.vue
│   │       │       ├── session/
│   │       │       │   └── index.vue
│   │       │       └── ssh/
│   │       │           ├── address/
│   │       │           │   └── index.vue
│   │       │           ├── auth-keys/
│   │       │           │   └── index.vue
│   │       │           ├── certification/
│   │       │           │   ├── index.vue
│   │       │           │   └── operate/
│   │       │           │       └── index.vue
│   │       │           ├── index.vue
│   │       │           ├── port/
│   │       │           │   └── index.vue
│   │       │           └── root/
│   │       │               └── index.vue
│   │       ├── log/
│   │       │   ├── index.vue
│   │       │   ├── login/
│   │       │   │   └── index.vue
│   │       │   ├── operation/
│   │       │   │   └── index.vue
│   │       │   ├── router/
│   │       │   │   └── index.vue
│   │       │   ├── system/
│   │       │   │   └── index.vue
│   │       │   ├── task/
│   │       │   │   └── index.vue
│   │       │   └── website/
│   │       │       └── index.vue
│   │       ├── login/
│   │       │   ├── components/
│   │       │   │   └── login-form.vue
│   │       │   └── index.vue
│   │       ├── setting/
│   │       │   ├── about/
│   │       │   │   └── index.vue
│   │       │   ├── alert/
│   │       │   │   ├── dash/
│   │       │   │   │   ├── index.vue
│   │       │   │   │   └── task/
│   │       │   │   │       └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── log/
│   │       │   │   │   └── index.vue
│   │       │   │   └── setting/
│   │       │   │       ├── email/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── index.vue
│   │       │   │       ├── phone/
│   │       │   │       │   └── index.vue
│   │       │   │       ├── time-range/
│   │       │   │       │   └── index.vue
│   │       │   │       └── webhook/
│   │       │   │           └── index.vue
│   │       │   ├── backup-account/
│   │       │   │   ├── helper.ts
│   │       │   │   ├── index.vue
│   │       │   │   └── operate/
│   │       │   │       └── index.vue
│   │       │   ├── expired.vue
│   │       │   ├── index.vue
│   │       │   ├── license/
│   │       │   │   ├── bind/
│   │       │   │   │   ├── free.vue
│   │       │   │   │   └── xpack.vue
│   │       │   │   └── index.vue
│   │       │   ├── panel/
│   │       │   │   ├── api-interface/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── edition/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── hidemenu/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── name/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── password/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── proxy/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── systemip/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── theme-color/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── timeout/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── username/
│   │       │   │   │   └── index.vue
│   │       │   │   └── watermark/
│   │       │   │       └── index.vue
│   │       │   ├── safe/
│   │       │   │   ├── allowips/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── bind/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── domain/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── entrance/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── mfa/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── passkey/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── port/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── response/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── ssl/
│   │       │   │   │   └── index.vue
│   │       │   │   └── timeout/
│   │       │   │       └── index.vue
│   │       │   └── snapshot/
│   │       │       ├── create/
│   │       │       │   └── index.vue
│   │       │       ├── import/
│   │       │       │   └── index.vue
│   │       │       ├── index.vue
│   │       │       ├── recover/
│   │       │       │   └── index.vue
│   │       │       └── status/
│   │       │           └── index.vue
│   │       ├── terminal/
│   │       │   ├── command/
│   │       │   │   ├── import/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── operate/
│   │       │   │       └── index.vue
│   │       │   ├── host/
│   │       │   │   ├── index.vue
│   │       │   │   └── operate/
│   │       │   │       └── index.vue
│   │       │   ├── index.vue
│   │       │   ├── setting/
│   │       │   │   ├── ai/
│   │       │   │   │   ├── helper.ts
│   │       │   │   │   └── index.vue
│   │       │   │   ├── default_conn/
│   │       │   │   │   └── index.vue
│   │       │   │   └── index.vue
│   │       │   └── terminal/
│   │       │       ├── host-create.vue
│   │       │       └── index.vue
│   │       ├── toolbox/
│   │       │   ├── clam/
│   │       │   │   ├── index.vue
│   │       │   │   ├── operate/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── record/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── setting/
│   │       │   │   │   └── index.vue
│   │       │   │   └── status/
│   │       │   │       └── index.vue
│   │       │   ├── clean/
│   │       │   │   └── index.vue
│   │       │   ├── device/
│   │       │   │   ├── dns/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── hostname/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── hosts/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── ntp/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── passwd/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── swap/
│   │       │   │   │   └── index.vue
│   │       │   │   └── time-zone/
│   │       │   │       └── index.vue
│   │       │   ├── fail2ban/
│   │       │   │   ├── ban-action/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── ban-time/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── find-time/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── ips/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── log-path/
│   │       │   │   │   └── index.vue
│   │       │   │   ├── max-retry/
│   │       │   │   │   └── index.vue
│   │       │   │   └── port/
│   │       │   │       └── index.vue
│   │       │   ├── ftp/
│   │       │   │   ├── index.vue
│   │       │   │   ├── log/
│   │       │   │   │   └── index.vue
│   │       │   │   └── operate/
│   │       │   │       └── index.vue
│   │       │   ├── index.vue
│   │       │   └── supervisor/
│   │       │       ├── config/
│   │       │       │   ├── basic/
│   │       │       │   │   └── index.vue
│   │       │       │   ├── index.vue
│   │       │       │   └── source/
│   │       │       │       └── index.vue
│   │       │       ├── create/
│   │       │       │   └── index.vue
│   │       │       ├── file/
│   │       │       │   └── index.vue
│   │       │       ├── index.vue
│   │       │       ├── log/
│   │       │       │   └── index.vue
│   │       │       └── status/
│   │       │           ├── index.vue
│   │       │           └── init/
│   │       │               └── index.vue
│   │       └── website/
│   │           ├── runtime/
│   │           │   ├── app/
│   │           │   │   └── index.vue
│   │           │   ├── common/
│   │           │   │   └── utils.ts
│   │           │   ├── components/
│   │           │   │   ├── dir/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── environment/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── extra_hosts/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── node-config.vue
│   │           │   │   ├── port/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── port-jump.vue
│   │           │   │   ├── runtime-status.vue
│   │           │   │   ├── terminal.vue
│   │           │   │   └── volume/
│   │           │   │       └── index.vue
│   │           │   ├── delete/
│   │           │   │   └── index.vue
│   │           │   ├── dotnet/
│   │           │   │   ├── index.vue
│   │           │   │   └── operate/
│   │           │   │       └── index.vue
│   │           │   ├── go/
│   │           │   │   ├── index.vue
│   │           │   │   └── operate/
│   │           │   │       └── index.vue
│   │           │   ├── index.vue
│   │           │   ├── java/
│   │           │   │   ├── index.vue
│   │           │   │   └── operate/
│   │           │   │       └── index.vue
│   │           │   ├── node/
│   │           │   │   ├── index.vue
│   │           │   │   ├── module/
│   │           │   │   │   └── index.vue
│   │           │   │   └── operate/
│   │           │   │       └── index.vue
│   │           │   ├── php/
│   │           │   │   ├── check/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── config/
│   │           │   │   │   ├── config/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── container/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── fpm-status/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── function/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── index.vue
│   │           │   │   │   ├── performance/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── php-fpm/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── slow-log/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   ├── timeout/
│   │           │   │   │   │   └── index.vue
│   │           │   │   │   └── upload/
│   │           │   │   │       └── index.vue
│   │           │   │   ├── create/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── extension-management/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── extension-template/
│   │           │   │   │   ├── index.vue
│   │           │   │   │   └── operate/
│   │           │   │   │       └── index.vue
│   │           │   │   ├── index.vue
│   │           │   │   └── supervisor/
│   │           │   │       ├── create/
│   │           │   │       │   └── index.vue
│   │           │   │       ├── file/
│   │           │   │       │   └── index.vue
│   │           │   │       └── index.vue
│   │           │   └── python/
│   │           │       ├── index.vue
│   │           │       └── operate/
│   │           │           └── index.vue
│   │           ├── ssl/
│   │           │   ├── acme-account/
│   │           │   │   ├── create/
│   │           │   │   │   └── index.vue
│   │           │   │   └── index.vue
│   │           │   ├── apply/
│   │           │   │   └── index.vue
│   │           │   ├── ca/
│   │           │   │   ├── create/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── detail/
│   │           │   │   │   └── index.vue
│   │           │   │   ├── index.vue
│   │           │   │   └── obtain/
│   │           │   │       └── index.vue
│   │           │   ├── create/
│   │           │   │   └── index.vue
│   │           │   ├── detail/
│   │           │   │   └── index.vue
│   │           │   ├── dns-account/
│   │           │   │   ├── create/
│   │           │   │   │   └── index.vue
│   │           │   │   └── index.vue
│   │           │   ├── index.vue
│   │           │   ├── obtain/
│   │           │   │   └── index.vue
│   │           │   └── upload/
│   │           │       └── index.vue
│   │           └── website/
│   │               ├── batch-op/
│   │               │   ├── group.vue
│   │               │   └── https.vue
│   │               ├── check/
│   │               │   └── index.vue
│   │               ├── components/
│   │               │   ├── group/
│   │               │   │   └── index.vue
│   │               │   ├── https/
│   │               │   │   └── index.vue
│   │               │   └── website-ssl/
│   │               │       └── index.vue
│   │               ├── config/
│   │               │   ├── basic/
│   │               │   │   ├── anti-Leech/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── auth-basic/
│   │               │   │   │   ├── create/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── cors/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── default-doc/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── domain/
│   │               │   │   │   ├── create/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── https/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── index.vue
│   │               │   │   ├── limit-conn/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── load-balance/
│   │               │   │   │   ├── file/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── form/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── index.vue
│   │               │   │   │   └── operate/
│   │               │   │   │       └── index.vue
│   │               │   │   ├── other/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── php/
│   │               │   │   │   ├── composer/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── proxy/
│   │               │   │   │   ├── cache/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── create/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── file/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── real-ip/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── redirect/
│   │               │   │   │   ├── create/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   ├── file/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── resource/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── rewrite/
│   │               │   │   │   ├── custom/
│   │               │   │   │   │   └── index.vue
│   │               │   │   │   └── index.vue
│   │               │   │   ├── site-folder/
│   │               │   │   │   └── index.vue
│   │               │   │   └── stream/
│   │               │   │       └── index.vue
│   │               │   ├── index.vue
│   │               │   ├── log/
│   │               │   │   ├── index.vue
│   │               │   │   └── log-fiile/
│   │               │   │       └── index.vue
│   │               │   └── resource/
│   │               │       ├── index.vue
│   │               │       └── nginx/
│   │               │           └── index.vue
│   │               ├── cors/
│   │               │   └── index.vue
│   │               ├── create/
│   │               │   ├── index.vue
│   │               │   └── site-alert/
│   │               │       └── index.vue
│   │               ├── default/
│   │               │   └── index.vue
│   │               ├── delete/
│   │               │   └── index.vue
│   │               ├── domain/
│   │               │   └── index.vue
│   │               ├── domain-create/
│   │               │   └── index.vue
│   │               ├── html/
│   │               │   └── index.vue
│   │               ├── index.vue
│   │               ├── nginx/
│   │               │   ├── index.vue
│   │               │   ├── module/
│   │               │   │   ├── build/
│   │               │   │   │   └── index.vue
│   │               │   │   ├── index.vue
│   │               │   │   └── operate/
│   │               │   │       └── index.vue
│   │               │   ├── other/
│   │               │   │   ├── https/
│   │               │   │   │   └── index.vue
│   │               │   │   └── index.vue
│   │               │   ├── performance/
│   │               │   │   └── index.vue
│   │               │   ├── source/
│   │               │   │   └── index.vue
│   │               │   └── status/
│   │               │       └── index.vue
│   │               └── status/
│   │                   └── index.vue
│   ├── tailwind.config.js
│   ├── tsconfig.json
│   ├── vite-env.d.ts
│   └── vite.config.ts
└── sonar-project.properties
Download .txt
Showing preview only (628K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7280 symbols across 692 files)

FILE: agent/app/api/v2/agents.go
  method CreateAgent (line 17) | func (b *BaseApi) CreateAgent(c *gin.Context) {
  method PageAgents (line 38) | func (b *BaseApi) PageAgents(c *gin.Context) {
  method DeleteAgent (line 62) | func (b *BaseApi) DeleteAgent(c *gin.Context) {
  method ResetAgentToken (line 82) | func (b *BaseApi) ResetAgentToken(c *gin.Context) {
  method UpdateAgentModelConfig (line 102) | func (b *BaseApi) UpdateAgentModelConfig(c *gin.Context) {
  method GetAgentProviders (line 120) | func (b *BaseApi) GetAgentProviders(c *gin.Context) {
  method CreateAgentAccount (line 137) | func (b *BaseApi) CreateAgentAccount(c *gin.Context) {
  method UpdateAgentAccount (line 157) | func (b *BaseApi) UpdateAgentAccount(c *gin.Context) {
  method PageAgentAccounts (line 177) | func (b *BaseApi) PageAgentAccounts(c *gin.Context) {
  method GetAgentAccountModels (line 201) | func (b *BaseApi) GetAgentAccountModels(c *gin.Context) {
  method CreateAgentAccountModel (line 222) | func (b *BaseApi) CreateAgentAccountModel(c *gin.Context) {
  method UpdateAgentAccountModel (line 242) | func (b *BaseApi) UpdateAgentAccountModel(c *gin.Context) {
  method DeleteAgentAccountModel (line 262) | func (b *BaseApi) DeleteAgentAccountModel(c *gin.Context) {
  method VerifyAgentAccount (line 282) | func (b *BaseApi) VerifyAgentAccount(c *gin.Context) {
  method DeleteAgentAccount (line 302) | func (b *BaseApi) DeleteAgentAccount(c *gin.Context) {
  method GetAgentFeishuConfig (line 322) | func (b *BaseApi) GetAgentFeishuConfig(c *gin.Context) {
  method UpdateAgentFeishuConfig (line 343) | func (b *BaseApi) UpdateAgentFeishuConfig(c *gin.Context) {
  method GetAgentTelegramConfig (line 363) | func (b *BaseApi) GetAgentTelegramConfig(c *gin.Context) {
  method UpdateAgentTelegramConfig (line 384) | func (b *BaseApi) UpdateAgentTelegramConfig(c *gin.Context) {
  method GetAgentDiscordConfig (line 404) | func (b *BaseApi) GetAgentDiscordConfig(c *gin.Context) {
  method UpdateAgentDiscordConfig (line 425) | func (b *BaseApi) UpdateAgentDiscordConfig(c *gin.Context) {
  method GetAgentWecomConfig (line 445) | func (b *BaseApi) GetAgentWecomConfig(c *gin.Context) {
  method UpdateAgentWecomConfig (line 466) | func (b *BaseApi) UpdateAgentWecomConfig(c *gin.Context) {
  method GetAgentDingTalkConfig (line 486) | func (b *BaseApi) GetAgentDingTalkConfig(c *gin.Context) {
  method UpdateAgentDingTalkConfig (line 507) | func (b *BaseApi) UpdateAgentDingTalkConfig(c *gin.Context) {
  method GetAgentQQBotConfig (line 527) | func (b *BaseApi) GetAgentQQBotConfig(c *gin.Context) {
  method UpdateAgentQQBotConfig (line 548) | func (b *BaseApi) UpdateAgentQQBotConfig(c *gin.Context) {
  method InstallAgentPlugin (line 568) | func (b *BaseApi) InstallAgentPlugin(c *gin.Context) {
  method CheckAgentPlugin (line 588) | func (b *BaseApi) CheckAgentPlugin(c *gin.Context) {
  method GetAgentSecurityConfig (line 609) | func (b *BaseApi) GetAgentSecurityConfig(c *gin.Context) {
  method UpdateAgentSecurityConfig (line 630) | func (b *BaseApi) UpdateAgentSecurityConfig(c *gin.Context) {
  method GetAgentOtherConfig (line 650) | func (b *BaseApi) GetAgentOtherConfig(c *gin.Context) {
  method UpdateAgentOtherConfig (line 671) | func (b *BaseApi) UpdateAgentOtherConfig(c *gin.Context) {
  method ApproveAgentChannelPairing (line 691) | func (b *BaseApi) ApproveAgentChannelPairing(c *gin.Context) {

FILE: agent/app/api/v2/ai.go
  method CreateOllamaModel (line 21) | func (b *BaseApi) CreateOllamaModel(c *gin.Context) {
  method RecreateOllamaModel (line 43) | func (b *BaseApi) RecreateOllamaModel(c *gin.Context) {
  method CloseOllamaModel (line 65) | func (b *BaseApi) CloseOllamaModel(c *gin.Context) {
  method SyncOllamaModel (line 85) | func (b *BaseApi) SyncOllamaModel(c *gin.Context) {
  method SearchOllamaModel (line 102) | func (b *BaseApi) SearchOllamaModel(c *gin.Context) {
  method LoadOllamaModelDetail (line 128) | func (b *BaseApi) LoadOllamaModelDetail(c *gin.Context) {
  method DeleteOllamaModel (line 152) | func (b *BaseApi) DeleteOllamaModel(c *gin.Context) {
  method LoadGpuInfo (line 173) | func (b *BaseApi) LoadGpuInfo(c *gin.Context) {
  method BindDomain (line 205) | func (b *BaseApi) BindDomain(c *gin.Context) {
  method GetBindDomain (line 225) | func (b *BaseApi) GetBindDomain(c *gin.Context) {
  method UpdateBindDomain (line 246) | func (b *BaseApi) UpdateBindDomain(c *gin.Context) {

FILE: agent/app/api/v2/alert.go
  method PageAlert (line 10) | func (b *BaseApi) PageAlert(c *gin.Context) {
  method GetAlerts (line 26) | func (b *BaseApi) GetAlerts(c *gin.Context) {
  method CreateAlert (line 35) | func (b *BaseApi) CreateAlert(c *gin.Context) {
  method DeleteAlert (line 48) | func (b *BaseApi) DeleteAlert(c *gin.Context) {
  method UpdateAlert (line 61) | func (b *BaseApi) UpdateAlert(c *gin.Context) {
  method GetAlert (line 73) | func (b *BaseApi) GetAlert(c *gin.Context) {
  method UpdateAlertStatus (line 87) | func (b *BaseApi) UpdateAlertStatus(c *gin.Context) {
  method GetDisks (line 100) | func (b *BaseApi) GetDisks(c *gin.Context) {
  method PageAlertLogs (line 109) | func (b *BaseApi) PageAlertLogs(c *gin.Context) {
  method CleanAlertLogs (line 125) | func (b *BaseApi) CleanAlertLogs(c *gin.Context) {
  method GetClams (line 133) | func (b *BaseApi) GetClams(c *gin.Context) {
  method GetCronJobs (line 142) | func (b *BaseApi) GetCronJobs(c *gin.Context) {
  method GetAlertConfig (line 155) | func (b *BaseApi) GetAlertConfig(c *gin.Context) {
  method UpdateAlertConfig (line 164) | func (b *BaseApi) UpdateAlertConfig(c *gin.Context) {
  method DeleteAlertConfig (line 176) | func (b *BaseApi) DeleteAlertConfig(c *gin.Context) {
  method TestAlertConfig (line 189) | func (b *BaseApi) TestAlertConfig(c *gin.Context) {

FILE: agent/app/api/v2/app.go
  method SearchApp (line 22) | func (b *BaseApi) SearchApp(c *gin.Context) {
  method SyncApp (line 42) | func (b *BaseApi) SyncApp(c *gin.Context) {
  method SyncLocalApp (line 74) | func (b *BaseApi) SyncLocalApp(c *gin.Context) {
  method GetApp (line 91) | func (b *BaseApi) GetApp(c *gin.Context) {
  method GetAppDetail (line 115) | func (b *BaseApi) GetAppDetail(c *gin.Context) {
  method GetAppDetailByID (line 139) | func (b *BaseApi) GetAppDetailByID(c *gin.Context) {
  method InstallApp (line 162) | func (b *BaseApi) InstallApp(c *gin.Context) {
  method GetAppTags (line 175) | func (b *BaseApi) GetAppTags(c *gin.Context) {
  method GetAppListUpdate (line 190) | func (b *BaseApi) GetAppListUpdate(c *gin.Context) {
  method GetAppIcon (line 207) | func (b *BaseApi) GetAppIcon(c *gin.Context) {
  method GetAppDetailForNode (line 246) | func (b *BaseApi) GetAppDetailForNode(c *gin.Context) {

FILE: agent/app/api/v2/app_ignore_upgrade.go
  method ListAppIgnored (line 16) | func (b *BaseApi) ListAppIgnored(c *gin.Context) {
  method IgnoreAppUpgrade (line 34) | func (b *BaseApi) IgnoreAppUpgrade(c *gin.Context) {
  method CancelIgnoreAppUpgrade (line 56) | func (b *BaseApi) CancelIgnoreAppUpgrade(c *gin.Context) {

FILE: agent/app/api/v2/app_install.go
  method SearchAppInstalled (line 19) | func (b *BaseApi) SearchAppInstalled(c *gin.Context) {
  method ListAppInstalled (line 54) | func (b *BaseApi) ListAppInstalled(c *gin.Context) {
  method CheckAppInstalled (line 71) | func (b *BaseApi) CheckAppInstalled(c *gin.Context) {
  method LoadPort (line 92) | func (b *BaseApi) LoadPort(c *gin.Context) {
  method LoadConnInfo (line 113) | func (b *BaseApi) LoadConnInfo(c *gin.Context) {
  method DeleteCheck (line 134) | func (b *BaseApi) DeleteCheck(c *gin.Context) {
  method SyncInstalled (line 156) | func (b *BaseApi) SyncInstalled(c *gin.Context) {
  method OperateInstalled (line 173) | func (b *BaseApi) OperateInstalled(c *gin.Context) {
  method GetServices (line 193) | func (b *BaseApi) GetServices(c *gin.Context) {
  method GetUpdateVersions (line 211) | func (b *BaseApi) GetUpdateVersions(c *gin.Context) {
  method ChangeAppPort (line 233) | func (b *BaseApi) ChangeAppPort(c *gin.Context) {
  method GetDefaultConfig (line 253) | func (b *BaseApi) GetDefaultConfig(c *gin.Context) {
  method GetParams (line 275) | func (b *BaseApi) GetParams(c *gin.Context) {
  method UpdateInstalled (line 298) | func (b *BaseApi) UpdateInstalled(c *gin.Context) {
  method UpdateAppConfig (line 319) | func (b *BaseApi) UpdateAppConfig(c *gin.Context) {
  method GetAppInstallInfo (line 339) | func (b *BaseApi) GetAppInstallInfo(c *gin.Context) {
  method UpdateAppInstallSort (line 353) | func (b *BaseApi) UpdateAppInstallSort(c *gin.Context) {

FILE: agent/app/api/v2/backup.go
  method CheckBackupUsed (line 13) | func (b *BaseApi) CheckBackupUsed(c *gin.Context) {
  method CheckBackup (line 36) | func (b *BaseApi) CheckBackup(c *gin.Context) {
  method CreateBackup (line 54) | func (b *BaseApi) CreateBackup(c *gin.Context) {
  method RefreshToken (line 75) | func (b *BaseApi) RefreshToken(c *gin.Context) {
  method ListBuckets (line 95) | func (b *BaseApi) ListBuckets(c *gin.Context) {
  method DeleteBackup (line 118) | func (b *BaseApi) DeleteBackup(c *gin.Context) {
  method UpdateBackup (line 140) | func (b *BaseApi) UpdateBackup(c *gin.Context) {
  method UploadForRecover (line 162) | func (b *BaseApi) UploadForRecover(c *gin.Context) {
  method LoadBackupOptions (line 182) | func (b *BaseApi) LoadBackupOptions(c *gin.Context) {
  method SearchBackup (line 199) | func (b *BaseApi) SearchBackup(c *gin.Context) {
  method GetLocalDir (line 223) | func (b *BaseApi) GetLocalDir(c *gin.Context) {
  method LoadBackupRecordSize (line 241) | func (b *BaseApi) LoadBackupRecordSize(c *gin.Context) {
  method SearchBackupRecords (line 264) | func (b *BaseApi) SearchBackupRecords(c *gin.Context) {
  method SearchBackupRecordsByCronjob (line 290) | func (b *BaseApi) SearchBackupRecordsByCronjob(c *gin.Context) {
  method DownloadRecord (line 317) | func (b *BaseApi) DownloadRecord(c *gin.Context) {
  method UpdateRecordDescription (line 339) | func (b *BaseApi) UpdateRecordDescription(c *gin.Context) {
  method DeleteBackupRecord (line 361) | func (b *BaseApi) DeleteBackupRecord(c *gin.Context) {
  method LoadFilesFromBackup (line 382) | func (b *BaseApi) LoadFilesFromBackup(c *gin.Context) {
  method Backup (line 401) | func (b *BaseApi) Backup(c *gin.Context) {
  method Recover (line 456) | func (b *BaseApi) Recover(c *gin.Context) {
  method RecoverByUpload (line 521) | func (b *BaseApi) RecoverByUpload(c *gin.Context) {

FILE: agent/app/api/v2/clam.go
  method CreateClam (line 18) | func (b *BaseApi) CreateClam(c *gin.Context) {
  method UpdateClam (line 40) | func (b *BaseApi) UpdateClam(c *gin.Context) {
  method UpdateClamStatus (line 62) | func (b *BaseApi) UpdateClamStatus(c *gin.Context) {
  method SearchClam (line 83) | func (b *BaseApi) SearchClam(c *gin.Context) {
  method LoadClamBaseInfo (line 108) | func (b *BaseApi) LoadClamBaseInfo(c *gin.Context) {
  method OperateClam (line 127) | func (b *BaseApi) OperateClam(c *gin.Context) {
  method CleanClamRecord (line 150) | func (b *BaseApi) CleanClamRecord(c *gin.Context) {
  method SearchClamRecord (line 171) | func (b *BaseApi) SearchClamRecord(c *gin.Context) {
  method SearchClamFile (line 197) | func (b *BaseApi) SearchClamFile(c *gin.Context) {
  method UpdateFile (line 220) | func (b *BaseApi) UpdateFile(c *gin.Context) {
  method DeleteClam (line 241) | func (b *BaseApi) DeleteClam(c *gin.Context) {
  method HandleClamScan (line 263) | func (b *BaseApi) HandleClamScan(c *gin.Context) {

FILE: agent/app/api/v2/compose_template.go
  method CreateComposeTemplate (line 18) | func (b *BaseApi) CreateComposeTemplate(c *gin.Context) {
  method BatchComposeTemplate (line 40) | func (b *BaseApi) BatchComposeTemplate(c *gin.Context) {
  method SearchComposeTemplate (line 62) | func (b *BaseApi) SearchComposeTemplate(c *gin.Context) {
  method ListComposeTemplate (line 87) | func (b *BaseApi) ListComposeTemplate(c *gin.Context) {
  method DeleteComposeTemplate (line 106) | func (b *BaseApi) DeleteComposeTemplate(c *gin.Context) {
  method UpdateComposeTemplate (line 128) | func (b *BaseApi) UpdateComposeTemplate(c *gin.Context) {

FILE: agent/app/api/v2/container.go
  method SearchContainer (line 24) | func (b *BaseApi) SearchContainer(c *gin.Context) {
  method LoadContainerUsers (line 50) | func (b *BaseApi) LoadContainerUsers(c *gin.Context) {
  method ListContainerFiles (line 67) | func (b *BaseApi) ListContainerFiles(c *gin.Context) {
  method UploadContainerFile (line 91) | func (b *BaseApi) UploadContainerFile(c *gin.Context) {
  method GetContainerFileContent (line 132) | func (b *BaseApi) GetContainerFileContent(c *gin.Context) {
  method GetContainerFileSize (line 153) | func (b *BaseApi) GetContainerFileSize(c *gin.Context) {
  method DeleteContainerFile (line 175) | func (b *BaseApi) DeleteContainerFile(c *gin.Context) {
  method DownloadContainerFile (line 195) | func (b *BaseApi) DownloadContainerFile(c *gin.Context) {
  method ListContainer (line 223) | func (b *BaseApi) ListContainer(c *gin.Context) {
  method ListContainerByImage (line 235) | func (b *BaseApi) ListContainerByImage(c *gin.Context) {
  method LoadContainerStatus (line 252) | func (b *BaseApi) LoadContainerStatus(c *gin.Context) {
  method SearchCompose (line 269) | func (b *BaseApi) SearchCompose(c *gin.Context) {
  method TestCompose (line 295) | func (b *BaseApi) TestCompose(c *gin.Context) {
  method CreateCompose (line 318) | func (b *BaseApi) CreateCompose(c *gin.Context) {
  method OperatorCompose (line 340) | func (b *BaseApi) OperatorCompose(c *gin.Context) {
  method ContainerUpdate (line 362) | func (b *BaseApi) ContainerUpdate(c *gin.Context) {
  method ContainerInfo (line 383) | func (b *BaseApi) ContainerInfo(c *gin.Context) {
  method LoadResourceLimit (line 402) | func (b *BaseApi) LoadResourceLimit(c *gin.Context) {
  method ContainerListStats (line 416) | func (b *BaseApi) ContainerListStats(c *gin.Context) {
  method ContainerItemStats (line 432) | func (b *BaseApi) ContainerItemStats(c *gin.Context) {
  method ContainerCreate (line 455) | func (b *BaseApi) ContainerCreate(c *gin.Context) {
  method ContainerUpgrade (line 477) | func (b *BaseApi) ContainerUpgrade(c *gin.Context) {
  method ContainerPrune (line 499) | func (b *BaseApi) ContainerPrune(c *gin.Context) {
  method CleanContainerLog (line 521) | func (b *BaseApi) CleanContainerLog(c *gin.Context) {
  method CleanComposeLog (line 543) | func (b *BaseApi) CleanComposeLog(c *gin.Context) {
  method ContainerRename (line 565) | func (b *BaseApi) ContainerRename(c *gin.Context) {
  method ContainerCommit (line 586) | func (b *BaseApi) ContainerCommit(c *gin.Context) {
  method ContainerOperation (line 608) | func (b *BaseApi) ContainerOperation(c *gin.Context) {
  method ContainerStats (line 628) | func (b *BaseApi) ContainerStats(c *gin.Context) {
  method Inspect (line 651) | func (b *BaseApi) Inspect(c *gin.Context) {
  method DownloadContainerLogs (line 665) | func (b *BaseApi) DownloadContainerLogs(c *gin.Context) {
  method SearchNetwork (line 685) | func (b *BaseApi) SearchNetwork(c *gin.Context) {
  method ListNetwork (line 710) | func (b *BaseApi) ListNetwork(c *gin.Context) {
  method DeleteNetwork (line 728) | func (b *BaseApi) DeleteNetwork(c *gin.Context) {
  method CreateNetwork (line 750) | func (b *BaseApi) CreateNetwork(c *gin.Context) {
  method SearchVolume (line 772) | func (b *BaseApi) SearchVolume(c *gin.Context) {
  method ListVolume (line 797) | func (b *BaseApi) ListVolume(c *gin.Context) {
  method DeleteVolume (line 815) | func (b *BaseApi) DeleteVolume(c *gin.Context) {
  method CreateVolume (line 837) | func (b *BaseApi) CreateVolume(c *gin.Context) {
  method ComposeUpdate (line 859) | func (b *BaseApi) ComposeUpdate(c *gin.Context) {
  method LoadComposeEnv (line 880) | func (b *BaseApi) LoadComposeEnv(c *gin.Context) {
  method ContainerStreamLogs (line 903) | func (b *BaseApi) ContainerStreamLogs(c *gin.Context) {

FILE: agent/app/api/v2/cronjob.go
  method CreateCronjob (line 23) | func (b *BaseApi) CreateCronjob(c *gin.Context) {
  method LoadCronjobInfo (line 44) | func (b *BaseApi) LoadCronjobInfo(c *gin.Context) {
  method ExportCronjob (line 66) | func (b *BaseApi) ExportCronjob(c *gin.Context) {
  method ImportCronjob (line 88) | func (b *BaseApi) ImportCronjob(c *gin.Context) {
  method LoadScriptOptions (line 107) | func (b *BaseApi) LoadScriptOptions(c *gin.Context) {
  method LoadNextHandle (line 119) | func (b *BaseApi) LoadNextHandle(c *gin.Context) {
  method SearchCronjob (line 141) | func (b *BaseApi) SearchCronjob(c *gin.Context) {
  method SearchJobRecords (line 167) | func (b *BaseApi) SearchJobRecords(c *gin.Context) {
  method LoadRecordLog (line 197) | func (b *BaseApi) LoadRecordLog(c *gin.Context) {
  method CleanRecord (line 215) | func (b *BaseApi) CleanRecord(c *gin.Context) {
  method StopCronJob (line 237) | func (b *BaseApi) StopCronJob(c *gin.Context) {
  method DeleteCronjob (line 260) | func (b *BaseApi) DeleteCronjob(c *gin.Context) {
  method UpdateCronjob (line 282) | func (b *BaseApi) UpdateCronjob(c *gin.Context) {
  method UpdateCronjobGroup (line 304) | func (b *BaseApi) UpdateCronjobGroup(c *gin.Context) {
  method UpdateCronjobStatus (line 326) | func (b *BaseApi) UpdateCronjobStatus(c *gin.Context) {
  method HandleOnce (line 348) | func (b *BaseApi) HandleOnce(c *gin.Context) {

FILE: agent/app/api/v2/dashboard.go
  method LoadDashboardOsInfo (line 18) | func (b *BaseApi) LoadDashboardOsInfo(c *gin.Context) {
  method LoadAppLauncher (line 34) | func (b *BaseApi) LoadAppLauncher(c *gin.Context) {
  method LoadAppLauncherOption (line 51) | func (b *BaseApi) LoadAppLauncherOption(c *gin.Context) {
  method UpdateAppLauncher (line 73) | func (b *BaseApi) UpdateAppLauncher(c *gin.Context) {
  method LoadQuickOption (line 92) | func (b *BaseApi) LoadQuickOption(c *gin.Context) {
  method UpdateQuickJump (line 105) | func (b *BaseApi) UpdateQuickJump(c *gin.Context) {
  method LoadDashboardBaseInfo (line 127) | func (b *BaseApi) LoadDashboardBaseInfo(c *gin.Context) {
  method LoadCurrentInfoForNode (line 152) | func (b *BaseApi) LoadCurrentInfoForNode(c *gin.Context) {
  method LoadDashboardCurrentInfo (line 166) | func (b *BaseApi) LoadDashboardCurrentInfo(c *gin.Context) {
  method LoadDashboardTopCPU (line 188) | func (b *BaseApi) LoadDashboardTopCPU(c *gin.Context) {
  method LoadDashboardTopMem (line 199) | func (b *BaseApi) LoadDashboardTopMem(c *gin.Context) {
  method SystemRestart (line 212) | func (b *BaseApi) SystemRestart(c *gin.Context) {

FILE: agent/app/api/v2/database.go
  method CreateDatabase (line 20) | func (b *BaseApi) CreateDatabase(c *gin.Context) {
  method CheckDatabase (line 50) | func (b *BaseApi) CheckDatabase(c *gin.Context) {
  method SearchDatabase (line 75) | func (b *BaseApi) SearchDatabase(c *gin.Context) {
  method ListDatabase (line 99) | func (b *BaseApi) ListDatabase(c *gin.Context) {
  method LoadDatabaseItems (line 120) | func (b *BaseApi) LoadDatabaseItems(c *gin.Context) {
  method GetDatabase (line 141) | func (b *BaseApi) GetDatabase(c *gin.Context) {
  method DeleteCheckDatabase (line 164) | func (b *BaseApi) DeleteCheckDatabase(c *gin.Context) {
  method DeleteDatabase (line 187) | func (b *BaseApi) DeleteDatabase(c *gin.Context) {
  method UpdateDatabase (line 209) | func (b *BaseApi) UpdateDatabase(c *gin.Context) {

FILE: agent/app/api/v2/database_common.go
  method LoadDBBaseInfo (line 17) | func (b *BaseApi) LoadDBBaseInfo(c *gin.Context) {
  method LoadDBFile (line 40) | func (b *BaseApi) LoadDBFile(c *gin.Context) {
  method UpdateDBConfByFile (line 62) | func (b *BaseApi) UpdateDBConfByFile(c *gin.Context) {

FILE: agent/app/api/v2/database_mysql.go
  method CreateMysql (line 21) | func (b *BaseApi) CreateMysql(c *gin.Context) {
  method BindUser (line 52) | func (b *BaseApi) BindUser(c *gin.Context) {
  method UpdateMysqlDescription (line 83) | func (b *BaseApi) UpdateMysqlDescription(c *gin.Context) {
  method ChangeMysqlPassword (line 105) | func (b *BaseApi) ChangeMysqlPassword(c *gin.Context) {
  method ChangeMysqlAccess (line 136) | func (b *BaseApi) ChangeMysqlAccess(c *gin.Context) {
  method UpdateMysqlVariables (line 158) | func (b *BaseApi) UpdateMysqlVariables(c *gin.Context) {
  method SearchMysql (line 179) | func (b *BaseApi) SearchMysql(c *gin.Context) {
  method ListDBFormatCollationOptions (line 205) | func (b *BaseApi) ListDBFormatCollationOptions(c *gin.Context) {
  method LoadDBFromRemote (line 221) | func (b *BaseApi) LoadDBFromRemote(c *gin.Context) {
  method DeleteCheckMysql (line 243) | func (b *BaseApi) DeleteCheckMysql(c *gin.Context) {
  method DeleteMysql (line 266) | func (b *BaseApi) DeleteMysql(c *gin.Context) {
  method LoadRemoteAccess (line 290) | func (b *BaseApi) LoadRemoteAccess(c *gin.Context) {
  method LoadStatus (line 312) | func (b *BaseApi) LoadStatus(c *gin.Context) {
  method LoadVariables (line 335) | func (b *BaseApi) LoadVariables(c *gin.Context) {

FILE: agent/app/api/v2/database_postgresql.go
  method CreatePostgresql (line 21) | func (b *BaseApi) CreatePostgresql(c *gin.Context) {
  method BindPostgresqlUser (line 52) | func (b *BaseApi) BindPostgresqlUser(c *gin.Context) {
  method UpdatePostgresqlDescription (line 74) | func (b *BaseApi) UpdatePostgresqlDescription(c *gin.Context) {
  method ChangePostgresqlPrivileges (line 96) | func (b *BaseApi) ChangePostgresqlPrivileges(c *gin.Context) {
  method ChangePostgresqlPassword (line 118) | func (b *BaseApi) ChangePostgresqlPassword(c *gin.Context) {
  method SearchPostgresql (line 148) | func (b *BaseApi) SearchPostgresql(c *gin.Context) {
  method LoadPostgresqlDBFromRemote (line 174) | func (b *BaseApi) LoadPostgresqlDBFromRemote(c *gin.Context) {
  method DeleteCheckPostgresql (line 197) | func (b *BaseApi) DeleteCheckPostgresql(c *gin.Context) {
  method DeletePostgresql (line 220) | func (b *BaseApi) DeletePostgresql(c *gin.Context) {

FILE: agent/app/api/v2/database_redis.go
  method LoadRedisStatus (line 19) | func (b *BaseApi) LoadRedisStatus(c *gin.Context) {
  method LoadRedisConf (line 41) | func (b *BaseApi) LoadRedisConf(c *gin.Context) {
  method LoadPersistenceConf (line 63) | func (b *BaseApi) LoadPersistenceConf(c *gin.Context) {
  method CheckHasCli (line 77) | func (b *BaseApi) CheckHasCli(c *gin.Context) {
  method InstallCli (line 87) | func (b *BaseApi) InstallCli(c *gin.Context) {
  method UpdateRedisConf (line 105) | func (b *BaseApi) UpdateRedisConf(c *gin.Context) {
  method ChangeRedisPassword (line 127) | func (b *BaseApi) ChangeRedisPassword(c *gin.Context) {
  method UpdateRedisPersistenceConf (line 158) | func (b *BaseApi) UpdateRedisPersistenceConf(c *gin.Context) {

FILE: agent/app/api/v2/device.go
  method LoadDeviceBaseInfo (line 17) | func (b *BaseApi) LoadDeviceBaseInfo(c *gin.Context) {
  method LoadTimeOption (line 34) | func (b *BaseApi) LoadTimeOption(c *gin.Context) {
  method LoadDeviceConf (line 52) | func (b *BaseApi) LoadDeviceConf(c *gin.Context) {
  method UpdateDeviceByFile (line 75) | func (b *BaseApi) UpdateDeviceByFile(c *gin.Context) {
  method LoadUsers (line 94) | func (b *BaseApi) LoadUsers(c *gin.Context) {
  method UpdateDeviceConf (line 112) | func (b *BaseApi) UpdateDeviceConf(c *gin.Context) {
  method UpdateDeviceHost (line 133) | func (b *BaseApi) UpdateDeviceHost(c *gin.Context) {
  method UpdateDevicePasswd (line 155) | func (b *BaseApi) UpdateDevicePasswd(c *gin.Context) {
  method UpdateDeviceSwap (line 185) | func (b *BaseApi) UpdateDeviceSwap(c *gin.Context) {
  method CheckDNS (line 206) | func (b *BaseApi) CheckDNS(c *gin.Context) {
  method ScanSystem (line 228) | func (b *BaseApi) ScanSystem(c *gin.Context) {
  method SystemClean (line 241) | func (b *BaseApi) SystemClean(c *gin.Context) {

FILE: agent/app/api/v2/disk.go
  method GetCompleteDiskInfo (line 17) | func (b *BaseApi) GetCompleteDiskInfo(c *gin.Context) {
  method PartitionDisk (line 36) | func (b *BaseApi) PartitionDisk(c *gin.Context) {
  method MountDisk (line 61) | func (b *BaseApi) MountDisk(c *gin.Context) {
  method UnmountDisk (line 86) | func (b *BaseApi) UnmountDisk(c *gin.Context) {

FILE: agent/app/api/v2/docker.go
  method LoadDockerStatus (line 19) | func (b *BaseApi) LoadDockerStatus(c *gin.Context) {
  method LoadDaemonJsonFile (line 31) | func (b *BaseApi) LoadDaemonJsonFile(c *gin.Context) {
  method LoadDaemonJson (line 51) | func (b *BaseApi) LoadDaemonJson(c *gin.Context) {
  method UpdateDaemonJson (line 69) | func (b *BaseApi) UpdateDaemonJson(c *gin.Context) {
  method UpdateLogOption (line 92) | func (b *BaseApi) UpdateLogOption(c *gin.Context) {
  method UpdateIpv6Option (line 115) | func (b *BaseApi) UpdateIpv6Option(c *gin.Context) {
  method UpdateDaemonJsonByFile (line 138) | func (b *BaseApi) UpdateDaemonJsonByFile(c *gin.Context) {
  method OperateDocker (line 161) | func (b *BaseApi) OperateDocker(c *gin.Context) {

FILE: agent/app/api/v2/entry.go
  type ApiGroup (line 5) | type ApiGroup struct
  type BaseApi (line 11) | type BaseApi struct

FILE: agent/app/api/v2/fail2ban.go
  method LoadFail2BanBaseInfo (line 17) | func (b *BaseApi) LoadFail2BanBaseInfo(c *gin.Context) {
  method SearchFail2Ban (line 35) | func (b *BaseApi) SearchFail2Ban(c *gin.Context) {
  method OperateFail2Ban (line 59) | func (b *BaseApi) OperateFail2Ban(c *gin.Context) {
  method OperateSSHD (line 81) | func (b *BaseApi) OperateSSHD(c *gin.Context) {
  method UpdateFail2BanConf (line 104) | func (b *BaseApi) UpdateFail2BanConf(c *gin.Context) {
  method LoadFail2BanConf (line 124) | func (b *BaseApi) LoadFail2BanConf(c *gin.Context) {
  method UpdateFail2BanConfByFile (line 143) | func (b *BaseApi) UpdateFail2BanConfByFile(c *gin.Context) {

FILE: agent/app/api/v2/favorite.go
  method SearchFavorite (line 18) | func (b *BaseApi) SearchFavorite(c *gin.Context) {
  method CreateFavorite (line 43) | func (b *BaseApi) CreateFavorite(c *gin.Context) {
  method DeleteFavorite (line 65) | func (b *BaseApi) DeleteFavorite(c *gin.Context) {

FILE: agent/app/api/v2/file.go
  method ListFiles (line 38) | func (b *BaseApi) ListFiles(c *gin.Context) {
  method SearchUploadWithPage (line 59) | func (b *BaseApi) SearchUploadWithPage(c *gin.Context) {
  method GetFileTree (line 83) | func (b *BaseApi) GetFileTree(c *gin.Context) {
  method CreateFile (line 105) | func (b *BaseApi) CreateFile(c *gin.Context) {
  method DeleteFile (line 127) | func (b *BaseApi) DeleteFile(c *gin.Context) {
  method BatchDeleteFile (line 149) | func (b *BaseApi) BatchDeleteFile(c *gin.Context) {
  method ChangeFileMode (line 171) | func (b *BaseApi) ChangeFileMode(c *gin.Context) {
  method ChangeFileOwner (line 193) | func (b *BaseApi) ChangeFileOwner(c *gin.Context) {
  method CompressFile (line 214) | func (b *BaseApi) CompressFile(c *gin.Context) {
  method DeCompressFile (line 236) | func (b *BaseApi) DeCompressFile(c *gin.Context) {
  method GetContent (line 258) | func (b *BaseApi) GetContent(c *gin.Context) {
  method PreviewContent (line 284) | func (b *BaseApi) PreviewContent(c *gin.Context) {
  method SaveContent (line 307) | func (b *BaseApi) SaveContent(c *gin.Context) {
  method UploadFiles (line 327) | func (b *BaseApi) UploadFiles(c *gin.Context) {
  method CheckFile (line 435) | func (b *BaseApi) CheckFile(c *gin.Context) {
  method BatchCheckFiles (line 464) | func (b *BaseApi) BatchCheckFiles(c *gin.Context) {
  method ChangeFileName (line 482) | func (b *BaseApi) ChangeFileName(c *gin.Context) {
  method WgetFile (line 503) | func (b *BaseApi) WgetFile(c *gin.Context) {
  method MoveFile (line 527) | func (b *BaseApi) MoveFile(c *gin.Context) {
  method Download (line 546) | func (b *BaseApi) Download(c *gin.Context) {
  method DownloadChunkFiles (line 573) | func (b *BaseApi) DownloadChunkFiles(c *gin.Context) {
  method Size (line 650) | func (b *BaseApi) Size(c *gin.Context) {
  method DepthDirSize (line 672) | func (b *BaseApi) DepthDirSize(c *gin.Context) {
  function mergeChunks (line 685) | func mergeChunks(fileName string, fileDir string, dstDir string, chunkCo...
  method UploadChunkFiles (line 739) | func (b *BaseApi) UploadChunkFiles(c *gin.Context) {
  method WgetProcess (line 832) | func (b *BaseApi) WgetProcess(c *gin.Context) {
  method ProcessKeys (line 842) | func (b *BaseApi) ProcessKeys(c *gin.Context) {
  method ReadFileByLine (line 866) | func (b *BaseApi) ReadFileByLine(c *gin.Context) {
  method BatchChangeModeAndOwner (line 892) | func (b *BaseApi) BatchChangeModeAndOwner(c *gin.Context) {
  method GetPathByType (line 903) | func (b *BaseApi) GetPathByType(c *gin.Context) {
  method GetHostMount (line 920) | func (b *BaseApi) GetHostMount(c *gin.Context) {
  method GetUsersAndGroups (line 932) | func (b *BaseApi) GetUsersAndGroups(c *gin.Context) {
  method ConvertFile (line 949) | func (b *BaseApi) ConvertFile(c *gin.Context) {
  method ConvertLog (line 966) | func (b *BaseApi) ConvertLog(c *gin.Context) {
  method BatchGetFileRemarks (line 990) | func (b *BaseApi) BatchGetFileRemarks(c *gin.Context) {
  method SetFileRemark (line 1007) | func (b *BaseApi) SetFileRemark(c *gin.Context) {

FILE: agent/app/api/v2/firewall.go
  method LoadFirewallBaseInfo (line 17) | func (b *BaseApi) LoadFirewallBaseInfo(c *gin.Context) {
  method SearchFirewallRule (line 40) | func (b *BaseApi) SearchFirewallRule(c *gin.Context) {
  method OperateFirewall (line 67) | func (b *BaseApi) OperateFirewall(c *gin.Context) {
  method OperatePortRule (line 90) | func (b *BaseApi) OperatePortRule(c *gin.Context) {
  method OperateForwardRule (line 113) | func (b *BaseApi) OperateForwardRule(c *gin.Context) {
  method OperateIPRule (line 135) | func (b *BaseApi) OperateIPRule(c *gin.Context) {
  method BatchOperateRule (line 156) | func (b *BaseApi) BatchOperateRule(c *gin.Context) {
  method UpdateFirewallDescription (line 177) | func (b *BaseApi) UpdateFirewallDescription(c *gin.Context) {
  method UpdatePortRule (line 198) | func (b *BaseApi) UpdatePortRule(c *gin.Context) {
  method UpdateAddrRule (line 219) | func (b *BaseApi) UpdateAddrRule(c *gin.Context) {
  method SearchFilterRules (line 240) | func (b *BaseApi) SearchFilterRules(c *gin.Context) {
  method OperateFilterRule (line 267) | func (b *BaseApi) OperateFilterRule(c *gin.Context) {
  method BatchOperateFilterRule (line 288) | func (b *BaseApi) BatchOperateFilterRule(c *gin.Context) {
  method OperateFilterChain (line 311) | func (b *BaseApi) OperateFilterChain(c *gin.Context) {
  method LoadChainStatus (line 332) | func (b *BaseApi) LoadChainStatus(c *gin.Context) {

FILE: agent/app/api/v2/ftp.go
  method LoadFtpBaseInfo (line 17) | func (b *BaseApi) LoadFtpBaseInfo(c *gin.Context) {
  method LoadFtpLogInfo (line 35) | func (b *BaseApi) LoadFtpLogInfo(c *gin.Context) {
  method OperateFtp (line 62) | func (b *BaseApi) OperateFtp(c *gin.Context) {
  method SearchFtp (line 84) | func (b *BaseApi) SearchFtp(c *gin.Context) {
  method CreateFtp (line 111) | func (b *BaseApi) CreateFtp(c *gin.Context) {
  method DeleteFtp (line 141) | func (b *BaseApi) DeleteFtp(c *gin.Context) {
  method SyncFtp (line 163) | func (b *BaseApi) SyncFtp(c *gin.Context) {
  method UpdateFtp (line 180) | func (b *BaseApi) UpdateFtp(c *gin.Context) {

FILE: agent/app/api/v2/group.go
  method CreateGroup (line 18) | func (b *BaseApi) CreateGroup(c *gin.Context) {
  method DeleteGroup (line 40) | func (b *BaseApi) DeleteGroup(c *gin.Context) {
  method UpdateGroup (line 62) | func (b *BaseApi) UpdateGroup(c *gin.Context) {
  method ListGroup (line 83) | func (b *BaseApi) ListGroup(c *gin.Context) {

FILE: agent/app/api/v2/health.go
  method CheckHealth (line 8) | func (b *BaseApi) CheckHealth(c *gin.Context) {

FILE: agent/app/api/v2/helper/helper.go
  function ErrorWithDetail (line 23) | func ErrorWithDetail(ctx *gin.Context, code int, msgKey string, err erro...
  function InternalServer (line 33) | func InternalServer(ctx *gin.Context, err error) {
  function BadRequest (line 37) | func BadRequest(ctx *gin.Context, err error) {
  function SuccessWithData (line 41) | func SuccessWithData(ctx *gin.Context, data interface{}) {
  function SuccessWithDataGzipped (line 59) | func SuccessWithDataGzipped(ctx *gin.Context, data interface{}) {
  function Success (line 89) | func Success(ctx *gin.Context) {
  function SuccessWithMsg (line 98) | func SuccessWithMsg(ctx *gin.Context, msg string) {
  function GetParamID (line 107) | func GetParamID(c *gin.Context) (uint, error) {
  function GetIntParamByKey (line 116) | func GetIntParamByKey(c *gin.Context, key string) (uint, error) {
  function GetStrParamByKey (line 125) | func GetStrParamByKey(c *gin.Context, key string) (string, error) {
  function GetTxAndContext (line 133) | func GetTxAndContext() (tx *gorm.DB, ctx context.Context) {
  function CheckBindAndValidate (line 139) | func CheckBindAndValidate(req interface{}, c *gin.Context) error {
  function CheckBind (line 151) | func CheckBind(req interface{}, c *gin.Context) error {
  function GetParamInt32 (line 159) | func GetParamInt32(paramName string, c *gin.Context) (int32, error) {

FILE: agent/app/api/v2/host.go
  method CreateHost (line 10) | func (b *BaseApi) CreateHost(c *gin.Context) {
  method TestByInfo (line 24) | func (b *BaseApi) TestByInfo(c *gin.Context) {
  method TestByID (line 33) | func (b *BaseApi) TestByID(c *gin.Context) {
  method HostTree (line 42) | func (b *BaseApi) HostTree(c *gin.Context) {
  method SearchHost (line 56) | func (b *BaseApi) SearchHost(c *gin.Context) {
  method DeleteHost (line 71) | func (b *BaseApi) DeleteHost(c *gin.Context) {
  method UpdateHost (line 84) | func (b *BaseApi) UpdateHost(c *gin.Context) {
  method UpdateHostGroup (line 143) | func (b *BaseApi) UpdateHostGroup(c *gin.Context) {
  method GetHostByID (line 156) | func (b *BaseApi) GetHostByID(c *gin.Context) {

FILE: agent/app/api/v2/host_tool.go
  method GetToolStatus (line 17) | func (b *BaseApi) GetToolStatus(c *gin.Context) {
  method InitToolConfig (line 40) | func (b *BaseApi) InitToolConfig(c *gin.Context) {
  method OperateTool (line 62) | func (b *BaseApi) OperateTool(c *gin.Context) {
  method OperateToolConfig (line 84) | func (b *BaseApi) OperateToolConfig(c *gin.Context) {
  method OperateProcess (line 107) | func (b *BaseApi) OperateProcess(c *gin.Context) {
  method GetProcess (line 128) | func (b *BaseApi) GetProcess(c *gin.Context) {
  method GetProcessFile (line 146) | func (b *BaseApi) GetProcessFile(c *gin.Context) {

FILE: agent/app/api/v2/image.go
  method SearchImage (line 18) | func (b *BaseApi) SearchImage(c *gin.Context) {
  method ListAllImage (line 43) | func (b *BaseApi) ListAllImage(c *gin.Context) {
  method ListImage (line 59) | func (b *BaseApi) ListImage(c *gin.Context) {
  method ImageBuild (line 77) | func (b *BaseApi) ImageBuild(c *gin.Context) {
  method ImagePull (line 100) | func (b *BaseApi) ImagePull(c *gin.Context) {
  method ImagePush (line 123) | func (b *BaseApi) ImagePush(c *gin.Context) {
  method ImageRemove (line 146) | func (b *BaseApi) ImageRemove(c *gin.Context) {
  method ImageSave (line 169) | func (b *BaseApi) ImageSave(c *gin.Context) {
  method ImageTag (line 192) | func (b *BaseApi) ImageTag(c *gin.Context) {
  method ImageLoad (line 215) | func (b *BaseApi) ImageLoad(c *gin.Context) {

FILE: agent/app/api/v2/image_repo.go
  method SearchRepo (line 18) | func (b *BaseApi) SearchRepo(c *gin.Context) {
  method ListRepo (line 43) | func (b *BaseApi) ListRepo(c *gin.Context) {
  method CheckRepoStatus (line 62) | func (b *BaseApi) CheckRepoStatus(c *gin.Context) {
  method CreateRepo (line 85) | func (b *BaseApi) CreateRepo(c *gin.Context) {
  method DeleteRepo (line 108) | func (b *BaseApi) DeleteRepo(c *gin.Context) {
  method UpdateRepo (line 131) | func (b *BaseApi) UpdateRepo(c *gin.Context) {

FILE: agent/app/api/v2/logs.go
  method GetSystemFiles (line 14) | func (b *BaseApi) GetSystemFiles(c *gin.Context) {

FILE: agent/app/api/v2/mcp_server.go
  method PageMcpServers (line 17) | func (b *BaseApi) PageMcpServers(c *gin.Context) {
  method CreateMcpServer (line 34) | func (b *BaseApi) CreateMcpServer(c *gin.Context) {
  method UpdateMcpServer (line 55) | func (b *BaseApi) UpdateMcpServer(c *gin.Context) {
  method DeleteMcpServer (line 76) | func (b *BaseApi) DeleteMcpServer(c *gin.Context) {
  method OperateMcpServer (line 97) | func (b *BaseApi) OperateMcpServer(c *gin.Context) {
  method BindMcpDomain (line 118) | func (b *BaseApi) BindMcpDomain(c *gin.Context) {
  method UpdateMcpBindDomain (line 139) | func (b *BaseApi) UpdateMcpBindDomain(c *gin.Context) {
  method GetMcpBindDomain (line 159) | func (b *BaseApi) GetMcpBindDomain(c *gin.Context) {

FILE: agent/app/api/v2/monitor.go
  method LoadMonitor (line 20) | func (b *BaseApi) LoadMonitor(c *gin.Context) {
  method LoadGPUMonitor (line 41) | func (b *BaseApi) LoadGPUMonitor(c *gin.Context) {
  method CleanMonitor (line 62) | func (b *BaseApi) CleanMonitor(c *gin.Context) {
  method LoadMonitorSetting (line 77) | func (b *BaseApi) LoadMonitorSetting(c *gin.Context) {
  method UpdateMonitorSetting (line 95) | func (b *BaseApi) UpdateMonitorSetting(c *gin.Context) {
  method GetNetworkOptions (line 108) | func (b *BaseApi) GetNetworkOptions(c *gin.Context) {
  method GetIOOptions (line 119) | func (b *BaseApi) GetIOOptions(c *gin.Context) {
  method GetCPUOptions (line 130) | func (b *BaseApi) GetCPUOptions(c *gin.Context) {

FILE: agent/app/api/v2/nginx.go
  method GetNginx (line 15) | func (b *BaseApi) GetNginx(c *gin.Context) {
  method GetNginxConfigByScope (line 32) | func (b *BaseApi) GetNginxConfigByScope(c *gin.Context) {
  method UpdateNginxConfigByScope (line 55) | func (b *BaseApi) UpdateNginxConfigByScope(c *gin.Context) {
  method GetNginxStatus (line 73) | func (b *BaseApi) GetNginxStatus(c *gin.Context) {
  method UpdateNginxFile (line 91) | func (b *BaseApi) UpdateNginxFile(c *gin.Context) {
  method BuildNginx (line 113) | func (b *BaseApi) BuildNginx(c *gin.Context) {
  method UpdateNginxModule (line 134) | func (b *BaseApi) UpdateNginxModule(c *gin.Context) {
  method GetNginxModules (line 152) | func (b *BaseApi) GetNginxModules(c *gin.Context) {
  method OperateDefaultHTTPs (line 169) | func (b *BaseApi) OperateDefaultHTTPs(c *gin.Context) {
  method GetDefaultHTTPsStatus (line 188) | func (b *BaseApi) GetDefaultHTTPsStatus(c *gin.Context) {

FILE: agent/app/api/v2/php_extensions.go
  method PagePHPExtensions (line 18) | func (b *BaseApi) PagePHPExtensions(c *gin.Context) {
  method CreatePHPExtensions (line 55) | func (b *BaseApi) CreatePHPExtensions(c *gin.Context) {
  method UpdatePHPExtensions (line 75) | func (b *BaseApi) UpdatePHPExtensions(c *gin.Context) {
  method DeletePHPExtensions (line 95) | func (b *BaseApi) DeletePHPExtensions(c *gin.Context) {

FILE: agent/app/api/v2/process.go
  method ProcessWs (line 10) | func (b *BaseApi) ProcessWs(c *gin.Context) {
  method StopProcess (line 28) | func (b *BaseApi) StopProcess(c *gin.Context) {
  method GetProcessInfoByPID (line 47) | func (b *BaseApi) GetProcessInfoByPID(c *gin.Context) {
  method GetListeningProcess (line 67) | func (b *BaseApi) GetListeningProcess(c *gin.Context) {

FILE: agent/app/api/v2/recycle_bin.go
  method SearchRecycleBinFile (line 18) | func (b *BaseApi) SearchRecycleBinFile(c *gin.Context) {
  method ReduceRecycleBinFile (line 43) | func (b *BaseApi) ReduceRecycleBinFile(c *gin.Context) {
  method ClearRecycleBinFile (line 63) | func (b *BaseApi) ClearRecycleBinFile(c *gin.Context) {
  method GetRecycleStatus (line 78) | func (b *BaseApi) GetRecycleStatus(c *gin.Context) {

FILE: agent/app/api/v2/runtime.go
  method SearchRuntimes (line 18) | func (b *BaseApi) SearchRuntimes(c *gin.Context) {
  method CreateRuntime (line 43) | func (b *BaseApi) CreateRuntime(c *gin.Context) {
  method DeleteRuntime (line 65) | func (b *BaseApi) DeleteRuntime(c *gin.Context) {
  method DeleteRuntimeCheck (line 85) | func (b *BaseApi) DeleteRuntimeCheck(c *gin.Context) {
  method UpdateRuntime (line 108) | func (b *BaseApi) UpdateRuntime(c *gin.Context) {
  method GetRuntime (line 128) | func (b *BaseApi) GetRuntime(c *gin.Context) {
  method GetNodePackageRunScript (line 150) | func (b *BaseApi) GetNodePackageRunScript(c *gin.Context) {
  method OperateRuntime (line 172) | func (b *BaseApi) OperateRuntime(c *gin.Context) {
  method GetNodeModules (line 193) | func (b *BaseApi) GetNodeModules(c *gin.Context) {
  method OperateNodeModules (line 214) | func (b *BaseApi) OperateNodeModules(c *gin.Context) {
  method SyncStatus (line 233) | func (b *BaseApi) SyncStatus(c *gin.Context) {
  method GetRuntimeExtension (line 250) | func (b *BaseApi) GetRuntimeExtension(c *gin.Context) {
  method InstallPHPExtension (line 272) | func (b *BaseApi) InstallPHPExtension(c *gin.Context) {
  method UnInstallPHPExtension (line 293) | func (b *BaseApi) UnInstallPHPExtension(c *gin.Context) {
  method GetPHPConfig (line 314) | func (b *BaseApi) GetPHPConfig(c *gin.Context) {
  method UpdatePHPConfig (line 337) | func (b *BaseApi) UpdatePHPConfig(c *gin.Context) {
  method UpdatePHPFile (line 358) | func (b *BaseApi) UpdatePHPFile(c *gin.Context) {
  method GetPHPConfigFile (line 378) | func (b *BaseApi) GetPHPConfigFile(c *gin.Context) {
  method UpdateFPMConfig (line 399) | func (b *BaseApi) UpdateFPMConfig(c *gin.Context) {
  method GetFPMConfig (line 419) | func (b *BaseApi) GetFPMConfig(c *gin.Context) {
  method GetSupervisorProcess (line 441) | func (b *BaseApi) GetSupervisorProcess(c *gin.Context) {
  method OperateSupervisorProcess (line 463) | func (b *BaseApi) OperateSupervisorProcess(c *gin.Context) {
  method OperateSupervisorProcessFile (line 484) | func (b *BaseApi) OperateSupervisorProcessFile(c *gin.Context) {
  method UpdatePHPContainer (line 505) | func (b *BaseApi) UpdatePHPContainer(c *gin.Context) {
  method GetPHPContainerConfig (line 525) | func (b *BaseApi) GetPHPContainerConfig(c *gin.Context) {
  method UpdateRuntimeRemark (line 547) | func (b *BaseApi) UpdateRuntimeRemark(c *gin.Context) {
  method GetFPMStatus (line 567) | func (b *BaseApi) GetFPMStatus(c *gin.Context) {

FILE: agent/app/api/v2/setting.go
  method GetSettingInfo (line 21) | func (b *BaseApi) GetSettingInfo(c *gin.Context) {
  method GetTerminalAISettingInfo (line 30) | func (b *BaseApi) GetTerminalAISettingInfo(c *gin.Context) {
  method GetSystemAvailable (line 45) | func (b *BaseApi) GetSystemAvailable(c *gin.Context) {
  method UpdateSetting (line 58) | func (b *BaseApi) UpdateSetting(c *gin.Context) {
  method UpdateTerminalAISetting (line 71) | func (b *BaseApi) UpdateTerminalAISetting(c *gin.Context) {
  method LoadBaseDir (line 90) | func (b *BaseApi) LoadBaseDir(c *gin.Context) {
  method LoadLocalConn (line 100) | func (b *BaseApi) LoadLocalConn(c *gin.Context) {
  method CheckLocalConn (line 104) | func (b *BaseApi) CheckLocalConn(c *gin.Context) {
  method SetDefaultIsConn (line 121) | func (b *BaseApi) SetDefaultIsConn(c *gin.Context) {
  method CheckLocalConnByInfo (line 140) | func (b *BaseApi) CheckLocalConnByInfo(c *gin.Context) {
  method SaveLocalConn (line 155) | func (b *BaseApi) SaveLocalConn(c *gin.Context) {
  function loadLocalConn (line 168) | func loadLocalConn() (*ssh.SSHClient, error) {
  method GetSettingByKey (line 196) | func (b *BaseApi) GetSettingByKey(c *gin.Context) {
  method SaveDescription (line 214) | func (b *BaseApi) SaveDescription(c *gin.Context) {

FILE: agent/app/api/v2/snapshot.go
  method LoadSnapshotData (line 15) | func (b *BaseApi) LoadSnapshotData(c *gin.Context) {
  method CreateSnapshot (line 33) | func (b *BaseApi) CreateSnapshot(c *gin.Context) {
  method RecreateSnapshot (line 55) | func (b *BaseApi) RecreateSnapshot(c *gin.Context) {
  method ImportSnapshot (line 77) | func (b *BaseApi) ImportSnapshot(c *gin.Context) {
  method UpdateSnapDescription (line 99) | func (b *BaseApi) UpdateSnapDescription(c *gin.Context) {
  method SearchSnapshot (line 120) | func (b *BaseApi) SearchSnapshot(c *gin.Context) {
  method RecoverSnapshot (line 146) | func (b *BaseApi) RecoverSnapshot(c *gin.Context) {
  method RollbackSnapshot (line 168) | func (b *BaseApi) RollbackSnapshot(c *gin.Context) {
  method DeleteSnapshot (line 190) | func (b *BaseApi) DeleteSnapshot(c *gin.Context) {

FILE: agent/app/api/v2/ssh.go
  method GetSSHInfo (line 17) | func (b *BaseApi) GetSSHInfo(c *gin.Context) {
  method OperateSSH (line 35) | func (b *BaseApi) OperateSSH(c *gin.Context) {
  method UpdateSSH (line 57) | func (b *BaseApi) UpdateSSH(c *gin.Context) {
  method CreateRootCert (line 79) | func (b *BaseApi) CreateRootCert(c *gin.Context) {
  method EditRootCert (line 103) | func (b *BaseApi) EditRootCert(c *gin.Context) {
  method SyncRootCert (line 125) | func (b *BaseApi) SyncRootCert(c *gin.Context) {
  method SearchRootCert (line 141) | func (b *BaseApi) SearchRootCert(c *gin.Context) {
  method DeleteRootCert (line 167) | func (b *BaseApi) DeleteRootCert(c *gin.Context) {
  method LoadSSHLogs (line 188) | func (b *BaseApi) LoadSSHLogs(c *gin.Context) {
  method ExportSSHLogs (line 214) | func (b *BaseApi) ExportSSHLogs(c *gin.Context) {
  method LoadSSHFile (line 235) | func (b *BaseApi) LoadSSHFile(c *gin.Context) {
  method UpdateSSHByFile (line 258) | func (b *BaseApi) UpdateSSHByFile(c *gin.Context) {
  function loadCertAfterDecrypt (line 271) | func loadCertAfterDecrypt(req *dto.RootCertOperate) error {

FILE: agent/app/api/v2/system.go
  method CheckComponentExistence (line 17) | func (b *BaseApi) CheckComponentExistence(c *gin.Context) {

FILE: agent/app/api/v2/task.go
  method PageTasks (line 17) | func (b *BaseApi) PageTasks(c *gin.Context) {
  method CountExecutingTasks (line 39) | func (b *BaseApi) CountExecutingTasks(c *gin.Context) {

FILE: agent/app/api/v2/tensorrt_llm.go
  method PageTensorRTLLMs (line 9) | func (b *BaseApi) PageTensorRTLLMs(c *gin.Context) {
  method CreateTensorRTLLM (line 18) | func (b *BaseApi) CreateTensorRTLLM(c *gin.Context) {
  method UpdateTensorRTLLM (line 31) | func (b *BaseApi) UpdateTensorRTLLM(c *gin.Context) {
  method DeleteTensorRTLLM (line 44) | func (b *BaseApi) DeleteTensorRTLLM(c *gin.Context) {
  method OperateTensorRTLLM (line 57) | func (b *BaseApi) OperateTensorRTLLM(c *gin.Context) {

FILE: agent/app/api/v2/terminal.go
  method WsSSH (line 22) | func (b *BaseApi) WsSSH(c *gin.Context) {
  method ContainerWsSSH (line 91) | func (b *BaseApi) ContainerWsSSH(c *gin.Context) {
  function loadRedisInitCmd (line 154) | func loadRedisInitCmd(c *gin.Context, redisType string) ([]string, error) {
  function loadOllamaInitCmd (line 182) | func loadOllamaInitCmd(c *gin.Context) ([]string, error) {
  function loadContainerInitCmd (line 195) | func loadContainerInitCmd(c *gin.Context) ([]string, error) {
  function loadDatabaseInitCmd (line 213) | func loadDatabaseInitCmd(c *gin.Context) ([]string, error) {
  function wshandleError (line 236) | func wshandleError(ws *websocket.Conn, err error) bool {

FILE: agent/app/api/v2/website.go
  method PageWebsite (line 18) | func (b *BaseApi) PageWebsite(c *gin.Context) {
  method GetWebsites (line 40) | func (b *BaseApi) GetWebsites(c *gin.Context) {
  method GetWebsiteOptions (line 55) | func (b *BaseApi) GetWebsiteOptions(c *gin.Context) {
  method CreateWebsite (line 77) | func (b *BaseApi) CreateWebsite(c *gin.Context) {
  method OpWebsite (line 99) | func (b *BaseApi) OpWebsite(c *gin.Context) {
  method DeleteWebsite (line 121) | func (b *BaseApi) DeleteWebsite(c *gin.Context) {
  method UpdateWebsite (line 143) | func (b *BaseApi) UpdateWebsite(c *gin.Context) {
  method GetWebsite (line 163) | func (b *BaseApi) GetWebsite(c *gin.Context) {
  method GetWebsiteNginx (line 185) | func (b *BaseApi) GetWebsiteNginx(c *gin.Context) {
  method GetNginxConfig (line 209) | func (b *BaseApi) GetNginxConfig(c *gin.Context) {
  method UpdateNginxConfig (line 231) | func (b *BaseApi) UpdateNginxConfig(c *gin.Context) {
  method GetHTTPSConfig (line 251) | func (b *BaseApi) GetHTTPSConfig(c *gin.Context) {
  method UpdateHTTPSConfig (line 274) | func (b *BaseApi) UpdateHTTPSConfig(c *gin.Context) {
  method CreateWebsiteCheck (line 298) | func (b *BaseApi) CreateWebsiteCheck(c *gin.Context) {
  method UpdateWebsiteNginxConfig (line 320) | func (b *BaseApi) UpdateWebsiteNginxConfig(c *gin.Context) {
  method OpWebsiteLog (line 341) | func (b *BaseApi) OpWebsiteLog(c *gin.Context) {
  method ChangeDefaultServer (line 363) | func (b *BaseApi) ChangeDefaultServer(c *gin.Context) {
  method ChangePHPVersion (line 384) | func (b *BaseApi) ChangePHPVersion(c *gin.Context) {
  method GetRewriteConfig (line 404) | func (b *BaseApi) GetRewriteConfig(c *gin.Context) {
  method UpdateRewriteConfig (line 426) | func (b *BaseApi) UpdateRewriteConfig(c *gin.Context) {
  method UpdateSiteDir (line 447) | func (b *BaseApi) UpdateSiteDir(c *gin.Context) {
  method UpdateSiteDirPermission (line 468) | func (b *BaseApi) UpdateSiteDirPermission(c *gin.Context) {
  method GetProxyConfig (line 488) | func (b *BaseApi) GetProxyConfig(c *gin.Context) {
  method UpdateProxyConfig (line 510) | func (b *BaseApi) UpdateProxyConfig(c *gin.Context) {
  method DeleteProxyConfig (line 532) | func (b *BaseApi) DeleteProxyConfig(c *gin.Context) {
  method UpdateProxyConfigStatus (line 554) | func (b *BaseApi) UpdateProxyConfigStatus(c *gin.Context) {
  method UpdateProxyConfigFile (line 576) | func (b *BaseApi) UpdateProxyConfigFile(c *gin.Context) {
  method GetAuthConfig (line 596) | func (b *BaseApi) GetAuthConfig(c *gin.Context) {
  method UpdateAuthConfig (line 617) | func (b *BaseApi) UpdateAuthConfig(c *gin.Context) {
  method GetPathAuthConfig (line 637) | func (b *BaseApi) GetPathAuthConfig(c *gin.Context) {
  method UpdatePathAuthConfig (line 658) | func (b *BaseApi) UpdatePathAuthConfig(c *gin.Context) {
  method GetAntiLeech (line 678) | func (b *BaseApi) GetAntiLeech(c *gin.Context) {
  method UpdateAntiLeech (line 699) | func (b *BaseApi) UpdateAntiLeech(c *gin.Context) {
  method UpdateRedirectConfig (line 720) | func (b *BaseApi) UpdateRedirectConfig(c *gin.Context) {
  method GetRedirectConfig (line 741) | func (b *BaseApi) GetRedirectConfig(c *gin.Context) {
  method UpdateRedirectConfigFile (line 763) | func (b *BaseApi) UpdateRedirectConfigFile(c *gin.Context) {
  method GetDirConfig (line 783) | func (b *BaseApi) GetDirConfig(c *gin.Context) {
  method GetDefaultHtml (line 803) | func (b *BaseApi) GetDefaultHtml(c *gin.Context) {
  method UpdateDefaultHtml (line 826) | func (b *BaseApi) UpdateDefaultHtml(c *gin.Context) {
  method GetLoadBalances (line 846) | func (b *BaseApi) GetLoadBalances(c *gin.Context) {
  method CreateLoadBalance (line 868) | func (b *BaseApi) CreateLoadBalance(c *gin.Context) {
  method DeleteLoadBalance (line 888) | func (b *BaseApi) DeleteLoadBalance(c *gin.Context) {
  method UpdateLoadBalance (line 908) | func (b *BaseApi) UpdateLoadBalance(c *gin.Context) {
  method UpdateLoadBalanceFile (line 928) | func (b *BaseApi) UpdateLoadBalanceFile(c *gin.Context) {
  method ChangeWebsiteGroup (line 940) | func (b *BaseApi) ChangeWebsiteGroup(c *gin.Context) {
  method UpdateProxyCache (line 960) | func (b *BaseApi) UpdateProxyCache(c *gin.Context) {
  method GetProxyCache (line 979) | func (b *BaseApi) GetProxyCache(c *gin.Context) {
  method SetRealIPConfig (line 1002) | func (b *BaseApi) SetRealIPConfig(c *gin.Context) {
  method GetRealIPConfig (line 1022) | func (b *BaseApi) GetRealIPConfig(c *gin.Context) {
  method GetWebsiteResource (line 1044) | func (b *BaseApi) GetWebsiteResource(c *gin.Context) {
  method GetWebsiteDatabase (line 1065) | func (b *BaseApi) GetWebsiteDatabase(c *gin.Context) {
  method ChangeWebsiteDatabase (line 1082) | func (b *BaseApi) ChangeWebsiteDatabase(c *gin.Context) {
  method OperateCustomRewrite (line 1102) | func (b *BaseApi) OperateCustomRewrite(c *gin.Context) {
  method ListCustomRewrite (line 1121) | func (b *BaseApi) ListCustomRewrite(c *gin.Context) {
  method ClearProxyCache (line 1137) | func (b *BaseApi) ClearProxyCache(c *gin.Context) {
  method OperateCrossSiteAccess (line 1157) | func (b *BaseApi) OperateCrossSiteAccess(c *gin.Context) {
  method ExecComposer (line 1177) | func (b *BaseApi) ExecComposer(c *gin.Context) {
  method BatchOpWebsites (line 1197) | func (b *BaseApi) BatchOpWebsites(c *gin.Context) {
  method BatchSetWebsiteGroup (line 1217) | func (b *BaseApi) BatchSetWebsiteGroup(c *gin.Context) {
  method GetCORSConfig (line 1237) | func (b *BaseApi) GetCORSConfig(c *gin.Context) {
  method UpdateCORSConfig (line 1259) | func (b *BaseApi) UpdateCORSConfig(c *gin.Context) {
  method UpdateStreamConfig (line 1279) | func (b *BaseApi) UpdateStreamConfig(c *gin.Context) {
  method BatchSetHttps (line 1299) | func (b *BaseApi) BatchSetHttps(c *gin.Context) {

FILE: agent/app/api/v2/website_acme_account.go
  method PageWebsiteAcmeAccount (line 18) | func (b *BaseApi) PageWebsiteAcmeAccount(c *gin.Context) {
  method CreateWebsiteAcmeAccount (line 43) | func (b *BaseApi) CreateWebsiteAcmeAccount(c *gin.Context) {
  method DeleteWebsiteAcmeAccount (line 65) | func (b *BaseApi) DeleteWebsiteAcmeAccount(c *gin.Context) {
  method UpdateWebsiteAcmeAccount (line 86) | func (b *BaseApi) UpdateWebsiteAcmeAccount(c *gin.Context) {

FILE: agent/app/api/v2/website_ca.go
  method PageWebsiteCA (line 22) | func (b *BaseApi) PageWebsiteCA(c *gin.Context) {
  method CreateWebsiteCA (line 47) | func (b *BaseApi) CreateWebsiteCA(c *gin.Context) {
  method GetWebsiteCA (line 68) | func (b *BaseApi) GetWebsiteCA(c *gin.Context) {
  method DeleteWebsiteCA (line 90) | func (b *BaseApi) DeleteWebsiteCA(c *gin.Context) {
  method ObtainWebsiteCA (line 111) | func (b *BaseApi) ObtainWebsiteCA(c *gin.Context) {
  method RenewWebsiteCA (line 133) | func (b *BaseApi) RenewWebsiteCA(c *gin.Context) {
  method DownloadCAFile (line 159) | func (b *BaseApi) DownloadCAFile(c *gin.Context) {

FILE: agent/app/api/v2/website_dns_account.go
  method PageWebsiteDnsAccount (line 18) | func (b *BaseApi) PageWebsiteDnsAccount(c *gin.Context) {
  method CreateWebsiteDnsAccount (line 43) | func (b *BaseApi) CreateWebsiteDnsAccount(c *gin.Context) {
  method UpdateWebsiteDnsAccount (line 64) | func (b *BaseApi) UpdateWebsiteDnsAccount(c *gin.Context) {
  method DeleteWebsiteDnsAccount (line 85) | func (b *BaseApi) DeleteWebsiteDnsAccount(c *gin.Context) {

FILE: agent/app/api/v2/website_domain.go
  method DeleteWebDomain (line 18) | func (b *BaseApi) DeleteWebDomain(c *gin.Context) {
  method CreateWebDomain (line 39) | func (b *BaseApi) CreateWebDomain(c *gin.Context) {
  method GetWebDomains (line 60) | func (b *BaseApi) GetWebDomains(c *gin.Context) {
  method UpdateWebDomain (line 83) | func (b *BaseApi) UpdateWebDomain(c *gin.Context) {

FILE: agent/app/api/v2/website_ssl.go
  method PageWebsiteSSL (line 26) | func (b *BaseApi) PageWebsiteSSL(c *gin.Context) {
  method ListWebsiteSSL (line 50) | func (b *BaseApi) ListWebsiteSSL(c *gin.Context) {
  method CreateWebsiteSSL (line 72) | func (b *BaseApi) CreateWebsiteSSL(c *gin.Context) {
  method ApplyWebsiteSSL (line 94) | func (b *BaseApi) ApplyWebsiteSSL(c *gin.Context) {
  method GetDNSResolve (line 114) | func (b *BaseApi) GetDNSResolve(c *gin.Context) {
  method DeleteWebsiteSSL (line 136) | func (b *BaseApi) DeleteWebsiteSSL(c *gin.Context) {
  method GetWebsiteSSLByWebsiteId (line 156) | func (b *BaseApi) GetWebsiteSSLByWebsiteId(c *gin.Context) {
  method GetWebsiteSSLById (line 178) | func (b *BaseApi) GetWebsiteSSLById(c *gin.Context) {
  method UpdateWebsiteSSL (line 201) | func (b *BaseApi) UpdateWebsiteSSL(c *gin.Context) {
  method UploadWebsiteSSL (line 222) | func (b *BaseApi) UploadWebsiteSSL(c *gin.Context) {
  method UploadSSLFile (line 247) | func (b *BaseApi) UploadSSLFile(c *gin.Context) {
  function readUploadedFile (line 296) | func readUploadedFile(fileHeader *multipart.FileHeader) ([]byte, error) {
  method DownloadWebsiteSSL (line 315) | func (b *BaseApi) DownloadWebsiteSSL(c *gin.Context) {
  method ImportMasterSSL (line 336) | func (b *BaseApi) ImportMasterSSL(c *gin.Context) {

FILE: agent/app/dto/agents.go
  type AgentCreateReq (line 5) | type AgentCreateReq struct
  type AgentItem (line 29) | type AgentItem struct
  type AgentDeleteReq (line 56) | type AgentDeleteReq struct
  type AgentTokenResetReq (line 62) | type AgentTokenResetReq struct
  type AgentModelConfigUpdateReq (line 66) | type AgentModelConfigUpdateReq struct
  type AgentAccountModel (line 72) | type AgentAccountModel struct
  type AgentAccountModelReq (line 82) | type AgentAccountModelReq struct
  type AgentAccountModelCreateReq (line 86) | type AgentAccountModelCreateReq struct
  type AgentAccountModelUpdateReq (line 91) | type AgentAccountModelUpdateReq struct
  type AgentAccountModelDeleteReq (line 96) | type AgentAccountModelDeleteReq struct
  type AgentAccountCreateReq (line 101) | type AgentAccountCreateReq struct
  type AgentAccountUpdateReq (line 112) | type AgentAccountUpdateReq struct
  type AgentAccountVerifyReq (line 123) | type AgentAccountVerifyReq struct
  type AgentAccountDeleteReq (line 129) | type AgentAccountDeleteReq struct
  type AgentAccountSearch (line 133) | type AgentAccountSearch struct
  type AgentAccountInfo (line 139) | type AgentAccountInfo struct
  type ProviderModelInfo (line 154) | type ProviderModelInfo struct
  type ProviderInfo (line 163) | type ProviderInfo struct
  type AgentFeishuConfigReq (line 171) | type AgentFeishuConfigReq struct
  type AgentFeishuConfigUpdateReq (line 175) | type AgentFeishuConfigUpdateReq struct
  type AgentFeishuPairingApproveReq (line 184) | type AgentFeishuPairingApproveReq struct
  type AgentFeishuConfig (line 189) | type AgentFeishuConfig struct
  type AgentTelegramConfigReq (line 197) | type AgentTelegramConfigReq struct
  type AgentTelegramConfigUpdateReq (line 201) | type AgentTelegramConfigUpdateReq struct
  type AgentTelegramConfig (line 209) | type AgentTelegramConfig struct
  type AgentChannelPairingApproveReq (line 216) | type AgentChannelPairingApproveReq struct
  type AgentWecomConfigReq (line 222) | type AgentWecomConfigReq struct
  type AgentWecomConfigUpdateReq (line 226) | type AgentWecomConfigUpdateReq struct
  type AgentWecomConfig (line 234) | type AgentWecomConfig struct
  type AgentDingTalkConfigReq (line 242) | type AgentDingTalkConfigReq struct
  type AgentDingTalkConfigUpdateReq (line 246) | type AgentDingTalkConfigUpdateReq struct
  type AgentDingTalkConfig (line 257) | type AgentDingTalkConfig struct
  type AgentQQBotConfigReq (line 268) | type AgentQQBotConfigReq struct
  type AgentQQBotConfigUpdateReq (line 272) | type AgentQQBotConfigUpdateReq struct
  type AgentQQBotConfig (line 279) | type AgentQQBotConfig struct
  type AgentPluginInstallReq (line 286) | type AgentPluginInstallReq struct
  type AgentPluginCheckReq (line 292) | type AgentPluginCheckReq struct
  type AgentPluginStatus (line 297) | type AgentPluginStatus struct
  type AgentDiscordConfigReq (line 301) | type AgentDiscordConfigReq struct
  type AgentDiscordConfigUpdateReq (line 305) | type AgentDiscordConfigUpdateReq struct
  type AgentDiscordConfig (line 314) | type AgentDiscordConfig struct
  type AgentSecurityConfigReq (line 322) | type AgentSecurityConfigReq struct
  type AgentSecurityConfigUpdateReq (line 326) | type AgentSecurityConfigUpdateReq struct
  type AgentSecurityConfig (line 331) | type AgentSecurityConfig struct
  type AgentOtherConfigReq (line 335) | type AgentOtherConfigReq struct
  type AgentOtherConfigUpdateReq (line 339) | type AgentOtherConfigUpdateReq struct
  type AgentOtherConfig (line 345) | type AgentOtherConfig struct

FILE: agent/app/dto/ai.go
  type OllamaModelInfo (line 5) | type OllamaModelInfo struct
  type OllamaModelDropList (line 17) | type OllamaModelDropList struct
  type OllamaModelName (line 22) | type OllamaModelName struct
  type OllamaBindDomain (line 27) | type OllamaBindDomain struct
  type OllamaBindDomainReq (line 35) | type OllamaBindDomainReq struct
  type OllamaBindDomainRes (line 39) | type OllamaBindDomainRes struct

FILE: agent/app/dto/alert.go
  type CreateOrUpdateAlert (line 9) | type CreateOrUpdateAlert struct
  type AlertBase (line 17) | type AlertBase struct
  type PushAlert (line 22) | type PushAlert struct
  type AlertSearch (line 29) | type AlertSearch struct
  type AlertDTO (line 38) | type AlertDTO struct
  type AlertCreate (line 53) | type AlertCreate struct
  type AlertUpdate (line 65) | type AlertUpdate struct
  type DeleteRequest (line 78) | type DeleteRequest struct
  type AlertUpdateStatus (line 82) | type AlertUpdateStatus struct
  type DiskDTO (line 87) | type DiskDTO struct
  type AlertLogSearch (line 102) | type AlertLogSearch struct
  type AlertLogDTO (line 108) | type AlertLogDTO struct
  type AlertLogCreate (line 122) | type AlertLogCreate struct
  type AlertLog (line 135) | type AlertLog struct
  type AlertDetail (line 139) | type AlertDetail struct
  type AlertRule (line 152) | type AlertRule struct
  type Param (line 166) | type Param struct
  type ClamDTO (line 172) | type ClamDTO struct
  type CronJobDTO (line 181) | type CronJobDTO struct
  type CronJobReq (line 190) | type CronJobReq struct
  type UpgradeInfo (line 196) | type UpgradeInfo struct
  type AlertDiskInfo (line 203) | type AlertDiskInfo struct
  type SyncResult (line 209) | type SyncResult struct
  type QueryRequest (line 220) | type QueryRequest struct
  type AlertResponse (line 225) | type AlertResponse struct
  type PushResult (line 231) | type PushResult struct
  type UpdateOfflineAlertLog (line 236) | type UpdateOfflineAlertLog struct
  type SyncOfflineAlertLogDTO (line 244) | type SyncOfflineAlertLogDTO struct
  type OfflineAlertResponse (line 251) | type OfflineAlertResponse struct
  type OfflineAlertLogDTO (line 261) | type OfflineAlertLogDTO struct
  type OfflineQueryRequest (line 277) | type OfflineQueryRequest struct
  type AlertConfigUpdate (line 283) | type AlertConfigUpdate struct
  type AlertConfigTest (line 291) | type AlertConfigTest struct
  type AlertSendTimeRange (line 302) | type AlertSendTimeRange struct
  type AlertCommonConfig (line 313) | type AlertCommonConfig struct
  type AlertSmsConfig (line 318) | type AlertSmsConfig struct
  type AlertEmailConfig (line 323) | type AlertEmailConfig struct
  type AgentInfo (line 334) | type AgentInfo struct
  type AlertWebhookConfig (line 339) | type AlertWebhookConfig struct

FILE: agent/app/dto/app.go
  type AppDatabase (line 9) | type AppDatabase struct
  type AuthParam (line 19) | type AuthParam struct
  type RedisAuthParam (line 24) | type RedisAuthParam struct
  type MinioAuthParam (line 28) | type MinioAuthParam struct
  type ContainerExec (line 33) | type ContainerExec struct
  type AppOssConfig (line 39) | type AppOssConfig struct
  type AppVersion (line 44) | type AppVersion struct
  type AppList (line 50) | type AppList struct
  type AppDefine (line 59) | type AppDefine struct
  type LocalAppAppDefine (line 69) | type LocalAppAppDefine struct
  type LocalAppParam (line 73) | type LocalAppParam struct
  type LocalAppInstallDefine (line 77) | type LocalAppInstallDefine struct
  type ExtraProperties (line 81) | type ExtraProperties struct
  type AppProperty (line 86) | type AppProperty struct
  type AppConfigVersion (line 109) | type AppConfigVersion struct
  type Tag (line 117) | type Tag struct
  type Locale (line 124) | type Locale struct
  type AppForm (line 137) | type AppForm struct
  type AppFormFields (line 142) | type AppFormFields struct
  type AppFormValue (line 159) | type AppFormValue struct
  type AppResource (line 164) | type AppResource struct
  type AppInstallInfo (line 174) | type AppInstallInfo struct
  type DelAppLink (line 180) | type DelAppLink struct
  type PHPForm (line 187) | type PHPForm struct

FILE: agent/app/dto/backup.go
  type BackupOperate (line 7) | type BackupOperate struct
  type BackupInfo (line 21) | type BackupInfo struct
  type BackupCheckRes (line 36) | type BackupCheckRes struct
  type ForBuckets (line 42) | type ForBuckets struct
  type SyncFromMaster (line 49) | type SyncFromMaster struct
  type BackupOption (line 55) | type BackupOption struct
  type UploadForRecover (line 62) | type UploadForRecover struct
  type CommonBackup (line 67) | type CommonBackup struct
  type CommonRecover (line 79) | type CommonRecover struct
  type RecordSearch (line 91) | type RecordSearch struct
  type RecordSearchByCronjob (line 98) | type RecordSearchByCronjob struct
  type BackupRecords (line 103) | type BackupRecords struct
  type DownloadRecord (line 117) | type DownloadRecord struct
  type SearchForSize (line 123) | type SearchForSize struct
  type RecordFileSize (line 133) | type RecordFileSize struct

FILE: agent/app/dto/clam.go
  type SearchClamWithPage (line 7) | type SearchClamWithPage struct
  type ClamBaseInfo (line 14) | type ClamBaseInfo struct
  type ClamInfo (line 24) | type ClamInfo struct
  type ClamLogSearch (line 42) | type ClamLogSearch struct
  type ClamLogReq (line 51) | type ClamLogReq struct
  type ClamFileReq (line 57) | type ClamFileReq struct
  type ClamRecord (line 62) | type ClamRecord struct
  type ClamCreate (line 74) | type ClamCreate struct
  type ClamUpdate (line 88) | type ClamUpdate struct
  type ClamUpdateStatus (line 103) | type ClamUpdateStatus struct
  type ClamDelete (line 108) | type ClamDelete struct

FILE: agent/app/dto/command.go
  type SearchCommandWithPage (line 3) | type SearchCommandWithPage struct
  type CommandOperate (line 12) | type CommandOperate struct
  type CommandInfo (line 20) | type CommandInfo struct
  type CommandTree (line 28) | type CommandTree struct
  type RedisCommand (line 34) | type RedisCommand struct

FILE: agent/app/dto/common_req.go
  type SearchWithPage (line 3) | type SearchWithPage struct
  type SearchPageWithType (line 8) | type SearchPageWithType struct
  type SearchPageWithGroup (line 14) | type SearchPageWithGroup struct
  type PageInfo (line 20) | type PageInfo struct
  type UpdateDescription (line 25) | type UpdateDescription struct
  type OperationWithName (line 30) | type OperationWithName struct
  type OperateByID (line 34) | type OperateByID struct
  type OperateByIDs (line 37) | type OperateByIDs struct
  type Operate (line 41) | type Operate struct
  type SearchByFilter (line 45) | type SearchByFilter struct
  type BatchDeleteReq (line 49) | type BatchDeleteReq struct
  type FilePath (line 53) | type FilePath struct
  type DeleteByName (line 57) | type DeleteByName struct
  type UpdateByFile (line 61) | type UpdateByFile struct
  type UpdateByNameAndFile (line 65) | type UpdateByNameAndFile struct
  type OperationWithNameAndType (line 70) | type OperationWithNameAndType struct
  type UpdateGroup (line 75) | type UpdateGroup struct
  type OperateWithTask (line 80) | type OperateWithTask struct
  type ForceDelete (line 84) | type ForceDelete struct
  type ChangeGroup (line 89) | type ChangeGroup struct

FILE: agent/app/dto/common_res.go
  type PageResult (line 3) | type PageResult struct
  type Response (line 8) | type Response struct
  type Options (line 14) | type Options struct

FILE: agent/app/dto/compose_template.go
  type ComposeTemplateCreate (line 5) | type ComposeTemplateCreate struct
  type ComposeTemplateBatch (line 11) | type ComposeTemplateBatch struct
  type ComposeTemplateUpdate (line 15) | type ComposeTemplateUpdate struct
  type ComposeTemplateInfo (line 21) | type ComposeTemplateInfo struct

FILE: agent/app/dto/container.go
  type PageContainer (line 7) | type PageContainer struct
  type InspectReq (line 17) | type InspectReq struct
  type ContainerInfo (line 23) | type ContainerInfo struct
  type ContainerOptions (line 46) | type ContainerOptions struct
  type ContainerFileReq (line 51) | type ContainerFileReq struct
  type ContainerFileBatchDeleteReq (line 56) | type ContainerFileBatchDeleteReq struct
  type ContainerFileInfo (line 61) | type ContainerFileInfo struct
  type ContainerFileContent (line 72) | type ContainerFileContent struct
  type ContainerStatus (line 79) | type ContainerStatus struct
  type ResourceLimit (line 96) | type ResourceLimit struct
  type ContainerOperate (line 101) | type ContainerOperate struct
  type ExtraHost (line 132) | type ExtraHost struct
  type ContainerNetwork (line 136) | type ContainerNetwork struct
  type ContainerCreateByCommand (line 143) | type ContainerCreateByCommand struct
  type ContainerUpgrade (line 148) | type ContainerUpgrade struct
  type ContainerItemStats (line 155) | type ContainerItemStats struct
  type ContainerListStats (line 168) | type ContainerListStats struct
  type ContainerStats (line 182) | type ContainerStats struct
  type VolumeHelper (line 194) | type VolumeHelper struct
  type PortHelper (line 201) | type PortHelper struct
  type ContainerOperation (line 208) | type ContainerOperation struct
  type ContainerRename (line 214) | type ContainerRename struct
  type ContainerCommit (line 219) | type ContainerCommit struct
  type ContainerPrune (line 230) | type ContainerPrune struct
  type Network (line 236) | type Network struct
  type NetworkCreate (line 247) | type NetworkCreate struct
  type Volume (line 265) | type Volume struct
  type VolumeCreate (line 273) | type VolumeCreate struct
  type VolumeOption (line 279) | type VolumeOption struct
  type BatchDelete (line 283) | type BatchDelete struct
  type ComposeInfo (line 289) | type ComposeInfo struct
  type ComposeContainer (line 301) | type ComposeContainer struct
  type ComposeCreate (line 308) | type ComposeCreate struct
  type ComposeOperation (line 318) | type ComposeOperation struct
  type ComposeUpdate (line 325) | type ComposeUpdate struct
  type ComposeLogClean (line 334) | type ComposeLogClean struct
  type ContainerLog (line 340) | type ContainerLog struct
  type StreamLog (line 348) | type StreamLog struct

FILE: agent/app/dto/cronjob.go
  type PageCronjob (line 7) | type PageCronjob struct
  type CronjobSpec (line 15) | type CronjobSpec struct
  type CronjobOperate (line 19) | type CronjobOperate struct
  type CleanLogConfig (line 61) | type CleanLogConfig struct
  type SnapshotRule (line 65) | type SnapshotRule struct
  type CronjobUpdateStatus (line 70) | type CronjobUpdateStatus struct
  type CronjobClean (line 75) | type CronjobClean struct
  type CronjobBatchDelete (line 82) | type CronjobBatchDelete struct
  type CronjobInfo (line 88) | type CronjobInfo struct
  type CronjobImport (line 132) | type CronjobImport struct
  type CronjobTrans (line 135) | type CronjobTrans struct
  type TransHelper (line 176) | type TransHelper struct
  type SnapshotTransHelper (line 180) | type SnapshotTransHelper struct
  type ScriptOptions (line 185) | type ScriptOptions struct
  type SearchRecord (line 190) | type SearchRecord struct
  type Record (line 198) | type Record struct

FILE: agent/app/dto/dashboard.go
  type DashboardBase (line 5) | type DashboardBase struct
  type ChangeQuicks (line 33) | type ChangeQuicks struct
  type QuickJump (line 37) | type QuickJump struct
  type OsInfo (line 48) | type OsInfo struct
  type NodeCurrent (line 59) | type NodeCurrent struct
  type DashboardCurrent (line 81) | type DashboardCurrent struct
  type AppLauncherSync (line 131) | type AppLauncherSync struct
  type DiskInfo (line 135) | type DiskInfo struct
  type GPUInfo (line 150) | type GPUInfo struct
  type AppLauncher (line 165) | type AppLauncher struct
  type InstallDetail (line 179) | type InstallDetail struct
  type LauncherOption (line 191) | type LauncherOption struct
  type XPUInfo (line 196) | type XPUInfo struct

FILE: agent/app/dto/database.go
  type DBConfUpdateByFile (line 6) | type DBConfUpdateByFile struct
  type ChangeDBInfo (line 11) | type ChangeDBInfo struct
  type DBBaseInfo (line 19) | type DBBaseInfo struct
  type MysqlDBSearch (line 26) | type MysqlDBSearch struct
  type MysqlDBInfo (line 34) | type MysqlDBInfo struct
  type MysqlOption (line 49) | type MysqlOption struct
  type MysqlDBCreate (line 57) | type MysqlDBCreate struct
  type MysqlFormatCollationOption (line 69) | type MysqlFormatCollationOption struct
  type BindUser (line 74) | type BindUser struct
  type MysqlLoadDB (line 82) | type MysqlLoadDB struct
  type MysqlDBDeleteCheck (line 88) | type MysqlDBDeleteCheck struct
  type MysqlDBDelete (line 94) | type MysqlDBDelete struct
  type MysqlStatus (line 102) | type MysqlStatus struct
  type MysqlVariables (line 140) | type MysqlVariables struct
  type MysqlVariablesUpdate (line 162) | type MysqlVariablesUpdate struct
  type MysqlVariablesUpdateHelper (line 168) | type MysqlVariablesUpdateHelper struct
  type ChangeRedisPass (line 174) | type ChangeRedisPass struct
  type RedisConfUpdate (line 179) | type RedisConfUpdate struct
  type RedisConfPersistenceUpdate (line 186) | type RedisConfPersistenceUpdate struct
  type RedisConf (line 195) | type RedisConf struct
  type RedisPersistence (line 206) | type RedisPersistence struct
  type RedisStatus (line 213) | type RedisStatus struct
  type DatabaseFileRecords (line 230) | type DatabaseFileRecords struct
  type RedisBackupRecover (line 237) | type RedisBackupRecover struct
  type DatabaseSearch (line 244) | type DatabaseSearch struct
  type DatabaseInfo (line 252) | type DatabaseInfo struct
  type DatabaseOption (line 275) | type DatabaseOption struct
  type DatabaseItem (line 284) | type DatabaseItem struct
  type DatabaseCreate (line 291) | type DatabaseCreate struct
  type DatabaseUpdate (line 312) | type DatabaseUpdate struct
  type DatabaseDelete (line 332) | type DatabaseDelete struct
  type LoadRedisStatus (line 338) | type LoadRedisStatus struct
  type DBResource (line 343) | type DBResource struct

FILE: agent/app/dto/database_postgresql.go
  type PostgresqlDBSearch (line 5) | type PostgresqlDBSearch struct
  type PostgresqlDBInfo (line 13) | type PostgresqlDBInfo struct
  type PostgresqlOption (line 27) | type PostgresqlOption struct
  type PostgresqlDBCreate (line 35) | type PostgresqlDBCreate struct
  type PostgresqlBindUser (line 46) | type PostgresqlBindUser struct
  type PostgresqlPrivileges (line 54) | type PostgresqlPrivileges struct
  type PostgresqlLoadDB (line 61) | type PostgresqlLoadDB struct
  type PostgresqlDBDeleteCheck (line 67) | type PostgresqlDBDeleteCheck struct
  type PostgresqlDBDelete (line 73) | type PostgresqlDBDelete struct

FILE: agent/app/dto/device.go
  type DeviceBaseInfo (line 3) | type DeviceBaseInfo struct
  type HostHelper (line 20) | type HostHelper struct
  type SwapHelper (line 25) | type SwapHelper struct
  type TimeZoneOptions (line 34) | type TimeZoneOptions struct
  type ChangePasswd (line 39) | type ChangePasswd struct

FILE: agent/app/dto/disk.go
  type LsblkDevice (line 3) | type LsblkDevice struct
  type LsblkOutput (line 16) | type LsblkOutput struct
  type DiskFormatRequest (line 20) | type DiskFormatRequest struct

FILE: agent/app/dto/docker.go
  type DaemonJsonUpdateByFile (line 3) | type DaemonJsonUpdateByFile struct
  type DockerStatus (line 7) | type DockerStatus struct
  type DaemonJsonConf (line 12) | type DaemonJsonConf struct
  type LogOption (line 30) | type LogOption struct
  type Ipv6Option (line 35) | type Ipv6Option struct
  type DockerOperation (line 41) | type DockerOperation struct

FILE: agent/app/dto/fail2ban.go
  type Fail2BanBaseInfo (line 3) | type Fail2BanBaseInfo struct
  type Fail2BanSearch (line 17) | type Fail2BanSearch struct
  type Fail2BanUpdate (line 21) | type Fail2BanUpdate struct
  type Fail2BanSet (line 26) | type Fail2BanSet struct

FILE: agent/app/dto/file.go
  type LogFileRes (line 3) | type LogFileRes struct

FILE: agent/app/dto/firewall.go
  type FirewallBaseInfo (line 3) | type FirewallBaseInfo struct
  type RuleSearch (line 13) | type RuleSearch struct
  type FirewallOperation (line 21) | type FirewallOperation struct
  type PortRuleOperate (line 26) | type PortRuleOperate struct
  type ForwardRuleOperate (line 38) | type ForwardRuleOperate struct
  type UpdateFirewallDescription (line 51) | type UpdateFirewallDescription struct
  type AddrRuleOperate (line 64) | type AddrRuleOperate struct
  type PortRuleUpdate (line 73) | type PortRuleUpdate struct
  type AddrRuleUpdate (line 78) | type AddrRuleUpdate struct
  type BatchRuleOperate (line 83) | type BatchRuleOperate struct
  type IptablesOp (line 88) | type IptablesOp struct
  type IptablesRuleOp (line 93) | type IptablesRuleOp struct
  type IptablesBatchOperate (line 106) | type IptablesBatchOperate struct
  type IptablesChainStatus (line 110) | type IptablesChainStatus struct

FILE: agent/app/dto/ftp.go
  type FtpInfo (line 7) | type FtpInfo struct
  type FtpBaseInfo (line 18) | type FtpBaseInfo struct
  type FtpLogSearch (line 23) | type FtpLogSearch struct
  type FtpCreate (line 29) | type FtpCreate struct
  type FtpUpdate (line 36) | type FtpUpdate struct

FILE: agent/app/dto/group.go
  type GroupCreate (line 3) | type GroupCreate struct
  type GroupSearch (line 9) | type GroupSearch struct
  type GroupUpdate (line 13) | type GroupUpdate struct
  type GroupInfo (line 20) | type GroupInfo struct
  type OperateByType (line 27) | type OperateByType struct

FILE: agent/app/dto/host.go
  type HostOperate (line 5) | type HostOperate struct
  type HostConnTest (line 21) | type HostConnTest struct
  type SearchForTree (line 31) | type SearchForTree struct
  type HostInfo (line 35) | type HostInfo struct
  type HostTree (line 53) | type HostTree struct
  type TreeChild (line 59) | type TreeChild struct

FILE: agent/app/dto/image.go
  type PageImage (line 5) | type PageImage struct
  type ImageInfo (line 12) | type ImageInfo struct
  type ImageLoad (line 23) | type ImageLoad struct
  type ImageBuild (line 28) | type ImageBuild struct
  type ImagePull (line 37) | type ImagePull struct
  type ImageTag (line 43) | type ImageTag struct
  type ImagePush (line 48) | type ImagePush struct
  type ImageSave (line 55) | type ImageSave struct

FILE: agent/app/dto/image_repo.go
  type ImageRepoCreate (line 5) | type ImageRepoCreate struct
  type ImageRepoUpdate (line 14) | type ImageRepoUpdate struct
  type ImageRepoInfo (line 23) | type ImageRepoInfo struct
  type ImageRepoOption (line 36) | type ImageRepoOption struct
  type ImageRepoDelete (line 42) | type ImageRepoDelete struct

FILE: agent/app/dto/logs.go
  type SearchTaskLogReq (line 7) | type SearchTaskLogReq struct
  type TaskDTO (line 13) | type TaskDTO struct

FILE: agent/app/dto/monitor.go
  type MonitorSearch (line 5) | type MonitorSearch struct
  type MonitorData (line 13) | type MonitorData struct
  type Process (line 19) | type Process struct
  type MonitorSetting (line 28) | type MonitorSetting struct
  type MonitorSettingUpdate (line 36) | type MonitorSettingUpdate struct
  type MonitorGPUOptions (line 41) | type MonitorGPUOptions struct
  type GPUChartHide (line 46) | type GPUChartHide struct
  type MonitorGPUSearch (line 55) | type MonitorGPUSearch struct
  type MonitorGPUData (line 60) | type MonitorGPUData struct
  type GPUProcess (line 76) | type GPUProcess struct

FILE: agent/app/dto/nginx.go
  type NginxFull (line 8) | type NginxFull struct
  type NginxConfig (line 19) | type NginxConfig struct
  type NginxParam (line 25) | type NginxParam struct
  type NginxAuth (line 31) | type NginxAuth struct
  type NginxPathAuth (line 36) | type NginxPathAuth struct
  type NginxKey (line 43) | type NginxKey
  constant Index (line 46) | Index      NginxKey = "index"
  constant LimitConn (line 47) | LimitConn  NginxKey = "limit-conn"
  constant SSL (line 48) | SSL        NginxKey = "ssl"
  constant CACHE (line 49) | CACHE      NginxKey = "cache"
  constant HttpPer (line 50) | HttpPer    NginxKey = "http-per"
  constant ProxyCache (line 51) | ProxyCache NginxKey = "proxy-cache"
  type NginxUpstream (line 68) | type NginxUpstream struct
  type NginxUpstreamServer (line 75) | type NginxUpstreamServer struct
  type NginxModule (line 89) | type NginxModule struct

FILE: agent/app/dto/request/app.go
  type AppSearch (line 9) | type AppSearch struct
  type AppInstallCreate (line 19) | type AppInstallCreate struct
  type NodePushConfig (line 30) | type NodePushConfig struct
  type AppContainerConfig (line 37) | type AppContainerConfig struct
  type AppInstalledSearch (line 55) | type AppInstalledSearch struct
  type AppInstalledInfo (line 67) | type AppInstalledInfo struct
  type AppBackupSearch (line 72) | type AppBackupSearch struct
  type AppBackupDelete (line 77) | type AppBackupDelete struct
  type AppInstalledOperate (line 81) | type AppInstalledOperate struct
  type AppInstallUpgrade (line 97) | type AppInstallUpgrade struct
  type AppInstallDelete (line 106) | type AppInstallDelete struct
  type AppInstalledUpdate (line 115) | type AppInstalledUpdate struct
  type AppConfigUpdate (line 121) | type AppConfigUpdate struct
  type AppInstalledIgnoreUpgrade (line 126) | type AppInstalledIgnoreUpgrade struct
  type PortUpdate (line 131) | type PortUpdate struct
  type AppUpdateVersion (line 137) | type AppUpdateVersion struct
  type AppInstallSortItem (line 142) | type AppInstallSortItem struct
  type AppInstallSort (line 147) | type AppInstallSort struct

FILE: agent/app/dto/request/app_ignore_upgrade.go
  type AppIgnoreUpgradeReq (line 3) | type AppIgnoreUpgradeReq struct

FILE: agent/app/dto/request/common.go
  type ReqWithID (line 3) | type ReqWithID struct

FILE: agent/app/dto/request/disk.go
  type DiskPartitionRequest (line 3) | type DiskPartitionRequest struct
  type DiskMountRequest (line 11) | type DiskMountRequest struct
  type DiskUnmountRequest (line 19) | type DiskUnmountRequest struct

FILE: agent/app/dto/request/favorite.go
  type FavoriteCreate (line 3) | type FavoriteCreate struct
  type FavoriteDelete (line 7) | type FavoriteDelete struct

FILE: agent/app/dto/request/file.go
  type FileOption (line 8) | type FileOption struct
  type FileContentReq (line 12) | type FileContentReq struct
  type SearchUploadWithPage (line 16) | type SearchUploadWithPage struct
  type FileCreate (line 21) | type FileCreate struct
  type FileRoleReq (line 32) | type FileRoleReq struct
  type FileDelete (line 40) | type FileDelete struct
  type FileBatchDelete (line 46) | type FileBatchDelete struct
  type FileCompress (line 51) | type FileCompress struct
  type FileDeCompress (line 60) | type FileDeCompress struct
  type FileEdit (line 67) | type FileEdit struct
  type FileRename (line 72) | type FileRename struct
  type FilePathCheck (line 77) | type FilePathCheck struct
  type FilePathsCheck (line 82) | type FilePathsCheck struct
  type FileWget (line 86) | type FileWget struct
  type FileMove (line 93) | type FileMove struct
  type FileDownload (line 102) | type FileDownload struct
  type FileChunkDownload (line 109) | type FileChunkDownload struct
  type DirSizeReq (line 114) | type DirSizeReq struct
  type FileProcessReq (line 118) | type FileProcessReq struct
  type FileRoleUpdate (line 122) | type FileRoleUpdate struct
  type FileReadByLineReq (line 129) | type FileReadByLineReq struct
  type TaskReq (line 139) | type TaskReq struct
  type FileExistReq (line 146) | type FileExistReq struct
  type FileConvert (line 151) | type FileConvert struct
  type FileConvertRequest (line 160) | type FileConvertRequest struct
  type FileRemarkBatch (line 167) | type FileRemarkBatch struct
  type FileRemarkUpdate (line 171) | type FileRemarkUpdate struct

FILE: agent/app/dto/request/host_tool.go
  type HostToolReq (line 3) | type HostToolReq struct
  type HostToolCreate (line 8) | type HostToolCreate struct
  type SupervisorConfig (line 13) | type SupervisorConfig struct
  type HostToolLogReq (line 18) | type HostToolLogReq struct
  type HostToolConfig (line 22) | type HostToolConfig struct
  type SupervisorProcessConfig (line 28) | type SupervisorProcessConfig struct
  type SupervisorProcessFileReq (line 40) | type SupervisorProcessFileReq struct

FILE: agent/app/dto/request/mcp_server.go
  type McpServerSearch (line 5) | type McpServerSearch struct
  type McpServerCreate (line 11) | type McpServerCreate struct
  type McpServerUpdate (line 26) | type McpServerUpdate struct
  type McpServerDelete (line 31) | type McpServerDelete struct
  type McpServerOperate (line 35) | type McpServerOperate struct
  type McpBindDomain (line 40) | type McpBindDomain struct
  type McpBindDomainUpdate (line 46) | type McpBindDomainUpdate struct

FILE: agent/app/dto/request/nginx.go
  type NginxConfigFileUpdate (line 5) | type NginxConfigFileUpdate struct
  type NginxScopeReq (line 10) | type NginxScopeReq struct
  type NginxConfigUpdate (line 15) | type NginxConfigUpdate struct
  type NginxRewriteReq (line 22) | type NginxRewriteReq struct
  type CustomRewriteOperate (line 27) | type CustomRewriteOperate struct
  type NginxRewriteUpdate (line 33) | type NginxRewriteUpdate struct
  type NginxProxyUpdate (line 39) | type NginxProxyUpdate struct
  type NginxProxyCacheUpdate (line 45) | type NginxProxyCacheUpdate struct
  type NginxAuthUpdate (line 56) | type NginxAuthUpdate struct
  type NginxPathAuthUpdate (line 64) | type NginxPathAuthUpdate struct
  type NginxAuthReq (line 74) | type NginxAuthReq struct
  type NginxCommonReq (line 78) | type NginxCommonReq struct
  type NginxAntiLeechUpdate (line 82) | type NginxAntiLeechUpdate struct
  type NginxRedirectReq (line 96) | type NginxRedirectReq struct
  type NginxRedirectUpdate (line 110) | type NginxRedirectUpdate struct
  type NginxBuildReq (line 116) | type NginxBuildReq struct
  type NginxModuleUpdate (line 121) | type NginxModuleUpdate struct
  type NginxOperateReq (line 130) | type NginxOperateReq struct
  type NginxDefaultHTTPSUpdate (line 134) | type NginxDefaultHTTPSUpdate struct

FILE: agent/app/dto/request/php_extensions.go
  type PHPExtensionsSearch (line 5) | type PHPExtensionsSearch struct
  type PHPExtensionsCreate (line 10) | type PHPExtensionsCreate struct
  type PHPExtensionsUpdate (line 15) | type PHPExtensionsUpdate struct
  type PHPExtensionsDelete (line 20) | type PHPExtensionsDelete struct

FILE: agent/app/dto/request/process.go
  type ProcessReq (line 3) | type ProcessReq struct

FILE: agent/app/dto/request/recycle_bin.go
  type RecycleBinCreate (line 3) | type RecycleBinCreate struct
  type RecycleBinReduce (line 7) | type RecycleBinReduce struct

FILE: agent/app/dto/request/runtime.go
  type RuntimeSearch (line 7) | type RuntimeSearch struct
  type RuntimeCreate (line 14) | type RuntimeCreate struct
  type NodeConfig (line 29) | type NodeConfig struct
  type Environment (line 38) | type Environment struct
  type Volume (line 42) | type Volume struct
  type ExposedPort (line 47) | type ExposedPort struct
  type ExtraHost (line 53) | type ExtraHost struct
  type RuntimeDelete (line 58) | type RuntimeDelete struct
  type RuntimeUpdate (line 63) | type RuntimeUpdate struct
  type NodePackageReq (line 77) | type NodePackageReq struct
  type RuntimeOperate (line 81) | type RuntimeOperate struct
  type NodeModuleOperateReq (line 86) | type NodeModuleOperateReq struct
  type NodeModuleReq (line 93) | type NodeModuleReq struct
  type PHPExtensionInstallReq (line 97) | type PHPExtensionInstallReq struct
  type PHPConfigUpdate (line 103) | type PHPConfigUpdate struct
  type PHPFileUpdate (line 112) | type PHPFileUpdate struct
  type PHPFileReq (line 118) | type PHPFileReq struct
  type FPMConfig (line 123) | type FPMConfig struct
  type PHPSupervisorProcessConfig (line 128) | type PHPSupervisorProcessConfig struct
  type PHPSupervisorProcessFileReq (line 133) | type PHPSupervisorProcessFileReq struct
  type PHPContainerConfig (line 138) | type PHPContainerConfig struct
  type RuntimeRemark (line 147) | type RuntimeRemark struct

FILE: agent/app/dto/request/tensorrt_llm.go
  type TensorRTLLMSearch (line 5) | type TensorRTLLMSearch struct
  type TensorRTLLMCreate (line 10) | type TensorRTLLMCreate struct
  type TensorRTLLMUpdate (line 22) | type TensorRTLLMUpdate struct
  type TensorRTLLMDelete (line 27) | type TensorRTLLMDelete struct
  type TensorRTLLMOperate (line 31) | type TensorRTLLMOperate struct
  type DockerConfig (line 36) | type DockerConfig struct

FILE: agent/app/dto/request/website.go
  type WebsiteSearch (line 7) | type WebsiteSearch struct
  type WebsiteCreate (line 16) | type WebsiteCreate struct
  type StreamConfig (line 44) | type StreamConfig struct
  type StreamUpdate (line 53) | type StreamUpdate struct
  type WebsiteOptionReq (line 59) | type WebsiteOptionReq struct
  type RuntimeConfig (line 63) | type RuntimeConfig struct
  type FtpConfig (line 68) | type FtpConfig struct
  type DataBaseConfig (line 73) | type DataBaseConfig struct
  type SSLConfig (line 82) | type SSLConfig struct
  type NewAppInstall (line 87) | type NewAppInstall struct
  type WebsiteInstallCheckReq (line 95) | type WebsiteInstallCheckReq struct
  type WebsiteUpdate (line 99) | type WebsiteUpdate struct
  type WebsiteDelete (line 109) | type WebsiteDelete struct
  type WebsiteOp (line 117) | type WebsiteOp struct
  type BatchWebsiteOp (line 122) | type BatchWebsiteOp struct
  type BatchWebsiteGroup (line 128) | type BatchWebsiteGroup struct
  type BatchWebsiteHttps (line 133) | type BatchWebsiteHttps struct
  type WebsiteRedirectUpdate (line 152) | type WebsiteRedirectUpdate struct
  type WebsiteRecover (line 158) | type WebsiteRecover struct
  type WebsiteRecoverByFile (line 164) | type WebsiteRecoverByFile struct
  type WebsiteGroupCreate (line 171) | type WebsiteGroupCreate struct
  type WebsiteGroupUpdate (line 175) | type WebsiteGroupUpdate struct
  type WebsiteDomainCreate (line 181) | type WebsiteDomainCreate struct
  type WebsiteDomainUpdate (line 186) | type WebsiteDomainUpdate struct
  type WebsiteDomain (line 191) | type WebsiteDomain struct
  type WebsiteDomainDelete (line 197) | type WebsiteDomainDelete struct
  type WebsiteHTTPSOp (line 201) | type WebsiteHTTPSOp struct
  type WebsiteNginxUpdate (line 220) | type WebsiteNginxUpdate struct
  type WebsiteLogReq (line 225) | type WebsiteLogReq struct
  type WebsiteDefaultUpdate (line 233) | type WebsiteDefaultUpdate struct
  type WebsitePHPVersionReq (line 237) | type WebsitePHPVersionReq struct
  type WebsiteUpdateDir (line 242) | type WebsiteUpdateDir struct
  type WebsiteUpdateDirPermission (line 247) | type WebsiteUpdateDirPermission struct
  type WebsiteProxyConfig (line 253) | type WebsiteProxyConfig struct
  type WebsiteProxyDelete (line 275) | type WebsiteProxyDelete struct
  type WebsiteProxyStatusUpdate (line 280) | type WebsiteProxyStatusUpdate struct
  type CorsConfig (line 286) | type CorsConfig struct
  type CorsConfigReq (line 295) | type CorsConfigReq struct
  type WebsiteProxyReq (line 300) | type WebsiteProxyReq struct
  type WebsiteRedirectReq (line 304) | type WebsiteRedirectReq struct
  type WebsiteCommonReq (line 308) | type WebsiteCommonReq struct
  type WafWebsite (line 312) | type WafWebsite struct
  type WebsiteHtmlReq (line 318) | type WebsiteHtmlReq struct
  type WebsiteHtmlUpdate (line 322) | type WebsiteHtmlUpdate struct
  type WebsiteLBCreate (line 328) | type WebsiteLBCreate struct
  type WebsiteLBUpdate (line 335) | type WebsiteLBUpdate struct
  type WebsiteLBDelete (line 342) | type WebsiteLBDelete struct
  type WebsiteLBUpdateFile (line 347) | type WebsiteLBUpdateFile struct
  type WebsiteRealIP (line 353) | type WebsiteRealIP struct
  type ChangeDatabase (line 361) | type ChangeDatabase struct
  type WebsiteProxyDel (line 367) | type WebsiteProxyDel struct
  type CrossSiteAccessOp (line 372) | type CrossSiteAccessOp struct
  type ExecComposerReq (line 377) | type ExecComposerReq struct

FILE: agent/app/dto/request/website_ssl.go
  type WebsiteSSLSearch (line 5) | type WebsiteSSLSearch struct
  type WebsiteSSLListReq (line 13) | type WebsiteSSLListReq struct
  type WebsiteSSLCreate (line 17) | type WebsiteSSLCreate struct
  type WebsiteDNSReq (line 41) | type WebsiteDNSReq struct
  type WebsiteSSLRenew (line 46) | type WebsiteSSLRenew struct
  type WebsiteSSLApply (line 50) | type WebsiteSSLApply struct
  type WebsiteSSLObtain (line 57) | type WebsiteSSLObtain struct
  type WebsiteAcmeAccountCreate (line 62) | type WebsiteAcmeAccountCreate struct
  type WebsiteAcmeAccountUpdate (line 73) | type WebsiteAcmeAccountUpdate struct
  type WebsiteDnsAccountCreate (line 78) | type WebsiteDnsAccountCreate struct
  type WebsiteDnsAccountUpdate (line 84) | type WebsiteDnsAccountUpdate struct
  type WebsiteResourceReq (line 91) | type WebsiteResourceReq struct
  type WebsiteBatchDelReq (line 95) | type WebsiteBatchDelReq struct
  type WebsiteSSLUpdate (line 99) | type WebsiteSSLUpdate struct
  type WebsiteSSLUpload (line 122) | type WebsiteSSLUpload struct
  type WebsiteCASearch (line 132) | type WebsiteCASearch struct
  type WebsiteCACreate (line 136) | type WebsiteCACreate struct
  type WebsiteCAObtain (line 147) | type WebsiteCAObtain struct
  type WebsiteCARenew (line 163) | type WebsiteCARenew struct
  type WebsiteSSLFileUpload (line 167) | type WebsiteSSLFileUpload struct

FILE: agent/app/dto/response/app.go
  type AppRes (line 12) | type AppRes struct
  type AppUpdateRes (line 17) | type AppUpdateRes struct
  type AppDTO (line 24) | type AppDTO struct
  type AppItem (line 31) | type AppItem struct
  type TagDTO (line 46) | type TagDTO struct
  type AppInstalledCheck (line 52) | type AppInstalledCheck struct
  type AppDetailDTO (line 68) | type AppDetailDTO struct
  type AppDetailSimpleDTO (line 79) | type AppDetailSimpleDTO struct
  type IgnoredApp (line 83) | type IgnoredApp struct
  type AppInstalledDTO (line 90) | type AppInstalledDTO struct
  type AppDetail (line 100) | type AppDetail struct
  type AppInstallDTO (line 106) | type AppInstallDTO struct
  type AppInstallInfo (line 137) | type AppInstallInfo struct
  type DatabaseConn (line 152) | type DatabaseConn struct
  type AppService (line 161) | type AppService struct
  type AppParam (line 169) | type AppParam struct
  type AppConfig (line 184) | type AppConfig struct

FILE: agent/app/dto/response/app_ignore_upgrade.go
  type AppIgnoreUpgradeDTO (line 3) | type AppIgnoreUpgradeDTO struct

FILE: agent/app/dto/response/disk.go
  type DiskInfo (line 3) | type DiskInfo struct
  type DiskBasicInfo (line 8) | type DiskBasicInfo struct
  type CompleteDiskInfo (line 24) | type CompleteDiskInfo struct
  type MountInfo (line 32) | type MountInfo struct

FILE: agent/app/dto/response/favorite.go
  type FavoriteDTO (line 5) | type FavoriteDTO struct

FILE: agent/app/dto/response/file.go
  type FileInfo (line 9) | type FileInfo struct
  type UploadInfo (line 13) | type UploadInfo struct
  type FileTree (line 19) | type FileTree struct
  type DirSizeRes (line 28) | type DirSizeRes struct
  type FileProcessKeys (line 32) | type FileProcessKeys struct
  type FileWgetRes (line 36) | type FileWgetRes struct
  type FileLineContent (line 40) | type FileLineContent struct
  type FileExist (line 50) | type FileExist struct
  type ExistFileInfo (line 54) | type ExistFileInfo struct
  type UserInfo (line 62) | type UserInfo struct
  type UserGroupResponse (line 67) | type UserGroupResponse struct
  type DepthDirSizeRes (line 72) | type DepthDirSizeRes struct
  type FileConvertLog (line 77) | type FileConvertLog struct
  type FileRemarksRes (line 85) | type FileRemarksRes struct

FILE: agent/app/dto/response/host_tool.go
  type HostToolRes (line 3) | type HostToolRes struct
  type Supervisor (line 8) | type Supervisor struct
  type HostToolConfig (line 21) | type HostToolConfig struct
  type SupervisorProcessConfig (line 25) | type SupervisorProcessConfig struct
  type ProcessStatus (line 38) | type ProcessStatus struct

FILE: agent/app/dto/response/mcp_server.go
  type McpServersRes (line 8) | type McpServersRes struct
  type McpServerDTO (line 13) | type McpServerDTO struct
  type McpBindDomainRes (line 19) | type McpBindDomainRes struct

FILE: agent/app/dto/response/nginx.go
  type NginxStatus (line 5) | type NginxStatus struct
  type NginxParam (line 15) | type NginxParam struct
  type NginxAuthRes (line 20) | type NginxAuthRes struct
  type NginxPathAuthRes (line 25) | type NginxPathAuthRes struct
  type NginxAntiLeechRes (line 29) | type NginxAntiLeechRes struct
  type NginxRedirectConfig (line 42) | type NginxRedirectConfig struct
  type NginxFile (line 57) | type NginxFile struct
  type NginxProxyCache (line 61) | type NginxProxyCache struct
  type NginxModule (line 71) | type NginxModule struct
  type NginxBuildConfig (line 79) | type NginxBuildConfig struct
  type NginxConfigRes (line 84) | type NginxConfigRes struct

FILE: agent/app/dto/response/php_extensions.go
  type PHPExtensionsDTO (line 5) | type PHPExtensionsDTO struct

FILE: agent/app/dto/response/recycle_bin.go
  type RecycleBinDTO (line 5) | type RecycleBinDTO struct

FILE: agent/app/dto/response/runtime.go
  type RuntimeDTO (line 10) | type RuntimeDTO struct
  type PackageScripts (line 37) | type PackageScripts struct
  function NewRuntimeDTO (line 42) | func NewRuntimeDTO(runtime model.Runtime) RuntimeDTO {
  type NodeModule (line 62) | type NodeModule struct
  type SupportExtension (line 69) | type SupportExtension struct
  type PHPExtensionRes (line 78) | type PHPExtensionRes struct
  type FpmStatusItem (line 83) | type FpmStatusItem struct

FILE: agent/app/dto/response/system.go
  type ComponentInfo (line 3) | type ComponentInfo struct

FILE: agent/app/dto/response/tensorrt_llm.go
  type TensorRTLLMsRes (line 8) | type TensorRTLLMsRes struct
  type TensorRTLLMDTO (line 13) | type TensorRTLLMDTO struct

FILE: agent/app/dto/response/website.go
  type WebsiteDTO (line 10) | type WebsiteDTO struct
  type WebsiteRes (line 26) | type WebsiteRes struct
  type WebsiteOption (line 49) | type WebsiteOption struct
  type WebsitePreInstallCheck (line 55) | type WebsitePreInstallCheck struct
  type WebsiteNginxConfig (line 62) | type WebsiteNginxConfig struct
  type WebsiteHTTPS (line 67) | type WebsiteHTTPS struct
  type WebsiteLog (line 80) | type WebsiteLog struct
  type PHPConfig (line 87) | type PHPConfig struct
  type NginxRewriteRes (line 94) | type NginxRewriteRes struct
  type WebsiteDirConfig (line 98) | type WebsiteDirConfig struct
  type WebsiteHtmlRes (line 105) | type WebsiteHtmlRes struct
  type WebsiteRealIP (line 109) | type WebsiteRealIP struct
  type Resource (line 117) | type Resource struct
  type Database (line 124) | type Database struct

FILE: agent/app/dto/response/website_ssl.go
  type WebsiteSSLDTO (line 5) | type WebsiteSSLDTO struct
  type WebsiteDNSRes (line 10) | type WebsiteDNSRes struct
  type WebsiteAcmeAccountDTO (line 17) | type WebsiteAcmeAccountDTO struct
  type WebsiteDnsAccountDTO (line 21) | type WebsiteDnsAccountDTO struct
  type WebsiteCADTO (line 26) | type WebsiteCADTO struct

FILE: agent/app/dto/setting.go
  type SettingInfo (line 3) | type SettingInfo struct
  type SettingUpdate (line 29) | type SettingUpdate struct
  type SyncTime (line 34) | type SyncTime struct
  type CleanData (line 38) | type CleanData struct
  type CleanTree (line 47) | type CleanTree struct
  type Clean (line 60) | type Clean struct
  type SSHDefaultConn (line 66) | type SSHDefaultConn struct
  type SSHConnData (line 70) | type SSHConnData struct
  type SystemProxy (line 82) | type SystemProxy struct
  type TerminalAIInfo (line 90) | type TerminalAIInfo struct
  type CommonDescription (line 97) | type CommonDescription struct

FILE: agent/app/dto/snapshot.go
  type PageSnapshot (line 5) | type PageSnapshot struct
  type SnapshotCreate (line 12) | type SnapshotCreate struct
  type SnapshotData (line 37) | type SnapshotData struct
  type DataTree (line 50) | type DataTree struct
  type SnapshotRecover (line 65) | type SnapshotRecover struct
  type SnapshotBatchDelete (line 72) | type SnapshotBatchDelete struct
  type SnapshotImport (line 77) | type SnapshotImport struct
  type SnapshotInfo (line 83) | type SnapshotInfo struct

FILE: agent/app/dto/ssh.go
  type SSHUpdate (line 5) | type SSHUpdate struct
  type SSHInfo (line 11) | type SSHInfo struct
  type RootCertOperate (line 25) | type RootCertOperate struct
  type RootCert (line 35) | type RootCert struct
  type GenerateLoad (line 46) | type GenerateLoad struct
  type SSHConf (line 50) | type SSHConf struct
  type SearchSSHLog (line 53) | type SearchSSHLog struct
  type SSHHistory (line 59) | type SSHHistory struct

FILE: agent/app/model/agent.go
  type Agent (line 3) | type Agent struct

FILE: agent/app/model/agent_account.go
  type AgentAccount (line 3) | type AgentAccount struct
    method TableName (line 15) | func (AgentAccount) TableName() string {

FILE: agent/app/model/agent_account_model.go
  type AgentAccountModel (line 3) | type AgentAccountModel struct
    method TableName (line 15) | func (AgentAccountModel) TableName() string {

FILE: agent/app/model/ai.go
  type OllamaModel (line 3) | type OllamaModel struct

FILE: agent/app/model/alert.go
  type Alert (line 3) | type Alert struct
  type AlertTask (line 17) | type AlertTask struct
  type AlertLog (line 25) | type AlertLog struct
  type AlertConfig (line 40) | type AlertConfig struct
  type LoginLog (line 48) | type LoginLog struct

FILE: agent/app/model/app.go
  type App (line 13) | type App struct
    method IsLocalApp (line 44) | func (i *App) IsLocalApp() bool {
    method IsCustomApp (line 47) | func (i *App) IsCustomApp() bool {
    method GetAppResourcePath (line 51) | func (i *App) GetAppResourcePath() string {
    method GetDescription (line 69) | func (i *App) GetDescription(ctx *gin.Context) string {
  function getLang (line 61) | func getLang(c *gin.Context) string {

FILE: agent/app/model/app_detail.go
  type AppDetail (line 3) | type AppDetail struct

FILE: agent/app/model/app_ignore_upgrade.go
  type AppIgnoreUpgrade (line 3) | type AppIgnoreUpgrade struct

FILE: agent/app/model/app_install.go
  type AppInstall (line 11) | type AppInstall struct
    method GetPath (line 34) | func (i *AppInstall) GetPath() string {
    method GetComposePath (line 38) | func (i *AppInstall) GetComposePath() string {
    method GetEnvPath (line 42) | func (i *AppInstall) GetEnvPath() string {
    method GetAppPath (line 46) | func (i *AppInstall) GetAppPath() string {

FILE: agent/app/model/app_install_resource.go
  type AppInstallResource (line 3) | type AppInstallResource struct

FILE: agent/app/model/app_launcher.go
  type AppLauncher (line 3) | type AppLauncher struct
  type QuickJump (line 8) | type QuickJump struct

FILE: agent/app/model/app_tag.go
  type AppTag (line 3) | type AppTag struct

FILE: agent/app/model/backup.go
  type BackupAccount (line 3) | type BackupAccount struct
  type BackupRecord (line 17) | type BackupRecord struct

FILE: agent/app/model/base.go
  type BaseModel (line 5) | type BaseModel struct

FILE: agent/app/model/clam.go
  type Clam (line 5) | type Clam struct
  type ClamRecord (line 22) | type ClamRecord struct

FILE: agent/app/model/compose_template.go
  type ComposeTemplate (line 3) | type ComposeTemplate struct
  type Compose (line 11) | type Compose struct

FILE: agent/app/model/cronjob.go
  type Cronjob (line 7) | type Cronjob struct
  type JobRecords (line 51) | type JobRecords struct
  type ScriptLibrary (line 65) | type ScriptLibrary struct

FILE: agent/app/model/database.go
  type Database (line 3) | type Database struct

FILE: agent/app/model/database_mysql.go
  type DatabaseMysql (line 3) | type DatabaseMysql struct

FILE: agent/app/model/database_postgresql.go
  type DatabasePostgresql (line 3) | type DatabasePostgresql struct

FILE: agent/app/model/favorite.go
  type Favorite (line 3) | type Favorite struct

FILE: agent/app/model/firewall.go
  type Firewall (line 3) | type Firewall struct

FILE: agent/app/model/ftp.go
  type Ftp (line 3) | type Ftp struct

FILE: agent/app/model/group.go
  type Group (line 3) | type Group struct

FILE: agent/app/model/host.go
  type Host (line 3) | type Host struct

FILE: agent/app/model/image_repo.go
  type ImageRepo (line 3) | type ImageRepo struct

FILE: agent/app/model/mcp_server.go
  type McpServer (line 3) | type McpServer struct

FILE: agent/app/model/monitor.go
  type MonitorBase (line 3) | type MonitorBase struct
  type MonitorIO (line 19) | type MonitorIO struct
  type MonitorNetwork (line 28) | type MonitorNetwork struct
  type MonitorGPU (line 35) | type MonitorGPU struct

FILE: agent/app/model/php_extensions.go
  type PHPExtensions (line 3) | type PHPExtensions struct

FILE: agent/app/model/runtime.go
  type Runtime (line 9) | type Runtime struct
    method GetComposePath (line 29) | func (r *Runtime) GetComposePath() string {
    method GetEnvPath (line 33) | func (r *Runtime) GetEnvPath() string {
    method GetPath (line 37) | func (r *Runtime) GetPath() string {
    method GetFPMPath (line 41) | func (r *Runtime) GetFPMPath() string {
    method GetPHPPath (line 45) | func (r *Runtime) GetPHPPath() string {
    method GetLogPath (line 49) | func (r *Runtime) GetLogPath() string {
    method GetSlowLogPath (line 53) | func (r *Runtime) GetSlowLogPath() string {

FILE: agent/app/model/setting.go
  type Setting (line 3) | type Setting struct
  type CommonDescription (line 10) | type CommonDescription struct
  type NodeInfo (line 18) | type NodeInfo struct
  type LocalConnInfo (line 27) | type LocalConnInfo struct

FILE: agent/app/model/snapshot.go
  type Snapshot (line 3) | type Snapshot struct

FILE: agent/app/model/ssh.go
  type RootCert (line 3) | type RootCert struct

FILE: agent/app/model/tag.go
  type Tag (line 3) | type Tag struct

FILE: agent/app/model/task.go
  type Task (line 5) | type Task struct

FILE: agent/app/model/tensorrt_llm.go
  type TensorRTLLM (line 3) | type TensorRTLLM struct

FILE: agent/app/model/website.go
  type Website (line 5) | type Website struct
    method TableName (line 46) | func (w Website) TableName() string {

FILE: agent/app/model/website_acme_account.go
  type WebsiteAcmeAccount (line 3) | type WebsiteAcmeAccount struct
    method TableName (line 17) | func (w WebsiteAcmeAccount) TableName() string {

FILE: agent/app/model/website_ca.go
  type WebsiteCA (line 3) | type WebsiteCA struct

FILE: agent/app/model/website_dns_account.go
  type WebsiteDnsAccount (line 3) | type WebsiteDnsAccount struct
    method TableName (line 10) | func (w WebsiteDnsAccount) TableName() string {

FILE: agent/app/model/website_domain.go
  type WebsiteDomain (line 3) | type WebsiteDomain struct
    method TableName (line 11) | func (w WebsiteDomain) TableName() string {

FILE: agent/app/model/website_ssl.go
  type WebsiteSSL (line 11) | type WebsiteSSL struct
    method TableName (line 51) | func (w WebsiteSSL) TableName() string {
    method GetLogPath (line 55) | func (w WebsiteSSL) GetLogPath() string {

FILE: agent/app/provider/catalog.go
  type Model (line 7) | type Model struct
  type Meta (line 16) | type Meta struct
  function Get (line 203) | func Get(key string) (Meta, bool) {
  function All (line 211) | func All() map[string]Meta {
  function DefaultBaseURL (line 219) | func DefaultBaseURL(key string) (string, bool) {
  function EnvKey (line 227) | func EnvKey(key string) string {
  function DisplayName (line 235) | func DisplayName(key string) string {
  function cloneMeta (line 246) | func cloneMeta(meta Meta) Meta {
  function normalizeModel (line 257) | func normalizeModel(provider string, model Model) Model {
  function defaultModelInputs (line 282) | func defaultModelInputs(provider string) []string {
  function catalogRuntimeDefaults (line 291) | func catalogRuntimeDefaults(provider string) (int, int) {

FILE: agent/app/provider/openclaw.go
  type OpenClawPatch (line 8) | type OpenClawPatch struct
  function BuildOpenClawPatch (line 13) | func BuildOpenClawPatch(provider, modelName, apiType string, maxTokens, ...
  function buildDeepseekPatch (line 50) | func buildDeepseekPatch(modelName, baseURL, apiKey string) *OpenClawPatch {
  function buildMoonshotPatch (line 65) | func buildMoonshotPatch(provider, modelName, modelID, baseURL, apiKey st...
  function buildBailianPatch (line 86) | func buildBailianPatch(modelID string, maxTokens, contextWindow int, bas...
  function buildArkPatch (line 102) | func buildArkPatch(modelID string, maxTokens, contextWindow int, baseURL...
  function buildMiniMaxPatch (line 118) | func buildMiniMaxPatch(modelID, baseURL, apiKey string) *OpenClawPatch {
  function buildCustomPatch (line 134) | func buildCustomPatch(provider, modelName, apiType string, maxTokens, co...
  function buildOllamaPatch (line 150) | func buildOllamaPatch(modelName, modelID, apiType, baseURL string) *Open...
  function buildKimiCodingPatch (line 169) | func buildKimiCodingPatch(modelName, modelID, baseURL, apiKey string) *O...
  function buildZaiPatch (line 184) | func buildZaiPatch(modelID string, maxTokens, contextWindow int, baseURL...
  function buildGenericPatch (line 199) | func buildGenericPatch(provider, modelName, modelID, apiType string, max...
  function providerModels (line 220) | func providerModels(provider, apiKey, baseURL, api string, model map[str...
  function withCatalogDefault (line 234) | func withCatalogDefault(provider, baseURL string) string {
  function firstNonEmpty (line 244) | func firstNonEmpty(values ...string) string {
  function fallbackInt (line 253) | func fallbackInt(value, fallback int) int {
  function normalizeAPIType (line 260) | func normalizeAPIType(apiType string) string {
  function normalizeCustomModel (line 268) | func normalizeCustomModel(modelName string) string {
  function normalizeBailianCodingPlanModelID (line 277) | func normalizeBailianCodingPlanModelID(modelID string) string {
  function normalizeArkCodingPlanModelID (line 287) | func normalizeArkCodingPlanModelID(modelID string) string {
  function normalizeMiniMaxModelID (line 291) | func normalizeMiniMaxModelID(modelID string) string {
  function zaiModelDisplayName (line 302) | func zaiModelDisplayName(modelID string) string {
  function bailianPrimaryModelID (line 317) | func bailianPrimaryModelID(modelID string) string {
  function isReasoningModel (line 332) | func isReasoningModel(modelID string) bool {

FILE: agent/app/provider/verify.go
  type VerifyRequest (line 14) | type VerifyRequest struct
  constant defaultVerifyTimeout (line 22) | defaultVerifyTimeout = 30 * time.Second
  function SkipVerification (line 25) | func SkipVerification(key string) bool {
  function VerifyAccount (line 34) | func VerifyAccount(provider, baseURL, apiKey string) error {
  function verifyTimeout (line 60) | func verifyTimeout() time.Duration {
  function BuildVerifyRequest (line 64) | func BuildVerifyRequest(provider, baseURL, apiKey string) VerifyRequest {
  function mustJSON (line 148) | func mustJSON(value interface{}) []byte {

FILE: agent/app/repo/agent.go
  type AgentRepo (line 9) | type AgentRepo struct
    method Page (line 26) | func (a AgentRepo) Page(page, size int, opts ...DBOption) (int64, []mo...
    method GetFirst (line 35) | func (a AgentRepo) GetFirst(opts ...DBOption) (*model.Agent, error) {
    method Create (line 43) | func (a AgentRepo) Create(agent *model.Agent) error {
    method Save (line 47) | func (a AgentRepo) Save(agent *model.Agent) error {
    method DeleteByID (line 51) | func (a AgentRepo) DeleteByID(id uint) error {
    method DeleteByAppInstallID (line 55) | func (a AgentRepo) DeleteByAppInstallID(appInstallID uint) error {
    method DeleteByAppInstallIDWithCtx (line 62) | func (a AgentRepo) DeleteByAppInstallIDWithCtx(ctx context.Context, ap...
    method List (line 69) | func (a AgentRepo) List(opts ...DBOption) ([]model.Agent, error) {
  type IAgentRepo (line 11) | type IAgentRepo interface
  function NewIAgentRepo (line 22) | func NewIAgentRepo() IAgentRepo {

FILE: agent/app/repo/agent_account.go
  type AgentAccountRepo (line 5) | type AgentAccountRepo struct
    method Page (line 20) | func (a AgentAccountRepo) Page(page, size int, opts ...DBOption) (int6...
    method GetFirst (line 29) | func (a AgentAccountRepo) GetFirst(opts ...DBOption) (*model.AgentAcco...
    method Create (line 37) | func (a AgentAccountRepo) Create(account *model.AgentAccount) error {
    method Save (line 41) | func (a AgentAccountRepo) Save(account *model.AgentAccount) error {
    method DeleteByID (line 45) | func (a AgentAccountRepo) DeleteByID(id uint) error {
    method List (line 49) | func (a AgentAccountRepo) List(opts ...DBOption) ([]model.AgentAccount...
  type IAgentAccountRepo (line 7) | type IAgentAccountRepo interface
  function NewIAgentAccountRepo (line 16) | func NewIAgentAccountRepo() IAgentAccountRepo {

FILE: agent/app/repo/agent_account_model.go
  type AgentAccountModelRepo (line 5) | type AgentAccountModelRepo struct
    method List (line 20) | func (a AgentAccountModelRepo) List(opts ...DBOption) ([]model.AgentAc...
    method GetFirst (line 28) | func (a AgentAccountModelRepo) GetFirst(opts ...DBOption) (*model.Agen...
    method Create (line 36) | func (a AgentAccountModelRepo) Create(item *model.AgentAccountModel) e...
    method Save (line 40) | func (a AgentAccountModelRepo) Save(item *model.AgentAccountModel) err...
    method DeleteByID (line 44) | func (a AgentAccountModelRepo) DeleteByID(id uint) error {
    method Delete (line 48) | func (a AgentAccountModelRepo) Delete(opts ...DBOption) error {
  type IAgentAccountModelRepo (line 7) | type IAgentAccountModelRepo interface
  function NewIAgentAccountModelRepo (line 16) | func NewIAgentAccountModelRepo() IAgentAccountModelRepo {

FILE: agent/app/repo/ai.go
  type AiRepo (line 8) | type AiRepo struct
    method Get (line 23) | func (u *AiRepo) Get(opts ...DBOption) (model.OllamaModel, error) {
    method List (line 33) | func (u *AiRepo) List(opts ...DBOption) ([]model.OllamaModel, error) {
    method Page (line 43) | func (u *AiRepo) Page(page, size int, opts ...DBOption) (int64, []mode...
    method Create (line 55) | func (u *AiRepo) Create(item *model.OllamaModel) error {
    method Update (line 59) | func (u *AiRepo) Update(id uint, vars map[string]interface{}) error {
    method Delete (line 63) | func (u *AiRepo) Delete(opts ...DBOption) error {
  type IAiRepo (line 10) | type IAiRepo interface
  function NewIAiRepo (line 19) | func NewIAiRepo() IAiRepo {

FILE: agent/app/repo/alert.go
  type AlertRepo (line 12) | type AlertRepo struct
    method WithByType (line 62) | func (a *AlertRepo) WithByType(alertType string) DBOption {
    method WithByStatusIn (line 68) | func (a *AlertRepo) WithByStatusIn(status []string) DBOption {
    method WithByCount (line 74) | func (a *AlertRepo) WithByCount(count uint) DBOption {
    method WithByProject (line 80) | func (a *AlertRepo) WithByProject(project string) DBOption {
    method WithByAlertId (line 86) | func (a *AlertRepo) WithByAlertId(alertId uint) DBOption {
    method WithByLicenseId (line 92) | func (a *AlertRepo) WithByLicenseId(licenseId string) DBOption {
    method WithByRecordId (line 98) | func (a *AlertRepo) WithByRecordId(recordId uint) DBOption {
    method WithByMethod (line 104) | func (a *AlertRepo) WithByMethod(method string) DBOption {
    method WithByCreateAt (line 110) | func (a *AlertRepo) WithByCreateAt(createAt *date.Date) DBOption {
    method Create (line 116) | func (a *AlertRepo) Create(alert *model.Alert) error {
    method Save (line 120) | func (a *AlertRepo) Save(alert *model.Alert) error {
    method Get (line 124) | func (a *AlertRepo) Get(opts ...DBOption) (model.Alert, error) {
    method Page (line 131) | func (a *AlertRepo) Page(page, size int, opts ...DBOption) (int64, []m...
    method List (line 141) | func (a *AlertRepo) List(opts ...DBOption) ([]model.Alert, error) {
    method Update (line 148) | func (a *AlertRepo) Update(maps map[string]interface{}, opts ...DBOpti...
    method Delete (line 153) | func (a *AlertRepo) Delete(opts ...DBOption) error {
    method GetLog (line 158) | func (a *AlertRepo) GetLog(opts ...DBOption) (model.AlertLog, error) {
    method CreateLog (line 165) | func (a *AlertRepo) CreateLog(log *model.AlertLog) error {
    method UpdateLog (line 169) | func (a *AlertRepo) UpdateLog(id uint, maps map[string]interface{}) er...
    method BatchUpdateLogBy (line 173) | func (a *AlertRepo) BatchUpdateLogBy(maps map[string]interface{}, opts...
    method PageLog (line 181) | func (a *AlertRepo) PageLog(page, size int, opts ...DBOption) (int64, ...
    method ListLog (line 193) | func (a *AlertRepo) ListLog(opts ...DBOption) ([]model.AlertLog, error) {
    method DeleteLog (line 200) | func (a *AlertRepo) DeleteLog(opts ...DBOption) error {
    method CleanAlertLogs (line 205) | func (a *AlertRepo) CleanAlertLogs() error {
    method CreateAlertTask (line 209) | func (a *AlertRepo) CreateAlertTask(alertTaskBase *model.AlertTask) er...
    method DeleteAlertTask (line 213) | func (a *AlertRepo) DeleteAlertTask(opts ...DBOption) error {
    method GetAlertTask (line 218) | func (a *AlertRepo) GetAlertTask(opts ...DBOption) (model.AlertTask, e...
    method LoadTaskCount (line 225) | func (a *AlertRepo) LoadTaskCount(alertType string, project string, me...
    method GetTaskLog (line 239) | func (a *AlertRepo) GetTaskLog(alertType string, alertId uint) (time.T...
    method GetLicensePushCount (line 270) | func (a *AlertRepo) GetLicensePushCount(method string) (uint, error) {
    method AlertConfigList (line 281) | func (a *AlertRepo) AlertConfigList(opts ...DBOption) ([]model.AlertCo...
    method UpdateAlertConfig (line 288) | func (a *AlertRepo) UpdateAlertConfig(maps map[string]interface{}, opt...
    method CreateAlertConfig (line 293) | func (a *AlertRepo) CreateAlertConfig(config *model.AlertConfig) error {
    method DeleteAlertConfig (line 297) | func (a *AlertRepo) DeleteAlertConfig(opts ...DBOption) error {
    method GetConfig (line 302) | func (a *AlertRepo) GetConfig(opts ...DBOption) (model.AlertConfig, er...
    method SyncAll (line 309) | func (a *AlertRepo) SyncAll(data []model.AlertConfig) error {
  type IAlertRepo (line 14) | type IAlertRepo interface
  function NewIAlertRepo (line 58) | func NewIAlertRepo() IAlertRepo {
  function getAlertDB (line 261) | func getAlertDB(opts ...DBOption) (*gorm.DB, error) {

FILE: agent/app/repo/app.go
  type AppRepo (line 12) | type AppRepo struct
    method WithByLikeName (line 44) | func (a AppRepo) WithByLikeName(name string) DBOption {
    method WithKey (line 53) | func (a AppRepo) WithKey(key string) DBOption {
    method WithKeyIn (line 59) | func (a AppRepo) WithKeyIn(keys []string) DBOption {
    method WithType (line 65) | func (a AppRepo) WithType(typeStr string) DBOption {
    method OrderByRecommend (line 71) | func (a AppRepo) OrderByRecommend() DBOption {
    method GetRecommend (line 77) | func (a AppRepo) GetRecommend() DBOption {
    method WithResource (line 83) | func (a AppRepo) WithResource(resource string) DBOption {
    method WithNotLocal (line 89) | func (a AppRepo) WithNotLocal() DBOption {
    method WithArch (line 95) | func (a AppRepo) WithArch(arch string) DBOption {
    method WithPanelVersion (line 101) | func (a AppRepo) WithPanelVersion(panelVersion string) DBOption {
    method Page (line 107) | func (a AppRepo) Page(page, size int, opts ...DBOption) (int64, []mode...
    method GetFirst (line 116) | func (a AppRepo) GetFirst(opts ...DBOption) (model.App, error) {
    method GetBy (line 125) | func (a AppRepo) GetBy(opts ...DBOption) ([]model.App, error) {
    method GetTopRecommend (line 134) | func (a AppRepo) GetTopRecommend() ([]string, error) {
    method BatchCreate (line 149) | func (a AppRepo) BatchCreate(ctx context.Context, apps []model.App) er...
    method Create (line 153) | func (a AppRepo) Create(ctx context.Context, app *model.App) error {
    method Save (line 157) | func (a AppRepo) Save(ctx context.Context, app *model.App) error {
    method BatchDelete (line 161) | func (a AppRepo) BatchDelete(ctx context.Context, apps []model.App) er...
    method DeleteByIDs (line 165) | func (a AppRepo) DeleteByIDs(ctx context.Context, ids []uint) error {
    method DeleteBy (line 169) | func (a AppRepo) DeleteBy(opts ...DBOption) error {
  type IAppRepo (line 15) | type IAppRepo interface
  function NewIAppRepo (line 40) | func NewIAppRepo() IAppRepo {

FILE: agent/app/repo/app_detail.go
  type AppDetailRepo (line 11) | type AppDetailRepo struct
    method WithVersion (line 32) | func (a AppDetailRepo) WithVersion(version string) DBOption {
    method WithAppId (line 38) | func (a AppDetailRepo) WithAppId(id uint) DBOption {
    method WithIgnored (line 44) | func (a AppDetailRepo) WithIgnored() DBOption {
    method GetFirst (line 50) | func (a AppDetailRepo) GetFirst(opts ...DBOption) (model.AppDetail, er...
    method Update (line 56) | func (a AppDetailRepo) Update(ctx context.Context, detail model.AppDet...
    method BatchCreate (line 60) | func (a AppDetailRepo) BatchCreate(ctx context.Context, details []mode...
    method DeleteByAppIds (line 64) | func (a AppDetailRepo) DeleteByAppIds(ctx context.Context, appIds []ui...
    method DeleteByIDs (line 68) | func (a AppDetailRepo) DeleteByIDs(ctx context.Context, appIds []uint)...
    method GetBy (line 72) | func (a AppDetailRepo) GetBy(opts ...DBOption) ([]model.AppDetail, err...
    method BatchUpdateBy (line 78) | func (a AppDetailRepo) BatchUpdateBy(maps map[string]interface{}, opts...
    method BatchDelete (line 86) | func (a AppDetailRepo) BatchDelete(ctx context.Context, appDetails []m...
  type IAppDetailRepo (line 14) | type IAppDetailRepo interface
  function NewIAppDetailRepo (line 28) | func NewIAppDetailRepo() IAppDetailRepo {

FILE: agent/app/repo/app_ignore_upgrade.go
  type AppIgnoreUpgradeRepo (line 9) | type AppIgnoreUpgradeRepo struct
    method WithScope (line 24) | func (a AppIgnoreUpgradeRepo) WithScope(scope string) DBOption {
    method WithAppID (line 30) | func (a AppIgnoreUpgradeRepo) WithAppID(appID uint) DBOption {
    method List (line 36) | func (a AppIgnoreUpgradeRepo) List(opts ...DBOption) ([]model.AppIgnor...
    method Create (line 42) | func (a AppIgnoreUpgradeRepo) Create(appIgnoreUpgrade *model.AppIgnore...
    method Delete (line 46) | func (a AppIgnoreUpgradeRepo) Delete(opts ...DBOption) error {
  type IAppIgnoreUpgradeRepo (line 12) | type IAppIgnoreUpgradeRepo interface
  function NewIAppIgnoreUpgradeRepo (line 20) | func NewIAppIgnoreUpgradeRepo() IAppIgnoreUpgradeRepo {

FILE: agent/app/repo/app_install.go
  type AppInstallRepo (line 16) | type AppInstallRepo struct
    method WithDetailIdsIn (line 47) | func (a *AppInstallRepo) WithDetailIdsIn(detailIds []uint) DBOption {
    method WithDetailIdNotIn (line 53) | func (a *AppInstallRepo) WithDetailIdNotIn(detailIds []uint) DBOption {
    method WithAppId (line 59) | func (a *AppInstallRepo) WithAppId(appId uint) DBOption {
    method WithIDNotIs (line 65) | func (a *AppInstallRepo) WithIDNotIs(id uint) DBOption {
    method WithAppIdsIn (line 71) | func (a *AppInstallRepo) WithAppIdsIn(appIds []uint) DBOption {
    method WithAppIdsNotIn (line 77) | func (a *AppInstallRepo) WithAppIdsNotIn(appIds []uint) DBOption {
    method WithStatus (line 83) | func (a *AppInstallRepo) WithStatus(status string) DBOption {
    method WithServiceName (line 89) | func (a *AppInstallRepo) WithServiceName(serviceName string) DBOption {
    method WithContainerName (line 95) | func (a *AppInstallRepo) WithContainerName(containerName string) DBOpt...
    method WithPort (line 101) | func (a *AppInstallRepo) WithPort(port int) DBOption {
    method WithIdNotInWebsite (line 107) | func (a *AppInstallRepo) WithIdNotInWebsite() DBOption {
    method ListBy (line 113) | func (a *AppInstallRepo) ListBy(ctx context.Context, opts ...DBOption)...
    method GetFirst (line 120) | func (a *AppInstallRepo) GetFirst(opts ...DBOption) (model.AppInstall,...
    method GetFirstByCtx (line 127) | func (a *AppInstallRepo) GetFirstByCtx(ctx context.Context, opts ...DB...
    method Create (line 134) | func (a *AppInstallRepo) Create(ctx context.Context, install *model.Ap...
    method Save (line 139) | func (a *AppInstallRepo) Save(ctx context.Context, install *model.AppI...
    method DeleteBy (line 143) | func (a *AppInstallRepo) DeleteBy(opts ...DBOption) error {
    method Delete (line 147) | func (a *AppInstallRepo) Delete(ctx context.Context, install model.App...
    method Page (line 152) | func (a *AppInstallRepo) Page(page, size int, opts ...DBOption) (int64...
    method BatchUpdateBy (line 161) | func (a *AppInstallRepo) BatchUpdateBy(maps map[string]interface{}, op...
    method LoadBaseInfo (line 187) | func (a *AppInstallRepo) LoadBaseInfo(key string, name string) (*RootI...
    method LoadInstallAppByKeyAndName (line 251) | func (a *AppInstallRepo) LoadInstallAppByKeyAndName(key string, name s...
  type IAppInstallRepo (line 18) | type IAppInstallRepo interface
  function NewIAppInstallRepo (line 43) | func NewIAppInstallRepo() IAppInstallRepo {
  type RootInfo (line 169) | type RootInfo struct

FILE: agent/app/repo/app_install_resource.go
  type AppInstallResourceRpo (line 11) | type AppInstallResourceRpo struct
    method WithAppInstallId (line 29) | func (a AppInstallResourceRpo) WithAppInstallId(appInstallId uint) DBO...
    method WithLinkId (line 35) | func (a AppInstallResourceRpo) WithLinkId(linkId uint) DBOption {
    method WithResourceId (line 41) | func (a AppInstallResourceRpo) WithResourceId(resourceId uint) DBOption {
    method GetBy (line 47) | func (a AppInstallResourceRpo) GetBy(opts ...DBOption) ([]model.AppIns...
    method GetFirst (line 57) | func (a AppInstallResourceRpo) GetFirst(opts ...DBOption) (model.AppIn...
    method Create (line 67) | func (a AppInstallResourceRpo) Create(ctx context.Context, resource *m...
    method DeleteBy (line 72) | func (a AppInstallResourceRpo) DeleteBy(ctx context.Context, opts ...D...
    method BatchUpdateBy (line 76) | func (a AppInstallResourceRpo) BatchUpdateBy(maps map[string]interface...
  type IAppInstallResourceRpo (line 14) | type IAppInstallResourceRpo interface
  function NewIAppInstallResourceRpo (line 25) | func NewIAppInstallResourceRpo() IAppInstallResourceRpo {

FILE: agent/app/repo/app_launcher.go
  type LauncherRepo (line 8) | type LauncherRepo struct
    method Get (line 26) | func (u *LauncherRepo) Get(opts ...DBOption) (model.AppLauncher, error) {
    method ListName (line 35) | func (u *LauncherRepo) ListName(opts ...DBOption) ([]string, error) {
    method Create (line 49) | func (u *LauncherRepo) Create(launcher *model.AppLauncher) error {
    method Save (line 53) | func (u *LauncherRepo) Save(launcher *model.AppLauncher) error {
    method Delete (line 57) | func (u *LauncherRepo) Delete(opts ...DBOption) error {
    method GetQuickJump (line 65) | func (u *LauncherRepo) GetQuickJump(opts ...DBOption) (model.QuickJump...
    method ListQuickJump (line 74) | func (u *LauncherRepo) ListQuickJump(withAll bool) []model.QuickJump {
    method UpdateQuicks (line 93) | func (u *LauncherRepo) UpdateQuicks(quicks []model.QuickJump) error {
  type ILauncherRepo (line 10) | type ILauncherRepo interface
  function NewILauncherRepo (line 22) | func NewILauncherRepo() ILauncherRepo {

FILE: agent/app/repo/app_tag.go
  type AppTagRepo (line 10) | type AppTagRepo struct
    method WithByTagID (line 30) | func (a AppTagRepo) WithByTagID(tagID uint) DBOption {
    method WithByAppID (line 36) | func (a AppTagRepo) WithByAppID(appId uint) DBOption {
    method BatchCreate (line 42) | func (a AppTagRepo) BatchCreate(ctx context.Context, tags []*model.App...
    method DeleteByAppIds (line 46) | func (a AppTagRepo) DeleteByAppIds(ctx context.Context, appIds []uint)...
    method DeleteAll (line 50) | func (a AppTagRepo) DeleteAll(ctx context.Context) error {
    method GetByAppId (line 54) | func (a AppTagRepo) GetByAppId(appId uint) ([]model.AppTag, error) {
    method GetByTagIds (line 62) | func (a AppTagRepo) GetByTagIds(tagIds []uint) ([]model.AppTag, error) {
    method DeleteBy (line 70) | func (a AppTagRepo) DeleteBy(ctx context.Context, opts ...DBOption) er...
    method GetFirst (line 74) | func (a AppTagRepo) GetFirst(ctx context.Context, opts ...DBOption) (*...
  type IAppTagRepo (line 13) | type IAppTagRepo interface
  function NewIAppTagRepo (line 26) | func NewIAppTagRepo() IAppTagRepo {

FILE: agent/app/repo/backup.go
  type BackupRepo (line 11) | type BackupRepo struct
    method WithByPublic (line 41) | func (u *BackupRepo) WithByPublic(isPublic bool) DBOption {
    method Get (line 47) | func (u *BackupRepo) Get(opts ...DBOption) (model.BackupAccount, error) {
    method Page (line 57) | func (u *BackupRepo) Page(page, size int, opts ...DBOption) (int64, []...
    method List (line 69) | func (u *BackupRepo) List(opts ...DBOption) ([]model.BackupAccount, er...
    method Create (line 79) | func (u *BackupRepo) Create(backup *model.BackupAccount) error {
    method Save (line 83) | func (u *BackupRepo) Save(backup *model.BackupAccount) error {
    method Delete (line 87) | func (u *BackupRepo) Delete(opts ...DBOption) error {
    method ListRecord (line 95) | func (u *BackupRepo) ListRecord(opts ...DBOption) ([]model.BackupRecor...
    method PageRecord (line 105) | func (u *BackupRepo) PageRecord(page, size int, opts ...DBOption) (int...
    method WithByFileName (line 117) | func (u *BackupRepo) WithByFileName(fileName string) DBOption {
    method WithByDetailName (line 126) | func (u *BackupRepo) WithByDetailName(detailName string) DBOption {
    method WithFileNameStartWith (line 135) | func (u *BackupRepo) WithFileNameStartWith(filePrefix string) DBOption {
    method CreateRecord (line 141) | func (u *BackupRepo) CreateRecord(record *model.BackupRecord) error {
    method UpdateRecord (line 145) | func (u *BackupRepo) UpdateRecord(record *model.BackupRecord) error {
    method UpdateRecordByMap (line 149) | func (u *BackupRepo) UpdateRecordByMap(id uint, upMap map[string]inter...
    method DeleteRecord (line 153) | func (u *BackupRepo) DeleteRecord(ctx context.Context, opts ...DBOptio...
    method WithByCronID (line 157) | func (u *BackupRepo) WithByCronID(cronjobID uint) DBOption {
    method GetRecord (line 163) | func (u *BackupRepo) GetRecord(opts ...DBOption) (*model.BackupRecord,...
    method SyncAll (line 173) | func (u *BackupRepo) SyncAll(data []model.BackupAccount) error {
  type IBackupRepo (line 13) | type IBackupRepo interface
  function NewIBackupRepo (line 37) | func NewIBackupRepo() IBackupRepo {

FILE: agent/app/repo/clam.go
  type ClamRepo (line 13) | type ClamRepo struct
    method Get (line 36) | func (u *ClamRepo) Get(opts ...DBOption) (model.Clam, error) {
    method List (line 46) | func (u *ClamRepo) List(opts ...DBOption) ([]model.Clam, error) {
    method Page (line 56) | func (u *ClamRepo) Page(page, size int, opts ...DBOption) (int64, []mo...
    method Create (line 68) | func (u *ClamRepo) Create(clam *model.Clam) error {
    method Update (line 72) | func (u *ClamRepo) Update(id uint, vars map[string]interface{}) error {
    method Delete (line 76) | func (u *ClamRepo) Delete(opts ...DBOption) error {
    method WithByClamID (line 84) | func (c *ClamRepo) WithByClamID(id uint) DBOption {
    method ListRecord (line 90) | func (u *ClamRepo) ListRecord(opts ...DBOption) ([]model.ClamRecord, e...
    method RecordFirst (line 100) | func (u *ClamRepo) RecordFirst(id uint) (model.ClamRecord, error) {
    method PageRecords (line 106) | func (u *ClamRepo) PageRecords(page, size int, opts ...DBOption) (int6...
    method StartRecords (line 117) | func (u *ClamRepo) StartRecords(clamID uint) model.ClamRecord {
    method EndRecords (line 129) | func (u *ClamRepo) EndRecords(record model.ClamRecord, status, message...
    method DeleteRecord (line 142) | func (u *ClamRepo) DeleteRecord(opts ...DBOption) error {
  type IClamRepo (line 15) | type IClamRepo interface
  function NewIClamRepo (line 32) | func NewIClamRepo() IClamRepo {

FILE: agent/app/repo/common.go
  type DBOption (line 14) | type DBOption
  function WithByID (line 16) | func WithByID(id uint) DBOption {
  function WithByGroupID (line 22) | func WithByGroupID(id uint) DBOption {
  function WithByNOTID (line 28) | func WithByNOTID(id uint) DBOption {
  function WithByIDs (line 34) | func WithByIDs(ids []uint) DBOption {
  function WithByIDNotIn (line 40) | func WithByIDNotIn(ids []uint) DBOption {
  function WithByName (line 46) | func WithByName(name string) DBOption {
  function WithByAddr (line 52) | func WithByAddr(addr string) DBOption {
  function WithByKey (line 58) | func WithByKey(key string) DBOption {
  function WithByLowerName (line 64) | func WithByLowerName(name string) DBOption {
  function WithByLikeName (line 70) | func WithByLikeName(name string) DBOption {
  function WithByDetailName (line 79) | func WithByDetailName(detailName string) DBOption {
  function WithByProvider (line 88) | func WithByProvider(provider string) DBOption {
  function WithByModel (line 97) | func WithByModel(model string) DBOption {
  function WithByAccountID (line 106) | func WithByAccountID(accountID uint) DBOption {
  function WithByType (line 115) | func WithByType(tp string) DBOption {
  function WithByDetailType (line 120) | func WithByDetailType(tp string) DBOption {
  function WithTypes (line 126) | func WithTypes(types []string) DBOption {
  function WithByStatus (line 132) | func WithByStatus(status string) DBOption {
  function WithByFrom (line 140) | func WithByFrom(from string) DBOption {
  function WithByDate (line 146) | func WithByDate(startTime, endTime time.Time) DBOption {
  function WithByGroups (line 152) | func WithByGroups(groupIDs []uint) DBOption {
  function WithByCreatedAt (line 161) | func WithByCreatedAt(startTime, endTime time.Time) DBOption {
  function WithOrderDesc (line 167) | func WithOrderDesc(orderBy string) DBOption {
  function WithOrderAsc (line 171) | func WithOrderAsc(orderBy string) DBOption {
  function WithOrderRuleBy (line 175) | func WithOrderRuleBy(orderBy, order string) DBOption {
  function getTx (line 200) | func getTx(ctx context.Context, opts ...DBOption) *gorm.DB {
  function getDb (line 211) | func getDb(opts ...DBOption) *gorm.DB {

FILE: agent/app/repo/compose_template.go
  type ComposeTemplateRepo (line 8) | type ComposeTemplateRepo struct
    method Get (line 29) | func (u *ComposeTemplateRepo) Get(opts ...DBOption) (model.ComposeTemp...
    method Page (line 39) | func (u *ComposeTemplateRepo) Page(page, size int, opts ...DBOption) (...
    method List (line 51) | func (u *ComposeTemplateRepo) List(opts ...DBOption) ([]model.ComposeT...
    method Create (line 61) | func (u *ComposeTemplateRepo) Create(compose *model.ComposeTemplate) e...
    method Update (line 65) | func (u *ComposeTemplateRepo) Update(id uint, vars map[string]interfac...
    method Delete (line 69) | func (u *ComposeTemplateRepo) Delete(opts ...DBOption) error {
    method GetRecord (line 77) | func (u *ComposeTemplateRepo) GetRecord(opts ...DBOption) (model.Compo...
    method ListRecord (line 87) | func (u *ComposeTemplateRepo) ListRecord() ([]model.Compose, error) {
    method CreateRecord (line 95) | func (u *ComposeTemplateRepo) CreateRecord(compose *model.Compose) err...
    method DeleteRecord (line 99) | func (u *ComposeTemplateRepo) DeleteRecord(opts ...DBOption) error {
    method UpdateRecord (line 106) | func (u *ComposeTemplateRepo) UpdateRecord(name string, vars map[strin...
  type IComposeTemplateRepo (line 10) | type IComposeTemplateRepo interface
  function NewIComposeTemplateRepo (line 25) | func NewIComposeTemplateRepo() IComposeTemplateRepo {

FILE: agent/app/repo/cronjob.go
  type CronjobRepo (line 13) | type CronjobRepo struct
    method Get (line 43) | func (u *CronjobRepo) Get(opts ...DBOption) (model.Cronjob, error) {
    method GetRecord (line 53) | func (u *CronjobRepo) GetRecord(opts ...DBOption) (model.JobRecords, e...
    method List (line 63) | func (u *CronjobRepo) List(opts ...DBOption) ([]model.Cronjob, error) {
    method ListRecord (line 73) | func (u *CronjobRepo) ListRecord(opts ...DBOption) ([]model.JobRecords...
    method Page (line 83) | func (u *CronjobRepo) Page(page, size int, opts ...DBOption) (int64, [...
    method RecordFirst (line 95) | func (u *CronjobRepo) RecordFirst(id uint) (model.JobRecords, error) {
    method PageRecords (line 101) | func (u *CronjobRepo) PageRecords(page, size int, opts ...DBOption) (i...
    method Create (line 113) | func (u *CronjobRepo) Create(cronjob *model.Cronjob) error {
    method WithByJobID (line 117) | func (c *CronjobRepo) WithByJobID(id int) DBOption {
    method WithByDbName (line 123) | func (c *CronjobRepo) WithByDbName(name string) DBOption {
    method WithByDownloadAccountID (line 129) | func (c *CronjobRepo) WithByDownloadAccountID(id uint) DBOption {
    method WithByRecordFile (line 135) | func (c *CronjobRepo) WithByRecordFile(file string) DBOption {
    method WithByRecordDropID (line 141) | func (c *CronjobRepo) WithByRecordDropID(id int) DBOption {
    method StartRecords (line 147) | func (u *CronjobRepo) StartRecords(cronjobID uint) model.JobRecords {
    method EndRecords (line 159) | func (u *CronjobRepo) EndRecords(record model.JobRecords, status, mess...
    method AddFailedRecord (line 172) | func (u *CronjobRepo) AddFailedRecord(cronjobID uint, message string) {
    method Save (line 183) | func (u *CronjobRepo) Save(id uint, cronjob model.Cronjob) error {
    method Update (line 186) | func (u *CronjobRepo) Update(id uint, vars map[string]interface{}) err...
    method UpdateRecords (line 190) | func (u *CronjobRepo) UpdateRecords(id uint, vars map[string]interface...
    method Delete (line 194) | func (u *CronjobRepo) Delete(opts ...DBOption) error {
    method DeleteRecord (line 201) | func (u *CronjobRepo) DeleteRecord(opts ...DBOption) error {
  type ICronjobRepo (line 15) | type ICronjobRepo interface
  function NewICronjobRepo (line 39) | func NewICronjobRepo() ICronjobRepo {

FILE: agent/app/repo/database.go
  type DatabaseRepo (line 14) | type DatabaseRepo struct
    method Get (line 32) | func (d *DatabaseRepo) Get(opts ...DBOption) (model.Database, error) {
    method Page (line 49) | func (d *DatabaseRepo) Page(page, size int, opts ...DBOption) (int64, ...
    method GetList (line 70) | func (d *DatabaseRepo) GetList(opts ...DBOption) ([]model.Database, er...
    method WithoutByFrom (line 89) | func (d *DatabaseRepo) WithoutByFrom(from string) DBOption {
    method WithTypeList (line 95) | func (d *DatabaseRepo) WithTypeList(dbType string) DBOption {
    method WithAppInstallID (line 115) | func (d *DatabaseRepo) WithAppInstallID(appInstallID uint) DBOption {
    method Create (line 121) | func (d *DatabaseRepo) Create(ctx context.Context, database *model.Dat...
    method Update (line 130) | func (d *DatabaseRepo) Update(id uint, vars map[string]interface{}) er...
    method Delete (line 134) | func (d *DatabaseRepo) Delete(ctx context.Context, opts ...DBOption) e...
  type IDatabaseRepo (line 16) | type IDatabaseRepo interface
  function NewIDatabaseRepo (line 28) | func NewIDatabaseRepo() IDatabaseRepo {

FILE: agent/app/repo/database_mysql.go
  type MysqlRepo (line 13) | type MysqlRepo struct
    method Get (line 30) | func (u *MysqlRepo) Get(opts ...DBOption) (model.DatabaseMysql, error) {
    method List (line 48) | func (u *MysqlRepo) List(opts ...DBOption) ([]model.DatabaseMysql, err...
    method Page (line 67) | func (u *MysqlRepo) Page(page, size int, opts ...DBOption) (int64, []m...
    method Create (line 88) | func (u *MysqlRepo) Create(ctx context.Context, mysql *model.DatabaseM...
    method Delete (line 97) | func (u *MysqlRepo) Delete(ctx context.Context, opts ...DBOption) error {
    method DeleteLocal (line 101) | func (u *MysqlRepo) DeleteLocal(ctx context.Context) error {
    method Update (line 105) | func (u *MysqlRepo) Update(id uint, vars map[string]interface{}) error {
    method WithByMysqlName (line 109) | func (u *MysqlRepo) WithByMysqlName(mysqlName string) DBOption {
  type IMysqlRepo (line 15) | type IMysqlRepo interface
  function NewIMysqlRepo (line 26) | func NewIMysqlRepo() IMysqlRepo {

FILE: agent/app/repo/database_postgresql.go
  type PostgresqlRepo (line 13) | type PostgresqlRepo struct
    method Get (line 30) | func (u *PostgresqlRepo) Get(opts ...DBOption) (model.DatabasePostgres...
    method List (line 48) | func (u *PostgresqlRepo) List(opts ...DBOption) ([]model.DatabasePostg...
    method Page (line 67) | func (u *PostgresqlRepo) Page(page, size int, opts ...DBOption) (int64...
    method Create (line 88) | func (u *PostgresqlRepo) Create(ctx context.Context, postgresql *model...
    method Delete (line 97) | func (u *PostgresqlRepo) Delete(ctx context.Context, opts ...DBOption)...
    method DeleteLocal (line 101) | func (u *PostgresqlRepo) DeleteLocal(ctx context.Context) error {
    method Update (line 105) | func (u *PostgresqlRepo) Update(id uint, vars map[string]interface{}) ...
    method WithByPostgresqlName (line 109) | func (u *PostgresqlRepo) WithByPostgresqlName(postgresqlName string) D...
  type IPostgresqlRepo (line 15) | type IPostgresqlRepo interface
  function NewIPostgresqlRepo (line 26) | func NewIPostgresqlRepo() IPostgresqlRepo {

FILE: agent/app/repo/favorite.go
  type FavoriteRepo (line 9) | type FavoriteRepo struct
    method WithByPath (line 24) | func (f *FavoriteRepo) WithByPath(path string) DBOption {
    method Page (line 30) | func (f *FavoriteRepo) Page(page, size int, opts ...DBOption) (int64, ...
    method Create (line 42) | func (f *FavoriteRepo) Create(favorite *model.Favorite) error {
    method GetFirst (line 46) | func (f *FavoriteRepo) GetFirst(opts ...DBOption) (model.Favorite, err...
    method Delete (line 55) | func (f *FavoriteRepo) Delete(opts ...DBOption) error {
    method All (line 60) | func (f *FavoriteRepo) All() ([]model.Favorite, error) {
  type IFavoriteRepo (line 11) | type IFavoriteRepo interface
  function NewIFavoriteRepo (line 20) | func NewIFavoriteRepo() IFavoriteRepo {

FILE: agent/app/repo/ftp.go
  type FtpRepo (line 9) | type FtpRepo struct
    method Get (line 26) | func (u *FtpRepo) Get(opts ...DBOption) (model.Ftp, error) {
    method WithByUser (line 36) | func (h *FtpRepo) WithByUser(user string) DBOption {
    method WithLikeUser (line 42) | func (h *FtpRepo) WithLikeUser(user string) DBOption {
    method GetList (line 51) | func (u *FtpRepo) GetList(opts ...DBOption) ([]model.Ftp, error) {
    method Page (line 61) | func (h *FtpRepo) Page(page, size int, opts ...DBOption) (int64, []mod...
    method Create (line 73) | func (h *FtpRepo) Create(ftp *model.Ftp) error {
    method Update (line 77) | func (h *FtpRepo) Update(id uint, vars map[string]interface{}) error {
    method Delete (line 81) | func (h *FtpRepo) Delete(opts ...DBOption) error {
  type IFtpRepo (line 11) | type IFtpRepo interface
  function NewIFtpRepo (line 22) | func NewIFtpRepo() IFtpRepo {

FILE: agent/app/repo/group.go
  type GroupRepo (line 9) | type GroupRepo struct
    method WithByDefault (line 26) | func (g *GroupRepo) WithByDefault(isDefault bool) DBOption {
    method Get (line 32) | func (g *GroupRepo) Get(opts ...DBOption) (model.Group, error) {
    method GetList (line 42) | func (g *GroupRepo) GetList(opts ...DBOption) ([]model.Group, error) {
    method Create (line 52) | func (g *GroupRepo) Create(group *model.Group) error {
    method Update (line 56) | func (g *GroupRepo) Update(id uint, vars map[string]interface{}) error {
    method Delete (line 60) | func (g *GroupRepo) Delete(opts ...DBOption) error {
    method WithByWebsiteDefault (line 68) | func (g *GroupRepo) WithByWebsiteDefault() DBOption {
    method CancelDefault (line 74) | func (g *GroupRepo) CancelDefault(groupType string) error {
  type IGroupRepo (line 11) | type IGroupRepo interface
  function NewIGroupRepo (line 22) | func NewIGroupRepo() IGroupRepo {

FILE: agent/app/repo/host.go
  type HostRepo (line 10) | type HostRepo struct
    method Get (line 45) | func (h *HostRepo) Get(opts ...DBOption) (model.Host, error) {
    method GetList (line 55) | func (h *HostRepo) GetList(opts ...DBOption) ([]model.Host, error) {
    method Page (line 65) | func (h *HostRepo) Page(page, size int, opts ...DBOption) (int64, []mo...
    method WithByInfo (line 77) | func (h *HostRepo) WithByInfo(info string) DBOption {
    method WithByPort (line 87) | func (h *HostRepo) WithByPort(port uint) DBOption {
    method WithByUser (line 93) | func (h *HostRepo) WithByUser(user string) DBOption {
    method Create (line 99) | func (h *HostRepo) Create(host *model.Host) error {
    method Update (line 103) | func (h *HostRepo) Update(id uint, vars map[string]interface{}) error {
    method UpdateGroup (line 107) | func (h *HostRepo) UpdateGroup(group, newGroup uint) error {
    method Delete (line 111) | func (h *HostRepo) Delete(opts ...DBOption) error {
    method GetFirewallRecord (line 119) | func (h *HostRepo) GetFirewallRecord(opts ...DBOption) (model.Firewall...
    method ListFirewallRecord (line 129) | func (h *HostRepo) ListFirewallRecord(opts ...DBOption) ([]model.Firew...
    method SaveFirewallRecord (line 141) | func (h *HostRepo) SaveFirewallRecord(firewall *model.Firewall) error {
    method DeleteFirewallRecordByID (line 171) | func (h *HostRepo) DeleteFirewallRecordByID(id uint) error {
    method GetCert (line 175) | func (u *HostRepo) GetCert(opts ...DBOption) (model.RootCert, error) {
    method PageCert (line 185) | func (u *HostRepo) PageCert(page, size int, opts ...DBOption) (int64, ...
    method ListCert (line 197) | func (u *HostRepo) ListCert(opts ...DBOption) ([]model.RootCert, error) {
    method SaveCert (line 209) | func (u *HostRepo) SaveCert(cert *model.RootCert) error {
    method UpdateCert (line 213) | func (u *HostRepo) UpdateCert(id uint, vars map[string]interface{}) er...
    method DeleteCert (line 217) | func (u *HostRepo) DeleteCert(opts ...DBOption) error {
    method SyncCert (line 225) | func (u *HostRepo) SyncCert(data []model.RootCert) error {
    method WithByChain (line 254) | func (u *HostRepo) WithByChain(chain string) DBOption {
  type IHostRepo (line 12) | type IHostRepo interface
  function NewIHostRepo (line 41) | func NewIHostRepo() IHostRepo {

FILE: agent/app/repo/image_repo.go
  type ImageRepoRepo (line 8) | type ImageRepoRepo struct
    method Get (line 23) | func (u *ImageRepoRepo) Get(opts ...DBOption) (model.ImageRepo, error) {
    method Page (line 33) | func (u *ImageRepoRepo) Page(page, size int, opts ...DBOption) (int64,...
    method List (line 45) | func (u *ImageRepoRepo) List(opts ...DBOption) ([]model.ImageRepo, err...
    method Create (line 57) | func (u *ImageRepoRepo) Create(imageRepo *model.ImageRepo) error {
    method Update (line 61) | func (u *ImageRepoRepo) Update(id uint, vars map[string]interface{}) e...
    method Delete (line 65) | func (u *ImageRepoRepo) Delete(opts ...DBOption) error {
  type IImageRepoRepo (line 10) | type IImageRepoRepo interface
  function NewIImageRepoRepo (line 19) | func NewIImageRepoRepo() IImageRepoRepo {

FILE: agent/app/repo/mcp_server.go
  type McpServerRepo (line 5) | type McpServerRepo struct
    method Page (line 21) | func (m McpServerRepo) Page(page, size int, opts ...DBOption) (int64, ...
    method GetFirst (line 30) | func (m McpServerRepo) GetFirst(opts ...DBOption) (*model.McpServer, e...
    method List (line 38) | func (m McpServerRepo) List(opts ...DBOption) ([]model.McpServer, erro...
    method Create (line 46) | func (m McpServerRepo) Create(mcpServer *model.McpServer) error {
    method Save (line 50) | func (m McpServerRepo) Save(mcpServer *model.McpServer) error {
    method DeleteBy (line 54) | func (m McpServerRepo) DeleteBy(opts ...DBOption) error {
  type IMcpServerRepo (line 8) | type IMcpServerRepo interface
  function NewIMcpServerRepo (line 17) | func NewIMcpServerRepo() IMcpServerRepo {

FILE: agent/app/repo/monitor.go
  type MonitorRepo (line 11) | type MonitorRepo struct
    method GetBase (line 35) | func (u *MonitorRepo) GetBase(opts ...DBOption) ([]model.MonitorBase, ...
    method GetIO (line 44) | func (u *MonitorRepo) GetIO(opts ...DBOption) ([]model.MonitorIO, erro...
    method GetNetwork (line 53) | func (u *MonitorRepo) GetNetwork(opts ...DBOption) ([]model.MonitorNet...
    method GetGPU (line 62) | func (u *MonitorRepo) GetGPU(opts ...DBOption) ([]model.MonitorGPU, er...
    method CreateMonitorBase (line 72) | func (u *MonitorRepo) CreateMonitorBase(model model.MonitorBase) error {
    method BatchCreateMonitorGPU (line 75) | func (s *MonitorRepo) BatchCreateMonitorGPU(list []model.MonitorGPU) e...
    method BatchCreateMonitorIO (line 78) | func (u *MonitorRepo) BatchCreateMonitorIO(ioList []model.MonitorIO) e...
    method BatchCreateMonitorNet (line 81) | func (u *MonitorRepo) BatchCreateMonitorNet(ioList []model.MonitorNetw...
    method DelMonitorBase (line 84) | func (u *MonitorRepo) DelMonitorBase(timeForDelete time.Time) error {
    method DelMonitorIO (line 87) | func (u *MonitorRepo) DelMonitorIO(timeForDelete time.Time) error {
    method DelMonitorNet (line 90) | func (u *MonitorRepo) DelMonitorNet(timeForDelete time.Time) error {
    method DelMonitorGPU (line 93) | func (s *MonitorRepo) DelMonitorGPU(timeForDelete time.Time) error {
    method WithByProductName (line 97) | func (s *MonitorRepo) WithByProductName(name string) DBOption {
  type IMonitorRepo (line 13) | type IMonitorRepo interface
  function NewIMonitorRepo (line 31) | func NewIMonitorRepo() IMonitorRepo {

FILE: agent/app/repo/php_extensions.go
  type PHPExtensionsRepo (line 7) | type PHPExtensionsRepo struct
    method Page (line 23) | func (p *PHPExtensionsRepo) Page(page, size int, opts ...DBOption) (in...
    method List (line 34) | func (p *PHPExtensionsRepo) List() ([]model.PHPExtensions, error) {
    method Save (line 42) | func (p *PHPExtensionsRepo) Save(extension *model.PHPExtensions) error {
    method Create (line 46) | func (p *PHPExtensionsRepo) Create(extension *model.PHPExtensions) err...
    method GetFirst (line 50) | func (p *PHPExtensionsRepo) GetFirst(opts ...DBOption) (model.PHPExten...
    method DeleteBy (line 57) | func (p *PHPExtensionsRepo) DeleteBy(opts ...DBOption) error {
  type IPHPExtensionsRepo (line 10) | type IPHPExtensionsRepo interface
  function NewIPHPExtensionsRepo (line 19) | func NewIPHPExtensionsRepo() IPHPExtensionsRepo {

FILE: agent/app/repo/runtime.go
  type RuntimeRepo (line 12) | type RuntimeRepo struct
    method WithStatus (line 35) | func (r *RuntimeRepo) WithStatus(status string) DBOption {
    method WithNormalStatus (line 41) | func (r *RuntimeRepo) WithNormalStatus(status string) DBOption {
    method WithImage (line 47) | func (r *RuntimeRepo) WithImage(image string) DBOption {
    method WithDetailId (line 53) | func (r *RuntimeRepo) WithDetailId(id uint) DBOption {
    method WithDetailIdsIn (line 59) | func (r *RuntimeRepo) WithDetailIdsIn(ids []uint) DBOption {
    method WithNotId (line 65) | func (r *RuntimeRepo) WithNotId(id uint) DBOption {
    method WithPort (line 71) | func (r *RuntimeRepo) WithPort(port int) DBOption {
    method Page (line 84) | func (r *RuntimeRepo) Page(page, size int, opts ...DBOption) (int64, [...
    method List (line 93) | func (r *RuntimeRepo) List(opts ...DBOption) ([]model.Runtime, error) {
    method Create (line 103) | func (r *RuntimeRepo) Create(ctx context.Context, runtime *model.Runti...
    method Save (line 108) | func (r *RuntimeRepo) Save(runtime *model.Runtime) error {
    method DeleteBy (line 112) | func (r *RuntimeRepo) DeleteBy(opts ...DBOption) error {
    method GetFirst (line 116) | func (r *RuntimeRepo) GetFirst(ctx context.Context, opts ...DBOption) ...
  type IRuntimeRepo (line 15) | type IRuntimeRepo interface
  function NewIRunTimeRepo (line 31) | func NewIRunTimeRepo() IRuntimeRepo {

FILE: agent/app/repo/script.go
  type ScriptRepo (line 8) | type ScriptRepo struct
    method Get (line 21) | func (u *ScriptRepo) Get(opts ...DBOption) (model.ScriptLibrary, error) {
    method List (line 34) | func (u *ScriptRepo) List(opts ...DBOption) ([]model.ScriptLibrary, er...
    method SyncAll (line 52) | func (u *ScriptRepo) SyncAll(data []model.ScriptLibrary) error {
  type IScriptRepo (line 10) | type IScriptRepo interface
  function NewIScriptRepo (line 17) | func NewIScriptRepo() IScriptRepo {

FILE: agent/app/repo/setting.go
  type SettingRepo (line 11) | type SettingRepo struct
    method GetList (line 35) | func (s *SettingRepo) GetList(opts ...DBOption) ([]model.Setting, erro...
    method Create (line 45) | func (s *SettingRepo) Create(key, value string) error {
    method Get (line 53) | func (s *SettingRepo) Get(opts ...DBOption) (model.Setting, error) {
    method GetValueByKey (line 63) | func (s *SettingRepo) GetValueByKey(key string) (string, error) {
    method WithByKey (line 71) | func (s *SettingRepo) WithByKey(key string) DBOption {
    method Update (line 77) | func (s *SettingRepo) Update(key, value string) error {
    method UpdateOrCreate (line 81) | func (s *SettingRepo) UpdateOrCreate(key, value string) error {
    method GetDescriptionList (line 93) | func (s *SettingRepo) GetDescriptionList(opts ...DBOption) ([]model.Co...
    method GetDescription (line 102) | func (s *SettingRepo) GetDescription(opts ...DBOption) (model.CommonDe...
    method CreateDescription (line 111) | func (s *SettingRepo) CreateDescription(data *model.CommonDescription)...
    method UpdateDescription (line 114) | func (s *SettingRepo) UpdateDescription(id string, val map[string]inte...
    method DelDescription (line 117) | func (s *SettingRepo) DelDescription(id string) error {
    method WithByDescriptionID (line 120) | func (s *SettingRepo) WithByDescriptionID(id string) DBOption {
  type ISettingRepo (line 13) | type ISettingRepo interface
  function NewISettingRepo (line 31) | func NewISettingRepo() ISettingRepo {

FILE: agent/app/repo/snapshot.go
  type ISnapshotRepo (line 8) | type ISnapshotRepo interface
  function NewISnapshotRepo (line 17) | func NewISnapshotRepo() ISnapshotRepo {
  type SnapshotRepo (line 21) | type SnapshotRepo struct
    method Get (line 23) | func (u *SnapshotRepo) Get(opts ...DBOption) (model.Snapshot, error) {
    method GetList (line 33) | func (u *SnapshotRepo) GetList(opts ...DBOption) ([]model.Snapshot, er...
    method Page (line 43) | func (u *SnapshotRepo) Page(page, size int, opts ...DBOption) (int64, ...
    method Create (line 55) | func (u *SnapshotRepo) Create(Snapshot *model.Snapshot) error {
    method Update (line 59) | func (u *SnapshotRepo) Update(id uint, vars map[string]interface{}) er...
    method Delete (line 63) | func (u *SnapshotRepo) Delete(opts ...DBOption) error {

FILE: agent/app/repo/tag.go
  type TagRepo (line 9) | type TagRepo struct
    method BatchCreate (line 29) | func (t TagRepo) BatchCreate(ctx context.Context, tags []*model.Tag) e...
    method DeleteAll (line 33) | func (t TagRepo) DeleteAll(ctx context.Context) error {
    method All (line 37) | func (t TagRepo) All() ([]model.Tag, error) {
    method GetByKey (line 45) | func (t TagRepo) GetByKey(key string) (*model.Tag, error) {
    method GetByIds (line 53) | func (t TagRepo) GetByIds(ids []uint) ([]model.Tag, error) {
    method GetByKeys (line 61) | func (t TagRepo) GetByKeys(keys []string) ([]model.Tag, error) {
    method GetByAppId (line 69) | func (t TagRepo) GetByAppId(appId uint) ([]model.Tag, error) {
    method DeleteByID (line 77) | func (t TagRepo) DeleteByID(ctx context.Context, id uint) error {
    method Create (line 81) | func (t TagRepo) Create(ctx context.Context, tag *model.Tag) error {
    method Save (line 85) | func (t TagRepo) Save(ctx context.Context, tag *model.Tag) error {
  type ITagRepo (line 12) | type ITagRepo interface
  function NewITagRepo (line 25) | func NewITagRepo() ITagRepo {

FILE: agent/app/repo/task.go
  type TaskRepo (line 13) | type TaskRepo struct
    method WithByID (line 56) | func (t TaskRepo) WithByID(id string) DBOption {
    method WithByIDNotIn (line 62) | func (t TaskRepo) WithByIDNotIn(ids []string) DBOption {
    method WithOperate (line 68) | func (t TaskRepo) WithOperate(taskOperate string) DBOption {
    method WithResourceID (line 74) | func (t TaskRepo) WithResourceID(id uint) DBOption {
    method WithByStatus (line 80) | func (t TaskRepo) WithByStatus(status string) DBOption {
    method Save (line 86) | func (t TaskRepo) Save(ctx context.Context, task *model.Task) error {
    method GetFirst (line 90) | func (t TaskRepo) GetFirst(opts ...DBOption) (model.Task, error) {
    method Page (line 99) | func (t TaskRepo) Page(page, size int, opts ...DBOption) (int64, []mod...
    method Update (line 108) | func (t TaskRepo) Update(ctx context.Context, task *model.Task) error {
    method UpdateRunningTaskToFailed (line 112) | func (t TaskRepo) UpdateRunningTaskToFailed() error {
    method CountExecutingTask (line 116) | func (t TaskRepo) CountExecutingTask() (int64, error) {
    method Delete (line 122) | func (t TaskRepo) Delete(opts ...DBOption) error {
    method DeleteAll (line 130) | func (t TaskRepo) DeleteAll() error {
  type ITaskRepo (line 16) | type ITaskRepo interface
  function NewITaskRepo (line 33) | func NewITaskRepo() ITaskRepo {
  function getTaskDb (line 37) | func getTaskDb(opts ...DBOption) *gorm.DB {
  function getTaskTx (line 45) | func getTaskTx(ctx context.Context, opts ...DBOption) *gorm.DB {

FILE: agent/app/repo/tensorrt_llm.go
  type TensorRTLLMRepo (line 5) | type TensorRTLLMRepo struct
    method Page (line 21) | func (t TensorRTLLMRepo) Page(page, size int, opts ...DBOption) (int64...
    method GetFirst (line 30) | func (t TensorRTLLMRepo) GetFirst(opts ...DBOption) (*model.TensorRTLL...
    method List (line 38) | func (t TensorRTLLMRepo) List(opts ...DBOption) ([]model.TensorRTLLM, ...
    method Create (line 46) | func (t TensorRTLLMRepo) Create(tensorrtLLM *model.TensorRTLLM) error {
    method Save (line 50) | func (t TensorRTLLMRepo) Save(tensorrtLLM *model.TensorRTLLM) error {
    method DeleteBy (line 54) | func (t TensorRTLLMRepo) DeleteBy(opts ...DBOption) error {
  type ITensorRTLLMRepo (line 8) | type ITensorRTLLMRepo interface
  function NewITensorRTLLMRepo (line 17) | func NewITensorRTLLMRepo() ITensorRTLLMRepo {

FILE: agent/app/repo/website.go
  type IWebsiteRepo (line 11) | type IWebsiteRepo interface
  function NewIWebsiteRepo (line 38) | func NewIWebsiteRepo() IWebsiteRepo {
  type WebsiteRepo (line 42) | type WebsiteRepo struct
    method WithAppInstallId (line 45) | func (w *WebsiteRepo) WithAppInstallId(appInstallID uint) DBOption {
    method WithRuntimeID (line 51) | func (w *WebsiteRepo) WithRuntimeID(runtimeID uint) DBOption {
    method WithDomain (line 57) | func (w *WebsiteRepo) WithDomain(domain string) DBOption {
    method WithDomainLike (line 63) | func (w *WebsiteRepo) WithDomainLike(domain string) DBOption {
    method WithAlias (line 69) | func (w *WebsiteRepo) WithAlias(alias string) DBOption {
    method WithWebsiteSSLID (line 75) | func (w *WebsiteRepo) WithWebsiteSSLID(sslId uint) DBOption {
    method WithParentID (line 81) | func (w *WebsiteRepo) WithParentID(websiteID uint) DBOption {
    method WithGroupID (line 87) | func (w *WebsiteRepo) WithGroupID(groupId uint) DBOption {
    method WithDefaultServer (line 93) | func (w *WebsiteRepo) WithDefaultServer() DBOption {
    method WithType (line 99) | func (w *WebsiteRepo) WithType(websiteType string) DBOption {
    method WithDBType (line 105) | func (w *WebsiteRepo) WithDBType(dbType string) DBOption {
    method WithDBID (line 111) | func (w *WebsiteRepo) WithDBID(dbID uint) DBOption {
    method Page (line 117) | func (w *WebsiteRepo) Page(page, size int, opts ...DBOption) (int64, [...
    method List (line 126) | func (w *WebsiteRepo) List(opts ...DBOption) ([]model.Website, error) {
    method GetFirst (line 132) | func (w *WebsiteRepo) GetFirst(opts ...DBOption) (model.Website, error) {
    method GetBy (line 141) | func (w *WebsiteRepo) GetBy(opts ...DBOption) ([]model.Website, error) {
    method Create (line 150) | func (w *WebsiteRepo) Create(ctx context.Context, app *model.Website) ...
    method Save (line 154) | func (w *WebsiteRepo) Save(ctx context.Context, app *model.Website) er...
    method SaveWithoutCtx (line 158) | func (w *WebsiteRepo) SaveWithoutCtx(website *model.Website) error {
    method DeleteBy (line 162) | func (w *WebsiteRepo) DeleteBy(ctx context.Context, opts ...DBOption) ...
    method DeleteAll (line 166) | func (w *WebsiteRepo) DeleteAll(ctx context.Context) error {
    method UpdateGroup (line 170) | func (w *WebsiteRepo) UpdateGroup(group, newGroup uint) error {

FILE: agent/app/repo/website_acme_account.go
  type IAcmeAccountRepo (line 8) | type IAcmeAccountRepo interface
  function NewIAcmeAccountRepo (line 18) | func NewIAcmeAccountRepo() IAcmeAccountRepo {
  type WebsiteAcmeAccountRepo (line 22) | type WebsiteAcmeAccountRepo struct
    method WithEmail (line 25) | func (w *WebsiteAcmeAccountRepo) WithEmail(email string) DBOption {
    method WithType (line 30) | func (w *WebsiteAcmeAccountRepo) WithType(acType string) DBOption {
    method Page (line 36) | func (w *WebsiteAcmeAccountRepo) Page(page, size int, opts ...DBOption...
    method GetFirst (line 45) | func (w *WebsiteAcmeAccountRepo) GetFirst(opts ...DBOption) (*model.We...
    method Create (line 54) | func (w *WebsiteAcmeAccountRepo) Create(account model.WebsiteAcmeAccou...
    method Save (line 58) | func (w *WebsiteAcmeAccountRepo) Save(account model.WebsiteAcmeAccount...
    method DeleteBy (line 62) | func (w *WebsiteAcmeAccountRepo) DeleteBy(opts ...DBOption) error {

FILE: agent/app/repo/website_ca.go
  type WebsiteCARepo (line 9) | type WebsiteCARepo struct
    method Page (line 24) | func (w WebsiteCARepo) Page(page, size int, opts ...DBOption) (int64, ...
    method GetFirst (line 33) | func (w WebsiteCARepo) GetFirst(opts ...DBOption) (model.WebsiteCA, er...
    method List (line 42) | func (w WebsiteCARepo) List(opts ...DBOption) ([]model.WebsiteCA, erro...
    method Create (line 49) | func (w WebsiteCARepo) Create(ctx context.Context, ca *model.WebsiteCA...
    method DeleteBy (line 53) | func (w WebsiteCARepo) DeleteBy(opts ...DBOption) error {
  function NewIWebsiteCARepo (line 12) | func NewIWebsiteCARepo() IWebsiteCARepo {
  type IWebsiteCARepo (line 16) | type IWebsiteCARepo interface

FILE: agent/app/repo/website_dns_account.go
  type WebsiteDnsAccountRepo (line 7) | type WebsiteDnsAccountRepo struct
    method Page (line 23) | func (w WebsiteDnsAccountRepo) Page(page, size int, opts ...DBOption) ...
    method GetFirst (line 32) | func (w WebsiteDnsAccountRepo) GetFirst(opts ...DBOption) (*model.Webs...
    method List (line 41) | func (w WebsiteDnsAccountRepo) List(opts ...DBOption) ([]model.Website...
    method Create (line 50) | func (w WebsiteDnsAccountRepo) Create(account model.WebsiteDnsAccount)...
    method Save (line 54) | func (w WebsiteDnsAccountRepo) Save(account model.WebsiteDnsAccount) e...
    method DeleteBy (line 58) | func (w WebsiteDnsAccountRepo) DeleteBy(opts ...DBOption) error {
  type IWebsiteDnsAccountRepo (line 10) | type IWebsiteDnsAccountRepo interface
  function NewIWebsiteDnsAccountRepo (line 19) | func NewIWebsiteDnsAccountRepo() IWebsiteDnsAccountRepo {

FILE: agent/app/repo/website_domain.go
  type WebsiteDomainRepo (line 11) | type WebsiteDomainRepo struct
    method WithWebsiteId (line 33) | func (w WebsiteDomainRepo) WithWebsiteId(websiteId uint) DBOption {
    method WithPort (line 39) | func (w WebsiteDomainRepo) WithPort(port int) DBOption {
    method WithDomain (line 44) | func (w WebsiteDomainRepo) WithDomain(domain string) DBOption {
    method WithDomainLike (line 49) | func (w WebsiteDomainRepo) WithDomainLike(domain string) DBOption {
    method Page (line 54) | func (w WebsiteDomainRepo) Page(page, size int, opts ...DBOption) (int...
    method GetFirst (line 63) | func (w WebsiteDomainRepo) GetFirst(opts ...DBOption) (model.WebsiteDo...
    method GetBy (line 72) | func (w WebsiteDomainRepo) GetBy(opts ...DBOption) ([]model.WebsiteDom...
    method BatchCreate (line 81) | func (w WebsiteDomainRepo) BatchCreate(ctx context.Context, domains []...
    method Create (line 85) | func (w WebsiteDomainRepo) Create(ctx context.Context, app *model.Webs...
    method Save (line 89) | func (w WebsiteDomainRepo) Save(ctx context.Context, app *model.Websit...
    method DeleteBy (line 93) | func (w WebsiteDomainRepo) DeleteBy(ctx context.Context, opts ...DBOpt...
    method DeleteAll (line 97) | func (w WebsiteDomainRepo) DeleteAll(ctx context.Context) error {
  type IWebsiteDomainRepo (line 14) | type IWebsiteDomainRepo interface
  function NewIWebsiteDomainRepo (line 29) | func NewIWebsiteDomainRepo() IWebsiteDomainRepo {

FILE: agent/app/repo/website_ssl.go
  function NewISSLRepo (line 10) | func NewISSLRepo() ISSLRepo {
  type ISSLRepo (line 14) | type ISSLRepo interface
  type WebsiteSSLRepo (line 30) | type WebsiteSSLRepo struct
    method WithByAlias (line 33) | func (w WebsiteSSLRepo) WithByAlias(alias string) DBOption {
    method WithByAcmeAccountId (line 39) | func (w WebsiteSSLRepo) WithByAcmeAccountId(acmeAccountId uint) DBOpti...
    method WithByDnsAccountId (line 45) | func (w WebsiteSSLRepo) WithByDnsAccountId(dnsAccountId uint) DBOption {
    method WithByCAID (line 51) | func (w WebsiteSSLRepo) WithByCAID(caID uint) DBOption {
    method WithByDomain (line 57) | func (w WebsiteSSLRepo) WithByDomain(domain string) DBOption {
    method WithByMasterSSLID (line 63) | func (w WebsiteSSLRepo) WithByMasterSSLID(sslID uint) DBOption {
    method Page (line 69) | func (w WebsiteSSLRepo) Page(page, size int, opts ...DBOption) (int64,...
    method GetFirst (line 78) | func (w WebsiteSSLRepo) GetFirst(opts ...DBOption) (*model.WebsiteSSL,...
    method List (line 87) | func (w WebsiteSSLRepo) List(opts ...DBOption) ([]model.WebsiteSSL, er...
    method Create (line 96) | func (w WebsiteSSLRepo) Create(ctx context.Context, ssl *model.Website...
    method Save (line 100) | func (w WebsiteSSLRepo) Save(ssl *model.WebsiteSSL) error {
    method SaveByMap (line 106) | func (w WebsiteSSLRepo) SaveByMap(ssl *model.WebsiteSSL, params map[st...
    method DeleteBy (line 112) | func (w WebsiteSSLRepo) DeleteBy(opts ...DBOption) error {

FILE: agent/app/service/agents.go
  type IAgentService (line 25) | type IAgentService interface
  constant defaultBrowserExecutablePath (line 64) | defaultBrowserExecutablePath  = "/home/node/.cache/ms-playwright/chromiu...
  constant defaultBrowserProfile (line 65) | defaultBrowserProfile         = "openclaw"
  constant defaultUserTimezone (line 66) | defaultUserTimezone           = "Asia/Shanghai"
  constant defaultToolsProfile (line 67) | defaultToolsProfile           = "full"
  constant defaultToolsSessionVisibility (line 68) | defaultToolsSessionVisibility = "all"
  constant maxCommunityAIAgents (line 69) | maxCommunityAIAgents          = int64(5)
  constant openclawPluginBaseDir (line 70) | openclawPluginBaseDir         = "/home/node/.openclaw/extensions"
  constant openclawGatewayPort (line 71) | openclawGatewayPort           = 18789
  constant openclawAllowedOriginHost (line 72) | openclawAllowedOriginHost     = "127.0.0.1"
  constant openclawHTTPSVersion (line 73) | openclawHTTPSVersion          = "2026.3.13"
  constant openclawTrustedProxyLoopback (line 74) | openclawTrustedProxyLoopback  = "127.0.0.1/32"
  method Create (line 77) | func (a AgentService) Create(req dto.AgentCreateReq) (*dto.AgentItem, er...
  method Page (line 240) | func (a AgentService) Page(req dto.SearchWithPage) (int64, []dto.AgentIt...
  method Delete (line 260) | func (a AgentService) Delete(req dto.AgentDeleteReq) error {
  method ResetToken (line 280) | func (a AgentService) ResetToken(req dto.AgentTokenResetReq) error {
  method UpdateModelConfig (line 309) | func (a AgentService) UpdateModelConfig(req dto.AgentModelConfigUpdateRe...
  method GetProviders (line 342) | func (a AgentService) GetProviders() ([]dto.ProviderInfo, error) {
  method CreateAccount (line 360) | func (a AgentService) CreateAccount(req dto.AgentAccountCreateReq) error {
  method UpdateAccount (line 398) | func (a AgentService) UpdateAccount(req dto.AgentAccountUpdateReq) error {
  method PageAccounts (line 427) | func (a AgentService) PageAccounts(req dto.AgentAccountSearch) (int64, [...
  method GetAccountModels (line 470) | func (a AgentService) GetAccountModels(req dto.AgentAccountModelReq) ([]...
  method CreateAccountModel (line 478) | func (a AgentService) CreateAccountModel(req dto.AgentAccountModelCreate...
  method UpdateAccountModel (line 515) | func (a AgentService) UpdateAccountModel(req dto.AgentAccountModelUpdate...
  method DeleteAccountModel (line 567) | func (a AgentService) DeleteAccountModel(req dto.AgentAccountModelDelete...
  method SyncAgentsByAccount (line 598) | func (a AgentService) SyncAgentsByAccount(account *model.AgentAccount) e...
  method VerifyAccount (line 605) | func (a AgentService) VerifyAccount(req dto.AgentAccountVerifyReq) error {
  method DeleteAccount (line 613) | func (a AgentService) DeleteAccount(req dto.AgentAccountDeleteReq) error {
  method GetFeishuConfig (line 623) | func (a AgentService) GetFeishuConfig(req dto.AgentFeishuConfigReq) (*dt...
  method UpdateFeishuConfig (line 632) | func (a AgentService) UpdateFeishuConfig(req dto.AgentFeishuConfigUpdate...
  method GetTelegramConfig (line 646) | func (a AgentService) GetTelegramConfig(req dto.AgentTelegramConfigReq) ...
  method UpdateTelegramConfig (line 655) | func (a AgentService) UpdateTelegramConfig(req dto.AgentTelegramConfigUp...
  method GetDiscordConfig (line 667) | func (a AgentService) GetDiscordConfig(req dto.AgentDiscordConfigReq) (*...
  method UpdateDiscordConfig (line 676) | func (a AgentService) UpdateDiscordConfig(req dto.AgentDiscordConfigUpda...
  method GetQQBotConfig (line 689) | func (a AgentService) GetQQBotConfig(req dto.AgentQQBotConfigReq) (*dto....
  method UpdateQQBotConfig (line 700) | func (a AgentService) UpdateQQBotConfig(req dto.AgentQQBotConfigUpdateRe...
  method GetWecomConfig (line 711) | func (a AgentService) GetWecomConfig(req dto.AgentWecomConfigReq) (*dto....
  method UpdateWecomConfig (line 722) | func (a AgentService) UpdateWecomConfig(req dto.AgentWecomConfigUpdateRe...
  method GetDingTalkConfig (line 734) | func (a AgentService) GetDingTalkConfig(req dto.AgentDingTalkConfigReq) ...
  method UpdateDingTalkConfig (line 745) | func (a AgentService) UpdateDingTalkConfig(req dto.AgentDingTalkConfigUp...
  method InstallPlugin (line 760) | func (a AgentService) InstallPlugin(req dto.AgentPluginInstallReq) error {
  method CheckPlugin (line 785) | func (a AgentService) CheckPlugin(req dto.AgentPluginCheckReq) (*dto.Age...
  method GetSecurityConfig (line 797) | func (a AgentService) GetSecurityConfig(req dto.AgentSecurityConfigReq) ...
  method UpdateSecurityConfig (line 813) | func (a AgentService) UpdateSecurityConfig(req dto.AgentSecurityConfigUp...
  method GetOtherConfig (line 842) | func (a AgentService) GetOtherConfig(req dto.AgentOtherConfigReq) (*dto....
  method UpdateOtherConfig (line 855) | func (a AgentService) UpdateOtherConfig(req dto.AgentOtherConfigUpdateRe...
  method ApproveChannelPairing (line 874) | func (a AgentService) ApproveChannelPairing(req dto.AgentChannelPairingA...
  method loadAgentAndInstall (line 891) | func (a AgentService) loadAgentAndInstall(agentID uint) (*model.Agent, *...
  method loadAgentConfig (line 906) | func (a AgentService) loadAgentConfig(agentID uint) (*model.Agent, *mode...
  method mutateAgentConfig (line 918) | func (a AgentService) mutateAgentConfig(agentID uint, fn func(agent *mod...
  method syncAgentsByAccount (line 929) | func (a AgentService) syncAgentsByAccount(account *model.AgentAccount) e...

FILE: agent/app/service/agents_utils.go
  type AgentService (line 30) | type AgentService struct
  function NewIAgentService (line 32) | func NewIAgentService() IAgentService {
  type resolvedAgentAccountVerification (line 36) | type resolvedAgentAccountVerification struct
  type resolvedAgentAccountInput (line 42) | type resolvedAgentAccountInput struct
  function resolveAgentAccountVerification (line 49) | func resolveAgentAccountVerification(provider, apiKey, baseURL string) (...
  function verifyResolvedAgentAccount (line 76) | func verifyResolvedAgentAccount(input resolvedAgentAccountVerification) ...
  function resolveAgentAccountAPIType (line 83) | func resolveAgentAccountAPIType(provider, apiType, fallbackAPIType strin...
  function resolveAgentAccountInput (line 110) | func resolveAgentAccountInput(provider, apiKey, baseURL, apiType, fallba...
  function readOpenclawConfig (line 130) | func readOpenclawConfig(configPath string) (map[string]interface{}, erro...
  function writeOpenclawConfigRaw (line 146) | func writeOpenclawConfigRaw(configPath string, conf map[string]interface...
  function normalizeAllowedOrigins (line 157) | func normalizeAllowedOrigins(origins []string) ([]string, error) {
  function normalizeAllowedOrigin (line 181) | func normalizeAllowedOrigin(origin string) (string, error) {
  function extractSecurityConfig (line 209) | func extractSecurityConfig(conf map[string]interface{}) dto.AgentSecurit...
  function setSecurityConfig (line 236) | func setSecurityConfig(conf map[string]interface{}, config dto.AgentSecu...
  function ensureGatewaySecurityDefaults (line 248) | func ensureGatewaySecurityDefaults(conf map[string]interface{}) {
  function ensureOpenclawUpdateDefaults (line 258) | func ensureOpenclawUpdateDefaults(conf map[string]interface{}) {
  function setTrustedProxies (line 265) | func setTrustedProxies(gateway map[string]interface{}) {
  function extractFeishuConfig (line 300) | func extractFeishuConfig(conf map[string]interface{}) dto.AgentFeishuCon...
  function setFeishuConfig (line 336) | func setFeishuConfig(conf map[string]interface{}, config dto.AgentFeishu...
  function setFeishuPluginEnabled (line 353) | func setFeishuPluginEnabled(conf map[string]interface{}, enabled bool) {
  function extractTelegramConfig (line 360) | func extractTelegramConfig(conf map[string]interface{}) dto.AgentTelegra...
  function setTelegramConfig (line 385) | func setTelegramConfig(conf map[string]interface{}, config dto.AgentTele...
  function extractDiscordConfig (line 401) | func extractDiscordConfig(conf map[string]interface{}) dto.AgentDiscordC...
  function setDiscordConfig (line 437) | func setDiscordConfig(conf map[string]interface{}, config dto.AgentDisco...
  function extractBrowserConfig (line 457) | func extractBrowserConfig(conf map[string]interface{}) browserConfig {
  function setBrowserConfig (line 487) | func setBrowserConfig(conf map[string]interface{}, config browserConfig) {
  function extractQQBotConfig (line 500) | func extractQQBotConfig(conf map[string]interface{}) dto.AgentQQBotConfig {
  function extractWecomConfig (line 522) | func extractWecomConfig(conf map[string]interface{}) dto.AgentWecomConfig {
  function extractDingTalkConfig (line 547) | func extractDingTalkConfig(conf map[string]interface{}) dto.AgentDingTal...
  function setWecomConfig (line 583) | func setWecomConfig(conf map[string]interface{}, config dto.AgentWecomCo...
  function setDingTalkConfig (line 602) | func setDingTalkConfig(conf map[string]interface{}, config dto.AgentDing...
  function setQQBotConfig (line 640) | func setQQBotConfig(conf map[string]interface{}, config dto.AgentQQBotCo...
  function resolvePluginMeta (line 654) | func resolvePluginMeta(pluginType string) (string, string, error) {
  function checkPluginInstalled (line 667) | func checkPluginInstalled(containerName, pluginType string) (bool, error) {
  function extractOtherConfig (line 683) | func extractOtherConfig(conf map[string]interface{}) dto.AgentOtherConfig {
  function setOtherConfig (line 705) | func setOtherConfig(conf map[string]interface{}, config dto.AgentOtherCo...
  function buildAgentItem (line 722) | func buildAgentItem(agent *model.Agent, appInstall *model.AppInstall, en...
  function isOpenclawHTTPSVersion (line 771) | func isOpenclawHTTPSVersion(version string) bool {
  function shouldMigrateOpenclawHTTPSUpgrade (line 782) | func shouldMigrateOpenclawHTTPSUpgrade(install *model.AppInstall, fromVe...
  function migrateOpenclawHTTPSUpgrade (line 789) | func migrateOpenclawHTTPSUpgrade(install *model.AppInstall, fromVersion,...
  function migrateOpenclawHTTPSUpgradeWithSystemIP (line 794) | func migrateOpenclawHTTPSUpgradeWithSystemIP(install *model.AppInstall, ...
  function migrateOpenclawInstallPorts (line 828) | func migrateOpenclawInstallPorts(install *model.AppInstall) {
  function migrateOpenclawInstallEnv (line 840) | func migrateOpenclawInstallEnv(install *model.AppInstall, allowedOrigins...
  function syncOpenclawAllowedOriginEnv (line 865) | func syncOpenclawAllowedOriginEnv(install *model.AppInstall, allowedOrig...
  function firstAllowedOrigin (line 888) | func firstAllowedOrigin(allowedOrigins []string) string {
  function buildOpenclawAllowedOrigin (line 898) | func buildOpenclawAllowedOrigin(host string, port int) (string, error) {
  function checkAgentUpgradable (line 909) | func checkAgentUpgradable(install model.AppInstall) bool {
  type openclawConfig (line 942) | type openclawConfig struct
  type toolsConfig (line 951) | type toolsConfig struct
  type toolSessionsConfig (line 956) | type toolSessionsConfig struct
  type updateConfig (line 960) | type updateConfig struct
  type gatewayConfig (line 964) | type gatewayConfig struct
  type gatewayControlUi (line 973) | type gatewayControlUi struct
  type gatewayAuth (line 978) | type gatewayAuth struct
  type agentsConfig (line 983) | type agentsConfig struct
  type agentDefaults (line 987) | type agentDefaults struct
  type modelRef (line 993) | type modelRef struct
  type modelsConfig (line 997) | type modelsConfig struct
  type modelProvider (line 1002) | type modelProvider struct
  type modelEntry (line 1009) | type modelEntry struct
  type modelCost (line 1019) | type modelCost struct
  type browserConfig (line 1026) | type browserConfig struct
  function writeOpenclawConfig (line 1034) | func writeOpenclawConfig(confDir string, account *model.AgentAccount, mo...
  function prepareOpenclawInstallFiles (line 1180) | func prepareOpenclawInstallFiles(appInstall *model.AppInstall, account *...
  function buildOpenclawModelsFromAccount (line 1192) | func buildOpenclawModelsFromAccount(account *model.AgentAccount, selecte...
  function buildOpenclawCatalogModel (line 1247) | func buildOpenclawCatalogModel(account *model.AgentAccount, model dto.Ag...
  type openclawAccountModelRuntime (line 1268) | type openclawAccountModelRuntime struct
  function buildOpenclawAccountModelRuntime (line 1276) | func buildOpenclawAccountModelRuntime(account *model.AgentAccount, model...
  function resolveOpenclawAccountModelRuntimeByID (line 1296) | func resolveOpenclawAccountModelRuntimeByID(account *model.AgentAccount,...
  function inferOpenclawCatalogModel (line 1308) | func inferOpenclawCatalogModel(account *model.AgentAccount, modelID stri...
  function resolveAccountBaseURL (line 1335) | func resolveAccountBaseURL(account *model.AgentAccount) string {
  function buildInitialAgentAccountModels (line 1345) | func buildInitialAgentAccountModels(account *model.AgentAccount, request...
  function compactPersistedAgentAccountModelSortOrder (line 1384) | func compactPersistedAgentAccountModelSortOrder(accountID uint) error {
  function loadAgentAccountModels (line 1402) | func loadAgentAccountModels(account *model.AgentAccount) ([]dto.AgentAcc...
  function MergeCatalogAgentAccountModelsForMigration (line 1409) | func MergeCatalogAgentAccountModelsForMigration(account *model.AgentAcco...
  function listPersistedAgentAccountModels (line 1448) | func listPersistedAgentAccountModels(accountID uint) ([]dto.AgentAccount...
  function replacePersistedAgentAccountModelsWithTx (line 1475) | func replacePersistedAgentAccountModelsWithTx(tx *gorm.DB, accountID uin...
  function replacePersistedAgentAccountModels (line 1501) | func replacePersistedAgentAccountModels(accountID uint, models []dto.Age...
  function normalizeAgentAccountModels (line 1507) | func normalizeAgentAccountModels(account *model.AgentAccount, models []d...
  function normalizeAgentAccountModel (line 1556) | func normalizeAgentAccountModel(account *model.AgentAccount, model dto.A...
  function normalizeAgentAccountModelID (line 1595) | func normalizeAgentAccountModelID(provider, primaryModel, requestedID st...
  function buildLegacyAgentAccountModels (line 1654) | func buildLegacyAgentAccountModels(account *model.AgentAccount) []dto.Ag...
  function sanitizeAgentAccountModelInputs (line 1687) | func sanitizeAgentAccountModelInputs(values []string) []string {
  function requiresInitialAgentAccountModels (line 1707) | func requiresInitialAgentAccountModels(provider string) bool {
  function normalizeComparableProviderModelID (line 1716) | func normalizeComparableProviderModelID(provider, modelID string) string {
  function sameProviderModelID (line 1738) | func sameProviderModelID(provider, left, right string) bool {
  function findAgentAccountModelForProvider (line 1749) | func findAgentAccountModelForProvider(provider string, models []dto.Agen...
  function requireAgentAccountModelForProvider (line 1758) | func requireAgentAccountModelForProvider(provider string, models []dto.A...
  function ensureAccountModelsNotBound (line 1766) | func ensureAccountModelsNotBound(account *model.AgentAccount, models []d...
  function resolveServerTimezone (line 1785) | func resolveServerTimezone() string {
  function extractStringList (line 1796) | func extractStringList(value interface{}) []string {
  function extractGatewayToken (line 1823) | func extractGatewayToken(conf map[string]interface{}) string {
  function ensureChildMap (line 1836) | func ensureChildMap(parent map[string]interface{}, key string) map[strin...
  function structToMap (line 1845) | func structToMap(value interface{}) (map[string]interface{}, error) {
  function mapToModelsConfig (line 1857) | func mapToModelsConfig(value map[string]interface{}) (*modelsConfig, err...
  function providerEnvKey (line 1869) | func providerEnvKey(provider string) string {
  type providerDefinition (line 1873) | type providerDefinition struct
  function providerDefinitions (line 1880) | func providerDefinitions() map[string]providerDefinition {
  function providerDefaultBaseURL (line 1904) | func providerDefaultBaseURL(provider string) (string, bool) {
  function fixedProviderBaseURL (line 1908) | func fixedProviderBaseURL(provider string) (string, bool) {
  function providerDisplayName (line 1919) | func providerDisplayName(provider string) string {
  function readInstallEnv (line 1923) | func readInstallEnv(envStr string) map[string]interface{} {
  function maskKey (line 1934) | func maskKey(value string) string {
  function toInt (line 1942) | func toInt(value interface{}) int {
  function normalizeCustomModel (line 1961) | func normalizeCustomModel(modelName string) string {
  function normalizeAgentType (line 1972) | func normalizeAgentType(agentType string) string {
  function modelMatchesProvider (line 1980) | func modelMatchesProvider(provider, modelName string) bool {
  function runtimeProviderModelPrefix (line 1990) | func runtimeProviderModelPrefix(provider string) string {
  function poolModelPrefix (line 2003) | func poolModelPrefix(provider string) string {
  function supportedProviderModelPrefixes (line 2014) | func supportedProviderModelPrefixes(provider string) []string {
  function normalizeAPIType (line 2032) | func normalizeAPIType(apiType string) string {
  function isSupportedAPIType (line 2040) | func isSupportedAPIType(apiType string) bool {
  function isSupportedOllamaAPIType (line 2049) | func isSupportedOllamaAPIType(apiType string) bool {
  function resolveRuntimeParams (line 2058) | func resolveRuntimeParams(provider, apiType string, maxTokens, contextWi...
  function generateToken (line 2098) | func generateToken() string {
  function asyncReportAIProviderInstall (line 2106) | func asyncReportAIProviderInstall(provider string) {

FILE: agent/app/service/ai.go
  type AIToolService (line 25) | type AIToolService struct
    method Search (line 44) | func (u *AIToolService) Search(req dto.SearchWithPage) (int64, []dto.O...
    method LoadDetail (line 68) | func (u *AIToolService) LoadDetail(name string) (string, error) {
    method Create (line 83) | func (u *AIToolService) Create(req dto.OllamaModelName) error {
    method Close (line 129) | func (u *AIToolService) Close(name string) error {
    method Recreate (line 143) | func (u *AIToolService) Recreate(req dto.OllamaModelName) error {
    method Delete (line 184) | func (u *AIToolService) Delete(req dto.ForceDelete) error {
    method Sync (line 206) | func (u *AIToolService) Sync() ([]dto.OllamaModelDropList, error) {
    method BindDomain (line 254) | func (u *AIToolService) BindDomain(req dto.OllamaBindDomain) error {
    method GetBindDomain (line 301) | func (u *AIToolService) GetBindDomain(req dto.OllamaBindDomainReq) (*d...
    method UpdateBindDomain (line 323) | func (u *AIToolService) UpdateBindDomain(req dto.OllamaBindDomain) err...
  type IAIToolService (line 27) | type IAIToolService interface
  function NewIAIToolService (line 40) | func NewIAIToolService() IAIToolService {
  function LoadContainerName (line 371) | func LoadContainerName() (string, error) {
  function loadModelSize (line 382) | func loadModelSize(name string, containerName string) (string, error) {

FILE: agent/app/service/alert.go
  type AlertService (line 25) | type AlertService struct
    method PageAlert (line 53) | func (a AlertService) PageAlert(search dto.AlertSearch) (int64, []dto....
    method GetAlerts (line 92) | func (a AlertService) GetAlerts() ([]dto.AlertDTO, error) {
    method CreateAlert (line 123) | func (a AlertService) CreateAlert(create dto.AlertCreate) error {
    method UpdateAlert (line 159) | func (a AlertService) UpdateAlert(req dto.AlertUpdate) error {
    method DeleteAlert (line 180) | func (a AlertService) DeleteAlert(id uint) error {
    method GetAlert (line 201) | func (a AlertService) GetAlert(id uint) (dto.AlertDTO, error) {
    method UpdateStatus (line 211) | func (a AlertService) UpdateStatus(id uint, status string) error {
    method GetDisks (line 232) | func (a AlertService) GetDisks() ([]dto.DiskDTO, error) {
    method PageAlertLogs (line 336) | func (a AlertService) PageAlertLogs(search dto.AlertLogSearch) (int64,...
    method parseAlertLog (line 365) | func (a AlertService) parseAlertLog(item model.AlertLog) (dto.AlertLog...
    method CleanAlertLogs (line 397) | func (a AlertService) CleanAlertLogs() error {
    method GetClams (line 401) | func (a AlertService) GetClams() ([]dto.ClamDTO, error) {
    method GetCronJobs (line 418) | func (a AlertService) GetCronJobs(req dto.CronJobReq) ([]dto.CronJobDT...
    method GetAlertConfig (line 444) | func (a AlertService) GetAlertConfig() ([]model.AlertConfig, error) {
    method UpdateAlertConfig (line 454) | func (a AlertService) UpdateAlertConfig(req dto.AlertConfigUpdate) err...
    method DeleteAlertConfig (line 478) | func (a AlertService) DeleteAlertConfig(id uint) error {
    method TestAlertConfig (line 482) | func (a AlertService) TestAlertConfig(req dto.AlertConfigTest) (bool, ...
    method ExternalUpdateAlert (line 511) | func (a AlertService) ExternalUpdateAlert(updateAlert dto.AlertCreate)...
  type IAlertService (line 27) | type IAlertService interface
  function NewIAlertService (line 49) | func NewIAlertService() IAlertService {
  function executeDiskCommand (line 309) | func executeDiskCommand() (string, error) {
  function shouldExclude (line 319) | func shouldExclude(fields []string, mountPoint string, excludes map[stri...
  function unmarshalAlertInfo (line 390) | func unmarshalAlertInfo(data string, v interface{}) error {

FILE: agent/app/service/alert_helper.go
  constant ResourceAlertInterval (line 30) | ResourceAlertInterval = 30
  constant CheckIntervalSec (line 31) | CheckIntervalSec      = 3
  constant LoadCheckIntervalMin (line 32) | LoadCheckIntervalMin  = 5
  type AlertTaskHelper (line 35) | type AlertTaskHelper struct
    method StartTask (line 59) | func (m *AlertTaskHelper) StartTask() {
    method StopTask (line 68) | func (m *AlertTaskHelper) StopTask() {
    method ResetTask (line 73) | func (m *AlertTaskHelper) ResetTask() {
    method InitTask (line 78) | func (m *AlertTaskHelper) InitTask(alertType string) {
    method getClassifiedAlerts (line 101) | func (m *AlertTaskHelper) getClassifiedAlerts() (baseAlerts, resourceA...
  type IAlertTaskHelper (line 40) | type IAlertTaskHelper interface
  function NewIAlertTaskHelper (line 53) | func NewIAlertTaskHelper() IAlertTaskHelper {
  function resetAlertState (line 88) | func resetAlertState(alertType string) {
  function handleBaseAlerts (line 113) | func handleBaseAlerts(baseAlerts []dto.AlertDTO) {
  function handleResourceAlerts (line 132) | func handleResourceAlerts(resourceAlerts []dto.AlertDTO) {
  function stopBaseJob (line 150) | func stopBaseJob() {
  function stopResourceJob (line 158) | func stopResourceJob() {
  function baseTask (line 166) | func baseTask(baseAlert []dto.AlertDTO) {
  function resourceTask (line 188) | func resourceTask(resourceAlert []dto.AlertDTO) {
  function loadSSLInfo (line 220) | func loadSSLInfo(alert dto.AlertDTO) {
  function loadWebsiteInfo (line 258) | func loadWebsiteInfo(alert dto.AlertDTO) {
  function loadPanelPwd (line 297) | func loadPanelPwd(alert dto.AlertDTO) {
  function loadPanelUpdate (line 318) | func loadPanelUpdate(alert dto.AlertDTO) {
  function loadCPUUsage (line 336) | func loadCPUUsage(alert dto.AlertDTO) {
  function loadMemUsage (line 363) | func loadMemUsage(alert dto.AlertDTO) {
  function loadLoadInfo (line 389) | func loadLoadInfo(alert dto.AlertDTO) {
  function loadDiskUsage (line 419) | func loadDiskUsage(alert dto.AlertDTO) {
  function loadPanelLogin (line 434) | func loadPanelLogin(alert dto.AlertDTO) {
  function loadSSHLogin (line 484) | func loadSSHLogin(alert dto.AlertDTO) {
  function loadNodeException (line 527) | func loadNodeException(alert dto.AlertDTO) {
  function loadLicenseException (line 556) | func loadLicenseException(alert dto.AlertDTO) {
  function sendAlerts (line 584) | func sendAlerts(alert dto.AlertDTO, alertType, quota, quotaType string, ...
  function getRepoOptionsByProject (line 660) | func getRepoOptionsByProject(project string) []repo.DBOption {
  function serializeAndSortProjects (line 669) | func serializeAndSortProjects(projectMap map[uint][]time.Time) string {
  function calculateSSLExpiryDays (line 687) | func calculateSSLExpiryDays(sslList []model.WebsiteSSL, cycle uint) (map...
  function calculateWebsiteExpiryDays (line 704) | func calculateWebsiteExpiryDays(websites []model.Website, cycle uint) (m...
  function getSettingValue (line 721) | func getSettingValue(key string) (string, error) {
  function getValidVersion (line 730) | func getValidVersion(info *dto.UpgradeInfo) string {
  function shouldSendResourceAlert (line 741) | func shouldSendResourceAlert(alert dto.AlertDTO, currentUsage float64, u...
  function isAlertDue (line 760) | func isAlertDue(lastAlertTime time.Time) bool {
  function sendResourceAlert (line 767) | func sendResourceAlert(alert dto.AlertDTO, value float64) {
  function getModuleName (line 775) | func getModuleName(alertType string) string {
  function canSendAlertToday (line 789) | func canSendAlertToday(alertType, quotaType string, sendCount uint, meth...
  function average (line 802) | func average(arr []float64) float64 {
  function createAlertBaseParams (line 810) | func createAlertBaseParams(project, cycle string) []dto.Param {
  function createAlertPwdParams (line 825) | func createAlertPwdParams(cycle string) []dto.Param {
  function createAlertAvgParams (line 835) | func createAlertAvgParams(cycle, module, count string) []dto.Param {
  function createAlertDiskParams (line 855) | func createAlertDiskParams(project, count string) []dto.Param {
  function processAllDisks (line 870) | func processAllDisks(alert dto.AlertDTO) error {
  function processSingleDisk (line 892) | func processSingleDisk(alert dto.AlertDTO) error {
  function checkAndCreateDiskAlert (line 901) | func checkAndCreateDiskAlert(alert dto.AlertDTO, path string) error {
  function calculateUsedTotal (line 922) | func calculateUsedTotal(cycle uint, usageStat *disk.UsageStat) (float64,...
  function calculateDaysDifference (line 929) | func calculateDaysDifference(expirationTime time.Time) int {
  function calculateMinutesDifference (line 941) | func calculateMinutesDifference(newDate time.Time) int {

FILE: agent/app/service/alert_sender.go
  type AlertSender (line 12) | type AlertSender struct
    method Send (line 24) | func (s *AlertSender) Send(quota string, params []dto.Param) {
    method ResourceSend (line 39) | func (s *AlertSender) ResourceSend(quota string, params []dto.Param) {
    method sendSMS (line 54) | func (s *AlertSender) sendSMS(quota string, params []dto.Param) {
    method sendEmail (line 79) | func (s *AlertSender) sendEmail(quota string, params []dto.Param) {
    method sendWebhook (line 104) | func (s *AlertSender) sendWebhook(quota string, params []dto.Param, me...
    method sendResourceSMS (line 126) | func (s *AlertSender) sendResourceSMS(quota string, params []dto.Param) {
    method sendResourceEmail (line 150) | func (s *AlertSender) sendResourceEmail(quota string, params []dto.Par...
    method sendResourceWebhook (line 174) | func (s *AlertSender) sendResourceWebhook(quota string, params []dto.P...
    method canSendAlert (line 195) | func (s *AlertSender) canSendAlert(method string) (uint, bool) {
    method canResourceSendAlert (line 208) | func (s *AlertSender) canResourceSendAlert(method string) (uint, bool) {
  function NewAlertSender (line 17) | func NewAlertSender(alert dto.AlertDTO, quotaType string) *AlertSender {

FILE: agent/app/service/app.go
  type AppService (line 43) | type AppService struct
    method PageApp (line 68) | func (a AppService) PageApp(ctx *gin.Context, req request.AppSearch) (...
    method GetAppTags (line 173) | func (a AppService) GetAppTags(ctx *gin.Context) ([]response.TagDTO, e...
    method GetApp (line 195) | func (a AppService) GetApp(ctx *gin.Context, key string) (*response.Ap...
    method GetAppDetailByKey (line 219) | func (a AppService) GetAppDetailByKey(appKey, version string) (respons...
    method GetAppDetail (line 233) | func (a AppService) GetAppDetail(appID uint, version, appType string) ...
    method GetAppDetailByID (line 330) | func (a AppService) GetAppDetailByID(id uint) (*response.AppDetailDTO,...
    method Install (line 346) | func (a AppService) Install(req request.AppInstallCreate, executeScrip...
    method installWithHooks (line 350) | func (a AppService) installWithHooks(req request.AppInstallCreate, exe...
    method SyncAppListFromLocal (line 595) | func (a AppService) SyncAppListFromLocal(TaskID string) {
    method GetAppUpdate (line 827) | func (a AppService) GetAppUpdate() (*response.AppUpdateRes, error) {
    method SyncAppListFromRemote (line 967) | func (a AppService) SyncAppListFromRemote(taskID string) (err error) {
    method GetAppIcon (line 1022) | func (a AppService) GetAppIcon(key string) ([]byte, string, string, er...
  type IAppService (line 46) | type IAppService interface
  type appInstallHooks (line 60) | type appInstallHooks struct
  function NewIAppService (line 64) | func NewIAppService() IAppService {
  function getAppFromRepo (line 889) | func getAppFromRepo(downloadPath string) error {
  function getAppList (line 907) | func getAppList() (*dto.AppList, error) {
  function deleteCustomApp (line 931) | func deleteCustomApp() {

FILE: agent/app/service/app_ingore_upgrade.go
  type AppIgnoreUpgradeService (line 12) | type AppIgnoreUpgradeService struct
    method List (line 25) | func (a AppIgnoreUpgradeService) List() ([]response.AppIgnoreUpgradeDT...
    method CreateAppIgnore (line 57) | func (a AppIgnoreUpgradeService) CreateAppIgnore(req request.AppIgnore...
    method Delete (line 74) | func (a AppIgnoreUpgradeService) Delete(req request.ReqWithID) error {
  type IAppIgnoreUpgradeService (line 15) | type IAppIgnoreUpgradeService interface
  function NewIAppIgnoreUpgradeService (line 21) | func NewIAppIgnoreUpgradeService() IAppIgnoreUpgradeService {

FILE: agent/app/service/app_install.go
  type AppInstallService (line 38) | type AppInstallService struct
    method GetInstallList (line 67) | func (a *AppInstallService) GetInstallList() ([]dto.AppInstallInfo, er...
    method Page (line 79) | func (a *AppInstallService) Page(req request.AppInstalledSearch) (int6...
    method CheckExist (line 133) | func (a *AppInstallService) CheckExist(req request.AppInstalledInfo) (...
    method LoadPort (line 177) | func (a *AppInstallService) LoadPort(req dto.OperationWithNameAndType)...
    method LoadConnInfo (line 185) | func (a *AppInstallService) LoadConnInfo(req dto.OperationWithNameAndT...
    method SearchForWebsite (line 200) | func (a *AppInstallService) SearchForWebsite(req request.AppInstalledS...
    method Operate (line 246) | func (a *AppInstallService) Operate(req request.AppInstalledOperate) e...
    method UpdateAppConfig (line 314) | func (a *AppInstallService) UpdateAppConfig(req request.AppConfigUpdat...
    method UpdateSort (line 326) | func (a *AppInstallService) UpdateSort(req request.AppInstallSort) err...
    method Update (line 335) | func (a *AppInstallService) Update(req request.AppInstalledUpdate) err...
    method SyncAll (line 471) | func (a *AppInstallService) SyncAll(systemInit bool) error {
    method GetServices (line 501) | func (a *AppInstallService) GetServices(key string) ([]response.AppSer...
    method GetUpdateVersions (line 570) | func (a *AppInstallService) GetUpdateVersions(req request.AppUpdateVer...
    method ChangeAppPort (line 630) | func (a *AppInstallService) ChangeAppPort(req request.PortUpdate) error {
    method DeleteCheck (line 658) | func (a *AppInstallService) DeleteCheck(installID uint) ([]dto.AppReso...
    method GetDefaultConfigByKey (line 686) | func (a *AppInstallService) GetDefaultConfigByKey(key, name string) (s...
    method GetParams (line 717) | func (a *AppInstallService) GetParams(id uint) (*response.AppConfig, e...
    method GetAppInstallInfo (line 948) | func (a *AppInstallService) GetAppInstallInfo(installID uint) (*respon...
  type IAppInstallService (line 41) | type IAppInstallService interface
  function NewIAppInstalledService (line 63) | func NewIAppInstalledService() IAppInstallService {
  function syncAppInstallStatus (line 829) | func syncAppInstallStatus(appInstall *model.AppInstall, force bool) error {
  function upda
Copy disabled (too large) Download .json
Condensed preview — 1456 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,531K chars).
[
  {
    "path": ".gitattributes",
    "chars": 135,
    "preview": "*.ts linguist-language=Go\n*.js linguist-language=Go\n*.css linguist-language=Go\n*.scss linguist-language=Go\n*.html lingui"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1_bug_report.yml",
    "chars": 1599,
    "preview": "name: 'Bug Report'\ndescription: 'Report an Bug'\ntitle: '[Bug] '\nassignees: wanghe-fit2cloud\nbody:\n  - type: markdown\n   "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2_feature_request.yml",
    "chars": 925,
    "preview": "name: 'Feature Request'\ndescription: 'Suggest an idea'\ntitle: '[Feature] '\nassignees: wanghe-fit2cloud\nbody:\n  - type: m"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 235,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Questions & Discussions\n    url: https://github.com/1Panel-dev/1Pan"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 413,
    "preview": "#### What this PR does / why we need it?\n\n#### Summary of your change\n\n#### Please indicate you've done the following:\n\n"
  },
  {
    "path": ".github/workflows/add-labels-for-pr.yml",
    "chars": 423,
    "preview": "\nname: General PR Handling for 1Panel\non: pull_request\npermissions:\n  pull-requests: write\njobs:\n  generic_handler:\n    "
  },
  {
    "path": ".github/workflows/build-and-publish.yml",
    "chars": 1957,
    "preview": "name: Build And Publish (OSS + R2)\n\non:\n  push:\n    tags:\n      - 'v*'\n\njobs:\n  create-release:\n    runs-on: ubuntu-late"
  },
  {
    "path": ".github/workflows/issue-translator.yml",
    "chars": 312,
    "preview": "name: Issue Translator\non: \n  issue_comment: \n    types: [created]\n  issues: \n    types: [opened]\njobs:\n  build:\n    run"
  },
  {
    "path": ".github/workflows/llm-code-review.yml",
    "chars": 973,
    "preview": "name: LLM Code Review\npermissions:\n  contents: read\n  pull-requests: write\non:\n  pull_request:\n    types: [opened, reope"
  },
  {
    "path": ".github/workflows/sonarcloud-scan.yml",
    "chars": 521,
    "preview": "name: SonarCloud Scan\non:\n  push:\n    branches:\n      - dev\n  pull_request:\n    types: [opened, synchronize, reopened]\nj"
  },
  {
    "path": ".github/workflows/sync2gitee.yml",
    "chars": 503,
    "preview": "name: Synchronize to Gitee\non: [push]\njobs:\n  repo-sync:\n    if: github.repository == '1Panel-dev/1Panel'\n    runs-on: u"
  },
  {
    "path": ".github/workflows/tyops-check.yml",
    "chars": 251,
    "preview": "name: Typos Check\non: pull_request\njobs:\n  run:\n    name: Spell Check with Typos\n    runs-on: ubuntu-latest\n    steps:\n "
  },
  {
    "path": ".gitignore",
    "chars": 1212,
    "preview": "# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\nbuild/1panel-agent\nbuild/1panel-core\n\n# Mac\n.DS_Stor"
  },
  {
    "path": ".goreleaser.yaml",
    "chars": 1494,
    "preview": "# yaml-language-server: $schema=https://goreleaser.com/static/schema.json\n# vim: set ts=2 sw=2 tw=0 fo=jcroql\nversion: 2"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5202,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1958,
    "preview": "# Contributing\n\nAs a contributor, you should agree that:\n\n- The producer can adjust the open-source agreement to be more"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "Makefile",
    "chars": 1474,
    "preview": "GOCMD=go\nGOBUILD=$(GOCMD) build\nGOCLEAN=$(GOCMD) clean\nGOARCH=$(shell go env GOARCH)\nGOOS=$(shell go env GOOS )\n\nBASE_PA"
  },
  {
    "path": "OWNERS",
    "chars": 119,
    "preview": "reviewers:\n- wanghe-fit2cloud\n- zhengkunwang223\n- ssongliu\n\napprovers:\n- wanghe-fit2cloud\n- zhengkunwang223\n- ssongliu\n"
  },
  {
    "path": "README.md",
    "chars": 5763,
    "preview": "<p align=\"center\"><a href=\"https://1panel.pro\"><img src=\"https://resource.1panel.pro/img/1panel-logo.png\" alt=\"1Panel\" w"
  },
  {
    "path": "SECURITY.md",
    "chars": 615,
    "preview": "# Security policy\n\n## Supported versions\n\n| Version | Supported          |\n| ------- | ------------------ |\n| v1.x     |"
  },
  {
    "path": "agent/app/api/v2/agents.go",
    "chars": 18720,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/ai.go",
    "chars": 6807,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/alert.go",
    "chars": 4364,
    "preview": "package v2\n\nimport (\n\t\"errors\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/ag"
  },
  {
    "path": "agent/app/api/v2/app.go",
    "chars": 6676,
    "preview": "package v2\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel"
  },
  {
    "path": "agent/app/api/v2/app_ignore_upgrade.go",
    "chars": 1871,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/app_install.go",
    "chars": 10626,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto/request\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api"
  },
  {
    "path": "agent/app/api/v2/backup.go",
    "chars": 15478,
    "preview": "package v2\n\nimport (\n\t\"fmt\"\n\t\"path\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Pa"
  },
  {
    "path": "agent/app/api/v2/clam.go",
    "chars": 7618,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/compose_template.go",
    "chars": 4398,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/container.go",
    "chars": 26093,
    "preview": "package v2\n\nimport (\n\t\"net/http\"\n\t\"net/url\"\n\t\"path\"\n\t\"strconv\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n"
  },
  {
    "path": "agent/app/api/v2/cronjob.go",
    "chars": 10138,
    "preview": "package v2\n\nimport (\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.co"
  },
  {
    "path": "agent/app/api/v2/dashboard.go",
    "chars": 6135,
    "preview": "package v2\n\nimport (\n\t\"errors\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/a"
  },
  {
    "path": "agent/app/api/v2/database.go",
    "chars": 6299,
    "preview": "package v2\n\nimport (\n\t\"encoding/base64\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev"
  },
  {
    "path": "agent/app/api/v2/database_common.go",
    "chars": 2054,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/database_mysql.go",
    "chars": 10029,
    "preview": "package v2\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com"
  },
  {
    "path": "agent/app/api/v2/database_postgresql.go",
    "chars": 7153,
    "preview": "package v2\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com"
  },
  {
    "path": "agent/app/api/v2/database_redis.go",
    "chars": 4524,
    "preview": "package v2\n\nimport (\n\t\"encoding/base64\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev"
  },
  {
    "path": "agent/app/api/v2/device.go",
    "chars": 6396,
    "preview": "package v2\n\nimport (\n\t\"encoding/base64\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev"
  },
  {
    "path": "agent/app/api/v2/disk.go",
    "chars": 3213,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/docker.go",
    "chars": 4852,
    "preview": "package v2\n\nimport (\n\t\"os\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent"
  },
  {
    "path": "agent/app/api/v2/entry.go",
    "chars": 2817,
    "preview": "package v2\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/service\"\n\ntype ApiGroup struct {\n\tBaseApi\n}\n\nvar ApiGroupApp "
  },
  {
    "path": "agent/app/api/v2/fail2ban.go",
    "chars": 3868,
    "preview": "package v2\n\nimport (\n\t\"os\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent"
  },
  {
    "path": "agent/app/api/v2/favorite.go",
    "chars": 2203,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/file.go",
    "chars": 27636,
    "preview": "package v2\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"str"
  },
  {
    "path": "agent/app/api/v2/firewall.go",
    "chars": 9188,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/ftp.go",
    "chars": 5133,
    "preview": "package v2\n\nimport (\n\t\"encoding/base64\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev"
  },
  {
    "path": "agent/app/api/v2/group.go",
    "chars": 2768,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/health.go",
    "chars": 177,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/gin-gonic/gin\"\n)\n\nfunc (b *Bas"
  },
  {
    "path": "agent/app/api/v2/helper/helper.go",
    "chars": 3745,
    "preview": "package helper\n\nimport (\n\t\"compress/gzip\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\t\"sync\"\n\n"
  },
  {
    "path": "agent/app/api/v2/host.go",
    "chars": 3895,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/host_tool.go",
    "chars": 4643,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/image.go",
    "chars": 6408,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/image_repo.go",
    "chars": 3902,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/logs.go",
    "chars": 463,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/gin-gonic/gin\"\n)\n\n// @Tags Log"
  },
  {
    "path": "agent/app/api/v2/mcp_server.go",
    "chars": 4142,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/monitor.go",
    "chars": 3509,
    "preview": "package v2\n\nimport (\n\t\"sort\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/age"
  },
  {
    "path": "agent/app/api/v2/nginx.go",
    "chars": 5537,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/php_extensions.go",
    "chars": 2685,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/process.go",
    "chars": 1882,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/recycle_bin.go",
    "chars": 2310,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/runtime.go",
    "chars": 15603,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/setting.go",
    "chars": 6042,
    "preview": "package v2\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1"
  },
  {
    "path": "agent/app/api/v2/snapshot.go",
    "chars": 6592,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/ssh.go",
    "chars": 7728,
    "preview": "package v2\n\nimport (\n\t\"encoding/base64\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev"
  },
  {
    "path": "agent/app/api/v2/system.go",
    "chars": 667,
    "preview": "package v2\n\nimport (\n\t\"errors\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/gin-gonic/gin\"\n)\n\n//"
  },
  {
    "path": "agent/app/api/v2/task.go",
    "chars": 1120,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/tensorrt_llm.go",
    "chars": 1543,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/terminal.go",
    "chars": 8156,
    "preview": "package v2\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/1Panel-dev/"
  },
  {
    "path": "agent/app/api/v2/website.go",
    "chars": 39003,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/website_acme_account.go",
    "chars": 3282,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/website_ca.go",
    "chars": 5496,
    "preview": "package v2\n\nimport (\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github"
  },
  {
    "path": "agent/app/api/v2/website_dns_account.go",
    "chars": 3013,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/website_domain.go",
    "chars": 3083,
    "preview": "package v2\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/api/v2/helper\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/dt"
  },
  {
    "path": "agent/app/api/v2/website_ssl.go",
    "chars": 10194,
    "preview": "package v2\n\nimport (\n\t\"io\"\n\t\"mime/multipart\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strconv\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app"
  },
  {
    "path": "agent/app/dto/agents.go",
    "chars": 11815,
    "preview": "package dto\n\nimport \"time\"\n\ntype AgentCreateReq struct {\n\tName           string   `json:\"name\" validate:\"required\"`\n\tApp"
  },
  {
    "path": "agent/app/dto/ai.go",
    "chars": 1193,
    "preview": "package dto\n\nimport \"time\"\n\ntype OllamaModelInfo struct {\n\tID           uint   `json:\"id\"`\n\tName         string `json:\"n"
  },
  {
    "path": "agent/app/dto/alert.go",
    "chars": 9951,
    "preview": "package dto\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"time\"\n)\n\ntype CreateOrUpdateAle"
  },
  {
    "path": "agent/app/dto/app.go",
    "chars": 5579,
    "preview": "package dto\n\nimport (\n\t\"context\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"github.com/1Panel-dev/1Panel/agent/ap"
  },
  {
    "path": "agent/app/dto/backup.go",
    "chars": 4288,
    "preview": "package dto\n\nimport (\n\t\"time\"\n)\n\ntype BackupOperate struct {\n\tID         uint   `json:\"id\"`\n\tName       string `json:\"na"
  },
  {
    "path": "agent/app/dto/clam.go",
    "chars": 3177,
    "preview": "package dto\n\nimport (\n\t\"time\"\n)\n\ntype SearchClamWithPage struct {\n\tPageInfo\n\tInfo    string `json:\"info\"`\n\tOrderBy strin"
  },
  {
    "path": "agent/app/dto/command.go",
    "chars": 1049,
    "preview": "package dto\n\ntype SearchCommandWithPage struct {\n\tPageInfo\n\tOrderBy string `json:\"orderBy\" validate:\"required,oneof=name"
  },
  {
    "path": "agent/app/dto/common_req.go",
    "chars": 1805,
    "preview": "package dto\n\ntype SearchWithPage struct {\n\tPageInfo\n\tInfo string `json:\"info\"`\n}\n\ntype SearchPageWithType struct {\n\tPage"
  },
  {
    "path": "agent/app/dto/common_res.go",
    "chars": 298,
    "preview": "package dto\n\ntype PageResult struct {\n\tTotal int64       `json:\"total\"`\n\tItems interface{} `json:\"items\"`\n}\n\ntype Respon"
  },
  {
    "path": "agent/app/dto/compose_template.go",
    "chars": 694,
    "preview": "package dto\n\nimport \"time\"\n\ntype ComposeTemplateCreate struct {\n\tName        string `json:\"name\" validate:\"required\"`\n\tD"
  },
  {
    "path": "agent/app/dto/container.go",
    "chars": 11558,
    "preview": "package dto\n\nimport (\n\t\"time\"\n)\n\ntype PageContainer struct {\n\tPageInfo\n\tName            string `json:\"name\"`\n\tState     "
  },
  {
    "path": "agent/app/dto/cronjob.go",
    "chars": 6620,
    "preview": "package dto\n\nimport (\n\t\"time\"\n)\n\ntype PageCronjob struct {\n\tPageInfo\n\tInfo     string `json:\"info\"`\n\tGroupIDs []uint `js"
  },
  {
    "path": "agent/app/dto/dashboard.go",
    "chars": 6611,
    "preview": "package dto\n\nimport \"time\"\n\ntype DashboardBase struct {\n\tWebsiteNumber      int `json:\"websiteNumber\"`\n\tAgentNumber     "
  },
  {
    "path": "agent/app/dto/database.go",
    "chars": 12877,
    "preview": "package dto\n\nimport \"time\"\n\n// common\ntype DBConfUpdateByFile struct {\n\tType     string `json:\"type\" validate:\"required,"
  },
  {
    "path": "agent/app/dto/database_postgresql.go",
    "chars": 2809,
    "preview": "package dto\n\nimport \"time\"\n\ntype PostgresqlDBSearch struct {\n\tPageInfo\n\tInfo     string `json:\"info\"`\n\tDatabase string `"
  },
  {
    "path": "agent/app/dto/device.go",
    "chars": 1033,
    "preview": "package dto\n\ntype DeviceBaseInfo struct {\n\tDNS       []string     `json:\"dns\"`\n\tHosts     []HostHelper `json:\"hosts\"`\n\tH"
  },
  {
    "path": "agent/app/dto/disk.go",
    "chars": 755,
    "preview": "package dto\n\ntype LsblkDevice struct {\n\tName       string        `json:\"name\"`\n\tSize       string        `json:\"size\"`\n\t"
  },
  {
    "path": "agent/app/dto/docker.go",
    "chars": 1148,
    "preview": "package dto\n\ntype DaemonJsonUpdateByFile struct {\n\tFile string `json:\"file\"`\n}\n\ntype DockerStatus struct {\n\tIsActive boo"
  },
  {
    "path": "agent/app/dto/fail2ban.go",
    "chars": 803,
    "preview": "package dto\n\ntype Fail2BanBaseInfo struct {\n\tIsEnable bool   `json:\"isEnable\"`\n\tIsActive bool   `json:\"isActive\"`\n\tIsExi"
  },
  {
    "path": "agent/app/dto/file.go",
    "chars": 204,
    "preview": "package dto\n\ntype LogFileRes struct {\n\tLines       []string `json:\"lines\"`\n\tIsEndOfFile bool     `json:\"isEndOfFile\"`\n\tT"
  },
  {
    "path": "agent/app/dto/firewall.go",
    "chars": 3725,
    "preview": "package dto\n\ntype FirewallBaseInfo struct {\n\tName       string `json:\"name\"`\n\tIsExist    bool   `json:\"isExist\"`\n\tIsActi"
  },
  {
    "path": "agent/app/dto/ftp.go",
    "chars": 989,
    "preview": "package dto\n\nimport (\n\t\"time\"\n)\n\ntype FtpInfo struct {\n\tID        uint      `json:\"id\"`\n\tCreatedAt time.Time `json:\"crea"
  },
  {
    "path": "agent/app/dto/group.go",
    "chars": 632,
    "preview": "package dto\n\ntype GroupCreate struct {\n\tID   uint   `json:\"id\"`\n\tName string `json:\"name\" validate:\"required\"`\n\tType str"
  },
  {
    "path": "agent/app/dto/host.go",
    "chars": 2003,
    "preview": "package dto\n\nimport \"time\"\n\ntype HostOperate struct {\n\tID               uint   `json:\"id\"`\n\tGroupID          uint   `jso"
  },
  {
    "path": "agent/app/dto/image.go",
    "chars": 1702,
    "preview": "package dto\n\nimport \"time\"\n\ntype PageImage struct {\n\tPageInfo\n\tName    string `json:\"name\"`\n\tOrderBy string `json:\"order"
  },
  {
    "path": "agent/app/dto/image_repo.go",
    "chars": 1149,
    "preview": "package dto\n\nimport \"time\"\n\ntype ImageRepoCreate struct {\n\tName        string `json:\"name\" validate:\"required\"`\n\tDownloa"
  },
  {
    "path": "agent/app/dto/logs.go",
    "chars": 213,
    "preview": "package dto\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n)\n\ntype SearchTaskLogReq struct {\n\tStatus string `"
  },
  {
    "path": "agent/app/dto/monitor.go",
    "chars": 2541,
    "preview": "package dto\n\nimport \"time\"\n\ntype MonitorSearch struct {\n\tParam     string    `json:\"param\" validate:\"required,oneof=all "
  },
  {
    "path": "agent/app/dto/nginx.go",
    "chars": 2409,
    "preview": "package dto\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"github.com/1Panel-dev/1Panel/agent/utils/nginx/c"
  },
  {
    "path": "agent/app/dto/request/app.go",
    "chars": 4628,
    "preview": "package request\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n"
  },
  {
    "path": "agent/app/dto/request/app_ignore_upgrade.go",
    "chars": 222,
    "preview": "package request\n\ntype AppIgnoreUpgradeReq struct {\n\tAppID       uint   `json:\"appID\" validate:\"required\"`\n\tAppDetailID u"
  },
  {
    "path": "agent/app/dto/request/common.go",
    "chars": 84,
    "preview": "package request\n\ntype ReqWithID struct {\n\tID uint `json:\"id\" validate:\"required\"`\n}\n"
  },
  {
    "path": "agent/app/dto/request/disk.go",
    "chars": 704,
    "preview": "package request\n\ntype DiskPartitionRequest struct {\n\tDevice     string `json:\"device\" validate:\"required\"`\n\tFilesystem s"
  },
  {
    "path": "agent/app/dto/request/favorite.go",
    "chars": 168,
    "preview": "package request\n\ntype FavoriteCreate struct {\n\tPath string `json:\"path\" validate:\"required\"`\n}\n\ntype FavoriteDelete stru"
  },
  {
    "path": "agent/app/dto/request/file.go",
    "chars": 4874,
    "preview": "package request\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\t\"github.com/1Panel-dev/1Panel/agent/utils/files"
  },
  {
    "path": "agent/app/dto/request/host_tool.go",
    "chars": 1345,
    "preview": "package request\n\ntype HostToolReq struct {\n\tType    string `json:\"type\" validate:\"required,oneof=supervisord\"`\n\tOperate "
  },
  {
    "path": "agent/app/dto/request/mcp_server.go",
    "chars": 1539,
    "preview": "package request\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\ntype McpServerSearch struct {\n\tdto.PageInfo\n\tName "
  },
  {
    "path": "agent/app/dto/request/nginx.go",
    "chars": 4554,
    "preview": "package request\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\ntype NginxConfigFileUpdate struct {\n\tContent strin"
  },
  {
    "path": "agent/app/dto/request/php_extensions.go",
    "chars": 517,
    "preview": "package request\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\ntype PHPExtensionsSearch struct {\n\tdto.PageInfo\n\tA"
  },
  {
    "path": "agent/app/dto/request/process.go",
    "chars": 89,
    "preview": "package request\n\ntype ProcessReq struct {\n\tPID int32 `json:\"PID\"  validate:\"required\"`\n}\n"
  },
  {
    "path": "agent/app/dto/request/recycle_bin.go",
    "chars": 268,
    "preview": "package request\n\ntype RecycleBinCreate struct {\n\tSourcePath string `json:\"sourcePath\" validate:\"required\"`\n}\n\ntype Recyc"
  },
  {
    "path": "agent/app/dto/request/runtime.go",
    "chars": 3999,
    "preview": "package request\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto\"\n)\n\ntype RuntimeSearch struct {\n\tdto.PageInfo\n\tTy"
  },
  {
    "path": "agent/app/dto/request/task.go",
    "chars": 16,
    "preview": "package request\n"
  },
  {
    "path": "agent/app/dto/request/tensorrt_llm.go",
    "chars": 1121,
    "preview": "package request\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\ntype TensorRTLLMSearch struct {\n\tdto.PageInfo\n\tNam"
  },
  {
    "path": "agent/app/dto/request/website.go",
    "chars": 12269,
    "preview": "package request\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto\"\n)\n\ntype WebsiteSearch struct {\n\tdto.PageInfo\n\tNa"
  },
  {
    "path": "agent/app/dto/request/website_ssl.go",
    "chars": 6002,
    "preview": "package request\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\ntype WebsiteSSLSearch struct {\n\tdto.PageInfo\n\tAcme"
  },
  {
    "path": "agent/app/dto/response/app.go",
    "chars": 5697,
    "preview": "package response\n\nimport (\n\t\"time\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\t\"github.com/1Panel-dev/1Panel/agent/a"
  },
  {
    "path": "agent/app/dto/response/app_ignore_upgrade.go",
    "chars": 268,
    "preview": "package response\n\ntype AppIgnoreUpgradeDTO struct {\n\tID          uint   `json:\"ID\"`\n\tAppID       uint   `json:\"appID\"`\n\t"
  },
  {
    "path": "agent/app/dto/response/disk.go",
    "chars": 1120,
    "preview": "package response\n\ntype DiskInfo struct {\n\tDiskBasicInfo\n\tPartitions []DiskBasicInfo `json:\"partitions\"`\n}\n\ntype DiskBasi"
  },
  {
    "path": "agent/app/dto/response/favorite.go",
    "chars": 117,
    "preview": "package response\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/model\"\n\ntype FavoriteDTO struct {\n\tmodel.Favorite\n}\n"
  },
  {
    "path": "agent/app/dto/response/file.go",
    "chars": 1791,
    "preview": "package response\n\nimport (\n\t\"time\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/utils/files\"\n)\n\ntype FileInfo struct {\n\tfiles.F"
  },
  {
    "path": "agent/app/dto/response/host_tool.go",
    "chars": 1257,
    "preview": "package response\n\ntype HostToolRes struct {\n\tType   string      `json:\"type\"`\n\tConfig interface{} `json:\"config\"`\n}\n\ntyp"
  },
  {
    "path": "agent/app/dto/response/mcp_server.go",
    "chars": 680,
    "preview": "package response\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto/request\"\n\t\"github.com/1Panel-dev/1Panel/agent/ap"
  },
  {
    "path": "agent/app/dto/response/nginx.go",
    "chars": 2370,
    "preview": "package response\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\ntype NginxStatus struct {\n\tActive   int `json:\"ac"
  },
  {
    "path": "agent/app/dto/response/php_extensions.go",
    "chars": 127,
    "preview": "package response\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/model\"\n\ntype PHPExtensionsDTO struct {\n\tmodel.PHPExtens"
  },
  {
    "path": "agent/app/dto/response/recycle_bin.go",
    "chars": 365,
    "preview": "package response\n\nimport \"time\"\n\ntype RecycleBinDTO struct {\n\tName       string    `json:\"name\"`\n\tSize       int       `"
  },
  {
    "path": "agent/app/dto/response/runtime.go",
    "chars": 2890,
    "preview": "package response\n\nimport (\n\t\"time\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto/request\"\n\t\"github.com/1Panel-dev/1Panel"
  },
  {
    "path": "agent/app/dto/response/system.go",
    "chars": 174,
    "preview": "package response\n\ntype ComponentInfo struct {\n\tExists  bool   `json:\"exists\"`\n\tVersion string `json:\"version\"`\n\tPath    "
  },
  {
    "path": "agent/app/dto/response/task.go",
    "chars": 17,
    "preview": "package response\n"
  },
  {
    "path": "agent/app/dto/response/tensorrt_llm.go",
    "chars": 660,
    "preview": "package response\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto/request\"\n\t\"github.com/1Panel-dev/1Panel/agent/ap"
  },
  {
    "path": "agent/app/dto/response/website.go",
    "chars": 3914,
    "preview": "package response\n\nimport (\n\t\"time\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/dto\"\n\t\"github.com/1Panel-dev/1Panel/agent/a"
  },
  {
    "path": "agent/app/dto/response/website_ssl.go",
    "chars": 806,
    "preview": "package response\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/model\"\n\ntype WebsiteSSLDTO struct {\n\tmodel.WebsiteSSL\n\t"
  },
  {
    "path": "agent/app/dto/setting.go",
    "chars": 3030,
    "preview": "package dto\n\ntype SettingInfo struct {\n\tDockerSockPath string `json:\"dockerSockPath\"`\n\tSystemVersion  string `json:\"syst"
  },
  {
    "path": "agent/app/dto/snapshot.go",
    "chars": 3655,
    "preview": "package dto\n\nimport \"time\"\n\ntype PageSnapshot struct {\n\tPageInfo\n\tInfo    string `json:\"info\"`\n\tOrderBy string `json:\"or"
  },
  {
    "path": "agent/app/dto/ssh.go",
    "chars": 2233,
    "preview": "package dto\n\nimport \"time\"\n\ntype SSHUpdate struct {\n\tKey      string `json:\"key\" validate:\"required\"`\n\tOldValue string `"
  },
  {
    "path": "agent/app/model/agent.go",
    "chars": 692,
    "preview": "package model\n\ntype Agent struct {\n\tBaseModel\n\tName          string `json:\"name\" gorm:\"not null;unique\"`\n\tAgentType     "
  },
  {
    "path": "agent/app/model/agent_account.go",
    "chars": 457,
    "preview": "package model\n\ntype AgentAccount struct {\n\tBaseModel\n\tProvider       string `json:\"provider\"`\n\tName           string `js"
  },
  {
    "path": "agent/app/model/agent_account_model.go",
    "chars": 515,
    "preview": "package model\n\ntype AgentAccountModel struct {\n\tBaseModel\n\tAccountID     uint   `json:\"accountId\" gorm:\"index\"`\n\tModel  "
  },
  {
    "path": "agent/app/model/ai.go",
    "chars": 210,
    "preview": "package model\n\ntype OllamaModel struct {\n\tBaseModel\n\n\tName    string `json:\"name\"`\n\tSize    string `json:\"size\"`\n\tFrom  "
  },
  {
    "path": "agent/app/model/alert.go",
    "chars": 2185,
    "preview": "package model\n\ntype Alert struct {\n\tBaseModel\n\n\tTitle          string `gorm:\"type:varchar(256);not null\" json:\"title\"`\n\t"
  },
  {
    "path": "agent/app/model/app.go",
    "chars": 2829,
    "preview": "package model\n\nimport (\n\t\"encoding/json\"\n\t\"github.com/gin-gonic/gin\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/1Panel-de"
  },
  {
    "path": "agent/app/model/app_detail.go",
    "chars": 571,
    "preview": "package model\n\ntype AppDetail struct {\n\tBaseModel\n\tAppId               uint   `json:\"appId\" gorm:\"not null\"`\n\tVersion   "
  },
  {
    "path": "agent/app/model/app_ignore_upgrade.go",
    "chars": 170,
    "preview": "package model\n\ntype AppIgnoreUpgrade struct {\n\tBaseModel\n\tAppID       uint   `json:\"appID\"`\n\tAppDetailID uint   `json:\"a"
  },
  {
    "path": "agent/app/model/app_install.go",
    "chars": 1603,
    "preview": "package model\n\nimport (\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/constant\"\n\t\"github.com/1Panel-dev/1Pane"
  },
  {
    "path": "agent/app/model/app_install_resource.go",
    "chars": 332,
    "preview": "package model\n\ntype AppInstallResource struct {\n\tBaseModel\n\tAppInstallId uint   `json:\"appInstallId\" gorm:\"not null;\"`\n\t"
  },
  {
    "path": "agent/app/model/app_launcher.go",
    "chars": 354,
    "preview": "package model\n\ntype AppLauncher struct {\n\tBaseModel\n\tKey string `json:\"key\"`\n}\n\ntype QuickJump struct {\n\tBaseModel\n\tName"
  },
  {
    "path": "agent/app/model/app_tag.go",
    "chars": 135,
    "preview": "package model\n\ntype AppTag struct {\n\tBaseModel\n\tAppId uint `json:\"appId\" gorm:\"not null\"`\n\tTagId uint `json:\"tagId\" gorm"
  },
  {
    "path": "agent/app/model/backup.go",
    "chars": 1054,
    "preview": "package model\n\ntype BackupAccount struct {\n\tBaseModel\n\tName       string `gorm:\"not null;default:''\" json:\"name\"`\n\tType "
  },
  {
    "path": "agent/app/model/base.go",
    "chars": 202,
    "preview": "package model\n\nimport \"time\"\n\ntype BaseModel struct {\n\tID        uint      `gorm:\"primarykey;AUTO_INCREMENT\" json:\"id\"`\n"
  },
  {
    "path": "agent/app/model/clam.go",
    "chars": 947,
    "preview": "package model\n\nimport \"time\"\n\ntype Clam struct {\n\tBaseModel\n\n\tName             string `gorm:\"not null\" json:\"name\"`\n\tPat"
  },
  {
    "path": "agent/app/model/compose_template.go",
    "chars": 285,
    "preview": "package model\n\ntype ComposeTemplate struct {\n\tBaseModel\n\n\tName        string `gorm:\"not null;unique\" json:\"name\"`\n\tDescr"
  },
  {
    "path": "agent/app/model/cronjob.go",
    "chars": 2036,
    "preview": "package model\n\nimport (\n\t\"time\"\n)\n\ntype Cronjob struct {\n\tBaseModel\n\n\tName       string `gorm:\"not null\" json:\"name\"`\n\tT"
  },
  {
    "path": "agent/app/model/database.go",
    "chars": 796,
    "preview": "package model\n\ntype Database struct {\n\tBaseModel\n\tAppInstallID uint   `json:\"appInstallID\"`\n\tName         string `json:\""
  },
  {
    "path": "agent/app/model/database_mysql.go",
    "chars": 559,
    "preview": "package model\n\ntype DatabaseMysql struct {\n\tBaseModel\n\tName        string `json:\"name\" gorm:\"not null\"`\n\tFrom        str"
  },
  {
    "path": "agent/app/model/database_postgresql.go",
    "chars": 540,
    "preview": "package model\n\ntype DatabasePostgresql struct {\n\tBaseModel\n\tName           string `json:\"name\" gorm:\"not null\"`\n\tFrom   "
  },
  {
    "path": "agent/app/model/favorite.go",
    "chars": 234,
    "preview": "package model\n\ntype Favorite struct {\n\tBaseModel\n\tName  string `gorm:\"not null;\" json:\"name\" `\n\tPath  string `gorm:\"not "
  },
  {
    "path": "agent/app/model/firewall.go",
    "chars": 489,
    "preview": "package model\n\ntype Firewall struct {\n\tBaseModel\n\n\tType    string `json:\"type\"`\n\tPort    string `json:\"port\"`    // Depr"
  },
  {
    "path": "agent/app/model/ftp.go",
    "chars": 310,
    "preview": "package model\n\ntype Ftp struct {\n\tBaseModel\n\n\tUser        string `gorm:\"not null\" json:\"user\"`\n\tPassword    string `gorm"
  },
  {
    "path": "agent/app/model/group.go",
    "chars": 149,
    "preview": "package model\n\ntype Group struct {\n\tBaseModel\n\tIsDefault bool   `json:\"isDefault\"`\n\tName      string `json:\"name\"`\n\tType"
  },
  {
    "path": "agent/app/model/host.go",
    "chars": 612,
    "preview": "package model\n\ntype Host struct {\n\tBaseModel\n\n\tGroupID          uint   `gorm:\"not null\" json:\"group_id\"`\n\tName          "
  },
  {
    "path": "agent/app/model/image_repo.go",
    "chars": 358,
    "preview": "package model\n\ntype ImageRepo struct {\n\tBaseModel\n\n\tName        string `gorm:\"not null\" json:\"name\"`\n\tDownloadUrl string"
  },
  {
    "path": "agent/app/model/mcp_server.go",
    "chars": 770,
    "preview": "package model\n\ntype McpServer struct {\n\tBaseModel\n\tName               string `json:\"name\"`\n\tDockerCompose      string `j"
  },
  {
    "path": "agent/app/model/monitor.go",
    "chars": 1201,
    "preview": "package model\n\ntype MonitorBase struct {\n\tBaseModel\n\tCpu         float64     `json:\"cpu\"`\n\tTopCPU      string      `json"
  },
  {
    "path": "agent/app/model/php_extensions.go",
    "chars": 160,
    "preview": "package model\n\ntype PHPExtensions struct {\n\tBaseModel\n\tName       string `json:\"name\" gorm:\"not null\"`\n\tExtensions strin"
  },
  {
    "path": "agent/app/model/runtime.go",
    "chars": 1529,
    "preview": "package model\n\nimport (\n\t\"path\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/global\"\n)\n\ntype Runtime struct {\n\tBaseModel\n\tName "
  },
  {
    "path": "agent/app/model/setting.go",
    "chars": 893,
    "preview": "package model\n\ntype Setting struct {\n\tBaseModel\n\tKey   string `json:\"key\" gorm:\"not null;\"`\n\tValue string `json:\"value\"`"
  },
  {
    "path": "agent/app/model/snapshot.go",
    "chars": 1304,
    "preview": "package model\n\ntype Snapshot struct {\n\tBaseModel\n\tName              string `json:\"name\" gorm:\"not null;unique\"`\n\tSecret "
  },
  {
    "path": "agent/app/model/ssh.go",
    "chars": 332,
    "preview": "package model\n\ntype RootCert struct {\n\tBaseModel\n\tName           string `json:\"name\" gorm:\"not null;\"`\n\tEncryptionMode s"
  },
  {
    "path": "agent/app/model/tag.go",
    "chars": 251,
    "preview": "package model\n\ntype Tag struct {\n\tBaseModel\n\tKey          string `json:\"key\" gorm:\"not null\"`\n\tName         string `json"
  },
  {
    "path": "agent/app/model/task.go",
    "chars": 589,
    "preview": "package model\n\nimport \"time\"\n\ntype Task struct {\n\tID             string    `gorm:\"primarykey;\" json:\"id\"`\n\tName         "
  },
  {
    "path": "agent/app/model/tensorrt_llm.go",
    "chars": 415,
    "preview": "package model\n\ntype TensorRTLLM struct {\n\tBaseModel\n\tName          string `json:\"name\"`\n\tDockerCompose string `json:\"doc"
  },
  {
    "path": "agent/app/model/website.go",
    "chars": 1469,
    "preview": "package model\n\nimport \"time\"\n\ntype Website struct {\n\tBaseModel\n\tProtocol      string    `gorm:\"not null\" json:\"protocol\""
  },
  {
    "path": "agent/app/model/website_acme_account.go",
    "chars": 627,
    "preview": "package model\n\ntype WebsiteAcmeAccount struct {\n\tBaseModel\n\tEmail      string `gorm:\"not null\" json:\"email\"`\n\tURL       "
  },
  {
    "path": "agent/app/model/website_ca.go",
    "chars": 271,
    "preview": "package model\n\ntype WebsiteCA struct {\n\tBaseModel\n\tCSR        string `gorm:\"not null;\" json:\"csr\"`\n\tName       string `g"
  },
  {
    "path": "agent/app/model/website_dns_account.go",
    "chars": 295,
    "preview": "package model\n\ntype WebsiteDnsAccount struct {\n\tBaseModel\n\tName          string `gorm:\"not null\" json:\"name\"`\n\tType     "
  },
  {
    "path": "agent/app/model/website_domain.go",
    "chars": 314,
    "preview": "package model\n\ntype WebsiteDomain struct {\n\tBaseModel\n\tWebsiteID uint   `gorm:\"column:website_id;not null;\" json:\"websit"
  },
  {
    "path": "agent/app/model/website_ssl.go",
    "chars": 2002,
    "preview": "package model\n\nimport (\n\t\"fmt\"\n\t\"path\"\n\t\"time\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/global\"\n)\n\ntype WebsiteSSL struct {"
  },
  {
    "path": "agent/app/provider/catalog.go",
    "chars": 8630,
    "preview": "package provider\n\nimport (\n\t\"strings\"\n)\n\ntype Model struct {\n\tID            string\n\tName          string\n\tContextWindow "
  },
  {
    "path": "agent/app/provider/openclaw.go",
    "chars": 11349,
    "preview": "package provider\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype OpenClawPatch struct {\n\tPrimaryModel string\n\tModels       map[strin"
  },
  {
    "path": "agent/app/provider/verify.go",
    "chars": 4264,
    "preview": "package provider\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/1Panel-dev/1Pan"
  },
  {
    "path": "agent/app/repo/agent.go",
    "chars": 1982,
    "preview": "package repo\n\nimport (\n\t\"context\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n)\n\ntype AgentRepo struct{}\n\ntype IAge"
  },
  {
    "path": "agent/app/repo/agent_account.go",
    "chars": 1630,
    "preview": "package repo\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/model\"\n\ntype AgentAccountRepo struct{}\n\ntype IAgentAccountR"
  },
  {
    "path": "agent/app/repo/agent_account_model.go",
    "chars": 1447,
    "preview": "package repo\n\nimport \"github.com/1Panel-dev/1Panel/agent/app/model\"\n\ntype AgentAccountModelRepo struct{}\n\ntype IAgentAcc"
  },
  {
    "path": "agent/app/repo/ai.go",
    "chars": 1747,
    "preview": "package repo\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"github.com/1Panel-dev/1Panel/agent/global\"\n)\n\nt"
  },
  {
    "path": "agent/app/repo/alert.go",
    "chars": 10466,
    "preview": "package repo\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"github.com/1Panel-dev/1Panel/agent/constant\"\n\t\""
  },
  {
    "path": "agent/app/repo/app.go",
    "chars": 4530,
    "preview": "package repo\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm"
  },
  {
    "path": "agent/app/repo/app_detail.go",
    "chars": 2615,
    "preview": "package repo\n\nimport (\n\t\"context\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/clause"
  },
  {
    "path": "agent/app/repo/app_ignore_upgrade.go",
    "chars": 1306,
    "preview": "package repo\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"github.com/1Panel-dev/1Panel/agent/global\"\n\t\"go"
  },
  {
    "path": "agent/app/repo/app_install.go",
    "chars": 8171,
    "preview": "package repo\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/constant\"\n\n\t\"gorm.io/gorm/claus"
  },
  {
    "path": "agent/app/repo/app_install_resource.go",
    "chars": 2431,
    "preview": "package repo\n\nimport (\n\t\"context\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"github.com/1Panel-dev/1Panel/agent/"
  },
  {
    "path": "agent/app/repo/app_launcher.go",
    "chars": 3002,
    "preview": "package repo\n\nimport (\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"github.com/1Panel-dev/1Panel/agent/global\"\n)\n\nt"
  },
  {
    "path": "agent/app/repo/app_tag.go",
    "chars": 2180,
    "preview": "package repo\n\nimport (\n\t\"context\"\n\t\"gorm.io/gorm\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n)\n\ntype AppTagRepo st"
  },
  {
    "path": "agent/app/repo/backup.go",
    "chars": 5540,
    "preview": "package repo\n\nimport (\n\t\"context\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"github.com/1Panel-dev/1Panel/agent/"
  },
  {
    "path": "agent/app/repo/clam.go",
    "chars": 4257,
    "preview": "package repo\n\nimport (\n\t\"time\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/app/model\"\n\t\"github.com/1Panel-dev/1Panel/agent/con"
  },
  {
    "path": "agent/app/repo/common.go",
    "chars": 4396,
    "preview": "package repo\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/1Panel-dev/1Panel/agent/constant\"\n\t\"github.com/1Panel-dev"
  }
]

// ... and 1256 more files (download for full content)

About this extraction

This page contains the full source code of the 1Panel-dev/1Panel GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1456 files (14.5 MB), approximately 3.9M tokens, and a symbol index with 7280 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!