eadd5255b00a8faca3da6e653cbd7e4da1e2ec7e
757
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
eadd5255b0 |
docs(readme): point contributors to GitHub Contributors graph
Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. docs(readme): point contributors to GitHub Contributors graph Replace hard-coded names with link to https://github.com/kazeyukiro/3m-ui/graphs/contributors across all README locales. |
||
|
|
bcdec99d82 |
fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits
- Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) fix(scripts/3m-ui): menu set -e survival, service_is_active, safer config edits - Menu actions no longer abort the whole console on failure (set -e) - Use local status/start/stop/logs/version instead of 3m-ui.sh detour - service_is_active for post-restart checks; help without root - Safer port/public_url YAML edits (missing field, BusyBox insert, sed escape) |
||
|
|
8cf969abd8 | fix(ui): drop Settings minHeight:480 on mobile to avoid empty gap | ||
|
|
8cc49fe7a5 |
fix(ui): remove mobile full-height white panel gap under page titles
Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. fix(ui): remove mobile full-height white panel gap under page titles Content area is transparent on mobile; cards sit directly under the title instead of floating inside a stretched empty white card. Force ant-layout content flex:none overrides. |
||
|
|
6739850e97 |
fix(ui): stop mobile content card from stretching full viewport height
Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). fix(ui): stop mobile content card from stretching full viewport height Ant Layout flex was expanding .app-page-content into a tall empty white block under short pages. Content is now height:auto / flex:0 on mobile; body safe-area padding removed (handled by header + bottom nav). |
||
|
|
efa39ee5ed | fix(ui): define isMobile in SharePage for compact layout props | ||
|
|
f1f35da11a |
fix(ui): close Settings TOTP div; compact mobile layout on all pages
- Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. fix(ui): close Settings TOTP div; compact mobile layout on all pages - Repair unclosed JSX in Settings security/TOTP block (CI frontend build) - Denser mobile CSS: cards, tables, stats, forms, entity lists, bottom nav - Small card/table density on Dashboard/Traffic/Cluster/Config/etc. |
||
|
|
e03861e4f7 |
i18n: sync nav.more + TOTP UI strings across 18 locales
All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. i18n: sync nav.more + TOTP UI strings across 18 locales All panel languages now include bottom-nav "More" and two-factor setup/login copy. |
||
|
|
4aefb11b26 |
ui(mobile): replace side drawer with bottom tab bar
Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. ui(mobile): replace side drawer with bottom tab bar Primary: Dashboard / Listeners / Users / Traffic; More sheet for the rest + logout. Header shows logo on mobile; content padded for safe-area bottom nav. |
||
|
|
7a43346588 | fix(ui): repair Listeners versions table render corrupted by size prop injection | ||
|
|
e332cfdac3 |
ui: improve desktop/mobile usability and long i18n label layout
- Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish ui: improve desktop/mobile usability and long i18n label layout - Global CSS: wrap long translations, safer forms/modals/tables on mobile - PageHeader stacks actions on narrow screens - Users mobile cards show traffic, expiry, remark/tags without losing info - Layout content width + drawer width polish |
||
|
|
4d6cb94145 |
fix(ui): load TOTP enabled state from /auth/me on settings mount
Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. fix(ui): load TOTP enabled state from /auth/me on settings mount Refresh was resetting local totpEnabled to false because Settings never read totp_enabled from the server after reload. |
||
|
|
12727fb18a |
ui(totp): polish login step and settings setup modal
- Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW ui(totp): polish login step and settings setup modal - Login: two-step flow with Steps, Alert, OTP-styled input, back action - Settings: QR setup modal, clearer enable/disable forms, loading states - i18n: TOTP strings for en / zh-CN / zh-TW |
||
|
|
c82bc0eb20 |
docs: align README feature matrix with v1.1.0
TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. docs: align README feature matrix with v1.1.0 TOTP, web_path, HWID/first-use, WARP, online connections. |
||
|
|
7cc5dbd56b |
fix(auth): remove duplicate fetchMe and widen /auth/me type
Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. fix(auth): remove duplicate fetchMe and widen /auth/me type Duplicate export broke tsc -b during frontend embed. Merge into one fetchMe that includes must_change_password for useAuth. |
||
|
|
9299dbfd0d |
i18n: further expand panel translations for 15 locales
- settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design i18n: further expand panel translations for 15 locales - settings: access profile, SSL, restore, notify, Telegram, subscription page, traffic reset - core: status controls and update flow labels - config / routing / logs / traffic / share / realityScan / password - users batch actions and bind flows - cluster remote operation labels - protocol field labels remain English by design |
||
|
|
182b06283f |
i18n: expand panel UI translations across 18 locales
- zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys i18n: expand panel UI translations across 18 locales - zh-TW: full Traditional Chinese for panel copy - ja/ko/de/fr/es/ru/pt-BR/vi/id/tr/pl/uk/ar/hi/th: core UI (nav, login, users, dashboard, settings headers, TOTP, HWID, first-use, external links, web_path, WARP, Telegram, backup) - protocol field labels remain English (industry convention) - all locale files validated at 755 keys |
||
|
|
027d69e0c1 |
i18n: add keys for TOTP, HWID devices, first-use, external links, web_path
All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. i18n: add keys for TOTP, HWID devices, first-use, external links, web_path All 18 locales: login.totp*, users.devices/first-use/externalLinks, settings.totp* and webPathHint. UI falls back to en then literal. |
||
|
|
a735bd9003 | fix(sub): stamp first-use on successful subscription fetch | ||
|
|
4778c43c79 |
feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path
- Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections feat: online ops parity — HWID devices UI, first-use expiry, external subs, TOTP, web_path - Users: start_on_first_use + expire_days_after_first; TouchFirstUse on sub/traffic - External subscription URLs merged into Clash/Mihomo client YAML - HWID device list/kick/clear wired in Users (API already present) - Admin TOTP 2FA (setup/enable/disable + login second step) - Optional server.web_path panel prefix (config.yaml) - subscription-userinfo already present; Traffic page shows live connections |
||
|
|
e48fb1008d |
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
docs(ai-prompt): centralize install prompt and add curl-to-clipboard
Move the AI assistant install prompt into a single source of truth
(docs/ai-install-prompt.{md,zh.txt,en.txt}) so it no longer diverges
across README.md, README.en.md, README.zh-CN.md and docs/installation.md.
Add a one-liner that fetches the plain-text prompt straight to the
clipboard (pbcopy / xclip / wl-copy / Set-Clipboard), removing manual
copy-paste of a large block from rendered READMEs. The prompt content
itself is unchanged in spirit and still only runs the official
install.sh, with downloads verifying SHA256SUMS.
Prompt refinements (faithful to official script behavior):
- note CPU arch (amd64/arm64) and init system (systemd/OpenRC) checks
- mention sudo 3m-ui reset-admin for a lost one-time password
- explicitly forbid swapping third-party mirrors
|
||
|
|
715cec2ecd |
docs: add AI assistant install prompt (official script only)
Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. docs: add AI assistant install prompt (official script only) Copy-paste prompts for ChatGPT/Claude/Cursor in README (zh/en), zh-CN README, and installation.md. Instruct assistants to use only the official curl | sudo sh installer and not invent third-party sources. |
||
|
|
5fe88d18cf |
feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML
Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients feat(sub): basic CN/private DIRECT split for Clash/Mihomo client YAML Client subscriptions (token + user multi-node) now include: - PROXY select (AUTO + nodes + DIRECT) - AUTO url-test - rules: GEOSITE/GEOIP private+cn → DIRECT, MATCH → PROXY - mixed-port / rule mode defaults for import-friendly clients |
||
|
|
9bfb7c2e15 |
fix(listener): roll back mutations when core activation fails (#58)
Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. fix(listener): roll back mutations when core activation fails (#58) Resolve conflicts with main: drop ApplyConfigDeferredRestart so listener CRUD waits for ApplyConfig and can restore DB/config on restart failure. |
||
|
|
7d140717ea | fix(api): apply mutation request timeout defaults (#60) | ||
|
|
1cc7989853 | fix(ui): preserve listener name conflict errors and form input (#59) | ||
|
|
be3a50acb7 | fix(listener): serialize configuration generation and application (#57) | ||
|
|
b2c2b02bf7 |
test(mihomo): await asynchronous credential reconciliation (#56)
test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) test(mihomo): await asynchronous credential reconciliation (#56) |
||
|
|
25b6a5b827 |
style(go): format backend sources (#55)
style(go): format backend sources (#55) style(go): format backend sources (#55) style(go): format backend sources (#55) style(go): format backend sources (#55) style(go): format backend sources (#55) style(go): format backend sources (#55) style(go): format backend sources (#55) style(go): format backend sources (#55) style(go): format backend sources (#55) style(go): format backend sources (#55) style(go): format backend sources (#55) |
||
|
|
e273e27cf7 | fix(listener): roll back mutations when core activation fails | ||
|
|
038803b0da |
fix(ui): prevent double-submit on listener/user create (already exists after success)
React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. fix(ui): prevent double-submit on listener/user create (already exists after success) React state submitting flag was not synchronous, so two OK clicks could both POST create — first succeeded, second returned name already exists and left the modal open. Use a ref lock; on UNIQUE conflict after create, if the name already appears in the list treat as success and close. |
||
|
|
72a81853b7 |
fix: version menu shows release files; reclaim soft-deleted listener names
- 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts fix: version menu shows release files; reclaim soft-deleted listener names - 3m-ui version: fall back to VERSION/CHANNEL/MIHOMO when --version is empty - ensureUniqueName: hard-delete soft-deleted rows still holding UNIQUE(name) - Frontend suggests next 节点N after already-exists conflicts |
||
|
|
d404de8cb9 |
fix(mihomo): start core synchronously on first apply; poll in smoke
ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running fix(mihomo): start core synchronously on first apply; poll in smoke ApplyConfigDeferredRestart returned before Start() when core was down, so smoke (and UI) saw running=false right after creating the first listener. - First start: still synchronous (fail the API if core cannot start) - Already running: keep async restart for responsive create/update - smoke-runtime: brief poll for mihomo/status.running |
||
|
|
05de897a12 | fix(subpage): close unterminated defaultHTML raw string (CI build) | ||
|
|
4f59ab4e7a |
fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart
Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path fix(ui): create user/node returns after validate; loading feedback; deferred Mihomo restart Symptom: confirm button seemed dead, refresh showed the create had succeeded — HTTP waited on full core restart and often timed out after DB write. - ApplyConfigDeferredRestart: save+validate sync, restart async - Listener path uses deferred apply so create/delete respond quickly - Users modal: confirmLoading + disable while submitting - Listeners: always toast errors; refresh list without blocking success path |
||
|
|
cc5b206f5e |
fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts
Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies fix(api): stop blocking user mutations on Mihomo reload; raise mutation timeouts Root cause: create/delete users (and node ops) waited on ApplyConfig (mihomo -t + restart), often exceeding the 30s axios timeout and surfacing as "Cannot reach the panel API" even when the DB write succeeded. - Debounced async credentials→config reload after user changes - Axios: 45s default, 120s for non-GET mutations - Clearer network error hint; listener RegenerateConfig generates under lock then applies |
||
|
|
bf895d036c |
fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles
- MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour fix(user): expire renew only after expiry; preserve traffic on cycle enable; edit form fills group/tags/cycles - MaybeApplyUserCycles no longer extends every tick inside a 24h pre-expiry window - First enable of traffic_reset_days records anchor without wiping counters - Users openEdit (and related setFieldsValue paths) populate group/tags/cycle fields so save does not clear them - Add unit tests for cycle behaviour |
||
|
|
d150574ad3 |
feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash
- Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags feat(subpage): modern subscription HTML — copy-by-format, zh/en, drop legacy Clash - Restyle built-in page (card layout, traffic bar, QR, URI list with protocol tags) - Format buttons copy Mihomo/Sing-box/V2Ray URLs (no separate copy-all, no Clash legacy) - Client-side zh/en toggle with localStorage + navigator language - ViewModel: TrafficPct, URIItems; protocolLabel helper for tags |
||
|
|
867619d5d6 |
i18n: WARP, share export, user group/tags/cycle strings for all locales
Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. i18n: WARP, share export, user group/tags/cycle strings for all locales Frontend already had UI; locale keys were missing so labels fell back to English. Add settings.warp*, share.export*, users.group/tags/cycle keys in 18 languages. |
||
|
|
9471368afd |
perf: compress and cache embedded frontend assets (#54)
perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) perf: compress and cache embedded frontend assets (#54) |
||
|
|
670b2210d1 |
i18n: localize core.updates (Mihomo persistent update UI) for all panel languages
Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. i18n: localize core.updates (Mihomo persistent update UI) for all panel languages Fill core.updates strings for ar/de/es/fr/hi/id/ja/ko/pl/pt-BR/ru/th/tr/uk/vi. en, zh-CN, zh-TW already complete from #53; zh re-exports zh-CN. |
||
|
|
3ec69d55de | feat(mihomo): persistent core updates with rollback (#53) | ||
|
|
437ad5eee8 |
docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens
- Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status docs(api): OpenAPI 1.2 — export-links, user group/tags/cycles, WARP register, sub path notes, tokens - Document health build fields, ProxyUser schemas, batch/HWID/Telegram user routes - Subscription short path / sub_port behaviour - system/templates/warp(+register), access-tokens, panel-settings, SSL status |
||
|
|
3a5b0d7e66 |
feat: sub path/port, user groups/tags/cycle renew, export links, WARP register
- server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles feat: sub path/port, user groups/tags/cycle renew, export links, WARP register - server.sub_path / sub_port / env overrides; custom /sub/:token + optional second listener - subscription URLs use configured path; legacy API path kept - proxy users: group, tags, traffic_reset_days, expire_renew_days + background cycle job - GET /users/export-links for one-click subscription link export - POST /system/templates/warp/register (Cloudflare WARP one-click) + Settings UI - Share page export-all; Users form fields for group/tags/cycles |
||
|
|
ac35a043e5 | docs: remove invalid update --stable; refresh version examples in READMEs | ||
|
|
d60605e9c3 | fix(ui): define AboutPanelVersion used by settings about section | ||
|
|
71119d59d6 |
feat(ui): 18 panel languages, login theme/lang, live about version
- Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo feat(ui): 18 panel languages, login theme/lang, live about version - Settings appearance language select uses full LOCALE_OPTIONS (18 locales) - Login page: theme + language switches (persisted via existing stores) - About shows version from /api/v1/health (buildinfo linked at release time) - ldflags write Version/GitCommit/BuildTime into internal/buildinfo |
||
|
|
1c37a28804 |
feat(telegram): localize scheduled notifications and event alerts in 18 languages
- Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) feat(telegram): localize scheduled notifications and event alerts in 18 languages - Traffic/expiry/block/restore/CPU/memory warnings, daily digest, login and crash - Periodic report and generic NotifyEvent time line follow settings.language - New n_* message keys in i18n catalog (en/zh-CN/zh-TW + EN fallback for others) |
||
|
|
676312ae79 |
feat(telegram): 18-language bot replies, menus, and command descriptions
- Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load feat(telegram): 18-language bot replies, menus, and command descriptions - Add telegram/i18n.go with en/zh-CN/zh-TW full strings and overlays for ja, ko, es, fr, de, ru, pt-BR, vi, id, th, tr, ar, hi, pl, uk - Wire bot commands, inline keyboards, setMyCommands, and test message to settings.language - Expand Settings UI bot language select to all 18 panel locales - Normalize legacy zh → zh-CN on load |
||
|
|
a1cbef1d74 |
fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete
- Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors fix: UNIQUE/soft-delete hygiene across tokens, HWID, config, templates, node delete - Hard-delete access tokens and HWID devices so unique indexes free immediately - Revive soft-deleted HWID rows and visual-config fragments on re-register/upsert - Align node.Service.Delete with pre-delete name free; Unscoped clone rollbacks - Clearer template name collision errors |