Full Code of libnyanpasu/clash-nyanpasu for AI

main ee62b62ca329 cached
743 files
2.5 MB
697.6k tokens
2436 symbols
1 requests
Download .txt
Showing preview only (2,766K chars total). Download the full file or copy to clipboard to get everything.
Repository: libnyanpasu/clash-nyanpasu
Branch: main
Commit: ee62b62ca329
Files: 743
Total size: 2.5 MB

Directory structure:
gitextract_v_30r70e/

├── .editorconfig
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   ├── config.yml
│   │   └── feature_request.yaml
│   └── workflows/
│       ├── ci.yml
│       ├── daily.yml
│       ├── deps-build-linux.yaml
│       ├── deps-build-macos.yaml
│       ├── deps-build-windows-nsis.yaml
│       ├── deps-create-updater.yaml
│       ├── deps-delete-releases.yaml
│       ├── deps-message-telegram.yaml
│       ├── deps-update-tag.yaml
│       ├── deps-upload-release-assets.yaml
│       ├── macos-aarch64.yaml
│       ├── publish.yml
│       ├── stale.yml
│       ├── target-dev-build.yaml
│       └── target-release-build.yaml
├── .gitignore
├── .husky/
│   ├── commit-msg
│   └── pre-commit
├── .lintstagedrc.js
├── .oxlintrc.json
├── .prettierignore
├── .prettierrc.cjs
├── .stylelintignore
├── .stylelintrc.js
├── .vscode/
│   ├── extensions.json
│   └── settings.json
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── UPDATELOG.md
├── backend/
│   ├── .gitignore
│   ├── Cargo.toml
│   ├── Cross.toml
│   ├── boa_utils/
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── console/
│   │       │   ├── mod.rs
│   │       │   └── tests.rs
│   │       ├── lib.rs
│   │       └── module/
│   │           ├── builtin/
│   │           │   └── utils.js
│   │           ├── builtin.rs
│   │           ├── combine.rs
│   │           ├── http.rs
│   │           └── mod.rs
│   ├── nyanpasu-egui/
│   │   ├── .gitignore
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── ipc.rs
│   │       ├── lib.rs
│   │       ├── main.rs
│   │       ├── small.rs
│   │       ├── utils/
│   │       │   ├── mod.rs
│   │       │   └── svg.rs
│   │       └── widget/
│   │           ├── mod.rs
│   │           ├── network_statistic_large.rs
│   │           └── network_statistic_small.rs
│   ├── nyanpasu-macro/
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── builder_update.rs
│   │       ├── enum_wrapper_combined.rs
│   │       ├── lib.rs
│   │       └── verge_patch.rs
│   ├── rustfmt.toml
│   ├── tauri/
│   │   ├── .gitignore
│   │   ├── Cargo.toml
│   │   ├── Info.plist
│   │   ├── build.rs
│   │   ├── capabilities/
│   │   │   └── main.json
│   │   ├── icons/
│   │   │   └── icon.icns
│   │   ├── locales/
│   │   │   ├── en.json
│   │   │   ├── ru.json
│   │   │   ├── zh-cn.json
│   │   │   └── zh-tw.json
│   │   ├── overrides/
│   │   │   ├── fixed-webview2.conf.json
│   │   │   └── nightly.conf.json
│   │   ├── src/
│   │   │   ├── cmds/
│   │   │   │   ├── migrate.rs
│   │   │   │   └── mod.rs
│   │   │   ├── config/
│   │   │   │   ├── clash/
│   │   │   │   │   └── mod.rs
│   │   │   │   ├── core.rs
│   │   │   │   ├── draft.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── nyanpasu/
│   │   │   │   │   ├── clash_strategy.rs
│   │   │   │   │   ├── logging.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── widget.rs
│   │   │   │   ├── profile/
│   │   │   │   │   ├── builder.rs
│   │   │   │   │   ├── item/
│   │   │   │   │   │   ├── local.rs
│   │   │   │   │   │   ├── merge.rs
│   │   │   │   │   │   ├── mod.rs
│   │   │   │   │   │   ├── prelude.rs
│   │   │   │   │   │   ├── remote.rs
│   │   │   │   │   │   ├── script.rs
│   │   │   │   │   │   ├── shared.rs
│   │   │   │   │   │   └── utils.rs
│   │   │   │   │   ├── item_type.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── profiles.rs
│   │   │   │   │   └── tests.rs
│   │   │   │   └── runtime.rs
│   │   │   ├── consts.rs
│   │   │   ├── core/
│   │   │   │   ├── clash/
│   │   │   │   │   ├── api.rs
│   │   │   │   │   ├── core.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── proxies.rs
│   │   │   │   │   └── ws.rs
│   │   │   │   ├── connection_interruption.rs
│   │   │   │   ├── handle.rs
│   │   │   │   ├── hotkey.rs
│   │   │   │   ├── logger.rs
│   │   │   │   ├── manager.rs
│   │   │   │   ├── migration/
│   │   │   │   │   ├── db.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── units/
│   │   │   │   │       ├── mod.rs
│   │   │   │   │       ├── unit_160.rs
│   │   │   │   │       ├── unit_200/
│   │   │   │   │       │   └── profile_script_newtype.rs
│   │   │   │   │       └── unit_200.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── pac.rs
│   │   │   │   ├── service/
│   │   │   │   │   ├── control.rs
│   │   │   │   │   ├── ipc.rs
│   │   │   │   │   └── mod.rs
│   │   │   │   ├── state.rs
│   │   │   │   ├── state_v2/
│   │   │   │   │   ├── builder.rs
│   │   │   │   │   ├── coordinator.rs
│   │   │   │   │   ├── manager/
│   │   │   │   │   │   ├── persistent.rs
│   │   │   │   │   │   └── simple.rs
│   │   │   │   │   ├── manager.rs
│   │   │   │   │   └── mod.rs
│   │   │   │   ├── storage.rs
│   │   │   │   ├── sysopt.rs
│   │   │   │   ├── tasks/
│   │   │   │   │   ├── events.rs
│   │   │   │   │   ├── executor.rs
│   │   │   │   │   ├── jobs/
│   │   │   │   │   │   ├── events_rotate.rs
│   │   │   │   │   │   ├── logger.rs
│   │   │   │   │   │   ├── mod.rs
│   │   │   │   │   │   └── profiles.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── storage.rs
│   │   │   │   │   ├── task.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   ├── tray/
│   │   │   │   │   ├── icon.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── proxies.rs
│   │   │   │   ├── updater/
│   │   │   │   │   ├── instance.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── shared.rs
│   │   │   │   └── win_uwp.rs
│   │   │   ├── enhance/
│   │   │   │   ├── advice.rs
│   │   │   │   ├── builtin/
│   │   │   │   │   ├── clash_rs_comp.lua
│   │   │   │   │   ├── config_fixer.js
│   │   │   │   │   ├── meta_guard.js
│   │   │   │   │   └── meta_hy_alpn.js
│   │   │   │   ├── chain.rs
│   │   │   │   ├── field.rs
│   │   │   │   ├── merge.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── script/
│   │   │   │   │   ├── js.rs
│   │   │   │   │   ├── lua/
│   │   │   │   │   │   └── mod.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── runner.rs
│   │   │   │   ├── tun.rs
│   │   │   │   └── utils.rs
│   │   │   ├── event_handler/
│   │   │   │   ├── mod.rs
│   │   │   │   └── widget.rs
│   │   │   ├── feat.rs
│   │   │   ├── ipc.rs
│   │   │   ├── lib.rs
│   │   │   ├── logging/
│   │   │   │   ├── indexer.rs
│   │   │   │   ├── manager.rs
│   │   │   │   └── mod.rs
│   │   │   ├── main.rs
│   │   │   ├── server/
│   │   │   │   └── mod.rs
│   │   │   ├── setup.rs
│   │   │   ├── shutdown_hook.rs
│   │   │   ├── utils/
│   │   │   │   ├── candy.rs
│   │   │   │   ├── collect.rs
│   │   │   │   ├── config.rs
│   │   │   │   ├── dialog.rs
│   │   │   │   ├── dirs.rs
│   │   │   │   ├── dock.rs
│   │   │   │   ├── downloader.rs
│   │   │   │   ├── help.rs
│   │   │   │   ├── init/
│   │   │   │   │   ├── logging.rs
│   │   │   │   │   └── mod.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── net.rs
│   │   │   │   ├── open.rs
│   │   │   │   ├── resolve.rs
│   │   │   │   ├── sudo.rs
│   │   │   │   ├── winhelp.rs
│   │   │   │   ├── winreg.rs
│   │   │   │   └── winreg_test.rs
│   │   │   ├── widget.rs
│   │   │   └── window.rs
│   │   ├── tauri.conf.json
│   │   ├── tauri.windows.conf.json
│   │   ├── templates/
│   │   │   ├── cleanup.wxs
│   │   │   ├── installer.nsi
│   │   │   └── installer.wxs
│   │   └── tests/
│   │       └── sample_clash_config.yaml
│   └── tauri-plugin-deep-link/
│       ├── .github/
│       │   └── workflows/
│       │       ├── audit.yml
│       │       ├── format.yml
│       │       ├── lint.yml
│       │       └── release.yml
│       ├── .gitignore
│       ├── CHANGELOG.md
│       ├── Cargo.toml
│       ├── LICENSE_APACHE-2.0
│       ├── LICENSE_MIT
│       ├── README.md
│       ├── cliff.toml
│       ├── example/
│       │   ├── Info.plist
│       │   └── main.rs
│       ├── renovate.json
│       └── src/
│           ├── lib.rs
│           ├── linux.rs
│           ├── macos.rs
│           ├── template.desktop
│           └── windows.rs
├── cliff.toml
├── commitlint.config.js
├── frontend/
│   ├── interface/
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── hooks/
│   │   │   │   ├── index.ts
│   │   │   │   └── use-kv-storage.ts
│   │   │   ├── index.ts
│   │   │   ├── ipc/
│   │   │   │   ├── bindings.ts
│   │   │   │   ├── consts.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── use-clash-config.ts
│   │   │   │   ├── use-clash-connections.ts
│   │   │   │   ├── use-clash-cores.ts
│   │   │   │   ├── use-clash-info.ts
│   │   │   │   ├── use-clash-logs.ts
│   │   │   │   ├── use-clash-memory.ts
│   │   │   │   ├── use-clash-proxies-provider.ts
│   │   │   │   ├── use-clash-proxies.ts
│   │   │   │   ├── use-clash-rules-provider.ts
│   │   │   │   ├── use-clash-rules.ts
│   │   │   │   ├── use-clash-traffic.ts
│   │   │   │   ├── use-clash-version.ts
│   │   │   │   ├── use-clash-web-socket.ts
│   │   │   │   ├── use-core-dir.ts
│   │   │   │   ├── use-platform.ts
│   │   │   │   ├── use-post-processing-output.ts
│   │   │   │   ├── use-profile-content.ts
│   │   │   │   ├── use-profile.ts
│   │   │   │   ├── use-proxy-mode.ts
│   │   │   │   ├── use-runtime-profile.ts
│   │   │   │   ├── use-server-port.ts
│   │   │   │   ├── use-service-prompt.ts
│   │   │   │   ├── use-settings.ts
│   │   │   │   ├── use-system-proxy.ts
│   │   │   │   └── use-system-service.ts
│   │   │   ├── openapi/
│   │   │   │   ├── geoip/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── ipsb.ts
│   │   │   │   ├── healthcheck/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   └── index.ts
│   │   │   ├── provider/
│   │   │   │   ├── clash-ws-provider.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   └── mutation-provider.tsx
│   │   │   ├── service/
│   │   │   │   ├── clash-api.ts
│   │   │   │   ├── core.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── tauri.ts
│   │   │   │   └── types.ts
│   │   │   ├── template/
│   │   │   │   └── index.ts
│   │   │   └── utils/
│   │   │       ├── get-system.ts
│   │   │       ├── index.ts
│   │   │       └── retry.ts
│   │   └── tsconfig.json
│   ├── nyanpasu/
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── auto-imports.d.ts
│   │   ├── index.html
│   │   ├── messages/
│   │   │   ├── en.json
│   │   │   ├── ru.json
│   │   │   ├── zh-cn.json
│   │   │   └── zh-tw.json
│   │   ├── package.json
│   │   ├── postcss.config.js
│   │   ├── project.inlang/
│   │   │   ├── project_id
│   │   │   └── settings.json
│   │   ├── src/
│   │   │   ├── assets/
│   │   │   │   ├── json/
│   │   │   │   │   └── clash-field.json
│   │   │   │   └── styles/
│   │   │   │       ├── fonts.scss
│   │   │   │       ├── index.scss
│   │   │   │       ├── tailwind.css
│   │   │   │       └── theme.scss
│   │   │   ├── components/
│   │   │   │   ├── app/
│   │   │   │   │   ├── app-container.module.d.scss.ts
│   │   │   │   │   ├── app-container.module.scss
│   │   │   │   │   ├── app-container.module.scss.d.ts
│   │   │   │   │   ├── app-container.tsx
│   │   │   │   │   ├── app-drawer.tsx
│   │   │   │   │   ├── drawer-content.tsx
│   │   │   │   │   ├── locales-provider.tsx
│   │   │   │   │   └── modules/
│   │   │   │   │       └── route-list-item.tsx
│   │   │   │   ├── base/
│   │   │   │   │   ├── base-empty.tsx
│   │   │   │   │   ├── base-error-boundary.tsx
│   │   │   │   │   ├── base-notice.tsx
│   │   │   │   │   ├── content-display.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── connections/
│   │   │   │   │   ├── close-connections-button.tsx
│   │   │   │   │   ├── connection-detail-dialog.tsx
│   │   │   │   │   ├── connection-page.tsx
│   │   │   │   │   ├── connection-search-term.tsx
│   │   │   │   │   ├── connections-column-filter.tsx
│   │   │   │   │   ├── connections-table.tsx
│   │   │   │   │   ├── connections-total.tsx
│   │   │   │   │   └── header-search.tsx
│   │   │   │   ├── dashboard/
│   │   │   │   │   ├── data-panel.tsx
│   │   │   │   │   ├── dataline.tsx
│   │   │   │   │   ├── health-panel.tsx
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   ├── ipasn-panel.tsx
│   │   │   │   │   │   └── timing-panel.tsx
│   │   │   │   │   ├── proxy-shortcuts.tsx
│   │   │   │   │   └── service-shortcuts.tsx
│   │   │   │   ├── layout/
│   │   │   │   │   ├── animated-logo.module.d.scss.ts
│   │   │   │   │   ├── animated-logo.module.scss
│   │   │   │   │   ├── animated-logo.module.scss.d.ts
│   │   │   │   │   ├── animated-logo.tsx
│   │   │   │   │   ├── layout-control.tsx
│   │   │   │   │   ├── mutation-provider.tsx
│   │   │   │   │   ├── notice-provider.tsx
│   │   │   │   │   ├── page-transition.tsx
│   │   │   │   │   ├── scheme-provider.tsx
│   │   │   │   │   └── use-custom-theme.tsx
│   │   │   │   ├── logo/
│   │   │   │   │   └── animated-logo.tsx
│   │   │   │   ├── logs/
│   │   │   │   │   ├── clear-log-button.tsx
│   │   │   │   │   ├── log-filter.tsx
│   │   │   │   │   ├── log-item.module.scss
│   │   │   │   │   ├── log-item.module.scss.d.ts
│   │   │   │   │   ├── log-item.tsx
│   │   │   │   │   ├── log-level.tsx
│   │   │   │   │   ├── log-list.tsx
│   │   │   │   │   ├── log-page.tsx
│   │   │   │   │   ├── log-provider.tsx
│   │   │   │   │   ├── log-toggle.tsx
│   │   │   │   │   └── los-header.tsx
│   │   │   │   ├── profiles/
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   ├── chain-item.tsx
│   │   │   │   │   │   ├── language-chip.tsx
│   │   │   │   │   │   ├── side-chain.tsx
│   │   │   │   │   │   ├── side-log.tsx
│   │   │   │   │   │   └── store.ts
│   │   │   │   │   ├── new-profile-button.tsx
│   │   │   │   │   ├── profile-dialog.tsx
│   │   │   │   │   ├── profile-item.tsx
│   │   │   │   │   ├── profile-monaco-diff-viewer.tsx
│   │   │   │   │   ├── profile-monaco-viewer.tsx
│   │   │   │   │   ├── profile-side.tsx
│   │   │   │   │   ├── provider.tsx
│   │   │   │   │   ├── quick-import.tsx
│   │   │   │   │   ├── read-profile.tsx
│   │   │   │   │   ├── runtime-config-diff-dialog.tsx
│   │   │   │   │   ├── script-dialog.tsx
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── providers/
│   │   │   │   │   ├── block-task-provider.tsx
│   │   │   │   │   ├── context-menu-provider.tsx
│   │   │   │   │   ├── language-provider.tsx
│   │   │   │   │   ├── nyanpasu-update-provider.tsx
│   │   │   │   │   ├── proxies-provider-traffic.tsx
│   │   │   │   │   ├── proxies-provider.tsx
│   │   │   │   │   ├── rules-provider.tsx
│   │   │   │   │   ├── theme-provider.tsx
│   │   │   │   │   ├── update-providers.tsx
│   │   │   │   │   └── update-proxies-providers.tsx
│   │   │   │   ├── proxies/
│   │   │   │   │   ├── delay-button.tsx
│   │   │   │   │   ├── delay-chip.tsx
│   │   │   │   │   ├── feature-chip.tsx
│   │   │   │   │   ├── group-list.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── node-card.module.d.scss.ts
│   │   │   │   │   ├── node-card.module.scss
│   │   │   │   │   ├── node-card.module.scss.d.ts
│   │   │   │   │   ├── node-card.tsx
│   │   │   │   │   ├── node-list.tsx
│   │   │   │   │   ├── proxy-group-name.tsx
│   │   │   │   │   ├── scroll-current-node.tsx
│   │   │   │   │   ├── sort-selector.tsx
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── router/
│   │   │   │   │   └── animated-outlet.tsx
│   │   │   │   ├── rules/
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   └── store.ts
│   │   │   │   │   ├── rule-item.tsx
│   │   │   │   │   └── rule-page.tsx
│   │   │   │   ├── setting/
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   ├── clash-core.tsx
│   │   │   │   │   │   ├── clash-field.tsx
│   │   │   │   │   │   ├── clash-web.tsx
│   │   │   │   │   │   ├── hotkey-dialog.tsx
│   │   │   │   │   │   ├── hotkey-input.module.d.scss.ts
│   │   │   │   │   │   ├── hotkey-input.module.scss
│   │   │   │   │   │   ├── hotkey-input.module.scss.d.ts
│   │   │   │   │   │   ├── hotkey-input.tsx
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── nyanpasu-path.tsx
│   │   │   │   │   │   ├── service-manual-prompt-dialog.module.d.scss.ts
│   │   │   │   │   │   ├── service-manual-prompt-dialog.module.scss
│   │   │   │   │   │   ├── service-manual-prompt-dialog.module.scss.d.ts
│   │   │   │   │   │   ├── service-manual-prompt-dialog.tsx
│   │   │   │   │   │   ├── system-proxy.tsx
│   │   │   │   │   │   └── tray-icon-dialog.tsx
│   │   │   │   │   ├── setting-clash-base.tsx
│   │   │   │   │   ├── setting-clash-core.tsx
│   │   │   │   │   ├── setting-clash-external.tsx
│   │   │   │   │   ├── setting-clash-field.tsx
│   │   │   │   │   ├── setting-clash-port.tsx
│   │   │   │   │   ├── setting-clash-web.tsx
│   │   │   │   │   ├── setting-nyanpasu-auto-reload.tsx
│   │   │   │   │   ├── setting-nyanpasu-misc.tsx
│   │   │   │   │   ├── setting-nyanpasu-path.tsx
│   │   │   │   │   ├── setting-nyanpasu-tasks.tsx
│   │   │   │   │   ├── setting-nyanpasu-ui.tsx
│   │   │   │   │   ├── setting-nyanpasu-version.tsx
│   │   │   │   │   ├── setting-page.tsx
│   │   │   │   │   ├── setting-system-behavior.tsx
│   │   │   │   │   ├── setting-system-proxy.tsx
│   │   │   │   │   └── setting-system-service.tsx
│   │   │   │   ├── settings/
│   │   │   │   │   └── system-proxy.tsx
│   │   │   │   ├── ui/
│   │   │   │   │   ├── animated-item.tsx
│   │   │   │   │   ├── border-beam.tsx
│   │   │   │   │   ├── button.tsx
│   │   │   │   │   ├── card.tsx
│   │   │   │   │   ├── circle.tsx
│   │   │   │   │   ├── context-menu.tsx
│   │   │   │   │   ├── dropdown-menu.tsx
│   │   │   │   │   ├── file-drop-zone.tsx
│   │   │   │   │   ├── highlight-text.tsx
│   │   │   │   │   ├── image.tsx
│   │   │   │   │   ├── input.tsx
│   │   │   │   │   ├── modal.tsx
│   │   │   │   │   ├── progress.tsx
│   │   │   │   │   ├── ripple.tsx
│   │   │   │   │   ├── scroll-area.tsx
│   │   │   │   │   ├── select.tsx
│   │   │   │   │   ├── separator.tsx
│   │   │   │   │   ├── sidebar.tsx
│   │   │   │   │   ├── slider-sidebar.tsx
│   │   │   │   │   ├── slider.tsx
│   │   │   │   │   ├── switch.tsx
│   │   │   │   │   ├── text-marquee.tsx
│   │   │   │   │   └── tooltip.tsx
│   │   │   │   ├── updater/
│   │   │   │   │   ├── updater-dialog-wrapper.tsx
│   │   │   │   │   ├── updater-dialog.module.scss
│   │   │   │   │   ├── updater-dialog.module.scss.d.ts
│   │   │   │   │   └── updater-dialog.tsx
│   │   │   │   └── window/
│   │   │   │       ├── window-control.tsx
│   │   │   │       ├── window-header.tsx
│   │   │   │       └── window-title.tsx
│   │   │   ├── consts.ts
│   │   │   ├── hooks/
│   │   │   │   ├── theme.ts
│   │   │   │   ├── use-consts.ts
│   │   │   │   ├── use-core-icon.ts
│   │   │   │   ├── use-current-core-icon.ts
│   │   │   │   ├── use-element-breakpoints.ts
│   │   │   │   ├── use-is-moblie.tsx
│   │   │   │   ├── use-lock-fn.ts
│   │   │   │   ├── use-store.ts
│   │   │   │   ├── use-updater.ts
│   │   │   │   ├── use-visibility.ts
│   │   │   │   └── use-window-maximized.ts
│   │   │   ├── locales/
│   │   │   │   ├── en.json
│   │   │   │   ├── ru.json
│   │   │   │   ├── zh-CN.json
│   │   │   │   └── zh-TW.json
│   │   │   ├── main.tsx
│   │   │   ├── pages/
│   │   │   │   ├── (editor)/
│   │   │   │   │   └── editor/
│   │   │   │   │       ├── _modules/
│   │   │   │   │       │   ├── chip.tsx
│   │   │   │   │       │   ├── header.tsx
│   │   │   │   │       │   ├── hooks.tsx
│   │   │   │   │       │   ├── loading-skeleton.tsx
│   │   │   │   │       │   └── utils.tsx
│   │   │   │   │       ├── index.tsx
│   │   │   │   │       └── route.tsx
│   │   │   │   ├── (legacy)/
│   │   │   │   │   ├── connections.tsx
│   │   │   │   │   ├── dashboard.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── logs.tsx
│   │   │   │   │   ├── profiles.tsx
│   │   │   │   │   ├── providers.tsx
│   │   │   │   │   ├── proxies.tsx
│   │   │   │   │   ├── route.tsx
│   │   │   │   │   ├── rules.tsx
│   │   │   │   │   └── settings.tsx
│   │   │   │   ├── (main)/
│   │   │   │   │   ├── _modules/
│   │   │   │   │   │   ├── header-file-action.tsx
│   │   │   │   │   │   ├── header-help-action.tsx
│   │   │   │   │   │   ├── header-menu.tsx
│   │   │   │   │   │   ├── header-settings-action.tsx
│   │   │   │   │   │   ├── header.tsx
│   │   │   │   │   │   └── navbar.tsx
│   │   │   │   │   ├── main/
│   │   │   │   │   │   ├── connections/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   └── table-row.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── dashboard/
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── logs/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   ├── consts.ts
│   │   │   │   │   │   │   │   └── log-level-badge.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── profiles/
│   │   │   │   │   │   │   ├── $type/
│   │   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   │   ├── chain-profile-import.tsx
│   │   │   │   │   │   │   │   │   ├── import-button.tsx
│   │   │   │   │   │   │   │   │   ├── local-profile-button.tsx
│   │   │   │   │   │   │   │   │   ├── profiles-header.tsx
│   │   │   │   │   │   │   │   │   ├── profiles-list.tsx
│   │   │   │   │   │   │   │   │   ├── remote-profile-button.tsx
│   │   │   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   │   │   ├── detail/
│   │   │   │   │   │   │   │   │   ├── $uid.tsx
│   │   │   │   │   │   │   │   │   └── _modules/
│   │   │   │   │   │   │   │   │       ├── action-card.tsx
│   │   │   │   │   │   │   │   │       ├── active-button.tsx
│   │   │   │   │   │   │   │   │       ├── chian-editor-card.tsx
│   │   │   │   │   │   │   │   │       ├── delete-profile.tsx
│   │   │   │   │   │   │   │   │       ├── detial-header.tsx
│   │   │   │   │   │   │   │   │       ├── open-locally.tsx
│   │   │   │   │   │   │   │   │       ├── profile-name-editor.tsx
│   │   │   │   │   │   │   │   │       ├── subscription-card.tsx
│   │   │   │   │   │   │   │   │       ├── subscription-url-editor.tsx
│   │   │   │   │   │   │   │   │       ├── update-option-editor.tsx
│   │   │   │   │   │   │   │   │       └── view-content.tsx
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   ├── consts.ts
│   │   │   │   │   │   │   │   ├── error-item.tsx
│   │   │   │   │   │   │   │   ├── profile-quick-import.tsx
│   │   │   │   │   │   │   │   └── profiles-navigate.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   ├── inspect/
│   │   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── providers/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   ├── providers-title.tsx
│   │   │   │   │   │   │   │   ├── use-proxies-provider-update.tsx
│   │   │   │   │   │   │   │   ├── use-proxies-subscription.tsx
│   │   │   │   │   │   │   │   └── use-rules-provider-update.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   ├── proxies/
│   │   │   │   │   │   │   │   ├── $key.tsx
│   │   │   │   │   │   │   │   └── _modules/
│   │   │   │   │   │   │   │       ├── info-card.tsx
│   │   │   │   │   │   │   │       └── subscription-card.tsx
│   │   │   │   │   │   │   ├── route.tsx
│   │   │   │   │   │   │   └── rules/
│   │   │   │   │   │   │       ├── $key.tsx
│   │   │   │   │   │   │       └── _modules/
│   │   │   │   │   │   │           └── info-card.tsx
│   │   │   │   │   │   ├── proxies/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   ├── hooks.ts
│   │   │   │   │   │   │   │   └── proxies-navigate.tsx
│   │   │   │   │   │   │   ├── group/
│   │   │   │   │   │   │   │   ├── $name.tsx
│   │   │   │   │   │   │   │   └── _modules/
│   │   │   │   │   │   │   │       ├── delay-test-button.tsx
│   │   │   │   │   │   │   │       ├── group-header.tsx
│   │   │   │   │   │   │   │       └── proxy-node-button.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── rules/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   └── proxy-icon.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   └── settings/
│   │   │   │   │   │       ├── _modules/
│   │   │   │   │   │       │   ├── settings-card.tsx
│   │   │   │   │   │       │   ├── settings-navigate.tsx
│   │   │   │   │   │       │   └── settings-title.tsx
│   │   │   │   │   │       ├── about/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   └── nyanpasu-version.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── clash/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   ├── allow-lan-switch.tsx
│   │   │   │   │   │       │   │   ├── core-manager-card.tsx
│   │   │   │   │   │       │   │   ├── field-filter-card.tsx
│   │   │   │   │   │       │   │   ├── field-filter-switch.tsx
│   │   │   │   │   │       │   │   ├── ipv6-switch.tsx
│   │   │   │   │   │       │   │   ├── log-level-selector.tsx
│   │   │   │   │   │       │   │   ├── mixed-port-config.tsx
│   │   │   │   │   │       │   │   ├── random-port-switch.tsx
│   │   │   │   │   │       │   │   └── tun-stack-selector.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── debug/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   ├── advance-tools-switch.tsx
│   │   │   │   │   │       │   │   ├── block-task-viewer.tsx
│   │   │   │   │   │       │   │   ├── debug-provider.tsx
│   │   │   │   │   │       │   │   ├── kv-storage.tsx
│   │   │   │   │   │       │   │   ├── path-utils-card.tsx
│   │   │   │   │   │       │   │   └── window-debug.tsx
│   │   │   │   │   │       │   ├── index.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── index.tsx
│   │   │   │   │   │       ├── nyanpasu/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   └── log-file-config.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── route.tsx
│   │   │   │   │   │       ├── system/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   ├── auto-launch-switch.tsx
│   │   │   │   │   │       │   │   ├── current-system-proxy.tsx
│   │   │   │   │   │       │   │   ├── proxy-bypass-config.tsx
│   │   │   │   │   │       │   │   ├── proxy-guard-config.tsx
│   │   │   │   │   │       │   │   ├── proxy-guard-switch.tsx
│   │   │   │   │   │       │   │   ├── slient-launch-switch.tsx
│   │   │   │   │   │       │   │   ├── system-service-ctrl.tsx
│   │   │   │   │   │       │   │   ├── system-service-switch.tsx
│   │   │   │   │   │       │   │   └── uwp-tools-button.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── user-interface/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   ├── language-selector.tsx
│   │   │   │   │   │       │   │   ├── switch-legacy.tsx
│   │   │   │   │   │       │   │   ├── theme-color-config.tsx
│   │   │   │   │   │       │   │   └── theme-mode-selector.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       └── web-ui/
│   │   │   │   │   │           ├── _modules/
│   │   │   │   │   │           │   ├── core-secret-config.tsx
│   │   │   │   │   │           │   ├── external-controller-config.tsx
│   │   │   │   │   │           │   ├── port-strategy-selector.tsx
│   │   │   │   │   │           │   └── web-ui.tsx
│   │   │   │   │   │           └── route.tsx
│   │   │   │   │   └── route.tsx
│   │   │   │   ├── -__root.module.scss
│   │   │   │   ├── -__root.module.scss.d.ts
│   │   │   │   └── __root.tsx
│   │   │   ├── route-tree.gen.ts
│   │   │   ├── services/
│   │   │   │   ├── i18n.ts
│   │   │   │   ├── monaco.ts
│   │   │   │   ├── storage.ts
│   │   │   │   └── types.d.ts
│   │   │   ├── store/
│   │   │   │   ├── clash.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── proxies.ts
│   │   │   │   ├── service.ts
│   │   │   │   └── updater.ts
│   │   │   └── utils/
│   │   │       ├── chain.ts
│   │   │       ├── get-system.ts
│   │   │       ├── ignore-case.ts
│   │   │       ├── index.ts
│   │   │       ├── language.ts
│   │   │       ├── monaco-yaml.worker.ts
│   │   │       ├── mui-theme.ts
│   │   │       ├── mutation.ts
│   │   │       ├── notification.ts
│   │   │       ├── parse-hotkey.ts
│   │   │       ├── parse-traffic.ts
│   │   │       ├── routes-utils.ts
│   │   │       ├── shiki.ts
│   │   │       └── styled.ts
│   │   ├── tailwind.config.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   ├── tsr.config.json
│   │   └── vite.config.ts
│   └── ui/
│       ├── package.json
│       ├── src/
│       │   ├── chart/
│       │   │   ├── index.ts
│       │   │   └── sparkline.tsx
│       │   ├── hooks/
│       │   │   ├── get-system.ts
│       │   │   ├── index.ts
│       │   │   ├── use-breakpoint.ts
│       │   │   └── use-click-position.ts
│       │   ├── index.ts
│       │   ├── materialYou/
│       │   │   ├── components/
│       │   │   │   ├── baseCard/
│       │   │   │   │   ├── index.tsx
│       │   │   │   │   ├── style.module.d.scss.ts
│       │   │   │   │   ├── style.module.scss
│       │   │   │   │   └── style.module.scss.d.ts
│       │   │   │   ├── baseDialog/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── basePage/
│       │   │   │   │   ├── baseErrorBoundary.tsx
│       │   │   │   │   ├── header.tsx
│       │   │   │   │   ├── index.tsx
│       │   │   │   │   └── style.scss
│       │   │   │   ├── expand/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── expandMore/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── floatingButton/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── item/
│       │   │   │   │   ├── baseItem.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── menuItem.tsx
│       │   │   │   │   ├── numberItem.tsx
│       │   │   │   │   ├── switchItem.tsx
│       │   │   │   │   └── textItem.tsx
│       │   │   │   ├── kbd/
│       │   │   │   │   ├── index.module.d.scss.ts
│       │   │   │   │   ├── index.module.scss
│       │   │   │   │   ├── index.module.scss.d.ts
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── lazyImage/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── loadingButton/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── loadingSwitch/
│       │   │   │   │   ├── index.tsx
│       │   │   │   │   ├── style.module.d.scss.ts
│       │   │   │   │   ├── style.module.scss
│       │   │   │   │   └── style.module.scss.d.ts
│       │   │   │   └── sidePage/
│       │   │   │       ├── index.tsx
│       │   │   │       ├── style.module.d.scss.ts
│       │   │   │       ├── style.module.scss
│       │   │   │       └── style.module.scss.d.ts
│       │   │   ├── createTheme.ts
│       │   │   ├── index.ts
│       │   │   ├── themeComponents/
│       │   │   │   ├── MuiButton.ts
│       │   │   │   ├── MuiCard.ts
│       │   │   │   ├── MuiCardContent.ts
│       │   │   │   ├── MuiDialog.ts
│       │   │   │   ├── MuiDialogActions.ts
│       │   │   │   ├── MuiDialogContent.ts
│       │   │   │   ├── MuiDialogTitle.ts
│       │   │   │   ├── MuiLinearProgress.ts
│       │   │   │   ├── MuiMenu.ts
│       │   │   │   ├── MuiPaper.ts
│       │   │   │   ├── MuiSwitch.ts
│       │   │   │   ├── MuiToggleButtonGroup.ts
│       │   │   │   └── index.ts
│       │   │   └── themeConsts.mjs
│       │   └── utils/
│       │       ├── cn.ts
│       │       ├── color-mix.ts
│       │       ├── event.ts
│       │       ├── index.ts
│       │       └── ts-helper.ts
│       ├── tsconfig.json
│       └── vite.config.ts
├── knip.config.ts
├── manifest/
│   ├── site/
│   │   ├── index.html
│   │   └── updater/
│   │       └── .gitkeep
│   └── version.json
├── package.json
├── pnpm-workspace.yaml
├── renovate.json
├── rust-toolchain.toml
├── scripts/
│   ├── .gitignore
│   ├── .vscode/
│   │   └── settings.json
│   ├── deno/
│   │   ├── README.md
│   │   ├── build-cache.ts
│   │   ├── check.ts
│   │   ├── deno.jsonc
│   │   ├── generate-latest-version.ts
│   │   ├── manifest.ts
│   │   ├── telegram-notify.ts
│   │   ├── upload-build-artifacts.ts
│   │   ├── upload-macos-updater.ts
│   │   └── utils/
│   │       ├── cache-client.ts
│   │       ├── file-server.ts
│   │       └── logger.ts
│   ├── generate-git-info.ts
│   ├── generate-latest-version.ts
│   ├── manifest/
│   │   ├── clash-meta.ts
│   │   ├── clash-premium.ts
│   │   ├── clash-rs.ts
│   │   └── index.ts
│   ├── osx-aarch64-upload.ts
│   ├── package.json
│   ├── portable.ts
│   ├── prepare-nightly.ts
│   ├── prepare-preview.ts
│   ├── prepare-release.ts
│   ├── publish.ts
│   ├── tsconfig.json
│   ├── types/
│   │   └── index.ts
│   ├── updatelog.ts
│   ├── updater-nightly.ts
│   ├── updater.ts
│   └── utils/
│       ├── arch-check.ts
│       ├── consts.ts
│       ├── download.ts
│       ├── env.ts
│       ├── index.ts
│       ├── logger.ts
│       ├── manifest.ts
│       ├── octokit.ts
│       ├── resolve.ts
│       ├── resource.ts
│       ├── shell.ts
│       └── telegram.ts
└── tsconfig.json

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

================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 2
insert_final_newline = true

[*.lua]
charset = utf-8
indent_size = 4

[*.rs]
charset = utf-8
end_of_line = lf
indent_size = 4
insert_final_newline = true


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
# thanks https://github.com/Ehviewer-Overhauled/Ehviewer templates.

name: Bug 反馈 / Bug report
description: 提交一个问题报告 / Create a bug report
labels:
  - 'T: Bug'
  - 'S: Untriaged'
body:
  - type: markdown
    attributes:
      value: |
        提交问题报告前,还请首先完成文末的自查步骤。

        Please finish verify steps which list in the end first before create bug report.

  - type: textarea
    id: reproduce
    attributes:
      label: 复现步骤 / Step to reproduce
      description: |
        请在此处写下复现的方式,并携带错误日志,必要情况请带上截图/录屏。
        Please write down the reproduction steps here and include the error log. If necessary, please provide screenshots or recordings.
      placeholder: |
        1. 
        2.
        3.
        [录屏] / [Screen recording]
    validations:
      required: true

  - type: textarea
    id: expected
    attributes:
      label: 预期行为 / Expected behavior
      description: |
        在此处说明正常情况下应用的预期行为。
        Describe what should happened here.
      placeholder: |
        它应该 XXX……
        It should be ...
    validations:
      required: true

  - type: textarea
    id: actual
    attributes:
      label: 实际行为 / Actual behavior
      description: |
        在此处描绘应用的实际行为,最好附上截图。
        Describe what actually happened here, screenshots is better.
      placeholder: |
        实际上它 XXX……
        Actually it ...
        [截图] / [Screenshots]
    validations:
      required: true

  - type: textarea
    id: log
    attributes:
      label: 应用日志 / App logs
      description: |
        请确保您已移除所有敏感信息,并确保你的日志等级为 `Trace` 或 `Debug`。请参考 [FAQ - 日志目录](https://nyanpasu.elaina.moe/zh-CN/others/faq.html#_2-clash-nyanpasu-%E5%BA%94%E7%94%A8-%E6%97%A5%E8%AE%B0%E7%9B%AE%E5%BD%95%E5%9C%A8%E5%93%AA%E9%87%8C)  
        如果您可以打开主界面,可以在设置页的“日志目录”旁找到“收集日志”按钮,点击即可收集日志。(1.5.0 不可用)
        如果日志过长,请使用 [Gist](https://gist.github.com/) 或 [Hastebin](https://hastebin.com/) 并附上链接。
        Please make sure you have removed all sensitive information and your log level is `Trace` or `Debug`. Please refer to [FAQ - Logs directory](https://nyanpasu.elaina.moe/others/faq.html#_2-where-is-the-clash-nyanpasu-application-logs-directory)
        If you can open the main interface, you can find the "Collect logs" button next to the "Open Logs Dir" in the settings page, click to collect the logs. (Not available in 1.5.0)
        If the log is too long, please use [Gist](https://gist.github.com/) or [Hastebin](https://hastebin.com/) and provide the link.
      placeholder: |
        填写一个链接、一个代码块或一个压缩文件
        Should be a link, a code block or a archive file
    validations:
      required: false

  - type: textarea
    id: more
    attributes:
      label: 备注 / Addition details
      description: |
        在此处写下其他您想说的内容。
        Describe addition details here.
      placeholder: |
        其他有用的信息与附件
        Additional details and attachments
    validations:
      required: false
  - type: textarea
    id: env_infos
    attributes:
      label: 环境信息 / Environment information
      description: |
        请在此处提供您的环境信息,例如操作系统、Clash Nyanpasu 版本号、Clash 内核及其版本号等。
        Please provide your environment information here, such as operating system, Clash Nyanpasu version number, Clash core and its version number, etc.
      placeholder: |
        此处应由 Nyanpasu 设置页面的反馈按钮自动填写。如果是老版本,请手动填写。
        This should be automatically filled in by the feedback button on the Nyanpasu settings page. If it is an old version, please fill it in manually.
    validations:
      required: true
  # - type: input
  #   id: version
  #   attributes:
  #     label: Clash Nyanpasu 版本号 / Clash Nyanpasu version
  #     description: |
  #       您可以在 **设置 - Nyanpasu 版本** 或在 **托盘 - 更多** 中找到版本号。
  #       You can find the version number in **Settings - Nyanpasu Version** or **Tray - More**.
  #     placeholder: 1.5.0
  #   validations:
  #     required: true

  # - type: input
  #   id: core-version
  #   attributes:
  #     label: Clash 核心及其版本号 / Clash core and version
  #     description: |
  #       您可以在 **设置 - Clash 内核** 中找到内核及其版本号。
  #       You can find the core and its version number in **Settings - Clash Core**.
  #     placeholder: v1.18.1 Meta
  #   validations:
  #     required: true
  # - type: input
  #   id: pre-release
  #   attributes:
  #     label: 是否为 Pre-release / Is pre-release version
  #     description: |
  #       是否为 Pre-release 下载的应用,若是则填写对应的 commit hash。
  #       Is this an app downloaded from Pre-release? If so, please fill in the corresponding commit hash.
  #     placeholder: 26f05a0
  #   validations:
  #     required: true

  # - type: input
  #   id: system
  #   attributes:
  #     label: 操作系统及版本 / OS version
  #     description: 操作系统 + 版本号 / OS + version number
  #     placeholder: Windows 11, macOS 14
  #   validations:
  #     required: true

  - type: checkboxes
    id: check
    attributes:
      label: 自查步骤 / Verify steps
      description: |
        请确认您已经遵守所有必选项。
        Please ensure you have obtained all needed options.
      options:
        - label: 如果您有足够的时间和能力,并愿意为此提交 PR,请勾上此复选框 / Pull request is welcome. Check this if you want to start a pull request
          required: false
        - label: 您已知悉如果没有提供正确的系统信息,以及日志,您的 Issue 会直接被关闭 / You have known that if you don't provide correct system information and logs, your issue will be closed directly
          required: true
        - label: 您已仔细查看并知情 [Q&A](https://nyanpasu.elaina.moe/zh-CN/others/issues) 和 [FAQ](https://nyanpasu.elaina.moe/zh-CN/others/faq) 中的内容 / You have read and understood the contents of [Q&A](https://nyanpasu.elaina.moe/others/issues) and [FAQ](https://nyanpasu.elaina.moe/others/faq)
          required: true

        - label: 您已搜索过 [Issue Tracker](https://github.com/libnyanpasu/clash-nyanpasu/issues),没有找到类似内容 / I have searched on [Issue Tracker](https://github.com/libnyanpasu/clash-nyanpasu/issues), No duplicate or related open issue has been found
          required: true

        - label: 您确保这个 Issue 只提及一个问题。如果您有多个问题报告,烦请发起多个 Issue / Ensure there is only one bug report in this issue. Please make multiply issue for multiply bugs
          required: true

        - label: 您确保已使用最新 Pre-release 版本测试,并且该问题在最新 Pre-release 版本中并未解决 / This bug have not solved in latest Pre-release version
          required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: 所有其他问题 / All other questions
    url: https://github.com/libnyanpasu/clash-nyanpasu/discussions
    about: 转到 Discussions / Turn to discussions


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yaml
================================================
# thanks https://github.com/Ehviewer-Overhauled/Ehviewer templates.

name: 功能请求 / Feature request
description: 提出一个功能建议 / Suggest an idea
labels:
  - 'T: Feature'
  - 'S: Untriaged'
body:
  - type: markdown
    attributes:
      value: |
        提交功能建议前,还请首先完成文末的自查步骤。

        Please finish verify steps which list in the end first before suggest an idea.

  - type: textarea
    id: request
    attributes:
      label: 需求 / Requirement
      description: |
        在此处描述您的需求。这通常会是一个您想要的功能。
        Describe what you need here.
      placeholder: |
        我需要 XXX 功能……
        I want ABC feature ...
    validations:
      required: true

  - type: textarea
    id: impl
    attributes:
      label: 建议实现 / Suggested implements
      description: |
        在此处表述您建议的实现方式。如有可能,UI 类功能请求还请尽量附上图示。
        Describe your suggested implements here. It's recommend to add a photo if you are making a UI feature request.
      placeholder: |
        建议在 XX 处添加 XX……
        I recommend add ABC feature to DEF ...
        图片(如果有)/ Photos (if exists)
    validations:
      required: true

  - type: textarea
    id: more
    attributes:
      label: 备注 / Addition details
      description: |
        在此处写下其他您想说的内容。
        Describe addition details here.
      placeholder: |
        其他有用的信息与附件
        Additional details and attachments
    validations:
      required: false

  - type: input
    id: version
    attributes:
      label: Clash Nyanpasu 版本号 / Clash Nyanpasu
      description: |
        您可以在 **设置 - Nyanpasu 版本** 处找到版本号。
        You can get version code in **Settings - Nyanpasu Version**.
      placeholder: 1.4.1
    validations:
      required: true

  - type: input
    id: pre-release
    attributes:
      label: 是否为 Pre-release / Is pre-release version
      description: |
        是否为 Pre-release 下载的应用,若是则填写对应的 commit hash。
        Is this an app downloaded from Pre-release? If so, please fill in the corresponding commit hash.
      placeholder: 26f05a0
    validations:
      required: true

  - type: checkboxes
    id: check
    attributes:
      label: 自查步骤 / Verify steps
      description: |
        请确认您已经遵守所有必选项。
        Please ensure you have obtained all needed options.
      options:
        - label: 如果您有足够的时间和能力,并愿意为此提交 PR,请勾上此复选框 / Pull request is welcome. Check this if you want to start a pull request
          required: false

        - label: 您已仔细查看并知情 [Q&A](https://nyanpasu.elaina.moe/zh-CN/others/issues) 中的内容 / You have checked [Q&A](https://nyanpasu.elaina.moe/others/issues) carefully
          required: true

        - label: 您已搜索过 [Issue Tracker](https://github.com/libnyanpasu/clash-nyanpasu/issues),没有找到类似内容 / I have searched on [Issue Tracker](https://github.com/libnyanpasu/clash-nyanpasu/issues), No duplicate or related open issue has been found
          required: true

        - label: 您确保这个 Issue 只提及一个功能。如果您有多个功能请求,烦请发起多个 Issue / Ensure there is only one feature request in this issue. Please make multiply issue for multiply feature request
          required: true

        - label: 您确保已使用最新 Pre-release 版本测试,并且该功能在最新 Pre-release 版本中并未实现 / This feature have not implemented in latest Pre-release version
          required: true


================================================
FILE: .github/workflows/ci.yml
================================================
on:
  pull_request:
    branches:
      - main
      - dev
      - release-*
  push:
    branches:
      - main
      - dev
      - release-*

# the name of our workflow
name: CI

jobs:
  lint:
    name: Lint
    strategy:
      matrix:
        targets:
          - os: ubuntu-latest
          - os: macos-latest
          - os: windows-latest
    runs-on: ${{ matrix.targets.os }}
    steps:
      - uses: actions/checkout@v6
      - name: Rust
        run: |
          rustup toolchain install nightly --profile minimal --no-self-update
          rustup default nightly
          rustup component add clippy rustfmt
          rustc --version
          cargo --version
          rustup show

      - name: Tauri dependencies
        if: startsWith(matrix.targets.os, 'ubuntu-')
        run: >-
          sudo apt-get update &&
          sudo apt-get install -y
          libgtk-3-dev
          libayatana-appindicator3-dev
          libwebkit2gtk-4.1-dev
          librsvg2-dev
          libxdo-dev
          webkit2gtk-driver
          xvfb

      - uses: maxim-lobanov/setup-xcode@v1
        if: startsWith(matrix.targets.os, 'macos-')
        with:
          xcode-version: 'latest-stable'

      - name: Install Node.js
        uses: actions/setup-node@v6
        with:
          node-version: 24

      - uses: Swatinem/rust-cache@v2
        name: Cache Rust dependencies
        with:
          workspaces: 'backend'
          save-if: ${{ github.event_name == 'push' }}

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false

      - uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - uses: actions/cache@v5
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-
          save-always: ${{ github.event_name == 'push' }}

      - name: Install dependencies
        run: pnpm install --no-frozen-lockfile

      - name: Prepare fronend
        run: pnpm -r build # Build frontend
        env:
          NODE_OPTIONS: '--max_old_space_size=4096'
      - name: Prepare sidecar and resources
        run: pnpm prepare:check
      - name: Lint
        if: startsWith(matrix.targets.os, 'ubuntu-')
        run: pnpm lint # Lint
      - name: Lint
        if: startsWith(matrix.targets.os, 'ubuntu-') == false
        run: pnpm run-p lint:clippy lint:rustfmt # Lint
        env:
          NODE_OPTIONS: '--max_old_space_size=4096'

  # TODO: support test cross-platform
  build:
    name: Build Tauri
    strategy:
      matrix:
        targets:
          - os: ubuntu-latest
          - os: macos-latest
          - os: windows-latest
      fail-fast: false
    if: >
      github.event_name != 'pull_request' ||
      contains(github.event.pull_request.title, 'crate') ||
      github.event.pull_request.user.login != 'renovate[bot]'
    runs-on: ${{ matrix.targets.os }}
    needs: lint
    steps:
      - uses: actions/checkout@v6
      - name: Tauri dependencies
        if: startsWith(matrix.targets.os, 'ubuntu-')
        run: >-
          sudo apt-get update &&
          sudo apt-get install -y
          libgtk-3-dev
          libayatana-appindicator3-dev
          libwebkit2gtk-4.1-dev
          librsvg2-dev
          libxdo-dev
          webkit2gtk-driver
          xvfb
      - uses: maxim-lobanov/setup-xcode@v1
        if: startsWith(matrix.targets.os, 'macos-')
        with:
          xcode-version: 'latest-stable'

      - name: Install Node.js
        uses: actions/setup-node@v6
        with:
          node-version: 24

      - name: Install Deno
        uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - uses: Swatinem/rust-cache@v2
        name: Cache Rust dependencies
        with:
          workspaces: 'backend'
          save-if: ${{ github.event_name == 'push' }}

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - uses: actions/cache@v5
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-
          save-always: ${{ github.event_name == 'push' }}

      - name: Install dependencies
        run: pnpm install --no-frozen-lockfile

      - name: Prepare sidecar and resources
        run: pnpm prepare:check

      - name: Prepare frontend
        run: pnpm -r build
        env:
          NODE_OPTIONS: '--max_old_space_size=4096'

      - name: Build Backend
        run: cargo build --release --manifest-path backend/Cargo.toml

  test_unit:
    name: Unit Test
    needs: lint
    if: >
      github.event_name != 'pull_request' ||
      contains(github.event.pull_request.title, 'crate') ||
      github.event.pull_request.user.login != 'renovate[bot]'

    # we want to run on the latest linux environment
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
          - windows-latest
      fail-fast: false
    runs-on: ${{ matrix.os }}

    # the steps our job runs **in order**
    steps:
      # checkout the code on the workflow runner
      - uses: actions/checkout@v6

      # install system dependencies that Tauri needs to compile on Linux.
      # note the extra dependencies for `tauri-driver` to run which are: `webkit2gtk-driver` and `xvfb`
      - name: Tauri dependencies
        if: startsWith(matrix.os, 'ubuntu-')
        run: >-
          sudo apt-get update &&
          sudo apt-get install -y
          libgtk-3-dev
          libayatana-appindicator3-dev
          libwebkit2gtk-4.1-dev
          librsvg2-dev
          libxdo-dev
          webkit2gtk-driver
          xvfb

      - uses: maxim-lobanov/setup-xcode@v1
        if: startsWith(matrix.os, 'macos-')
        with:
          xcode-version: 'latest-stable'

      - name: Install Node.js
        uses: actions/setup-node@v6
        with:
          node-version: 24

      - name: Install Deno
        uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - uses: Swatinem/rust-cache@v2
        name: Cache Rust dependencies
        with:
          workspaces: 'backend'
          save-if: ${{ github.event_name == 'push' }}

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - uses: actions/cache@v5
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-
          save-always: ${{ github.event_name == 'push' }}

      - name: Install dependencies
        run: pnpm install --no-frozen-lockfile

      - name: Prepare sidecar and resources
        run: pnpm prepare:check

      - name: Prepare frontend
        run: pnpm -r build
        env:
          NODE_OPTIONS: '--max_old_space_size=4096'

      - name: Free up disk space
        if: startsWith(matrix.os, 'ubuntu-')
        run: |
          df -h
          sudo rm -rf /usr/share/dotnet
          sudo rm -rf /usr/local/lib/android
          sudo rm -rf /opt/ghc
          sudo rm -rf /opt/hostedtoolcache/CodeQL
          sudo docker image prune --all --force
          df -h

      - name: Test
        run: pnpm test


================================================
FILE: .github/workflows/daily.yml
================================================
on:
  workflow_dispatch:
  schedule:
    - cron: '15 22 * * *' # 每天 06:15 UTC+8 自动构建

name: Daily

jobs:
  generate_manifest:
    name: Generate Manifest
    runs-on: ubuntu-latest
    if: startsWith(github.repository, 'libnyanpasu')
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Install Node
        uses: actions/setup-node@v6
        with:
          node-version: '24'

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false
      - name: Install Deno
        uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x
      - name: Install dependencies
        run: pnpm install
      - name: Generate Manifest
        run: pnpm generate:manifest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      # if nothing changed, skip commit
      - name: Check for changes
        id: git-check
        run: echo ::set-output name=has-changes::$(if git diff --quiet; then echo "false"; else echo "true"; fi)
      - uses: oleksiyrudenko/gha-git-credentials@v2-latest
        if: steps.git-check.outputs.has-changes == 'true'
        with:
          token: '${{ secrets.GITHUB_TOKEN }}'
          name: 'github-actions[bot]'
          email: '41898282+github-actions[bot]@users.noreply.github.com'

      - name: Commit Manifest
        if: steps.git-check.outputs.has-changes == 'true'
        run: |
          git add .
          git commit -m "chore(manifest): update manifest [skip ci]"
          git push
  generate_manifest_v1:
    name: Generate Manifest V1
    runs-on: ubuntu-latest
    if: startsWith(github.repository, 'libnyanpasu')
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          ref: dev
      - name: Install Node
        uses: actions/setup-node@v6
        with:
          node-version: '24'

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false
      - name: Install Deno
        uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x
      - name: Install dependencies
        run: pnpm install
      - name: Generate Manifest
        run: pnpm generate:manifest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      # if nothing changed, skip commit
      - name: Check for changes
        id: git-check
        run: echo ::set-output name=has-changes::$(if git diff --quiet; then echo "false"; else echo "true"; fi)
      - uses: oleksiyrudenko/gha-git-credentials@v2-latest
        if: steps.git-check.outputs.has-changes == 'true'
        with:
          token: '${{ secrets.GITHUB_TOKEN }}'
          name: 'github-actions[bot]'
          email: '41898282+github-actions[bot]@users.noreply.github.com'

      - name: Commit Manifest
        if: steps.git-check.outputs.has-changes == 'true'
        run: |
          git add .
          git commit -m "chore(manifest): update manifest [skip ci]"
          git push


================================================
FILE: .github/workflows/deps-build-linux.yaml
================================================
name: '[Single] Build Linux'

on:
  workflow_dispatch:
    inputs:
      nightly:
        description: 'Nightly prepare'
        required: true
        type: boolean
        default: false
      tag:
        description: 'Release Tag'
        required: true
        type: string
      arch:
        type: choice
        description: 'build arch target'
        required: true
        default: 'x86_64'
        options:
          - x86_64
          - i686
          - aarch64
          - armel
          - armhf

  workflow_call:
    inputs:
      nightly:
        description: 'Nightly prepare'
        required: true
        type: boolean
        default: false
      tag:
        description: 'Release Tag'
        required: true
        type: string
      arch:
        type: string
        description: 'build arch target'
        required: true
        default: 'x86_64'

jobs:
  build:
    runs-on: ubuntu-24.04

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Install Rust nightly
        run: |
          rustup install nightly --profile minimal --no-self-update
          rustup default nightly

      - name: Setup Cargo binstall
        if: ${{ inputs.arch != 'x86_64' }}
        uses: cargo-bins/cargo-binstall@main

      - name: Setup Cross Toolchain
        if: ${{ inputs.arch != 'x86_64' }}
        shell: bash
        run: |
          case "${{ inputs.arch }}" in
            "i686")
              rustup target add i686-unknown-linux-gnu ;;
            "aarch64")
              rustup target add aarch64-unknown-linux-gnu ;;
            "armel")
              rustup target add armv7-unknown-linux-gnueabi ;;
            "armhf")
              rustup target add armv7-unknown-linux-gnueabihf ;;
          esac
          cargo binstall -y cross

      - name: Setup Toolchain
        run: |
          sudo apt-get update
          sudo apt-get install -y libwebkit2gtk-4.1-dev libxdo-dev libappindicator3-dev librsvg2-dev patchelf openssl

      - name: Install Node latest
        uses: actions/setup-node@v6
        with:
          node-version: 24

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false

      - uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - uses: actions/cache@v5
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - uses: Swatinem/rust-cache@v2
        name: Cache Rust dependencies
        with:
          workspaces: 'backend'
          key: ${{ inputs.arch }}

      - name: Install Node.js dependencies
        run: pnpm i

      - name: Prepare sidecars and resources
        shell: bash
        run: |
          case "${{ inputs.arch }}" in
            "x86_64")
              pnpm prepare:check ;;
            "i686")
              pnpm prepare:check --arch ia32 --sidecar-host i686-unknown-linux-gnu ;;
            "aarch64")
              pnpm prepare:check --arch arm64 --sidecar-host aarch64-unknown-linux-gnu ;;
            "armel")
              pnpm prepare:check --arch armel --sidecar-host armv7-unknown-linux-gnueabi ;;
            "armhf")
              pnpm prepare:check --arch arm --sidecar-host armv7-unknown-linux-gnueabihf ;;
          esac

      - name: Nightly Prepare
        if: ${{ inputs.nightly == true }}
        run: |
          pnpm prepare:nightly ${{ inputs.arch != 'x86_64' && '--disable-updater'}}

      - name: Build UI
        run: pnpm -F ui build

      # ===========================
      # GTK 图标修复步骤(适用于所有架构)
      # ===========================
      - name: Fix GTK Icon Names
        run: |
          ORIGINAL_NAME="Clash Nyanpasu"
          FIXED_NAME="clash_nyanpasu"
          ICON_SIZES=("32x32" "128x128" "256x256@2")

          case "${{ inputs.arch }}" in
            "x86_64")
              TARGET_DIR="backend/target/release" ;;
            "i686")
              TARGET_DIR="backend/target/i686-unknown-linux-gnu/release" ;;
            "aarch64")
              TARGET_DIR="backend/target/aarch64-unknown-linux-gnu/release" ;;
            "armel")
              TARGET_DIR="backend/target/armv7-unknown-linux-gnueabi/release" ;;
            "armhf")
              TARGET_DIR="backend/target/armv7-unknown-linux-gnueabihf/release" ;;
            *)
              TARGET_DIR="backend/target/release" ;;
          esac

          for size in "${ICON_SIZES[@]}"; do
            ICON_PATH="$TARGET_DIR/icons/hicolor/${size}/apps/${ORIGINAL_NAME}.png"
            FIXED_ICON_PATH="$TARGET_DIR/icons/hicolor/${size}/apps/${FIXED_NAME}.png"
            if [ -f "$ICON_PATH" ]; then
              mv "$ICON_PATH" "$FIXED_ICON_PATH"
              echo "Renamed $ICON_PATH -> $FIXED_ICON_PATH"
            fi
          done

          DESKTOP_FILE="$TARGET_DIR/share/applications/${ORIGINAL_NAME}.desktop"
          if [ -f "$DESKTOP_FILE" ]; then
            sed -i "s/Icon=${ORIGINAL_NAME}/Icon=${FIXED_NAME}/g" "$DESKTOP_FILE"
            echo "Updated desktop file Icon field"
          fi

          ICON_CACHE_DIR="$TARGET_DIR/icons/hicolor"
          if [ -d "$ICON_CACHE_DIR" ]; then
            gtk-update-icon-cache -f -t "$ICON_CACHE_DIR"
            echo "GTK icon cache updated"
          fi
      # ===========================
      - name: Tauri build (x86_64)
        if: ${{ inputs.arch == 'x86_64' }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
          NIGHTLY: ${{ inputs.nightly == true && 'true' || 'false' }}
        run: |
          pnpm tauri build ${{ inputs.nightly == true && '-f nightly -c ./backend/tauri/tauri.nightly.conf.json' || '-f default-meta' }}

      - name: Tauri build and upload (cross)
        if: ${{ inputs.arch != 'x86_64' }}
        shell: bash
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
          NIGHTLY: ${{ inputs.nightly == true && 'true' || 'false' }}
        run: |
          case "${{ inputs.arch }}" in
            "i686")
              ${{ inputs.nightly == true && 'pnpm build:nightly -r cross --target i686-unknown-linux-gnu -b "rpm,deb"' || 'pnpm build -r cross --target i686-unknown-linux-gnu -b "rpm,deb" -c "{ "bundle": { "createUpdaterArtifacts": false } }"' }} ;;
            "aarch64")
              ${{ inputs.nightly == true && 'pnpm build:nightly -r cross --target aarch64-unknown-linux-gnu -b "rpm,deb"' || 'pnpm build -r cross --target aarch64-unknown-linux-gnu -b "rpm,deb" -c "{ "bundle": { "createUpdaterArtifacts": false } }"' }} ;;
            "armel")
              ${{ inputs.nightly == true && 'pnpm build:nightly -r cross --target armv7-unknown-linux-gnueabi -b "rpm,deb"' || 'pnpm build -r cross --target armv7-unknown-linux-gnueabi -b "rpm,deb" -c "{ "bundle": { "createUpdaterArtifacts": false } }"' }} ;;
            "armhf")
              ${{ inputs.nightly == true && 'pnpm build:nightly -r cross --target armv7-unknown-linux-gnueabihf -b "rpm,deb"' || 'pnpm build -r cross --target armv7-unknown-linux-gnueabihf -b "rpm,deb" -c "{ "bundle": { "createUpdaterArtifacts": false } }"' }} ;;
          esac

      - name: Calc the archive signature
        run: |
          find ./backend/target \( -name "*.deb" -o -name "*.rpm" \) | while read file; do
            sha_file="$file.sha256"
            if [[ ! -f "$sha_file" ]]; then
              sha256sum "$file" > "$sha_file"
              echo "Created checksum file for: $file"
            fi
          done

      - name: Upload AppImage to Github Artifact
        if: ${{ inputs.arch == 'x86_64' }}
        uses: actions/upload-artifact@v7
        with:
          name: Clash.Nyanpasu-linux-${{ inputs.arch }}-appimage
          path: |
            ./backend/target/**/*.AppImage
            ./backend/target/**/*.AppImage.tar.gz
            ./backend/target/**/*.AppImage.tar.gz.sig

      - name: Upload deb to Github Artifact
        uses: actions/upload-artifact@v7
        with:
          name: Clash.Nyanpasu-linux-${{ inputs.arch }}-deb
          path: |
            ./backend/target/**/*.deb
            ./backend/target/**/*.deb.sha256

      - name: Upload rpm to Github Artifact
        uses: actions/upload-artifact@v7
        with:
          name: Clash.Nyanpasu-linux-${{ inputs.arch }}-rpm
          path: |
            ./backend/target/**/*.rpm
            ./backend/target/**/*.rpm.sha256

      - name: Set file server folder path
        if: ${{ inputs.nightly == true }}
        shell: bash
        run: |
          GIT_HASH=$(git rev-parse --short HEAD)
          echo "FOLDER_PATH=nightly/${GIT_HASH}" >> $GITHUB_ENV

      - name: Upload to file server
        if: ${{ inputs.nightly == true }}
        shell: bash
        continue-on-error: true
        run: |
          case "${{ inputs.arch }}" in
            "x86_64")
              deno run -A scripts/deno/upload-build-artifacts.ts \
                "backend/target/**/*.deb" \
                "backend/target/**/*.AppImage" ;;
            *)
              deno run -A scripts/deno/upload-build-artifacts.ts \
                "backend/target/**/*.deb" \
                "backend/target/**/*.rpm" ;;
          esac
        env:
          FILE_SERVER_TOKEN: ${{ secrets.FILE_SERVER_TOKEN }}
          FOLDER_PATH: ${{ env.FOLDER_PATH }}

      - name: Upload file server results
        if: ${{ inputs.nightly == true }}
        uses: actions/upload-artifact@v7
        with:
          name: upload-results-linux-${{ inputs.arch }}
          path: ./upload-results.json
          if-no-files-found: ignore


================================================
FILE: .github/workflows/deps-build-macos.yaml
================================================
name: '[Single] Build macOS'

on:
  workflow_dispatch:
    inputs:
      aarch64:
        description: 'Build aarch64 pkg'
        required: true
        type: boolean
        default: false

      nightly:
        description: 'Nightly prepare'
        required: true
        type: boolean
        default: false

      tag:
        description: 'Release Tag'
        required: true
        type: string

  workflow_call:
    inputs:
      aarch64:
        description: 'Build aarch64 pkg'
        required: true
        type: boolean
        default: false

      nightly:
        description: 'Nightly prepare'
        required: true
        type: boolean
        default: false

      tag:
        description: 'Release Tag'
        required: true
        type: string

jobs:
  build:
    runs-on: macos-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - uses: maxim-lobanov/setup-xcode@v1
        with:
          xcode-version: latest-stable

      - name: install Rust nightly
        run: |
          rustup install nightly --profile minimal --no-self-update
          rustup default nightly

      - name: Install Rust intel target
        if: ${{ inputs.aarch64 == false }}
        run: |
          rustup target add x86_64-apple-darwin
      - name: Install Rust aarch64 target
        if: ${{ inputs.aarch64 == true }}
        run: |
          rustup target add aarch64-apple-darwin

      - name: Install Node latest
        uses: actions/setup-node@v6
        with:
          node-version: 24
      - uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false

      - uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - uses: actions/cache@v5
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - uses: Swatinem/rust-cache@v2
        name: Cache Rust dependencies
        with:
          workspaces: 'backend'
          key: ${{ inputs.aarch64 == true && 'aarch64' || 'x86_64' }}

      - name: Pnpm install
        shell: bash
        run: |
          pnpm i

      - name: Download Sidecars aarch64
        if: ${{ inputs.aarch64 == true }}
        run: pnpm prepare:check --arch arm64 --sidecar-host aarch64-apple-darwin
      - name: Download Sidecars x64
        if: ${{ inputs.aarch64 == false }}
        run: pnpm prepare:check --arch x64 --sidecar-host x86_64-apple-darwin
      - name: Nightly Prepare
        if: ${{ inputs.nightly == true }}
        run: |
          pnpm prepare:nightly
      - name: Build UI
        run: |
          pnpm -F ui build
      - name: Build Clash Nyanpasu (Stable)
        if: ${{ inputs.nightly == false }}
        run: |
          pnpm tauri build --verbose -f default-meta ${{ inputs.aarch64 == true && '--target aarch64-apple-darwin' || '--target x86_64-apple-darwin' }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
          NIGHTLY: ${{ inputs.nightly == true  && 'true' || 'false' }}
          NODE_OPTIONS: '--max_old_space_size=4096'
      - name: Build Clash Nyanpasu (Nightly)
        if: ${{ inputs.nightly == true }}
        run: |
          pnpm build:nightly --verbose ${{ inputs.aarch64 == true && '--target aarch64-apple-darwin' || '--target x86_64-apple-darwin' }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
          NIGHTLY: ${{ inputs.nightly == true  && 'true' || 'false' }}
          NODE_OPTIONS: '--max_old_space_size=4096'

      - name: Rename updater files
        run: |
          deno run -A scripts/deno/upload-macos-updater.ts
        env:
          TARGET_ARCH: ${{ inputs.aarch64 == true && 'aarch64' || 'x86_64' }}

      - name: Upload to Github Artifact
        uses: actions/upload-artifact@v7
        with:
          name: Clash.Nyanpasu-macOS-${{ inputs.aarch64 == true && 'aarch64' || 'amd64' }}
          path: |
            ./backend/target/**/*.dmg
            ./backend/target/**/*.tar.gz
            ./backend/target/**/*.tar.gz.sig

      - name: Set file server folder path
        if: ${{ inputs.nightly == true }}
        shell: bash
        run: |
          GIT_HASH=$(git rev-parse --short HEAD)
          echo "FOLDER_PATH=nightly/${GIT_HASH}" >> $GITHUB_ENV

      - name: Upload to file server
        if: ${{ inputs.nightly == true }}
        shell: bash
        continue-on-error: true
        run: |
          deno run -A scripts/deno/upload-build-artifacts.ts \
            "backend/target/**/*.dmg"
        env:
          FILE_SERVER_TOKEN: ${{ secrets.FILE_SERVER_TOKEN }}
          FOLDER_PATH: ${{ env.FOLDER_PATH }}

      - name: Upload file server results
        if: ${{ inputs.nightly == true }}
        uses: actions/upload-artifact@v7
        with:
          name: upload-results-macos-${{ inputs.aarch64 == true && 'aarch64' || 'amd64' }}
          path: ./upload-results.json
          if-no-files-found: ignore


================================================
FILE: .github/workflows/deps-build-windows-nsis.yaml
================================================
name: '[Single] Build Windows NSIS'

on:
  workflow_dispatch:
    inputs:
      portable:
        description: 'Build Portable pkg'
        required: true
        type: boolean
        default: false

      fixed-webview:
        description: 'Fixed WebView'
        required: true
        type: boolean
        default: false

      nightly:
        description: 'Nightly prepare'
        required: true
        type: boolean
        default: false

      tag:
        description: 'Release Tag'
        required: true
        type: string

      arch:
        type: choice
        description: 'build arch target'
        required: true
        default: 'x86_64'
        options:
          - x86_64
          - i686
          - aarch64

  workflow_call:
    inputs:
      portable:
        description: 'Build Portable pkg'
        required: true
        type: boolean
        default: false

      fixed-webview:
        description: 'Fixed WebView'
        required: true
        type: boolean
        default: false

      nightly:
        description: 'Nightly prepare'
        required: true
        type: boolean
        default: false

      tag:
        description: 'Release Tag'
        required: true
        type: string

      arch:
        type: string
        description: 'build arch target'
        required: true
        default: 'x86_64'

jobs:
  build:
    runs-on: windows-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Install Rust nightly
        run: |
          rustup install nightly --profile minimal --no-self-update
          rustup default nightly

      - name: Setup Rust target
        if: ${{ inputs.arch != 'x86_64' }}
        run: |
          rustup target add ${{ inputs.arch }}-pc-windows-msvc

      - name: Install Node latest
        uses: actions/setup-node@v6
        with:
          node-version: 24

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false

      - uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - uses: actions/cache@v5
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - uses: Swatinem/rust-cache@v2
        name: Cache Rust dependencies
        with:
          workspaces: 'backend'
          key: ${{ inputs.arch }}

      - name: Install Node.js dependencies
        run: |
          pnpm i

      - name: Prepare sidecars and resources
        run: |
          $condition = '${{ inputs.arch }}'
          switch ($condition) {
            'x86_64' {
              pnpm prepare:check
            }
            'i686' {
              pnpm prepare:check --arch ia32 --sidecar-host i686-pc-windows-msvc
            }
            'aarch64' {
              pnpm prepare:check --arch arm64 --sidecar-host aarch64-pc-windows-msvc
            }
          }

      - name: Download fixed WebView
        if: ${{ inputs.fixed-webview == true }}
        run: |
          $condition = '${{ inputs.arch }}'
          switch ($condition) {
            'x86_64' {
              $arch= 'x64'
            }
            'i686' {
              $arch = 'x86'
            }
            'aarch64' {
              $arch = 'arm64'
            }
          }

          $version = '127.0.2651.105'
          $uri = "https://github.com/westinyang/WebView2RuntimeArchive/releases/download/$version/Microsoft.WebView2.FixedVersionRuntime.$version.$arch.cab"
          $outfile = "Microsoft.WebView2.FixedVersionRuntime.$version.$arch.cab"
          echo "Downloading $uri to $outfile"
          invoke-webrequest -uri $uri -outfile $outfile
          echo "Download finished, attempting to extract"
          expand.exe $outfile -F:* ./backend/tauri
          echo "Extraction finished"

      - name: Prepare (Windows NSIS and Portable)
        if: ${{ inputs.fixed-webview == false }}
        run: ${{ inputs.nightly == true && 'pnpm prepare:nightly --nsis' || 'pnpm prepare:release --nsis' }}

      - name: Prepare (Windows NSIS and Portable) with fixed WebView
        if: ${{ inputs.fixed-webview == true }}
        run: ${{ inputs.nightly == true && 'pnpm prepare:nightly --nsis --fixed-webview' || 'pnpm prepare:release --nsis --fixed-webview' }}

      - name: Build UI
        run: |
          pnpm -F ui build
      # TODO: optimize strategy
      - name: Tauri build x86_64
        if: ${{ inputs.arch == 'x86_64' }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
          NIGHTLY: ${{ inputs.nightly == true  && 'true' || 'false' }}
        run: |
          pnpm tauri build ${{ inputs.nightly == true && '-f nightly -c ./backend/tauri/tauri.nightly.conf.json' || '-f default-meta' }}

      - name: Tauri build i686
        if: ${{ inputs.arch == 'i686' }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
          NIGHTLY: ${{ inputs.nightly == true  && 'true' || 'false' }}
        run: |
          pnpm tauri build ${{ inputs.nightly == true && '-f nightly -c ./backend/tauri/tauri.nightly.conf.json --target i686-pc-windows-msvc' || '-f default-meta --target i686-pc-windows-msvc' }}
      - name: Tauri build arm64
        if: ${{ inputs.arch == 'aarch64' }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
          NIGHTLY: ${{ inputs.nightly == true  && 'true' || 'false' }}
        run: |
          pnpm tauri build ${{ inputs.nightly == true && '-f nightly -c ./backend/tauri/tauri.nightly.conf.json --target aarch64-pc-windows-msvc' || '-f default-meta --target aarch64-pc-windows-msvc' }}

      - name: Rename fixed webview bundle name
        if: ${{ inputs.fixed-webview == true }}
        run: |
          $files = Get-ChildItem -Path "./backend/target" -Recurse -Include "*.exe", "*.zip", "*.zip.sig" | Where-Object { $_.FullName -like "*\bundle\*" }
          $condition = '${{ inputs.arch }}'
          switch ($condition) {
            'x86_64' {
              $arch= 'x64'
            }
            'i686' {
              $arch = 'x86'
            }
            'aarch64' {
              $arch = 'arm64'
            }
          }

          foreach ($file in $files) {
            echo "Renaming $file"
            $newname = $file.FullName -replace $arch, "fixed-webview-$arch"
            Rename-Item -Path $file -NewName $newname
          }

      - name: Portable Bundle
        if: ${{ inputs.portable == true }}
        run: |
          pnpm portable ${{ inputs.fixed-webview == true && '--fixed-webview' || '' }}
        env:
          RUST_ARCH: ${{ inputs.arch }}
          TAG_NAME: ${{ inputs.tag }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
          NIGHTLY: ${{ inputs.nightly == true  && 'true' || 'false' }}
          VITE_WIN_PORTABLE: 1

      - name: Upload NSIS Installer
        uses: actions/upload-artifact@v7
        with:
          name: Clash.Nyanpasu-windows-${{ inputs.arch }}${{ inputs.fixed-webview == true && '-fixed-webview' || '' }}-nsis-installer
          path: |
            ./backend/target/**/bundle/**/*.exe
            ./backend/target/**/bundle/**/*.zip
            ./backend/target/**/bundle/**/*.zip.sig

      - name: Upload portable
        if: ${{ inputs.portable == true }}
        uses: actions/upload-artifact@v7
        with:
          name: Clash.Nyanpasu-windows-${{ inputs.arch }}${{ inputs.fixed-webview == true && '-fixed-webview' || '' }}-portable
          path: |
            ./*_portable.zip

      - name: Set file server folder path
        if: ${{ inputs.nightly == true }}
        shell: bash
        run: |
          GIT_HASH=$(git rev-parse --short HEAD)
          echo "FOLDER_PATH=nightly/${GIT_HASH}" >> $GITHUB_ENV

      - name: Upload to file server
        if: ${{ inputs.nightly == true }}
        shell: bash
        continue-on-error: true
        run: |
          deno run -A scripts/deno/upload-build-artifacts.ts \
            "backend/target/**/bundle/**/*.exe" \
            "*_portable.zip"
        env:
          FILE_SERVER_TOKEN: ${{ secrets.FILE_SERVER_TOKEN }}
          FOLDER_PATH: ${{ env.FOLDER_PATH }}

      - name: Upload file server results
        if: ${{ inputs.nightly == true }}
        uses: actions/upload-artifact@v7
        with:
          name: upload-results-windows-${{ inputs.arch }}${{ inputs.fixed-webview == true && '-fixed-webview' || '' }}
          path: ./upload-results.json
          if-no-files-found: ignore


================================================
FILE: .github/workflows/deps-create-updater.yaml
================================================
name: '[Single] Create Updater'

on:
  workflow_dispatch:
    inputs:
      nightly:
        description: 'Nightly'
        required: true
        type: boolean
        default: false
      release_body:
        description: 'Release Body'
        required: false
        type: string
  workflow_call:
    inputs:
      nightly:
        description: 'Nightly'
        required: true
        type: boolean
        default: false
      release_body:
        description: 'Release Body'
        required: false
        type: string
    secrets:
      SURGE_TOKEN:
        required: true

jobs:
  updater:
    name: Update Updater
    runs-on: ubuntu-latest
    permissions:
      id-token: write # This is required to allow the GitHub Action to authenticate with Deno Deploy.
      contents: write
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          ref: ${{ github.ref }}
          # blocked by https://github.com/actions/checkout/issues/1467
      - name: Fetch git tags
        run: git fetch --tags
      - name: Install Node latest
        uses: actions/setup-node@v6
        with:
          node-version: 24

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false

      - name: Pnpm install
        run: pnpm i

      - name: Update Nightly Updater
        if: ${{ inputs.nightly == true }}
        run: pnpm updater:nightly
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Update Nightly Fixed Webview Updater
        if: ${{ inputs.nightly == true }}
        run: pnpm updater:nightly --fixed-webview
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Update Stable Updater
        if: ${{ inputs.nightly == false }}
        run: pnpm updater
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          RELEASE_BODY: ${{ inputs.release_body || github.event.release.body }}

      - name: Update Stable Fixed Webview Updater
        if: ${{ inputs.nightly == false }}
        run: pnpm updater --fixed-webview
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          RELEASE_BODY: ${{ inputs.release_body || github.event.release.body }}

      - name: Download updater files from Github release
        uses: robinraju/release-downloader@v1
        with:
          tag: updater
          repository: libnyanpasu/clash-nyanpasu
          fileName: '*.json'
          token: ${{ secrets.GITHUB_TOKEN }}
          out-file-path: manifest/site/updater
      - name: Upload updater to surge.sh
        run: |
          pnpm i -g surge
          surge manifest/site surge.elaina.moe
          surge manifest/site nyanpasu.surge.sh
        env:
          SURGE_TOKEN: ${{ secrets.SURGE_TOKEN }}
      - name: Deploy to Deno Deploy
        uses: denoland/deployctl@v1
        with:
          project: clash-nyanpasu-manifest
          entrypoint: jsr:@std/http/file-server
          root: manifest/site


================================================
FILE: .github/workflows/deps-delete-releases.yaml
================================================
name: '[Single] Delete Current Releases'

on:
  workflow_dispatch:
    inputs:
      tag:
        description: 'Release Tag'
        required: true
        type: string

  workflow_call:
    inputs:
      tag:
        description: 'Release Tag'
        required: true
        type: string

jobs:
  delete:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Delete current release assets
        uses: mknejp/delete-release-assets@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          tag: ${{ inputs.tag }}
          fail-if-no-assets: false
          fail-if-no-release: false
          assets: |
            *.zip
            *.gz
            *.AppImage
            *.deb
            *.rpm
            *.dmg
            *.msi
            *.sig
            *.sha256
            *.exe
            *.json


================================================
FILE: .github/workflows/deps-message-telegram.yaml
================================================
name: '[Single] Send Message to Telegram'

on:
  workflow_dispatch:
    inputs:
      nightly:
        description: 'Nightly'
        required: true
        type: boolean
        default: false

      from-local:
        description: 'Use per-build uploaded results instead of downloading from release'
        required: false
        type: boolean
        default: false

  workflow_call:
    inputs:
      nightly:
        description: 'Nightly'
        required: true
        type: boolean
        default: false

      from-local:
        description: 'Use per-build uploaded results instead of downloading from release'
        required: false
        type: boolean
        default: false

jobs:
  telegram:
    name: Notify Telegram
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - uses: actions/setup-node@v6
        with:
          node-version: 24

      - uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - name: Download upload results
        if: ${{ inputs.from-local == true }}
        uses: actions/download-artifact@v8
        continue-on-error: true
        with:
          pattern: upload-results-*
          path: ./upload-results
          merge-multiple: false

      - name: Send Releases
        run: |
          ARGS=""
          if [ "${{ inputs.nightly }}" = "true" ]; then
            ARGS="$ARGS --nightly"
          fi
          if [ "${{ inputs.from-local }}" = "true" ]; then
            ARGS="$ARGS --from-local"
          fi
          deno run -A scripts/deno/telegram-notify.ts $ARGS
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }}
          TELEGRAM_API_ID: ${{ secrets.TELEGRAM_API_ID }}
          TELEGRAM_API_HASH: ${{ secrets.TELEGRAM_API_HASH }}
          FILE_SERVER_TOKEN: ${{ secrets.FILE_SERVER_TOKEN }}
          TELEGRAM_TO: '@keikolog'
          TELEGRAM_TO_NIGHTLY: '@ClashNyanpasu'
          WORKFLOW_RUN_ID: ${{ github.run_id }}
          UPLOAD_RESULTS_DIR: ./upload-results


================================================
FILE: .github/workflows/deps-update-tag.yaml
================================================
name: '[Single] Update Tag'

on:
  workflow_dispatch:
    inputs:
      tag:
        description: 'Release Tag'
        required: true
        type: string

  workflow_call:
    inputs:
      tag:
        description: 'Release Tag'
        required: true
        type: string

jobs:
  update_tag:
    name: Update tag
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Set Env
        run: |
          echo "BUILDTIME=$(TZ=Asia/Shanghai date)" >> $GITHUB_ENV
          echo "CURRENT_GIT_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV
        shell: bash

      - name: Update Tag
        uses: greenhat616/update-tag@v1
        with:
          tag_name: ${{ inputs.tag }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Create release body
        run: |
          cat > release.txt << 'EOF'
          ## Clash Nyanpasu Nightly Build
          Release created at  ${{ env.BUILDTIME }}.
          Daily build of **Clash Nyanpasu** on *main* branch.
          You could download previous Nightly Builds from [here](https://t.me/ClashNyanpasu).
          ***[See the development log here](https://t.me/s/keikolog/)***
          EOF

      - name: Update Release
        uses: softprops/action-gh-release@v2
        with:
          name: Clash Nyanpasu Dev
          tag_name: ${{ inputs.tag }}
          body_path: release.txt
          prerelease: true
          generate_release_notes: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/deps-upload-release-assets.yaml
================================================
name: '[Single] Upload Release Assets'

on:
  workflow_call:
    inputs:
      tag:
        description: 'Release Tag'
        required: true
        type: string

jobs:
  upload:
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Download all build artifacts
        uses: actions/download-artifact@v8
        with:
          pattern: Clash.Nyanpasu-*
          path: ./release-assets
          merge-multiple: true

      - name: Upload to release
        run: |
          find ./release-assets -type f -print0 | while IFS= read -r -d '' file; do
            echo "Uploading $file"
            gh release upload "${{ inputs.tag }}" "$file" --clobber
          done
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/macos-aarch64.yaml
================================================
name: macOS aarch64 Build

on:
  workflow_dispatch:
env:
  CARGO_INCREMENTAL: 0
  RUST_BACKTRACE: short

jobs:
  macos-aarch64:
    runs-on: macos-15
    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: install Rust nightly
        run: |
          rustup install nightly --profile minimal --no-self-update
          rustup default nightly

      - uses: Swatinem/rust-cache@v2
        with:
          workspaces: './backend/'
          prefix-key: 'rust-nightly'
          key: 'macos-13'
          shared-key: 'release'
      - uses: maxim-lobanov/setup-xcode@v1
        with:
          xcode-version: 16
      - name: install the missing rust target
        run: |
          rustup target add aarch64-apple-darwin

      - name: Install Node
        uses: actions/setup-node@v6
        with:
          node-version: '24'

      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false

      - uses: denoland/setup-deno@v2
        with:
          deno-version: v2.x

      - name: Pnpm install and check
        run: |
          pnpm i
          pnpm prepare:check --arch arm64 --sidecar-host aarch64-apple-darwin

      - name: Tauri build with Upload (cmd)
        env:
          TAG_NAME: dev
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
          TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
        run: |
          pnpm build --target aarch64-apple-darwin
          pnpm upload:osx-aarch64


================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish

on:
  workflow_dispatch:
    inputs:
      versionType:
        type: choice
        description: '<major|minor|patch>'
        required: true
        default: 'patch'
        options:
          - major
          - minor
          - patch

jobs:
  publish:
    name: Publish ${{ inputs.versionType }} release
    permissions:
      # Give the default GITHUB_TOKEN write permission to commit and push the
      # added or changed files to the repository.
      contents: write
      discussions: write
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          fetch-depth: 0
      - name: Prepare Node
        uses: actions/setup-node@v6
        with:
          node-version: 24
      - uses: pnpm/action-setup@v5
        name: Install pnpm
        with:
          run_install: false
      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
      - uses: actions/cache@v5
        name: Setup pnpm cache
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-
      - name: Install
        run: pnpm i
      - name: Install git-cliff
        uses: taiki-e/install-action@git-cliff
      - id: update-version
        shell: bash
        name: Bump version
        # Use npm because yarn is for some reason not able to output only the version name
        run: |
          echo "version=$(pnpm run publish ${{ inputs.versionType }} | tail -n1)" >> $GITHUB_OUTPUT
          git add .
      - name: Generate a changelog for the new version
        shell: bash
        id: build-changelog
        run: |
          touch /tmp/changelog.md
          git-cliff --config  cliff.toml --verbose --strip header --unreleased --tag v${{ steps.update-version.outputs.version }} > /tmp/changelog.md
          if [ $? -eq 0 ]; then
            CONTENT=$(cat /tmp/changelog.md)
            cat /tmp/changelog.md | cat - ./CHANGELOG.md > temp && mv temp ./CHANGELOG.md
            {
              echo 'content<<EOF'
              echo "$CONTENT"
              echo EOF
            } >> $GITHUB_OUTPUT
            echo "version=${{ steps.update-version.outputs.version }}" >> $GITHUB_OUTPUT
          else
            echo "Failed to generate changelog"
            exit 1
          fi
        env:
          GITHUB_REPO: ${{ github.repository }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Commit changes
        uses: stefanzweifel/git-auto-commit-action@v7
        with:
          commit_message: 'chore: bump version to v${{ steps.update-version.outputs.version }}'
          commit_user_name: 'github-actions[bot]'
          commit_user_email: '41898282+github-actions[bot]@users.noreply.github.com'
          tagging_message: 'v${{ steps.update-version.outputs.version }}'
      - name: Release
        uses: softprops/action-gh-release@v2
        with:
          draft: true
          body: ${{steps.build-changelog.outputs.content}}
          name: Clash Nyanpasu v${{steps.update-version.outputs.version}}
          tag_name: 'v${{ steps.update-version.outputs.version }}'
          # target_commitish: ${{ steps.tag.outputs.sha }}


================================================
FILE: .github/workflows/stale.yml
================================================
name: 'Close stale issues and PRs'
on:
  schedule:
    - cron: '30 1 * * *'
  workflow_dispatch:

permissions:
  contents: write # only for delete-branch option
  issues: write
  pull-requests: write

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v10
        with:
          stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
          close-issue-message: 'This issue is closed because it has been stale for 5 days with no activity.'
          days-before-stale: 30
          days-before-close: 5
          stale-issue-label: 'S: Stale'
          only-issue-labels: 'S: Untriaged'


================================================
FILE: .github/workflows/target-dev-build.yaml
================================================
name: '[Entire] Build Developer Version'

on:
  workflow_dispatch:
  schedule:
    - cron: '15 0 * * *' # 每天 08:15 UTC+8 自动构建

concurrency:
  group: dev-build
  cancel-in-progress: true

env:
  CARGO_INCREMENTAL: 0
  RUST_BACKTRACE: short

jobs:
  windows_amd64_build:
    name: Windows x86_64 Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-windows-nsis.yaml
    with:
      portable: true
      nightly: true
      fixed-webview: false
      arch: 'x86_64'
      tag: 'pre-release'
    secrets: inherit

  windows_aarch64_build:
    name: Windows aarch64 Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-windows-nsis.yaml
    with:
      portable: true
      nightly: true
      fixed-webview: false
      arch: 'aarch64'
      tag: 'pre-release'
    secrets: inherit

  windows_i686_build:
    name: Windows i686 Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-windows-nsis.yaml
    with:
      portable: true
      nightly: true
      fixed-webview: false
      arch: 'i686'
      tag: 'pre-release'
    secrets: inherit

  windows_amd64_build_fixed_webview:
    name: Windows x86_64 Build with Fixed WebView
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-windows-nsis.yaml
    with:
      portable: true
      nightly: true
      arch: 'x86_64'
      fixed-webview: true
      tag: 'pre-release'
    secrets: inherit

  windows_aarch64_build_fixed_webview:
    name: Windows aarch64 Build with Fixed WebView
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-windows-nsis.yaml
    with:
      portable: true
      nightly: true
      arch: 'aarch64'
      fixed-webview: true
      tag: 'pre-release'
    secrets: inherit

  windows_i686_build_fixed_webview:
    name: Windows i686 Build with Fixed WebView
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-windows-nsis.yaml
    with:
      portable: true
      nightly: true
      arch: 'i686'
      fixed-webview: true
      tag: 'pre-release'
    secrets: inherit

  linux_amd64_build:
    name: Linux amd64 Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-linux.yaml
    with:
      nightly: true
      tag: 'pre-release'
      arch: 'x86_64'
    secrets: inherit

  linux_i686_build:
    name: Linux i686 Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-linux.yaml
    with:
      nightly: true
      tag: 'pre-release'
      arch: 'i686'
    secrets: inherit

  linux_aarch64_build:
    name: Linux aarch64 Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-linux.yaml
    with:
      nightly: true
      tag: 'pre-release'
      arch: 'aarch64'
    secrets: inherit

  linux_armhf_build:
    name: Linux armhf Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-linux.yaml
    with:
      nightly: true
      tag: 'pre-release'
      arch: 'armhf'
    secrets: inherit

  linux_armel_build:
    name: Linux armel Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-linux.yaml
    with:
      nightly: true
      tag: 'pre-release'
      arch: 'armel'
    secrets: inherit

  macos_amd64_build:
    name: macOS amd64 Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-macos.yaml
    with:
      nightly: true
      aarch64: false
      tag: 'pre-release'
    secrets: inherit

  macos_aarch64_build:
    name: macOS aarch64 Build
    if: ${{ github.event_name == 'workflow_dispatch' || startsWith(github.repository, 'libnyanpasu') }}
    uses: ./.github/workflows/deps-build-macos.yaml
    with:
      nightly: true
      aarch64: true
      tag: 'pre-release'
    secrets: inherit

  update_tag:
    name: Update tag
    needs:
      [
        windows_amd64_build,
        windows_i686_build,
        windows_aarch64_build,
        windows_amd64_build_fixed_webview,
        windows_i686_build_fixed_webview,
        windows_aarch64_build_fixed_webview,
        linux_amd64_build,
        linux_i686_build,
        linux_aarch64_build,
        linux_armhf_build,
        linux_armel_build,
        macos_amd64_build,
        macos_aarch64_build,
      ]
    uses: ./.github/workflows/deps-update-tag.yaml
    with:
      tag: 'pre-release'

  delete_current_releases:
    name: Delete Current Releases
    needs: [update_tag]
    uses: ./.github/workflows/deps-delete-releases.yaml
    with:
      tag: 'pre-release'

  upload_release_assets:
    name: Upload Release Assets
    needs: [delete_current_releases]
    uses: ./.github/workflows/deps-upload-release-assets.yaml
    with:
      tag: 'pre-release'

  updater:
    name: Create Updater
    needs: [upload_release_assets]
    uses: ./.github/workflows/deps-create-updater.yaml
    with:
      nightly: true
    secrets: inherit

  telegram:
    name: Send Release Message to Telegram
    if: startsWith(github.repository, 'libnyanpasu')
    needs: [update_tag]
    uses: ./.github/workflows/deps-message-telegram.yaml
    with:
      nightly: true
      from-local: true
    secrets: inherit


================================================
FILE: .github/workflows/target-release-build.yaml
================================================
name: '[Entire] Build Release Version'

on:
  release:
    types: [published]

env:
  CARGO_INCREMENTAL: 0
  RUST_BACKTRACE: short

jobs:
  windows_build:
    name: Windows Build
    uses: ./.github/workflows/deps-build-windows-nsis.yaml
    with:
      portable: true
      nightly: false
      tag: ${{ github.event.release.tag_name }}
    secrets: inherit

  linux_build:
    name: Linux Build
    uses: ./.github/workflows/deps-build-linux.yaml
    with:
      nightly: false
      tag: ${{ github.event.release.tag_name }}
    secrets: inherit

  macos_amd64_build:
    name: macOS amd64 Build
    uses: ./.github/workflows/deps-build-macos.yaml
    with:
      nightly: false
      aarch64: false
      tag: ${{ github.event.release.tag_name }}
    secrets: inherit

  macos_aarch64_build:
    name: macOS aarch64 Build
    uses: ./.github/workflows/deps-build-macos.yaml
    with:
      nightly: false
      aarch64: true
      tag: ${{ github.event.release.tag_name }}
    secrets: inherit

  upload_release_assets:
    name: Upload Release Assets
    needs: [windows_build, linux_build, macos_amd64_build, macos_aarch64_build]
    uses: ./.github/workflows/deps-upload-release-assets.yaml
    with:
      tag: ${{ github.event.release.tag_name }}

  updater:
    name: Create Updater
    needs: [upload_release_assets]
    uses: ./.github/workflows/deps-create-updater.yaml
    with:
      nightly: false

  telegram:
    name: Send Release Message to Telegram
    if: startsWith(github.repository, 'libnyanpasu')
    needs: [upload_release_assets]
    uses: ./.github/workflows/deps-message-telegram.yaml
    with:
      nightly: false
    secrets: inherit


================================================
FILE: .gitignore
================================================
node_modules
.DS_Store
dist
dist-ssr
*.local
update.json
scripts/_env.sh

.eslintcache
.stylelintcache

tauri.nightly.conf.json
tauri.preview.conf.json

.idea

*.tsbuildinfo


manifest/site/updater/*
!manifest/site/updater/.gitkeep
/backend/tauri/gen/


================================================
FILE: .husky/commit-msg
================================================
pnpm commitlint --edit ${1}


================================================
FILE: .husky/pre-commit
================================================
# If tty is available, apply fix from https://github.com/typicode/husky/issues/968#issuecomment-1176848345
if sh -c ": >/dev/tty" >/dev/null 2>/dev/null; then exec >/dev/tty 2>&1; fi

pnpm lint-staged


================================================
FILE: .lintstagedrc.js
================================================
export default {
  '*.{js,cjs,.mjs,jsx}': (filenames) => {
    const configFiles = [
      '.oxlintrc.json',
      '.lintstagedrc.js',
      'commitlint.config.js',
    ]
    const filtered = filenames.filter(
      (file) => !configFiles.some((config) => file.endsWith(config)),
    )
    if (filtered.length === 0) return []
    return ['prettier --write', 'oxlint --fix']
  },
  'scripts/**/*.{ts,tsx}': [
    'prettier --write',
    'oxlint --fix',
    () => 'tsc -p scripts/tsconfig.json --noEmit',
  ],
  'frontend/interface/**/*.{ts,tsx}': [
    'prettier --write',
    'oxlint --fix',
    () => 'tsc -p frontend/interface/tsconfig.json --noEmit',
  ],
  'frontend/ui/**/*.{ts,tsx}': [
    'prettier --write',
    'oxlint --fix',
    () => 'tsc -p frontend/ui/tsconfig.json --noEmit',
  ],
  'frontend/nyanpasu/**/*.{ts,tsx}': [
    'prettier --write',
    'oxlint --fix',
    () => 'tsc -p frontend/nyanpasu/tsconfig.json --noEmit',
  ],
  'backend/**/*.{rs,toml}': [
    () =>
      'cargo clippy --manifest-path=./backend/Cargo.toml --all-targets --all-features',
    () => 'cargo fmt --manifest-path ./backend/Cargo.toml --all',
    // () => 'cargo test --manifest-path=./backend/Cargo.toml',
    // () => "cargo fmt --manifest-path=./backend/Cargo.toml --all",
    // do not submit untracked files
    // () => 'git add -u',
  ],
  '*.{html,sass,scss,less}': ['prettier --write', 'stylelint --fix'],
  'package.json': ['prettier --write'],
  '*.{md,json,jsonc,json5,yaml,yml,toml}': (filenames) => {
    // exclude frontend/nyanpasu/messages directory
    const filtered = filenames.filter(
      (file) => !file.includes('frontend/nyanpasu/messages/'),
    )
    if (filtered.length === 0) return []
    return `prettier --write ${filtered.join(' ')}`
  },
}


================================================
FILE: .oxlintrc.json
================================================
{
  "$schema": "./node_modules/oxlint/configuration_schema.json",
  "plugins": [],
  "categories": {
    "correctness": "off"
  },
  "env": {
    "builtin": true
  },
  "ignorePatterns": [
    "**/node_modules",
    "**/.DS_Store",
    "**/dist",
    "**/*.local",
    "**/update.json",
    "scripts/_env.sh",
    "**/.eslintcache",
    "**/.stylelintcache",
    "**/tauri.nightly.conf.json",
    "**/tauri.preview.conf.json",
    "**/.idea",
    "**/*.tsbuildinfo",
    "manifest/site/updater/*",
    "!manifest/site/updater/.gitkeep",
    "backend/tauri/gen/",
    "**/index.html",
    "**/node_modules/",
    "node_modules/",
    "backend/",
    "backend/**/target",
    "scripts/deno/**",
    ".lintstagedrc.js",
    "commitlint.config.js"
  ],
  "overrides": [
    {
      "files": ["**/*.{jsx,mjsx,tsx,mtsx}"],
      "rules": {
        "react/display-name": "error",
        "react/jsx-key": "error",
        "react/jsx-no-comment-textnodes": "error",
        "react/jsx-no-duplicate-props": "error",
        "react/jsx-no-target-blank": "error",
        // "react/jsx-no-undef": "error",
        "react/no-children-prop": "error",
        "react/no-danger-with-children": "error",
        "react/no-direct-mutation-state": "error",
        "react/no-find-dom-node": "error",
        "react/no-is-mounted": "error",
        "react/no-render-return-value": "error",
        "react/no-string-refs": "error",
        "react/no-unknown-property": "error",
        "react/no-unsafe": "off",
        "react/react-in-jsx-scope": "error"
      },
      "plugins": ["react"]
    },
    {
      "files": ["**/*.{jsx,mjsx,tsx,mtsx}"],
      "rules": {
        "react-hooks/rules-of-hooks": "error",
        "react-hooks/exhaustive-deps": "warn"
      },
      "plugins": ["react"]
    },
    {
      "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"],
      "rules": {
        "no-var": "warn",
        "accessor-pairs": [
          "error",
          {
            "setWithoutGet": true,
            "enforceForClassMembers": true
          }
        ],
        "array-callback-return": [
          "error",
          {
            "allowImplicit": false,
            "checkForEach": false
          }
        ],
        "constructor-super": "error",
        "curly": ["error", "multi-line"],
        "default-case-last": "error",
        "eqeqeq": [
          "error",
          "always",
          {
            "null": "ignore"
          }
        ],
        "new-cap": [
          "error",
          {
            "newIsCap": true,
            "capIsNew": false,
            "properties": true
          }
        ],
        "no-array-constructor": "error",
        "no-async-promise-executor": "error",
        "no-caller": "error",
        "no-case-declarations": "error",
        "no-class-assign": "error",
        "no-compare-neg-zero": "error",
        "no-cond-assign": "error",
        "no-const-assign": "error",
        "no-constant-condition": [
          "error",
          {
            "checkLoops": false
          }
        ],
        "no-control-regex": "error",
        "no-debugger": "error",
        "no-delete-var": "error",
        "no-dupe-class-members": "error",
        "no-dupe-keys": "error",
        "no-duplicate-case": "error",
        "no-useless-backreference": "error",
        "no-empty": [
          "error",
          {
            "allowEmptyCatch": true
          }
        ],
        "no-empty-character-class": "error",
        "no-empty-pattern": "error",
        "no-eval": "error",
        "no-ex-assign": "error",
        "no-extend-native": "error",
        "no-extra-bind": "error",
        "no-extra-boolean-cast": "error",
        "no-fallthrough": "error",
        "no-func-assign": "error",
        "no-global-assign": "error",
        "no-import-assign": "error",
        "no-invalid-regexp": "error",
        "no-irregular-whitespace": "error",
        "no-iterator": "error",
        "no-labels": [
          "error",
          {
            "allowLoop": false,
            "allowSwitch": false
          }
        ],
        "no-lone-blocks": "error",
        "no-loss-of-precision": "error",
        "no-prototype-builtins": "error",
        "no-useless-catch": "error",
        "no-multi-str": "error",
        "no-new": "error",
        "no-new-func": "error",
        "no-object-constructor": "error",
        "no-new-native-nonconstructor": "error",
        "no-new-wrappers": "error",
        "no-obj-calls": "error",
        "no-proto": "error",
        "no-redeclare": [
          "error",
          {
            "builtinGlobals": false
          }
        ],
        "no-regex-spaces": "error",
        "no-return-assign": ["error", "except-parens"],
        "no-self-assign": [
          "error",
          {
            "props": true
          }
        ],
        "no-self-compare": "error",
        "no-sequences": "error",
        "no-shadow-restricted-names": "error",
        "no-sparse-arrays": "error",
        "no-template-curly-in-string": "error",
        "no-this-before-super": "error",
        "no-throw-literal": "error",
        "no-unexpected-multiline": "error",
        "no-unneeded-ternary": [
          "error",
          {
            "defaultAssignment": false
          }
        ],
        "no-unsafe-finally": "error",
        "no-unsafe-negation": "error",
        "no-unused-expressions": [
          "error",
          {
            "allowShortCircuit": true,
            "allowTernary": true,
            "allowTaggedTemplates": true
          }
        ],
        "no-unused-vars": [
          "error",
          {
            "args": "none",
            "caughtErrors": "none",
            "ignoreRestSiblings": true,
            "vars": "all"
          }
        ],
        "no-useless-call": "error",
        "no-useless-computed-key": "error",
        "no-useless-constructor": "error",
        "no-useless-escape": "error",
        "no-useless-rename": "error",
        "no-useless-return": "error",
        "no-void": "error",
        "no-with": "error",
        "prefer-const": [
          "error",
          {
            "destructuring": "all"
          }
        ],
        "prefer-promise-reject-errors": "error",
        "symbol-description": "error",
        "unicode-bom": ["error", "never"],
        "use-isnan": [
          "error",
          {
            "enforceForSwitchCase": true,
            "enforceForIndexOf": true
          }
        ],
        "valid-typeof": [
          "error",
          {
            "requireStringLiterals": true
          }
        ],
        "yoda": ["error", "never"],
        "import-x/first": "error",
        "import-x/no-absolute-path": [
          "error",
          {
            "esmodule": true,
            "commonjs": true,
            "amd": false
          }
        ],
        "import-x/no-duplicates": "error",
        "import-x/no-named-default": "error",
        "import-x/no-webpack-loader-syntax": "error",
        "promise/param-names": "error",
        "node/no-exports-assign": "error",
        "node/no-new-require": "error"
      },
      "globals": {
        "__dirname": "readonly",
        "__filename": "readonly",
        "AbortController": "readonly",
        "AbortSignal": "readonly",
        "atob": "readonly",
        "Blob": "readonly",
        "BroadcastChannel": "readonly",
        "btoa": "readonly",
        "Buffer": "readonly",
        "ByteLengthQueuingStrategy": "readonly",
        "clearImmediate": "readonly",
        "clearInterval": "readonly",
        "clearTimeout": "readonly",
        "CloseEvent": "readonly",
        "CompressionStream": "readonly",
        "console": "readonly",
        "CountQueuingStrategy": "readonly",
        "crypto": "readonly",
        "Crypto": "readonly",
        "CryptoKey": "readonly",
        "CustomEvent": "readonly",
        "DecompressionStream": "readonly",
        "DOMException": "readonly",
        "Event": "readonly",
        "EventTarget": "readonly",
        "fetch": "readonly",
        "File": "readonly",
        "FormData": "readonly",
        "Headers": "readonly",
        "MessageChannel": "readonly",
        "MessageEvent": "readonly",
        "MessagePort": "readonly",
        "navigator": "readonly",
        "Navigator": "readonly",
        "performance": "readonly",
        "Performance": "readonly",
        "PerformanceEntry": "readonly",
        "PerformanceMark": "readonly",
        "PerformanceMeasure": "readonly",
        "PerformanceObserver": "readonly",
        "PerformanceObserverEntryList": "readonly",
        "PerformanceResourceTiming": "readonly",
        "process": "readonly",
        "queueMicrotask": "readonly",
        "ReadableByteStreamController": "readonly",
        "ReadableStream": "readonly",
        "ReadableStreamBYOBReader": "readonly",
        "ReadableStreamBYOBRequest": "readonly",
        "ReadableStreamDefaultController": "readonly",
        "ReadableStreamDefaultReader": "readonly",
        "Request": "readonly",
        "Response": "readonly",
        "setImmediate": "readonly",
        "setInterval": "readonly",
        "setTimeout": "readonly",
        "structuredClone": "readonly",
        "SubtleCrypto": "readonly",
        "TextDecoder": "readonly",
        "TextDecoderStream": "readonly",
        "TextEncoder": "readonly",
        "TextEncoderStream": "readonly",
        "TransformStream": "readonly",
        "TransformStreamDefaultController": "readonly",
        "URL": "readonly",
        "URLSearchParams": "readonly",
        "WebAssembly": "readonly",
        "WebSocket": "readonly",
        "WritableStream": "readonly",
        "WritableStreamDefaultController": "readonly",
        "WritableStreamDefaultWriter": "readonly",
        "document": "readonly",
        "window": "readonly"
      },
      "env": {
        "commonjs": true,
        "es2024": true
      },
      "plugins": ["import", "node", "promise"]
    },
    {
      "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"],
      "rules": {
        "react/jsx-boolean-value": "error",
        "react/jsx-fragments": ["error", "syntax"],
        "react/jsx-handler-names": "error",
        "react/jsx-key": [
          "error",
          {
            "checkFragmentShorthand": true
          }
        ],
        "react/jsx-no-comment-textnodes": "error",
        "react/jsx-no-duplicate-props": "error",
        "react/jsx-no-target-blank": [
          "error",
          {
            "enforceDynamicLinks": "always"
          }
        ],
        // "react/jsx-no-undef": [
        //   "error",
        //   {
        //     "allowGlobals": true
        //   }
        // ],
        "react/no-children-prop": "error",
        "react/no-danger-with-children": "error",
        "react/no-direct-mutation-state": "error",
        "react/no-find-dom-node": "error",
        "react/no-is-mounted": "error",
        "react/no-string-refs": [
          "error",
          {
            "noTemplateLiterals": true
          }
        ],
        "react/no-unescaped-entities": "off",
        "react/no-render-return-value": "error",
        "react/self-closing-comp": "error"
      },
      "plugins": ["react"]
    },
    {
      "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"],
      "rules": {
        "constructor-super": "off",
        "no-const-assign": "off",
        "no-dupe-class-members": "error",
        "no-dupe-keys": "off",
        "no-func-assign": "off",
        "no-import-assign": "off",
        "no-new-native-nonconstructor": "off",
        "no-obj-calls": "off",
        "no-redeclare": [
          "error",
          {
            "builtinGlobals": false
          }
        ],
        "no-this-before-super": "off",
        "no-unsafe-negation": "off",
        "no-array-constructor": "error",
        "no-loss-of-precision": "error",
        "no-unused-expressions": [
          "error",
          {
            "allowShortCircuit": true,
            "allowTernary": true,
            "allowTaggedTemplates": true
          }
        ],
        "no-unused-vars": [
          "error",
          {
            "args": "none",
            "caughtErrors": "none",
            "ignoreRestSiblings": true,
            "vars": "all"
          }
        ],
        "no-useless-constructor": "error"
      },
      "plugins": ["typescript"]
    },
    {
      "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"],
      "rules": {
        "curly": "off",
        "no-unexpected-multiline": "off",
        "unicorn/empty-brace-spaces": "off",
        "unicorn/no-nested-ternary": "off",
        "unicorn/number-literal-case": "off"
      },
      "plugins": ["unicorn"]
    },
    {
      "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"],
      "rules": {
        "curly": "off",
        "no-unexpected-multiline": "off",
        "unicorn/empty-brace-spaces": "off",
        "unicorn/no-nested-ternary": "off",
        "unicorn/number-literal-case": "off",
        "arrow-body-style": "off"
      },
      "plugins": ["unicorn"]
    },
    {
      "files": ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"],
      "rules": {
        "no-console": "off",
        "no-debugger": "off",
        "no-unused-vars": "warn",
        "react/react-in-jsx-scope": "off"
      },
      "plugins": ["typescript", "react"]
    },
    {
      "files": ["**/*.{ts,tsx,mtsx}"],
      "rules": {
        "constructor-super": "off",
        "no-class-assign": "off",
        "no-const-assign": "off",
        "no-dupe-class-members": "off",
        "no-dupe-keys": "off",
        "no-func-assign": "off",
        "no-import-assign": "off",
        "no-new-native-nonconstructor": "off",
        "no-obj-calls": "off",
        "no-redeclare": "off",
        "no-setter-return": "off",
        "no-this-before-super": "off",
        "no-unsafe-negation": "off",
        "no-var": "error",
        "no-with": "off",
        "prefer-const": "error",
        "prefer-rest-params": "error",
        "prefer-spread": "error"
      }
    },
    {
      "files": ["**/*.{ts,tsx,mtsx}"],
      "rules": {
        "@typescript-eslint/ban-ts-comment": "error",
        "no-array-constructor": "error",
        "@typescript-eslint/no-duplicate-enum-values": "error",
        "@typescript-eslint/no-empty-object-type": "error",
        "@typescript-eslint/no-explicit-any": "error",
        "@typescript-eslint/no-extra-non-null-assertion": "error",
        "@typescript-eslint/no-misused-new": "error",
        "@typescript-eslint/no-namespace": "error",
        "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
        "@typescript-eslint/no-require-imports": "error",
        "@typescript-eslint/no-this-alias": "error",
        "@typescript-eslint/no-unnecessary-type-constraint": "error",
        "@typescript-eslint/no-unsafe-declaration-merging": "error",
        "@typescript-eslint/no-unsafe-function-type": "error",
        "no-unused-expressions": "error",
        "no-unused-vars": "error",
        "@typescript-eslint/no-wrapper-object-types": "error",
        "@typescript-eslint/prefer-as-const": "error",
        "@typescript-eslint/prefer-namespace-keyword": "error",
        "@typescript-eslint/triple-slash-reference": "error"
      },
      "plugins": ["typescript"]
    },
    {
      "files": ["**/*.{ts,tsx,mtsx}"],
      "rules": {
        "@typescript-eslint/no-explicit-any": "warn",
        "no-unused-vars": "warn"
      },
      "plugins": ["typescript"]
    },
    {
      "files": [
        "frontend/nyanpasu/vite.config.ts",
        "frontend/nyanpasu/tailwind.config.ts"
      ],
      "rules": {
        "constructor-super": "off",
        "no-class-assign": "off",
        "no-const-assign": "off",
        "no-dupe-class-members": "off",
        "no-dupe-keys": "off",
        "no-func-assign": "off",
        "no-import-assign": "off",
        "no-new-native-nonconstructor": "off",
        "no-obj-calls": "off",
        "no-redeclare": "off",
        "no-setter-return": "off",
        "no-this-before-super": "off",
        "no-unsafe-negation": "off",
        "no-var": "error",
        "no-with": "off",
        "prefer-const": "error",
        "prefer-rest-params": "error",
        "prefer-spread": "error"
      }
    },
    {
      "files": [
        "frontend/nyanpasu/vite.config.ts",
        "frontend/nyanpasu/tailwind.config.ts"
      ],
      "rules": {
        "@typescript-eslint/ban-ts-comment": "error",
        "no-array-constructor": "error",
        "@typescript-eslint/no-duplicate-enum-values": "error",
        "@typescript-eslint/no-empty-object-type": "error",
        "@typescript-eslint/no-explicit-any": "error",
        "@typescript-eslint/no-extra-non-null-assertion": "error",
        "@typescript-eslint/no-misused-new": "error",
        "@typescript-eslint/no-namespace": "error",
        "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
        "@typescript-eslint/no-require-imports": "error",
        "@typescript-eslint/no-this-alias": "error",
        "@typescript-eslint/no-unnecessary-type-constraint": "error",
        "@typescript-eslint/no-unsafe-declaration-merging": "error",
        "@typescript-eslint/no-unsafe-function-type": "error",
        "no-unused-expressions": "error",
        "no-unused-vars": "error",
        "@typescript-eslint/no-wrapper-object-types": "error",
        "@typescript-eslint/prefer-as-const": "error",
        "@typescript-eslint/prefer-namespace-keyword": "error",
        "@typescript-eslint/triple-slash-reference": "error"
      },
      "plugins": ["typescript"]
    },
    {
      "files": [
        "frontend/nyanpasu/vite.config.ts",
        "frontend/nyanpasu/tailwind.config.ts"
      ],
      "rules": {
        "@typescript-eslint/no-explicit-any": "warn",
        "no-unused-vars": "warn"
      },
      "plugins": ["typescript"]
    },
    {
      "files": ["frontend/ui/vite.config.ts"],
      "rules": {
        "constructor-super": "off",
        "no-class-assign": "off",
        "no-const-assign": "off",
        "no-dupe-class-members": "off",
        "no-dupe-keys": "off",
        "no-func-assign": "off",
        "no-import-assign": "off",
        "no-new-native-nonconstructor": "off",
        "no-obj-calls": "off",
        "no-redeclare": "off",
        "no-setter-return": "off",
        "no-this-before-super": "off",
        "no-unsafe-negation": "off",
        "no-var": "error",
        "no-with": "off",
        "prefer-const": "error",
        "prefer-rest-params": "error",
        "prefer-spread": "error"
      }
    },
    {
      "files": ["frontend/ui/vite.config.ts"],
      "rules": {
        "@typescript-eslint/ban-ts-comment": "error",
        "no-array-constructor": "error",
        "@typescript-eslint/no-duplicate-enum-values": "error",
        "@typescript-eslint/no-empty-object-type": "error",
        "@typescript-eslint/no-explicit-any": "error",
        "@typescript-eslint/no-extra-non-null-assertion": "error",
        "@typescript-eslint/no-misused-new": "error",
        "@typescript-eslint/no-namespace": "error",
        "@typescript-eslint/no-non-null-asserted-optional-chain": "error",
        "@typescript-eslint/no-require-imports": "error",
        "@typescript-eslint/no-this-alias": "error",
        "@typescript-eslint/no-unnecessary-type-constraint": "error",
        "@typescript-eslint/no-unsafe-declaration-merging": "error",
        "@typescript-eslint/no-unsafe-function-type": "error",
        "no-unused-expressions": "error",
        "no-unused-vars": "error",
        "@typescript-eslint/no-wrapper-object-types": "error",
        "@typescript-eslint/prefer-as-const": "error",
        "@typescript-eslint/prefer-namespace-keyword": "error",
        "@typescript-eslint/triple-slash-reference": "error"
      },
      "plugins": ["typescript"]
    },
    {
      "files": ["frontend/ui/vite.config.ts"],
      "rules": {
        "@typescript-eslint/no-explicit-any": "warn",
        "no-unused-vars": "warn"
      },
      "plugins": ["typescript"]
    },
    {
      "files": ["**/*.{jsx,mjsx,tsx,mtsx}"],
      "globals": {
        "AudioWorkletGlobalScope": "readonly",
        "AudioWorkletProcessor": "readonly",
        "currentFrame": "readonly",
        "currentTime": "readonly",
        "registerProcessor": "readonly",
        "sampleRate": "readonly",
        "WorkletGlobalScope": "readonly"
      },
      "env": {
        "browser": true,
        "serviceworker": true
      }
    }
  ]
}


================================================
FILE: .prettierignore
================================================
*.rs
*.lock
**/target/
dist/
**/node_modules/
pnpm-lock.yaml
*.lock
*.wxs
frontend/nyanpasu/src/route-tree.gen.ts
frontend/nyanpasu/auto-imports.d.ts
frontend/nyanpasu/src/paraglide/
frontend/nyanpasu/project.inlang/
backend/tauri/gen/schemas/


================================================
FILE: .prettierrc.cjs
================================================
/** @type {import("prettier").Config} */
module.exports = {
  endOfLine: 'lf',
  semi: false,
  singleQuote: true,
  bracketSpacing: true,
  tabWidth: 2,
  trailingComma: 'all',
  overrides: [
    {
      files: ['tsconfig.json', 'jsconfig.json'],
      options: {
        parser: 'jsonc',
      },
    },
  ],
  importOrder: [
    '^@nyanpasu/ui/(.*)$',
    '^@nyanpasu/interface/(.*)$',
    '^@/(.*)$',
    '^@(.*)$',
    '^[./]',
  ],
  importOrderParserPlugins: ['typescript', 'jsx', 'decorators-legacy'],
  importOrderTypeScriptVersion: '5.0.0',
  plugins: [
    '@ianvs/prettier-plugin-sort-imports',
    'prettier-plugin-tailwindcss',
    'prettier-plugin-toml',
  ],
}


================================================
FILE: .stylelintignore
================================================
dist/
backend/**/target


================================================
FILE: .stylelintrc.js
================================================
import PostCssScss from 'postcss-scss'

export default {
  root: true,
  defaultSeverity: 'error',
  plugins: [
    'stylelint-scss',
    'stylelint-order',
    'stylelint-declaration-block-no-ignored-properties',
  ],
  extends: [
    'stylelint-config-standard',
    'stylelint-config-html/html', // the shareable html config for Stylelint.
    'stylelint-config-recess-order',
    // 'stylelint-config-prettier'
  ],
  rules: {
    'selector-pseudo-class-no-unknown': [
      true,
      { ignorePseudoClasses: ['global'] },
    ],
    'font-family-name-quotes': null,
    'font-family-no-missing-generic-family-keyword': null,
    'max-nesting-depth': [
      10,
      {
        ignore: ['blockless-at-rules', 'pseudo-classes'],
      },
    ],
    'declaration-block-no-duplicate-properties': true,
    'no-duplicate-selectors': true,
    'no-descending-specificity': null,
    'selector-class-pattern': null,
    'value-no-vendor-prefix': [true, { ignoreValues: ['box'] }],
    'at-rule-no-unknown': [
      true,
      {
        ignoreAtRules: [
          'tailwind',
          'unocss',
          'layer',
          'apply',
          'variants',
          'responsive',
          'screen',
          'config',
          'plugin',
          'theme',
          'variant',
          'custom-variant',
          'utility',
          'source',
          'reference',
        ],
      },
    ],
    'at-rule-no-deprecated': [
      true,
      {
        ignoreAtRules: ['apply'],
      },
    ],
  },
  overrides: [
    {
      files: ['**/*.scss', '*.scss'],
      customSyntax: PostCssScss,
      rules: {
        'at-rule-no-unknown': null,
        'import-notation': null,
        'scss/at-rule-no-unknown': [
          true,
          {
            ignoreAtRules: [
              'tailwind',
              'unocss',
              'layer',
              'apply',
              'variants',
              'responsive',
              'screen',
              'config',
              'plugin',
              'theme',
              'variant',
              'custom-variant',
              'utility',
              'source',
              'reference',
            ],
          },
        ],
      },
    },
  ],
}


================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "inlang.vs-code-extension",
    "editorconfig.editorconfig",
    "vadimcn.vscode-lldb",
    "denoland.vscode-deno",
    "esbenp.prettier-vscode",
    "yoavbls.pretty-ts-errors",
    "rust-lang.rust-analyzer",
    "syler.sass-indented",
    "stylelint.vscode-stylelint",
    "bradlc.vscode-tailwindcss",
    "oxc.oxc-vscode",
    "tamasfe.even-better-toml"
  ]
}


================================================
FILE: .vscode/settings.json
================================================
{
  "tailwindCSS.experimental.classRegex": [
    ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"],
    ["cx\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)"]
  ],
  "files.eol": "\n",
  "js/ts.tsdk.path": "node_modules\\typescript\\lib"
}


================================================
FILE: CHANGELOG.md
================================================
## [1.6.1] - 2024-09-07

### ✨ Features

- **dock:** Try to setup macos dock handler by @greenhat616

- **enhance:** Finish all filter test suites by @greenhat616

- **enhance:** Add sequence filter support and partial test suite by @greenhat616

- **enhance:** Add complex filter syntax support by @greenhat616

- **monaco:** Add onValidation before submit, and close #1491 by @greenhat616

- **monaco:** Add yaml config prompt by @greenhat616

- **nsis:** Cleanup reg while uninstall by @greenhat616

- **service:** Add manual prompt for service uninstall, stop, start by @greenhat616

- **service:** Add a manual install prompt while service install failed by @greenhat616

- **tun:** Support auto-route while clash-rs support it by @greenhat616

- Use cross-rs to build aarch64 by @greenhat616

- Try to support linux aarch64 build by @greenhat616

### 🐛 Bug Fixes

- **ci:** Update publish script by @greenhat616

- **dialog:** Position func err by @keiko233

- **nsis:** Cleanup app config and data dir if option is selected by @greenhat616

- **os:** Create no window by @greenhat616

- **shiki:** Shell lang loader by @greenhat616

- Monaco clash config prompt by @greenhat616

- Monaco url resolve issue by @greenhat616

- Try to resolve the yaml schema by @greenhat616

- Try to escape the string by @greenhat616

- Add service install error prompt by @greenhat616

- Shiki import by @greenhat616

- Try to fix create no window by @greenhat616

- Typo by @greenhat616

- Windows nightly build version issue by @greenhat616

- Build by @greenhat616

- Aarch build by @greenhat616

- Dont merge falsy theme settings by @greenhat616

### 🔨 Refactor

- Use @monaco-editor/react instead by @greenhat616

- Service shoutcuts use core manager internal state by @greenhat616

---

**Full Changelog**: https://github.com/libnyanpasu/clash-nyanpasu/compare/v1.6.0...v1.6.1

## [1.6.0] - 2024-08-29

### 💥 Breaking Changes

- Tsconfig options by @keiko233

### ⚡ Performance Improvements

- **hook:** Add debounce callback & do nothing when minimized by @keiko233

- **proxies:** Add useTransition by @keiko233

- **ui:** Memoized children node by @keiko233

- **ui:** Add ref support for BasePage by @keiko233

- Switch log page & rule page to async component by @keiko233

### ✨ Features

- **component:** Add children props support for PaperButton by @keiko233

- **connections:** Lazy load connections and close #1208 by @greenhat616

- **connections:** Add no connection display by @keiko233

- **connections:** New design for ConnectionsPage by @keiko233

- **custom-schema:** Experimental compatible with common clash schema by @greenhat616

- **custom-scheme:** Use one desktop file to process mime by @greenhat616

- **custom-theme:** Background color picker minor tweak by @keiko233

- **dashboard:** Add service status shortcuts card by @keiko233

- **dashboard:** Add proxy shortcuts panel by @keiko233

- **dashboard:** Special grid layout for drawer by @keiko233

- **dashboard:** Add health panel by @keiko233

- **dashboard:** Init Dashboard Page by @keiko233

- **delay-button:** Minor tweaks for animetion by @keiko233

- **downloader:** Make downloader status readable by @greenhat616

- **drawer:** Enable panel collapsible by @keiko233

- **drawer:** Add small size layout by @keiko233

- **drawer:** Minor tweak for small size by @keiko233

- **enhance:** Experimental add lua runner support by @greenhat616

- **enhance:** Make merge process more powerful by @greenhat616

- **experimental:** Initial react compiler support by @keiko233

- **interface:** Initial ClashWS by @keiko233

- **interface:** Add profile js interface by @keiko233

- **interface:** Add current clash mode interface by @keiko233

- **interface:** Add useClashCore hook method by @keiko233

- **interface:** Add app tauri invoke interface by @keiko233

- **interface:** Add profiles api with SWR by @keiko233

- **interface:** Add ClashInfo interface with SWR by @keiko233

- **interface:** Init code by @keiko233

- **ipc:** Replace timing utils ofetch to tokio by @keiko233

- **ipc:** Export delay test and core status call by @greenhat616

- **layout:** Add scrollbar track margin by @keiko233

- **logs:** New design LogsPage by @keiko233

- **macos:** Try to impl dock show/hide api by @greenhat616

- **macos:** Add traffic control offset for macos by @keiko233

- **migration:** Add discard method for discarding changes while migration failed by @greenhat616

- **monaco:** Add monaco types support by @keiko233

- **monaco:** Add typescript language service by @keiko233

- **monaco:** Import lua language support by @keiko233

- **monaco-edit:** Switch to lazy load module by @keiko233

- **monaco-editor:** Support props value changes and language switching by @keiko233

- **monaco-editor:** Support language change on prop by @keiko233

- **motion:** Add lighten animation effects config by @keiko233

- **nyanpasu:** Node list support proxy delay testing by @keiko233

- **nyanpasu:** Import react devtools on dev env by @keiko233

- **nyanpasu:** Use new design Proxies Page by @keiko233

- **nyanpasu:** Import tailwind css by @keiko233

- **nyanpasu:** Experimentally added new settings interface by @keiko233

- **nyanpasu:** Add SettingLegacy component by @keiko233

- **nyanpasu:** Add SettingNyanpasuVersion component by @keiko233

- **nyanpasu:** Add SettingNyanpasuUI component by @keiko233

- **nyanpasu:** Add SettingNyanpasuPath component by @keiko233

- **nyanpasu:** Add SettingNyanpasuPath component by @keiko233

- **nyanpasu:** Add PaperButton component by @keiko233

- **nyanpasu:** Add SettingNyanpasuTasks component by @keiko233

- **nyanpasu:** Add SettingSystemService component by @keiko233

- **nyanpasu:** Add SettingSystemBehavior component by @keiko233

- **nyanpasu:** Add SettingSystemClash component by @keiko233

- **nyanpasu:** Add SettingClashCore component by @keiko233

- **nyanpasu:** Use grid layout for SettingClashWeb by @keiko233

- **nyanpasu:** Add SettingClashField component by @keiko233

- **nyanpasu:** Add SettingClashWeb component by @keiko233

- **nyanpasu:** Add SettingClashExternal component by @keiko233

- **nyanpasu:** Add SettingClashPort component by @keiko233

- **nyanpasu:** Add SettingClashBase component by @keiko233

- **nyanpasu:** Add nyanpasu setting props creator by @keiko233

- **nyanpasu:** Use new theme create method by @keiko233

- **nynapasu:** Add SettingNyanpasuMisc component by @keiko233

- **profiles:** Adapting scroll area & add position animation by @keiko233

- **profiles:** Add diff dialog hint by @greenhat616

- **profiles:** Add max log level triggered notice, and close #1291 by @greenhat616

- **profiles:** Add black touch new option by @greenhat616

- **profiles:** Add text carousel for subscription expires and updated time by @greenhat616

- **profiles:** Minor tweaks & add click card to apply profile by @keiko233

- **profiles:** Add split pane support & minor tweaks by @keiko233

- **profiles:** Profiles new design by @keiko233

- **profiles:** Add proxy chain side page by @keiko233

- **profiles:** Add monaco editor for ProfileItem by @keiko233

- **profiles:** Complete profile operation menu by @keiko233

- **profiles:** Redesign profile cards & new profile editor by @keiko233

- **profiles:** Profile dialog support edit mode by @keiko233

- **profiles:** Add QuickImport text arae component by @keiko233

- **profiles:** Init new profile page by @keiko233

- **providers:** Add proxy provider traffic display support by @keiko233

- **providers:** Support proxies providers by @keiko233

- **providers:** New design ProvidersPage by @keiko233

- **proxies:** Filter proxies nodes by @greenhat616

- **proxies:** Adapting scroll area by @keiko233

- **proxies:** Support proxy group test url by @keiko233

- **proxies:** Add scroll to current node button by @keiko233

- **proxies:** Add node card animation by @keiko233

- **proxies:** Group name transition use framer motion by @keiko233

- **proxies:** Add none proxies tips by @keiko233

- **proxies:** Add virtual scrolling to grid node list by @keiko233

- **proxies:** Group list use virtual scrolling by @keiko233

- **proxies:** Add node list sorting function by @keiko233

- **proxies:** Add group name text transition by @keiko233

- **proxies:** Add diff clash mode page layout by @keiko233

- **proxies:** Support group icon show by @keiko233

- **proxies:** Disable button when type is not selecor by @keiko233

- **rules:** Move filter text input to header by @keiko233

- **rules:** New design for RulesPage by @keiko233

- **service:** Add a service control panel and sidecar check script by @greenhat616

- **setting-clash-base:** Add uwp tools support by @keiko233

- **setting-clash-core:** Support core update by @keiko233

- **setting-clash-field:** Add ClashFieldFilter switch by @keiko233

- **sotre:** Add persistence support by @keiko233

- **theme:** Add MDYPaper style override by @keiko233

- **tray:** Add custom tray icon support by @greenhat616

- **tray:** Add submenu proxies selector by @greenhat616

- **ui:** Md3 style segmented button by @greenhat616

- **ui:** Add scroll area support for side page by @keiko233

- **ui:** Tailwind css support mui breakpoint by @keiko233

- **ui:** Base page use radix-ui scroll area by @keiko233

- **ui:** Dialog allow windows drag when prop full is true by @keiko233

- **ui:** Add full screen style for dialog by @keiko233

- **ui:** Minor tweaks for border radius by @keiko233

- **ui:** Replace Switch to LoadingSwitch for SwitchItem by @keiko233

- **ui:** Init sparkline chart by @keiko233

- **ui:** Add sideClassName props for SidePage component by @keiko233

- **ui:** Add reverse icon props for ExpandMore component by @keiko233

- **ui:** Add MuiLinearProgress material you style override by @keiko233

- **ui:** Add more props support for BaseDialog by @keiko233

- **ui:** Add side toggle animation & reverse layout props by @keiko233

- **ui:** Add SidePage component by @keiko233

- **ui:** Add TextItem component by @keiko233

- **ui:** Add BaseItem component by @keiko233

- **ui:** Add TextFieldProps for NumberItem by @keiko233

- **ui:** Add ExpandMore component by @keiko233

- **ui:** Add loading props support for BaseCard by @keiko233

- **ui:** Add LoadingSwitch component by @keiko233

- **ui:** Add divider props support for BaseDialog by @keiko233

- **ui:** Add BaseDialog component by @keiko233

- **ui:** Add MuiDialog material you override by @keiko233

- **ui:** Add disabled props for MenuItem by @keiko233

- **ui:** Add selectSx for MenuItem component by @keiko233

- **ui:** Add divider props for NumberItem by @keiko233

- **ui:** Add Expand component by @keiko233

- **ui:** Add NumberItem component by @keiko233

- **ui:** Add MenuItem component by @keiko233

- **ui:** Add SwitchItem component by @keiko233

- **ui:** Add BaseCard label props undefined type support by @keiko233

- **ui:** Add MDYBaseCard component by @keiko233

- **ui:** Add MuiSwitch material you override by @keiko233

- **ui:** Add MuiCard & MuiCardContent material you override by @keiko233

- **ui:** Custom breakpoints by @keiko233

- **ui:** Add memo suuport for MDYBasePage header by @keiko233

- **ui:** Add MuiPaper material you override by @keiko233

- **ui:** Add MDYBasePage component by @keiko233

- **ui:** Add MuiButtonGroup material you override by @keiko233

- **ui:** Add MuiButton material you override by @keiko233

- **ui:** Add new mui theme create method for material you by @keiko233

- **updater:** Add a view github button by @greenhat616

- **use-message:** Add nyanpasu title prefix by @keiko233

- **util:** Add a util to collect env infos to submit issues by @greenhat616

- **web:** Replace default utl to Dashboard Page by @keiko233

- **window:** Always on top by @greenhat616

- Minor tweaks for app layout by @keiko233

- Draft updater dialog, and close #1328 by @greenhat616

- Add core updater progress by @keiko233

- Draft core updater progres by @greenhat616

- Add lazy loading for proxies icons by @greenhat616

- Allow select on rule page & log page by @keiko233

- Add clash icon local cache by @greenhat616

- Add runtime config diff dialog by @greenhat616

- Add tun stack selector by @greenhat616

- Impl script esm and async support (#1266) by @greenhat616 in [#1266](https://github.com/libnyanpasu/clash-nyanpasu/pull/1266)

- Should hidden speed chip while no history by @greenhat616

- Add auto migration before app run by @greenhat616

- Add migrations manager and cmds to run migration by @greenhat616

- Add swift feedback button by @greenhat616

- Print better build info by @greenhat616

- Add a experimental mutlithread file download util by @greenhat616

- Experimental add draggable logo by @greenhat616

- Resizable sidebar without config presistant by @greenhat616

- Use node octokit deps by @keiko233

- Profile spec chains support by @greenhat616

- Support lua script type and do a lot refactor by @greenhat616

### 🐛 Bug Fixes

- **app-setting:** Missing fields with template by @keiko233

- **chians:** Throw backend log on use native dialog by @keiko233

- **ci:** Update publish script by @greenhat616

- **ci:** Updater checkout issue by @greenhat616

- **ci:** Updater checkout issue by @greenhat616

- **ci:** Prepend changelog by @greenhat616

- **ci:** Build by @greenhat616

- **clash:** Accpet clash rs status code and handle status error by @greenhat616

- **clash:** Hidden ipv6 setting while clash rs by @greenhat616

- **clash-web:** Fix reversed Boolean value by @keiko233

- **clash-web:** Empty array err by @keiko233

- **config:** Replace enable_auto_check_update by @keiko233

- **connections:** Table type filed err by @keiko233

- **connections:** Host undefined err by @keiko233

- **csp:** Allow loading local cache server assets by @greenhat616

- **csp:** Allow img-src from https by @keiko233

- **custom-scheme:** Xdg-mime default wrong call format by @greenhat616

- **custom-scheme:** Front page redirect by @greenhat616

- **custom-scheme:** Should pass single-instance while launched by custom schema by @greenhat616

- **custom-scheme:** Support mutiple scheme by @greenhat616

- **custom-theme:** Unregister event when the themoe mode is not system by @keiko233

- **custom-theme:** Fix custom theme effect & system theme sync event by @keiko233

- **dashboard:** Data panel layer size err by @keiko233

- **dashboard:** Zero value display err by @keiko233

- **deep link:** Use different identifiers in dev mode by @keiko233

- **deps:** Add misssing deps by @keiko233

- **deps:** Vite-plugin-monaco-editor version err by @keiko233

- **dev:** When dev feature force use dev app dir by @keiko233

- **drawer:** Style prop merge err by @keiko233

- **drawer:** Offset value err by @keiko233

- **drawer:** Small size drawer layout err by @keiko233

- **drawer:** Minor tweaks by @keiko233

- **drawer:** Fix scroll err & hidden scrollbar by @keiko233

- **drawer:** Fix padding & text position by @keiko233

- **enhance:** Rm useless use_lowercase hook, and close #1323 by @greenhat616

- **enhance:** Use oxc ast to wrap function main, close #1298 by @greenhat616

- **enhance:** Should update after editing activated chain item by @greenhat616

- **enhance:** Transform allow lan decrepation by @greenhat616

- **enhance:** Should export default by @greenhat616

- **enhance:** Use indexmap to ensure the process order by @greenhat616

- **enhance:** Mark process fn async by @greenhat616

- **guard:** Remove ipv6 field while core is clash rs by @greenhat616

- **hook:** Replace DebounceFn to ThrottleFn by @keiko233

- **image-resize:** Correct image buffer extraction and resizing logic by @keiko233

- **interface:** Close all connections err by @keiko233

- **interface:** Drop defalut clash mode set by @keiko233

- **interface:** Bad references by @keiko233

- **interface:** Add clash rs version format method by @keiko233

- **interface:** Request clash when use set by @keiko233

- **interface:** Data type err by @keiko233

- **interface:** Typos by @keiko233

- **layout:** Bringup layout control to top layer by @keiko233

- **lint:** Prettier plugin load err by @keiko233

- **linux:** Replace backdrop blur to background opacity by @keiko233

- **linux:** Service controls gui prompt, and close #1443 by @greenhat616

- **linux:** Try to use symbol to fix tray issue by @greenhat616

- **linux:** Use a workaround to make tray select work by @greenhat616

- **linux:** Try to solve sysproxy resolver in appimage by @greenhat616

- **linux:** Try to solve xdg-open in AppImage by @greenhat616

- **logs:** Disable log state err by @keiko233

- **logs:** Logs page freeze by @keiko233

- **logs:** Logs page style err by @keiko233

- **macos:** App icon size by @keiko233

- **macos:** Dialog layout position err by @keiko233

- **macos:** Remove prevent close block in macos by @greenhat616

- **macos:** Rename single instance check path by @greenhat616

- **macos:** Try to use another name to fix create dir error by @greenhat616

- **node-card:** Layout err by @keiko233

- **nsis:** Uninstall service check by @greenhat616

- **nsis:** Stop running core by service while install and rm service dir while uninstall by @greenhat616

- **nyanpasu:** Missing of recoil drop commit by @keiko233

- **nyanpasu:** Missing tailwind css import by @keiko233

- **nyanpasu:** Word typos by @keiko233

- **nyanpasu:** Undfined value err by @keiko233

- **nyanpasu:** Props usage error by @keiko233

- **nyanpasu:** Drop tooltips to fix mui warning by @keiko233

- **portable:** Add nyanpasu service binary by @greenhat616

- **profile:** Dialog padding err by @keiko233

- **profile:** Just invisble progress by @greenhat616

- **profile:** Correctly handle filtering of script types in filterProfiles function by @keiko233

- **profile-viewer:** Replace default profile user agent to clash-nyanpasu by @keiko233

- **profiles:** Dont use sub component to solve the loss data issue by @greenhat616

- **profiles:** Scoped chians state update err by @keiko233

- **profiles:** Add missing open file on chains menu by @keiko233

- **profiles:** Monaco dialog style err by @keiko233

- **profiles:** Fix new chain method err by @keiko233

- **profiles:** Fix profile item selected color on dark mode by @keiko233

- **profiles:** Fix color on dark mode by @keiko233

- **profiles:** Add missing open file method by @keiko233

- **profiles:** Profile traffic percent calculation error by @keiko233

- **profiles:** Add selected props for ProfileItem by @keiko233

- **providers:** Single line layout err by @keiko233

- **proxies:** Proxy node select err & render err by @keiko233

- **proxies:** Sorting cannot be performed in global mode by @keiko233

- **proxies:** Nodecard transition by @keiko233

- **proxies:** Delay sort & timeout string by @keiko233

- **proxies:** Global proxy select err by @keiko233

- **proxies:** Incorrect judgment leading to value transfer error by @keiko233

- **proxies:** Missing import by @keiko233

- **proxies:** Current group get err by @keiko233

- **route:** Reaplce icon dashboard to Dashboard by @keiko233

- **rules:** Rules page display err by @keiko233

- **script:** Decompress nyanpasu-service by @greenhat616

- **script:** Replace appimage to rpm pkg by @keiko233

- **script:** Use latest node version by @keiko233

- **script:** Fix build with nightly prepare script by @keiko233

- **script:** Nightly prepare package.json path by @keiko233

- **scripts:** Typos by @keiko233

- **scripts:** Telegram notify failed to request github repo releases info by @keiko233

- **service:** Restart core while service mode enabled and service state changed by @greenhat616

- **service:** Adapt the current ui by @greenhat616

- **setting:** Service mod toggle by @keiko233

- **setting-clash-core:** Disable initial animetion by @keiko233

- **setting-clash-core:** Add user triger check update loading status by @keiko233

- **setting-nyanpasu-version:** Incorrect value passing by @keiko233

- **setting-system-proxy:** Grid layout breakpoint value by @keiko233

- **setting-web-ui:** Zero value for index err by @keiko233

- **settings:** Version pkg import err by @keiko233

- **settings:** Swr use err by @keiko233

- **settings:** Page masonry layout err by @keiko233

- **settings:** Fix auto check update fileld stats err by @keiko233

- **single-instance:** Should use path instead of namespace in linux by @greenhat616

- **string:** Typo in side-chain.tsx (#999) by @NalCol in [#999](https://github.com/libnyanpasu/clash-nyanpasu/pull/999)

- **styles:** Try to use normalize.css to solve webkit font issue by @greenhat616

- **tauri:** Missing dialog features by @keiko233

- **tauri:** Mixed content err by @keiko233

- **theme:** Fix value merge null err by @keiko233

- **theme:** Update breakpoint value by @keiko233

- **tray:** Add a barrier to try to solve the tray selector issue in linux by @greenhat616

- **tsconfig:** Typescript type reference issue by @keiko233

- **tun:** Compatible with clash rs by @greenhat616

- **ui:** Dialog exit animation err by @keiko233

- **ui:** Close animetion position err by @keiko233

- **ui:** Fix dialog unmount err by @keiko233

- **ui:** Missing dialog z index css prop by @keiko233

- **ui:** Refactor dialog use radix ui portal by @keiko233

- **ui:** Scroll bar hidden on no padding by @keiko233

- **ui:** Base page dom layout err by @keiko233

- **ui:** Add Menu Paper box shadow by @keiko233

- **ui:** Fixed FloatingButton position by @keiko233

- **ui:** Fixed FloatingButton position by @keiko233

- **ui:** Force set FloadtingButton posotion absolute by @keiko233

- **ui:** Drop memo children too by @keiko233

- **ui:** Drop SidePage memo by @keiko233

- **ui:** Hide SidePage side content when there is no side by @keiko233

- **ui:** Drop width for MDYBasePage-content by @keiko233

- **ui:** Fix BasePage content width by @keiko233

- **ui:** Disable loading mask animetion initial for BaseCard by @keiko233

- **ui:** Default unmount dialog modal by @keiko233

- **ui:** Replace padding to Box element by @keiko233

- **ui:** Disable initial animetion for Expand component by @keiko233

- **ui:** Add disabled overlay for MuiSwitch by @keiko233

- **ui:** Fix BaseDialog content height err by @keiko233

- **ui:** Pin MenuItem width by @keiko233

- **ui:** Disbale MuiPaper override by @keiko233

- **updater:** Invaild date issue by @greenhat616

- **updater:** Fetch version.json from main branch (#968) by @aviraxp in [#968](https://github.com/libnyanpasu/clash-nyanpasu/pull/968)

- **util:** Speed test should use desc order by @greenhat616

- **webkit:** Border radius not apply on absolute layout by @keiko233

- **window:** Show window when frontend mounted by @keiko233

- **windows:** Window controller position by @keiko233

- **windows:** Custom scheme call by @greenhat616

- Disable migrate app dir feature in macos, linux by @greenhat616

- Custom scheme url parser in webkit by @greenhat616

- Try to fix read profile state again by @greenhat616

- Add a key to try to solve read profile issue by @greenhat616

- Log time issue, and close #1447 by @greenhat616

- Disable core update check in linux by @greenhat616

- Disable app updater for linux expect AppImage by @greenhat616

- Rm macos unsupport transparent by @greenhat616

- Try to fix cross platform save win state issue by @greenhat616

- Lint by @greenhat616

- Lint by @greenhat616

- Use open_that workaround for appimage by @greenhat616

- React deps by @greenhat616

- Check button issue by @greenhat616

- Lint by @greenhat616

- Profile runtime config button color by @greenhat616

- Nsis build issue by @greenhat616

- Exhaustive-deps lint by @greenhat616

- Disable react complier lint until it fixes bug by @greenhat616

- Add 172.16.0.0/12 system proxy passby on windows (#1405) by @Remonli in [#1405](https://github.com/libnyanpasu/clash-nyanpasu/pull/1405)

- Use tauri client for asn request by @greenhat616

- Proxies nodes list update issue, and close #1402 by @greenhat616

- Lint by @greenhat616

- Mutate core version while updater finished by @greenhat616

- Updater replace issue, and close #1377 by @greenhat616

- Script prepare gh token by @greenhat616

- Lint by @greenhat616

- Build by @greenhat616

- Build by @greenhat616

- Build by @greenhat616

- Lint by @greenhat616

- Lint by @greenhat616

- Try to fix ts project import issue by @greenhat616

- Ts project settings (#1394) by @greenhat616 in [#1394](https://github.com/libnyanpasu/clash-nyanpasu/pull/1394)

- Ts project lint by @greenhat616

- Correct the update order to ensure the script changes get applied by @greenhat616

- Clash config select issue, and close #1303 by @greenhat616

- Spawn orientation random updater id by @keiko233

- Throw single instance create error by @greenhat616

- Connection page lazy loading by @greenhat616

- Config detect, and close #1305 by @greenhat616

- Quick import submit when enter press by @greenhat616

- Icon loader should not lazy by @greenhat616

- Icon lazy image by @greenhat616

- Show a error dialog while check latest cores error, and close #1302 by @greenhat616

- Issues by @greenhat616

- Marquee by @greenhat616

- No need retry while os error 232 by @greenhat616

- Not save clash overrides config, close #1295 by @greenhat616

- Fix broken pipe causing too many logs #637 by @4o3F

- Fix tray not able to reset by @4o3F

- Update sysproxy-rs to support KDE by @4o3F

- Fix url scheme issue #902 by @4o3F

- Use window open counter to prevent double-click opening the window immediately by @greenhat616

- Should update match by @greenhat616

- Make profile yaml file to be formatted by serde yaml by @greenhat616

- Update config while patch profile scoped chain by @greenhat616

- Lint by @greenhat616

- Lint by @greenhat616

- Lint by @greenhat616

- Clash rs core switch by @greenhat616

- Patch profile chains by @greenhat616

- Patch profile chains by @greenhat616

- Lint by @greenhat616

- Ignore deleteConnection error while applying new profile by @greenhat616

- Make port strategy check better by @greenhat616

- No exit code on unix platform by @greenhat616

- Try to solve the migration failed issue by @greenhat616

- Lint by @greenhat616

- Ui service control and updater path by @greenhat616

- Cleanup codes by @greenhat616

- Lint by @greenhat616

- Lint by @greenhat616

- Skip migration while home dir is not exist, and close #1235 by @greenhat616

- Skip migration while home dir is not exist, and close #1235 by @greenhat616

- Lint by @greenhat616

- Should create data dir and config dir when fetch it if not exist by @greenhat616

- Styles by @greenhat616

- Lint by @greenhat616

- Migration panic by @greenhat616

- Migrate all upcoming migrations while pending by @greenhat616

- Migration missing dirs touch by @keiko233

- Left container scrollbar gutter (#1225) by @fu050409 in [#1225](https://github.com/libnyanpasu/clash-nyanpasu/pull/1225)

- Add quote prefix, and solve the undefined issue by @greenhat616

- Drawer resize panel style by @keiko233

- Lint by @greenhat616

- Lint by @greenhat616

- Build by @keiko233

- Build by @keiko233

- Missing export by @keiko233

- Lint in linux by @greenhat616

- Enhance process panic while profiles is empty by @greenhat616

- Fmt by @greenhat616

- Log path by @greenhat616

- Use webview2-com-bridge to solve ra crash issue by @greenhat616

- Lint by @greenhat616

- Minor issues (#884) by @greenhat616 in [#884](https://github.com/libnyanpasu/clash-nyanpasu/pull/884)

- Ci by @greenhat616

- Lint by @greenhat616

- Vite plugin monaco editor overrides by @greenhat616

- Fix issue #776 by @4o3F

- Mac x64 use mihomo compatible core (#773) by @Sakurasan

- Lint by @keiko233

- Change storage_db name by @4o3F

- Fix database creation issue by @4o3F

### 📚 Documentation

- **readme:** Add nyanpasu 1.6.0 label by @keiko233

- **readme:** Fix resource path err by @keiko233

- Fix dev build shields card link err by @keiko233

- Update screenshot & clean up docs by @keiko233

### 🔨 Refactor

- **chains:** Use bitflags instead of custom support struct by @greenhat616

- **connections:** Drop mui/x-data-grid & use material-react-table by @keiko233

- **core:** Use new core manager from nyanpasu utils to prepare for new nyanpasu service by @greenhat616

- **custom-scheme:** Use nonblocking io and create window if window is not exist by @greenhat616

- **dashboard:** Split health panel by @keiko233

- **dirs:** Split home_dir into config_dir and data_dir by @greenhat616

- **drawer:** Use react-split-grid replace react-resizable-panels by @keiko233

- **frontend:** Make monorepo by @keiko233

- **hook:** Use-breakpoint hook with react-use by @keiko233

- **hook:** Optimize useBreakpoint hook to reduce unnecessary updates by @keiko233

- **hotkeys:** First draft hotkeys setting dialog by @greenhat616

- **interface!:** Increase code readability by @keiko233

- **interface/service:** Tauri interface writing by @keiko233

- **layout:** New layout design by @keiko233

- **nsis:** Use nsis's built-in com plugin instead of ApplicationID plugin (#9606) by @amrbashir

- **profiles:** Chians component by @keiko233

- **proxies:** Drop memo use effert to update by @keiko233

- **proxies:** Delay button using tailwind css and memo by @keiko233

- **script:** Manifest generator script by @keiko233

- **script:** Resource check script by @keiko233

- **service:** Add new service backend support by @greenhat616

- **theme:** Migrating to CSS theme variables by @keiko233

- **ui:** Drop mui dialog & use redix-ui with framer motion by @keiko233

- **updater:** Support speedtest and updater concurrency by @greenhat616

- Drop async component use react suspense by @keiko233

- Proxies page use new interface by @keiko233

- Refactor rocksdb into redb, this should solve #452 by @4o3F in [#755](https://github.com/libnyanpasu/clash-nyanpasu/pull/755)

- Refactor rocksdb into redb, this should fix #452 by @4o3F

---

## New Contributors

- @Remonli made their first contribution in [#1405](https://github.com/libnyanpasu/clash-nyanpasu/pull/1405)
- @fu050409 made their first contribution in [#1225](https://github.com/libnyanpasu/clash-nyanpasu/pull/1225)
- @NalCol made their first contribution in [#999](https://github.com/libnyanpasu/clash-nyanpasu/pull/999)
- @aviraxp made their first contribution in [#968](https://github.com/libnyanpasu/clash-nyanpasu/pull/968)
- @amrbashir made their first contribution
- @Sakurasan made their first contribution

**Full Changelog**: https://github.com/libnyanpasu/clash-nyanpasu/compare/v1.5.1...v1.6.0

## [1.5.1] - 2024-04-08

### ✨ Features

- **backend:** Allow to hide tray selector (#626) by @greenhat616 in [#626](https://github.com/libnyanpasu/clash-nyanpasu/pull/626)

- **config:** Support custom app dir in windows (#582) by @greenhat616 in [#582](https://github.com/libnyanpasu/clash-nyanpasu/pull/582)

- **custom-schema:** Add support for name and desc fields by @greenhat616

- Perf motion transition by @keiko233

- Lock rustup toolchain to stable channel by @4o3F

- New design log page by @keiko233

- New desigin rules page by @keiko233

- Improve WebSocket reconnection in useWebsocket hook by @keiko233

### 🐛 Bug Fixes

- **bundler/nsis:** Don't use /R flag on installation dir by @keiko233

- **chains:** Only guard fields should be overwritten (#629) by @greenhat616 in [#629](https://github.com/libnyanpasu/clash-nyanpasu/pull/629)

- **cmds:** Migrate custom app dir typo (#628) by @greenhat616 in [#628](https://github.com/libnyanpasu/clash-nyanpasu/pull/628)

- **cmds:** `path` in changing app dir call (#591) by @greenhat616 in [#591](https://github.com/libnyanpasu/clash-nyanpasu/pull/591)

- **docs:** Fix url typos by @keiko233

- **notification:** Unexpected `}` (#563) by @WOSHIZHAZHA120 in [#563](https://github.com/libnyanpasu/clash-nyanpasu/pull/563)

- Revert previous commit by @greenhat616

- Subscription info parse issue, closing #729 by @greenhat616

- Fix misinterprete of tauri's application args by @4o3F

- Missing github repo context by @keiko233

- Try to add a launch command to make restart application work by @greenhat616

- Try to use delayed singleton check to make restart app work by @greenhat616

- Panic while quit application by @greenhat616

- Restart application not work by @greenhat616

- Fix migration issue for path with space by @4o3F

- Fix migration child process issue by @4o3F

- Fix rename permission issue by @4o3F

- Connection page NaN and first enter animation by @greenhat616

- Use shiki intead of shikiji by @greenhat616

- Use clash verge rev patch to resolve Content-Disposition Filename issue, closing #703 by @greenhat616

- Lint by @greenhat616

- Command path by @greenhat616

- Draft patch to resolve custom app config migration by @greenhat616

- Proxy groups virtuoso also overscan by @keiko233

- Top item no padding by @keiko233

- Use overscan to prevent blank scrolling by @keiko233

- Profiles when drag sort container scroll style by @keiko233

- Profile-box border radius value by @keiko233

- Slinet start get_window err by @keiko233

- MDYSwitch-thumb size by @keiko233

- Build by @keiko233

- Disable webview2 SwipeNavigation by @keiko233

- Fix wrong window size and position by @4o3F

- Fix single instance check failing on macos by @4o3F

### 📚 Documentation

- Add clash-verge-rev acknowledgement by @greenhat616

- Add twitter img tag by @keiko233

- Add license img tag by @keiko233

- Align center tag imgs by @keiko233

- Update readme by @keiko233

- Update issues template by @greenhat616

### 🔨 Refactor

- Use lazy load routes to improve performance by @greenhat616

---

## New Contributors

- @WOSHIZHAZHA120 made their first contribution in [#563](https://github.com/libnyanpasu/clash-nyanpasu/pull/563)

**Full Changelog**: https://github.com/libnyanpasu/clash-nyanpasu/compare/v1.5.0...v1.5.1

## [1.5.0] - 2024-03-03

### 💥 Breaking Changes

- **backend:** Add tray proxies selector support (#417) by @greenhat616 in [#417](https://github.com/libnyanpasu/clash-nyanpasu/pull/417)

- **clash:** Add default core secret and impl port checker before clash start (#533) by @greenhat616 in [#533](https://github.com/libnyanpasu/clash-nyanpasu/pull/533)

### ✨ Features

- **config:** Add migration for old config dir (#419) by @4o3F in [#419](https://github.com/libnyanpasu/clash-nyanpasu/pull/419)

- **connection:** Allow filter out process name by @greenhat616

- **locale:** Use system locale as default (#437) by @greenhat616 in [#437](https://github.com/libnyanpasu/clash-nyanpasu/pull/437)

- **tray:** Add tray icon resize logic to improve icon rendering (#540) by @greenhat616 in [#540](https://github.com/libnyanpasu/clash-nyanpasu/pull/540)

- **tray:** Add diff check for system tray partial update (#477) by @4o3F in [#477](https://github.com/libnyanpasu/clash-nyanpasu/pull/477)

- Custom schema support (#516) by @4o3F in [#516](https://github.com/libnyanpasu/clash-nyanpasu/pull/516)

- Add Auto Check Updates Switch by @keiko233

- Refactor UpdateViewer by @keiko233

- OnCheckUpdate button supports loading animation & refactoring error removal notification using dialog by @keiko233

- Add margin for SettingItem extra element by @keiko233

- Add useMessage hook by @keiko233

- Refactor GuardStatus & support loading status by @keiko233

- MDYSwitch support loading prop by @keiko233

- Add MDYSwitch & replace all Switches with MDYSwitch by @keiko233

- Color select use MuiColorInput by @keiko233

- Make profile material you by @keiko233

- New style design profile item drag sort by @keiko233

### 🐛 Bug Fixes

- **ci:** Replace github workflow token by @keiko233

- **config:** Fix config migration (#433) by @4o3F in [#433](https://github.com/libnyanpasu/clash-nyanpasu/pull/433)

- **custom-schema:** Fix schema not working for new opening and dialog not showing with certain route (#534) by @4o3F in [#534](https://github.com/libnyanpasu/clash-nyanpasu/pull/534)

- **deps:** Update rust crates by @greenhat616

- **macos:** Use rfd to prevent panic by @greenhat616

- **nsis:** Should not stop verge service while updating by @greenhat616

- **proxies:** Use indexmap instead to correct order by @greenhat616

- **proxies:** Reduce tray updating interval by @greenhat616

- **tray:** Use base64 encoded id to fix item not found issue by @greenhat616

- **tray:** Should disable click expect Selector and Fallback type by @greenhat616

- **tray:** Proxies updating deadlock by @greenhat616

- Release ci by @greenhat616

- Release ci by @greenhat616

- Fix wrong window position and size with multiple screen by @4o3F

- Resolve save windows state event by @greenhat616

- Media screen value typos by @keiko233

- Layout error when window width is small by @keiko233

- Lint by @greenhat616

- Line breaks typos by @keiko233

- MDYSwitch switchBase padding value by @keiko233

- Lint by @greenhat616

- Fmt by @greenhat616

- Build issue by @greenhat616

- Config migration issue by @greenhat616

- Ci by @greenhat616

- Proxy item box-shadow err by @keiko233

### 🔨 Refactor

- **clash:** Move api and core manager into one mod (#411) by @greenhat616 in [#411](https://github.com/libnyanpasu/clash-nyanpasu/pull/411)

- **i18n:** Change backend localization to rust-i18n (#425) by @4o3F in [#425](https://github.com/libnyanpasu/clash-nyanpasu/pull/425)

- **logging:** Use `tracing` instead of `log4rs` (#486) by @greenhat616 in [#486](https://github.com/libnyanpasu/clash-nyanpasu/pull/486)

- **proxies:** Proxies hash and diff logic by @greenhat616

- **single-instance:** Refactor single instance check (#499) by @4o3F in [#499](https://github.com/libnyanpasu/clash-nyanpasu/pull/499)

---

**Full Changelog**: https://github.com/libnyanpasu/clash-nyanpasu/compare/v1.4.5...v1.5.0

## [1.4.5] - 2024-02-08

### 💥 Breaking Changes

- **nsis:** Switch to both installMode by @greenhat616

- **updater:** Use nsis instead of msi by @greenhat616

### 🐛 Bug Fixes

- **bundle:** Instance is running while updating app (#393) by @greenhat616 in [#393](https://github.com/libnyanpasu/clash-nyanpasu/pull/393)

- **bundler:** Kill processes while updating in windows by @greenhat616

- **ci:** Daily updater issue (#392) by @greenhat616 in [#392](https://github.com/libnyanpasu/clash-nyanpasu/pull/392)

- **ci:** Nightly updater issue by @greenhat616

- **nsis:** Kill nyanpasu processes while updating (#403) by @greenhat616 in [#403](https://github.com/libnyanpasu/clash-nyanpasu/pull/403)

- Portable issues (#395) by @greenhat616 in [#395](https://github.com/libnyanpasu/clash-nyanpasu/pull/395)

- Minimize icon is wrong while resize window (#394) by @greenhat616 in [#394](https://github.com/libnyanpasu/clash-nyanpasu/pull/394)

- Sort connection in numerical comparison for `Download`, `DL Speed`, etc (#367) by @Jeremy-Hibiki in [#367](https://github.com/libnyanpasu/clash-nyanpasu/pull/367)

- Resources missing by @greenhat616 in [#354](https://github.com/libnyanpasu/clash-nyanpasu/pull/354)

---

## New Contributors

- @Jeremy-Hibiki made their first contribution in [#367](https://github.com/libnyanpasu/clash-nyanpasu/pull/367)

**Full Changelog**: https://github.com/libnyanpasu/clash-nyanpasu/compare/v1.4.4...v1.4.5

## [1.4.4] - 2024-01-29

### 🐛 Bug Fixes

- **backend:** Fix deadlock issue on config (#312) by @4o3F in [#312](https://github.com/libnyanpasu/clash-nyanpasu/pull/312)

- **ci:** Publish & updater by @greenhat616

- **ci:** Should generate manifest in dev branch for compatible with <= 1.4.3 (#292) by @greenhat616 in [#292](https://github.com/libnyanpasu/clash-nyanpasu/pull/292)

- **deps:** Update deps (#294) by @greenhat616 in [#294](https://github.com/libnyanpasu/clash-nyanpasu/pull/294)

- **portable:** Portable bundle issue (#335) by @greenhat616 in [#335](https://github.com/libnyanpasu/clash-nyanpasu/pull/335)

- **portable:** Do not use system notification api while app is portable (#334) by @greenhat616 in [#334](https://github.com/libnyanpasu/clash-nyanpasu/pull/334)

- **updater:** Use release body as updater note (#333) by @greenhat616 in [#333](https://github.com/libnyanpasu/clash-nyanpasu/pull/333)

- Use if let instead (#309) by @greenhat616 in [#309](https://github.com/libnyanpasu/clash-nyanpasu/pull/309)

### 📚 Documentation

- Add ArchLinux AUR install suggestion (#293) by @Kimiblock in [#293](https://github.com/libnyanpasu/clash-nyanpasu/pull/293)

### 🔨 Refactor

- **backend:** Improve code robustness (#303) by @greenhat616 in [#303](https://github.com/libnyanpasu/clash-nyanpasu/pull/303)

---

**Full Changelog**: https://github.com/libnyanpasu/clash-nyanpasu/compare/v1.4.3...v1.4.4

## [1.4.3] - 2024-01-20

### ✨ Features

- New release workflow (#284) by @greenhat616 in [#284](https://github.com/libnyanpasu/clash-nyanpasu/pull/284)

- Proxies ui minor tweaks by @keiko233

- Make proxies material you by @keiko233

### 🐛 Bug Fixes

- **ci:** Pin rust version to 1.74.1 (#213) by @greenhat616 in [#213](https://github.com/libnyanpasu/clash-nyanpasu/pull/213)

- **ci:** Use latest action by @greenhat616

- **ci:** Use dev commit hash when schedule dispatch by @greenhat616

- **log:** Incorrect color in light mode by @greenhat616

- **rocksdb:** Use TransactionDB instead of OptimisticTransactionDB (#194) by @greenhat616 in [#194](https://github.com/libnyanpasu/clash-nyanpasu/pull/194)

- **updater:** Should use nyanpasu proxy or system proxy when performing request (#273) by @greenhat616 in [#273](https://github.com/libnyanpasu/clash-nyanpasu/pull/273)

- **updater:** Add status code judge by @greenhat616

- **updater:** Allow to use elevated permission to copy and override core by @greenhat616

- **vite:** Rm useless shikiji langs support (#267) by @greenhat616 in [#267](https://github.com/libnyanpasu/clash-nyanpasu/pull/267)

- Release ci by @greenhat616

- Publish ci by @greenhat616

- Notification premission check (#263) by @greenhat616 in [#263](https://github.com/libnyanpasu/clash-nyanpasu/pull/263)

- Notification fallback (#262) by @greenhat616 in [#262](https://github.com/libnyanpasu/clash-nyanpasu/pull/262)

- Stable channel build issue (#248) by @greenhat616 in [#248](https://github.com/libnyanpasu/clash-nyanpasu/pull/248)

- Virtuoso scroller bottom not padding by @keiko233

- Windrag err by @keiko233

- Same text color for `REJECT-DROP` policy as `REJECT` (#236) by @xkww3n in [#236](https://github.com/libnyanpasu/clash-nyanpasu/pull/236)

- Enable_tun block the process (#232) by @dyxushuai

- #212 by @greenhat616

- Lint by @greenhat616

- Updater by @greenhat616

- Dark mode flash in win by @greenhat616

- Open file, closing #197 by @greenhat616

- Add a panic hook to collect logs and show a dialog (#191) by @greenhat616 in [#191](https://github.com/libnyanpasu/clash-nyanpasu/pull/191)

---

## New Contributors

- @xkww3n made their first contribution in [#236](https://github.com/libnyanpasu/clash-nyanpasu/pull/236)

**Full Changelog**: https://github.com/libnyanpasu/clash-nyanpasu/compare/v1.4.2...v1.4.3

## [1.4.2] - 2023-12-24

### ✨ Features

- **updater:** Finish ui by @greenhat616

- **updater:** Finish core updater backend by @greenhat616

- Use christmas logo by @keiko233

- Auto add dns according this method by @yswtrue

- Backport concurrency of latency test by @greenhat616

- Auto log clear by @greenhat616

- Nightly build with updater by @greenhat616

- Rules providers by @greenhat616

- Improve animations by @greenhat616

- Quick logs collect by @greenhat616

- Bundled mihomo alpha by @greenhat616

- New style win tray icon & add blue icon when tun enable by @keiko233

### 🐛 Bug Fixes

- **ci:** Release build by @greenhat616

- **ci:** Updater and dev build by @greenhat616

- **dialog:** Align center and overflow issue by @greenhat616

- **lint:** Toml fmt by @greenhat616

- **resources:** Win service support and mihomo alpha version proxy by @greenhat616

- **updater:** Copy logic by @greenhat616

- **window:** Preserve window state before window minimized by @greenhat616

- **window:** Add a workaround for close event in windows by @greenhat616

- Minor tweak base-content width by @keiko233

- Shikiji text wrapping err by @keiko233

- Dark shikiji display color err by @keiko233

- Pin runas to v1.0.0 by @greenhat616

- Lint by @greenhat616

- Bump nightly version after publish by @greenhat616

- I18n resources by @greenhat616

- Format ansi in log viewer by @greenhat616

- Delay color, closing #124 by @greenhat616

- #96 by @greenhat616

- #92 by @greenhat616

- Lint by @greenhat616

- Ci by @greenhat616

- Ci by @greenhat616

- Ci by @greenhat616

- Dev build branch issue by @greenhat616

- Icon issues, close #55 by @greenhat616

- Use a workaroud to reduce #59 by @greenhat616

- Win state by @greenhat616

### 📚 Documentation

- Put issue config into effect (#148) by @txyyh in [#148](https://github.com/libnyanpasu/clash-nyanpasu/pull/148)

- Upload missing issue config by @txyyh

- Update issues template & upload ISSUE.md by @keiko233

### 🔨 Refactor

- **tasks:** Provide a universal abstract layer for task managing (#15) by @greenhat616

- Profile updater by @greenhat616

---

## New Contributors

- @yswtrue made their first contribution
- @txyyh made their first contribution in [#148](https://github.com/libnyanpasu/clash-nyanpasu/pull/148)

**Full Changelog**: https://github.com/libnyanpasu/clash-nyanpasu/compare/v1.4.1...v1.4.2

## [1.4.1] - 2023-12-06

### ✨ Features

- **transition:** Add none and transparent variants by @greenhat616

- Use twemoji to display flags in win (#48) by @greenhat616 in [#48](https://github.com/libnyanpasu/clash-nyanpasu/pull/48)

- Add page transition mode and duration options by @keiko233 in [#42](https://github.com/libnyanpasu/clash-nyanpasu/pull/42)

- Add page transition duration options by @greenhat616

- Add page transition mode switch by @greenhat616

- Use framer-motion for smooth page transition by @greenhat616

- Support new clash field by @greenhat616

- Support drag profile item (#36) by @Kuingsmile in [#36](https://github.com/libnyanpasu/clash-nyanpasu/pull/36)

- Use tauri notification api by @keiko233

- Update new clash.meta close #20 (#30) by @Kuingsmile in [#30](https://github.com/libnyanpasu/clash-nyanpasu/pull/30)

- Support random mixed port (#29) by @Kuingsmile in [#29](https://github.com/libnyanpasu/clash-nyanpasu/pull/29)

- Use workspace in backend by @greenhat616

- New style win tray icon by @keiko233

- Add tooltip for tray (#24) by @Kuingsmile in [#24](https://github.com/libnyanpasu/clash-nyanpasu/pull/24)

- Experimental support `clash-rs` (#23) by @greenhat616 in [#23](https://github.com/libnyanpasu/clash-nyanpasu/pull/23)

- Add UWP tool support, fix install service bug (#19) by @Kuingsmile in [#19](https://github.com/libnyanpasu/clash-nyanpasu/pull/19)

### 🐛 Bug Fixes

- Taskbar maximize toggle icon state (#46) by @greenhat616 in [#46](https://github.com/libnyanpasu/clash-nyanpasu/pull/46)

- Missing scss import by @greenhat616

- Lint by @greenhat616

- Lint by @greenhat616

- Workflow script typos by @keiko233

- Osx-aarch64-upload bundlePath typos by @keiko233

- Portable target dir by @keiko233

- Portable missing clash-rs core by @keiko233

- Item col width too narrow by @keiko233

- I18n typos by @keiko233

### 📚 Documentation

- Add preview gif by @keiko233

### 🔨 Refactor

- **scripts:** Use ts and consola instead by @greenhat616

- Use `workspace` in backend by @keiko233 in [#28](https://github.com/libnyanpasu/clash-nyanpasu/pull/28)

---

## New Contributors

- @Kuingsmile made their first contribution in [#36](https://github.com/libnyanpasu/clash-nyanpasu/pull/36)

**Full Changelog**: https://github.com/libnyanpasu/clash-nyanpasu/compare/v1.4.0...v1.4.1

## [1.4.0] - 2023-11-15

### ✅ Testing

- Windows service by @zzzgydi

### ✨ Features

- **layout:** Add logo & update style by @zzzgydi

- **macOS:** Support cmd+w and cmd+q by @zzzgydi

- **proxy:** Finish proxy page ui and api support by @zzzgydi

- **style:** Adjust style impl by @zzzgydi

- **system tray:** Support switch rule/global/direct/script mode in system tray by @Limsanity

- **traffic:** Api support & adjust by @zzzgydi

- Minor tweaks by @keiko233

- Nyanpasu Misc by @keiko233

- Add baseContentIn animation by @keiko233

- Add route transition by @keiko233

- Material You! by @keiko233

- Default disable ipv6 by @keiko233

- Default enable unified-delay & tcp-concurrent with use meta core by @keiko233

- Support copy CMD & PowerShell proxy env by @keiko233

- Default use meta core by @keiko233

- Update Clash Default bypass addrs by @keiko233

- Theme: change color by @keiko233

- Profiles: import btn with loading state by @keiko233

- Profile-viewer: handleOk with loading state by @keiko233

- Base-dialog: okBtn use LoadingButton by @keiko233

- Nyanpasu Misc by @keiko233

- Theme support modify --background-color by @keiko233

- Settings use Grid layout by @keiko233

- Add Connections Info to ConnectionsPage by @keiko233

- ClashFieldViewer BaseDialog maxHeight usage percentage (#813) by @keiko233

- Add Open Dashboard to the hotkey, close #723 by @zzzgydi

- Add check for updates button, close #766 by @zzzgydi

- Add paste and clear icon by @zzzgydi

- Subscription URL TextField use multiline (#761) by @keiko233

- Show loading when change profile by @zzzgydi

- Support proxy provider update by @zzzgydi

- Add repo link by @zzzgydi

- Support clash meta memory usage display by @zzzgydi

- Supports show connection detail by @zzzgydi

- Update connection table with wider process column and click to show full detail (#696) by @whitemirror33

- More trace logs by @zzzgydi

- Add Russian Language (#697) by @shvchk

- Center window when out of monitor by @zzzgydi

- Support copy environment variable by @zzzgydi

- Save window size and position by @zzzgydi

- App log level add silent by @zzzgydi

- Overwrite resource file according to file modified by @zzzgydi

- Support app log level settings by @zzzgydi

- Use polkit to elevate permission instaed of sudo (#678) by @Kimiblock

- Add unified-delay field by @zzzgydi

- Add error boundary to the app root by @zzzgydi

- Show tray icon variants in different status (#537) by @w568w

- Auto restart core after grand permission by @zzzgydi

- Add restart core button by @zzzgydi

- Support update all profiles by @zzzgydi

- Support to grant permission to clash core by @zzzgydi

- Support clash fields filter in ui by @zzzgydi

- Open dir on the tray by @zzzgydi

- Support to disable clash fields filter by @zzzgydi

- Adjust macOS window style by @zzzgydi

- Recover core after panic, close #353 by @zzzgydi

- Use decorations in Linux, close #354 by @zzzgydi

- Auto proxy layout column by @zzzgydi

- Support to change proxy layout column by @zzzgydi

- Support to open core dir by @zzzgydi

- Profile page ui by @zzzgydi

- Save some fields in the runtime config, close #292 by @zzzgydi

- Add meta feature by @zzzgydi

- Display proxy group type by @zzzgydi

- Add use clash hook by @zzzgydi

- Guard the mixed-port and external-controller by @zzzgydi

- Adjust builtin script and support meta guard script by @zzzgydi

- Disable script mode when use clash meta by @zzzgydi

- Check config when change core by @zzzgydi

- Support builtin script for enhanced mode by @zzzgydi

- Adjust profiles page ui by @zzzgydi

- Optimize proxy page ui by @zzzgydi

- Add error boundary by @zzzgydi

- Adjust clash log by @zzzgydi

- Add draft by @zzzgydi

- Change default latency test url by @zzzgydi

- Auto close connection when proxy changed by @zzzgydi

- Support to change external controller by @zzzgydi

- Add sub-rules by @zzzgydi

- Add version on tray by @zzzgydi

- Add animation by @zzzgydi

- Add animation to ProfileNew component (#252) by @angryLid

- Check remote profile field by @zzzgydi

- System tray support zh language by @zzzgydi

- Display delay check result timely by @zzzgydi

- Update profile with system proxy/clash proxy by @zzzgydi

- Change global mode ui, close #226 by @zzzgydi

- Default user agent same with app version by @zzzgydi

- Optimize config feedback by @zzzgydi

- Show connections with table layout by @zzzgydi

- Show loading on proxy group delay check by @zzzgydi

- Add chains[0] and process to connections display (#205) by @riverscn

- Adjust connection page ui by @zzzgydi

- Yaml merge key by @zzzgydi

- Toggle log ws by @zzzgydi

- Add rule page by @zzzgydi

- Hotkey viewer by @zzzgydi

- Refresh ui when hotkey clicked by @zzzgydi

- Support hotkey (wip) by @zzzgydi

- Hide window on macos by @zzzgydi

- System proxy setting by @zzzgydi

- Change default singleton port and support to change the port by @zzzgydi

- Log info by @zzzgydi

- Kill clash by pid by @zzzgydi

- Change clash port in dialog by @zzzgydi

- Add proxy item check loading by @zzzgydi

- Compatible with proxy providers health check by @zzzgydi

- Add empty ui by @zzzgydi

- Complete i18n by @zzzgydi

- Windows portable version do not check update by @zzzgydi

- Adjust clash info parsing logs by @zzzgydi

- Adjust runtime config by @zzzgydi

- Support restart app on tray by @zzzgydi

- Optimize profile page by @zzzgydi

- Refactor by @zzzgydi

- Adjust tun mode config by @zzzgydi

- Reimplement enhanced mode by @zzzgydi

- Use rquickjs crate by @zzzgydi

- Reimplement enhanced mode by @zzzgydi

- Finish clash field control by @zzzgydi

- Clash field viewer wip by @zzzgydi

- Support web ui by @zzzgydi

- Adjust setting page style by @zzzgydi

- Runtime config viewer by @zzzgydi

- Improve log rule by @zzzgydi

- Theme mode support follows system by @zzzgydi

- Improve yaml file error log by @zzzgydi

- Save proxy page state by @zzzgydi

- Light mode wip (#96) by @ctaoist

- Clash meta core supports by @zzzgydi

- Script mode by @zzzgydi

- Clash meta core support (wip) by @zzzgydi

- Reduce gpu usage when hidden by @zzzgydi

- Interval update from now field by @zzzgydi

- Adjust theme by @zzzgydi

- Supports more remote headers close #81 by @zzzgydi

- Check the remote profile by @zzzgydi

- Fix typo by tianyoulan

- Remove trailing comma by tianyoulan

- Remove outdated config by tianyoulan

- Windows service mode ui by @zzzgydi

- Add some commands by @zzzgydi

- Windows service mode by @zzzgydi

- Add update interval by @zzzgydi

- Refactor and supports cron tasks by @zzzgydi

- Supports cron update profiles by @zzzgydi

- Optimize traffic graph quadratic curve by @zzzgydi

- Optimize the animation of the traffic graph by @zzzgydi

- System tray add tun mode by @zzzgydi

- Supports change config dir by @zzzgydi

- Add default user agent by @zzzgydi

- Connections page supports filter by @zzzgydi

- Log page supports filter by @zzzgydi

- Optimize delay checker concurrency strategy by @zzzgydi

- Support sort proxy node and custom test url by @zzzgydi

- Handle remote clash config fields by @zzzgydi

- Add text color by @zzzgydi

- Control final tun config by @zzzgydi

- Support css injection by @zzzgydi

- Support theme setting by @zzzgydi

- Add text color by @zzzgydi

- Add theme setting by @zzzgydi

- Enhanced mode supports more fields by @zzzgydi

- Supports edit profile file by @zzzgydi

- Supports silent start by @zzzgydi

- Use crate open by @zzzgydi

- Enhance connections display order by @zzzgydi

- Save global selected by @zzzgydi

- System tray supports system proxy setting by @zzzgydi

- Prevent context menu on Windows close #22 by @zzzgydi

- Create local profile with selected file by @zzzgydi

- Reduce the impact of the enhanced mode by @zzzgydi

- Parse update log by @zzzgydi

- Fill i18n by @zzzgydi

- Dayjs i18n by @zzzgydi

- Connections page simply support by @zzzgydi

- Add wintun.dll by default by @zzzgydi

- Event emit when clash config update by @zzzgydi

- I18n supports by @zzzgydi

- Change open command on linux by @zzzgydi

- Support more options for remote profile by @zzzgydi

- Linux system proxy by @zzzgydi

- Enhance profile status by @zzzgydi

- Menu item refresh enhanced mode by @zzzgydi

- Profile enhanced mode by @zzzgydi

- Profile enhanced ui by @zzzgydi

- Profile item adjust by @zzzgydi

- Enhanced profile (wip) by @zzzgydi

- Edit profile item by @zzzgydi

- Use nanoid by @zzzgydi

- Compatible profile config by @zzzgydi

- Native menu supports by @zzzgydi

- Filter proxy and display type by @zzzgydi

- Use lock fn by @zzzgydi

- Refactor proxy page by @zzzgydi

- Proxy group auto scroll to current by @zzzgydi

- Clash tun mode supports by @zzzgydi

- Use enhanced guard-state by @zzzgydi

- Guard state supports debounce guard by @zzzgydi

- Adjust clash version display by @zzzgydi

- Hide command window by @zzzgydi

- Enhance log data by @zzzgydi

- Change window style by @zzzgydi

- Fill verge template by @zzzgydi

- Enable customize guard duration by @zzzgydi

- System proxy guard by @zzzgydi

- Enable show or hide traffic graph by @zzzgydi

- Traffic line graph by @zzzgydi

- Adjust profile item ui by @zzzgydi

- Adjust fetch profile url by @zzzgydi

- Inline config file template by @zzzgydi

- Kill sidecars when update app by @zzzgydi

- Delete file by @zzzgydi

- Lock some async functions by @zzzgydi

- Support open dir by @zzzgydi

- Change allow list by @zzzgydi

- Support check delay by @zzzgydi

- Scroll to proxy item by @zzzgydi

- Edit system proxy bypass by @zzzgydi

- Disable user select by @zzzgydi

- New profile able to edit name and desc by @zzzgydi

- Update tauri version by @zzzgydi

- Display clash core version by @zzzgydi

- Adjust profile item menu by @zzzgydi

- Profile item ui by @zzzgydi

- Support new profile by @zzzgydi

- Support open command for viewing by @zzzgydi

- Global proxies use virtual list by @zzzgydi

- Enable change proxy mode by @zzzgydi

- Update styles by @zzzgydi

- Manage clash mode by @zzzgydi

- Change system porxy when changed port by @zzzgydi

- Enable change mixed port by @zzzgydi

- Manage clash config by @zzzgydi

- Enable update clash info by @zzzgydi

- Rename edit as view by @zzzgydi

- Test auto gen update.json ci by @zzzgydi

- Adjust setting typography by @zzzgydi

- Enable force select profile by @zzzgydi

- Support edit profile item by @zzzgydi

- Adjust control ui by @zzzgydi

- Update profile supports noproxy by @zzzgydi

- Rename page by @zzzgydi

- Refactor and adjust ui by @zzzgydi

- Rm some commands by @zzzgydi

- Change type by @zzzgydi

- Supports auto launch on macos and windows by @zzzgydi

- Adjust proxy page by @zzzgydi

- Press esc hide the window by @zzzgydi

- Show system proxy info by @zzzgydi

- Support blur window by @zzzgydi

- Windows support startup by @zzzgydi

- Window self startup by @zzzgydi

- Use tauri updater by @zzzgydi

- Support update checker by @zzzgydi

- Support macos proxy config by @zzzgydi

- Custom window decorations by @zzzgydi

- Profiles add menu and delete button by @zzzgydi

- Delay put profiles and retry by @zzzgydi

- Window Send and Sync by @zzzgydi

- Support restart sidecar tray event by @zzzgydi

- Prevent click same by @zzzgydi

- Scroller stable by @zzzgydi

- Compatible with macos(wip) by @zzzgydi

- Record selected proxy by @zzzgydi

- Display version by @zzzgydi

- Enhance system proxy setting by @zzzgydi

- Profile loading animation by @zzzgydi

- Github actions support by @zzzgydi

- Rename profile page by @zzzgydi

- Add pre-dev script by @zzzgydi

- Implement a simple singleton process by @zzzgydi

- Use paper for list bg by @zzzgydi

- Supprt log ui by @zzzgydi

- Auto update profiles by @zzzgydi

- Proxy page use swr by @zzzgydi

- Profile item support display updated time by @zzzgydi

- Change the log level order by @zzzgydi

- Only put some fields by @zzzgydi

- Setting page by @zzzgydi

- Add serval commands by @zzzgydi

- Change log file format by @zzzgydi

- Adjust code by @zzzgydi

- Refactor commands and support update profile by @zzzgydi

- System proxy command demo by @zzzgydi

- Support set system proxy command by @zzzgydi

- Profiles ui and put profile support by @zzzgydi

- Remove sec field by @zzzgydi

- Put profile works by @zzzgydi

- Distinguish level notice by @zzzgydi

- Add use-notice hook by @zzzgydi

- Pus_clash_profile support `secret` field by @zzzgydi

- Add put_profiles cmd by @zzzgydi

- Update rule page by @zzzgydi

- Use external controller field by @zzzgydi

- Lock profiles file and support more cmds by @zzzgydi

- Put new profile to clash by default by @zzzgydi

- Enhance clash caller & support more commands by @zzzgydi

- Read clash config by @zzzgydi

- Get profile file name from response by @zzzgydi

- Change the naming strategy by @zzzgydi

- Change rule page by @zzzgydi

- Import profile support by @zzzgydi

- Init verge config struct by @zzzgydi

- Add some clash api by @zzzgydi

- Optimize the proxy group order by @zzzgydi

- Refactor system proxy config by @zzzgydi

- Use resources dir to save files by @zzzgydi

- New setting page by @zzzgydi

- Sort groups by @zzzgydi

- Add favicon by @zzzgydi

- Update icons by @zzzgydi

- Update layout style by @zzzgydi

- Support dark mode by @zzzgydi

- Set min windows by @zzzgydi

- Finish some features by @zzzgydi

- Finish main layout by @zzzgydi

- Use vite by @zzzgydi

### 🐛 Bug Fixes

- **icon:** Change ico file to fix windows tray by @zzzgydi

- **macos:** Set auto launch path to application by @zzzgydi

- **style:** Reduce my by @zzzgydi

- Rust lint by @keiko233

- Valid with unified-delay & tcp-concurrent by @keiko233

- Touchpad scrolling causes blank area to appear by @keiko233

- Typos by @keiko233

- Download clash core from backup repo by @keiko233

- Use meta Country.mmdb by @keiko233

- I18n by @zzzgydi

- Fix page undefined exception, close #770 by @zzzgydi

- Set min window size, close #734 by @zzzgydi

- Rm debug code by @zzzgydi

- Use sudo when pkexec not found by @zzzgydi

- Remove div by @zzzgydi

- List key by @zzzgydi

- Websocket disconnect when window focus by @zzzgydi

- Try fix undefined error by @zzzgydi

- Blurry tray icon in Windows by @zzzgydi

- Enable context menu in editable element by @zzzgydi

- Save window size and pos in Windows by @zzzgydi

- Optimize traffic graph high CPU usage when hidden by @zzzgydi

- Remove fallback group select status, close #659 by @zzzgydi

- Error boundary with key by @zzzgydi

- Connections is null by @zzzgydi

- Font family not works in some interfaces, close #639 by @zzzgydi

- EncodeURIComponent secret by @zzzgydi

- Encode controller secret, close #601 by @zzzgydi

- Linux not change icon by @zzzgydi

- Try fix blank error by @zzzgydi

- Close all connections when change mode by @zzzgydi

- Macos not change icon by @zzzgydi

- Error message null by @zzzgydi

- Profile data undefined error, close #566 by @zzzgydi

- Import url error (#543) by @yettera765

- Linux DEFAULT_BYPASS (#503) by @Mr-Spade

- Open file with vscode by @zzzgydi

- Do not render div as a descendant of p (#494) by @tatiustaitus

- Use replace instead by @zzzgydi

- Escape path space by @zzzgydi

- Escape the space in path (#451) by @dyxushuai

- Add target os linux by @zzzgydi

- Appimage path unwrap panic by @zzzgydi

- Remove esc key listener in macOS by @zzzgydi

- Adjust style by @zzzgydi

- Adjust swr option by @zzzgydi

- Infinite retry when websocket error by @zzzgydi

- Type error by @zzzgydi

- Do not parse log except the clash core by @zzzgydi

- Field sort for filter by @zzzgydi

- Add meta fields by @zzzgydi

- Runtime config user select by @zzzgydi

- App_handle as_ref by @zzzgydi

- Use crate by @zzzgydi

- Appimage auto launch, close #403 by @zzzgydi

- Compatible with UTF8 BOM, close #283 by @zzzgydi

- Use selected proxy after profile changed by @zzzgydi

- Error log by @zzzgydi

- Adjust fields order by @zzzgydi

- Add meta fields by @zzzgydi

- Add os platform value by @zzzgydi

- Reconnect traffic websocket by @zzzgydi

- Parse bytes precision, close #334 by @zzzgydi

- Trigger new profile dialog, close #356 by @zzzgydi

- Parse log cause panic by @zzzgydi

- Avoid setting login item repeatedly, close #326 by @zzzgydi

- Adjust code by @zzzgydi

- Adjust delay check concurrency by @zzzgydi

- Change default column to auto by @zzzgydi

- Change default app version by @zzzgydi

- Adjust rule ui by @zzzgydi

- Adjust log ui by @zzzgydi

- Keep delay data by @zzzgydi

- Use list item button by @zzzgydi

- Proxy item style by @zzzgydi

- Virtuoso no work in legacy browsers (#318) by @moeshin

- Adjust ui by @zzzgydi

- Refresh websocket by @zzzgydi

- Adjust ui by @zzzgydi

- Parse bytes base 1024 by @zzzgydi

- Add clash fields by @zzzgydi

- Direct mode hide proxies by @zzzgydi

- Profile can not edit by @zzzgydi

- Parse logger time by @zzzgydi

- Adjust service mode ui by @zzzgydi

- Adjust style by @zzzgydi

- Check hotkey and optimize hotkey input, close #287 by @zzzgydi

- Mutex dead lock by @zzzgydi

- Adjust item ui by @zzzgydi

- Regenerate config before change core by @zzzgydi

- Close connections when profile change by @zzzgydi

- Lint by @zzzgydi

- Windows service mode by @zzzgydi

- Init config file by @zzzgydi

- Service mode error and fallback to sidecar by @zzzgydi

- Service mode viewer ui by @zzzgydi

- Create theme error, close #294 by @zzzgydi

- MatchMedia().addEventListener #258 (#296) by @moeshin

- Check config by @zzzgydi

- Show global when no rule groups by @zzzgydi

- Service viewer ref by @zzzgydi

- Service ref error by @zzzgydi

- Group proxies render list is null by @zzzgydi

- Pretty bytes by @zzzgydi

- Use verge hook by @zzzgydi

- Adjust notice by @zzzgydi

- Windows issue by @zzzgydi

- Change dev log level by @zzzgydi

- Patch clash config by @zzzgydi

- Cmds params by @zzzgydi

- Adjust singleton detect by @zzzgydi

- Change template by @zzzgydi

- Copy resource file by @zzzgydi

- MediaQueryList addEventListener polyfill by @zzzgydi

- Change default tun dns-hijack by @zzzgydi

- Something by @zzzgydi

- Provider proxy sort by delay by @zzzgydi

- Profile item menu ui dense by @zzzgydi

- Disable auto scroll to proxy by @zzzgydi

- Check remote profile by @zzzgydi

- Remove smoother by @zzzgydi

- Icon button color by @zzzgydi

- Init system proxy correctly by @zzzgydi

- Open file by @zzzgydi

- Reset proxy by @zzzgydi

- Init config error by @zzzgydi

- Adjust reset proxy by @zzzgydi

- Adjust code by @zzzgydi

- Add https proxy by @zzzgydi

- Auto scroll into view when sorted proxies changed by @zzzgydi

- Refresh proxies interval, close #235 by @zzzgydi

- Style by @zzzgydi

- Fetch profile with system proxy, close #249 by @zzzgydi

- The profile is replaced when the request fails. (#246) by @loosheng

- Default dns config by @zzzgydi

- Kill clash when exit in service mode, close #241 by @zzzgydi

- Icon button color inherit by @zzzgydi

- App version to string by @zzzgydi

- Break loop when core terminated by @zzzgydi

- Api error handle by @zzzgydi

- Clash meta not load geoip, close #212 by @zzzgydi

- Sort proxy during loading, close #221 by @zzzgydi

- Not create windows when enable slient start by @zzzgydi

- Root background color by @zzzgydi

- Create window correctly by @zzzgydi

- Set_activation_policy by @zzzgydi

- Disable spell check by @zzzgydi

- Adjust init launch on dev by @zzzgydi

- Ignore disable auto launch error by @zzzgydi

- I18n by @zzzgydi

- Style by @zzzgydi

- Save enable log on localstorage by @zzzgydi

- Typo in api.ts (#207) by @Priestch

- Refresh clash ui await patch by @zzzgydi

- Remove dead code by @zzzgydi

- Style by @zzzgydi

- Handle is none by @zzzgydi

- Unused by @zzzgydi

- Style by @zzzgydi

- Windows logo size by @zzzgydi

- Do not kill sidecar during updating by @zzzgydi

- Delay update config by @zzzgydi

- Reduce logo size by @zzzgydi

- Window center by @zzzgydi

- Log level warn value by @zzzgydi

- Increase delay checker concurrency by @zzzgydi

- External controller allow lan by @zzzgydi

- Remove useless optimizations by @zzzgydi

- Reduce unsafe unwrap by @zzzgydi

- Timer restore at app launch by @FoundTheWOUT

- Adjust log text by @zzzgydi

- Only script profile can display console by @zzzgydi

- Fill button title attr by @zzzgydi

- Do not reset system proxy when consistent by @zzzgydi

- Adjust web ui item style by @zzzgydi

- Clash field state error by @zzzgydi

- Badge color error by @zzzgydi

- Web ui port value error by @zzzgydi

- Delay show window by @zzzgydi

- Adjust dialog action button variant by @zzzgydi

- Script code error by @zzzgydi

- Script exception handle by @zzzgydi

- Change fields by @zzzgydi

- Silent start (#150) by @FoundTheWOUT

- Save profile when update by @zzzgydi

- List compare wrong by @zzzgydi

- Button color by @zzzgydi

- Limit theme mode value by @zzzgydi

- Add valid clash field by @zzzgydi

- Icon style by @zzzgydi

- Reduce unwrap by @zzzgydi

- Import mod by @zzzgydi

- Add tray separator by @zzzgydi

- Instantiate core after init app, close #122 by @zzzgydi

- Rm macOS transition props by @zzzgydi

- Improve external-controller parse and log by @zzzgydi

- Show windows on click by @zzzgydi

- Adjust update profile notice error by @zzzgydi

- Style issue on mac by @zzzgydi

- Check script run on all OS by @FoundTheWOUT

- MacOS disable transparent by @zzzgydi

- Window transparent and can not get hwnd by @zzzgydi

- Create main window by @zzzgydi

- Adjust notice by @zzzgydi

- Label text by @zzzgydi

- Icon path by @zzzgydi

- Icon issue by @zzzgydi

- Notice ui blocking by @zzzgydi

- Service mode error by @zzzgydi

- Win11 drag lag by @zzzgydi

- Rm unwrap by @zzzgydi

- Edit profile info by @zzzgydi

- Change window default size by @zzzgydi

- Change service installer and uninstaller by @zzzgydi

- Adjust connection scroll by @zzzgydi

- Adjust something by @zzzgydi

- Adjust debounce wait time by @zzzgydi

- Adjust dns config by @zzzgydi

- Traffic graph adapt to different fps by @zzzgydi

- Optimize clash launch by @zzzgydi

- Reset after exit by @zzzgydi

- Adjust code by @zzzgydi

- Adjust log by @zzzgydi

- Check button hover style by @zzzgydi

- Icon button color inherit by @zzzgydi

- Remove the lonely zero by @zzzgydi

- I18n add value by @zzzgydi

- Proxy page first render by @zzzgydi

- Console warning by @zzzgydi

- Icon button title by @zzzgydi

- MacOS transition flickers close #47 by @zzzgydi

- Csp image data by @zzzgydi

- Close dialog after save by @zzzgydi

- Change to deep copy by @zzzgydi

- Window style close #45 by @zzzgydi

- Manage global proxy correctly by @zzzgydi

- Tauri csp by @zzzgydi

- Windows style by @zzzgydi

- Update state by @zzzgydi

- Profile item loading state by @zzzgydi

- Adjust windows style by @zzzgydi

- Change mixed port error by @zzzgydi

- Auto launch path by @zzzgydi

- Tun mode config by @zzzgydi

- Adjsut open cmd error by @zzzgydi

- Parse external-controller by @zzzgydi

- Config file case close #18 by @zzzgydi

- Patch item option by @zzzgydi

- User agent not works by @zzzgydi

- External-controller by @zzzgydi

- Change proxy bypass on mac by @zzzgydi

- Kill sidecars after install still in test by @zzzgydi

- Log some error by @zzzgydi

- Apply_blur parameter by @zzzgydi

- Limit enhanced profile range by @zzzgydi

- Profile updated field by @zzzgydi

- Profile field check by @zzzgydi

- Create dir panic by @zzzgydi

- Only error when selected by @zzzgydi

- Enhanced profile consistency by @zzzgydi

- Simply compatible with proxy providers by @zzzgydi

- Component warning by @zzzgydi

- When updater failed by @zzzgydi

- Log file by @zzzgydi

- Result by @zzzgydi

- Cover profile extra by @zzzgydi

- Display menu only on macos by @zzzgydi

- Proxy global showType by @zzzgydi

- Use full clash config by @zzzgydi

- Reconnect websocket when restart clash by @zzzgydi

- Wrong exe path by @zzzgydi

- Patch verge config by @zzzgydi

- Fetch profile panic by @zzzgydi

- Spawn command by @zzzgydi

- Import error by @zzzgydi

- Not open file when new profile by @zzzgydi

- Reset value correctly by @zzzgydi

- Something by @zzzgydi

- Menu without fragment by @zzzgydi

- Proxy list error by @zzzgydi

- Something by @zzzgydi

- Macos auto launch fail by @zzzgydi

- Type error by @zzzgydi

- Restart clash should update something by @zzzgydi

- Script error... by @zzzgydi

- Tag error by @zzzgydi

- Script error by @zzzgydi

- Remove cargo test by @zzzgydi

- Reduce proxy item height by @zzzgydi

- Put profile request with no proxy by @zzzgydi

- Ci strategy by @zzzgydi

- Version update error by @zzzgydi

- Text by @zzzgydi

- Update profile after restart clash by @zzzgydi

- Get proxies multiple times by @zzzgydi

- Delete profile item command by @zzzgydi

- Initialize profiles state by @zzzgydi

- Item header bgcolor by @zzzgydi

- Null type error by @zzzgydi

- Api loading delay by @zzzgydi

- Mutate at the same time may be wrong by @zzzgydi

- Port value not rerender by @zzzgydi

- Change log file format by @zzzgydi

- Proxy bypass add <local> by @zzzgydi

- Sidecar dir by @zzzgydi

- Web resource outDir by @zzzgydi

- Use io by @zzzgydi

### 💅 Styling

- Resolve formatting problem by @Limsanity

### 📚 Documentation

- Fix img width by @zzzgydi

- Update by @zzzgydi

### 🔨 Refactor

- **hotkey:** Use tauri global shortcut by @zzzgydi

- Copy_clash_env by @keiko233

- Adjust base components export by @zzzgydi

- Adjust setting dialog component by @zzzgydi

- Done by @zzzgydi

- Adjust all path methods and reduce unwrap by @zzzgydi

- Rm code by @zzzgydi

- Fix by @zzzgydi

- Rm dead code by @zzzgydi

- For windows by @zzzgydi

- Wip by @zzzgydi

- Wip by @zzzgydi

- Wip by @zzzgydi

- Rm update item block_on by @zzzgydi

- Fix by @zzzgydi

- Fix by @zzzgydi

- Wip by @zzzgydi

- Optimize by @zzzgydi

- Ts path alias by @zzzgydi

- Mode manage on tray by @zzzgydi

- Verge by @zzzgydi

- Wip by @zzzgydi

- Mutex by @zzzgydi

- Wip by @zzzgydi

- Proxy head by @zzzgydi

- Update profile menu by @zzzgydi

- Enhanced mode ui component by @zzzgydi

- Ui theme by @zzzgydi

- Optimize enhance mode strategy by @zzzgydi

- Profile config by @zzzgydi

- Use anyhow to handle error by @zzzgydi

- Rename profiles & command state by @zzzgydi

- Something by @zzzgydi

- Notice caller by @zzzgydi

- Setting page by @zzzgydi

- Rename by @zzzgydi

- Impl structs methods by @zzzgydi

- Impl as struct methods by @zzzgydi

- Api and command by @zzzgydi

- Import profile by @zzzgydi

- Adjust dirs structure by @zzzgydi

---

## New Contributors

- @zzzgydi made their first contribution
- @whitemirror33 made their first contribution
- @shvchk made their first contribution
- @w568w made their first contribution
- @yettera765 made their first contribution
- @tatiustaitus made their first contribution
- @Mr-Spade made their first contribution
- @solancer made their first contribution
- @me1ting made their first contribution
- @boatrainlsz made their first contribution
- @inRm3D made their first contribution
- @moeshin made their first contribution
- @angryLid made their first contribution
- @loosheng made their first contribution
- @ParticleG made their first contribution
- @HougeLangley made their first contribution
- @Priestch made their first contribution
- @riverscn made their first contribution
- @FoundTheWOUT made their first contribution
- @Limsanity made their first contribution
- @ctaoist made their first contribution
- @ made their first contribution
- @ttys3 made their first contribution


================================================
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
i@elaina.moe.
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 to Nyanpasu

Welcome to **Nyanpasu** development!  
To ensure the quality and stability of the project, please read this guide carefully. Even if you are new, you can follow these steps to set up the development environment, write code, and submit contributions.

---

## 1. Development Guidelines

Before submitting code, please follow these rules:

### 1. Code Style Checks

| Language                | Tools                       |
| ----------------------- | --------------------------- |
| JavaScript / TypeScript | ESLint, Prettier, Stylelint |
| Rust                    | Clippy, Rustfmt             |

- ⚠️ **Ensure there are no style errors before committing**
- ❌ **Do not use `git commit -n` or skip checks**, CI will automatically enforce style validation

### 2. Submission Requirements

- Avoid submitting useless code, files, or folders
- For major refactors or new features, open an **Issue** first for discussion
- If unsure about implementation or have questions, communicate in **Issue** or **PR**

### 3. Communication & Collaboration

- Respect others' code and opinions
- Keep commit messages and PR descriptions clear
- All discussions should be on GitHub for transparency and traceability

---

## 2. Environment Requirements

To ensure the project runs correctly locally, the following dependencies are required.

### 1. Required Dependencies

| Tool    | Version  | Link                                                        | Notes                                         |
| ------- | -------- | ----------------------------------------------------------- | --------------------------------------------- |
| Rust    | ≥ 1.78   | [Official Install](https://www.rust-lang.org/tools/install) | Stable version; use MSVC toolchain on Windows |
| Node.js | ≥ 20 LTS | [Official Site](https://nodejs.org/)                        | Install LTS or Latest version                 |
| pnpm    | ≥ 9      | [Official Documentation](https://pnpm.io/)                  | Node.js package manager                       |
| git     | Latest   | [Official Site](https://git-scm.com/)                       | Version control                               |

### 2. Build Dependencies

| Tool  | Link                                                                              | Notes                               |
| ----- | --------------------------------------------------------------------------------- | ----------------------------------- |
| cmake | [Official Site](https://cmake.org/)                                               | Required by `zip` crate             |
| llvm  | [Official Site](https://llvm.org/)                                                | Required by `rquickjs` or `rocksdb` |
| patch | [Windows Installation Guide](https://gnuwin32.sourceforge.net/packages/patch.htm) | Required by `rquickjs`              |

### 3. Windows Special Requirements

- Use **Administrator privileges** when opening the project for the first time; `patch` requires admin rights
- Recommended to install `gsudo` (via `scoop`, `choco`, or `winget`)
- Always use the **MSVC toolchain** on Windows
- 💡 Admin privileges are only needed for initial setup; normal terminal is fine for daily development

---

## 3. Pre-Development Setup

Before starting development, initialize the environment and download required resources.

### 1. Install Frontend Dependencies

```bash
pnpm i
```

> This installs all frontend dependencies including UI components, toolchains, and testing tools.

### 2. Download Core & Resource Files

```
pnpm prepare:check
```

> This command downloads binaries like `sidecar` and `resource` to ensure the project runs properly

If files are missing or you want to force update:

```
pnpm prepare:check --force
```

💡 **Tip**: Configure terminal proxy if network issues occur

---

## 4. Start Development Environment

The project provides two types of development instances:

### 1. Dedicated Development Instance (Recommended)

```
pnpm dev:diff
```

> Suitable for daily development and debugging; changes do not affect the release version

### 2. Release-Like Development Instance

```
pnpm dev
```

> Behaves similarly to the official release; useful to test overall functionality

---

## 5. Commit Code & Create PR

### 1. Pull Latest Code

```
git pull origin main
```

### 2. Create a New Branch

```
git checkout -b feature/my-feature
```

> ⚠️ Avoid developing directly on `main`

### 3. Pre-Commit Checks

- Ensure code style is correct
- All unit tests pass
- No useless files

### 4. Commit and Push

```
git add .
git commit -m "feat: add my feature"
git push origin feature/my-feature
```

### 5. Create a PR

- Choose `main` as the target branch
- Briefly describe the feature or changes
- Link related Issue if available

---

💡 **Tips**:

- Keep each commit focused on a single feature or issue; avoid large, messy commits
- PR descriptions should be clear so reviewers immediately understand the changes


================================================
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 w
Download .txt
gitextract_v_30r70e/

├── .editorconfig
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yaml
│   │   ├── config.yml
│   │   └── feature_request.yaml
│   └── workflows/
│       ├── ci.yml
│       ├── daily.yml
│       ├── deps-build-linux.yaml
│       ├── deps-build-macos.yaml
│       ├── deps-build-windows-nsis.yaml
│       ├── deps-create-updater.yaml
│       ├── deps-delete-releases.yaml
│       ├── deps-message-telegram.yaml
│       ├── deps-update-tag.yaml
│       ├── deps-upload-release-assets.yaml
│       ├── macos-aarch64.yaml
│       ├── publish.yml
│       ├── stale.yml
│       ├── target-dev-build.yaml
│       └── target-release-build.yaml
├── .gitignore
├── .husky/
│   ├── commit-msg
│   └── pre-commit
├── .lintstagedrc.js
├── .oxlintrc.json
├── .prettierignore
├── .prettierrc.cjs
├── .stylelintignore
├── .stylelintrc.js
├── .vscode/
│   ├── extensions.json
│   └── settings.json
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── UPDATELOG.md
├── backend/
│   ├── .gitignore
│   ├── Cargo.toml
│   ├── Cross.toml
│   ├── boa_utils/
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── console/
│   │       │   ├── mod.rs
│   │       │   └── tests.rs
│   │       ├── lib.rs
│   │       └── module/
│   │           ├── builtin/
│   │           │   └── utils.js
│   │           ├── builtin.rs
│   │           ├── combine.rs
│   │           ├── http.rs
│   │           └── mod.rs
│   ├── nyanpasu-egui/
│   │   ├── .gitignore
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── ipc.rs
│   │       ├── lib.rs
│   │       ├── main.rs
│   │       ├── small.rs
│   │       ├── utils/
│   │       │   ├── mod.rs
│   │       │   └── svg.rs
│   │       └── widget/
│   │           ├── mod.rs
│   │           ├── network_statistic_large.rs
│   │           └── network_statistic_small.rs
│   ├── nyanpasu-macro/
│   │   ├── Cargo.toml
│   │   └── src/
│   │       ├── builder_update.rs
│   │       ├── enum_wrapper_combined.rs
│   │       ├── lib.rs
│   │       └── verge_patch.rs
│   ├── rustfmt.toml
│   ├── tauri/
│   │   ├── .gitignore
│   │   ├── Cargo.toml
│   │   ├── Info.plist
│   │   ├── build.rs
│   │   ├── capabilities/
│   │   │   └── main.json
│   │   ├── icons/
│   │   │   └── icon.icns
│   │   ├── locales/
│   │   │   ├── en.json
│   │   │   ├── ru.json
│   │   │   ├── zh-cn.json
│   │   │   └── zh-tw.json
│   │   ├── overrides/
│   │   │   ├── fixed-webview2.conf.json
│   │   │   └── nightly.conf.json
│   │   ├── src/
│   │   │   ├── cmds/
│   │   │   │   ├── migrate.rs
│   │   │   │   └── mod.rs
│   │   │   ├── config/
│   │   │   │   ├── clash/
│   │   │   │   │   └── mod.rs
│   │   │   │   ├── core.rs
│   │   │   │   ├── draft.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── nyanpasu/
│   │   │   │   │   ├── clash_strategy.rs
│   │   │   │   │   ├── logging.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── widget.rs
│   │   │   │   ├── profile/
│   │   │   │   │   ├── builder.rs
│   │   │   │   │   ├── item/
│   │   │   │   │   │   ├── local.rs
│   │   │   │   │   │   ├── merge.rs
│   │   │   │   │   │   ├── mod.rs
│   │   │   │   │   │   ├── prelude.rs
│   │   │   │   │   │   ├── remote.rs
│   │   │   │   │   │   ├── script.rs
│   │   │   │   │   │   ├── shared.rs
│   │   │   │   │   │   └── utils.rs
│   │   │   │   │   ├── item_type.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── profiles.rs
│   │   │   │   │   └── tests.rs
│   │   │   │   └── runtime.rs
│   │   │   ├── consts.rs
│   │   │   ├── core/
│   │   │   │   ├── clash/
│   │   │   │   │   ├── api.rs
│   │   │   │   │   ├── core.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── proxies.rs
│   │   │   │   │   └── ws.rs
│   │   │   │   ├── connection_interruption.rs
│   │   │   │   ├── handle.rs
│   │   │   │   ├── hotkey.rs
│   │   │   │   ├── logger.rs
│   │   │   │   ├── manager.rs
│   │   │   │   ├── migration/
│   │   │   │   │   ├── db.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── units/
│   │   │   │   │       ├── mod.rs
│   │   │   │   │       ├── unit_160.rs
│   │   │   │   │       ├── unit_200/
│   │   │   │   │       │   └── profile_script_newtype.rs
│   │   │   │   │       └── unit_200.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── pac.rs
│   │   │   │   ├── service/
│   │   │   │   │   ├── control.rs
│   │   │   │   │   ├── ipc.rs
│   │   │   │   │   └── mod.rs
│   │   │   │   ├── state.rs
│   │   │   │   ├── state_v2/
│   │   │   │   │   ├── builder.rs
│   │   │   │   │   ├── coordinator.rs
│   │   │   │   │   ├── manager/
│   │   │   │   │   │   ├── persistent.rs
│   │   │   │   │   │   └── simple.rs
│   │   │   │   │   ├── manager.rs
│   │   │   │   │   └── mod.rs
│   │   │   │   ├── storage.rs
│   │   │   │   ├── sysopt.rs
│   │   │   │   ├── tasks/
│   │   │   │   │   ├── events.rs
│   │   │   │   │   ├── executor.rs
│   │   │   │   │   ├── jobs/
│   │   │   │   │   │   ├── events_rotate.rs
│   │   │   │   │   │   ├── logger.rs
│   │   │   │   │   │   ├── mod.rs
│   │   │   │   │   │   └── profiles.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   ├── storage.rs
│   │   │   │   │   ├── task.rs
│   │   │   │   │   └── utils.rs
│   │   │   │   ├── tray/
│   │   │   │   │   ├── icon.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── proxies.rs
│   │   │   │   ├── updater/
│   │   │   │   │   ├── instance.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── shared.rs
│   │   │   │   └── win_uwp.rs
│   │   │   ├── enhance/
│   │   │   │   ├── advice.rs
│   │   │   │   ├── builtin/
│   │   │   │   │   ├── clash_rs_comp.lua
│   │   │   │   │   ├── config_fixer.js
│   │   │   │   │   ├── meta_guard.js
│   │   │   │   │   └── meta_hy_alpn.js
│   │   │   │   ├── chain.rs
│   │   │   │   ├── field.rs
│   │   │   │   ├── merge.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── script/
│   │   │   │   │   ├── js.rs
│   │   │   │   │   ├── lua/
│   │   │   │   │   │   └── mod.rs
│   │   │   │   │   ├── mod.rs
│   │   │   │   │   └── runner.rs
│   │   │   │   ├── tun.rs
│   │   │   │   └── utils.rs
│   │   │   ├── event_handler/
│   │   │   │   ├── mod.rs
│   │   │   │   └── widget.rs
│   │   │   ├── feat.rs
│   │   │   ├── ipc.rs
│   │   │   ├── lib.rs
│   │   │   ├── logging/
│   │   │   │   ├── indexer.rs
│   │   │   │   ├── manager.rs
│   │   │   │   └── mod.rs
│   │   │   ├── main.rs
│   │   │   ├── server/
│   │   │   │   └── mod.rs
│   │   │   ├── setup.rs
│   │   │   ├── shutdown_hook.rs
│   │   │   ├── utils/
│   │   │   │   ├── candy.rs
│   │   │   │   ├── collect.rs
│   │   │   │   ├── config.rs
│   │   │   │   ├── dialog.rs
│   │   │   │   ├── dirs.rs
│   │   │   │   ├── dock.rs
│   │   │   │   ├── downloader.rs
│   │   │   │   ├── help.rs
│   │   │   │   ├── init/
│   │   │   │   │   ├── logging.rs
│   │   │   │   │   └── mod.rs
│   │   │   │   ├── mod.rs
│   │   │   │   ├── net.rs
│   │   │   │   ├── open.rs
│   │   │   │   ├── resolve.rs
│   │   │   │   ├── sudo.rs
│   │   │   │   ├── winhelp.rs
│   │   │   │   ├── winreg.rs
│   │   │   │   └── winreg_test.rs
│   │   │   ├── widget.rs
│   │   │   └── window.rs
│   │   ├── tauri.conf.json
│   │   ├── tauri.windows.conf.json
│   │   ├── templates/
│   │   │   ├── cleanup.wxs
│   │   │   ├── installer.nsi
│   │   │   └── installer.wxs
│   │   └── tests/
│   │       └── sample_clash_config.yaml
│   └── tauri-plugin-deep-link/
│       ├── .github/
│       │   └── workflows/
│       │       ├── audit.yml
│       │       ├── format.yml
│       │       ├── lint.yml
│       │       └── release.yml
│       ├── .gitignore
│       ├── CHANGELOG.md
│       ├── Cargo.toml
│       ├── LICENSE_APACHE-2.0
│       ├── LICENSE_MIT
│       ├── README.md
│       ├── cliff.toml
│       ├── example/
│       │   ├── Info.plist
│       │   └── main.rs
│       ├── renovate.json
│       └── src/
│           ├── lib.rs
│           ├── linux.rs
│           ├── macos.rs
│           ├── template.desktop
│           └── windows.rs
├── cliff.toml
├── commitlint.config.js
├── frontend/
│   ├── interface/
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── hooks/
│   │   │   │   ├── index.ts
│   │   │   │   └── use-kv-storage.ts
│   │   │   ├── index.ts
│   │   │   ├── ipc/
│   │   │   │   ├── bindings.ts
│   │   │   │   ├── consts.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── use-clash-config.ts
│   │   │   │   ├── use-clash-connections.ts
│   │   │   │   ├── use-clash-cores.ts
│   │   │   │   ├── use-clash-info.ts
│   │   │   │   ├── use-clash-logs.ts
│   │   │   │   ├── use-clash-memory.ts
│   │   │   │   ├── use-clash-proxies-provider.ts
│   │   │   │   ├── use-clash-proxies.ts
│   │   │   │   ├── use-clash-rules-provider.ts
│   │   │   │   ├── use-clash-rules.ts
│   │   │   │   ├── use-clash-traffic.ts
│   │   │   │   ├── use-clash-version.ts
│   │   │   │   ├── use-clash-web-socket.ts
│   │   │   │   ├── use-core-dir.ts
│   │   │   │   ├── use-platform.ts
│   │   │   │   ├── use-post-processing-output.ts
│   │   │   │   ├── use-profile-content.ts
│   │   │   │   ├── use-profile.ts
│   │   │   │   ├── use-proxy-mode.ts
│   │   │   │   ├── use-runtime-profile.ts
│   │   │   │   ├── use-server-port.ts
│   │   │   │   ├── use-service-prompt.ts
│   │   │   │   ├── use-settings.ts
│   │   │   │   ├── use-system-proxy.ts
│   │   │   │   └── use-system-service.ts
│   │   │   ├── openapi/
│   │   │   │   ├── geoip/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── ipsb.ts
│   │   │   │   ├── healthcheck/
│   │   │   │   │   ├── index.ts
│   │   │   │   │   └── utils.ts
│   │   │   │   └── index.ts
│   │   │   ├── provider/
│   │   │   │   ├── clash-ws-provider.tsx
│   │   │   │   ├── index.tsx
│   │   │   │   └── mutation-provider.tsx
│   │   │   ├── service/
│   │   │   │   ├── clash-api.ts
│   │   │   │   ├── core.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── tauri.ts
│   │   │   │   └── types.ts
│   │   │   ├── template/
│   │   │   │   └── index.ts
│   │   │   └── utils/
│   │   │       ├── get-system.ts
│   │   │       ├── index.ts
│   │   │       └── retry.ts
│   │   └── tsconfig.json
│   ├── nyanpasu/
│   │   ├── .gitignore
│   │   ├── .vscode/
│   │   │   └── extensions.json
│   │   ├── auto-imports.d.ts
│   │   ├── index.html
│   │   ├── messages/
│   │   │   ├── en.json
│   │   │   ├── ru.json
│   │   │   ├── zh-cn.json
│   │   │   └── zh-tw.json
│   │   ├── package.json
│   │   ├── postcss.config.js
│   │   ├── project.inlang/
│   │   │   ├── project_id
│   │   │   └── settings.json
│   │   ├── src/
│   │   │   ├── assets/
│   │   │   │   ├── json/
│   │   │   │   │   └── clash-field.json
│   │   │   │   └── styles/
│   │   │   │       ├── fonts.scss
│   │   │   │       ├── index.scss
│   │   │   │       ├── tailwind.css
│   │   │   │       └── theme.scss
│   │   │   ├── components/
│   │   │   │   ├── app/
│   │   │   │   │   ├── app-container.module.d.scss.ts
│   │   │   │   │   ├── app-container.module.scss
│   │   │   │   │   ├── app-container.module.scss.d.ts
│   │   │   │   │   ├── app-container.tsx
│   │   │   │   │   ├── app-drawer.tsx
│   │   │   │   │   ├── drawer-content.tsx
│   │   │   │   │   ├── locales-provider.tsx
│   │   │   │   │   └── modules/
│   │   │   │   │       └── route-list-item.tsx
│   │   │   │   ├── base/
│   │   │   │   │   ├── base-empty.tsx
│   │   │   │   │   ├── base-error-boundary.tsx
│   │   │   │   │   ├── base-notice.tsx
│   │   │   │   │   ├── content-display.tsx
│   │   │   │   │   └── index.ts
│   │   │   │   ├── connections/
│   │   │   │   │   ├── close-connections-button.tsx
│   │   │   │   │   ├── connection-detail-dialog.tsx
│   │   │   │   │   ├── connection-page.tsx
│   │   │   │   │   ├── connection-search-term.tsx
│   │   │   │   │   ├── connections-column-filter.tsx
│   │   │   │   │   ├── connections-table.tsx
│   │   │   │   │   ├── connections-total.tsx
│   │   │   │   │   └── header-search.tsx
│   │   │   │   ├── dashboard/
│   │   │   │   │   ├── data-panel.tsx
│   │   │   │   │   ├── dataline.tsx
│   │   │   │   │   ├── health-panel.tsx
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   ├── ipasn-panel.tsx
│   │   │   │   │   │   └── timing-panel.tsx
│   │   │   │   │   ├── proxy-shortcuts.tsx
│   │   │   │   │   └── service-shortcuts.tsx
│   │   │   │   ├── layout/
│   │   │   │   │   ├── animated-logo.module.d.scss.ts
│   │   │   │   │   ├── animated-logo.module.scss
│   │   │   │   │   ├── animated-logo.module.scss.d.ts
│   │   │   │   │   ├── animated-logo.tsx
│   │   │   │   │   ├── layout-control.tsx
│   │   │   │   │   ├── mutation-provider.tsx
│   │   │   │   │   ├── notice-provider.tsx
│   │   │   │   │   ├── page-transition.tsx
│   │   │   │   │   ├── scheme-provider.tsx
│   │   │   │   │   └── use-custom-theme.tsx
│   │   │   │   ├── logo/
│   │   │   │   │   └── animated-logo.tsx
│   │   │   │   ├── logs/
│   │   │   │   │   ├── clear-log-button.tsx
│   │   │   │   │   ├── log-filter.tsx
│   │   │   │   │   ├── log-item.module.scss
│   │   │   │   │   ├── log-item.module.scss.d.ts
│   │   │   │   │   ├── log-item.tsx
│   │   │   │   │   ├── log-level.tsx
│   │   │   │   │   ├── log-list.tsx
│   │   │   │   │   ├── log-page.tsx
│   │   │   │   │   ├── log-provider.tsx
│   │   │   │   │   ├── log-toggle.tsx
│   │   │   │   │   └── los-header.tsx
│   │   │   │   ├── profiles/
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   ├── chain-item.tsx
│   │   │   │   │   │   ├── language-chip.tsx
│   │   │   │   │   │   ├── side-chain.tsx
│   │   │   │   │   │   ├── side-log.tsx
│   │   │   │   │   │   └── store.ts
│   │   │   │   │   ├── new-profile-button.tsx
│   │   │   │   │   ├── profile-dialog.tsx
│   │   │   │   │   ├── profile-item.tsx
│   │   │   │   │   ├── profile-monaco-diff-viewer.tsx
│   │   │   │   │   ├── profile-monaco-viewer.tsx
│   │   │   │   │   ├── profile-side.tsx
│   │   │   │   │   ├── provider.tsx
│   │   │   │   │   ├── quick-import.tsx
│   │   │   │   │   ├── read-profile.tsx
│   │   │   │   │   ├── runtime-config-diff-dialog.tsx
│   │   │   │   │   ├── script-dialog.tsx
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── providers/
│   │   │   │   │   ├── block-task-provider.tsx
│   │   │   │   │   ├── context-menu-provider.tsx
│   │   │   │   │   ├── language-provider.tsx
│   │   │   │   │   ├── nyanpasu-update-provider.tsx
│   │   │   │   │   ├── proxies-provider-traffic.tsx
│   │   │   │   │   ├── proxies-provider.tsx
│   │   │   │   │   ├── rules-provider.tsx
│   │   │   │   │   ├── theme-provider.tsx
│   │   │   │   │   ├── update-providers.tsx
│   │   │   │   │   └── update-proxies-providers.tsx
│   │   │   │   ├── proxies/
│   │   │   │   │   ├── delay-button.tsx
│   │   │   │   │   ├── delay-chip.tsx
│   │   │   │   │   ├── feature-chip.tsx
│   │   │   │   │   ├── group-list.tsx
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── node-card.module.d.scss.ts
│   │   │   │   │   ├── node-card.module.scss
│   │   │   │   │   ├── node-card.module.scss.d.ts
│   │   │   │   │   ├── node-card.tsx
│   │   │   │   │   ├── node-list.tsx
│   │   │   │   │   ├── proxy-group-name.tsx
│   │   │   │   │   ├── scroll-current-node.tsx
│   │   │   │   │   ├── sort-selector.tsx
│   │   │   │   │   └── utils.ts
│   │   │   │   ├── router/
│   │   │   │   │   └── animated-outlet.tsx
│   │   │   │   ├── rules/
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   └── store.ts
│   │   │   │   │   ├── rule-item.tsx
│   │   │   │   │   └── rule-page.tsx
│   │   │   │   ├── setting/
│   │   │   │   │   ├── modules/
│   │   │   │   │   │   ├── clash-core.tsx
│   │   │   │   │   │   ├── clash-field.tsx
│   │   │   │   │   │   ├── clash-web.tsx
│   │   │   │   │   │   ├── hotkey-dialog.tsx
│   │   │   │   │   │   ├── hotkey-input.module.d.scss.ts
│   │   │   │   │   │   ├── hotkey-input.module.scss
│   │   │   │   │   │   ├── hotkey-input.module.scss.d.ts
│   │   │   │   │   │   ├── hotkey-input.tsx
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── nyanpasu-path.tsx
│   │   │   │   │   │   ├── service-manual-prompt-dialog.module.d.scss.ts
│   │   │   │   │   │   ├── service-manual-prompt-dialog.module.scss
│   │   │   │   │   │   ├── service-manual-prompt-dialog.module.scss.d.ts
│   │   │   │   │   │   ├── service-manual-prompt-dialog.tsx
│   │   │   │   │   │   ├── system-proxy.tsx
│   │   │   │   │   │   └── tray-icon-dialog.tsx
│   │   │   │   │   ├── setting-clash-base.tsx
│   │   │   │   │   ├── setting-clash-core.tsx
│   │   │   │   │   ├── setting-clash-external.tsx
│   │   │   │   │   ├── setting-clash-field.tsx
│   │   │   │   │   ├── setting-clash-port.tsx
│   │   │   │   │   ├── setting-clash-web.tsx
│   │   │   │   │   ├── setting-nyanpasu-auto-reload.tsx
│   │   │   │   │   ├── setting-nyanpasu-misc.tsx
│   │   │   │   │   ├── setting-nyanpasu-path.tsx
│   │   │   │   │   ├── setting-nyanpasu-tasks.tsx
│   │   │   │   │   ├── setting-nyanpasu-ui.tsx
│   │   │   │   │   ├── setting-nyanpasu-version.tsx
│   │   │   │   │   ├── setting-page.tsx
│   │   │   │   │   ├── setting-system-behavior.tsx
│   │   │   │   │   ├── setting-system-proxy.tsx
│   │   │   │   │   └── setting-system-service.tsx
│   │   │   │   ├── settings/
│   │   │   │   │   └── system-proxy.tsx
│   │   │   │   ├── ui/
│   │   │   │   │   ├── animated-item.tsx
│   │   │   │   │   ├── border-beam.tsx
│   │   │   │   │   ├── button.tsx
│   │   │   │   │   ├── card.tsx
│   │   │   │   │   ├── circle.tsx
│   │   │   │   │   ├── context-menu.tsx
│   │   │   │   │   ├── dropdown-menu.tsx
│   │   │   │   │   ├── file-drop-zone.tsx
│   │   │   │   │   ├── highlight-text.tsx
│   │   │   │   │   ├── image.tsx
│   │   │   │   │   ├── input.tsx
│   │   │   │   │   ├── modal.tsx
│   │   │   │   │   ├── progress.tsx
│   │   │   │   │   ├── ripple.tsx
│   │   │   │   │   ├── scroll-area.tsx
│   │   │   │   │   ├── select.tsx
│   │   │   │   │   ├── separator.tsx
│   │   │   │   │   ├── sidebar.tsx
│   │   │   │   │   ├── slider-sidebar.tsx
│   │   │   │   │   ├── slider.tsx
│   │   │   │   │   ├── switch.tsx
│   │   │   │   │   ├── text-marquee.tsx
│   │   │   │   │   └── tooltip.tsx
│   │   │   │   ├── updater/
│   │   │   │   │   ├── updater-dialog-wrapper.tsx
│   │   │   │   │   ├── updater-dialog.module.scss
│   │   │   │   │   ├── updater-dialog.module.scss.d.ts
│   │   │   │   │   └── updater-dialog.tsx
│   │   │   │   └── window/
│   │   │   │       ├── window-control.tsx
│   │   │   │       ├── window-header.tsx
│   │   │   │       └── window-title.tsx
│   │   │   ├── consts.ts
│   │   │   ├── hooks/
│   │   │   │   ├── theme.ts
│   │   │   │   ├── use-consts.ts
│   │   │   │   ├── use-core-icon.ts
│   │   │   │   ├── use-current-core-icon.ts
│   │   │   │   ├── use-element-breakpoints.ts
│   │   │   │   ├── use-is-moblie.tsx
│   │   │   │   ├── use-lock-fn.ts
│   │   │   │   ├── use-store.ts
│   │   │   │   ├── use-updater.ts
│   │   │   │   ├── use-visibility.ts
│   │   │   │   └── use-window-maximized.ts
│   │   │   ├── locales/
│   │   │   │   ├── en.json
│   │   │   │   ├── ru.json
│   │   │   │   ├── zh-CN.json
│   │   │   │   └── zh-TW.json
│   │   │   ├── main.tsx
│   │   │   ├── pages/
│   │   │   │   ├── (editor)/
│   │   │   │   │   └── editor/
│   │   │   │   │       ├── _modules/
│   │   │   │   │       │   ├── chip.tsx
│   │   │   │   │       │   ├── header.tsx
│   │   │   │   │       │   ├── hooks.tsx
│   │   │   │   │       │   ├── loading-skeleton.tsx
│   │   │   │   │       │   └── utils.tsx
│   │   │   │   │       ├── index.tsx
│   │   │   │   │       └── route.tsx
│   │   │   │   ├── (legacy)/
│   │   │   │   │   ├── connections.tsx
│   │   │   │   │   ├── dashboard.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── logs.tsx
│   │   │   │   │   ├── profiles.tsx
│   │   │   │   │   ├── providers.tsx
│   │   │   │   │   ├── proxies.tsx
│   │   │   │   │   ├── route.tsx
│   │   │   │   │   ├── rules.tsx
│   │   │   │   │   └── settings.tsx
│   │   │   │   ├── (main)/
│   │   │   │   │   ├── _modules/
│   │   │   │   │   │   ├── header-file-action.tsx
│   │   │   │   │   │   ├── header-help-action.tsx
│   │   │   │   │   │   ├── header-menu.tsx
│   │   │   │   │   │   ├── header-settings-action.tsx
│   │   │   │   │   │   ├── header.tsx
│   │   │   │   │   │   └── navbar.tsx
│   │   │   │   │   ├── main/
│   │   │   │   │   │   ├── connections/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   └── table-row.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── dashboard/
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── logs/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   ├── consts.ts
│   │   │   │   │   │   │   │   └── log-level-badge.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── profiles/
│   │   │   │   │   │   │   ├── $type/
│   │   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   │   ├── chain-profile-import.tsx
│   │   │   │   │   │   │   │   │   ├── import-button.tsx
│   │   │   │   │   │   │   │   │   ├── local-profile-button.tsx
│   │   │   │   │   │   │   │   │   ├── profiles-header.tsx
│   │   │   │   │   │   │   │   │   ├── profiles-list.tsx
│   │   │   │   │   │   │   │   │   ├── remote-profile-button.tsx
│   │   │   │   │   │   │   │   │   └── utils.ts
│   │   │   │   │   │   │   │   ├── detail/
│   │   │   │   │   │   │   │   │   ├── $uid.tsx
│   │   │   │   │   │   │   │   │   └── _modules/
│   │   │   │   │   │   │   │   │       ├── action-card.tsx
│   │   │   │   │   │   │   │   │       ├── active-button.tsx
│   │   │   │   │   │   │   │   │       ├── chian-editor-card.tsx
│   │   │   │   │   │   │   │   │       ├── delete-profile.tsx
│   │   │   │   │   │   │   │   │       ├── detial-header.tsx
│   │   │   │   │   │   │   │   │       ├── open-locally.tsx
│   │   │   │   │   │   │   │   │       ├── profile-name-editor.tsx
│   │   │   │   │   │   │   │   │       ├── subscription-card.tsx
│   │   │   │   │   │   │   │   │       ├── subscription-url-editor.tsx
│   │   │   │   │   │   │   │   │       ├── update-option-editor.tsx
│   │   │   │   │   │   │   │   │       └── view-content.tsx
│   │   │   │   │   │   │   │   └── index.tsx
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   ├── consts.ts
│   │   │   │   │   │   │   │   ├── error-item.tsx
│   │   │   │   │   │   │   │   ├── profile-quick-import.tsx
│   │   │   │   │   │   │   │   └── profiles-navigate.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   ├── inspect/
│   │   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── providers/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   ├── providers-title.tsx
│   │   │   │   │   │   │   │   ├── use-proxies-provider-update.tsx
│   │   │   │   │   │   │   │   ├── use-proxies-subscription.tsx
│   │   │   │   │   │   │   │   └── use-rules-provider-update.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   ├── proxies/
│   │   │   │   │   │   │   │   ├── $key.tsx
│   │   │   │   │   │   │   │   └── _modules/
│   │   │   │   │   │   │   │       ├── info-card.tsx
│   │   │   │   │   │   │   │       └── subscription-card.tsx
│   │   │   │   │   │   │   ├── route.tsx
│   │   │   │   │   │   │   └── rules/
│   │   │   │   │   │   │       ├── $key.tsx
│   │   │   │   │   │   │       └── _modules/
│   │   │   │   │   │   │           └── info-card.tsx
│   │   │   │   │   │   ├── proxies/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   ├── hooks.ts
│   │   │   │   │   │   │   │   └── proxies-navigate.tsx
│   │   │   │   │   │   │   ├── group/
│   │   │   │   │   │   │   │   ├── $name.tsx
│   │   │   │   │   │   │   │   └── _modules/
│   │   │   │   │   │   │   │       ├── delay-test-button.tsx
│   │   │   │   │   │   │   │       ├── group-header.tsx
│   │   │   │   │   │   │   │       └── proxy-node-button.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   ├── rules/
│   │   │   │   │   │   │   ├── _modules/
│   │   │   │   │   │   │   │   └── proxy-icon.tsx
│   │   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   │   └── route.tsx
│   │   │   │   │   │   └── settings/
│   │   │   │   │   │       ├── _modules/
│   │   │   │   │   │       │   ├── settings-card.tsx
│   │   │   │   │   │       │   ├── settings-navigate.tsx
│   │   │   │   │   │       │   └── settings-title.tsx
│   │   │   │   │   │       ├── about/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   └── nyanpasu-version.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── clash/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   ├── allow-lan-switch.tsx
│   │   │   │   │   │       │   │   ├── core-manager-card.tsx
│   │   │   │   │   │       │   │   ├── field-filter-card.tsx
│   │   │   │   │   │       │   │   ├── field-filter-switch.tsx
│   │   │   │   │   │       │   │   ├── ipv6-switch.tsx
│   │   │   │   │   │       │   │   ├── log-level-selector.tsx
│   │   │   │   │   │       │   │   ├── mixed-port-config.tsx
│   │   │   │   │   │       │   │   ├── random-port-switch.tsx
│   │   │   │   │   │       │   │   └── tun-stack-selector.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── debug/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   ├── advance-tools-switch.tsx
│   │   │   │   │   │       │   │   ├── block-task-viewer.tsx
│   │   │   │   │   │       │   │   ├── debug-provider.tsx
│   │   │   │   │   │       │   │   ├── kv-storage.tsx
│   │   │   │   │   │       │   │   ├── path-utils-card.tsx
│   │   │   │   │   │       │   │   └── window-debug.tsx
│   │   │   │   │   │       │   ├── index.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── index.tsx
│   │   │   │   │   │       ├── nyanpasu/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   └── log-file-config.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── route.tsx
│   │   │   │   │   │       ├── system/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   ├── auto-launch-switch.tsx
│   │   │   │   │   │       │   │   ├── current-system-proxy.tsx
│   │   │   │   │   │       │   │   ├── proxy-bypass-config.tsx
│   │   │   │   │   │       │   │   ├── proxy-guard-config.tsx
│   │   │   │   │   │       │   │   ├── proxy-guard-switch.tsx
│   │   │   │   │   │       │   │   ├── slient-launch-switch.tsx
│   │   │   │   │   │       │   │   ├── system-service-ctrl.tsx
│   │   │   │   │   │       │   │   ├── system-service-switch.tsx
│   │   │   │   │   │       │   │   └── uwp-tools-button.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       ├── user-interface/
│   │   │   │   │   │       │   ├── _modules/
│   │   │   │   │   │       │   │   ├── language-selector.tsx
│   │   │   │   │   │       │   │   ├── switch-legacy.tsx
│   │   │   │   │   │       │   │   ├── theme-color-config.tsx
│   │   │   │   │   │       │   │   └── theme-mode-selector.tsx
│   │   │   │   │   │       │   └── route.tsx
│   │   │   │   │   │       └── web-ui/
│   │   │   │   │   │           ├── _modules/
│   │   │   │   │   │           │   ├── core-secret-config.tsx
│   │   │   │   │   │           │   ├── external-controller-config.tsx
│   │   │   │   │   │           │   ├── port-strategy-selector.tsx
│   │   │   │   │   │           │   └── web-ui.tsx
│   │   │   │   │   │           └── route.tsx
│   │   │   │   │   └── route.tsx
│   │   │   │   ├── -__root.module.scss
│   │   │   │   ├── -__root.module.scss.d.ts
│   │   │   │   └── __root.tsx
│   │   │   ├── route-tree.gen.ts
│   │   │   ├── services/
│   │   │   │   ├── i18n.ts
│   │   │   │   ├── monaco.ts
│   │   │   │   ├── storage.ts
│   │   │   │   └── types.d.ts
│   │   │   ├── store/
│   │   │   │   ├── clash.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── proxies.ts
│   │   │   │   ├── service.ts
│   │   │   │   └── updater.ts
│   │   │   └── utils/
│   │   │       ├── chain.ts
│   │   │       ├── get-system.ts
│   │   │       ├── ignore-case.ts
│   │   │       ├── index.ts
│   │   │       ├── language.ts
│   │   │       ├── monaco-yaml.worker.ts
│   │   │       ├── mui-theme.ts
│   │   │       ├── mutation.ts
│   │   │       ├── notification.ts
│   │   │       ├── parse-hotkey.ts
│   │   │       ├── parse-traffic.ts
│   │   │       ├── routes-utils.ts
│   │   │       ├── shiki.ts
│   │   │       └── styled.ts
│   │   ├── tailwind.config.ts
│   │   ├── tsconfig.json
│   │   ├── tsconfig.node.json
│   │   ├── tsr.config.json
│   │   └── vite.config.ts
│   └── ui/
│       ├── package.json
│       ├── src/
│       │   ├── chart/
│       │   │   ├── index.ts
│       │   │   └── sparkline.tsx
│       │   ├── hooks/
│       │   │   ├── get-system.ts
│       │   │   ├── index.ts
│       │   │   ├── use-breakpoint.ts
│       │   │   └── use-click-position.ts
│       │   ├── index.ts
│       │   ├── materialYou/
│       │   │   ├── components/
│       │   │   │   ├── baseCard/
│       │   │   │   │   ├── index.tsx
│       │   │   │   │   ├── style.module.d.scss.ts
│       │   │   │   │   ├── style.module.scss
│       │   │   │   │   └── style.module.scss.d.ts
│       │   │   │   ├── baseDialog/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── basePage/
│       │   │   │   │   ├── baseErrorBoundary.tsx
│       │   │   │   │   ├── header.tsx
│       │   │   │   │   ├── index.tsx
│       │   │   │   │   └── style.scss
│       │   │   │   ├── expand/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── expandMore/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── floatingButton/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── index.ts
│       │   │   │   ├── item/
│       │   │   │   │   ├── baseItem.tsx
│       │   │   │   │   ├── index.ts
│       │   │   │   │   ├── menuItem.tsx
│       │   │   │   │   ├── numberItem.tsx
│       │   │   │   │   ├── switchItem.tsx
│       │   │   │   │   └── textItem.tsx
│       │   │   │   ├── kbd/
│       │   │   │   │   ├── index.module.d.scss.ts
│       │   │   │   │   ├── index.module.scss
│       │   │   │   │   ├── index.module.scss.d.ts
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── lazyImage/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── loadingButton/
│       │   │   │   │   └── index.tsx
│       │   │   │   ├── loadingSwitch/
│       │   │   │   │   ├── index.tsx
│       │   │   │   │   ├── style.module.d.scss.ts
│       │   │   │   │   ├── style.module.scss
│       │   │   │   │   └── style.module.scss.d.ts
│       │   │   │   └── sidePage/
│       │   │   │       ├── index.tsx
│       │   │   │       ├── style.module.d.scss.ts
│       │   │   │       ├── style.module.scss
│       │   │   │       └── style.module.scss.d.ts
│       │   │   ├── createTheme.ts
│       │   │   ├── index.ts
│       │   │   ├── themeComponents/
│       │   │   │   ├── MuiButton.ts
│       │   │   │   ├── MuiCard.ts
│       │   │   │   ├── MuiCardContent.ts
│       │   │   │   ├── MuiDialog.ts
│       │   │   │   ├── MuiDialogActions.ts
│       │   │   │   ├── MuiDialogContent.ts
│       │   │   │   ├── MuiDialogTitle.ts
│       │   │   │   ├── MuiLinearProgress.ts
│       │   │   │   ├── MuiMenu.ts
│       │   │   │   ├── MuiPaper.ts
│       │   │   │   ├── MuiSwitch.ts
│       │   │   │   ├── MuiToggleButtonGroup.ts
│       │   │   │   └── index.ts
│       │   │   └── themeConsts.mjs
│       │   └── utils/
│       │       ├── cn.ts
│       │       ├── color-mix.ts
│       │       ├── event.ts
│       │       ├── index.ts
│       │       └── ts-helper.ts
│       ├── tsconfig.json
│       └── vite.config.ts
├── knip.config.ts
├── manifest/
│   ├── site/
│   │   ├── index.html
│   │   └── updater/
│   │       └── .gitkeep
│   └── version.json
├── package.json
├── pnpm-workspace.yaml
├── renovate.json
├── rust-toolchain.toml
├── scripts/
│   ├── .gitignore
│   ├── .vscode/
│   │   └── settings.json
│   ├── deno/
│   │   ├── README.md
│   │   ├── build-cache.ts
│   │   ├── check.ts
│   │   ├── deno.jsonc
│   │   ├── generate-latest-version.ts
│   │   ├── manifest.ts
│   │   ├── telegram-notify.ts
│   │   ├── upload-build-artifacts.ts
│   │   ├── upload-macos-updater.ts
│   │   └── utils/
│   │       ├── cache-client.ts
│   │       ├── file-server.ts
│   │       └── logger.ts
│   ├── generate-git-info.ts
│   ├── generate-latest-version.ts
│   ├── manifest/
│   │   ├── clash-meta.ts
│   │   ├── clash-premium.ts
│   │   ├── clash-rs.ts
│   │   └── index.ts
│   ├── osx-aarch64-upload.ts
│   ├── package.json
│   ├── portable.ts
│   ├── prepare-nightly.ts
│   ├── prepare-preview.ts
│   ├── prepare-release.ts
│   ├── publish.ts
│   ├── tsconfig.json
│   ├── types/
│   │   └── index.ts
│   ├── updatelog.ts
│   ├── updater-nightly.ts
│   ├── updater.ts
│   └── utils/
│       ├── arch-check.ts
│       ├── consts.ts
│       ├── download.ts
│       ├── env.ts
│       ├── index.ts
│       ├── logger.ts
│       ├── manifest.ts
│       ├── octokit.ts
│       ├── resolve.ts
│       ├── resource.ts
│       ├── shell.ts
│       └── telegram.ts
└── tsconfig.json
Download .txt
Showing preview only (221K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2436 symbols across 438 files)

FILE: backend/boa_utils/src/console/mod.rs
  type LogMessage (line 29) | pub enum LogMessage {
  function logger (line 37) | fn logger(msg: LogMessage, console_state: &Console) {
  type Logger (line 50) | pub trait Logger {
    method log (line 52) | fn log(&mut self, msg: LogMessage, console_state: &Console);
    method take (line 53) | fn take(&mut self) -> Vec<Self::Item>;
    type Item (line 61) | type Item = LogMessage;
    method log (line 62) | fn log(&mut self, msg: LogMessage, console_state: &Console) {
    method take (line 65) | fn take(&mut self) -> Vec<Self::Item> {
  type ConsoleLogger (line 56) | pub trait LoggerBox = Logger<Item = LogMessage> + Sync + Send + 'static;
  function inspect_logger (line 74) | pub fn inspect_logger<R>(f: impl FnOnce(&mut dyn LoggerBox) -> R) -> R {
  function set_logger (line 78) | pub fn set_logger(logger: Box<dyn LoggerBox>) {
  function formatter (line 85) | fn formatter(data: &[JsValue], context: &mut Context) -> JsResult<String> {
  type Console (line 158) | pub struct Console {
    constant NAME (line 166) | pub const NAME: JsStr<'static> = js_str!("console");
    method init (line 170) | pub fn init(context: &mut Context) -> JsObject {
    method assert (line 298) | fn assert(
    method clear (line 341) | fn clear(_: &JsValue, _: &[JsValue], console: &mut Self, _: &mut Conte...
    method debug (line 356) | fn debug(
    method error (line 381) | fn error(
    method info (line 406) | fn info(
    method log (line 431) | fn log(
    method trace (line 456) | fn trace(
    method warn (line 499) | fn warn(
    method count (line 524) | fn count(
    method count_reset (line 558) | fn count_reset(
    method system_time_in_ms (line 580) | fn system_time_in_ms() -> u128 {
    method time (line 597) | fn time(
    method time_log (line 634) | fn time_log(
    method time_end (line 680) | fn time_end(
    method group (line 727) | fn group(
    method group_collapsed (line 756) | fn group_collapsed(
    method group_end (line 776) | fn group_end(
    method dir (line 798) | fn dir(_: &JsValue, args: &[JsValue], console: &Self, _: &mut Context)...

FILE: backend/boa_utils/src/console/tests.rs
  function formatter_no_args_is_empty_string (line 7) | fn formatter_no_args_is_empty_string() {
  function formatter_empty_format_string_is_empty_string (line 14) | fn formatter_empty_format_string_is_empty_string() {
  function formatter_format_without_args_renders_verbatim (line 21) | fn formatter_format_without_args_renders_verbatim() {
  function formatter_empty_format_string_concatenates_rest_of_args (line 31) | fn formatter_empty_format_string_concatenates_rest_of_args() {
  function formatter_utf_8_checks (line 49) | fn formatter_utf_8_checks() {
  function formatter_trailing_format_leader_renders (line 68) | fn formatter_trailing_format_leader_renders() {
  function formatter_float_format_works (line 86) | fn formatter_float_format_works() {
  function console_log_cyclic (line 96) | fn console_log_cyclic() {

FILE: backend/boa_utils/src/lib.rs
  type TestAction (line 71) | pub(crate) struct TestAction(Inner);
    method run (line 110) | pub(crate) fn run(source: impl Into<Cow<'static, str>>) -> Self {
    method inspect_context (line 119) | pub(crate) fn inspect_context(op: fn(&mut Context)) -> Self {
  type Inner (line 75) | enum Inner {
  function run_test_actions (line 126) | pub(crate) fn run_test_actions(actions: impl IntoIterator<Item = TestAct...
  function run_test_actions_with (line 134) | pub(crate) fn run_test_actions_with(

FILE: backend/boa_utils/src/module/builtin.rs
  constant BUILTIN_MODULE_PREFIX (line 10) | pub(crate) const BUILTIN_MODULE_PREFIX: &str = "nyan:";
  type BuiltinModuleLoader (line 24) | pub struct BuiltinModuleLoader;
  method load_imported_module (line 27) | async fn load_imported_module(
  function test_builtin_module_loader (line 78) | fn test_builtin_module_loader() -> JsResult<()> {
  function test_builtin_utils (line 168) | fn test_builtin_utils() -> JsResult<()> {

FILE: backend/boa_utils/src/module/builtin/utils.js
  function yaml (line 10) | function yaml(strings, ...values) {

FILE: backend/boa_utils/src/module/combine.rs
  type CombineModuleLoader (line 8) | pub struct CombineModuleLoader {
    method new (line 15) | pub fn new(
    method clone_simple (line 26) | pub fn clone_simple(&self) -> Rc<boa_engine::module::SimpleModuleLoade...
    method clone_http (line 30) | pub fn clone_http(&self) -> Rc<super::http::HttpModuleLoader> {
  method load_imported_module (line 36) | async fn load_imported_module(

FILE: backend/boa_utils/src/module/http.rs
  type HttpModuleLoader (line 21) | pub struct HttpModuleLoader {
    method new (line 36) | pub fn new(cache_dir: PathBuf, max_age: Duration) -> Self {
    method mapping_cache_dir (line 40) | fn mapping_cache_dir(&self, url: &url::Url) -> PathBuf {
    method handle_cached_item (line 56) | fn handle_cached_item(item: CachedItem, context: &mut Context) -> JsRe...
  type CachedItem (line 27) | pub struct CachedItem {
  method load_imported_module (line 84) | async fn load_imported_module(
  function test_http_module_loader (line 200) | fn test_http_module_loader() -> JsResult<()> {

FILE: backend/nyanpasu-egui/src/ipc.rs
  type StatisticMessage (line 7) | pub struct StatisticMessage {
  type Message (line 15) | pub enum Message {
  type IPCServer (line 21) | pub struct IPCServer {
    method is_connected (line 27) | pub fn is_connected(&self) -> bool {
    method connect (line 31) | pub fn connect(&mut self) -> anyhow::Result<()> {
    method into_tx (line 41) | pub fn into_tx(self) -> Option<IpcSender<Message>> {
  function create_ipc_server (line 46) | pub fn create_ipc_server() -> anyhow::Result<(IPCServer, String)> {
  function setup_ipc_receiver (line 57) | pub(crate) fn setup_ipc_receiver(name: &str) -> anyhow::Result<IpcReceiv...
  function setup_ipc_receiver_with_env (line 64) | pub(crate) fn setup_ipc_receiver_with_env() -> anyhow::Result<IpcReceive...

FILE: backend/nyanpasu-egui/src/main.rs
  function main (line 8) | fn main() -> eframe::Result {

FILE: backend/nyanpasu-egui/src/small.rs
  function main (line 8) | fn main() -> eframe::Result {

FILE: backend/nyanpasu-egui/src/utils/svg.rs
  function parse_svg_with_current_color_replace (line 7) | pub fn parse_svg_with_current_color_replace<T: Into<CssColor>>(
  function render_svg (line 16) | pub fn render_svg(tree: &Tree, width: u32, height: u32) -> Result<Pixmap...
  function render_svg_with_current_color_replace (line 27) | pub fn render_svg_with_current_color_replace<T: Into<CssColor>>(
  type SvgWrapper (line 37) | pub struct SvgWrapper<'a>(pub &'a Pixmap);
  function from (line 40) | fn from(pixmap: &'a Pixmap) -> Self {
  type SvgExt (line 46) | pub trait SvgExt {
    method into_wrapper (line 47) | fn into_wrapper(&self) -> SvgWrapper<'_>;
    method into_wrapper (line 51) | fn into_wrapper(&self) -> SvgWrapper<'_> {
  function into_egui_image (line 57) | pub fn into_egui_image(self) -> eframe::egui::ColorImage {

FILE: backend/nyanpasu-egui/src/widget/mod.rs
  function get_window_state_path (line 9) | fn get_window_state_path() -> std::io::Result<PathBuf> {
  function set_application_activation_policy (line 23) | fn set_application_activation_policy() {
  type StatisticWidgetVariant (line 58) | pub enum StatisticWidgetVariant {
    method fmt (line 64) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  function start_statistic_widget (line 72) | pub fn start_statistic_widget(size: StatisticWidgetVariant) -> eframe::R...

FILE: backend/nyanpasu-egui/src/widget/network_statistic_large.rs
  constant STATUS_ICON_CONTAINER_WIDTH (line 19) | const STATUS_ICON_CONTAINER_WIDTH: f32 = 20.0;
  constant STATUS_ICON_WIDTH (line 20) | const STATUS_ICON_WIDTH: f32 = 12.0;
  constant LOGO_CONTAINER_WIDTH (line 21) | const LOGO_CONTAINER_WIDTH: f32 = 44.0;
  constant LOGO_SIZE (line 22) | const LOGO_SIZE: Vec2 = Vec2::new(26.0, 31.0);
  constant GLOBAL_ALPHA (line 25) | const GLOBAL_ALPHA: u8 = 128;
  constant LIGHT_MODE_BACKGROUND_COLOR (line 26) | const LIGHT_MODE_BACKGROUND_COLOR: Color32 =
  constant DARK_MODE_TEXT_COLOR (line 28) | const DARK_MODE_TEXT_COLOR: Color32 = Color32::from_rgb(254, 247, 255);
  constant DARK_MODE_BACKGROUND_COLOR (line 29) | const DARK_MODE_BACKGROUND_COLOR: Color32 =
  constant DARK_MODE_STATUS_SHEET_COLOR (line 31) | const DARK_MODE_STATUS_SHEET_COLOR: Color32 =
  constant STATUS_ICON_CONTAINER_COLOR (line 33) | const STATUS_ICON_CONTAINER_COLOR: Color32 = Color32::from_rgb(79, 55, 1...
  constant DOWNLOAD_ICON (line 38) | const DOWNLOAD_ICON: &[u8] = include_bytes!("../../assets/download.svg");
  constant UPLOAD_ICON (line 39) | const UPLOAD_ICON: &[u8] = include_bytes!("../../assets/upload.svg");
  constant UP_ICON (line 40) | const UP_ICON: &[u8] = include_bytes!("../../assets/up.svg");
  constant DOWN_ICON (line 41) | const DOWN_ICON: &[u8] = include_bytes!("../../assets/down.svg");
  function setup_custom_style (line 43) | fn setup_custom_style(ctx: &egui::Context) {
  function setup_fonts (line 52) | fn setup_fonts(ctx: &egui::Context) {
  function use_global_styles (line 71) | fn use_global_styles(styles: &mut Style) {
  function use_light_green_accent (line 82) | fn use_light_green_accent(style: &mut Style) {
  function use_dark_purple_accent (line 93) | fn use_dark_purple_accent(style: &mut Style) {
  type LogoPreset (line 106) | pub enum LogoPreset {
  type NyanpasuNetworkStatisticLargeWidgetInner (line 114) | pub struct NyanpasuNetworkStatisticLargeWidgetInner {
    method request_repaint (line 127) | fn request_repaint(&self) {
  type NyanpasuNetworkStatisticLargeWidget (line 133) | pub struct NyanpasuNetworkStatisticLargeWidget {
    method new (line 138) | pub fn new(cc: &eframe::CreationContext<'_>) -> Self {
    method run (line 179) | pub fn run() -> eframe::Result {
    method handle_message (line 205) | pub fn handle_message(&self, msg: Message) -> anyhow::Result<()> {
    method clear_color (line 233) | fn clear_color(&self, _visuals: &egui::Visuals) -> [f32; 4] {
    method update (line 237) | fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {

FILE: backend/nyanpasu-egui/src/widget/network_statistic_small.rs
  constant STATUS_ICON_CONTAINER_WIDTH (line 13) | const STATUS_ICON_CONTAINER_WIDTH: f32 = 20.0;
  constant LOGO_CONTAINER_WIDTH (line 14) | const LOGO_CONTAINER_WIDTH: f32 = 44.0;
  constant LOGO_SIZE (line 15) | const LOGO_SIZE: Vec2 = Vec2::new(26.0, 31.0);
  constant GLOBAL_ALPHA (line 18) | const GLOBAL_ALPHA: u8 = 128;
  constant LIGHT_MODE_BACKGROUND_COLOR (line 19) | const LIGHT_MODE_BACKGROUND_COLOR: Color32 = Color32::from_rgb(234, 221,...
  constant LIGHT_MODE_TEXT_COLOR (line 20) | const LIGHT_MODE_TEXT_COLOR: Color32 = Color32::from_rgb(29, 27, 32);
  constant DARK_MODE_TEXT_COLOR (line 21) | const DARK_MODE_TEXT_COLOR: Color32 = Color32::from_rgb(254, 247, 255);
  constant DARK_MODE_BACKGROUND_COLOR (line 22) | const DARK_MODE_BACKGROUND_COLOR: Color32 = Color32::from_rgb(29, 27, 32);
  constant DARK_MODE_STATUS_SHEET_COLOR (line 23) | const DARK_MODE_STATUS_SHEET_COLOR: Color32 = Color32::from_rgb(73, 69, ...
  constant STATUS_ICON_CONTAINER_COLOR (line 24) | const STATUS_ICON_CONTAINER_COLOR: Color32 = Color32::from_rgb(79, 55, 1...
  constant UP_ICON (line 29) | const UP_ICON: &[u8] = include_bytes!("../../assets/up.svg");
  constant DOWN_ICON (line 30) | const DOWN_ICON: &[u8] = include_bytes!("../../assets/down.svg");
  function setup_custom_style (line 32) | fn setup_custom_style(ctx: &egui::Context) {
  function setup_fonts (line 37) | fn setup_fonts(ctx: &egui::Context) {
  function use_global_styles (line 56) | fn use_global_styles(styles: &mut Style) {
  function use_light_green_accent (line 62) | fn use_light_green_accent(style: &mut Style) {
  function use_dark_purple_accent (line 73) | fn use_dark_purple_accent(style: &mut Style) {
  type NyanpasuNetworkStatisticSmallWidget (line 85) | pub struct NyanpasuNetworkStatisticSmallWidget {
    method new (line 107) | pub fn new(cc: &eframe::CreationContext<'_>) -> Self {
    method run (line 144) | pub fn run() -> eframe::Result {
    method handle_message (line 171) | pub fn handle_message(&self, msg: Message) -> anyhow::Result<()> {
    method clear_color (line 198) | fn clear_color(&self, _visuals: &egui::Visuals) -> [f32; 4] {
    method update (line 202) | fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
  type NyanpasuNetworkStatisticSmallWidgetState (line 89) | struct NyanpasuNetworkStatisticSmallWidgetState {
    method request_repaint (line 101) | fn request_repaint(&self) {

FILE: backend/nyanpasu-macro/src/builder_update.rs
  function builder_update (line 5) | pub fn builder_update(input: DeriveInput) -> syn::Result<TokenStream> {
  function wrap_type_in_option (line 162) | fn wrap_type_in_option(ty: &Type) -> Type {

FILE: backend/nyanpasu-macro/src/enum_wrapper_combined.rs
  function enum_combined_wrapper (line 5) | pub fn enum_combined_wrapper(input: DeriveInput) -> syn::Result<TokenStr...

FILE: backend/nyanpasu-macro/src/lib.rs
  function builder_update (line 9) | pub fn builder_update(input: TokenStream) -> TokenStream {
  function verge_patch (line 18) | pub fn verge_patch(input: TokenStream) -> TokenStream {
  function enum_wrapper_from (line 27) | pub fn enum_wrapper_from(input: TokenStream) -> TokenStream {

FILE: backend/nyanpasu-macro/src/verge_patch.rs
  function verge_patch (line 5) | pub fn verge_patch(input: DeriveInput) -> Result<TokenStream> {

FILE: backend/tauri-plugin-deep-link/example/main.rs
  function main (line 5) | fn main() {

FILE: backend/tauri-plugin-deep-link/src/lib.rs
  function set_identifier (line 21) | pub fn set_identifier(identifier: &str) -> Result<()> {
  function register (line 33) | pub fn register<F: FnMut(String) + Send + 'static>(scheme: &[&str], hand...
  function listen (line 42) | pub fn listen<F: FnMut(String) + Send + 'static>(handler: F) -> Result<(...
  function unregister (line 51) | pub fn unregister(scheme: &[&str]) -> Result<()> {
  function prepare (line 61) | pub fn prepare(identifier: &str) {

FILE: backend/tauri-plugin-deep-link/src/linux.rs
  function register (line 12) | pub fn register<F: FnMut(String) + Send + 'static>(schemes: &[&str], han...
  function unregister (line 80) | pub fn unregister(_schemes: &[&str]) -> Result<()> {
  function listen (line 103) | pub fn listen<F: FnMut(String) + Send + 'static>(mut handler: F) -> Resu...
  function prepare (line 133) | pub fn prepare(identifier: &str) {

FILE: backend/tauri-plugin-deep-link/src/macos.rs
  type THandler (line 18) | type THandler = OnceCell<Mutex<Box<dyn FnMut(String) + Send + 'static>>>;
  function register (line 23) | pub fn register<F: FnMut(String) + Send + 'static>(_scheme: &[&str], han...
  function unregister (line 29) | pub fn unregister(_scheme: &[&str]) -> Result<()> {
  constant EVENT_CLASS (line 34) | const EVENT_CLASS: u32 = 0x4755524c;
  constant EVENT_GET_URL (line 36) | const EVENT_GET_URL: u32 = 0x4755524c;
  function parse_url_event (line 39) | fn parse_url_event(event: *mut AnyObject) -> Option<String> {
  method new (line 77) | pub fn new() -> Retained<Self> {
  function secondary_handler (line 84) | fn secondary_handler(s: String) {
  function listen (line 101) | pub fn listen<F: FnMut(String) + Send + 'static>(handler: F) -> Result<(...
  function prepare (line 176) | pub fn prepare(identifier: &str) {

FILE: backend/tauri-plugin-deep-link/src/windows.rs
  function register (line 28) | pub fn register<F: FnMut(String) + Send + 'static>(schemes: &[&str], han...
  function unregister (line 61) | pub fn unregister(schemes: &[&str]) -> Result<()> {
  function listen (line 74) | pub fn listen<F: FnMut(String) + Send + 'static>(mut handler: F) -> Resu...
  function prepare (line 137) | pub fn prepare(identifier: &str) {
  function dummy_keypress (line 206) | fn dummy_keypress() {

FILE: backend/tauri/build.rs
  type PackageJson (line 10) | struct PackageJson {
  type GitInfo (line 15) | struct GitInfo {
  function main (line 21) | fn main() {

FILE: backend/tauri/src/cmds/migrate.rs
  type MigrateOpts (line 10) | pub struct MigrateOpts {
  function is_fresh_install_instance (line 28) | fn is_fresh_install_instance() -> bool {
  function parse (line 38) | pub fn parse(args: &MigrateOpts) {
  function migrate_home_dir_handler (line 111) | pub fn migrate_home_dir_handler(target_path: &str) -> anyhow::Result<()> {
  function migrate_home_dir_handler (line 186) | pub fn migrate_home_dir_handler(_target_path: &str) -> anyhow::Result<()> {

FILE: backend/tauri/src/cmds/mod.rs
  type Cli (line 15) | pub struct Cli {
  type Commands (line 26) | enum Commands {
  type DelayedExitGuard (line 45) | struct DelayedExitGuard;
    method new (line 47) | pub fn new() -> Self {
  method drop (line 52) | fn drop(&mut self) {
  function parse (line 57) | pub fn parse() -> anyhow::Result<()> {
  function print_version_info (line 108) | fn print_version_info() {

FILE: backend/tauri/src/config/clash/mod.rs
  type IClashTemp (line 18) | pub struct IClashTemp(pub Mapping);
    method new (line 21) | pub fn new() -> Self {
    method template (line 31) | pub fn template() -> Self {
    method guard (line 55) | fn guard(mut config: Mapping) -> Mapping {
    method patch_config (line 64) | pub fn patch_config(&mut self, patch: Mapping) {
    method save_config (line 70) | pub fn save_config(&self) -> Result<()> {
    method get_mixed_port (line 78) | pub fn get_mixed_port(&self) -> u16 {
    method get_client_info (line 82) | pub fn get_client_info(&self) -> ClashInfo {
    method get_external_controller_port (line 98) | pub fn get_external_controller_port(&self) -> u16 {
    method prepare_external_controller_port (line 105) | pub fn prepare_external_controller_port(&mut self) -> Result<()> {
    method guard_mixed_port (line 123) | pub fn guard_mixed_port(config: &Mapping) -> u16 {
    method guard_server_ctrl (line 138) | pub fn guard_server_ctrl(config: &Mapping) -> String {
    method guard_client_ctrl (line 159) | pub fn guard_client_ctrl(config: &Mapping) -> String {
    method get_tun_device_ip (line 173) | pub fn get_tun_device_ip(&self) -> String {
  type ClashInfo (line 195) | pub struct ClashInfo {
  function test_clash_info (line 205) | fn test_clash_info() {
  type IClash (line 269) | pub struct IClash {
  type IClashTUN (line 284) | pub struct IClashTUN {
  type IClashDNS (line 294) | pub struct IClashDNS {
  type IClashFallbackFilter (line 310) | pub struct IClashFallbackFilter {

FILE: backend/tauri/src/config/core.rs
  constant RUNTIME_CONFIG (line 12) | pub const RUNTIME_CONFIG: &str = "clash-config.yaml";
  constant CHECK_CONFIG (line 13) | pub const CHECK_CONFIG: &str = "clash-config-check.yaml";
  type Config (line 15) | pub struct Config {
    method global (line 23) | pub fn global() -> &'static Config {
    method clash (line 34) | pub fn clash() -> Draft<IClashTemp> {
    method verge (line 38) | pub fn verge() -> Draft<IVerge> {
    method profiles (line 42) | pub fn profiles() -> &'static ManagedState<Profiles> {
    method runtime (line 46) | pub fn runtime() -> Draft<IRuntime> {
    method init_config (line 51) | pub fn init_config() -> Result<()> {
    method generate_file (line 70) | pub fn generate_file(typ: ConfigType) -> Result<PathBuf> {
    method generate (line 88) | pub async fn generate() -> Result<()> {
  type ConfigType (line 102) | pub enum ConfigType {

FILE: backend/tauri/src/config/draft.rs
  type Draft (line 6) | pub struct Draft<T: Clone + ToOwned> {
  function reload (line 74) | pub fn reload(&self) {
  function test_draft (line 83) | fn test_draft() {

FILE: backend/tauri/src/config/nyanpasu/clash_strategy.rs
  type ClashStrategy (line 5) | pub struct ClashStrategy {
  type ExternalControllerPortStrategy (line 11) | pub enum ExternalControllerPortStrategy {
  function get_external_controller_port_strategy (line 19) | pub fn get_external_controller_port_strategy(&self) -> ExternalControlle...

FILE: backend/tauri/src/config/nyanpasu/logging.rs
  type LoggingLevel (line 8) | pub enum LoggingLevel {
  method default (line 25) | fn default() -> Self {
  method default (line 30) | fn default() -> Self {
  function from (line 36) | fn from(level: LoggingLevel) -> Self {
  method get_log_level (line 49) | pub fn get_log_level(&self) -> LoggingLevel {

FILE: backend/tauri/src/config/nyanpasu/mod.rs
  function is_hex_color (line 10) | pub fn is_hex_color(color: &str) -> bool {
  type ClashCore (line 30) | pub enum ClashCore {
    method fmt (line 65) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
    type Error (line 99) | type Error = anyhow::Error;
    method try_from (line 101) | fn try_from(core: &nyanpasu_utils::core::CoreType) -> Result<Self> {
  method default (line 44) | fn default() -> Self {
  method from (line 53) | fn from(core: ClashCore) -> Self {
  function from (line 77) | fn from(core: &ClashCore) -> Self {
  type ProxiesSelectorMode (line 117) | pub enum ProxiesSelectorMode {
  type TunStack (line 126) | pub enum TunStack {
    method as_ref (line 134) | fn as_ref(&self) -> &str {
  type BreakWhenProxyChange (line 145) | pub enum BreakWhenProxyChange {
  type IVerge (line 156) | pub struct IVerge {
    method new (line 316) | pub fn new() -> Self {
    method merge_with_template (line 336) | fn merge_with_template(mut config: IVerge) -> Self {
    method template (line 392) | pub fn template() -> Self {
    method save_file (line 430) | pub fn save_file(&self) -> Result<()> {
  type WindowState (line 306) | pub struct WindowState {

FILE: backend/tauri/src/config/nyanpasu/widget.rs
  type NetworkStatisticWidgetConfig (line 8) | pub enum NetworkStatisticWidgetConfig {

FILE: backend/tauri/src/config/profile/builder.rs
  type ProfileBuilder (line 9) | pub enum ProfileBuilder {
    method build (line 29) | pub fn build(self) -> Result<Profile, ProfileBuilderError> {
  type ProfileBuilderError (line 17) | pub enum ProfileBuilderError {

FILE: backend/tauri/src/config/profile/item/local.rs
  constant PROFILE_TYPE (line 16) | const PROFILE_TYPE: ProfileItemType = ProfileItemType::Local;
  type LocalProfile (line 26) | pub struct LocalProfile {
    method builder (line 48) | pub fn builder() -> LocalProfileBuilder {
  method kind (line 57) | fn kind(&self) -> ProfileItemType {

FILE: backend/tauri/src/config/profile/item/merge.rs
  constant PROFILE_TYPE (line 13) | const PROFILE_TYPE: ProfileItemType = ProfileItemType::Merge;
  type MergeProfile (line 23) | pub struct MergeProfile {
    method builder (line 35) | pub fn builder() -> MergeProfileBuilder {
  method kind (line 44) | fn kind(&self) -> ProfileItemType {

FILE: backend/tauri/src/config/profile/item/mod.rs
  type ProfileMetaSetter (line 27) | trait ProfileMetaSetter {
    method set_uid (line 28) | fn set_uid(&mut self, uid: String);
    method set_name (line 29) | fn set_name(&mut self, name: String);
    method set_desc (line 30) | fn set_desc(&mut self, desc: Option<String>);
    method set_file (line 31) | fn set_file(&mut self, file: String);
    method set_updated (line 32) | fn set_updated(&mut self, updated: usize);
  type ProfileMetaGetter (line 39) | pub trait ProfileMetaGetter {
    method name (line 40) | fn name(&self) -> &str;
    method desc (line 41) | fn desc(&self) -> Option<&str>;
    method uid (line 42) | fn uid(&self) -> &str;
    method updated (line 43) | fn updated(&self) -> usize;
    method file (line 44) | fn file(&self) -> &str;
  type ProfileKindGetter (line 48) | pub trait ProfileKindGetter {
    method kind (line 49) | fn kind(&self) -> ProfileItemType;
  type ProfileHelper (line 54) | pub trait ProfileHelper:
    method duplicate (line 57) | async fn duplicate(&self) -> Result<Self> {
  type ProfileCleanup (line 77) | pub trait ProfileCleanup: ProfileHelper {
    method remove_file (line 80) | async fn remove_file(&mut self) -> Result<()> {
  type Profile (line 96) | pub enum Profile {
    method file (line 113) | pub fn file(&self) -> &str {
    method read_file (line 123) | pub fn read_file(&self) -> Result<String> {
    method save_file (line 133) | pub fn save_file<T: Borrow<String>>(&self, data: T) -> Result<()> {

FILE: backend/tauri/src/config/profile/item/remote.rs
  constant PROFILE_TYPE (line 26) | const PROFILE_TYPE: ProfileItemType = ProfileItemType::Remote;
  type RemoteProfileSubscription (line 28) | pub trait RemoteProfileSubscription {
    method subscribe (line 29) | async fn subscribe(&mut self, opts: Option<RemoteProfileOptionsBuilder...
    method subscribe (line 89) | async fn subscribe(
  type RemoteProfile (line 39) | pub struct RemoteProfile {
    method builder (line 71) | pub fn builder() -> RemoteProfileBuilder {
  method kind (line 80) | fn kind(&self) -> ProfileItemType {
  type Subscription (line 108) | struct Subscription {
  function subscribe_url (line 118) | async fn subscribe_url(
  function subscribe_urls (line 259) | async fn subscribe_urls(
  function merge_subscription (line 285) | fn merge_subscription(
  type SubscribeError (line 304) | pub enum SubscribeError {
  type RemoteProfileBuilderError (line 327) | pub enum RemoteProfileBuilderError {
  method default_shared (line 340) | fn default_shared(&self) -> ProfileSharedBuilder {
  method validate (line 344) | fn validate(&self) -> Result<(), RemoteProfileBuilderError> {
  method build_no_blocking (line 354) | pub async fn build_no_blocking(&mut self) -> Result<RemoteProfile, Remot...
  method build (line 400) | pub fn build(&mut self) -> Result<RemoteProfile, RemoteProfileBuilderErr...
  type SubscriptionInfo (line 407) | pub struct SubscriptionInfo {
  type RemoteProfileOptions (line 417) | pub struct RemoteProfileOptions {
    method apply_default (line 451) | pub fn apply_default(&self) -> Self {
  method default (line 440) | fn default() -> Self {
  function parse_profile_title_header (line 471) | pub fn parse_profile_title_header(headers: &HeaderMap) -> Option<String> {
  function parse_filename_from_content_disposition (line 488) | pub fn parse_filename_from_content_disposition(headers: &HeaderMap) -> O...

FILE: backend/tauri/src/config/profile/item/script.rs
  type ScriptProfile (line 23) | pub struct ScriptProfile {
    method builder (line 53) | pub fn builder(script_type: &ScriptType) -> ScriptProfileBuilder {
  method build_shared (line 33) | fn build_shared(&self) -> Result<ProfileShared, ScriptProfileBuilderErro...
  method kind (line 47) | fn kind(&self) -> ProfileItemType {

FILE: backend/tauri/src/config/profile/item/shared.rs
  type ProfileFileIo (line 15) | pub trait ProfileFileIo {
    method read_file (line 16) | async fn read_file(&self) -> std::io::Result<String>;
    method write_file (line 17) | async fn write_file(&self, content: String) -> std::io::Result<()>;
    method read_file (line 59) | async fn read_file(&self) -> std::io::Result<String> {
    method write_file (line 65) | async fn write_file(&self, content: String) -> std::io::Result<()> {
  type ProfileShared (line 26) | pub struct ProfileShared {
    method get_default_builder (line 48) | pub fn get_default_builder(kind: &ProfileItemType) -> ProfileSharedBui...
    method builder (line 146) | pub fn builder() -> ProfileSharedBuilder {
  method default_uid (line 79) | fn default_uid(kind: &ProfileItemType) -> String {
  method default_name (line 83) | pub fn default_name(kind: &ProfileItemType) -> &'static str {
  method default_file_name (line 92) | pub fn default_file_name(kind: &ProfileItemType, uid: &str) -> String {
  method apply_default_file (line 102) | pub fn apply_default_file(
  method is_file_none (line 114) | pub fn is_file_none(&self) -> bool {
  method build (line 118) | pub fn build(
  method name (line 152) | fn name(&self) -> &str {
  method desc (line 156) | fn desc(&self) -> Option<&str> {
  method uid (line 160) | fn uid(&self) -> &str {
  method updated (line 164) | fn updated(&self) -> usize {
  method file (line 168) | fn file(&self) -> &str {
  method set_name (line 174) | fn set_name(&mut self, name: String) {
  method set_desc (line 178) | fn set_desc(&mut self, desc: Option<String>) {
  method set_file (line 182) | fn set_file(&mut self, file: String) {
  method set_uid (line 186) | fn set_uid(&mut self, uid: String) {
  method set_updated (line 190) | fn set_updated(&mut self, updated: usize) {
  function deserialize_single_or_vec (line 195) | pub fn deserialize_single_or_vec<'de, D, T>(deserializer: D) -> Result<V...

FILE: backend/tauri/src/config/profile/item/utils.rs
  function generate_uid (line 3) | pub fn generate_uid(kind: &ProfileItemType) -> String {

FILE: backend/tauri/src/config/profile/item_type.rs
  type ProfileItemType (line 10) | pub enum ProfileItemType {
  type ProfileUid (line 22) | pub type ProfileUid = String;

FILE: backend/tauri/src/config/profile/profiles.rs
  type Profiles (line 21) | pub struct Profiles {
    method new (line 53) | pub fn new() -> Self {
    method save_file (line 63) | pub fn save_file(&self) -> Result<()> {
    method get_current (line 71) | pub fn get_current(&self) -> &[ProfileUid] {
    method get_items (line 76) | pub fn get_items(&self) -> &[Profile] {
    method get_item (line 81) | pub fn get_item(&self, uid: &str) -> Result<&Profile> {
    method append_item (line 89) | pub fn append_item(&mut self, item: Profile) -> Result<()> {
    method reorder (line 95) | pub fn reorder(&mut self, active_id: String, over_id: String) -> Resul...
    method reorder_by_list (line 118) | pub fn reorder_by_list<T: Borrow<String>>(&mut self, order: &[T]) -> R...
    method patch_item (line 137) | pub fn patch_item(&mut self, uid: String, patch: ProfileBuilder) -> Re...
    method replace_item (line 162) | pub fn replace_item<T: Borrow<String>>(&mut self, uid: T, item: Profil...
    method delete_item (line 177) | pub async fn delete_item<T: Borrow<String>>(&mut self, uid: T) -> Resu...
    method current_mappings (line 210) | pub fn current_mappings(&self) -> Result<IndexMap<&str, Mapping>> {
  method default (line 38) | fn default() -> Self {

FILE: backend/tauri/src/config/profile/tests.rs
  constant REMOTE_SAMPLE_DATA (line 15) | const REMOTE_SAMPLE_DATA: &str = include_str!("../../../tests/sample_cla...
  type Guard (line 17) | struct Guard(CancellationToken, Option<tokio::task::JoinHandle<()>>);
  method drop (line 20) | fn drop(&mut self) {
  function create_test_server (line 28) | async fn create_test_server() -> (Guard, url::Url) {
  function test_integer_type_mismatch_in_yaml (line 56) | fn test_integer_type_mismatch_in_yaml() {
  function test_tagged_enum_serialization (line 100) | fn test_tagged_enum_serialization() {
  function test_backward_compatibility (line 180) | fn test_backward_compatibility() {
  function test_profile_kind_getter (line 194) | fn test_profile_kind_getter() {
  function test_builder_defaults (line 230) | async fn test_builder_defaults() {
  function test_error_handling (line 261) | fn test_error_handling() {
  function test_large_numbers (line 293) | fn test_large_numbers() {

FILE: backend/tauri/src/config/runtime.rs
  type PatchRuntimeConfig (line 7) | pub struct PatchRuntimeConfig {
  type IRuntime (line 19) | pub struct IRuntime {
    method new (line 28) | pub fn new() -> Self {
    method patch_config (line 33) | pub fn patch_config(&mut self, patch: Mapping) {

FILE: backend/tauri/src/consts.rs
  constant MAIN_WINDOW_LABEL (line 4) | pub const MAIN_WINDOW_LABEL: &str = "main";
  constant LEGACY_WINDOW_LABEL (line 5) | pub const LEGACY_WINDOW_LABEL: &str = "legacy";
  constant EDITOR_WINDOW_LABEL (line 6) | pub const EDITOR_WINDOW_LABEL: &str = "editor";
  constant APP_NAME (line 7) | pub const APP_NAME: &str = "Clash Nyanpasu";
  constant APP_EDITOR_NAME (line 8) | pub const APP_EDITOR_NAME: &str = "Clash Nyanpasu - Editor";
  type BuildInfo (line 11) | pub struct BuildInfo {
  function app_handle (line 55) | pub fn app_handle() -> &'static AppHandle {
  function setup_app_handle (line 59) | pub(super) fn setup_app_handle(app_handle: AppHandle) {

FILE: backend/tauri/src/core/clash/api.rs
  function put_configs (line 18) | pub async fn put_configs(config_path: &str) -> Result<()> {
  function patch_configs (line 31) | pub async fn patch_configs(config: &Mapping) -> Result<()> {
  type ProxiesRes (line 39) | pub struct ProxiesRes {
  type ProxyItemHistory (line 46) | pub struct ProxyItemHistory {
  type ProxyItem (line 53) | pub struct ProxyItem {
    method from (line 74) | fn from(item: ProxyProviderItem) -> Self {
  function get_proxies (line 112) | pub async fn get_proxies() -> Result<ProxiesRes> {
  function get_proxy (line 125) | pub async fn get_proxy(name: String) -> Result<ProxyItem> {
  function update_proxy (line 139) | pub async fn update_proxy(group: &str, name: &str) -> Result<()> {
  type VehicleType (line 150) | pub enum VehicleType {
  type ProviderType (line 159) | pub enum ProviderType {
  method fmt (line 166) | fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
  type ProxyProviderItem (line 177) | pub struct ProxyProviderItem {
  type ProvidersProxiesRes (line 190) | pub struct ProvidersProxiesRes {
  function get_providers_proxies (line 198) | pub async fn get_providers_proxies() -> Result<ProvidersProxiesRes> {
  function get_providers_proxies_group (line 209) | pub async fn get_providers_proxies_group(group: String) -> Result<ProxyP...
  function update_providers_proxies_group (line 222) | pub async fn update_providers_proxies_group(name: &str) -> Result<()> {
  function get_providers_proxies_healthcheck (line 233) | pub async fn get_providers_proxies_healthcheck(name: String) -> Result<M...
  type DelayRes (line 243) | pub struct DelayRes {
  function get_proxy_delay (line 250) | pub async fn get_proxy_delay(name: String, test_url: Option<String>) -> ...
  function clash_client_info (line 267) | fn clash_client_info() -> Result<(String, HeaderMap)> {
  type PerformRequest (line 284) | struct PerformRequest<D = (), Q = ()> {
  type Query (line 291) | struct Query<T>(T);
  type Data (line 293) | struct Data<T>(T);
  function from (line 296) | fn from((method, path): (reqwest::Method, &str)) -> Self {
  function from (line 310) | fn from((method, path, Data(data)): (reqwest::Method, &str, Data<T>)) ->...
  function from (line 324) | fn from((method, path, Query(query)): (reqwest::Method, &str, Query<T>))...
  function from (line 339) | fn from(
  function perform_request (line 357) | async fn perform_request<D, Q>(param: impl Into<PerformRequest<D, Q>>) -...
  function parse_log (line 421) | pub fn parse_log(log: String) -> String {
  function parse_check_output (line 434) | pub fn parse_check_output(log: String) -> String {
  function delete_connections (line 463) | pub async fn delete_connections(id: Option<&str>) -> Result<()> {
  function test_parse_check_output (line 474) | fn test_parse_check_output() {
  function test_path (line 495) | fn test_path() {

FILE: backend/tauri/src/core/clash/core.rs
  type RunType (line 41) | pub enum RunType {
  method default (line 52) | fn default() -> Self {
  type Instance (line 71) | enum Instance {
    method try_new (line 84) | pub fn try_new(run_type: RunType) -> Result<Self> {
    method run_type (line 130) | pub fn run_type(&self) -> RunType {
    method start (line 137) | pub async fn start(&self) -> Result<()> {
    method stop (line 268) | pub async fn stop(&self) -> Result<()> {
    method restart (line 297) | pub async fn restart(&self) -> Result<()> {
    method state (line 305) | pub async fn state<'a>(&self) -> Cow<'a, CoreState> {
    method status (line 335) | pub async fn status<'a>(&self) -> (Cow<'a, CoreState>, i64) {
  type CoreManager (line 377) | pub struct CoreManager {
    method global (line 384) | pub fn global() -> &'static CoreManager {
    method status (line 393) | pub async fn status<'a>(&self) -> (Cow<'a, CoreState>, i64, RunType) {
    method init (line 410) | pub fn init(&self) -> Result<()> {
    method check_config (line 420) | pub async fn check_config(&self) -> Result<()> {
    method run_core (line 446) | pub async fn run_core(&self) -> Result<()> {
    method recover_core (line 491) | pub async fn recover_core(&'static self) -> Result<()> {
    method stop_core (line 521) | pub async fn stop_core(&self) -> Result<()> {
    method change_core (line 539) | pub async fn change_core(&self, clash_core: Option<ClashCore>) -> Resu...
    method update_config (line 574) | pub async fn update_config(&self) -> Result<()> {
    method change_default_network_dns (line 606) | pub async fn change_default_network_dns(&self, enabled: bool) -> Resul...
  function find_binary_path (line 667) | pub fn find_binary_path(core_type: &nyanpasu_utils::core::CoreType) -> s...

FILE: backend/tauri/src/core/clash/mod.rs
  type ClashConnectionsEvent (line 20) | pub struct ClashConnectionsEvent(pub ws::ClashConnectionsConnectorEvent);
  function setup (line 22) | pub fn setup<R: tauri::Runtime, M: tauri::Manager<R>>(manager: &M) -> an...

FILE: backend/tauri/src/core/clash/proxies.rs
  type ProxyGroupItem (line 19) | pub struct ProxyGroupItem {
    method from (line 40) | fn from(item: api::ProxyItem) -> Self {
  type Proxies (line 61) | pub struct Proxies {
    method fetch (line 75) | pub async fn fetch() -> Result<Self> {
  function fetch_proxies (line 69) | async fn fetch_proxies() -> Result<(api::ProxiesRes, api::ProvidersProxi...
  type ProxiesGuard (line 196) | pub struct ProxiesGuard {
    method global (line 204) | pub fn global() -> &'static Arc<RwLock<ProxiesGuard>> {
    method get_receiver (line 217) | pub fn get_receiver(&self) -> broadcast::Receiver<()> {
    method replace (line 221) | pub fn replace(&mut self, proxies: Proxies, checksum: u32) {
    method inner (line 241) | pub fn inner(&self) -> &Proxies {
    method updated_at (line 245) | pub fn updated_at(&self) -> u64 {
    method is_updated (line 249) | pub fn is_updated(&self) -> bool {
  type ProxiesGuardExt (line 255) | pub trait ProxiesGuardExt {
    method update (line 256) | async fn update(&self) -> Result<()>;
    method select_proxy (line 257) | async fn select_proxy(&self, group: &str, name: &str) -> Result<()>;
    method update (line 262) | async fn update(&self) -> Result<()> {
    method select_proxy (line 277) | async fn select_proxy(&self, group: &str, name: &str) -> Result<()> {
  type ProxiesGuardSingleton (line 260) | type ProxiesGuardSingleton = &'static Arc<RwLock<ProxiesGuard>>;

FILE: backend/tauri/src/core/clash/ws.rs
  function connect_clash_server (line 23) | async fn connect_clash_server<T: serde::de::DeserializeOwned + Send + Sy...
  type ClashConnectionsMessage (line 64) | struct ClashConnectionsMessage {
  type ClashConnectionsInfo (line 72) | pub struct ClashConnectionsInfo {
  type ClashConnectionsConnectorEvent (line 82) | pub enum ClashConnectionsConnectorEvent {
  type ClashConnectionsConnectorState (line 90) | pub enum ClashConnectionsConnectorState {
  type ClashConnectionsConnectorInner (line 96) | pub struct ClashConnectionsConnectorInner {
    method new (line 201) | pub fn new() -> Self {
    method state (line 212) | pub fn state(&self) -> ClashConnectionsConnectorState {
    method dispatch_state_changed (line 216) | fn dispatch_state_changed(&self, state: ClashConnectionsConnectorState) {
    method subscribe (line 226) | pub fn subscribe(&self) -> tokio::sync::broadcast::Receiver<ClashConne...
    method update (line 230) | fn update(&self, msg: ClashConnectionsMessage) {
    method stop (line 251) | pub async fn stop(&self) {
  type ClashConnectionsConnector (line 105) | pub struct ClashConnectionsConnector {
    method new (line 118) | pub fn new() -> Self {
    method endpoint (line 124) | pub fn endpoint() -> anyhow::Result<Request> {
    method start_internal (line 147) | fn start_internal(&self) -> impl Future<Output = anyhow::Result<()>> +...
    method start (line 188) | pub async fn start(&self) -> anyhow::Result<()> {
    method restart (line 194) | pub async fn restart(&self) -> anyhow::Result<()> {
  type Target (line 110) | type Target = ClashConnectionsConnectorInner;
  method deref (line 112) | fn deref(&self) -> &Self::Target {
  method drop (line 263) | fn drop(&mut self) {

FILE: backend/tauri/src/core/connection_interruption.rs
  type ConnectionInfo (line 7) | pub struct ConnectionInfo {
  type ConnectionInterruptionService (line 13) | pub struct ConnectionInterruptionService;
    method on_proxy_change (line 17) | pub async fn on_proxy_change() -> Result<()> {
    method on_profile_change (line 39) | pub async fn on_profile_change() -> Result<()> {
    method on_mode_change (line 52) | pub async fn on_mode_change() -> Result<()> {
    method interrupt_all (line 65) | pub async fn interrupt_all() -> Result<()> {
    method interrupt_by_chain (line 70) | pub async fn interrupt_by_chain(_chain: &[String]) -> Result<()> {

FILE: backend/tauri/src/core/handle.rs
  type Handle (line 10) | pub struct Handle {
    method global (line 33) | pub fn global() -> &'static Handle {
    method init (line 41) | pub fn init(&self, app_handle: AppHandle) {
    method get_window (line 45) | pub fn get_window(&self) -> Option<WebviewWindow<Wry>> {
    method refresh_clash (line 52) | pub fn refresh_clash() {
    method refresh_verge (line 58) | pub fn refresh_verge() {
    method refresh_profiles (line 65) | pub fn refresh_profiles() {
    method mutate_proxies (line 71) | pub fn mutate_proxies() {
    method notice_message (line 77) | pub fn notice_message(message: &Message) {
    method update_systray (line 83) | pub fn update_systray() -> Result<()> {
    method update_systray_part (line 94) | pub fn update_systray_part() -> Result<()> {
    method emit (line 103) | pub fn emit<S: Serialize + Clone>(event: &str, payload: S) -> Result<(...
  type StateChanged (line 16) | pub enum StateChanged {
  type Message (line 25) | pub enum Message {
  constant STATE_CHANGED_URI (line 29) | const STATE_CHANGED_URI: &str = "nyanpasu://mutation";
  constant NOTIFY_MESSAGE_URI (line 30) | const NOTIFY_MESSAGE_URI: &str = "nyanpasu://notice-message";

FILE: backend/tauri/src/core/hotkey.rs
  type Hotkey (line 10) | pub struct Hotkey {
    method global (line 28) | pub fn global() -> &'static Hotkey {
    method init (line 37) | pub fn init(&self, app_handle: AppHandle) -> Result<()> {
    method check_key (line 66) | fn check_key(hotkey: &str) -> Result<()> {
    method register (line 75) | fn register(&self, hotkey: &str, func: &str) -> Result<()> {
    method unregister (line 112) | fn unregister(&self, hotkey: &str) -> Result<()> {
    method update (line 125) | pub fn update(&self, new_hotkeys: Vec<String>) -> Result<()> {
    method get_map_from_vec (line 156) | fn get_map_from_vec(hotkeys: &[String]) -> HashMap<&str, &str> {
    method get_ops (line 173) | fn get_ops<'a>(
  type HotKeyOp (line 16) | type HotKeyOp<'a> = (&'a str, HotKeyOpType<'a>);
  type HotKeyOpType (line 19) | enum HotKeyOpType<'a> {
  method drop (line 203) | fn drop(&mut self) {

FILE: backend/tauri/src/core/logger.rs
  constant LOGS_QUEUE_LEN (line 5) | const LOGS_QUEUE_LEN: usize = 100;
  type Logger (line 7) | pub struct Logger {
    method global (line 12) | pub fn global() -> &'static Logger {
    method get_log (line 20) | pub fn get_log(&self) -> VecDeque<String> {
    method set_log (line 24) | pub fn set_log(&self, text: String) {
    method clear_log (line 32) | pub fn clear_log(&self) {

FILE: backend/tauri/src/core/manager.rs
  function grant_permission (line 5) | pub fn grant_permission(core: &nyanpasu_utils::core::CoreType) -> anyhow...
  function escape (line 57) | pub fn escape(text: &str) -> Cow<'_, str> {

FILE: backend/tauri/src/core/migration/db.rs
  type MigrationFile (line 21) | pub struct MigrationFile<'a> {
  function read_file (line 27) | pub fn read_file(mut self) -> Self {
  method default (line 41) | fn default() -> Self {
  function write_file (line 53) | pub fn write_file(&self) -> Result<(), std::io::Error> {
  function get_state (line 74) | pub fn get_state(&self, name: &str) -> Option<MigrationState> {
  function set_state (line 78) | pub fn set_state(&mut self, name: Cow<'a, str>, state: MigrationState) {

FILE: backend/tauri/src/core/migration/mod.rs
  type MigrationState (line 15) | pub enum MigrationState {
  type MigrationAdvice (line 27) | pub enum MigrationAdvice {
    method fmt (line 37) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type Unit (line 47) | pub enum Unit<'a, T>
  function from (line 61) | fn from(item: T) -> Self {
  function from (line 70) | fn from(item: &'a T) -> Self {
  function from (line 79) | fn from(list: &'a [T]) -> Self {
  function from (line 88) | fn from(list: Vec<T>) -> Self {
  type DynMigration (line 93) | type DynMigration<'a> = Box<dyn Migration<'a> + Send + Sync + 'a>;
  type Migration (line 95) | pub trait Migration<'a>: DynClone {
    method version (line 98) | fn version(&self) -> &'a Version;
    method name (line 101) | fn name(&self) -> Cow<'a, str>;
    method migrate (line 103) | fn migrate(&self) -> std::io::Result<()> {
    method discard (line 107) | fn discard(&self) -> std::io::Result<()> {
  type MigrationExt (line 114) | pub trait MigrationExt<'a>: Migration<'a>
    method boxed (line 118) | fn boxed(self) -> DynMigration<'a> {
  function version (line 129) | fn version(&self) -> &'a Version {
  function name (line 136) | fn name(&self) -> Cow<'a, str> {
  function migrate (line 147) | fn migrate(&self) -> std::io::Result<()> {
  function version (line 153) | fn version(&self) -> &'a Version {
  function name (line 157) | fn name(&self) -> Cow<'a, str> {
  function migrate (line 161) | fn migrate(&self) -> std::io::Result<()> {
  type Runner (line 167) | pub struct Runner<'a> {
  type DropGuard (line 173) | pub struct DropGuard<'a>(Runner<'a>);
  type Target (line 176) | type Target = Runner<'a>;
  function deref (line 178) | fn deref(&self) -> &Self::Target {
  function deref_mut (line 184) | fn deref_mut(&mut self) -> &mut Self::Target {
  method default (line 190) | fn default() -> Self {
  method drop (line 205) | fn drop(&mut self) {
  function new_with_skip_advice (line 213) | pub fn new_with_skip_advice() -> Self {
  function advice_migration (line 226) | pub fn advice_migration<'a, T>(&self, migration: &T) -> MigrationAdvice
  function advice_unit (line 248) | pub fn advice_unit<'a, T>(&self, unit: &Unit<'a, T>) -> MigrationAdvice
  function run_migration (line 270) | pub fn run_migration<'a, T>(&self, migration: &T) -> std::io::Result<()>
  function run_unit (line 304) | pub fn run_unit<'a, T>(&self, unit: &Unit<'a, T>) -> std::io::Result<()>
  function run_units_up_to_version (line 320) | pub fn run_units_up_to_version(&self, to_ver: &Version) -> std::io::Resu...
  function run_upcoming_units (line 335) | pub fn run_upcoming_units(&self) -> std::io::Result<()> {
  function drop_guard (line 353) | pub fn drop_guard(self) -> DropGuard<'a> {

FILE: backend/tauri/src/core/migration/units/mod.rs
  function find_migration (line 18) | pub fn find_migration(name: &str) -> Option<Cow<'static, DynMigration<'s...
  function get_migrations (line 38) | pub fn get_migrations() -> Vec<Cow<'static, DynMigration<'static>>> {

FILE: backend/tauri/src/core/migration/units/unit_160.rs
  type MigrateAppHomeDir (line 25) | pub struct MigrateAppHomeDir;
    method name (line 28) | fn name(&self) -> std::borrow::Cow<'a, str> {
    method version (line 32) | fn version(&self) -> &'a semver::Version {
    method migrate (line 38) | fn migrate(&self) -> std::io::Result<()> {
    method discard (line 126) | fn discard(&self) -> std::io::Result<()> {
  type MigrateProxiesSelectorMode (line 185) | pub struct MigrateProxiesSelectorMode;
    method version (line 187) | fn version(&self) -> &'a semver::Version {
    method name (line 191) | fn name(&self) -> std::borrow::Cow<'a, str> {
    method migrate (line 195) | fn migrate(&self) -> std::io::Result<()> {
    method discard (line 229) | fn discard(&self) -> std::io::Result<()> {
  type MigrateScriptProfileType (line 265) | pub struct MigrateScriptProfileType;
    method version (line 268) | fn version(&self) -> &'a semver::Version {
    method name (line 272) | fn name(&self) -> Cow<'a, str> {
    method migrate (line 276) | fn migrate(&self) -> std::io::Result<()> {
    method discard (line 313) | fn discard(&self) -> std::io::Result<()> {

FILE: backend/tauri/src/core/migration/units/unit_200.rs
  type MigrateProfilesNullValue (line 26) | pub struct MigrateProfilesNullValue;
    method version (line 29) | fn version(&self) -> &'static Version {
    method name (line 33) | fn name(&self) -> Cow<'static, str> {
    method migrate (line 37) | fn migrate(&self) -> std::io::Result<()> {
    method discard (line 60) | fn discard(&self) -> std::io::Result<()> {
  type MigrateLanguageOption (line 89) | pub struct MigrateLanguageOption;
    method version (line 91) | fn version(&self) -> &'a semver::Version {
    method name (line 95) | fn name(&self) -> std::borrow::Cow<'a, str> {
    method migrate (line 99) | fn migrate(&self) -> std::io::Result<()> {
  type MigrateThemeSetting (line 135) | pub struct MigrateThemeSetting;
    method version (line 137) | fn version(&self) -> &'a semver::Version {
    method name (line 141) | fn name(&self) -> std::borrow::Cow<'a, str> {
    method migrate (line 145) | fn migrate(&self) -> std::io::Result<()> {
    method discard (line 167) | fn discard(&self) -> std::io::Result<()> {

FILE: backend/tauri/src/core/migration/units/unit_200/profile_script_newtype.rs
  type MigrateProfileScriptNewtype (line 22) | pub struct MigrateProfileScriptNewtype;
    method version (line 25) | fn version(&self) -> &'static Version {
    method name (line 29) | fn name(&self) -> Cow<'static, str> {
    method migrate (line 33) | fn migrate(&self) -> std::io::Result<()> {
    method discard (line 56) | fn discard(&self) -> std::io::Result<()> {
  function migrate_profile_data (line 80) | fn migrate_profile_data(mut mapping: serde_yaml::Mapping) -> serde_yaml:...
  function discard_profile_data (line 107) | fn discard_profile_data(mut mapping: serde_yaml::Mapping) -> serde_yaml:...
  constant ORIGINAL_SAMPLE (line 141) | const ORIGINAL_SAMPLE: &str = r#"current:
  constant MIGRATED_SAMPLE (line 211) | const MIGRATED_SAMPLE: &str = r#"current:
  function test_migrate_existing_data (line 285) | fn test_migrate_existing_data() {
  function test_discard_existing_data (line 293) | fn test_discard_existing_data() {
  function test_profile_parse_migrated_data (line 302) | fn test_profile_parse_migrated_data() {

FILE: backend/tauri/src/core/pac.rs
  type PacManager (line 8) | pub struct PacManager;
    method get_pac_url (line 17) | pub fn get_pac_url() -> Option<String> {
    method is_pac_enabled (line 22) | pub fn is_pac_enabled() -> bool {
    method download_pac_script (line 27) | pub async fn download_pac_script(url: &str) -> Result<String> {
    method save_pac_script (line 79) | pub async fn save_pac_script(script: &str) -> Result<PathBuf> {
    method validate_pac_script (line 91) | pub async fn validate_pac_script(script: &str) -> Result<()> {
    method set_pac_proxy (line 104) | pub fn set_pac_proxy(url: &str) -> Result<()> {
    method disable_pac_proxy (line 125) | pub fn disable_pac_proxy() -> Result<()> {
    method fallback_to_direct_proxy (line 145) | pub fn fallback_to_direct_proxy() -> Result<()> {
    method update_pac (line 193) | pub async fn update_pac() -> Result<()> {
    method init_pac_proxy (line 250) | pub async fn init_pac_proxy() -> Result<()> {
  constant PAC_DOWNLOAD_TIMEOUT (line 11) | const PAC_DOWNLOAD_TIMEOUT: u64 = 30;
  constant PAC_MAX_RETRIES (line 12) | const PAC_MAX_RETRIES: u32 = 3;
  constant PAC_RETRY_DELAY (line 13) | const PAC_RETRY_DELAY: u64 = 5;
  function test_pac_download (line 271) | async fn test_pac_download() {
  function test_pac_validation (line 291) | async fn test_pac_validation() {
  function test_pac_save (line 319) | async fn test_pac_save() {

FILE: backend/tauri/src/core/service/control.rs
  function get_service_install_args (line 10) | pub async fn get_service_install_args() -> Result<Vec<OsString>, anyhow:...
  function install_service (line 54) | pub async fn install_service() -> anyhow::Result<()> {
  function update_service (line 102) | pub async fn update_service() -> anyhow::Result<()> {
  function uninstall_service (line 145) | pub async fn uninstall_service() -> anyhow::Result<()> {
  function start_service (line 184) | pub async fn start_service() -> anyhow::Result<()> {
  function stop_service (line 230) | pub async fn stop_service() -> anyhow::Result<()> {
  function restart_service (line 279) | pub async fn restart_service() -> anyhow::Result<()> {
  function status (line 326) | pub async fn status<'a>() -> anyhow::Result<nyanpasu_ipc::types::StatusI...

FILE: backend/tauri/src/core/service/ipc.rs
  type IpcState (line 15) | pub enum IpcState {
    method is_connected (line 21) | pub fn is_connected(&self) -> bool {
  function get_ipc_state (line 30) | pub fn get_ipc_state() -> IpcState {
  function set_ipc_state (line 34) | pub(super) fn set_ipc_state(state: IpcState) {
  function dispatch_disconnected (line 39) | fn dispatch_disconnected() {
  function dispatch_connected (line 53) | fn dispatch_connected() {
  function on_ipc_state_changed (line 69) | fn on_ipc_state_changed(state: IpcState) {
  function spawn_health_check (line 95) | pub(super) fn spawn_health_check() {
  function health_check (line 114) | async fn health_check() {

FILE: backend/tauri/src/core/service/mod.rs
  constant SERVICE_NAME (line 11) | const SERVICE_NAME: &str = "nyanpasu-service";
  function init_service (line 17) | pub async fn init_service() {

FILE: backend/tauri/src/core/state.rs
  type ManagedState (line 15) | pub struct ManagedState<T>
  type Target (line 26) | type Target = ManagedStateInner<T>;
  method deref (line 28) | fn deref(&self) -> &Self::Target {
  function from (line 37) | fn from(state: T) -> Self {
  function auto_commit (line 49) | pub fn auto_commit(&self) -> ManagedStateAutoCommit<T> {
  type ManagedStateAutoCommit (line 54) | pub struct ManagedStateAutoCommit<'a, T: Clone + Send + Sync>(&'a Manage...
  type Target (line 60) | type Target = ManagedState<T>;
  method deref (line 62) | fn deref(&self) -> &Self::Target {
  method drop (line 68) | fn drop(&mut self) {
  type ManagedStateInner (line 75) | pub struct ManagedStateInner<T>
  function new (line 89) | pub fn new(state: T) -> Self {
  function data (line 98) | pub fn data(&self) -> MappedRwLockReadGuard<'_, T> {
  function latest (line 103) | pub fn latest(&self) -> MappedRwLockReadGuard<'_, T> {
  function is_dirty (line 119) | pub fn is_dirty(&self) -> bool {
  function draft (line 124) | pub fn draft(&self) -> MappedRwLockWriteGuard<'_, T> {
  function apply (line 143) | pub fn apply(&self) -> Option<T> {
  function discard (line 164) | pub fn discard(&self) -> Option<T> {
  function test_managed_state (line 178) | fn test_managed_state() {

FILE: backend/tauri/src/core/state_v2/builder.rs
  type StateSyncBuilder (line 1) | pub trait StateSyncBuilder: Default + Clone {
    method build (line 4) | fn build(&self) -> anyhow::Result<Self::State>;
  type StateAsyncBuilder (line 7) | pub trait StateAsyncBuilder: Default + Clone {
    method build (line 10) | async fn build(&self) -> anyhow::Result<Self::State>;
    type State (line 18) | type State = T;
    method build (line 19) | async fn build(&self) -> anyhow::Result<Self::State> {

FILE: backend/tauri/src/core/state_v2/coordinator.rs
  type StateChangedError (line 4) | pub enum StateChangedError {
  type MigrateError (line 16) | pub struct MigrateError {
  type RollbackError (line 23) | pub struct RollbackError {
  type StateChangedSubscriber (line 30) | pub(crate) trait StateChangedSubscriber<T: Clone + Send + Sync + 'static> {
    method name (line 32) | fn name(&self) -> &str;
    method migrate (line 39) | async fn migrate(&self, prev_state: Option<T>, new_state: T) -> Result...
    method rollback (line 45) | async fn rollback(&self, prev_state: Option<T>, new_state: T) -> Resul...
  type ConcurrencyStrategy (line 51) | pub enum ConcurrencyStrategy {
  type StateCoordinator (line 59) | pub struct StateCoordinator<T: Clone + Send + Sync + 'static> {
  function new (line 66) | pub(super) fn new() -> Self {
  function add_subscriber (line 74) | fn add_subscriber(&mut self, subscriber: Box<dyn StateChangedSubscriber<...
  function current_state (line 79) | pub fn current_state(&self) -> Option<T> {
  function run_migration (line 83) | async fn run_migration<S>(
  function upsert (line 119) | pub async fn upsert(
  function upsert_state (line 138) | pub async fn upsert_state(&mut self, state: T) -> Result<(), StateChange...
  type TestState (line 157) | struct TestState {
  type MockSubscriber (line 162) | struct MockSubscriber {
    method new (line 173) | fn new(name: &str) -> Self {
    method set_migrate_failure (line 185) | fn set_migrate_failure(&self, should_fail: bool) {
    method set_rollback_failure (line 190) | fn set_rollback_failure(&self, should_fail: bool) {
    method get_migrate_history (line 195) | async fn get_migrate_history(&self) -> Vec<(Option<TestState>, TestSta...
    method get_rollback_history (line 199) | async fn get_rollback_history(&self) -> Vec<(Option<TestState>, TestSt...
    method get_migrate_calls (line 203) | fn get_migrate_calls(&self) -> usize {
    method get_rollback_calls (line 207) | fn get_rollback_calls(&self) -> usize {
    method name (line 214) | fn name(&self) -> &str {
    method migrate (line 218) | async fn migrate(
    method rollback (line 235) | async fn rollback(
  function name (line 255) | fn name(&self) -> &str {
  function migrate (line 259) | async fn migrate(
  function rollback (line 267) | async fn rollback(
  type TestStateBuilder (line 277) | struct TestStateBuilder {
    method new (line 283) | fn new(state: TestState) -> Self {
    method failing (line 290) | fn failing() -> Self {
  type State (line 299) | type State = TestState;
  method build (line 301) | fn build(&self) -> anyhow::Result<Self::State> {
  function test_new_coordinator (line 310) | async fn test_new_coordinator() {
  function test_upsert_state_success (line 318) | async fn test_upsert_state_success() {
  function test_upsert_with_builder_success (line 346) | async fn test_upsert_with_builder_success() {
  function test_upsert_builder_validation_failure (line 371) | async fn test_upsert_builder_validation_failure() {
  function test_migrate_failure_with_successful_rollback (line 389) | async fn test_migrate_failure_with_successful_rollback() {
  function test_migrate_failure_with_rollback_failure (line 421) | async fn test_migrate_failure_with_rollback_failure() {
  function test_multiple_subscribers_success (line 455) | async fn test_multiple_subscribers_success() {
  function test_multiple_subscribers_with_one_failure (line 492) | async fn test_multiple_subscribers_with_one_failure() {
  function test_state_update_sequence (line 531) | async fn test_state_update_sequence() {
  function test_error_display (line 563) | async fn test_error_display() {
  function test_sync_builder_to_async_conversion (line 584) | async fn test_sync_builder_to_async_conversion() {
  function test_add_subscriber (line 601) | async fn test_add_subscriber() {
  function test_get_state (line 629) | async fn test_get_state() {
  function test_empty_subscribers_list (line 658) | async fn test_empty_subscribers_list() {

FILE: backend/tauri/src/core/state_v2/manager/persistent.rs
  type UpsertError (line 10) | pub enum UpsertError {
  type PersistentStateManager (line 17) | pub struct PersistentStateManager<
  function new (line 32) | pub fn new(
  function try_load (line 45) | pub async fn try_load(&mut self) -> anyhow::Result<()> {
  function try_load_with_defaults (line 55) | pub async fn try_load_with_defaults(&mut self) -> anyhow::Result<()> {
  function write_config (line 68) | async fn write_config(&self, builder: Builder) -> anyhow::Result<()> {
  function current_state (line 73) | pub fn current_state(&self) -> Option<State> {
  function upsert (line 77) | pub async fn upsert(&mut self, builder: Builder) -> Result<(), UpsertErr...
  type TestState (line 101) | struct TestState {
  type TestBuilder (line 108) | struct TestBuilder {
    method new (line 115) | fn new(name: String, value: i32) -> Self {
    method failing (line 123) | fn failing() -> Self {
  type State (line 133) | type State = TestState;
  method build (line 135) | async fn build(&self) -> anyhow::Result<Self::State> {
  function create_temp_config_file (line 147) | async fn create_temp_config_file(
  function test_new_persistent_state_manager (line 159) | async fn test_new_persistent_state_manager() {
  function test_try_load_success (line 177) | async fn test_try_load_success() {
  function test_try_load_file_not_exist (line 205) | async fn test_try_load_file_not_exist() {
  function test_try_load_with_defaults_success (line 220) | async fn test_try_load_with_defaults_success() {
  function test_try_load_with_defaults_file_not_exist (line 241) | async fn test_try_load_with_defaults_file_not_exist() {
  function test_upsert_success (line 260) | async fn test_upsert_success() {
  function test_upsert_builder_validation_error (line 301) | async fn test_upsert_builder_validation_error() {
  function test_upsert_write_config_error (line 332) | async fn test_upsert_write_config_error() {
  function test_current_state (line 359) | async fn test_current_state() {
  function test_multiple_upserts (line 380) | async fn test_multiple_upserts() {
  function test_config_prefix_in_saved_file (line 418) | async fn test_config_prefix_in_saved_file() {

FILE: backend/tauri/src/core/state_v2/manager/simple.rs
  type SimpleStateManager (line 4) | pub struct SimpleStateManager<State: Clone + Send + Sync + 'static> {
  function new (line 9) | pub fn new(state_coordinator: StateCoordinator<State>) -> Self {
  function current_state (line 13) | pub fn current_state(&self) -> Option<State> {
  function upsert (line 17) | pub async fn upsert(&mut self, state: State) -> Result<(), StateChangedE...

FILE: backend/tauri/src/core/storage.rs
  type StorageOperationError (line 11) | pub enum StorageOperationError {
  constant NYANPASU_TABLE (line 28) | pub const NYANPASU_TABLE: TableDefinition<&[u8], &[u8]> = TableDefinitio...
  type Result (line 30) | type Result<T> = StdResult<T, StorageOperationError>;
  type Storage (line 35) | pub struct Storage {
    method try_new (line 40) | pub fn try_new(path: &std::path::Path) -> Result<Self> {
  type Target (line 49) | type Target = Arc<StorageInner>;
  method deref (line 51) | fn deref(&self) -> &Self::Target {
  type StorageInner (line 56) | pub struct StorageInner {
    method create_and_init_database (line 81) | fn create_and_init_database(path: &std::path::Path) -> Result<redb::Da...
    method try_new (line 90) | pub fn try_new(path: &std::path::Path) -> Result<Self> {
    method get_instance (line 118) | pub fn get_instance(&self) -> &redb::Database {
    method notify_subscribers (line 122) | fn notify_subscribers(&self, key: impl AsRef<str>, value: Option<&[u8]...
    method get_rx (line 131) | fn get_rx(&self) -> tokio::sync::broadcast::Receiver<(String, Option<V...
  type StorageValueChangedEvent (line 64) | pub struct StorageValueChangedEvent {
  type WebStorage (line 70) | pub trait WebStorage {
    method get_item (line 71) | fn get_item<T: DeserializeOwned>(&self, key: impl AsRef<str>) -> Resul...
    method set_item (line 72) | fn set_item<T: Serialize>(&self, key: impl AsRef<str>, value: &T) -> R...
    method remove_item (line 73) | fn remove_item(&self, key: impl AsRef<str>) -> Result<()>;
    method get_all (line 75) | fn get_all(&self) -> Result<Vec<(String, String)>>;
    method clear (line 77) | fn clear(&self) -> Result<()>;
    method get_item (line 137) | fn get_item<T: DeserializeOwned>(&self, key: impl AsRef<str>) -> Resul...
    method set_item (line 153) | fn set_item<T: Serialize>(&self, key: impl AsRef<str>, value: &T) -> R...
    method remove_item (line 168) | fn remove_item(&self, key: impl AsRef<str>) -> Result<()> {
    method get_all (line 182) | fn get_all(&self) -> Result<Vec<(String, String)>> {
    method clear (line 196) | fn clear(&self) -> Result<()> {
  function register_web_storage_listener (line 222) | pub fn register_web_storage_listener(app_handle: &tauri::AppHandle) {
  function setup (line 242) | pub fn setup<R: tauri::Runtime, M: tauri::Manager<R>>(app: &M) -> anyhow...

FILE: backend/tauri/src/core/sysopt.rs
  type Sysopt (line 17) | pub struct Sysopt {
    method global (line 60) | pub fn global() -> &'static Sysopt {
    method init_sysproxy (line 72) | pub fn init_sysproxy(&self) -> Result<()> {
    method update_sysproxy (line 127) | pub fn update_sysproxy(&self) -> Result<()> {
    method reset_sysproxy (line 169) | pub fn reset_sysproxy(&self) -> Result<()> {
    method init_launch (line 209) | pub fn init_launch(&self) -> Result<()> {
    method update_launch (line 325) | pub fn update_launch(&self) -> Result<()> {
    method guard_proxy (line 346) | pub fn guard_proxy(&self) {
  function detect_desktop_environment (line 41) | fn detect_desktop_environment() -> String {
  function get_autostart_requirements (line 49) | fn get_autostart_requirements(desktop_env: &str) -> (bool, Vec<String>) {

FILE: backend/tauri/src/core/tasks/events.rs
  type TaskEvents (line 12) | pub struct TaskEvents {
    method new (line 24) | pub fn new(storage: Arc<Mutex<TaskStorage>>) -> Self {
    method new_event (line 28) | pub fn new_event(&self, task_id: TaskID, event_id: TaskEventID) -> Res...
  type TaskEventDispatcher (line 18) | pub struct TaskEventDispatcher {
    method new (line 48) | pub fn new(storage: Arc<Mutex<TaskStorage>>, event: TaskEvent) -> Self {
    method dispatch (line 51) | pub fn dispatch(&mut self, state: TaskEventState) -> Result<()> {
  type TaskEvent (line 66) | pub struct TaskEvent {
    method dispatch (line 106) | fn dispatch(&mut self, state: TaskEventState) {
  type TaskEventState (line 75) | pub enum TaskEventState {
    method fmt (line 83) | pub fn fmt(&self) -> &'static str {
  method default (line 94) | fn default() -> Self {

FILE: backend/tauri/src/core/tasks/executor.rs
  type JobExecutor (line 25) | pub trait JobExecutor: DynClone {
    method execute (line 26) | fn execute(&self) -> Result<()>;
    method execute (line 79) | fn execute(&self) -> Result<()> {
  type Job (line 31) | pub type Job = Box<dyn JobExecutor + Send + Sync>;
  type AsyncJobExecutor (line 34) | pub trait AsyncJobExecutor: DynClone {
    method execute (line 35) | async fn execute(&self) -> Result<()>;
    method execute (line 86) | async fn execute(&self) -> Result<()> {
  type AsyncJob (line 40) | pub type AsyncJob = Box<dyn AsyncJobExecutor + Send + Sync>;
  type TaskExecutor (line 43) | pub enum TaskExecutor {
    method fmt (line 49) | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
    method from (line 64) | fn from(job: Job) -> Self {
    method from (line 70) | fn from(job: AsyncJob) -> Self {
  method default (line 58) | fn default() -> Self {
  type DefaultJobExecutor (line 76) | struct DefaultJobExecutor {}
  method default (line 92) | fn default() -> Self {
  method default (line 98) | fn default() -> Self {

FILE: backend/tauri/src/core/tasks/jobs/events_rotate.rs
  constant CLEAR_EVENTS_TASK_NAME (line 12) | const CLEAR_EVENTS_TASK_NAME: &str = "Task Events Rotate";
  type EventsRotateJob (line 15) | pub struct EventsRotateJob {
    method new (line 20) | pub fn new(task_storage: Arc<Mutex<TaskStorage>>) -> Self {
  method execute (line 28) | async fn execute(&self) -> anyhow::Result<()> {
  method name (line 69) | fn name(&self) -> &'static str {
  method setup (line 73) | fn setup(&self) -> Option<crate::core::tasks::task::Task> {

FILE: backend/tauri/src/core/tasks/jobs/logger.rs
  constant CLEAR_LOG_TASK_NAME (line 19) | const CLEAR_LOG_TASK_NAME: &str = "clear_logs";
  type ClearLogsJob (line 22) | pub struct ClearLogsJob;
  function clear_logs (line 25) | pub fn clear_logs() -> Result<()> {
  method execute (line 93) | async fn execute(&self) -> Result<()> {
  method name (line 99) | fn name(&self) -> &'static str {
  method setup (line 103) | fn setup(&self) -> Option<crate::core::tasks::task::Task> {

FILE: backend/tauri/src/core/tasks/jobs/mod.rs
  type JobExt (line 13) | pub trait JobExt {
    method name (line 14) | fn name(&self) -> &'static str;
    method setup (line 15) | fn setup(&self) -> Option<Task>;
  type JobsManager (line 18) | pub struct JobsManager {
    method new (line 24) | pub fn new(task_manager: Arc<RwLock<TaskManager>>) -> Self {
    method setup (line 31) | pub fn setup(&mut self) -> anyhow::Result<()> {
  method notify_config_changed (line 47) | fn notify_config_changed(&self, job_name: &str) -> Result<()> {

FILE: backend/tauri/src/core/tasks/jobs/profiles.rs
  constant INITIAL_TASK_ID (line 14) | const INITIAL_TASK_ID: TaskID = 10000000;
  type Minutes (line 16) | type Minutes = u64;
  type ProfileUID (line 17) | type ProfileUID = String;
  type ProfileUpdater (line 20) | pub struct ProfileUpdater(ProfileUID);
    method new (line 24) | pub fn new(profile_uid: &str) -> Self {
  method execute (line 31) | async fn execute(&self) -> Result<()> {
  type ProfileTaskOp (line 43) | enum ProfileTaskOp {
  type ProfilesJob (line 49) | pub struct ProfilesJob {
    method new (line 76) | pub fn new(task_manager: Arc<RwLock<TaskManager>>) -> Self {
    method init (line 84) | pub fn init(&mut self) -> Result<()> {
    method refresh (line 118) | pub fn refresh(&mut self) {
    method diff (line 147) | fn diff(&self) -> HashMap<ProfileUID, ProfileTaskOp> {
  type ProfilesJobGuard (line 55) | pub struct ProfilesJobGuard {
    method new (line 60) | pub fn new(task_manager: Arc<RwLock<TaskManager>>) -> Self {
  type Target (line 68) | type Target = Arc<RwLock<ProfilesJob>>;
  method deref (line 70) | fn deref(&self) -> &Self::Target {
  function gen_map (line 176) | fn gen_map() -> HashMap<ProfileUID, Minutes> {
  function get_task_id (line 195) | fn get_task_id(uid: &str) -> TaskID {
  function new_task (line 204) | fn new_task(task_id: TaskID, profile_uid: &str, interval: Minutes) -> Ta...

FILE: backend/tauri/src/core/tasks/mod.rs
  function setup (line 8) | pub fn setup<R: tauri::Runtime, M: tauri::Manager<R>>(

FILE: backend/tauri/src/core/tasks/storage.rs
  type TaskStorage (line 15) | pub struct TaskStorage {
    constant TASKS_KEY (line 22) | const TASKS_KEY: &str = "tasks";
    method new (line 24) | pub fn new(storage: Storage) -> Self {
    method list_tasks (line 29) | pub fn list_tasks(&self) -> Result<Vec<TaskID>> {
    method add_task (line 44) | pub fn add_task(&self, task_id: TaskID) -> Result<()> {
    method remove_task (line 65) | pub fn remove_task(&self, _task_id: TaskID) -> Result<()> {
    method get_event (line 77) | pub fn get_event(&self, event_id: TaskEventID) -> Result<Option<TaskEv...
    method get_events (line 94) | pub fn get_events(&self, task_id: TaskID) -> Result<Option<Vec<TaskEve...
    method get_event_ids (line 108) | pub fn get_event_ids(&self, task_id: TaskID) -> Result<Option<Vec<Task...
    method add_event (line 122) | pub fn add_event(&self, event: &TaskEvent) -> Result<()> {
    method update_event (line 142) | pub fn update_event(&self, event: &TaskEvent) -> Result<()> {
    method remove_event (line 157) | pub fn remove_event(&self, event_id: TaskEventID, task_id: TaskID) -> ...
    method get_instance (line 181) | fn get_instance(&self) -> &redb::Database {
  type TaskGuard (line 187) | pub trait TaskGuard {
    method restore (line 188) | fn restore(&mut self) -> Result<()>;
    method dump (line 189) | fn dump(&self) -> Result<()>;
    method restore (line 194) | fn restore(&mut self) -> Result<()> {
    method dump (line 221) | fn dump(&self) -> Result<()> {
  function test_hashset_eq_vec (line 243) | fn test_hashset_eq_vec() {

FILE: backend/tauri/src/core/tasks/task.rs
  type TaskID (line 19) | pub type TaskID = u64;
  type TaskEventID (line 20) | pub type TaskEventID = i64;
  type TaskState (line 23) | pub enum TaskState {
  type TaskRunResult (line 31) | pub enum TaskRunResult {
  type TaskSchedule (line 37) | pub enum TaskSchedule {
  method default (line 45) | fn default() -> Self {
  type TaskOptions (line 52) | pub struct TaskOptions {
  method default (line 57) | fn default() -> Self {
  type Task (line 65) | pub struct Task {
  method default (line 82) | fn default() -> Self {
  type Timestamp (line 97) | pub type Timestamp = i64;
  function build_task (line 134) | fn build_task<'a>(task: Task, len: usize) -> (Task, TimerTaskBuilder<'a>) {
  type TaskList (line 201) | type TaskList = Arc<RW<Vec<Task>>>;
  type TaskListOps (line 202) | trait TaskListOps {
    method get_task_state (line 203) | fn get_task_state(&self, task_id: TaskID) -> Result<TaskState>;
    method set_task_state (line 204) | fn set_task_state(
    method get_task_state (line 212) | fn get_task_state(&self, task_id: TaskID) -> Result<TaskState> {
    method set_task_state (line 221) | fn set_task_state(
  type TaskManager (line 253) | pub struct TaskManager {
    method new (line 266) | pub fn new(storage: TaskStorage) -> Self {
    method get_inner_task_storage (line 282) | pub(super) fn get_inner_task_storage(&self) -> Arc<Mutex<TaskStorage>> {
    method restore_tasks (line 286) | pub fn restore_tasks(&mut self, tasks: Vec<Task>) {
    method add_task (line 305) | pub fn add_task(&mut self, task: Task) -> Result<()> {
    method get_task_from_restored (line 375) | fn get_task_from_restored(&self, task_id: TaskID) -> Option<Task> {
    method pick_task (line 381) | pub fn pick_task(&self, task_id: TaskID) -> Result<Task> {
    method total (line 390) | pub fn total(&self) -> usize {
    method list (line 397) | pub fn list(&self) -> Vec<Task> {
    method remove_task (line 402) | pub fn remove_task(&mut self, task_id: TaskID) -> Result<()> {
    method advance_task (line 418) | pub fn advance_task(&mut self, task_id: TaskID) -> Result<()> {

FILE: backend/tauri/src/core/tasks/utils.rs
  type TaskCreationError (line 4) | pub enum TaskCreationError {
  type Error (line 11) | pub enum Error {
    method new_task_error (line 50) | pub fn new_task_error(message: String, source: delay_timer::error::Tas...
  type Result (line 47) | pub type Result<T> = std::result::Result<T, Error>;
  type ConfigChangedNotifier (line 55) | pub trait ConfigChangedNotifier {
    method notify_config_changed (line 57) | fn notify_config_changed(&self, task_name: &str) -> Result<()>;

FILE: backend/tauri/src/core/tray/icon.rs
  type TrayIcon (line 12) | pub enum TrayIcon {
    method raw_bytes (line 50) | pub fn raw_bytes(&self) -> &'static [u8] {
    method all_supported (line 58) | pub fn all_supported() -> &'static [TrayIcon] {
    method as_str (line 62) | pub fn as_str(&self) -> &'static str {
  method fmt (line 20) | fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
  function from (line 30) | fn from(icon: TrayIcon) -> Self {
  function from (line 40) | fn from(icon: &TrayIcon) -> Self {
  function get_raw_icon (line 72) | pub fn get_raw_icon<'n>(mode: TrayIcon) -> Cow<'n, [u8]> {
  function resize_image (line 86) | fn resize_image(mode: TrayIcon, scale_factor: f64) {
  function resize_images (line 108) | pub fn resize_images(scale_factor: f64) {
  function set_icon (line 114) | pub fn set_icon(mode: TrayIcon, path: Option<PathBuf>) -> anyhow::Result...
  function on_scale_factor_changed (line 131) | pub fn on_scale_factor_changed(scale_factor: f64) {
  function get_icon (line 136) | pub fn get_icon(mode: &TrayIcon) -> Vec<u8> {

FILE: backend/tauri/src/core/tray/mod.rs
  type TrayState (line 27) | struct TrayState<R: Runtime> {
  type Tray (line 31) | pub struct Tray {}
    method tray_menu (line 149) | pub fn tray_menu<R: Runtime>(app_handle: &AppHandle<R>) -> Result<Menu...
    method update_systray (line 208) | pub fn update_systray(app_handle: &AppHandle<tauri::Wry>) -> Result<()> {
    method update_part (line 299) | pub fn update_part<R: Runtime>(app_handle: &AppHandle<R>) -> Result<()> {
    method on_menu_item_event (line 400) | pub fn on_menu_item_event(app_handle: &AppHandle, event: MenuEvent) {
    method on_system_tray_event (line 431) | pub fn on_system_tray_event(tray_icon: &TrayIcon, event: TrayIconEvent) {
  constant TRAY_ID (line 36) | const TRAY_ID: &str = "main-tray";
  function get_tray_id (line 47) | fn get_tray_id<'n>() -> Cow<'n, str> {

FILE: backend/tauri/src/core/tray/proxies.rs
  function loop_task (line 15) | async fn loop_task() {
  type GroupName (line 42) | type GroupName = String;
  type ProxyName (line 43) | type ProxyName = String;
  type FromProxy (line 44) | type FromProxy = ProxyName;
  type ToProxy (line 45) | type ToProxy = ProxyName;
  type ProxySelectAction (line 46) | type ProxySelectAction = (GroupName, FromProxy, ToProxy);
  type TrayUpdateType (line 48) | enum TrayUpdateType {
  type TrayProxyItem (line 54) | struct TrayProxyItem {
  type TrayProxies (line 59) | type TrayProxies = IndexMap<String, TrayProxyItem>;
  function to_tray_proxies (line 62) | fn to_tray_proxies(mode: &str, raw_proxies: &Proxies) -> TrayProxies {
  function diff_proxies (line 90) | fn diff_proxies(old_proxies: &TrayProxies, new_proxies: &TrayProxies) ->...
  function proxies_updated_receiver (line 144) | pub async fn proxies_updated_receiver() {
  function setup_proxies (line 209) | pub fn setup_proxies() {
  function generate_group_selector (line 239) | pub fn generate_group_selector<R: Runtime>(
  function generate_selectors (line 276) | pub fn generate_selectors<R: Runtime>(
  function setup_tray (line 301) | pub fn setup_tray<'m, R: Runtime, M: Manager<R>>(
  function update_selected_proxies (line 343) | pub fn update_selected_proxies(actions: &[ProxySelectAction]) {
  type SystemTrayMenuProxiesExt (line 479) | pub trait SystemTrayMenuProxiesExt<R: Runtime> {
    method setup_proxies (line 480) | fn setup_proxies(self, app_handle: &AppHandle<R>) -> anyhow::Result<Self>
  function setup_proxies (line 486) | fn setup_proxies(self, app_handle: &AppHandle<R>) -> anyhow::Result<Self> {
  function on_system_tray_event (line 492) | pub fn on_system_tray_event(event: &str) {

FILE: backend/tauri/src/core/updater/instance.rs
  type UpdaterState (line 19) | pub enum UpdaterState {
  type DownloaderWithDynCallback (line 30) | type DownloaderWithDynCallback = Downloader<Box<dyn Fn(DownloaderState) ...
  type Updater (line 32) | pub(super) struct Updater {
    method dispatch_state (line 151) | fn dispatch_state(&self, state: UpdaterState) {
    method decompress_and_set_permission (line 157) | async fn decompress_and_set_permission(&self) -> anyhow::Result<()> {
    method replace_core (line 215) | async fn replace_core(&self) -> anyhow::Result<()> {
    method start (line 290) | pub async fn start(&self) {
    method get_report (line 343) | pub fn get_report(&self) -> UpdaterSummary {
    method get_updater_id (line 351) | pub fn get_updater_id(&self) -> usize {
  type UpdaterInner (line 42) | struct UpdaterInner {
  type UpdaterSummary (line 47) | pub struct UpdaterSummary {
  type UpdaterBuilder (line 53) | pub(super) struct UpdaterBuilder {
    method new (line 62) | pub fn new() -> Self {
    method set_client (line 72) | pub fn set_client(mut self, client: reqwest::Client) -> Self {
    method set_core_type (line 77) | pub fn set_core_type(mut self, core_type: ClashCore) -> Self {
    method set_artifact (line 82) | pub fn set_artifact(mut self, artifact: String) -> Self {
    method set_tag (line 87) | pub fn set_tag(mut self, tag: CoreTypeMeta) -> Self {
    method set_mirror (line 92) | pub fn set_mirror(mut self, mirror: String) -> Self {
    method build (line 97) | pub async fn build(self) -> anyhow::Result<Updater> {

FILE: backend/tauri/src/core/updater/mod.rs
  type UpdaterManager (line 22) | pub struct UpdaterManager {
    method new (line 139) | pub fn new() -> Self {
    method global (line 143) | pub fn global() -> &'static RwLock<Self> {
    method get_latest_versions (line 148) | pub fn get_latest_versions(&self) -> ManifestVersionLatest {
    method get_mirror (line 152) | pub fn get_mirror(&self) -> Option<String> {
    method get_latest_version_manifest (line 156) | async fn get_latest_version_manifest(&self, mirror: &str) -> Result<Ma...
    method fetch_latest (line 173) | pub async fn fetch_latest(&mut self) -> Result<()> {
    method mirror_speed_test (line 183) | pub async fn mirror_speed_test(&self) -> Result<()> {
    method update_core (line 211) | pub async fn update_core(&mut self, core_type: &ClashCore) -> Result<u...
    method inspect_updater (line 237) | pub fn inspect_updater(&self, updater_id: usize) -> Option<UpdaterSumm...
  method default (line 30) | fn default() -> Self {
  type ManifestVersion (line 41) | pub struct ManifestVersion {
    method get_matches (line 91) | pub(self) fn get_matches(&self, core_type: &ClashCore) -> Option<(Stri...
  type ManifestVersionLatest (line 50) | pub struct ManifestVersionLatest {
  type ArchTemplate (line 59) | pub struct ArchTemplate {
  method default (line 68) | fn default() -> Self {
  method default (line 79) | fn default() -> Self {

FILE: backend/tauri/src/core/updater/shared.rs
  function get_arch (line 1) | pub(super) fn get_arch() -> anyhow::Result<&'static str> {
  type CoreTypeMeta (line 27) | pub(super) enum CoreTypeMeta {
  function get_download_path (line 35) | pub(super) fn get_download_path(core_type: CoreTypeMeta, artifact: &str)...

FILE: backend/tauri/src/core/win_uwp.rs
  function invoke_uwptools (line 9) | pub async fn invoke_uwptools() -> Result<()> {

FILE: backend/tauri/src/enhance/advice.rs
  function chain_advice (line 7) | pub fn chain_advice(config: &Mapping) -> ProcessOutput {

FILE: backend/tauri/src/enhance/builtin/config_fixer.js
  function main (line 1) | function main(params) {

FILE: backend/tauri/src/enhance/builtin/meta_guard.js
  function main (line 1) | function main(params) {

FILE: backend/tauri/src/enhance/builtin/meta_hy_alpn.js
  function main (line 1) | function main(params) {

FILE: backend/tauri/src/enhance/chain.rs
  type PostProcessingOutput (line 23) | pub struct PostProcessingOutput {
  type ChainItem (line 34) | pub struct ChainItem {
    type Error (line 88) | type Error = anyhow::Error;
    method try_from (line 90) | fn try_from(item: &Profile) -> Result<Self, Self::Error> {
    method builtin (line 145) | pub fn builtin() -> Vec<(BitFlags<ClashCore>, ChainItem)> {
    method to_script (line 178) | pub fn to_script<U: Into<String>, D: Into<ChainTypeWrapper>>(uid: U, d...
  type ChainTypeWrapper (line 40) | pub enum ChainTypeWrapper {
    method new_js (line 46) | pub fn new_js(data: Data) -> Self {
    method new_lua (line 50) | pub fn new_lua(data: Data) -> Self {
    method new_merge (line 54) | pub fn new_merge(data: Mapping) -> Self {
    type Error (line 60) | type Error = anyhow::Error;
    method try_from (line 62) | fn try_from(item: &Profile) -> Result<Self, Self::Error> {
  function from (line 98) | fn from(item: &Profile) -> Self {
  type Data (line 108) | type Data = String;
  type ScriptWrapper (line 110) | pub struct ScriptWrapper(pub ScriptType, pub Data);
  type ChainType (line 113) | pub enum ChainType {
  type ScriptType (line 134) | pub enum ScriptType {

FILE: backend/tauri/src/enhance/field.rs
  constant HANDLE_FIELDS (line 4) | pub const HANDLE_FIELDS: [&str; 9] = [
  constant DEFAULT_FIELDS (line 16) | pub const DEFAULT_FIELDS: [&str; 5] = [
  constant OTHERS_FIELDS (line 24) | pub const OTHERS_FIELDS: [&str; 31] = [
  function use_clash_fields (line 58) | pub fn use_clash_fields() -> Vec<String> {
  function use_valid_fields (line 67) | pub fn use_valid_fields(valid: &[String]) -> Vec<String> {
  function use_whitelist_fields_filter (line 80) | pub fn use_whitelist_fields_filter(config: Mapping, filter: &[String], e...
  function use_lowercase (line 97) | pub fn use_lowercase(config: Mapping) -> Mapping {
  function use_sort (line 115) | pub fn use_sort(config: Mapping, enable_filter: bool) -> Mapping {
  function use_keys (line 149) | pub fn use_keys(config: &Mapping) -> Vec<String> {

FILE: backend/tauri/src/enhance/merge.rs
  function override_recursive (line 8) | fn override_recursive(config: &mut Mapping, key: &Value, data: Value) {
  function find_field (line 27) | fn find_field<'a>(config: &'a mut Value, key: &'a str) -> Option<&'a mut...
  function merge_sequence (line 50) | fn merge_sequence(target: &mut Value, to_merge: &Value, append: bool) {
  function run_expr (line 62) | fn run_expr<T: DeserializeOwned>(logs: &mut Logs, item: &Value, expr: &s...
  function do_filter (line 99) | fn do_filter(logs: &mut Logs, config: &mut Value, field_str: &str, filte...
  function use_merge (line 242) | pub fn use_merge(merge: &Mapping, mut config: Mapping) -> ProcessOutput {
  function test_find_field (line 325) | fn test_find_field() {
  function test_merge_append (line 348) | fn test_merge_append() {
  function test_prepend (line 392) | fn test_prepend() {
  function test_override (line 436) | fn test_override() {
  function test_filter_string (line 479) | fn test_filter_string() {
  function test_filter_when_and_expr (line 576) | fn test_filter_when_and_expr() {
  function test_filter_when_and_override (line 661) | fn test_filter_when_and_override() {
  function test_filter_when_and_merge (line 726) | fn test_filter_when_and_merge() {
  function test_filter_when_and_remove (line 809) | fn test_filter_when_and_remove() {
  function test_filter_sequence (line 943) | fn test_filter_sequence() {
  function test_override_recursive (line 1032) | fn test_override_recursive() {

FILE: backend/tauri/src/enhance/mod.rs
  function enhance (line 22) | pub async fn enhance() -> (Mapping, Vec<String>, PostProcessingOutput) {
  function use_include_all_proxy_groups (line 163) | fn use_include_all_proxy_groups(mut config: Mapping) -> Mapping {
  function use_cache (line 250) | fn use_cache(mut config: Mapping) -> Mapping {
  function test_use_cache (line 268) | fn test_use_cache() {
  function test_use_include_all_proxy_groups (line 294) | fn test_use_include_all_proxy_groups() {

FILE: backend/tauri/src/enhance/script/js.rs
  type Result (line 30) | type Result<T, E = JsRunnerError> = StdResult<T, E>;
  type JsRunnerError (line 42) | pub enum JsRunnerError {
  type BoaConsoleLogger (line 55) | pub struct BoaConsoleLogger(Logs);
    type Item (line 57) | type Item = boa_utils::LogMessage;
    method log (line 58) | fn log(&mut self, msg: boa_utils::LogMessage, _: &Console) {
    method take (line 68) | fn take(&mut self) -> Vec<Self::Item> {
    method take (line 82) | pub fn take(&mut self) -> Logs {
  function take_console_logs (line 88) | fn take_console_logs() -> Logs {
  type JSRunner (line 100) | pub struct JSRunner;
  type BoaRunner (line 103) | pub struct BoaRunner {
    method try_new (line 109) | pub fn try_new() -> Result<Self> {
    method setup_console (line 127) | pub fn setup_console(&self, logger: BoaConsoleLogger) -> Result<()> {
    method get_ctx (line 136) | pub fn get_ctx(&self) -> Rc<RefCell<Context>> {
    method parse_module (line 141) | pub fn parse_module(&self, source: &str, name: &str) -> Result<Module> {
    method execute_module (line 157) | pub fn execute_module(&self, module: &Module) -> Result<()> {
  method try_new (line 189) | fn try_new() -> Result<JSRunner, anyhow::Error> {
  method process (line 193) | async fn process(&self, mapping: Mapping, path: &str) -> ProcessOutput {
  method process_honey (line 202) | async fn process_honey(&self, mapping: Mapping, script: &str) -> Process...
  type DefaultExport (line 294) | struct DefaultExport {
  type FunctionVisitor (line 300) | struct FunctionVisitor<'n> {
  function visit_module_export_name (line 308) | fn visit_module_export_name(&mut self, it: &oxc_ast::ast::ModuleExportNa...
  function visit_function (line 324) | fn visit_function(&mut self, it: &oxc_ast::ast::Function<'n>, flags: Sco...
  function visit_export_default_declaration (line 334) | fn visit_export_default_declaration(
  function wrap_script_if_not_esm (line 349) | pub fn wrap_script_if_not_esm(script: &str) -> Result<Cow<'_, str>, anyh...
  function test_wrap_script_if_not_esm (line 394) | fn test_wrap_script_if_not_esm() {
  function test_wrap_script_if_esm (line 406) | fn test_wrap_script_if_esm() {
  function test_wrap_script_if_not_esm_sample_2 (line 417) | fn test_wrap_script_if_not_esm_sample_2() {
  function test_process_honey (line 463) | fn test_process_honey() {
  function test_process_honey_with_fetch (line 523) | fn test_process_honey_with_fetch() {
  function test_process_honey_with_builtin_modules (line 587) | fn test_process_honey_with_builtin_modules() {

FILE: backend/tauri/src/enhance/script/lua/mod.rs
  function create_lua_context (line 12) | pub fn create_lua_context() -> Result<Lua, anyhow::Error> {
  function create_console (line 18) | fn create_console(lua: &Lua, logger: Arc<Mutex<Option<Logs>>>) -> Result...
  function correct_original_mapping_order (line 55) | fn correct_original_mapping_order(target: &mut Value, original: &Value) {
  type LuaRunner (line 93) | pub struct LuaRunner;
  method try_new (line 97) | fn try_new() -> Result<Self, Error> {
  method process (line 101) | async fn process(&self, mapping: Mapping, path: &str) -> ProcessOutput {
  method process_honey (line 106) | async fn process_honey(&self, mapping: Mapping, script: &str) -> Process...
  function test_process_honey (line 154) | fn test_process_honey() {
  function test_correct_original_mapping_order (line 195) | fn test_correct_original_mapping_order() {

FILE: backend/tauri/src/enhance/script/runner.rs
  type ProcessOutput (line 11) | pub type ProcessOutput = (Result<Mapping, anyhow::Error>, Logs);
  type Runner (line 33) | pub trait Runner: Send + Sync {
    method try_new (line 34) | fn try_new() -> Result<Self, Error>
    method process (line 39) | async fn process(&self, mapping: Mapping, path: &str) -> ProcessOutput;
    method process_honey (line 43) | async fn process_honey(&self, mapping: Mapping, script: &str) -> Proce...
  type RunnerManager (line 49) | pub struct RunnerManager {
    method new (line 54) | pub fn new() -> Self {
    method get_or_init_runner (line 60) | pub fn get_or_init_runner(&mut self, script_type: &ScriptType) -> anyh...
    method process_script (line 71) | pub async fn process_script(

FILE: backend/tauri/src/enhance/tun.rs
  function use_tun (line 26) | pub fn use_tun(mut config: Mapping, enable: bool) -> Mapping {
  function use_dns_for_tun (line 77) | fn use_dns_for_tun(mut config: Mapping) -> Mapping {

FILE: backend/tauri/src/enhance/utils.rs
  function convert_uids_to_scripts (line 11) | pub fn convert_uids_to_scripts(profiles: &Profiles, uids: &[ProfileUid])...
  type LogSpan (line 20) | pub enum LogSpan {
    method as_ref (line 28) | fn as_ref(&self) -> &str {
  type Logs (line 38) | pub type Logs = Vec<(LogSpan, String)>;
  type LogsExt (line 39) | pub trait LogsExt {
    method span (line 40) | fn span<T: AsRef<str>>(&mut self, span: LogSpan, msg: T);
    method log (line 41) | fn log<T: AsRef<str>>(&mut self, msg: T);
    method info (line 42) | fn info<T: AsRef<str>>(&mut self, msg: T);
    method warn (line 43) | fn warn<T: AsRef<str>>(&mut self, msg: T);
    method error (line 44) | fn error<T: AsRef<str>>(&mut self, msg: T);
    method span (line 47) | fn span<T: AsRef<str>>(&mut self, span: LogSpan, msg: T) {
    method log (line 50) | fn log<T: AsRef<str>>(&mut self, msg: T) {
    method info (line 53) | fn info<T: AsRef<str>>(&mut self, msg: T) {
    method warn (line 56) | fn warn<T: AsRef<str>>(&mut self, msg: T) {
    method error (line 59) | fn error<T: AsRef<str>>(&mut self, msg: T) {
  function take_logs (line 64) | pub fn take_logs(logs: Arc<Mutex<Option<Logs>>>) -> Logs {
  function merge_profiles (line 72) | pub fn merge_profiles<T: Borrow<String>>(mappings: IndexMap<T, Mapping>)...
  function process_chain (line 92) | pub async fn process_chain(
  function test_process_chain_order (line 137) | async fn test_process_chain_order() {

FILE: backend/tauri/src/event_handler/mod.rs
  function mount_handlers (line 7) | pub fn mount_handlers<M, R>(_app: &mut M)

FILE: backend/tauri/src/event_handler/widget.rs
  type WidgetInstance (line 3) | pub enum WidgetInstance {
  function on_network_statistic_config_changed (line 9) | pub(super) fn on_network_statistic_config_changed<R: Runtime>(

FILE: backend/tauri/src/feat.rs
  function open_dashboard (line 34) | pub fn open_dashboard() {
  function close_dashboard (line 44) | pub fn close_dashboard() {
  function toggle_dashboard (line 53) | pub fn toggle_dashboard() {
  function restart_clash_core (line 65) | pub fn restart_clash_core() {
  function change_clash_mode (line 81) | pub fn change_clash_mode(mode: String) {
  function toggle_system_proxy (line 117) | pub fn toggle_system_proxy() {
  function enable_system_proxy (line 135) | pub fn enable_system_proxy() {
  function disable_system_proxy (line 150) | pub fn disable_system_proxy() {
  function toggle_tun_mode (line 165) | pub fn toggle_tun_mode() {
  function enable_tun_mode (line 183) | pub fn enable_tun_mode() {
  function disable_tun_mode (line 198) | pub fn disable_tun_mode() {
  function patch_clash (line 213) | pub async fn patch_clash(patch: Mapping) -> Result<()> {
  function patch_verge (line 294) | pub async fn patch_verge(patch: IVerge) -> Result<()> {
  function update_profile (line 424) | pub async fn update_profile<T: Borrow<String>>(
  function update_core_config (line 482) | async fn update_core_config() -> Result<()> {
  function copy_clash_env (line 497) | pub fn copy_clash_env(app_handle: &AppHandle, option: &str) {
  function update_proxies_buff (line 529) | pub fn update_proxies_buff(rx: Option<tokio::sync::oneshot::Receiver<()>...

FILE: backend/tauri/src/ipc.rs
  type IpcError (line 26) | pub enum IpcError {
    method from (line 44) | fn from(s: String) -> Self {
    method serialize (line 50) | fn serialize<S>(&self, serializer: S) -> StdResult<S::Ok, S::Error>
    method inline (line 59) | fn inline(
  type Result (line 67) | type Result<T = ()> = StdResult<T, IpcError>;
  type GetSysProxyResponse (line 71) | pub struct GetSysProxyResponse {
  function get_profiles (line 85) | pub fn get_profiles() -> Result<Profiles> {
  function is_portable (line 92) | pub fn is_portable() -> Result<bool> {
  function is_portable (line 99) | pub fn is_portable() -> Result<bool> {
  function enhance_profiles (line 105) | pub async fn enhance_profiles() -> Result {
  function import_profile (line 113) | pub async fn import_profile(url: String, option: Option<RemoteProfileOpt...
  function create_profile (line 148) | pub async fn create_profile(item: ProfileBuilder, file_data: Option<Stri...
  function reorder_profile (line 211) | pub async fn reorder_profile(active_id: String, over_id: String) -> Resu...
  function reorder_profiles_by_list (line 219) | pub fn reorder_profiles_by_list(list: Vec<String>) -> Result {
  function update_profile (line 227) | pub async fn update_profile(uid: String, option: Option<RemoteProfileOpt...
  function delete_profile (line 234) | pub async fn delete_profile(uid: String) -> Result {
  function patch_profiles_config (line 257) | pub async fn patch_profiles_config(profiles: ProfilesBuilder) -> Result {
  function patch_profile (line 282) | pub async fn patch_profile(app_handle: AppHandle, uid: String, profile: ...
  function view_profile (line 328) | pub fn view_profile(app_handle: tauri::AppHandle, uid: String) -> Result {
  function read_profile_file (line 348) | pub fn read_profile_file(uid: String) -> Result<String> {
  function save_profile_file (line 365) | pub fn save_profile_file(uid: String, file_data: Option<String>) -> Resu...
  function get_clash_info (line 379) | pub fn get_clash_info() -> Result<ClashInfo> {
  function get_runtime_config (line 386) | pub fn get_runtime_config() -> Result<Option<serde_json::Value>> {
  function get_runtime_yaml (line 400) | pub fn get_runtime_yaml() -> Result<String> {
  function get_runtime_exists (line 414) | pub fn get_runtime_exists() -> Result<Vec<String>> {
  function get_postprocessing_output (line 420) | pub fn get_postprocessing_output() -> Result<PostProcessingOutput> {
  function get_core_status (line 426) | pub async fn get_core_status<'n>() -> Result<(Cow<'n, CoreState>, i64, R...
  function url_delay_test (line 432) | pub async fn url_delay_test(url: &str, expected_status: u16) -> Result<O...
  function get_ipsb_asn (line 438) | pub async fn get_ipsb_asn() -> Result<serde_json::Value> {
  function patch_clash_config (line 446) | pub async fn patch_clash_config(payload: PatchRuntimeConfig) -> Result {
  function get_verge_config (line 467) | pub fn get_verge_config() -> Result<IVerge> {
  function patch_verge_config (line 473) | pub async fn patch_verge_config(payload: IVerge) -> Result {
  function change_clash_core (line 480) | pub async fn change_clash_core(clash_core: Option<nyanpasu::ClashCore>) ...
  function restart_sidecar (line 488) | pub async fn restart_sidecar() -> Result {
  function get_sys_proxy (line 497) | pub fn get_sys_proxy() -> Result<GetSysProxyResponse> {
  function get_clash_logs (line 513) | pub fn get_clash_logs() -> Result<VecDeque<String>> {
  function open_app_config_dir (line 519) | pub fn open_app_config_dir() -> Result<()> {
  function open_app_data_dir (line 527) | pub fn open_app_data_dir() -> Result<()> {
  function open_core_dir (line 535) | pub fn open_core_dir() -> Result<()> {
  function get_core_dir (line 546) | pub fn get_core_dir() -> Result<String> {
  function open_logs_dir (line 557) | pub fn open_logs_dir() -> Result<()> {
  function open_web_url (line 565) | pub fn open_web_url(url: String) -> Result<()> {
  function fetch_latest_core_versions (line 572) | pub async fn fetch_latest_core_versions() -> Result<ManifestVersionLates...
  function get_core_version (line 581) | pub async fn get_core_version(
  function collect_logs (line 593) | pub async fn collect_logs(app_handle: AppHandle) -> Result {
  function update_core (line 618) | pub async fn update_core(core_type: nyanpasu::ClashCore) -> Result<usize> {
  function inspect_updater (line 629) | pub async fn inspect_updater(updater_id: usize) -> Result<updater::Updat...
  function clash_api_get_proxy_delay (line 640) | pub async fn clash_api_get_proxy_delay(
  function get_proxies (line 652) | pub async fn get_proxies() -> Result<crate::core::clash::proxies::Proxie...
  function mutate_proxies (line 671) | pub async fn mutate_proxies() -> Result<crate::core::clash::proxies::Pro...
  function select_proxy (line 679) | pub async fn select_proxy(group: String, name: String) -> Result<()> {
  function update_proxy_provider (line 692) | pub async fn update_proxy_provider(name: String) -> Result<()> {
  function collect_envs (line 704) | pub fn collect_envs<'a>() -> Result<EnvInfo<'a>> {
  function open_that (line 710) | pub fn open_that(path: String) -> Result {
  function is_appimage (line 717) | pub fn is_appimage() -> Result<bool> {
  function get_custom_app_dir (line 724) | pub fn get_custom_app_dir() -> Result<Option<String>> {
  function get_custom_app_dir (line 736) | pub fn get_custom_app_dir() -> Result<Option<String>> {
  function set_custom_app_dir (line 743) | pub async fn set_custom_app_dir(app_handle: tauri::AppHandle, path: Stri...
  function restart_application (line 782) | pub fn restart_application(app_handle: tauri::AppHandle) -> Result {
  function get_server_port (line 789) | pub fn get_server_port() -> Result<u16> {
  function set_custom_app_dir (line 796) | pub async fn set_custom_app_dir(_path: String) -> Result {
  function invoke_uwp_tool (line 807) | pub async fn invoke_uwp_tool() -> Result {
  function set_tray_icon (line 815) | pub async fn set_tray_icon(
  function is_tray_icon_set (line 827) | pub async fn is_tray_icon_set(mode: TrayIcon) -> Result<bool> {
  function status_service (line 838) | pub async fn status_service<'a>() -> Result<nyanpasu_ipc::types::StatusI...
  function install_service (line 845) | pub async fn install_service() -> Result {
  function uninstall_service (line 852) | pub async fn uninstall_service() -> Result {
  function start_service (line 859) | pub async fn start_service() -> Result {
  function stop_service (line 876) | pub async fn stop_service() -> Result {
  function restart_service (line 893) | pub async fn restart_service() -> Result {
  function invoke_uwp_tool (line 915) | pub async fn invoke_uwp_tool() -> Result {
  function get_service_install_prompt (line 922) | pub async fn get_service_install_prompt() -> Result<String> {
  function cleanup_processes (line 937) | pub fn cleanup_processes(app_handle: AppHandle) -> Result {
  constant WEB_STORAGE_KEY_PREFIX (line 945) | const WEB_STORAGE_KEY_PREFIX: &str = "web:";
  function web_key (line 947) | fn web_key(key: &str) -> String {
  function get_storage_item (line 953) | pub fn get_storage_item(app_handle: AppHandle, key: String) -> Result<Op...
  function set_storage_item (line 961) | pub fn set_storage_item(app_handle: AppHandle, key: String, value: Strin...
  function remove_storage_item (line 969) | pub fn remove_storage_item(app_handle: AppHandle, key: String) -> Result {
  type StorageEntry (line 976) | pub struct StorageEntry {
  function get_all_storage_items (line 986) | pub fn get_all_storage_items(app_handle: AppHandle) -> Result<Vec<Storag...
  function clear_storage (line 1006) | pub fn clear_storage(app_handle: AppHandle) -> Result {
  function get_clash_ws_connections_state (line 1022) | pub async fn get_clash_ws_connections_state(
  type UpdateWrapper (line 1033) | pub struct UpdateWrapper {
  function check_update (line 1045) | pub async fn check_update(webview: tauri::Webview) -> Result<Option<Upda...
  function save_window_size_state (line 1112) | pub fn save_window_size_state(app_handle: AppHandle, label: String) -> R...
  function create_main_window (line 1129) | pub fn create_main_window(app_handle: AppHandle) -> Result<()> {
  function create_legacy_window (line 1144) | pub fn create_legacy_window(app_handle: AppHandle) -> Result<()> {
  function create_editor_window (line 1159) | pub fn create_editor_window(app_handle: AppHandle, uid: String) -> Resul...

FILE: backend/tauri/src/lib.rs
  function deadlock_detection (line 42) | fn deadlock_detection() {
  function run (line 67) | pub fn run() -> std::io::Result<()> {

FILE: backend/tauri/src/logging/indexer.rs
  type LoggingLevel (line 23) | pub enum LoggingLevel {
  type LogEntry (line 33) | pub struct LogEntry {
  type CurrentPos (line 51) | struct CurrentPos {
  type Query (line 57) | pub struct Query {
  type LineNumber (line 70) | pub type LineNumber = u64;
  type Timestamp (line 71) | pub type Timestamp = u64;
  type LogIndex (line 73) | struct LogIndex {
    method fmt (line 91) | fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
    method new (line 127) | pub fn new() -> Self {
    method add_entry (line 140) | pub fn add_entry(&mut self, entry: LogEntry) {
    method query (line 203) | pub fn query(&self, query: Query) -> Option<Vec<LogEntry>> {
  type Indexer (line 294) | pub struct Indexer {
    method new (line 308) | pub fn new(path: Utf8PathBuf) -> Self {
    method handle_line (line 316) | fn handle_line(
    method build_index (line 339) | pub async fn build_index(&mut self) -> anyhow::Result<()> {
    method query (line 363) | pub fn query(&self, query: Query) -> Option<Vec<LogEntry>> {
    method on_file_change (line 367) | pub async fn on_file_change(&mut self) -> anyhow::Result<()> {
  type TracingJson (line 301) | struct TracingJson {
  function test_log_index (line 395) | fn test_log_index() {
  function create_test_log_file (line 508) | fn create_test_log_file(entries: Vec<&str>) -> anyhow::Result<(NamedTemp...
  function append_to_log_file (line 521) | fn append_to_log_file(file: &mut NamedTempFile, entries: Vec<&str>) -> a...
  function get_sample_log_entries (line 529) | fn get_sample_log_entries() -> Vec<&'static str> {
  function get_additional_log_entries (line 538) | fn get_additional_log_entries() -> Vec<&'static str> {
  function test_indexer_creation (line 546) | fn test_indexer_creation() {
  function test_build_index (line 559) | async fn test_build_index() -> anyhow::Result<()> {
  function test_on_file_change (line 612) | async fn test_on_file_change() -> anyhow::Result<()> {
  function test_indexer_with_target_filter (line 665) | async fn test_indexer_with_target_filter() -> anyhow::Result<()> {
  function test_indexer_complex_query (line 697) | async fn test_indexer_complex_query() -> anyhow::Result<()> {

FILE: backend/tauri/src/logging/manager.rs
  type IndexerManager (line 23) | pub struct IndexerManager {
    method try_new (line 44) | pub async fn try_new(logging_dir: Utf8PathBuf) -> anyhow::Result<Self> {
  type Target (line 28) | type Target = IndexerRunnerGuard;
  method deref (line 30) | fn deref(&self) -> &Self::Target {
  function is_log_file (line 35) | async fn is_log_file(path: &Utf8Path) -> anyhow::Result<bool> {
  type IndexerManagerRunner (line 55) | pub struct IndexerManagerRunner {
    method new_and_spawn (line 79) | pub async fn new_and_spawn() -> IndexerRunnerGuard {
    method spawn_task (line 91) | fn spawn_task(
    method run_cmd (line 128) | async fn run_cmd(&mut self, cmd_tx: &UnboundedSender<IndexerRunnerCmd>...
    method spawn_watcher (line 169) | async fn spawn_watcher(
    method scan (line 231) | pub async fn scan(&mut self, logging_dir: &Utf8Path) -> anyhow::Result...
    method recommended_watcher (line 247) | pub fn recommended_watcher(
  type IndexerRunnerCmd (line 60) | pub enum IndexerRunnerCmd {
  type IndexerRunnerGuard (line 72) | pub struct IndexerRunnerGuard {
    method watch (line 283) | pub async fn watch(&self, logging_dir: &Utf8Path) -> anyhow::Result<()> {

FILE: backend/tauri/src/logging/mod.rs
  constant LOGGING_NS (line 4) | const LOGGING_NS: &str = "logging";
  constant LOGGING_DB_PREFIX (line 5) | const LOGGING_DB_PREFIX: &str = "logging";
  function setup (line 14) | pub fn setup<R: tauri::Runtime, M: tauri::Manager<R>>(app: &M) -> anyhow...

FILE: backend/tauri/src/main.rs
  function main (line 3) | fn main() {

FILE: backend/tauri/src/server/mod.rs
  constant CACHE_TIMEOUT (line 24) | const CACHE_TIMEOUT: Duration = Duration::from_secs(60 * 60 * 24 * 7);
  type CacheIcon (line 27) | struct CacheIcon {
  type CacheFile (line 33) | struct CacheFile<'n> {
  type Error (line 39) | type Error = anyhow::Error;
  function try_from (line 41) | fn try_from(value: CacheFile<'static>) -> Result<Self, Self::Error> {
  function read_cache_file (line 53) | async fn read_cache_file(path: &Path) -> Result<(HeaderValue, Bytes)> {
  function write_cache_file (line 60) | async fn write_cache_file(path: &Path, cache_file: &CacheFile<'_>) -> Re...
  function remove_cache_file (line 67) | async fn remove_cache_file(cache_file: &Path) {
  function cache_icon_inner (line 73) | async fn cache_icon_inner(url: &str) -> Result<(HeaderValue, Bytes)> {
  function cache_icon (line 131) | async fn cache_icon(query: Query<CacheIcon>) -> Response<Body> {
  type TrayIconReq (line 148) | struct TrayIconReq {
  function tray_icon (line 152) | async fn tray_icon(query: Query<TrayIconReq>) -> Response<Body> {
  function run (line 163) | pub async fn run(port: u16) -> std::io::Result<()> {

FILE: backend/tauri/src/setup.rs
  function setup (line 4) | pub fn setup<R: tauri::Runtime, M: tauri::Manager<R>>(app: &M) -> Result...

FILE: backend/tauri/src/shutdown_hook.rs
  type ShutdownState (line 23) | pub enum ShutdownState {
  function setup_shutdown_hook (line 31) | pub fn setup_shutdown_hook(f: impl Fn() + Send + Sync + 'static) -> anyh...
  type WindowHandle (line 45) | struct WindowHandle {
  method drop (line 51) | fn drop(&mut self) {
  function callback (line 60) | unsafe extern "system" fn callback(hwnd: HWND, msg: u32, wparam: WPARAM,...
  function set_ready_for_shutdown (line 102) | pub fn set_ready_for_shutdown() {
  function setup_shutdown_hook_inner (line 109) | fn setup_shutdown_hook_inner(

FILE: backend/tauri/src/utils/candy.rs
  function collect_logs (line 9) | pub fn collect_logs(target_path: &Path) -> Result<()> {
  function get_reqwest_client (line 33) | pub fn get_reqwest_client() -> Result<reqwest::Client> {
  constant INTERNAL_MIRRORS (line 43) | pub const INTERNAL_MIRRORS: &[&str] = &[
  function parse_gh_url (line 50) | pub fn parse_gh_url(mirror: &str, path: &str) -> Result<Url, url::ParseE...
  type ReqwestSpeedTestExt (line 61) | pub trait ReqwestSpeedTestExt {
    method mirror_speed_test (line 62) | async fn mirror_speed_test<'a>(
    method mirror_speed_test (line 71) | async fn mirror_speed_test<'a>(
  function test_mirror_speed_test (line 130) | async fn test_mirror_speed_test() {

FILE: backend/tauri/src/utils/collect.rs
  type DeviceInfo (line 13) | pub struct DeviceInfo<'a> {
  type EnvInfo (line 23) | pub struct EnvInfo<'a> {
  type CoreInfo (line 33) | pub type CoreInfo<'a> = HashMap<Cow<'a, str>, Cow<'a, str>>;
  function collect_envs (line 35) | pub fn collect_envs<'a>() -> Result<EnvInfo<'a>, std::io::Error> {

FILE: backend/tauri/src/utils/config.rs
  function get_self_proxy (line 6) | pub fn get_self_proxy() -> Result<String> {
  function get_system_proxy (line 16) | pub fn get_system_proxy() -> Result<Option<String>> {
  function get_current_clash_mode (line 26) | pub fn get_current_clash_mode() -> String {
  type NyanpasuReqwestProxyExt (line 36) | pub trait NyanpasuReqwestProxyExt {
    method swift_set_proxy (line 37) | fn swift_set_proxy(self, url: &str) -> Self;
    method swift_set_nyanpasu_proxy (line 39) | fn swift_set_nyanpasu_proxy(self) -> Self;
    method swift_set_proxy (line 43) | fn swift_set_proxy(self, url: &str) -> Self {
    method swift_set_nyanpasu_proxy (line 58) | fn swift_set_nyanpasu_proxy(self) -> Self {

FILE: backend/tauri/src/utils/dialog.rs
  function panic_dialog (line 6) | pub fn panic_dialog(msg: &str) {
  function migrate_dialog (line 16) | pub fn migrate_dialog(msg: &str) -> bool {
  function error_dialog (line 28) | pub fn error_dialog<T: Into<String>>(msg: T) {
  function warning_dialog (line 37) | pub fn warning_dialog<T: Into<String>>(msg: T) {
  function ask_dialog (line 46) | pub fn ask_dialog<T: Into<String>>(msg: T) -> bool {

FILE: backend/tauri/src/utils/dirs.rs
  constant PREVIOUS_APP_NAME (line 11) | const PREVIOUS_APP_NAME: &str = "clash-verge";
  constant PREVIOUS_APP_NAME (line 13) | const PREVIOUS_APP_NAME: &str = "clash-verge-dev";
  constant APP_NAME (line 15) | pub const APP_NAME: &str = "clash-nyanpasu";
  constant APP_NAME (line 17) | pub const APP_NAME: &str = "clash-nyanpasu-dev";
  constant CLASH_CFG_GUARD_OVERRIDES (line 33) | pub const CLASH_CFG_GUARD_OVERRIDES: &str = "clash-guard-overrides.yaml";
  constant NYANPASU_CONFIG (line 34) | pub const NYANPASU_CONFIG: &str = "nyanpasu-config.yaml";
  constant PROFILE_YAML (line 35) | pub const PROFILE_YAML: &str = "profiles.yaml";
  constant STORAGE_DB (line 36) | pub const STORAGE_DB: &str = "storage.db";
  function get_app_version (line 40) | pub fn get_app_version() -> &'static str {
  function get_portable_flag (line 45) | pub fn get_portable_flag() -> bool {
  function app_config_dir (line 49) | pub fn app_config_dir() -> Result<PathBuf> {
  function app_data_dir (line 79) | pub fn app_data_dir() -> Result<PathBuf> {
  function app_home_dir (line 112) | pub fn app_home_dir() -> Result<PathBuf> {
  function app_resources_dir (line 144) | pub fn app_resources_dir() -> Result<PathBuf> {
  function app_install_dir (line 171) | pub fn app_install_dir() -> Result<PathBuf> {
  function app_profiles_dir (line 181) | pub fn app_profiles_dir() -> Result<PathBuf> {
  function app_logs_dir (line 191) | pub fn app_logs_dir() -> Result<PathBuf> {
  function clash_guard_overrides_path (line 200) | pub fn clash_guard_overrides_path() -> Result<PathBuf> {
  function nyanpasu_config_path (line 204) | pub fn nyanpasu_config_path() -> Result<PathBuf> {
  function profiles_path (line 208) | pub fn profiles_path() -> Result<PathBuf> {
  function storage_path (line 212) | pub fn storage_path() -> Result<PathBuf> {
  function clash_pid_path (line 216) | pub fn clash_pid_path() -> Result<PathBuf> {
  function cache_dir (line 220) | pub fn cache_dir() -> Result<PathBuf> {
  function tray_icons_path (line 229) | pub fn tray_icons_path(mode: &str) -> Result<PathBuf> {
  function service_log_file (line 240) | pub fn service_log_file() -> Result<PathBuf> {
  function path_to_str (line 254) | pub fn path_to_str(path: &PathBuf) -> Result<&str> {
  function get_single_instance_placeholder (line 262) | pub fn get_single_instance_placeholder() -> Result<String> {
  function create_dir_all (line 291) | fn create_dir_all(dir: &PathBuf) -> Result<(), std::io::Error> {
  function get_data_or_sidecar_path (line 306) | pub fn get_data_or_sidecar_path(binary_name: impl AsRef<str>) -> Result<...
  function check_core_permission (line 329) | pub fn check_core_permission(core: &nyanpasu_utils::core::CoreType) -> a...
  function test_dir_placeholder (line 357) | fn test_dir_placeholder() {

FILE: backend/tauri/src/utils/dock.rs
  function show_dock_icon (line 10) | pub fn show_dock_icon() {
  function hide_dock_icon (line 18) | pub fn hide_dock_icon() {

FILE: backend/tauri/src/utils/downloader.rs
  type Downloader (line 25) | pub struct Downloader<F: Fn(DownloaderState)> {
  function fmt (line 33) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type DownloaderInner (line 44) | struct DownloaderInner {
  method default (line 54) | fn default() -> Self {
  type DownloaderBuilder (line 66) | pub struct DownloaderBuilder<F: Fn(DownloaderState)> {
  function new (line 74) | pub fn new() -> Self {
  function set_client (line 83) | pub fn set_client(mut self, client: Client) -> Self {
  function set_url (line 88) | pub fn set_url<U: IntoUrl>(mut self, url: U) -> Result<Self, DownloaderE...
  function set_file (line 93) | pub fn set_file(mut self, file: File) -> Self {
  function set_event_callback (line 98) | pub fn set_event_callback(mut self, callback: F) -> Self {
  function build (line 103) | pub fn build(self) -> Result<Downloader<F>, DownloaderError> {
  type DownloaderState (line 125) | pub enum DownloaderState {
  type DownloadMode (line 136) | pub enum DownloadMode {
  type DownloadStatus (line 143) | pub struct DownloadStatus {
  type ChunkStatus (line 154) | pub struct ChunkStatus {
  type ChunkThreadEvent (line 162) | enum ChunkThreadEvent {
  type DecreaseSemaphoreReason (line 167) | enum DecreaseSemaphoreReason {
  type ChunkThreadState (line 173) | enum ChunkThreadState {
  type ChunkThread (line 180) | struct ChunkThread {
    method try_new (line 487) | pub fn try_new(
  type DownloaderError (line 194) | pub enum DownloaderError {
  method serialize (line 210) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
  function set_file (line 220) | pub fn set_file(&self, file: File) {
  function dispatch_event (line 225) | fn dispatch_event(&self, state: DownloaderState) {
  function confirm_file_status (line 236) | async fn confirm_file_status(&self) -> Result<(String, u64), DownloaderE...
  function merge_chunks (line 291) | async fn merge_chunks(&self) -> Result<(), DownloaderError> {
  function download (line 331) | async fn download(&self) -> Result<(), DownloaderError> {
  function start (line 430) | pub async fn start(&self) -> Result<(), DownloaderError> {
  function get_cloned_chunks (line 440) | fn get_cloned_chunks(&self) -> Vec<Arc<RwLock<ChunkThread>>> {
  function get_total_size (line 445) | fn get_total_size(&self) -> u64 {
  function get_current_status (line 450) | pub fn get_current_status(&self) -> DownloadStatus {
  type SafeChunkThread (line 480) | trait SafeChunkThread {
    method dispatch_event (line 481) | fn dispatch_event(&self, state: ChunkThreadState);
    method download_chunk (line 482) | async fn download_chunk(&self) -> Result<(), anyhow::Error>;
    method start (line 483) | async fn start(&self);
    method dispatch_event (line 513) | fn dispatch_event(&self, state: ChunkThreadState) {
    method download_chunk (line 522) | async fn download_chunk(&self) -> Result<(), anyhow::Error> {
    method start (line 572) | async fn start(&self) {
  function test_downloader (line 633) | async fn test_downloader() {

FILE: backend/tauri/src/utils/help.rs
  function read_yaml (line 27) | pub fn read_yaml<T: DeserializeOwned, P: AsRef<Path>>(path: P) -> Result...
  function read_merge_mapping (line 45) | pub fn read_merge_mapping(path: &PathBuf) -> Result<Mapping> {
  function save_yaml (line 61) | pub fn save_yaml<T: Serialize, P: AsRef<Path>>(
  constant ALPHABET (line 79) | const ALPHABET: [char; 62] = [
  function get_uid (line 87) | pub fn get_uid(prefix: &str) -> String {
  function parse_str (line 94) | pub fn parse_str<T: FromStr>(target: &str, key: &str) -> Option<T> {
  function open_file (line 106) | pub fn open_file(app: tauri::AppHandle, path: PathBuf) -> Result<()> {
  function get_system_locale (line 149) | pub fn get_system_locale() -> String {
  function mapping_to_i18n_key (line 153) | pub fn mapping_to_i18n_key(locale_key: &str) -> &'static str {
  function get_clash_external_port (line 163) | pub fn get_clash_external_port(
  function resize_tray_image (line 187) | pub fn resize_tray_image(img: &[u8], scale_factor: f64) -> Result<Vec<u8...
  function get_max_scale_factor (line 229) | pub fn get_max_scale_factor() -> f64 {
  function cleanup_processes (line 249) | pub fn cleanup_processes(app_handle: &AppHandle) {
  function quit_application (line 264) | pub fn quit_application(app_handle: &AppHandle) {
  function restart_application (line 269) | pub fn restart_application(app_handle: &AppHandle) {
  function test_parse_value (line 335) | fn test_parse_value() {

FILE: backend/tauri/src/utils/init/logging.rs
  type ReloadSignal (line 23) | pub type ReloadSignal = (Option<config::nyanpasu::LoggingLevel>, Option<...
  type Channel (line 25) | struct Channel(Option<Sender<ReloadSignal>>);
    method globals (line 27) | fn globals() -> &'static Mutex<Channel> {
  function refresh_logger (line 33) | pub fn refresh_logger(signal: ReloadSignal) -> Result<()> {
  function get_file_appender (line 44) | fn get_file_appender(max_files: usize) -> Result<(NonBlocking, WorkerGua...
  function init (line 56) | pub fn init() -> Result<()> {

FILE: backend/tauri/src/utils/init/mod.rs
  function run_pending_migrations (line 21) | pub fn run_pending_migrations() -> Result<()> {
  function init_config (line 104) | pub fn init_config() -> Result<()> {
  function init_resources (line 167) | pub fn init_resources() -> Result<()> {
  function init_service (line 227) | pub fn init_service() -> Result<()> {
  function check_singleton (line 267) | pub fn check_singleton() -> Result<Option<single_instance::SingleInstanc...
  function do_config_migration (line 282) | pub fn do_config_migration(old_app_dir: &PathBuf, app_dir: &PathBuf) -> ...

FILE: backend/tauri/src/utils/net.rs
  function url_delay_test (line 6) | pub async fn url_delay_test(url: &str, expected_status: u16) -> Option<u...
  function get_ipsb_asn (line 25) | pub async fn get_ipsb_asn() -> anyhow::Result<serde_json::Value> {

FILE: backend/tauri/src/utils/open.rs
  function that (line 3) | pub fn that<T: AsRef<OsStr>>(path: T) -> std::io::Result<()> {
  function with (line 16) | pub fn with<T: AsRef<OsStr>>(path: T, program: &str) -> std::io::Result<...

FILE: backend/tauri/src/utils/resolve.rs
  function is_window_opened (line 24) | pub fn is_window_opened() -> bool {
  function reset_window_open_counter (line 28) | pub fn reset_window_open_counter() {
  function set_window_controls_pos (line 33) | fn set_window_controls_pos(
  function find_unused_port (line 81) | pub fn find_unused_port() -> Result<u16> {
  function resolve_setup (line 99) | pub fn resolve_setup(app: &mut App) {
  function resolve_reset (line 211) | pub fn resolve_reset() {
  type MainWindow (line 217) | struct MainWindow;
  method label (line 220) | fn label(&self) -> &str {
  method title (line 224) | fn title(&self) -> &str {
  method url (line 228) | fn url(&self) -> &str {
  method config (line 232) | fn config(&self) -> WindowConfig {
  method get_window_state (line 241) | fn get_window_state(&self) -> Option<WindowState> {
  method set_window_state (line 245) | fn set_window_state(&self, state: Option<WindowState>) {
  type EditorWindow (line 254) | struct EditorWindow {
    method new (line 259) | fn new(uid: &str) -> Self {
  method label (line 267) | fn label(&self) -> &str {
  method title (line 271) | fn title(&self) -> &str {
  method url (line 275) | fn url(&self) -> &str {
  method config (line 279) | fn config(&self) -> WindowConfig {
  method get_window_state (line 288) | fn get_window_state(&self) -> Option<WindowState> {
  method set_window_state (line 293) | fn set_window_state(&self, _state: Option<WindowState>) {
  type LegacyWindow (line 299) | struct LegacyWindow;
  method label (line 302) | fn label(&self) -> &str {
  method title (line 306) | fn title(&self) -> &str {
  method url (line 310) | fn url(&self) -> &str {
  method config (line 314) | fn config(&self) -> WindowConfig {
  method get_window_state (line 323) | fn get_window_state(&self) -> Option<WindowState> {
  method set_window_state (line 327) | fn set_window_state(&self, state: Option<WindowState>) {
  function create_main_window (line 337) | pub fn create_main_window(app_handle: &AppHandle) {
  function close_main_window (line 342) | pub fn close_main_window(app_handle: &AppHandle) {
  function is_main_window_open (line 347) | pub fn is_main_window_open(app_handle: &AppHandle) -> bool {
  function save_main_window_state (line 351) | pub fn save_main_window_state(app_handle: &AppHandle, save_to_file: bool...
  function create_legacy_window (line 357) | pub fn create_legacy_window(app_handle: &AppHandle) {
  function close_legacy_window (line 362) | pub fn close_legacy_window(app_handle: &AppHandle) {
  function is_legacy_window_open (line 367) | pub fn is_legacy_window_open(app_handle: &AppHandle) -> bool {
  function save_legacy_window_state (line 371) | pub fn save_legacy_window_state(app_handle: &AppHandle, save_to_file: bo...
  function create_window (line 378) | pub fn create_window(app_handle: &AppHandle) {
  function close_window (line 389) | pub fn close_window(app_handle: &AppHandle) {
  function is_window_open (line 400) | pub fn is_window_open(app_handle: &AppHandle) -> bool {
  function save_window_state (line 411) | pub fn save_window_state(app_handle: &AppHandle, save_to_file: bool) -> ...
  function create_editor_window (line 423) | pub fn create_editor_window(app_handle: &AppHandle, uid: &str) -> Result...
  function close_editor_window (line 431) | pub fn close_editor_window(app_handle: &AppHandle, uid: &str) {
  function is_editor_window_open (line 437) | pub fn is_editor_window_open(app_handle: &AppHandle, uid: &str) -> bool {
  function resolve_core_version (line 446) | pub async fn resolve_core_version(app_handle: &AppHandle, core_type: &Cl...

FILE: backend/tauri/src/utils/sudo.rs
  function sudo (line 6) | pub fn sudo<M: AsRef<str>, T: AsRef<str>>(bin: M, args: &[T]) -> std::io...

FILE: backend/tauri/src/utils/winhelp.rs
  function get_function_impl (line 14) | fn get_function_impl(library: &str, function: &str) -> Option<FARPROC> {
  function get_windows_ver (line 34) | fn get_windows_ver() -> Option<(u32, u32, u32)> {
  function is_win11 (line 61) | pub fn is_win11() -> bool {
  function test_version (line 67) | fn test_version() {

FILE: backend/tauri/src/utils/winreg.rs
  function get_app_dir (line 16) | pub fn get_app_dir() -> Result<Option<PathBuf>> {
  function set_app_dir (line 39) | pub fn set_app_dir(path: &Path) -> Result<()> {
  function get_current_user_sid (line 49) | pub fn get_current_user_sid() -> Result<String> {

FILE: backend/tauri/src/utils/winreg_test.rs
  function test_get_current_user_sid (line 7) | fn test_get_current_user_sid() {
  function test_get_single_instance_placeholder_with_sid (line 19) | fn test_get_single_instance_placeholder_with_sid() {

FILE: backend/tauri/src/widget.rs
  type WidgetManager (line 21) | pub struct WidgetManager {
    method new (line 32) | pub fn new() -> Self {
    method register_listener (line 39) | fn register_listener(&self, mut receiver: BroadcastReceiver<ClashConne...
    method handle_event (line 70) | async fn handle_event(&self, event: ClashConnectionsConnectorEvent) ->...
    method start (line 96) | pub async fn start(&self, widget: StatisticWidgetVariant) -> anyhow::R...
    method stop (line 144) | pub async fn stop(&self) -> anyhow::Result<()> {
    method is_running (line 178) | pub async fn is_running(&self) -> bool {
  type WidgetManagerInstance (line 26) | struct WidgetManagerInstance {
    method is_alive (line 187) | pub fn is_alive(&mut self) -> bool {
    method send_message (line 191) | fn send_message(&self, message: Message) -> anyhow::Result<()> {
  method drop (line 202) | fn drop(&mut self) {
  function setup (line 219) | pub async fn setup<R: Runtime, M: Manager<R>>(

FILE: backend/tauri/src/window.rs
  type WindowConfig (line 33) | pub struct WindowConfig {
    method new (line 78) | pub fn new() -> Self {
    method singleton (line 83) | pub fn singleton(mut self, singleton: bool) -> Self {
    method visible_on_create (line 89) | pub fn visible_on_create(mut self, visible: bool) -> Self {
    method default_size (line 95) | pub fn default_size(mut self, width: f64, height: f64) -> Self {
    method min_size (line 101) | pub fn min_size(mut self, width: f64, height: f64) -> Self {
    method max_size (line 107) | pub fn max_size(mut self, width: f64, height: f64) -> Self {
    method center (line 113) | pub fn center(mut self, center: bool) -> Self {
    method resizable (line 119) | pub fn resizable(mut self, resizable: bool) -> Self {
    method always_on_top (line 125) | pub fn always_on_top(mut self, always_on_top: bool) -> Self {
    method skip_taskbar (line 131) | pub fn skip_taskbar(mut self, skip: bool) -> Self {
  method default (line 59) | fn default() -> Self {
  type WindowParams (line 138) | pub type WindowParams = HashMap<String, String>;
  type WindowParamsBuilder (line 142) | pub struct WindowParamsBuilder {
    method new (line 147) | pub fn new() -> Self {
    method param (line 152) | pub fn param(mut self, key: impl Into<String>, value: impl Into<String...
    method param_if (line 158) | pub fn param_if(
    method param_opt (line 172) | pub fn param_opt(self, key: impl Into<String>, value: Option<impl Into...
    method build (line 180) | pub fn build(self) -> Option<WindowParams> {
  function build_url_with_params (line 190) | pub fn build_url_with_params(base_url: &str, params: Option<&WindowParam...
  type WindowManager (line 204) | pub struct WindowManager {
    method global (line 211) | pub fn global() -> &'static Mutex<Self> {
    method generate_label (line 219) | pub fn generate_label(&mut self, base_label: &str, singleton: bool) ->...
    method remove_instance (line 244) | pub fn remove_instance(&mut self, label: &str) {
    method get_instances (line 251) | pub fn get_instances(&self, base_label: &str) -> Vec<String> {
    method has_instance (line 256) | pub fn has_instance(&self, label: &str) -> bool {
    method instance_count (line 263) | pub fn instance_count(&self, base_label: &str) -> usize {
  type ReactAppMountedEvent (line 270) | pub struct ReactAppMountedEvent;
  type WindowMessageEvent (line 274) | pub struct WindowMessageEvent {
    method new (line 287) | pub fn new(
    method broadcast (line 302) | pub fn broadcast(
  function send_message_to_window (line 312) | pub fn send_message_to_window(app_handle: &AppHandle, message: WindowMes...
  function broadcast_to_window_type (line 324) | pub fn broadcast_to_window_type(
  function broadcast_to_all_windows (line 349) | pub fn broadcast_to_all_windows(
  type WindowCreateResult (line 361) | pub struct WindowCreateResult {
    method new (line 369) | fn new(label: String) -> Self {
    method existing (line 376) | fn existing(label: String) -> Self {
  type AppWindow (line 385) | pub trait AppWindow {
    method label (line 387) | fn label(&self) -> &str;
    method title (line 390) | fn title(&self) -> &str;
    method url (line 393) | fn url(&self) -> &str;
    method config (line 396) | fn config(&self) -> WindowConfig {
    method get_window_state (line 401) | fn get_window_state(&self) -> Option<WindowState>;
    method set_window_state (line 404) | fn set_window_state(&self, state: Option<WindowState>);
    method reset_window_open_counter (line 406) | fn reset_window_open_counter(&self) {
    method create_with_params (line 413) | fn create_with_params(
    method create (line 671) | fn create(&self, app_handle: &AppHandle) -> Result<()> {
    method close_by_label (line 707) | fn close_by_label(&self, app_handle: &AppHandle, label: &str) {
    method close (line 715) | fn close(&self, app_handle: &AppHandle) {
    method close_all (line 720) | fn close_all(&self, app_handle: &AppHandle) {
    method is_open (line 731) | fn is_open(&self, app_handle: &AppHandle) -> bool {
    method has_any_instance (line 736) | fn has_any_instance(&self, app_handle: &AppHandle) -> bool {
    method get_open_instances (line 745) | fn get_open_instances(&self, app_handle: &AppHandle) -> Vec<String> {
    method send_message (line 755) | fn send_message(
    method broadcast_to_type (line 767) | fn broadcast_to_type(
    method save_state (line 778) | fn save_state(&self, app_handle: &AppHandle, save_to_file: bool) -> Re...
  type Position (line 848) | pub struct Position {
    method from (line 854) | fn from(value: (f64, f64)) -> Self {
  function from (line 863) | fn from(value: Position) -> Self {
  function set_traffic_lights_pos (line 868) | fn set_traffic_lights_pos(
  type WindowState (line 916) | struct WindowState {
    method new (line 922) | fn new(window: WebviewWindow<tauri::Wry>, traffic_lights_pos: Position...
    method with_ns_window (line 929) | fn with_ns_window<T>(&self, func: impl FnOnce(Retained<NSWindow>) -> T...
    method apply_traffic_lights_pos (line 936) | fn apply_traffic_lights_pos(&self) {
  type TrafficLightsWindowDelegateIvars (line 945) | struct TrafficLightsWindowDelegateIvars {
  constant WINDOW_DID_ENTER_FULL_SCREEN (line 950) | const WINDOW_DID_ENTER_FULL_SCREEN: &str = "internal:://window-did-enter...
  constant WINDOW_WILL_ENTER_FULL_SCREEN (line 951) | const WINDOW_WILL_ENTER_FULL_SCREEN: &str = "internal:://window-will-ent...
  constant WINDOW_WILL_EXIT_FULL_SCREEN (line 952) | const WINDOW_WILL_EXIT_FULL_SCREEN: &str = "internal:://window-will-exit...
  constant WINDOW_DID_EXIT_FULL_SCREEN (line 953) | const WINDOW_DID_EXIT_FULL_SCREEN: &str = "internal:://window-did-exit-f...
  method new (line 1061) | pub fn new(window_state: WindowState, mtm: MainThreadMarker) -> Retained...
  type TrafficLightsWindowDelegateGuard (line 1074) | pub struct TrafficLightsWindowDelegateGuard {
  function setup_traffic_lights_pos (line 1083) | pub fn setup_traffic_lights_pos(window: WebviewWindow, pos: (f64, f64), ...

FILE: frontend/interface/src/hooks/use-kv-storage.ts
  constant LOCAL_CACHE_PREFIX (line 4) | const LOCAL_CACHE_PREFIX = 'nyanpasu-kv-:'
  constant WEB_KEY_PREFIX (line 6) | const WEB_KEY_PREFIX = 'web:'
  function getLocalCache (line 8) | function getLocalCache<T>(key: string, defaultValue: T): T {
  function setLocalCache (line 22) | function setLocalCache<T>(key: string, value: T): void {
  function removeLocalCache (line 30) | function removeLocalCache(key: string): void {
  type UseKvStorageOptions (line 34) | interface UseKvStorageOptions<T> {
  function useKvStorage (line 53) | function useKvStorage<T>(
  method getAll (line 166) | async getAll(): Promise<Record<string, unknown>> {
  method clear (line 185) | async clear(): Promise<void> {

FILE: frontend/interface/src/ipc/bindings.ts
  method getSysProxy (line 21) | async getSysProxy(): Promise<Result<GetSysProxyResponse, string>> {
  method openAppConfigDir (line 29) | async openAppConfigDir(): Promise<Result<null, string>> {
  method openAppDataDir (line 37) | async openAppDataDir(): Promise<Result<null, string>> {
  method openLogsDir (line 45) | async openLogsDir(): Promise<Result<null, string>> {
  method openWebUrl (line 53) | async openWebUrl(url: string): Promise<Result<null, string>> {
  method openCoreDir (line 61) | async openCoreDir(): Promise<Result<null, string>> {
  method restartSidecar (line 72) | async restartSidecar(): Promise<Result<null, string>> {
  method getClashInfo (line 80) | async getClashInfo(): Promise<Result<ClashInfo, string>> {
  method getClashLogs (line 88) | async getClashLogs(): Promise<Result<string[], string>> {
  method patchClashConfig (line 99) | async patchClashConfig(
  method changeClashCore (line 112) | async changeClashCore(
  method getRuntimeConfig (line 128) | async getRuntimeConfig(): Promise<Result<JsonValue | null, string>> {
  method getRuntimeYaml (line 136) | async getRuntimeYaml(): Promise<Result<string, string>> {
  method getRuntimeExists (line 144) | async getRuntimeExists(): Promise<Result<string[], string>> {
  method getPostprocessingOutput (line 152) | async getPostprocessingOutput(): Promise<
  method clashApiGetProxyDelay (line 165) | async clashApiGetProxyDelay(
  method invokeUwpTool (line 179) | async invokeUwpTool(): Promise<Result<null, string>> {
  method fetchLatestCoreVersions (line 187) | async fetchLatestCoreVersions(): Promise<
  method updateCore (line 200) | async updateCore(coreType: ClashCore): Promise<Result<number, string>> {
  method inspectUpdater (line 211) | async inspectUpdater(
  method getCoreVersion (line 224) | async getCoreVersion(coreType: ClashCore): Promise<Result<string, string...
  method collectLogs (line 235) | async collectLogs(): Promise<Result<null, string>> {
  method getVergeConfig (line 243) | async getVergeConfig(): Promise<Result<IVerge, string>> {
  method patchVergeConfig (line 251) | async patchVergeConfig(payload: IVerge): Promise<Result<null, string>> {
  method getProfiles (line 262) | async getProfiles(): Promise<Result<Profiles, string>> {
  method enhanceProfiles (line 270) | async enhanceProfiles(): Promise<Result<null, string>> {
  method patchProfilesConfig (line 281) | async patchProfilesConfig(
  method viewProfile (line 294) | async viewProfile(uid: string): Promise<Result<null, string>> {
  method patchProfile (line 305) | async patchProfile(
  method createProfile (line 322) | async createProfile(
  method importProfile (line 336) | async importProfile(
  method reorderProfile (line 350) | async reorderProfile(
  method reorderProfilesByList (line 364) | async reorderProfilesByList(list: string[]): Promise<Result<null, string...
  method updateProfile (line 375) | async updateProfile(
  method deleteProfile (line 389) | async deleteProfile(uid: string): Promise<Result<null, string>> {
  method readProfileFile (line 400) | async readProfileFile(uid: string): Promise<Result<string, string>> {
  method saveProfileFile (line 411) | async saveProfileFile(
  method getCustomAppDir (line 425) | async getCustomAppDir(): Promise<Result<string | null, string>> {
  method setCustomAppDir (line 433) | async setCustomAppDir(path: string): Promise<Result<null, string>> {
  method statusService (line 444) | async statusService(): Promise<Result<StatusInfo, string>> {
  method installService (line 452) | async installService(): Promise<Result<null, string>> {
  method uninstallService (line 460) | async uninstallService(): Promise<Result<null, string>> {
  method startService (line 468) | async startService(): Promise<Result<null, string>> {
  method stopService (line 476) | async stopService(): Promise<Result<null, string>> {
  method restartService (line 484) | async restartService(): Promise<Result<null, string>> {
  method isPortable (line 492) | async isPortable(): Promise<Result<boolean, string>> {
  method getProxies (line 500) | async getProxies(): Promise<Result<Proxies, string>> {
  method selectProxy (line 508) | async selectProxy(
  method updateProxyProvider (line 522) | async updateProxyProvider(name: string): Promise<Result<null, string>> {
  method restartApplication (line 533) | async restartApplication(): Promise<Result<null, string>> {
  method collectEnvs (line 541) | async collectEnvs(): Promise<Result<EnvInfo, string>> {
  method getServerPort (line 549) | async getServerPort(): Promise<Result<number, string>> {
  method setTrayIcon (line 557) | async setTrayIcon(
  method isTrayIconSet (line 571) | async isTrayIconSet(mode: TrayIcon): Promise<Result<boolean, string>> {
  method getCoreStatus (line 582) | async getCoreStatus(): Promise<Result<[CoreState, number, RunType], stri...
  method urlDelayTest (line 590) | async urlDelayTest(
  method getIpsbAsn (line 604) | async getIpsbAsn(): Promise<Result<JsonValue, string>> {
  method openThat (line 612) | async openThat(path: string): Promise<Result<null, string>> {
  method isAppimage (line 620) | async isAppimage(): Promise<Result<boolean, string>> {
  method getServiceInstallPrompt (line 628) | async getServiceInstallPrompt(): Promise<Result<string, string>> {
  method cleanupProcesses (line 639) | async cleanupProcesses(): Promise<Result<null, string>> {
  method getStorageItem (line 647) | async getStorageItem(key: string): Promise<Result<string | null, string>> {
  method setStorageItem (line 658) | async setStorageItem(
  method removeStorageItem (line 672) | async removeStorageItem(key: string): Promise<Result<null, string>> {
  method getAllStorageItems (line 687) | async getAllStorageItems(): Promise<Result<StorageEntry[], string>> {
  method clearStorage (line 699) | async clearStorage(): Promise<Result<null, string>> {
  method mutateProxies (line 707) | async mutateProxies(): Promise<Result<Proxies, string>> {
  method getCoreDir (line 715) | async getCoreDir(): Promise<Result<string, string>> {
  method getClashWsConnectionsState (line 723) | async getClashWsConnectionsState(): Promise<
  method checkUpdate (line 736) | async checkUpdate(): Promise<Result<UpdateWrapper | null, string>> {
  method saveWindowSizeState (line 744) | async saveWindowSizeState(label: string): Promise<Result<null, string>> {
  method createMainWindow (line 755) | async createMainWindow(): Promise<Result<null, string>> {
  method createLegacyWindow (line 763) | async createLegacyWindow(): Promise<Result<null, string>> {
  method createEditorWindow (line 771) | async createEditorWindow(uid: string): Promise<Result<null, string>> {
  type BreakWhenProxyChange (line 802) | type BreakWhenProxyChange = 'none' | 'chain' | 'all'
  type BuildInfo (line 803) | type BuildInfo = {
  type ChunkStatus (line 816) | type ChunkStatus = {
  type ChunkThreadState (line 823) | type ChunkThreadState = 'Idle' | 'Downloading' | 'Finished'
  type ClashConnectionsConnectorEvent (line 824) | type ClashConnectionsConnectorEvent =
  type ClashConnectionsConnectorState (line 827) | type ClashConnectionsConnectorState =
  type ClashConnectionsEvent (line 831) | type ClashConnectionsEvent = ClashConnectionsConnectorEvent
  type ClashConnectionsInfo (line 832) | type ClashConnectionsInfo = {
  type ClashCore (line 838) | type ClashCore =
  type ClashCoreType (line 844) | type ClashCoreType =
  type ClashInfo (line 850) | type ClashInfo = {
  type ClashStrategy (line 864) | type ClashStrategy = {
  type CoreInfos (line 867) | type CoreInfos = {
  type CoreState (line 873) | type CoreState = 'Running' | { Stopped: string | null }
  type CoreType (line 874) | type CoreType = { clash: ClashCoreType } | 'singbox'
  type DelayRes (line 875) | type DelayRes = { delay: number }
  type DeviceInfo (line 876) | type DeviceInfo = {
  type DownloadStatus (line 887) | type DownloadStatus = {
  type DownloaderState (line 895) | type DownloaderState =
  type EnvInfo (line 902) | type EnvInfo = {
  type ExternalControllerPortStrategy (line 909) | type ExternalControllerPortStrategy =
  type GetSysProxyResponse (line 913) | type GetSysProxyResponse = {
  type IVerge (line 923) | type IVerge = {
  type JsonValue (line 1102) | type JsonValue =
  type LocalProfile (line 1109) | type LocalProfile = {
  type LocalProfileBuilder (line 1144) | type LocalProfileBuilder = {
  type LogSpan (line 1175) | type LogSpan = 'log' | 'info' | 'warn' | 'error'
  type LoggingLevel (line 1176) | type LoggingLevel =
  type ManifestVersionLatest (line 1183) | type ManifestVersionLatest = {
  type MergeProfile (line 1190) | type MergeProfile = {
  type MergeProfileBuilder (line 1216) | type MergeProfileBuilder = {
  type NetworkStatisticWidgetConfig (line 1238) | type NetworkStatisticWidgetConfig =
  type PatchRuntimeConfig (line 1241) | type PatchRuntimeConfig = {
  type PostProcessingOutput (line 1250) | type PostProcessingOutput = {
  type Profile (line 1266) | type Profile =
  type ProfileBuilder (line 1271) | type ProfileBuilder =
  type Profiles (line 1279) | type Profiles = {
  type ProfilesBuilder (line 1301) | type ProfilesBuilder = {
  type Proxies (line 1319) | type Proxies = {
  type ProxiesSelectorMode (line 1326) | type ProxiesSelectorMode = 'hidden' | 'normal' | 'submenu'
  type ProxyGroupItem (line 1327) | type ProxyGroupItem = {
  type ProxyItem (line 1341) | type ProxyItem = {
  type ProxyItemHistory (line 1355) | type ProxyItemHistory = { time: string; delay: number }
  type ReactAppMountedEvent (line 1360) | type ReactAppMountedEvent = null
  type RemoteProfile (line 1361) | type RemoteProfile = {
  type RemoteProfileBuilder (line 1404) | type RemoteProfileBuilder = {
  type RemoteProfileOptions (line 1443) | type RemoteProfileOptions = {
  type RemoteProfileOptionsBuilder (line 1466) | type RemoteProfileOptionsBuilder = {
  type RunType (line 1485) | type RunType =
  type RuntimeInfos (line 1498) | type RuntimeInfos = {
  type ScriptProfile (line 1504) | type ScriptProfile = {
  type ScriptProfileBuilder (line 1530) | type ScriptProfileBuilder = {
  type ScriptType (line 1552) | type ScriptType = 'javascript' | 'lua'
  type ServiceStatus (line 1553) | type ServiceStatus = 'not_installed' | 'stopped' | 'running'
  type StatisticWidgetVariant (line 1554) | type StatisticWidgetVariant = 'large' | 'small'
  type StatusInfo (line 1555) | type StatusInfo = {
  type StatusResBody (line 1561) | type StatusResBody = {
  type StorageEntry (line 1566) | type StorageEntry = {
  type StorageValueChangedEvent (line 1577) | type StorageValueChangedEvent = {
  type SubscriptionInfo (line 1584) | type SubscriptionInfo = {
  type TrayIcon (line 1590) | type TrayIcon = 'normal' | 'tun' | 'system_proxy'
  type TunStack (line 1591) | type TunStack = 'system' | 'gvisor' | 'mixed'
  type UpdateWrapper (line 1592) | type UpdateWrapper = {
  type UpdaterState (line 1601) | type UpdaterState =
  type UpdaterSummary (line 1609) | type UpdaterSummary = {
  type WindowMessageEvent (line 1617) | type WindowMessageEvent = {
  type WindowState (line 1635) | type WindowState = {
  type __EventObj__ (line 1644) | type __EventObj__<T> = {
  type Result (line 1656) | type Result<T, E> =
  function __makeEvents__ (line 1660) | function __makeEvents__<T extends Record<string, any>>(

FILE: frontend/interface/src/ipc/consts.ts
  constant NYANPASU_BACKEND_EVENT_NAME (line 11) | const NYANPASU_BACKEND_EVENT_NAME = 'nyanpasu://mutation'
  constant IS_APPIMAGE_QUERY_KEY (line 16) | const IS_APPIMAGE_QUERY_KEY = 'is-appimage'
  constant SERVICE_PROMPT_QUERY_KEY (line 21) | const SERVICE_PROMPT_QUERY_KEY = 'service-prompt'
  constant CORE_DIR_QUERY_KEY (line 26) | const CORE_DIR_QUERY_KEY = 'core-dir'
  constant SERVER_PORT_QUERY_KEY (line 31) | const SERVER_PORT_QUERY_KEY = 'server-port'
  constant NYANPASU_SETTING_QUERY_KEY (line 36) | const NYANPASU_SETTING_QUERY_KEY = 'settings'
  constant NYANPASU_SYSTEM_PROXY_QUERY_KEY (line 41) | const NYANPASU_SYSTEM_PROXY_QUERY_KEY = 'system-proxy'
  constant NYANPASU_POST_PROCESSING_QUERY_KEY (line 46) | const NYANPASU_POST_PROCESSING_QUERY_KEY = 'post-processing'
  constant CLASH_VERSION_QUERY_KEY (line 51) | const CLASH_VERSION_QUERY_KEY = 'clash-version'
  constant RROFILES_QUERY_KEY (line 56) | const RROFILES_QUERY_KEY = 'profiles'
  constant CLASH_LOGS_QUERY_KEY (line 61) | const CLASH_LOGS_QUERY_KEY = 'clash-logs'
  constant CLASH_TRAAFFIC_QUERY_KEY (line 66) | const CLASH_TRAAFFIC_QUERY_KEY = 'clash-traffic'
  constant CLASH_MEMORY_QUERY_KEY (line 71) | const CLASH_MEMORY_QUERY_KEY = 'clash-memory'
  constant CLASH_CONNECTIONS_QUERY_KEY (line 76) | const CLASH_CONNECTIONS_QUERY_KEY = 'clash-connections'
  constant CLASH_CONFIG_QUERY_KEY (line 81) | const CLASH_CONFIG_QUERY_KEY = 'clash-config'
  constant CLASH_CORE_QUERY_KEY (line 86) | const CLASH_CORE_QUERY_KEY = 'clash-core'
  constant CLASH_INFO_QUERY_KEY (line 91) | const CLASH_INFO_QUERY_KEY = 'clash-info'
  constant CLASH_PROXIES_QUERY_KEY (line 96) | const CLASH_PROXIES_QUERY_KEY = 'clash-proxies'
  constant CLASH_RULES_QUERY_KEY (line 101) | const CLASH_RULES_QUERY_KEY = 'clash-rules'
  constant CLASH_RULES_PROVIDER_QUERY_KEY (line 106) | const CLASH_RULES_PROVIDER_QUERY_KEY = 'clash-rules-provider'
  constant CLASH_PROXIES_PROVIDER_QUERY_KEY (line 111) | const CLASH_PROXIES_PROVIDER_QUERY_KEY = 'clash-proxies-provider'
  constant MAX_CONNECTIONS_HISTORY (line 116) | const MAX_CONNECTIONS_HISTORY = 32
  constant MAX_MEMORY_HISTORY (line 121) | const MAX_MEMORY_HISTORY = 32
  constant MAX_TRAFFIC_HISTORY (line 126) | const MAX_TRAFFIC_HISTORY = 32
  constant MAX_LOGS_HISTORY (line 131) | const MAX_LOGS_HISTORY = 1024

FILE: frontend/interface/src/ipc/use-clash-connections.ts
  type ClashConnection (line 5) | type ClashConnection = {
  type ClashConnectionItem (line 12) | type ClashConnectionItem = {
  type ClashConnectionMetadata (line 23) | type ClashConnectionMetadata = {

FILE: frontend/interface/src/ipc/use-clash-cores.ts
  type ClashCoresInfo (line 19) | type ClashCoresInfo = Record<ClashCore, ClashCoresDetail>
  type ClashCoresDetail (line 21) | type ClashCoresDetail = {

FILE: frontend/interface/src/ipc/use-clash-logs.ts
  type ClashLog (line 6) | type ClashLog = {

FILE: frontend/interface/src/ipc/use-clash-memory.ts
  type ClashMemory (line 4) | type ClashMemory = {

FILE: frontend/interface/src/ipc/use-clash-proxies-provider.ts
  type ClashProxiesProviderQueryItem (line 5) | interface ClashProxiesProviderQueryItem extends ClashProviderProxies {
  type ClashProxiesProviderQuery (line 9) | type ClashProxiesProviderQuery = Record<

FILE: frontend/interface/src/ipc/use-clash-proxies.ts
  type ClashProxiesQueryHelperFn (line 13) | type ClashProxiesQueryHelperFn = {
  type ClashProxiesQueryProxyItem (line 17) | interface ClashProxiesQueryProxyItem
  type ClashProxiesQueryGroupItem (line 22) | interface ClashProxiesQueryGroupItem
  type ClashProxiesQuery (line 27) | interface ClashProxiesQuery extends Proxies {

FILE: frontend/interface/src/ipc/use-clash-rules-provider.ts
  type ClashRulesProviderQueryItem (line 5) | interface ClashRulesProviderQueryItem extends ClashProviderRule {
  type ClashRulesProviderQuery (line 9) | type ClashRulesProviderQuery = Record<

FILE: frontend/interface/src/ipc/use-clash-traffic.ts
  type ClashTraffic (line 4) | type ClashTraffic = {

FILE: frontend/interface/src/ipc/use-platform.ts
  function useUpdaterSupported (line 18) | function useUpdaterSupported() {

FILE: frontend/interface/src/ipc/use-profile.ts
  type URLImportParams (line 12) | type URLImportParams = Parameters<typeof commands.importProfile>
  type ManualImportParams (line 14) | type ManualImportParams = Parameters<typeof commands.createProfile>
  type CreateParams (line 16) | type CreateParams =
  type ProfileHelperFn (line 32) | type ProfileHelperFn = {
  type ProfileQueryResult (line 38) | type ProfileQueryResult = NonNullable<
  type ProfileQueryResultItem (line 42) | type ProfileQueryResultItem = Profile & Partial<ProfileHelperFn>
  function addHelperFn (line 85) | function addHelperFn(item: Profile): Profile & ProfileHelperFn {

FILE: frontend/interface/src/ipc/use-system-service.ts
  type ServiceType (line 5) | type ServiceType = 'install' | 'uninstall' | 'start' | 'stop'

FILE: frontend/interface/src/openapi/geoip/ipsb.ts
  type IPSBResponse (line 4) | interface IPSBResponse {

FILE: frontend/interface/src/provider/mutation-provider.tsx
  type EventPayload (line 15) | type EventPayload = 'nyanpasu_config' | 'clash_config' | 'proxies' | 'pr...
  constant NYANPASU_CONFIG_MUTATION_KEYS (line 17) | const NYANPASU_CONFIG_MUTATION_KEYS = [
  constant CLASH_CONFIG_MUTATION_KEYS (line 24) | const CLASH_CONFIG_MUTATION_KEYS = [
  constant PROFILES_MUTATION_KEYS (line 37) | const PROFILES_MUTATION_KEYS = [
  constant PROXIES_MUTATION_KEYS (line 48) | const PROXIES_MUTATION_KEYS = [

FILE: frontend/interface/src/service/clash-api.ts
  type ClashConfig (line 16) | interface ClashConfig {
  type ClashVersion (line 31) | type ClashVersion = {
  type ClashDelayOptions (line 37) | type ClashDelayOptions = {
  type ClashProxyGroupItem (line 42) | type ClashProxyGroupItem = ProxyGroupItem
  type ClashProviderRule (line 44) | type ClashProviderRule = {
  type ClashProviderProxies (line 54) | type ClashProviderProxies = {
  type ClashRule (line 64) | type ClashRule = {

FILE: frontend/interface/src/service/core.ts
  type Core (line 4) | interface Core {
  constant VALID_CORE (line 11) | const VALID_CORE: Core[] = [
  type SupportedArch (line 64) | enum SupportedArch {
  type SupportedCore (line 76) | enum SupportedCore {
  type ArchMapping (line 83) | type ArchMapping = { [key in SupportedArch]: string }
  type ManifestVersion (line 85) | interface ManifestVersion {

FILE: frontend/interface/src/service/types.ts
  type VergeConfig (line 1) | interface VergeConfig {
  type AutoReloadConfig (line 56) | interface AutoReloadConfig {
  type SystemProxy (line 63) | interface SystemProxy {
  type Item (line 71) | interface Item {
  type Metadata (line 82) | interface Metadata {
  type Response (line 105) | interface Response {
  type LogMessage (line 113) | interface LogMessage {
  type ProviderRules (line 119) | interface ProviderRules {
  type Traffic (line 129) | interface Traffic {
  type Memory (line 134) | interface Memory {
  type EnvInfos (line 139) | interface EnvInfos {
  type InspectUpdater (line 150) | interface InspectUpdater {

FILE: frontend/interface/src/utils/get-system.ts
  type Platform (line 1) | type Platform =
  function getSystem (line 18) | function getSystem() {

FILE: frontend/interface/src/utils/index.ts
  function unwrapResult (line 3) | function unwrapResult<T, E>(res: Result<T, E>) {

FILE: frontend/interface/src/utils/retry.ts
  function retry (line 9) | async function retry<T>(

FILE: frontend/nyanpasu/src/components/base/base-empty.tsx
  type Props (line 5) | interface Props {

FILE: frontend/nyanpasu/src/components/base/base-error-boundary.tsx
  function ErrorFallback (line 4) | function ErrorFallback({ error }: FallbackProps) {
  type Props (line 19) | interface Props {

FILE: frontend/nyanpasu/src/components/base/base-notice.tsx
  type InnerProps (line 6) | interface InnerProps {
  type NoticeInstance (line 63) | interface NoticeInstance {

FILE: frontend/nyanpasu/src/components/base/content-display.tsx
  type ContentDisplayProps (line 5) | interface ContentDisplayProps {

FILE: frontend/nyanpasu/src/components/connections/connection-detail-dialog.tsx
  type ConnectionDetailDialogProps (line 10) | type ConnectionDetailDialogProps = { item?: Connection.Item } & Omit<
  function ConnectionDetailDialog (line 69) | function ConnectionDetailDialog({

FILE: frontend/nyanpasu/src/components/connections/connection-page.tsx
  function ConnectionPage (line 6) | function ConnectionPage() {

FILE: frontend/nyanpasu/src/components/connections/connections-column-filter.tsx
  function CloseConnectionButton (line 18) | function CloseConnectionButton({ id }: { id: string }) {
  type ConnectionColumnFilterDialogProps (line 164) | type ConnectionColumnFilterDialogProps = {} & Omit<
  function ColItem (line 169) | function ColItem({
  function ConnectionColumnFilterDialog (line 201) | function ConnectionColumnFilterDialog(

FILE: frontend/nyanpasu/src/components/connections/connections-table.tsx
  type TableConnection (line 23) | type TableConnection = ClashConnectionItem & {
  type TableMessage (line 28) | interface TableMessage extends Omit<ClashConnection, 'connections'> {
  method muiTableBodyRowProps (line 173) | muiTableBodyRowProps({ row }) {

FILE: frontend/nyanpasu/src/components/connections/connections-total.tsx
  function ConnectionTotal (line 9) | function ConnectionTotal() {

FILE: frontend/nyanpasu/src/components/dashboard/dataline.tsx
  type DatalineProps (line 8) | interface DatalineProps {

FILE: frontend/nyanpasu/src/components/dashboard/health-panel.tsx
  constant REFRESH_SECONDS (line 7) | const REFRESH_SECONDS = 5

FILE: frontend/nyanpasu/src/components/dashboard/modules/ipasn-panel.tsx
  constant IP_REFRESH_SECONDS (line 18) | const IP_REFRESH_SECONDS = 180
  constant MAX_WIDTH (line 36) | const MAX_WIDTH = 'calc(100% - 48px - 16px)'

FILE: frontend/nyanpasu/src/components/dashboard/modules/timing-panel.tsx
  function LatencyTag (line 9) | function LatencyTag({ name, value }: { name: string; value: number }) {

FILE: frontend/nyanpasu/src/components/dashboard/service-shortcuts.tsx
  type Status (line 14) | type Status = {

FILE: frontend/nyanpasu/src/components/layout/animated-logo.tsx
  function AnimatedLogo (line 50) | function AnimatedLogo({

FILE: frontend/nyanpasu/src/components/layout/mutation-provider.tsx
  function MutationProvider (line 7) | function MutationProvider() {

FILE: frontend/nyanpasu/src/components/layout/page-transition.tsx
  type PageVariantKey (line 7) | type PageVariantKey = 'initial' | 'visible' | 'hidden'
  type PageVariant (line 9) | type PageVariant = {
  function PageTransition (line 50) | function PageTransition({ className }: { className?: string }) {

FILE: frontend/nyanpasu/src/components/layout/use-custom-theme.tsx
  constant DEFAULT_COLOR (line 10) | const DEFAULT_COLOR = '#1867c0'
  constant DEFAULT_FONT_FAMILY (line 12) | const DEFAULT_FONT_FAMILY = `"Roboto", "Helvetica", "Arial", sans-serif,...

FILE: frontend/nyanpasu/src/components/logo/animated-logo.tsx
  constant FAST_SPRING (line 11) | const FAST_SPRING = [0.22, 1, 0.36, 1] as const // fast attack, soft lan...
  constant DRAMATIC_PRESENT (line 12) | const DRAMATIC_PRESENT = [0.2, 0.8, 0.2, 1] as const // dramatic entrance
  constant GENTLE_SYMMETRIC_S_CURVE (line 13) | const GENTLE_SYMMETRIC_S_CURVE = [0.45, 0.05, 0.55, 0.95] as const // ge...
  function AnimatedLogo (line 15) | function AnimatedLogo({

FILE: frontend/nyanpasu/src/components/profiles/modules/chain-item.tsx
  type Context (line 11) | interface Context {

FILE: frontend/nyanpasu/src/components/profiles/modules/side-chain.tsx
  type SideChainProps (line 16) | interface SideChainProps {

FILE: frontend/nyanpasu/src/components/profiles/modules/side-log.tsx
  type SideLogProps (line 33) | interface SideLogProps {

FILE: frontend/nyanpasu/src/components/profiles/profile-dialog.tsx
  type ProfileDialogProps (line 39) | interface ProfileDialogProps {
  type AddProfileContextValue (line 45) | type AddProfileContextValue = {

FILE: frontend/nyanpasu/src/components/profiles/profile-item.tsx
  type ProfileItemProps (line 39) | interface ProfileItemProps {
  function TimeSpan (line 379) | function TimeSpan({ ts, k }: { ts: number; k: string }) {
  function TextCarousel (line 393) | function TextCarousel(props: { nodes: React.ReactNode[]; className?: str...

FILE: frontend/nyanpasu/src/components/profiles/profile-monaco-diff-viewer.tsx
  function ProfileMonacoDiffViewer (line 5) | function ProfileMonacoDiffViewer(

FILE: frontend/nyanpasu/src/components/profiles/profile-monaco-viewer.tsx
  type ProfileMonacoViewProps (line 18) | interface ProfileMonacoViewProps {
  type ProfileMonacoViewRef (line 28) | interface ProfileMonacoViewRef {
  function ProfileMonacoViewer (line 107) | function ProfileMonacoViewer({

FILE: frontend/nyanpasu/src/components/profiles/profile-side.tsx
  type ProfileSideProps (line 14) | interface ProfileSideProps {

FILE: frontend/nyanpasu/src/components/profiles/read-profile.tsx
  type ReadProfileProps (line 10) | interface ReadProfileProps {

FILE: frontend/nyanpasu/src/components/profiles/runtime-config-diff-dialog.tsx
  type RuntimeConfigDiffDialogProps (line 16) | type RuntimeConfigDiffDialogProps = {
  function RuntimeConfigDiffDialog (line 21) | function RuntimeConfigDiffDialog({

FILE: frontend/nyanpasu/src/components/profiles/script-dialog.tsx
  type ScriptDialogProps (line 65) | interface ScriptDialogProps extends Omit<BaseDialogProps, 'title'> {

FILE: frontend/nyanpasu/src/components/profiles/utils.ts
  type ClashProfile (line 6) | type ClashProfile = Extract<Profile, { type: 'remote' | 'local' }>
  type ClashProfileBuilder (line 7) | type ClashProfileBuilder = Extract<
  type ChainProfile (line 15) | type ChainProfile = Extract<Profile, { type: 'merge' | 'script' }>
  type ChainProfileBuilder (line 16) | type ChainProfileBuilder = Extract<
  function filterProfiles (line 29) | function filterProfiles<T extends Profile>(items?: T[]) {
  type ProfileType (line 56) | type ProfileType = Profile['type']

FILE: frontend/nyanpasu/src/components/providers/block-task-provider.tsx
  type BlockTaskStatus (line 11) | type BlockTaskStatus = 'idle' | 'pending' | 'success' | 'error'
  type BlockTask (line 14) | interface BlockTask<T = any> {
  type BlockTaskContextType (line 23) | interface BlockTaskContextType {

FILE: frontend/nyanpasu/src/components/providers/context-menu-provider.tsx
  type ContextMenuRegistryValue (line 31) | type ContextMenuRegistryValue = {
  function useRegisterContextMenu (line 51) | function useRegisterContextMenu<T extends Element>(
  type RegisterContextMenuInternalCtxValue (line 80) | type RegisterContextMenuInternalCtxValue = {
  function RegisterContextMenu (line 100) | function RegisterContextMenu({ children }: PropsWithChildren) {
  function RegisterContextMenuTrigger (line 137) | function RegisterContextMenuTrigger({
  function RegisterContextMenuContent (line 176) | function RegisterContextMenuContent({ children }: PropsWithChildren) {
  function ContextMenuProvider (line 214) | function ContextMenuProvider({ children }: PropsWithChildren) {

FILE: frontend/nyanpasu/src/components/providers/nyanpasu-update-provider.tsx
  function NyanpasuUpdateProvider (line 41) | function NyanpasuUpdateProvider({

FILE: frontend/nyanpasu/src/components/providers/proxies-provider.tsx
  type ProxiesProviderProps (line 11) | interface ProxiesProviderProps {

FILE: frontend/nyanpasu/src/components/providers/rules-provider.tsx
  type RulesProviderProps (line 10) | interface RulesProviderProps {
  function RulesProvider (line 14) | function RulesProvider({ provider }: RulesProviderProps) {

FILE: frontend/nyanpasu/src/components/providers/theme-provider.tsx
  constant DEFAULT_COLOR (line 23) | const DEFAULT_COLOR = '#1867C0'
  type ThemeMode (line 25) | enum ThemeMode {
  constant CUSTOM_THEME_KEY (line 31) | const CUSTOM_THEME_KEY = 'custom-theme' as const
  constant THEME_PALETTE_KEY (line 33) | const THEME_PALETTE_KEY = 'theme-palette-v1' as const
  constant THEME_CSS_VARS_KEY (line 34) | const THEME_CSS_VARS_KEY = 'theme-css-vars-v1' as const
  function useExperimentalThemeContext (line 97) | function useExperimentalThemeContext() {
  function ExperimentalThemeProvider (line 109) | function ExperimentalThemeProvider({ children }: PropsWithChildren) {

FILE: frontend/nyanpasu/src/components/proxies/group-list.tsx
  type GroupListProps (line 46) | interface GroupListProps extends ListItemButtonProps {

FILE: frontend/nyanpasu/src/components/proxies/node-list.tsx
  type RenderClashProxy (line 27) | type RenderClashProxy = ClashProxiesQueryProxyItem & { renderLayoutKey: ...
  type NodeListRef (line 29) | interface NodeListRef {

FILE: frontend/nyanpasu/src/components/proxies/sort-selector.tsx
  type SortType (line 13) | type SortType = typeof proxyGroupSort

FILE: frontend/nyanpasu/src/components/proxies/utils.ts
  type SortType (line 11) | enum SortType {

FILE: frontend/nyanpasu/src/components/router/animated-outlet.tsx
  type TransitionDirection (line 12) | type TransitionDirection = 1 | -1
  function getDirectionalVariant (line 45) | function getDirectionalVariant(direction: TransitionDirection) {
  function AnimatedOutlet (line 51) | function AnimatedOutlet({
  function AnimatedOutletPreset (line 121) | function AnimatedOutletPreset(props: ComponentProps<typeof motion.div>) {

FILE: frontend/nyanpasu/src/components/rules/rule-item.tsx
  type Props (line 4) | interface Props {
  constant COLOR (line 9) | const COLOR = [

FILE: frontend/nyanpasu/src/components/setting/modules/clash-core.tsx
  type ClashCoreItemProps (line 111) | interface ClashCoreItemProps {

FILE: frontend/nyanpasu/src/components/setting/modules/clash-field.tsx
  type LabelSwitchProps (line 16) | interface LabelSwitchProps extends SwitchProps {
  type ClashFieldItemProps (line 91) | interface ClashFieldItemProps extends ButtonBaseProps {

FILE: frontend/nyanpasu/src/components/setting/modules/clash-web.tsx
  type ClashWebItemProps (line 133) | interface ClashWebItemProps {

FILE: frontend/nyanpasu/src/components/setting/modules/hotkey-dialog.tsx
  type HotkeyDialogProps (line 11) | type HotkeyDialogProps = Omit<BaseDialogProps, 'title'>
  constant HOTKEY_FUNC (line 13) | const HOTKEY_FUNC = [
  type AllowedHotkeyFunc (line 27) | type AllowedHotkeyFunc = (typeof HOTKEY_FUNC)[number]
  type Key (line 29) | type Key = string
  type HotKeyErrorMessages (line 31) | type HotKeyErrorMessages = {
  type HotKeyLoading (line 35) | type HotKeyLoading = {
  type HotkeyMap (line 39) | type HotkeyMap = { [K in AllowedHotkeyFunc]: Key[] }
  function HotkeyDialog (line 41) | function HotkeyDialog({

FILE: frontend/nyanpasu/src/components/setting/modules/hotkey-input.tsx
  type Props (line 9) | interface Props extends React.HTMLAttributes<HTMLInputElement> {
  function HotkeyInput (line 18) | function HotkeyInput({

FILE: frontend/nyanpasu/src/components/setting/modules/nyanpasu-path.tsx
  type PaperButtonProps (line 13) | interface PaperButtonProps extends ButtonBaseProps {

FILE: frontend/nyanpasu/src/components/setting/modules/service-manual-prompt-dialog.tsx
  type CopyToClipboardButtonProps (line 17) | type CopyToClipboardButtonProps = {
  function CopyToClipboardButton (line 21) | function CopyToClipboardButton({ onClick }: CopyToClipboardButtonProps) {
  type ServerManualPromptDialogProps (line 51) | type ServerManualPromptDialogProps = Omit<BaseDialogProps, 'title'> & {
  function ServerManualPromptDialog (line 56) | function ServerManualPromptDialog({
  function ServerManualPromptDialogWrapper (line 149) | function ServerManualPromptDialogWrapper() {
  function useServerManualPromptDialog (line 160) | function useServerManualPromptDialog() {

FILE: frontend/nyanpasu/src/components/setting/modules/system-proxy.tsx
  type PaperSwitchButtonProps (line 9) | interface PaperSwitchButtonProps extends PaperButtonProps {

FILE: frontend/nyanpasu/src/components/setting/modules/tray-icon-dialog.tsx
  function TrayIconItem (line 16) | function TrayIconItem({ mode }: { mode: 'system_proxy' | 'tun' | 'normal...
  type TrayIconDialogProps (line 107) | type TrayIconDialogProps = Omit<BaseDialogProps, 'title'>
  function TrayIconDialog (line 109) | function TrayIconDialog({

FILE: frontend/nyanpasu/src/components/setting/setting-system-proxy.tsx
  constant DEFAULT_BYPASS (line 125) | const DEFAULT_BYPASS =

FILE: frontend/nyanpasu/src/components/ui/animated-item.tsx
  function AnimatedItem (line 5) | function AnimatedItem({

FILE: frontend/nyanpasu/src/components/ui/border-beam.tsx
  function BorderBeam (line 5) | function BorderBeam({

FILE: frontend/nyanpasu/src/components/ui/button.tsx
  type ButtonVariantsProps (line 112) | type ButtonVariantsProps = VariantProps<typeof buttonVariants>
  type ButtonProps (line 118) | interface ButtonProps

FILE: frontend/nyanpasu/src/components/ui/card.tsx
  type CardVariantsProps (line 22) | type CardVariantsProps = VariantProps<typeof cardVariants>
  type CardContentVariantsProps (line 26) | type CardContentVariantsProps = VariantProps<typeof cardContentVariants>
  type CardHeaderVariantsProps (line 49) | type CardHeaderVariantsProps = VariantProps<typeof cardHeaderVariants>
  type CardFooterVariantsProps (line 72) | type CardFooterVariantsProps = VariantProps<typeof cardFooterVariants>
  type CardContextType (line 74) | type CardContextType = {
  type CardProps (line 92) | interface CardProps
  type CardContentProps (line 129) | type CardContentProps = HTMLAttributes<HTMLDivElement> &
  type CardHeaderProps (line 144) | type CardHeaderProps = HTMLAttributes<HTMLDivElement> &
  type CardFooterProps (line 171) | interface CardFooterProps

FILE: frontend/nyanpasu/src/components/ui/circle.tsx
  constant BASE_STROKE_WIDTH (line 4) | const BASE_STROKE_WIDTH = 10
  constant BASE_SIZE (line 5) | const BASE_SIZE = 100
  function Circle (line 19) | function Circle({
  function CircleSVG (line 45) | function CircleSVG({ className, ...props }: ComponentProps<'svg'>) {

FILE: frontend/nyanpasu/src/components/ui/context-menu.tsx
  function ContextMenuSubTrigger (line 135) | function ContextMenuSubTrigger({
  function ContextMenuSubContent (line 160) | function ContextMenuSubContent({

FILE: frontend/nyanpasu/src/components/ui/dropdown-menu.tsx
  function DropdownMenuSubTrigger (line 142) | function DropdownMenuSubTrigger({
  function DropdownMenuSubContent (line 167) | function DropdownMenuSubContent({

FILE: frontend/nyanpasu/src/components/ui/file-drop-zone.tsx
  type FileDropZoneVariants (line 86) | type FileDropZoneVariants = VariantProps<typeof fileDropZoneVariants>
  type FileDropZoneProps (line 88) | interface FileDropZoneProps
  function FileDropZone (line 107) | function FileDropZone({
  function FileDropZoneLoading (line 326) | function FileDropZoneLoading(props: ComponentProps<'div'>) {
  function FileDropZonePlaceholder (line 336) | function FileDropZonePlaceholder(props: ComponentProps<'div'>) {
  function FileDropZoneFileSelected (line 346) | function FileDropZoneFileSelected(props: ComponentProps<'div'>) {

FILE: frontend/nyanpasu/src/components/ui/highlight-text.tsx
  function HighlightText (line 1) | function HighlightText({

FILE: frontend/nyanpasu/src/components/ui/image.tsx
  function Image (line 5) | function Image({

FILE: frontend/nyanpasu/src/components/ui/input.tsx
  type InputContainerVariants (line 37) | type InputContainerVariants = VariantProps<typeof inputContainerVariants>
  type InputVariants (line 77) | type InputVariants = VariantProps<typeof inputVariants>
  type InputLabelVariants (line 133) | type InputLabelVariants = VariantProps<typeof inputLabelVariants>
  type InputLineVariants (line 163) | type InputLineVariants = VariantProps<typeof inputLineVariants>
  type InputLabelFieldsetVariants (line 196) | type InputLabelFieldsetVariants = VariantProps<
  type InputLabelLegendVariants (line 225) | type InputLabelLegendVariants = VariantProps<
  type InputContextType (line 229) | type InputContextType = {
  type InputProps (line 281) | type InputProps = ComponentProps<'input'> & {
  type NumericInputProps (line 413) | type NumericInputProps = Omit<

FILE: frontend/nyanpasu/src/components/ui/modal.tsx
  function ModalTrigger (line 31) | function ModalTrigger({
  function ModalClose (line 71) | function ModalClose({
  function ModalOverlay (line 85) | function ModalOverlay({
  function ModalContent (line 106) | function ModalContent({
  function Modal (line 158) | function Modal({

FILE: frontend/nyanpasu/src/components/ui/progress.tsx
  function CircularProgress (line 31) | function CircularProgress({
  function LinearProgress (line 95) | function LinearProgress({

FILE: frontend/nyanpasu/src/components/ui/ripple.tsx
  type RippleConfig (line 10) | type RippleConfig = {
  type RippleProps (line 17) | interface RippleProps {

FILE: frontend/nyanpasu/src/components/ui/scroll-area.tsx
  type ScrollAreaContextValue (line 6) | interface ScrollAreaContextValue {
  function useScrollArea (line 22) | function useScrollArea() {
  function useScrollTracking (line 32) | function useScrollTracking(threshold = 50) {
  function Viewport (line 122) | function Viewport({
  function ScrollArea (line 145) | function ScrollArea({
  function ScrollBar (line 200) | function ScrollBar({
  function AppContentScrollArea (line 229) | function AppContentScrollArea({

FILE: frontend/nyanpasu/src/components/ui/select.tsx
  type SelectTriggerVariants (line 41) | type SelectTriggerVariants = VariantProps<typeof selectTriggerVariants>
  type SelectLineVariants (line 73) | type SelectLineVariants = VariantProps<typeof selectLineVariants>
  type SelectValueVariants (line 102) | type SelectValueVariants = VariantProps<typeof selectValueVariants>
  type SelectValuePlaceholderVariants (line 153) | type SelectValuePlaceholderVariants = VariantProps<
  type SelectValuePlaceholderFieldsetVariants (line 191) | type SelectValuePlaceholderFieldsetVariants = VariantProps<
  type SelectValuePlaceholderLegendVariants (line 220) | type SelectValuePlaceholderLegendVariants = VariantProps<
  type SelectContentVariants (line 243) | type SelectContentVariants = VariantProps<typeof selectContentVariants>
  type SelectContextType (line 245) | type SelectContextType = {
  type SelectProps (line 323) | type SelectProps = ComponentProps<typeof Select>

FILE: frontend/nyanpasu/src/components/ui/separator.tsx
  function Separator (line 5) | function Separator({

FILE: frontend/nyanpasu/src/components/ui/sidebar.tsx
  function Sidebar (line 22) | function Sidebar({ className, ...props }: ComponentProps<'div'>) {
  function SidebarContent (line 40) | function SidebarContent({

FILE: frontend/nyanpasu/src/components/ui/slider-sidebar.tsx
  constant DEFAULT_SIDEBAR_WIDTH (line 14) | const DEFAULT_SIDEBAR_WIDTH = {
  function SidebarProvider (line 34) | function SidebarProvider({
  function Sidebar (line 62) | function Sidebar({
  function SidebarLabelItem (line 110) | function SidebarLabelItem({

FILE: frontend/nyanpasu/src/components/ui/slider.tsx
  constant EDGE_OFFSET_PX (line 6) | const EDGE_OFFSET_PX = 16
  constant PADDING_PX (line 7) | const PADDING_PX = 8
  function Slider (line 9) | function Slider({

FILE: frontend/nyanpasu/src/components/ui/switch.tsx
  function SwitchItem (line 57) | function SwitchItem({

FILE: frontend/nyanpasu/src/components/ui/text-marquee.tsx
  function TextMarquee (line 6) | function TextMarquee({

FILE: frontend/nyanpasu/src/components/ui/tooltip.tsx
  function TooltipProvider (line 5) | function TooltipProvider({
  function Tooltip (line 18) | function Tooltip({
  function TooltipTrigger (line 28) | function TooltipTrigger({
  function TooltipContent (line 34) | function TooltipContent({

FILE: frontend/nyanpasu/src/components/updater/updater-dialog.tsx
  type UpdaterDialogProps (line 19) | interface UpdaterDialogProps extends Omit<BaseDialogProps, 'title'> {
  function UpdaterDialog (line 23) | function UpdaterDialog({

FILE: frontend/nyanpasu/src/components/window/window-control.tsx
  function WindowControl (line 120) | function WindowControl({

FILE: frontend/nyanpasu/src/components/window/window-header.tsx
  function WindowHeader (line 4) | function WindowHeader({

FILE: frontend/nyanpasu/src/components/window/window-title.tsx
  function WindowTitle (line 5) | function WindowTitle({

FILE: frontend/nyanpasu/src/consts.ts
  constant IS_NIGHTLY (line 14) | const IS_NIGHTLY = window.__IS_NIGHTLY__ === true

FILE: frontend/nyanpasu/src/hooks/use-core-icon.ts
  function useCoreIcon (line 6) | function useCoreIcon(core?: ClashCore | null) {

FILE: frontend/nyanpasu/src/hooks/use-current-core-icon.ts
  function useCurrentCoreIcon (line 4) | function useCurrentCoreIcon() {

FILE: frontend/nyanpasu/src/hooks/use-is-moblie.tsx
  function useIsMobile (line 3) | function useIsMobile() {
  function useIsMobileOrTablet (line 11) | function useIsMobileOrTablet() {

FILE: frontend/nyanpasu/src/hooks/use-lock-fn.ts
  type LockFn (line 4) | type LockFn<P extends any[] = any[], T = any> = (
  function useLockFn (line 12) | function useLockFn<P extends any[] = any[], T = any>(

FILE: frontend/nyanpasu/src/hooks/use-store.ts
  function useCoreType (line 8) | function useCoreType() {
  function useNyanpasuStorageSubscribers (line 20) | function useNyanpasuStorageSubscribers() {

FILE: frontend/nyanpasu/src/hooks/use-updater.ts
  function useUpdaterPlatformSupported (line 9) | function useUpdaterPlatformSupported() {
  function checkUpdate (line 26) | async function checkUpdate() {
  function useUpdater (line 39) | function useUpdater() {

FILE: frontend/nyanpasu/src/hooks/use-window-maximized.ts
  constant IS_MAXIMIZED_QUERY_KEY (line 9) | const IS_MAXIMIZED_QUERY_KEY = 'isMaximized'
  function useWindowMaximized (line 11) | function useWindowMaximized() {

FILE: frontend/nyanpasu/src/main.tsx
  type Register (line 39) | interface Register {

FILE: frontend/nyanpasu/src/pages/(editor)/editor/_modules/chip.tsx
  function Chip (line 4) | function Chip({ className, ...props }: ComponentProps<'span'>) {

FILE: frontend/nyanpasu/src/pages/(editor)/editor/_modules/header.tsx
  constant APP_NAME (line 6) | const APP_NAME = 'Clash Nyanpasu - Editor'
  function Header (line 22) | function Header({

FILE: frontend/nyanpasu/src/pages/(editor)/editor/_modules/hooks.tsx
  type CurrentProfileData (line 5) | type CurrentProfileData = Profile & {
  function useCurrentProfile (line 12) | function useCurrentProfile(uid: string): {

FILE: frontend/nyanpasu/src/pages/(editor)/editor/_modules/loading-skeleton.tsx
  function LoadingSkeleton (line 3) | function LoadingSkeleton() {

FILE: frontend/nyanpasu/src/pages/(editor)/editor/_modules/utils.tsx
  constant MONACO_FONT_FAMILY (line 7) | const MONACO_FONT_FAMILY =

FILE: frontend/nyanpasu/src/pages/(editor)/editor/index.tsx
  function RouteComponent (line 38) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(editor)/editor/route.tsx
  function RouteComponent (line 9) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(legacy)/connections.tsx
  function Connections (line 25) | function Connections() {

FILE: frontend/nyanpasu/src/pages/(legacy)/dashboard.tsx
  function Dashboard (line 16) | function Dashboard() {

FILE: frontend/nyanpasu/src/pages/(legacy)/index.tsx
  function RouteComponent (line 7) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(legacy)/logs.tsx
  function LogPage (line 12) | function LogPage() {

FILE: frontend/nyanpasu/src/pages/(legacy)/profiles.tsx
  function ProfilePage (line 50) | function ProfilePage() {

FILE: frontend/nyanpasu/src/pages/(legacy)/providers.tsx
  function ProvidersPage (line 19) | function ProvidersPage() {

FILE: frontend/nyanpasu/src/pages/(legacy)/proxies.tsx
  function SideBar (line 31) | function SideBar() {
  function ProxyPage (line 64) | function ProxyPage() {

FILE: frontend/nyanpasu/src/pages/(legacy)/route.tsx
  function Layout (line 35) | function Layout() {

FILE: frontend/nyanpasu/src/pages/(legacy)/rules.tsx
  function RulesPage (line 15) | function RulesPage() {

FILE: frontend/nyanpasu/src/pages/(legacy)/settings.tsx
  function SettingPage (line 18) | function SettingPage() {

FILE: frontend/nyanpasu/src/pages/(main)/_modules/header-file-action.tsx
  function HeaderFileAction (line 13) | function HeaderFileAction({ children }: PropsWithChildren) {

FILE: frontend/nyanpasu/src/pages/(main)/_modules/header-help-action.tsx
  function HeaderHelpAction (line 76) | function HeaderHelpAction({ children }: PropsWithChildren) {

FILE: frontend/nyanpasu/src/pages/(main)/_modules/header-menu.tsx
  function HeaderMenu (line 23) | function HeaderMenu({

FILE: frontend/nyanpasu/src/pages/(main)/_modules/header-settings-action.tsx
  function HeaderSettingsAction (line 84) | function HeaderSettingsAction({ children }: PropsWithChildren) {

FILE: frontend/nyanpasu/src/pages/(main)/_modules/header.tsx
  constant APP_NAME (line 10) | const APP_NAME = 'Clash Nyanpasu'
  function DefaultHeader (line 26) | function DefaultHeader({ className, ...props }: ComponentProps<'div'>) {
  function MacOSHeader (line 43) | function MacOSHeader({ className, ...props }: ComponentProps<'div'>) {
  function Header (line 67) | function Header({ className, ...props }: ComponentProps<'div'>) {

FILE: frontend/nyanpasu/src/pages/(main)/_modules/navbar.tsx
  function Navbar (line 114) | function Navbar({ className, ...props }: ComponentProps<'div'>) {

FILE: frontend/nyanpasu/src/pages/(main)/main/connections/_modules/table-row.tsx
  constant INTERNAL_KEYS (line 29) | const INTERNAL_KEYS = new Set(['closed', 'downloadSpeed', 'uploadSpeed'])
  function formatValue (line 32) | function formatValue(key: string, value: any): React.ReactNode {
  function RowRender (line 63) | function RowRender({ label, value }: { label: string; value: any }) {
  function TableRow (line 86) | function TableRow({

FILE: frontend/nyanpasu/src/pages/(main)/main/connections/index.tsx
  type ConnectionRow (line 40) | type ConnectionRow = ClashConnectionItem & {
  constant COLUMN_SIZING_STORAGE_KEY (line 46) | const COLUMN_SIZING_STORAGE_KEY = 'connections-column-sizing-v2'
  function RouteComponent (line 425) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/connections/route.tsx
  function RouteComponent (line 121) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/dashboard/route.tsx
  function RouteComponent (line 9) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/index.tsx
  function RouteComponent (line 7) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/logs/_modules/consts.ts
  type LogLevel (line 1) | enum LogLevel {

FILE: frontend/nyanpasu/src/pages/(main)/main/logs/_modules/log-level-badge.tsx
  function LogLevelBadge (line 5) | function LogLevelBadge({

FILE: frontend/nyanpasu/src/pages/(main)/main/logs/index.tsx
  function RouteComponent (line 136) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/logs/route.tsx
  function RouteComponent (line 99) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/chain-profile-import.tsx
  function ChainProfileImport (line 78) | function ChainProfileImport() {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/import-button.tsx
  function ImportButton (line 108) | function ImportButton() {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/local-profile-button.tsx
  function LocalProfileButton (line 64) | function LocalProfileButton({ children }: PropsWithChildren) {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/profiles-header.tsx
  function ProfilesHeader (line 21) | function ProfilesHeader() {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/profiles-list.tsx
  function ProfilesList (line 201) | function ProfilesList({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/remote-profile-button.tsx
  function RemoteProfileButton (line 73) | function RemoteProfileButton({ children }: PropsWithChildren) {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/_modules/utils.ts
  type CategoryProfiles (line 5) | type CategoryProfiles = {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/$uid.tsx
  function RouteComponent (line 19) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/action-card.tsx
  function ActionCard (line 34) | function ActionCard({ profile }: { profile: Profile }) {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/active-button.tsx
  function ActiveButton (line 69) | function ActiveButton({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/chian-editor-card.tsx
  type ScriptOrMergeProfile (line 24) | type ScriptOrMergeProfile = CategoryProfiles[
  type ColumnType (line 29) | enum ColumnType {
  constant COLUMN_TYPES (line 34) | const COLUMN_TYPES = [ColumnType.Active, ColumnType.Inactive] as const
  constant CHAIN_EDITOR_SORTABLE_GROUP (line 36) | const CHAIN_EDITOR_SORTABLE_GROUP = 'chain-editor-sortable'
  function ChianEditorCard (line 101) | function ChianEditorCard({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/delete-profile.tsx
  function DeleteProfile (line 53) | function DeleteProfile({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/detial-header.tsx
  function DetialHeader (line 25) | function DetialHeader({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/open-locally.tsx
  function OpenLocally (line 6) | function OpenLocally({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/profile-name-editor.tsx
  function ProfileNameEditor (line 27) | function ProfileNameEditor({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/subscription-url-editor.tsx
  function SubscriptionUrlEditor (line 27) | function SubscriptionUrlEditor({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/update-option-editor.tsx
  function UpdateOptionEditor (line 31) | function UpdateOptionEditor({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/detail/_modules/view-content.tsx
  function ViewContent (line 6) | function ViewContent({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/$type/index.tsx
  type Action (line 7) | enum Action {
  function RouteComponent (line 18) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/_modules/consts.ts
  type ListType (line 4) | enum ListType {
  type ProfileType (line 9) | enum ProfileType {
  constant PROFILE_TYPE_NAMES (line 16) | const PROFILE_TYPE_NAMES = {
  constant PROFILE_TYPES (line 23) | const PROFILE_TYPES = {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/_modules/error-item.tsx
  function AnimatedErrorItem (line 5) | function AnimatedErrorItem({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/_modules/profile-quick-import.tsx
  function ProfileQuickImport (line 18) | function ProfileQuickImport() {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/_modules/profiles-navigate.tsx
  constant ROUTES (line 49) | const ROUTES = {
  function ProfilesNavigate (line 103) | function ProfilesNavigate({

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/index.tsx
  function RouteComponent (line 10) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/inspect/route.tsx
  function RouteComponent (line 7) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/profiles/route.tsx
  function RouteComponent (line 12) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/providers/_modules/providers-title.tsx
  function ProvidersTitle (line 42) | function ProvidersTitle({

FILE: frontend/nyanpasu/src/pages/(main)/main/providers/index.tsx
  function RouteComponent (line 219) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/providers/proxies/$key.tsx
  function RouteComponent (line 11) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/providers/route.tsx
  function RouteComponent (line 113) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/providers/rules/$key.tsx
  function RouteComponent (line 10) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/proxies/_modules/hooks.ts
  function useCurrentGroupConnection (line 7) | function useCurrentGroupConnection(

FILE: frontend/nyanpasu/src/pages/(main)/main/proxies/_modules/proxies-navigate.tsx
  function ProxiesNavigate (line 7) | function ProxiesNavigate() {

FILE: frontend/nyanpasu/src/pages/(main)/main/proxies/group/$name.tsx
  function RouteComponent (line 21) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/proxies/group/_modules/delay-test-button.tsx
  function DelayTestButton (line 17) | function DelayTestButton() {

FILE: frontend/nyanpasu/src/pages/(main)/main/proxies/group/_modules/group-header.tsx
  function GroupHeader (line 17) | function GroupHeader({

FILE: frontend/nyanpasu/src/pages/(main)/main/proxies/group/_modules/proxy-node-button.tsx
  function ProxyNodeButton (line 9) | function ProxyNodeButton({

FILE: frontend/nyanpasu/src/pages/(main)/main/proxies/index.tsx
  function RouteComponent (line 10) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/proxies/route.tsx
  function RouteComponent (line 54) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/rules/_modules/proxy-icon.tsx
  function ProxyIcon (line 6) | function ProxyIcon({ groupName }: { groupName: string }) {

FILE: frontend/nyanpasu/src/pages/(main)/main/rules/index.tsx
  function RouteComponent (line 153) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/rules/route.tsx
  function RouteComponent (line 121) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/_modules/settings-card.tsx
  function SettingsLabel (line 7) | function SettingsLabel({ className, ...props }: ComponentProps<'div'>) {
  function SettingsGroup (line 17) | function SettingsGroup({ className, ...props }: ComponentProps<'div'>) {
  function SettingsCard (line 33) | function SettingsCard({
  function SettingsCardHeader (line 40) | function SettingsCardHeader({
  function SettingsCardFooter (line 53) | function SettingsCardFooter({
  function SettingsCardContent (line 66) | function SettingsCardContent({
  function ItemContainer (line 79) | function ItemContainer({ className, ...props }: ComponentProps<'div'>) {
  function ItemLabel (line 89) | function ItemLabel({ className, ...props }: ComponentProps<'div'>) {
  function ItemLabelText (line 99) | function ItemLabelText({
  function ItemLabelDescription (line 112) | function ItemLabelDescription({

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/_modules/settings-navigate.tsx
  function SettingsNavigate (line 188) | function SettingsNavigate() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/_modules/settings-title.tsx
  function SettingsTitle (line 42) | function SettingsTitle({

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/about/_modules/nyanpasu-version.tsx
  constant TITLE (line 33) | const TITLE = 'Clash Nyanpasu~(∠・ω< )⌒☆'
  constant GITHUB_RELEASES_URL (line 35) | const GITHUB_RELEASES_URL =
  method a (line 155) | a(props) {
  function NyanpasuVersion (line 199) | function NyanpasuVersion() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/about/route.tsx
  type Action (line 7) | enum Action {
  function RouteComponent (line 18) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/allow-lan-switch.tsx
  function AllowLanSwitch (line 14) | function AllowLanSwitch() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/core-manager-card.tsx
  function useCoreUpdateTask (line 39) | function useCoreUpdateTask(
  function CoreManagerCard (line 266) | function CoreManagerCard() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/field-filter-card.tsx
  type Item (line 22) | type Item = {
  function FieldFilterCard (line 180) | function FieldFilterCard() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/field-filter-switch.tsx
  function FieldFilterButton (line 13) | function FieldFilterButton() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/ipv6-switch.tsx
  function IPv6Switch (line 14) | function IPv6Switch() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/log-level-selector.tsx
  constant LOG_LEVEL_OPTIONS (line 12) | const LOG_LEVEL_OPTIONS = {
  function LogLevelSelector (line 20) | function LogLevelSelector() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/mixed-port-config.tsx
  constant DEFAULT_MIXED_PORT (line 14) | const DEFAULT_MIXED_PORT = 7890
  function MixedPortConfig (line 20) | function MixedPortConfig() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/random-port-switch.tsx
  function RandomPortSwitch (line 12) | function RandomPortSwitch() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/_modules/tun-stack-selector.tsx
  function TunStackSelector (line 16) | function TunStackSelector() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/clash/route.tsx
  function RouteComponent (line 110) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/debug/_modules/advance-tools-switch.tsx
  function AdvanceToolsSwitch (line 9) | function AdvanceToolsSwitch() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/debug/_modules/block-task-viewer.tsx
  function BlockTaskViewer (line 21) | function BlockTaskViewer() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/debug/_modules/debug-provider.tsx
  function DebugProvider (line 20) | function DebugProvider({ children }: PropsWithChildren) {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/debug/_modules/kv-storage.tsx
  function KVStorage (line 22) | function KVStorage() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/debug/_modules/path-utils-card.tsx
  function PathUtilsCard (line 27) | function PathUtilsCard() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/debug/_modules/window-debug.tsx
  function WindowDebug (line 14) | function WindowDebug() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/debug/index.tsx
  function RouteComponent (line 62) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/debug/route.tsx
  function RouteComponent (line 8) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/index.tsx
  function RouteComponent (line 11) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/nyanpasu/_modules/log-file-config.tsx
  constant MAX_LOG_FILES (line 7) | const MAX_LOG_FILES = 7
  function LogFileConfig (line 9) | function LogFileConfig() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/nyanpasu/route.tsx
  function RouteComponent (line 21) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/route.tsx
  function RouteComponent (line 12) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/auto-launch-switch.tsx
  function AutoLaunchSwitch (line 13) | function AutoLaunchSwitch() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/current-system-proxy.tsx
  function CurrentSystemProxy (line 5) | function CurrentSystemProxy() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-bypass-config.tsx
  constant DEFAULT_BYPASS (line 14) | const DEFAULT_BYPASS =
  function ProxyBypassConfig (line 23) | function ProxyBypassConfig() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-guard-config.tsx
  function ProxyGuardConfig (line 19) | function ProxyGuardConfig() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/proxy-guard-switch.tsx
  function ProxyGuardSwitch (line 14) | function ProxyGuardSwitch() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/slient-launch-switch.tsx
  function SilentLaunchSwitch (line 13) | function SilentLaunchSwitch() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-ctrl.tsx
  function SystemServiceCtrl (line 256) | function SystemServiceCtrl() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/system-service-switch.tsx
  function SystemServiceSwitch (line 19) | function SystemServiceSwitch() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/_modules/uwp-tools-button.tsx
  function UwpToolsButton (line 15) | function UwpToolsButton() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/system/route.tsx
  function RouteComponent (line 158) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/language-selector.tsx
  function LanguageSelector (line 12) | function LanguageSelector() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/switch-legacy.tsx
  function SwitchLegacy (line 17) | function SwitchLegacy() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-color-config.tsx
  constant PERSETS (line 22) | const PERSETS = [
  function ThemeColorConfig (line 31) | function ThemeColorConfig() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/_modules/theme-mode-selector.tsx
  function ThemeModeSelector (line 14) | function ThemeModeSelector() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/user-interface/route.tsx
  function RouteComponent (line 64) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/web-ui/_modules/core-secret-config.tsx
  function CoreSecretConfig (line 22) | function CoreSecretConfig() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/web-ui/_modules/external-controller-config.tsx
  function ExternalControllerConfig (line 22) | function ExternalControllerConfig() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/web-ui/_modules/port-strategy-selector.tsx
  function PortStrategySelector (line 11) | function PortStrategySelector() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/web-ui/_modules/web-ui.tsx
  function WebUI (line 294) | function WebUI() {

FILE: frontend/nyanpasu/src/pages/(main)/main/settings/web-ui/route.tsx
  function RouteComponent (line 57) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/(main)/route.tsx
  function RouteComponent (line 27) | function RouteComponent() {

FILE: frontend/nyanpasu/src/pages/__root.tsx
  function App (line 82) | function App() {

FILE: frontend/nyanpasu/src/route-tree.gen.ts
  type FileRoutesByFullPath (line 286) | interface FileRoutesByFullPath {
  type FileRoutesByTo (line 329) | interface FileRoutesByTo {
  type FileRoutesById (line 363) | interface FileRoutesById {
  type FileRouteTypes (line 409) | interface FileRouteTypes {
  type RootRouteChildren (line 534) | interface RootRouteChildren {
  type FileRoutesByPath (line 541) | interface FileRoutesByPath {
  type legacyRouteRouteChildren (line 846) | interface legacyRouteRouteChildren {
  type mainMainConnectionsRouteRouteChildren (line 874) | interface mainMainConnectionsRouteRouteChildren {
  type mainMainLogsRouteRouteChildren (line 888) | interface mainMainLogsRouteRouteChildren {
  type mainMainProfilesRouteRouteChildren (line 899) | interface mainMainProfilesRouteRouteChildren {
  type mainMainProvidersRouteRouteChildren (line 918) | interface mainMainProvidersRouteRouteChildren {
  type mainMainProxiesRouteRouteChildren (line 936) | interface mainMainProxiesRouteRouteChildren {
  type mainMainRulesRouteRouteChildren (line 949) | interface mainMainRulesRouteRouteChildren {
  type mainMainSettingsDebugRouteRouteChildren (line 960) | interface mainMainSettingsDebugRouteRouteChildren {
  type mainMainSettingsRouteRouteChildren (line 974) | interface mainMainSettingsRouteRouteChildren {
  type mainRouteRouteChildren (line 1002) | interface mainRouteRouteChildren {
  type editorEditorRouteRouteChildren (line 1030) | interface editorEditorRouteRouteChildren {

FILE: frontend/nyanpasu/src/services/monaco.ts
  method getWorker (line 21) | getWorker(_, label) {

FILE: frontend/nyanpasu/src/services/storage.ts
  function dispatchStorageValueChanged (line 14) | function dispatchStorageValueChanged(
  method getItem (line 27) | getItem(key) {
  method setItem (line 30) | setItem(key, newValue) {
  method removeItem (line 33) | removeItem(key) {
  method subscribe (line 36) | subscribe(key, callback) {

FILE: frontend/nyanpasu/src/services/types.d.ts
  type Platform (line 1) | type Platform =

FILE: frontend/nyanpasu/src/store/index.ts
  type IConnectionSetting (line 68) | interface IConnectionSetting {

FILE: frontend/nyanpasu/src/utils/chain.ts
  function chains (line 1) | function chains<T>(

FILE: frontend/nyanpasu/src/utils/ignore-case.ts
  type TData (line 3) | type TData = Record<string, any>
  function ignoreCase (line 5) | function ignoreCase(data: TData): TData {

FILE: frontend/nyanpasu/src/utils/index.ts
  function classNames (line 10) | function classNames(...classes: any[]) {
  function sleep (line 14) | async function sleep(ms: number) {
  function formatError (line 32) | function formatError(err: unknown): string {
  function formatEnvInfos (line 36) | function formatEnvInfos(envs: EnvInfo) {

FILE: frontend/nyanpasu/src/utils/language.ts
  type Language (line 40) | type Language = (typeof locales)[number]
  constant LANGUAGE_STORAGE_KEY (line 42) | const LANGUAGE_STORAGE_KEY = 'paraglide-language-cache'
  constant DEFAULT_LANGUAGE (line 44) | const DEFAULT_LANGUAGE = 'en'
  constant CACHED_LANGUAGE_STORAGE_KEY (line 47) | const CACHED_LANGUAGE_STORAGE_KEY = btoa(LANGUAGE_STORAGE_KEY)

FILE: frontend/nyanpasu/src/utils/mui-theme.ts
  type PureSx (line 5) | type PureSx<T extends object> = Exclude<SxProps<T>, ReadonlyArray<unknown>>
  type SxAsArray (line 6) | type SxAsArray<T extends object> = Array<PureSx<T>>

FILE: frontend/nyanpasu/src/utils/notification.ts
  type NotificationOptions (line 28) | type NotificationOptions = {
  type NotificationType (line 34) | enum NotificationType {

FILE: frontend/nyanpasu/src/utils/parse-hotkey.ts
  constant KEY_MAP (line 1) | const KEY_MAP: Record<string, string> = {

FILE: frontend/nyanpasu/src/utils/parse-traffic.ts
  constant UNITS (line 1) | const UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']

FILE: frontend/nyanpasu/src/utils/shiki.ts
  function getShikiSingleton (line 10) | async function getShikiSingleton() {
  function formatAnsi (line 21) | async function formatAnsi(str: string) {

FILE: frontend/nyanpasu/src/utils/styled.ts
  function insertStyle (line 1) | function insertStyle(id: string, style: string) {
  function
Condensed preview — 743 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,789K chars).
[
  {
    "path": ".editorconfig",
    "chars": 220,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\ninsert_final_newline = true\n\n[*.lua]\ncharset = utf-8\ni"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
    "chars": 6255,
    "preview": "# thanks https://github.com/Ehviewer-Overhauled/Ehviewer templates.\n\nname: Bug 反馈 / Bug report\ndescription: 提交一个问题报告 / C"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 197,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: 所有其他问题 / All other questions\n    url: https://github.com/libnyanpas"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yaml",
    "chars": 3194,
    "preview": "# thanks https://github.com/Ehviewer-Overhauled/Ehviewer templates.\n\nname: 功能请求 / Feature request\ndescription: 提出一个功能建议 "
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 7972,
    "preview": "on:\n  pull_request:\n    branches:\n      - main\n      - dev\n      - release-*\n  push:\n    branches:\n      - main\n      - "
  },
  {
    "path": ".github/workflows/daily.yml",
    "chars": 2980,
    "preview": "on:\n  workflow_dispatch:\n  schedule:\n    - cron: '15 22 * * *' # 每天 06:15 UTC+8 自动构建\n\nname: Daily\n\njobs:\n  generate_mani"
  },
  {
    "path": ".github/workflows/deps-build-linux.yaml",
    "chars": 10120,
    "preview": "name: '[Single] Build Linux'\n\non:\n  workflow_dispatch:\n    inputs:\n      nightly:\n        description: 'Nightly prepare'"
  },
  {
    "path": ".github/workflows/deps-build-macos.yaml",
    "chars": 5608,
    "preview": "name: '[Single] Build macOS'\n\non:\n  workflow_dispatch:\n    inputs:\n      aarch64:\n        description: 'Build aarch64 pk"
  },
  {
    "path": ".github/workflows/deps-build-windows-nsis.yaml",
    "chars": 9333,
    "preview": "name: '[Single] Build Windows NSIS'\n\non:\n  workflow_dispatch:\n    inputs:\n      portable:\n        description: 'Build Po"
  },
  {
    "path": ".github/workflows/deps-create-updater.yaml",
    "chars": 2993,
    "preview": "name: '[Single] Create Updater'\n\non:\n  workflow_dispatch:\n    inputs:\n      nightly:\n        description: 'Nightly'\n    "
  },
  {
    "path": ".github/workflows/deps-delete-releases.yaml",
    "chars": 893,
    "preview": "name: '[Single] Delete Current Releases'\n\non:\n  workflow_dispatch:\n    inputs:\n      tag:\n        description: 'Release "
  },
  {
    "path": ".github/workflows/deps-message-telegram.yaml",
    "chars": 2095,
    "preview": "name: '[Single] Send Message to Telegram'\n\non:\n  workflow_dispatch:\n    inputs:\n      nightly:\n        description: 'Nig"
  },
  {
    "path": ".github/workflows/deps-update-tag.yaml",
    "chars": 1591,
    "preview": "name: '[Single] Update Tag'\n\non:\n  workflow_dispatch:\n    inputs:\n      tag:\n        description: 'Release Tag'\n        "
  },
  {
    "path": ".github/workflows/deps-upload-release-assets.yaml",
    "chars": 838,
    "preview": "name: '[Single] Upload Release Assets'\n\non:\n  workflow_call:\n    inputs:\n      tag:\n        description: 'Release Tag'\n "
  },
  {
    "path": ".github/workflows/macos-aarch64.yaml",
    "chars": 1584,
    "preview": "name: macOS aarch64 Build\n\non:\n  workflow_dispatch:\nenv:\n  CARGO_INCREMENTAL: 0\n  RUST_BACKTRACE: short\n\njobs:\n  macos-a"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 3395,
    "preview": "name: Publish\n\non:\n  workflow_dispatch:\n    inputs:\n      versionType:\n        type: choice\n        description: '<major"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 724,
    "preview": "name: 'Close stale issues and PRs'\non:\n  schedule:\n    - cron: '30 1 * * *'\n  workflow_dispatch:\n\npermissions:\n  content"
  },
  {
    "path": ".github/workflows/target-dev-build.yaml",
    "chars": 6010,
    "preview": "name: '[Entire] Build Developer Version'\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: '15 0 * * *' # 每天 08:15 UTC+8"
  },
  {
    "path": ".github/workflows/target-release-build.yaml",
    "chars": 1667,
    "preview": "name: '[Entire] Build Release Version'\n\non:\n  release:\n    types: [published]\n\nenv:\n  CARGO_INCREMENTAL: 0\n  RUST_BACKTR"
  },
  {
    "path": ".gitignore",
    "chars": 252,
    "preview": "node_modules\n.DS_Store\ndist\ndist-ssr\n*.local\nupdate.json\nscripts/_env.sh\n\n.eslintcache\n.stylelintcache\n\ntauri.nightly.co"
  },
  {
    "path": ".husky/commit-msg",
    "chars": 28,
    "preview": "pnpm commitlint --edit ${1}\n"
  },
  {
    "path": ".husky/pre-commit",
    "chars": 201,
    "preview": "# If tty is available, apply fix from https://github.com/typicode/husky/issues/968#issuecomment-1176848345\nif sh -c \": >"
  },
  {
    "path": ".lintstagedrc.js",
    "chars": 1772,
    "preview": "export default {\n  '*.{js,cjs,.mjs,jsx}': (filenames) => {\n    const configFiles = [\n      '.oxlintrc.json',\n      '.lin"
  },
  {
    "path": ".oxlintrc.json",
    "chars": 20513,
    "preview": "{\n  \"$schema\": \"./node_modules/oxlint/configuration_schema.json\",\n  \"plugins\": [],\n  \"categories\": {\n    \"correctness\": "
  },
  {
    "path": ".prettierignore",
    "chars": 244,
    "preview": "*.rs\n*.lock\n**/target/\ndist/\n**/node_modules/\npnpm-lock.yaml\n*.lock\n*.wxs\nfrontend/nyanpasu/src/route-tree.gen.ts\nfronte"
  },
  {
    "path": ".prettierrc.cjs",
    "chars": 677,
    "preview": "/** @type {import(\"prettier\").Config} */\nmodule.exports = {\n  endOfLine: 'lf',\n  semi: false,\n  singleQuote: true,\n  bra"
  },
  {
    "path": ".stylelintignore",
    "chars": 24,
    "preview": "dist/\nbackend/**/target\n"
  },
  {
    "path": ".stylelintrc.js",
    "chars": 2215,
    "preview": "import PostCssScss from 'postcss-scss'\n\nexport default {\n  root: true,\n  defaultSeverity: 'error',\n  plugins: [\n    'sty"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 391,
    "preview": "{\n  \"recommendations\": [\n    \"inlang.vs-code-extension\",\n    \"editorconfig.editorconfig\",\n    \"vadimcn.vscode-lldb\",\n   "
  },
  {
    "path": ".vscode/settings.json",
    "chars": 236,
    "preview": "{\n  \"tailwindCSS.experimental.classRegex\": [\n    [\"cva\\\\(([^)]*)\\\\)\", \"[\\\"'`]([^\\\"'`]*).*?[\\\"'`]\"],\n    [\"cx\\\\(([^)]*)\\\\"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 75694,
    "preview": "## [1.6.1] - 2024-09-07\n\n### ✨ Features\n\n- **dock:** Try to setup macos dock handler by @greenhat616\n\n- **enhance:** Fin"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5213,
    "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": 4981,
    "preview": "# Contributing to Nyanpasu\n\nWelcome to **Nyanpasu** development!  \nTo ensure the quality and stability of the project, p"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 4460,
    "preview": "<h1 align=\"center\">\n  <img src=\"https://nyanpasu.elaina.moe/images/banner/nyanpasu_banner.png\" alt=\"Clash Nyanpasu Banne"
  },
  {
    "path": "UPDATELOG.md",
    "chars": 11261,
    "preview": "## v1.4.2\n\n### Features\n\n- Support Clash-rs v0.1.10. [@greenhat616](https://github.com/greenhat616)\n- New Windows tray i"
  },
  {
    "path": "backend/.gitignore",
    "chars": 75,
    "preview": "# Generated by Cargo\n# will have compiled files and executables\n**/target/\n"
  },
  {
    "path": "backend/Cargo.toml",
    "chars": 1183,
    "preview": "[workspace]\nresolver = \"2\"\nmembers = [\"tauri\", \"boa_utils\", \"nyanpasu-macro\", \"nyanpasu-egui\"]\n\n[patch.crates-io]\ntray-i"
  },
  {
    "path": "backend/Cross.toml",
    "chars": 1928,
    "preview": "[target.aarch64-unknown-linux-gnu]\n# dockerfile = \"./manifest/docker/ubuntu-22.04-aarch64/Dockerfile\"\nimage = \"ghcr.io/l"
  },
  {
    "path": "backend/boa_utils/Cargo.toml",
    "chars": 1218,
    "preview": "[package]\nname = \"boa_utils\"\nversion = \"0.1.0\"\nrepository.workspace = true\nedition.workspace = true\nlicense.workspace = "
  },
  {
    "path": "backend/boa_utils/src/console/mod.rs",
    "chars": 25638,
    "preview": "//! Boa's implementation of JavaScript's `console` Web API object.\n//!\n//! The `console` object can be accessed from any"
  },
  {
    "path": "backend/boa_utils/src/console/tests.rs",
    "chars": 3069,
    "preview": "use super::{Console, formatter};\nuse crate::test::{TestAction, run_test_actions, run_test_actions_with};\nuse boa_engine:"
  },
  {
    "path": "backend/boa_utils/src/lib.rs",
    "chars": 9771,
    "preview": "#![feature(trait_alias)]\n#![feature(auto_traits)]\n#![feature(negative_impls)]\n\n//! Boa's **boa_runtime** crate contains "
  },
  {
    "path": "backend/boa_utils/src/module/builtin/utils.js",
    "chars": 411,
    "preview": "import dedent from 'nyan:dedent'\nimport YAML from 'nyan:yaml'\n\n/**\n * Parse template string into YAML object\n * @param {"
  },
  {
    "path": "backend/boa_utils/src/module/builtin.rs",
    "chars": 9620,
    "preview": "use std::{cell::RefCell, io::Read, rc::Rc};\n\nuse anyhow::Context as _;\nuse boa_engine::{Context, JsNativeError, JsResult"
  },
  {
    "path": "backend/boa_utils/src/module/combine.rs",
    "chars": 2033,
    "preview": "use std::{cell::RefCell, rc::Rc};\n\nuse boa_engine::{Context, JsResult, JsString, Module, module::ModuleLoader};\nuse url:"
  },
  {
    "path": "backend/boa_utils/src/module/http.rs",
    "chars": 11156,
    "preview": "use std::{\n    cell::RefCell,\n    path::PathBuf,\n    rc::Rc,\n    str::FromStr,\n    time::{Duration, SystemTime},\n};\n\nuse"
  },
  {
    "path": "backend/boa_utils/src/module/mod.rs",
    "chars": 69,
    "preview": "#![allow(dead_code)]\npub mod builtin;\npub mod combine;\npub mod http;\n"
  },
  {
    "path": "backend/nyanpasu-egui/.gitignore",
    "chars": 8,
    "preview": "/target\n"
  },
  {
    "path": "backend/nyanpasu-egui/Cargo.toml",
    "chars": 1195,
    "preview": "[package]\nname = \"nyanpasu-egui\"\nversion = \"0.1.0\"\nedition = \"2024\"\n\n[lib]\nname = \"nyanpasu_egui\"\ncrate-type = [\"staticl"
  },
  {
    "path": "backend/nyanpasu-egui/src/ipc.rs",
    "chars": 1840,
    "preview": "pub use ipc_channel::ipc::IpcSender;\nuse ipc_channel::ipc::{self, IpcReceiver};\n\nuse crate::widget::network_statistic_la"
  },
  {
    "path": "backend/nyanpasu-egui/src/lib.rs",
    "chars": 66,
    "preview": "#![feature(trait_alias)]\n\npub mod ipc;\nmod utils;\npub mod widget;\n"
  },
  {
    "path": "backend/nyanpasu-egui/src/main.rs",
    "chars": 868,
    "preview": "#![allow(dead_code)]\n#![cfg_attr(not(debug_assertions), windows_subsystem = \"windows\")] // hide console window on Window"
  },
  {
    "path": "backend/nyanpasu-egui/src/small.rs",
    "chars": 867,
    "preview": "#![allow(dead_code)]\n#![cfg_attr(not(debug_assertions), windows_subsystem = \"windows\")] // hide console window on Window"
  },
  {
    "path": "backend/nyanpasu-egui/src/utils/mod.rs",
    "chars": 13,
    "preview": "pub mod svg;\n"
  },
  {
    "path": "backend/nyanpasu-egui/src/utils/svg.rs",
    "chars": 2260,
    "preview": "use csscolorparser::Color as CssColor;\nuse eframe::egui::ColorImage;\nuse resvg::tiny_skia::Pixmap;\nuse usvg::{Error, Opt"
  },
  {
    "path": "backend/nyanpasu-egui/src/widget/mod.rs",
    "chars": 2182,
    "preview": "pub mod network_statistic_large;\npub mod network_statistic_small;\n\nuse std::path::PathBuf;\n\npub use network_statistic_la"
  },
  {
    "path": "backend/nyanpasu-egui/src/widget/network_statistic_large.rs",
    "chars": 20894,
    "preview": "#![allow(dead_code)]\nuse std::sync::{Arc, LazyLock};\n\nuse crate::{\n    ipc::Message,\n    utils::svg::{SvgExt, render_svg"
  },
  {
    "path": "backend/nyanpasu-egui/src/widget/network_statistic_small.rs",
    "chars": 11061,
    "preview": "#![allow(dead_code)]\nuse std::sync::{Arc, LazyLock};\n\nuse eframe::egui::{\n    self, Color32, CornerRadius, Id, Image, La"
  },
  {
    "path": "backend/nyanpasu-macro/Cargo.toml",
    "chars": 241,
    "preview": "[package]\nname = \"nyanpasu-macro\"\nversion = \"0.1.0\"\nrepository.workspace = true\nedition.workspace = true\nlicense.workspa"
  },
  {
    "path": "backend/nyanpasu-macro/src/builder_update.rs",
    "chars": 6620,
    "preview": "use proc_macro2::TokenStream;\nuse quote::{format_ident, quote};\nuse syn::{DeriveInput, Error, Ident, LitStr, Meta, Type,"
  },
  {
    "path": "backend/nyanpasu-macro/src/enum_wrapper_combined.rs",
    "chars": 3194,
    "preview": "use proc_macro2::TokenStream;\nuse quote::{format_ident, quote};\nuse syn::{DeriveInput, Fields};\n\npub fn enum_combined_wr"
  },
  {
    "path": "backend/nyanpasu-macro/src/lib.rs",
    "chars": 1191,
    "preview": "use proc_macro::TokenStream;\nuse syn::{DeriveInput, parse_macro_input};\n\nmod builder_update;\nmod enum_wrapper_combined;\n"
  },
  {
    "path": "backend/nyanpasu-macro/src/verge_patch.rs",
    "chars": 3176,
    "preview": "use proc_macro2::TokenStream;\nuse quote::{format_ident, quote};\nuse syn::{Data, DeriveInput, Error, Ident, LitStr, Meta,"
  },
  {
    "path": "backend/rustfmt.toml",
    "chars": 332,
    "preview": "max_width = 100\nhard_tabs = false\ntab_spaces = 4\nnewline_style = \"Auto\"\nuse_small_heuristics = \"Default\"\nreorder_imports"
  },
  {
    "path": "backend/tauri/.gitignore",
    "chars": 121,
    "preview": "# Generated by Cargo\n# will have compiled files and executables\n/target/\nWixTools\nresources\nsidecar\ntmp/\n\n!/tmp/.gitkeep"
  },
  {
    "path": "backend/tauri/Cargo.toml",
    "chars": 7749,
    "preview": "[package]\nname = \"clash-nyanpasu\"\nversion = \"0.1.0\"\ndescription = \"clash verge\"\nauthors = { workspace = true }\nlicense ="
  },
  {
    "path": "backend/tauri/Info.plist",
    "chars": 701,
    "preview": "<!-- Add this file next to your tauri.conf.json file -->\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \""
  },
  {
    "path": "backend/tauri/build.rs",
    "chars": 3423,
    "preview": "use chrono::{DateTime, SecondsFormat, Utc};\nuse rustc_version::version_meta;\nuse serde::Deserialize;\nuse std::{\n    env,"
  },
  {
    "path": "backend/tauri/capabilities/main.json",
    "chars": 2656,
    "preview": "{\n  \"$schema\": \"../gen/schemas/desktop-schema.json\",\n  \"identifier\": \"main-capability\",\n  \"local\": true,\n  \"windows\": [\""
  },
  {
    "path": "backend/tauri/locales/en.json",
    "chars": 2111,
    "preview": "{\n  \"_version\": 1,\n  \"tray\": {\n    \"copy_env\": {\n      \"cmd\": \"Copy Env (CMD)\",\n      \"ps\": \"Copy Env (PS)\",\n      \"sh\":"
  },
  {
    "path": "backend/tauri/locales/ru.json",
    "chars": 2306,
    "preview": "{\n  \"_version\": 1,\n  \"tray\": {\n    \"copy_env\": {\n      \"cmd\": \"Копировать Env (CMD)\",\n      \"ps\": \"Копировать Env (PS)\","
  },
  {
    "path": "backend/tauri/locales/zh-cn.json",
    "chars": 1532,
    "preview": "{\n  \"_version\": 1,\n  \"tray\": {\n    \"copy_env\": {\n      \"cmd\": \"复制环境变量 (CMD)\",\n      \"ps\": \"复制环境变量 (PS)\",\n      \"sh\": \"复制"
  },
  {
    "path": "backend/tauri/locales/zh-tw.json",
    "chars": 1533,
    "preview": "{\n  \"_version\": 1,\n  \"tray\": {\n    \"copy_env\": {\n      \"cmd\": \"複製環境變數 (CMD)\",\n      \"ps\": \"複製環境變數 (PS)\",\n      \"sh\": \"複製"
  },
  {
    "path": "backend/tauri/overrides/fixed-webview2.conf.json",
    "chars": 728,
    "preview": "{\n  \"$schema\": \"../../../node_modules/@tauri-apps/cli/config.schema.json\",\n  \"bundle\": {\n    \"windows\": {\n      \"webview"
  },
  {
    "path": "backend/tauri/overrides/nightly.conf.json",
    "chars": 714,
    "preview": "{\n  \"$schema\": \"../../../node_modules/@tauri-apps/cli/config.schema.json\",\n  \"version\": \"2.0.0\",\n  \"plugins\": {\n    \"upd"
  },
  {
    "path": "backend/tauri/src/cmds/migrate.rs",
    "chars": 6197,
    "preview": "use clap::Args;\n\nuse crate::core::migration::{\n    MigrationAdvice, Runner,\n    units::{find_migration, get_migrations},"
  },
  {
    "path": "backend/tauri/src/cmds/mod.rs",
    "chars": 5832,
    "preview": "use std::str::FromStr;\n\nuse crate::utils;\nuse anyhow::Ok;\nuse clap::{Parser, Subcommand};\nuse migrate::MigrateOpts;\nuse "
  },
  {
    "path": "backend/tauri/src/config/clash/mod.rs",
    "chars": 9863,
    "preview": "use crate::utils::{\n    dirs,\n    help::{self, get_clash_external_port},\n};\nuse anyhow::Result;\nuse log::warn;\nuse serde"
  },
  {
    "path": "backend/tauri/src/config/core.rs",
    "chars": 2977,
    "preview": "use super::{Draft, IClashTemp, IRuntime, IVerge, Profiles};\nuse crate::{\n    core::state::ManagedState,\n    enhance,\n   "
  },
  {
    "path": "backend/tauri/src/config/draft.rs",
    "chars": 3970,
    "preview": "use super::{IClashTemp, IRuntime, IVerge};\nuse parking_lot::{MappedMutexGuard, Mutex, MutexGuard};\nuse std::sync::Arc;\n\n"
  },
  {
    "path": "backend/tauri/src/config/mod.rs",
    "chars": 226,
    "preview": "mod clash;\nmod core;\nmod draft;\npub mod nyanpasu;\npub mod profile;\nmod runtime;\npub use self::{\n    clash::*,\n    core::"
  },
  {
    "path": "backend/tauri/src/config/nyanpasu/clash_strategy.rs",
    "chars": 732,
    "preview": "use serde::{Deserialize, Serialize};\nuse specta::Type;\n\n#[derive(Default, Debug, Clone, Deserialize, Serialize, Type)]\np"
  },
  {
    "path": "backend/tauri/src/config/nyanpasu/logging.rs",
    "chars": 1413,
    "preview": "use super::IVerge;\nuse serde::{Deserialize, Serialize};\nuse strum::{Display, EnumString};\nuse tracing_subscriber::filter"
  },
  {
    "path": "backend/tauri/src/config/nyanpasu/mod.rs",
    "chars": 14017,
    "preview": "use crate::utils::{dirs, help};\nuse anyhow::Result;\n// use log::LevelFilter;\nuse enumflags2::bitflags;\nuse nyanpasu_macr"
  },
  {
    "path": "backend/tauri/src/config/nyanpasu/widget.rs",
    "chars": 377,
    "preview": "use nyanpasu_egui::widget::StatisticWidgetVariant;\nuse serde::{Deserialize, Serialize};\nuse specta::Type;\n\n#[derive(Debu"
  },
  {
    "path": "backend/tauri/src/config/profile/builder.rs",
    "chars": 1226,
    "preview": "use crate::config::*;\n\nuse super::item::{\n    LocalProfileBuilder, MergeProfileBuilder, RemoteProfileBuilder, ScriptProf"
  },
  {
    "path": "backend/tauri/src/config/profile/item/local.rs",
    "chars": 2038,
    "preview": "use super::{\n    ProfileCleanup, ProfileFileIo, ProfileHelper, ProfileMetaGetter, ProfileMetaSetter,\n    ProfileShared, "
  },
  {
    "path": "backend/tauri/src/config/profile/item/merge.rs",
    "chars": 1654,
    "preview": "use crate::config::{ProfileKindGetter, profile::item_type::ProfileItemType};\n\nuse super::{\n    ProfileCleanup, ProfileFi"
  },
  {
    "path": "backend/tauri/src/config/profile/item/mod.rs",
    "chars": 4737,
    "preview": "#![allow(clippy::crate_in_macro_def, dead_code)]\nuse super::item_type::ProfileItemType;\nuse crate::utils::dirs;\nuse amba"
  },
  {
    "path": "backend/tauri/src/config/profile/item/prelude.rs",
    "chars": 134,
    "preview": "#![allow(unused_imports)]\npub use super::{\n    ProfileCleanup, ProfileFileIo, ProfileHelper, ProfileKindGetter, ProfileM"
  },
  {
    "path": "backend/tauri/src/config/profile/item/remote.rs",
    "chars": 16850,
    "preview": "use super::{\n    ProfileCleanup, ProfileFileIo, ProfileHelper, ProfileMetaGetter, ProfileMetaSetter,\n    ProfileShared, "
  },
  {
    "path": "backend/tauri/src/config/profile/item/script.rs",
    "chars": 2187,
    "preview": "use super::{\n    ProfileCleanup, ProfileFileIo, ProfileHelper, ProfileMetaGetter, ProfileMetaSetter,\n    ProfileShared, "
  },
  {
    "path": "backend/tauri/src/config/profile/item/shared.rs",
    "chars": 6800,
    "preview": "use std::{fmt, str::FromStr};\n\nuse ambassador::delegatable_trait;\nuse derive_builder::Builder;\nuse nyanpasu_macro::Build"
  },
  {
    "path": "backend/tauri/src/config/profile/item/utils.rs",
    "chars": 374,
    "preview": "use crate::{config::profile::item_type::ProfileItemType, utils::help};\n\npub fn generate_uid(kind: &ProfileItemType) -> S"
  },
  {
    "path": "backend/tauri/src/config/profile/item_type.rs",
    "chars": 569,
    "preview": "use crate::enhance::ScriptType;\nuse serde::{Deserialize, Serialize};\nuse strum::EnumString;\n\n#[derive(\n    Debug, EnumSt"
  },
  {
    "path": "backend/tauri/src/config/profile/mod.rs",
    "chars": 164,
    "preview": "pub mod builder;\npub mod item;\npub mod item_type;\npub mod profiles;\n\npub use builder::ProfileBuilder;\nuse item::deserial"
  },
  {
    "path": "backend/tauri/src/config/profile/profiles.rs",
    "chars": 7323,
    "preview": "use super::{\n    builder::ProfileBuilder,\n    item::{Profile, prelude::*},\n    item_type::ProfileUid,\n};\nuse crate::util"
  },
  {
    "path": "backend/tauri/src/config/profile/tests.rs",
    "chars": 10047,
    "preview": "use crate::{\n    config::profile::{\n        item::{\n            LocalProfile, MergeProfile, Profile, RemoteProfile, Remo"
  },
  {
    "path": "backend/tauri/src/config/runtime.rs",
    "chars": 1825,
    "preview": "use serde::{Deserialize, Serialize};\nuse serde_yaml::Mapping;\n\nuse crate::enhance::PostProcessingOutput;\n\n#[derive(Defau"
  },
  {
    "path": "backend/tauri/src/consts.rs",
    "chars": 2049,
    "preview": "use once_cell::sync::{Lazy, OnceCell};\nuse tauri::AppHandle;\n\npub const MAIN_WINDOW_LABEL: &str = \"main\";\npub const LEGA"
  },
  {
    "path": "backend/tauri/src/core/clash/api.rs",
    "chars": 14468,
    "preview": "use crate::config::Config;\nuse anyhow::{Context, Result};\nuse indexmap::IndexMap;\nuse reqwest::{Method, StatusCode, head"
  },
  {
    "path": "backend/tauri/src/core/clash/core.rs",
    "chars": 26538,
    "preview": "use super::api;\nuse crate::{\n    config::{Config, ConfigType, nyanpasu::ClashCore},\n    core::logger::Logger,\n    log_er"
  },
  {
    "path": "backend/tauri/src/core/clash/mod.rs",
    "chars": 1795,
    "preview": "use backon::ExponentialBuilder;\nuse once_cell::sync::Lazy;\nuse serde::{Deserialize, Serialize};\nuse specta::Type;\nuse ta"
  },
  {
    "path": "backend/tauri/src/core/clash/proxies.rs",
    "chars": 9696,
    "preview": "/// This module is used to manage the proxies for the Tauri application.\n/// It is used to provide the unite interface b"
  },
  {
    "path": "backend/tauri/src/core/clash/ws.rs",
    "chars": 9471,
    "preview": "use std::{\n    future::Future,\n    ops::Deref,\n    sync::{Arc, atomic::Ordering},\n};\n\nuse anyhow::Context;\nuse atomic_en"
  },
  {
    "path": "backend/tauri/src/core/connection_interruption.rs",
    "chars": 2783,
    "preview": "use crate::{config::Config, core::clash::api};\nuse anyhow::Result;\nuse serde::{Deserialize, Serialize};\nuse specta::Type"
  },
  {
    "path": "backend/tauri/src/core/handle.rs",
    "chars": 3241,
    "preview": "use super::tray::Tray;\nuse crate::log_err;\nuse anyhow::{Result, bail};\nuse once_cell::sync::OnceCell;\nuse parking_lot::M"
  },
  {
    "path": "backend/tauri/src/core/hotkey.rs",
    "chars": 6815,
    "preview": "use crate::{config::Config, feat, log_err};\nuse anyhow::{Result, bail};\nuse once_cell::sync::OnceCell;\nuse parking_lot::"
  },
  {
    "path": "backend/tauri/src/core/logger.rs",
    "chars": 868,
    "preview": "use once_cell::sync::OnceCell;\nuse parking_lot::Mutex;\nuse std::{collections::VecDeque, sync::Arc};\n\nconst LOGS_QUEUE_LE"
  },
  {
    "path": "backend/tauri/src/core/manager.rs",
    "chars": 2658,
    "preview": "use std::borrow::Cow;\n\n/// 给clash内核的tun模式授权\n#[cfg(any(target_os = \"macos\", target_os = \"linux\"))]\npub fn grant_permissio"
  },
  {
    "path": "backend/tauri/src/core/migration/db.rs",
    "chars": 2628,
    "preview": "use derive_builder::Builder;\nuse once_cell::sync::Lazy;\nuse semver::Version;\n/// A simple file based database for storin"
  },
  {
    "path": "backend/tauri/src/core/migration/mod.rs",
    "chars": 10198,
    "preview": "#![allow(dead_code)]\n/// A migration mod indicates the migration of the old version to the new version.\n/// Because this"
  },
  {
    "path": "backend/tauri/src/core/migration/units/mod.rs",
    "chars": 1604,
    "preview": "use super::{DynMigration, Migration, Unit};\nuse once_cell::sync::Lazy;\nuse semver::Version;\nuse std::{borrow::Cow, colle"
  },
  {
    "path": "backend/tauri/src/core/migration/units/unit_160.rs",
    "chars": 14488,
    "preview": "use std::borrow::Cow;\n\nuse once_cell::sync::Lazy;\nuse serde_yaml::{\n    Mapping,\n    value::{Tag, TaggedValue},\n};\n\nuse "
  },
  {
    "path": "backend/tauri/src/core/migration/units/unit_200/profile_script_newtype.rs",
    "chars": 7901,
    "preview": "use std::borrow::Cow;\n\nuse semver::Version;\nuse serde_yaml::{\n    Mapping, Value,\n    value::{Tag, TaggedValue},\n};\n\nuse"
  },
  {
    "path": "backend/tauri/src/core/migration/units/unit_200.rs",
    "chars": 6919,
    "preview": "use std::borrow::Cow;\n\nuse once_cell::sync::Lazy;\nuse semver::Version;\nuse serde_yaml::Mapping;\n\nuse crate::{\n    core::"
  },
  {
    "path": "backend/tauri/src/core/mod.rs",
    "chars": 337,
    "preview": "pub mod clash;\npub mod connection_interruption;\npub mod handle;\npub mod hotkey;\npub mod logger;\npub mod manager;\npub mod"
  },
  {
    "path": "backend/tauri/src/core/pac.rs",
    "chars": 11425,
    "preview": "use crate::{config::Config, log_err};\nuse anyhow::{Context, Result};\nuse std::{path::PathBuf, time::Duration};\nuse syspr"
  },
  {
    "path": "backend/tauri/src/core/service/control.rs",
    "chars": 10276,
    "preview": "use crate::utils::dirs::{app_config_dir, app_data_dir, app_install_dir};\nuse runas::Command as RunasCommand;\nuse std::ff"
  },
  {
    "path": "backend/tauri/src/core/service/ipc.rs",
    "chars": 3614,
    "preview": "use std::sync::atomic::{AtomicBool, Ordering};\n\nuse atomic_enum::atomic_enum;\n\nuse nyanpasu_ipc::types::ServiceStatus;\nu"
  },
  {
    "path": "backend/tauri/src/core/service/mod.rs",
    "chars": 988,
    "preview": "use std::path::PathBuf;\n\nuse nyanpasu_ipc::types::StatusInfo;\nuse once_cell::sync::Lazy;\n\nuse crate::{config::Config, ut"
  },
  {
    "path": "backend/tauri/src/core/state.rs",
    "chars": 6388,
    "preview": "#[allow(dead_code)]\nuse parking_lot::{\n    MappedRwLockReadGuard, MappedRwLockWriteGuard, RwLock,\n    lock_api::{RwLockR"
  },
  {
    "path": "backend/tauri/src/core/state_v2/builder.rs",
    "chars": 530,
    "preview": "pub trait StateSyncBuilder: Default + Clone {\n    type State: Clone + Send + Sync + 'static;\n\n    fn build(&self) -> any"
  },
  {
    "path": "backend/tauri/src/core/state_v2/coordinator.rs",
    "chars": 22943,
    "preview": "use super::builder::*;\n\n#[derive(thiserror::Error, Debug)]\npub enum StateChangedError {\n    #[error(\"builder validation "
  },
  {
    "path": "backend/tauri/src/core/state_v2/manager/persistent.rs",
    "chars": 14979,
    "preview": "use anyhow::Context;\nuse camino::Utf8PathBuf;\nuse serde::{Serialize, de::DeserializeOwned};\n\nuse crate::utils::help;\n\nus"
  },
  {
    "path": "backend/tauri/src/core/state_v2/manager/simple.rs",
    "chars": 593,
    "preview": "use super::*;\n\n#[repr(transparent)]\npub struct SimpleStateManager<State: Clone + Send + Sync + 'static> {\n    state_coor"
  },
  {
    "path": "backend/tauri/src/core/state_v2/manager.rs",
    "chars": 113,
    "preview": "mod persistent;\nmod simple;\n\nuse super::{builder::*, coordinator::*};\n\npub use persistent::*;\npub use simple::*;\n"
  },
  {
    "path": "backend/tauri/src/core/state_v2/mod.rs",
    "chars": 68,
    "preview": "mod builder;\nmod coordinator;\nmod manager;\n\npub use coordinator::*;\n"
  },
  {
    "path": "backend/tauri/src/core/storage.rs",
    "chars": 8579,
    "preview": "use crate::{log_err, utils::dirs};\nuse anyhow::Context;\nuse redb::{ReadableDatabase, ReadableTable, TableDefinition};\nus"
  },
  {
    "path": "backend/tauri/src/core/sysopt.rs",
    "chars": 13734,
    "preview": "use crate::{config::Config, log_err};\nuse anyhow::{Result, anyhow};\nuse auto_launch::{AutoLaunch, AutoLaunchBuilder};\nus"
  },
  {
    "path": "backend/tauri/src/core/tasks/events.rs",
    "chars": 3157,
    "preview": "use anyhow::Context;\nuse chrono::Utc;\nuse parking_lot::Mutex;\nuse serde::{Deserialize, Serialize};\n\nuse super::{\n    sto"
  },
  {
    "path": "backend/tauri/src/core/tasks/executor.rs",
    "chars": 2132,
    "preview": "use std::fmt::{self, Formatter};\n\nuse anyhow::Result;\nuse async_trait::async_trait;\nuse dyn_clone::{DynClone, clone_trai"
  },
  {
    "path": "backend/tauri/src/core/tasks/jobs/events_rotate.rs",
    "chars": 2627,
    "preview": "use crate::core::tasks::{\n    executor::{AsyncJobExecutor, TaskExecutor},\n    storage::TaskStorage,\n    task::TaskSchedu"
  },
  {
    "path": "backend/tauri/src/core/tasks/jobs/logger.rs",
    "chars": 3253,
    "preview": "use super::JobExt;\nuse crate::{\n    config::Config,\n    core::tasks::{\n        executor::{AsyncJobExecutor, TaskExecutor"
  },
  {
    "path": "backend/tauri/src/core/tasks/jobs/mod.rs",
    "chars": 1671,
    "preview": "mod events_rotate;\nmod logger;\nmod profiles;\n\nuse super::{\n    task::{Task, TaskManager},\n    utils::{ConfigChangedNotif"
  },
  {
    "path": "backend/tauri/src/core/tasks/jobs/profiles.rs",
    "chars": 6155,
    "preview": "use super::super::{\n    executor::{AsyncJobExecutor, TaskExecutor},\n    task::{Task, TaskID, TaskManager, TaskSchedule},"
  },
  {
    "path": "backend/tauri/src/core/tasks/mod.rs",
    "chars": 978,
    "preview": "mod events;\npub mod executor;\npub mod jobs;\nmod storage;\npub mod task;\nmod utils;\n\npub fn setup<R: tauri::Runtime, M: ta"
  },
  {
    "path": "backend/tauri/src/core/tasks/storage.rs",
    "chars": 8845,
    "preview": "//! store is a interface to save and restore task states\nuse super::{\n    events::TaskEvent,\n    task::{TaskEventID, Tas"
  },
  {
    "path": "backend/tauri/src/core/tasks/task.rs",
    "chars": 13066,
    "preview": "use super::{\n    events::{TaskEventState, TaskEvents},\n    executor::{Job, TaskExecutor},\n    storage::TaskStorage,\n    "
  },
  {
    "path": "backend/tauri/src/core/tasks/utils.rs",
    "chars": 1572,
    "preview": "use thiserror::Error;\n\n#[derive(Debug)]\npub enum TaskCreationError {\n    #[allow(unused)]\n    AlreadyExist,\n    NotFound"
  },
  {
    "path": "backend/tauri/src/core/tray/icon.rs",
    "chars": 4597,
    "preview": "use crate::utils::dirs::tray_icons_path;\nuse serde::{Deserialize, Serialize};\nuse specta::Type;\nuse std::{\n    borrow::C"
  },
  {
    "path": "backend/tauri/src/core/tray/mod.rs",
    "chars": 16382,
    "preview": "use std::borrow::Cow;\n\nuse crate::{\n    config::{Config, nyanpasu::ClashCore},\n    feat, ipc, log_err,\n    utils::{help,"
  },
  {
    "path": "backend/tauri/src/core/tray/proxies.rs",
    "chars": 19983,
    "preview": "use crate::{\n    config::{Config, nyanpasu::ProxiesSelectorMode},\n    core::{\n        clash::proxies::{Proxies, ProxiesG"
  },
  {
    "path": "backend/tauri/src/core/updater/instance.rs",
    "chars": 13021,
    "preview": "use super::shared::{self, CoreTypeMeta};\nuse crate::{\n    config::nyanpasu::ClashCore,\n    core::CoreManager,\n    utils:"
  },
  {
    "path": "backend/tauri/src/core/updater/mod.rs",
    "chars": 8193,
    "preview": "use std::{\n    collections::HashMap,\n    sync::{Arc, OnceLock},\n};\n\nuse crate::{\n    config::nyanpasu::ClashCore,\n    ut"
  },
  {
    "path": "backend/tauri/src/core/updater/shared.rs",
    "chars": 1853,
    "preview": "pub(super) fn get_arch() -> anyhow::Result<&'static str> {\n    let env = {\n        let arch = std::env::consts::ARCH;\n  "
  },
  {
    "path": "backend/tauri/src/core/win_uwp.rs",
    "chars": 707,
    "preview": "#![cfg(target_os = \"windows\")]\n\nuse crate::utils::dirs;\nuse anyhow::{Result, bail};\nuse deelevate::{PrivilegeLevel, Toke"
  },
  {
    "path": "backend/tauri/src/enhance/advice.rs",
    "chars": 3166,
    "preview": "#[allow(unused_imports)]\nuse crate::enhance::{Logs, LogsExt, script::runner::ProcessOutput};\nuse rust_i18n::t;\nuse serde"
  },
  {
    "path": "backend/tauri/src/enhance/builtin/clash_rs_comp.lua",
    "chars": 736,
    "preview": "-- compatible with ipv6 decrepation \nif config[\"ipv6\"] ~= nil then\n    config[\"ipv6\"] = nil\n    if config[\"dns\"] ~= nil "
  },
  {
    "path": "backend/tauri/src/enhance/builtin/config_fixer.js",
    "chars": 145,
    "preview": "export default function main(params) {\n  if (typeof params['log-level'] === 'boolean') {\n    params['log-level'] = 'debu"
  },
  {
    "path": "backend/tauri/src/enhance/builtin/meta_guard.js",
    "chars": 120,
    "preview": "export default function main(params) {\n  if (params.mode === 'script') {\n    params.mode = 'rule'\n  }\n  return params\n}\n"
  },
  {
    "path": "backend/tauri/src/enhance/builtin/meta_hy_alpn.js",
    "chars": 261,
    "preview": "export default function main(params) {\n  if (Array.isArray(params.proxies)) {\n    params.proxies.forEach((p, i) => {\n   "
  },
  {
    "path": "backend/tauri/src/enhance/chain.rs",
    "chars": 4881,
    "preview": "use crate::{\n    config::{\n        Profile,\n        nyanpasu::ClashCore,\n        profile::{\n            item::prelude::*"
  },
  {
    "path": "backend/tauri/src/enhance/field.rs",
    "chars": 4066,
    "preview": "use serde_yaml::{Mapping, Value};\nuse std::collections::HashSet;\n\npub const HANDLE_FIELDS: [&str; 9] = [\n    \"mode\",\n   "
  },
  {
    "path": "backend/tauri/src/enhance/merge.rs",
    "chars": 31756,
    "preview": "use super::{Logs, LogsExt, runner::ProcessOutput};\nuse mlua::LuaSerdeExt;\nuse serde::de::DeserializeOwned;\nuse serde_yam"
  },
  {
    "path": "backend/tauri/src/enhance/mod.rs",
    "chars": 12998,
    "preview": "mod advice;\nmod chain;\nmod field;\nmod merge;\nmod script;\nmod tun;\nmod utils;\n\npub use self::chain::ScriptType;\nuse self:"
  },
  {
    "path": "backend/tauri/src/enhance/script/js.rs",
    "chars": 24019,
    "preview": "use super::runner::{ProcessOutput, Runner, wrap_result};\nuse crate::enhance::utils::{LogSpan, Logs, LogsExt};\nuse anyhow"
  },
  {
    "path": "backend/tauri/src/enhance/script/lua/mod.rs",
    "chars": 24862,
    "preview": "use std::sync::Arc;\n\nuse anyhow::Error;\nuse mlua::prelude::*;\nuse parking_lot::Mutex;\nuse serde_yaml::{Mapping, Value};\n"
  },
  {
    "path": "backend/tauri/src/enhance/script/mod.rs",
    "chars": 1107,
    "preview": "mod js;\nmod lua;\npub use lua::create_lua_context;\npub mod runner;\npub use runner::RunnerManager;\n// TODO: add test\n// pu"
  },
  {
    "path": "backend/tauri/src/enhance/script/runner.rs",
    "chars": 2566,
    "preview": "use anyhow::Error;\nuse async_trait::async_trait;\nuse serde_yaml::Mapping;\nuse std::collections::HashMap;\n\nuse super::{js"
  },
  {
    "path": "backend/tauri/src/enhance/tun.rs",
    "chars": 3030,
    "preview": "use serde_yaml::{Mapping, Value};\n\nuse crate::config::{\n    Config,\n    nyanpasu::{ClashCore, TunStack},\n};\n\nmacro_rules"
  },
  {
    "path": "backend/tauri/src/enhance/utils.rs",
    "chars": 5322,
    "preview": "use indexmap::IndexMap;\nuse serde::{Deserialize, Serialize};\nuse serde_yaml::Mapping;\n\nuse crate::config::profile::{item"
  },
  {
    "path": "backend/tauri/src/event_handler/mod.rs",
    "chars": 354,
    "preview": "/// This module is a tauri event based handler.\n/// Some state is good to be managed by the Tauri Manager. we should not"
  },
  {
    "path": "backend/tauri/src/event_handler/widget.rs",
    "chars": 1261,
    "preview": "use tauri::{AppHandle, Event, Runtime};\n\npub enum WidgetInstance {\n    Small(nyanpasu_egui::widget::NyanpasuNetworkStati"
  },
  {
    "path": "backend/tauri/src/feat.rs",
    "chars": 18471,
    "preview": "//!\n//! feat mod 里的函数主要用于\n//! - hotkey 快捷键\n//! - timer 定时器\n//! - cmds 页面调用\n//!\nuse std::borrow::Borrow;\n\nuse crate::{\n  "
  },
  {
    "path": "backend/tauri/src/ipc.rs",
    "chars": 34317,
    "preview": "use crate::{\n    config::{profile::ProfileBuilder, *},\n    core::{\n        logger::Logger, storage::Storage, tasks::jobs"
  },
  {
    "path": "backend/tauri/src/lib.rs",
    "chars": 16387,
    "preview": "#![feature(auto_traits, negative_impls, trait_alias, impl_trait_in_assoc_type)]\n#![cfg_attr(\n    all(not(debug_assertion"
  },
  {
    "path": "backend/tauri/src/logging/indexer.rs",
    "chars": 23842,
    "preview": "use std::{\n    collections::{BTreeMap, BTreeSet},\n    io::SeekFrom,\n    ops::Range,\n};\n\nuse anyhow::Context;\nuse bumpalo"
  },
  {
    "path": "backend/tauri/src/logging/manager.rs",
    "chars": 10791,
    "preview": "use std::{collections::HashMap, ops::Deref, sync::Arc};\n\nuse crate::logging::indexer::Indexer;\nuse anyhow::Context;\nuse "
  },
  {
    "path": "backend/tauri/src/logging/mod.rs",
    "chars": 971,
    "preview": "mod indexer;\nmod manager;\n\nconst LOGGING_NS: &str = \"logging\";\nconst LOGGING_DB_PREFIX: &str = \"logging\";\n\nuse anyhow::C"
  },
  {
    "path": "backend/tauri/src/main.rs",
    "chars": 122,
    "preview": "#![cfg_attr(not(debug_assertions), windows_subsystem = \"windows\")]\n\nfn main() {\n    clash_nyanpasu_lib::run().unwrap();\n"
  },
  {
    "path": "backend/tauri/src/server/mod.rs",
    "chars": 5565,
    "preview": "use anyhow::{Context, Result, anyhow};\nuse axum::{\n    Router,\n    body::Body,\n    extract::Query,\n    http::{HeaderValu"
  },
  {
    "path": "backend/tauri/src/setup.rs",
    "chars": 599,
    "preview": "//! Setup logic for the app\nuse anyhow::Context;\n\npub fn setup<R: tauri::Runtime, M: tauri::Manager<R>>(app: &M) -> Resu"
  },
  {
    "path": "backend/tauri/src/shutdown_hook.rs",
    "chars": 6327,
    "preview": "//! a shutdown handler for Windows\n\nuse atomic_enum::atomic_enum;\nuse once_cell::sync::OnceCell;\nuse windows_core::{Erro"
  },
  {
    "path": "backend/tauri/src/utils/candy.rs",
    "chars": 5197,
    "preview": "use super::{config::NyanpasuReqwestProxyExt, dirs::app_logs_dir};\nuse anyhow::Result;\nuse chrono::Local;\nuse glob::glob;"
  },
  {
    "path": "backend/tauri/src/utils/collect.rs",
    "chars": 3230,
    "preview": "use std::{borrow::Cow, collections::HashMap};\n\n#[cfg(windows)]\nuse std::os::windows::process::CommandExt;\n\nuse crate::co"
  },
  {
    "path": "backend/tauri/src/utils/config.rs",
    "chars": 1779,
    "preview": "use anyhow::Result;\nuse sysproxy::Sysproxy;\n\nuse crate::config::Config;\n\npub fn get_self_proxy() -> Result<String> {\n   "
  },
  {
    "path": "backend/tauri/src/utils/dialog.rs",
    "chars": 1590,
    "preview": "#![allow(dead_code)]\n\nuse rfd::{MessageButtons, MessageDialog, MessageDialogResult, MessageLevel};\nuse rust_i18n::t;\n\npu"
  },
  {
    "path": "backend/tauri/src/utils/dirs.rs",
    "chars": 11152,
    "preview": "use crate::{core::handle, log_err};\nuse anyhow::Result;\nuse fs_err as fs;\nuse nyanpasu_utils::dirs::{suggest_config_dir,"
  },
  {
    "path": "backend/tauri/src/utils/dock.rs",
    "chars": 708,
    "preview": "#[cfg(target_os = \"macos\")]\npub mod macos {\n    use objc2_app_kit::{NSApplication, NSApplicationActivationPolicy};\n    u"
  },
  {
    "path": "backend/tauri/src/utils/downloader.rs",
    "chars": 22157,
    "preview": "/// Downloader is a utility to download file with parallel requests and progress bar.\n/// TODO: use &str instead of Stri"
  },
  {
    "path": "backend/tauri/src/utils/help.rs",
    "chars": 10934,
    "preview": "use crate::config::nyanpasu::ExternalControllerPortStrategy;\nuse anyhow::{Context, Result, anyhow, bail};\nuse display_in"
  },
  {
    "path": "backend/tauri/src/utils/init/logging.rs",
    "chars": 5211,
    "preview": "use crate::{Config, config, utils::dirs};\nuse anyhow::{Result, anyhow, bail};\nuse parking_lot::Mutex;\nuse std::{\n    fs,"
  },
  {
    "path": "backend/tauri/src/utils/init/mod.rs",
    "chars": 10433,
    "preview": "use crate::{\n    config::*,\n    utils::{dirs, help},\n};\nuse anyhow::{Context, Result, anyhow};\nuse fs_extra::dir::CopyOp"
  },
  {
    "path": "backend/tauri/src/utils/mod.rs",
    "chars": 296,
    "preview": "pub mod candy;\npub mod config;\npub mod dialog;\npub mod dirs;\npub mod help;\npub mod init;\npub mod resolve;\n// mod winhelp"
  },
  {
    "path": "backend/tauri/src/utils/net.rs",
    "chars": 1015,
    "preview": "use std::time::Duration;\n\nuse super::candy::get_reqwest_client;\n\n#[tracing_attributes::instrument]\npub async fn url_dela"
  },
  {
    "path": "backend/tauri/src/utils/open.rs",
    "chars": 730,
    "preview": "use std::ffi::OsStr;\n\npub fn that<T: AsRef<OsStr>>(path: T) -> std::io::Result<()> {\n    // A dirty workaround for AppIm"
  },
  {
    "path": "backend/tauri/src/utils/resolve.rs",
    "chars": 14496,
    "preview": "use crate::{\n    config::{\n        Config, IVerge,\n        nyanpasu::{ClashCore, WindowState},\n    },\n    core::{storage"
  },
  {
    "path": "backend/tauri/src/utils/sudo.rs",
    "chars": 2538,
    "preview": "#[cfg(target_os = \"macos\")]\nmod macos {\n    use std::{os::unix::process::ExitStatusExt, path::PathBuf};\n\n    /// use run"
  },
  {
    "path": "backend/tauri/src/utils/winhelp.rs",
    "chars": 1925,
    "preview": "#![cfg(target_os = \"windows\")]\n#![allow(non_snake_case)]\n#![allow(non_camel_case_types)]\n\n//!\n//! From https://github.co"
  },
  {
    "path": "backend/tauri/src/utils/winreg.rs",
    "chars": 3077,
    "preview": "use std::{\n    io::ErrorKind,\n    path::{Path, PathBuf},\n};\n\nuse super::dirs::APP_DIR_PLACEHOLDER;\nuse anyhow::Result;\nu"
  },
  {
    "path": "backend/tauri/src/utils/winreg_test.rs",
    "chars": 994,
    "preview": "#[cfg(test)]\nmod tests {\n    use crate::utils::{dirs::get_single_instance_placeholder, winreg::get_current_user_sid};\n\n "
  },
  {
    "path": "backend/tauri/src/widget.rs",
    "chars": 8495,
    "preview": "use crate::config::{Config, nyanpasu::NetworkStatisticWidgetConfig};\n\nuse super::core::clash::ws::ClashConnectionsConnec"
  },
  {
    "path": "backend/tauri/src/window.rs",
    "chars": 40052,
    "preview": "//! Tauri window management mod\n//!\n//! This module provides a flexible window management system that supports:\n//! - UR"
  },
  {
    "path": "backend/tauri/tauri.conf.json",
    "chars": 3054,
    "preview": "{\n  \"$schema\": \"../../node_modules/@tauri-apps/cli/config.schema.json\",\n  \"mainBinaryName\": \"Clash Nyanpasu\",\n  \"bundle\""
  },
  {
    "path": "backend/tauri/tauri.windows.conf.json",
    "chars": 116,
    "preview": "{\n  \"$schema\": \"../../node_modules/@tauri-apps/cli/config.schema.json\",\n  \"bundle\": {\n    \"targets\": [\"nsis\"]\n  }\n}\n"
  },
  {
    "path": "backend/tauri/templates/cleanup.wxs",
    "chars": 1234,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Wix xmlns=\"http://schemas.microsoft.com/wix/2006/wi\"\n  xmlns:util=\"http://schema"
  },
  {
    "path": "backend/tauri/templates/installer.nsi",
    "chars": 29755,
    "preview": "; This file is copied from https://github.com/tauri-apps/tauri/blob/tauri-v1.5/tooling/bundler/src/bundle/windows/templa"
  },
  {
    "path": "backend/tauri/templates/installer.wxs",
    "chars": 14079,
    "preview": "<?if $(sys.BUILDARCH)=\"x86\"?>\n    <?define Win64 = \"no\" ?>\n    <?define PlatformProgramFilesFolder = \"ProgramFilesFolder"
  }
]

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

About this extraction

This page contains the full source code of the libnyanpasu/clash-nyanpasu GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 743 files (2.5 MB), approximately 697.6k tokens, and a symbol index with 2436 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!