feat(sub): add opt-in month-end expiry presentation (#6517)

Offer monthly calendar subscriptions an explicit last-valid-second display
without moving their real billing boundary or spending renewal allowances.

Keep the option off by default and limit conversion to a shared fixed
day-1 midnight cutoff at an actual month transition in the panel timezone.
Use the authoritative client calendar mode when aggregating node traffic,
and share the header formatter across raw, JSON, and Clash exports.

Expose the setting in the existing settings API/UI, regenerate its schemas,
and document that clients may report expiry one second early or format the
date differently in another timezone. Add HTTP, settings, and DST coverage.
Stored deadlines, access enforcement, info/remark expiry values, and renewal
accounting remain unchanged.

Refs: #6516

Co-authored-by: JacktheRanger <219502738+JacktheRanger@users.noreply.github.com>
This commit is contained in:
Jack
2026-09-14 18:10:25 +08:00
committed by GitHub
parent 826e29e2de
commit c90996eda3
32 changed files with 412 additions and 8 deletions
+8
View File
@@ -221,6 +221,9 @@
"subAnnounce": {
"type": "string"
},
"subCalendarExpireInclusive": {
"type": "boolean"
},
"subCertFile": {
"type": "string"
},
@@ -558,6 +561,7 @@
"smtpTo",
"smtpUsername",
"subAnnounce",
"subCalendarExpireInclusive",
"subCertFile",
"subClashAutoDetect",
"subClashEnable",
@@ -868,6 +872,9 @@
"subAnnounce": {
"type": "string"
},
"subCalendarExpireInclusive": {
"type": "boolean"
},
"subCertFile": {
"type": "string"
},
@@ -1213,6 +1220,7 @@
"smtpTo",
"smtpUsername",
"subAnnounce",
"subCalendarExpireInclusive",
"subCertFile",
"subClashAutoDetect",
"subClashEnable",