Replace the custom encrypted container with AgeSwift 0.1.0 so standard
age tools can inspect sensitive configuration independently of the app.
Use independent Keychain X25519 identities for catalog.age and
proxy-listening.age. Preserve atomic commits and confirmed recovery;
reject historical NG2 formats without migration or cleanup.
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.
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.