Add Mainland China proxy routing with independent rule workspaces.
Preserve existing routing choices through equivalent preset mappings.
BREAKING CHANGE: existing custom rules and enablement settings are
not migrated. Recreate them in the appropriate preset.
Ancestor groups of the active target now show a hollow bolt beside the
existing filled bolt on the target itself, in the servers tree, the
favorites table and the home target browser; the node detail subtitle
shows "含活动目标". The derivation lives in
CatalogTreeSnapshot.ancestors(of:) so every surface shares one rule
while activeTargetID stays a runtime fact outside the catalog
projection. Groups activated directly keep the filled bolt and leave
their member rows unmarked.
Make systemProxyConfiguration total so a runtime document can no longer
swallow derivation via try? and silently skip desired system proxy
convergence. Delete the unreachable ProxyModeError / .mode failure fact
and its presentation; port validity stays at the settings store and the
document contract.
Render saved node details through a shared property view with injected link actions. Keep metadata, activation feedback, and plugin parameter loading outside the renderer; retain specific plugin failures and scope command feedback to its target.
Preserve ordered and repeated plugin parameters, distinguish flags and empty values, and retain opaque raw text. Add bilingual detail copy and conversion coverage.
Validation: 981 hostless tests and 21 offline rule checks passed; Debug build passed. Native renderer checked at 720 and 360 point widths using synthetic data. Existing 22 lint warnings remain.
The pre-filled current name in the rename alert only showed on the
first presentation: SwiftUI on macOS recycles the alert panel and its
TextField does not pick up binding changes made in the same update as
re-presenting. Swap the alert for a RenameGroupSheet modeled on
NewGroupSheet, presented via sheet(item:) so content state is rebuilt
each time and the prefill always matches the target group.
As with the creation form, a failed rename now keeps the sheet open
with the entered name instead of closing the alert first and losing
the input. The NodeContext adapter previously used by the move sheet
is shared by both presentations.
Add the manual catalog keys 重命名分组 (Rename Group) and 名称 (Name);
保存/取消 already existed.
Replace the inline RulesDeletionButton with a toolbar delete button
(trash icon next to the add button). It is enabled only when the
custom-rules source is selected on the left and the selection contains
deletable custom rules; the collection must also be complete and not
committing.
The table context menu gains a destructive "删除 (N)" item after a
divider when the custom-rules source is selected, with the same
enablement conditions. Both entries share one confirmation alert now
held by RulesView.
Also inline the operation status view into the filter row and tighten
filter-area padding.