+ {notice && (
+
+ {notice}
+
+ )}
+
+ {/* ═══ 真形锚点 ═══ */}
+
+
+
+ 稳定辨识特征与许可禁忌;生成内容不得静默覆盖锚点约束。
+
+
+
+ {/* ═══ 主仪与化仪 ═══ */}
+
+
+
+ 生成内容先为候选,定相后才成为正式形仪;同一时刻仅一主仪。
+
+
+
+ setDesc(e.target.value)}
+ />
+
+
+ {forms.length === 0 ? (
+
+ 尚无形仪候选。
+
+ ) : (
+
+ )}
+
+
+ {/* ═══ 声音档案 ═══ */}
+
+
+
+ 三来源:合成预设 / 原创设计 /
+ 授权克隆;克隆授权按用途与传播范围治理,可撤回。
+
+
+
+
+ setVoiceName(e.target.value)}
+ />
+
+ {voiceSource === "authorized_clone" && (
+
setGrantPurpose(e.target.value)}
+ />
+ )}
+
+
+
+
+ {voices.length === 0 ? (
+
+ 尚无声音档案。
+
+ ) : (
+
+ {voices.map((v) => (
+ -
+
+
+ {v.name}
+
+ {VOICE_SOURCE_LABEL[v.source] ?? v.source}
+
+ {v.grant_revoked_at && (
+
+ 授权已撤回
+
+ )}
+
+ {v.source === "authorized_clone" && v.grant_purpose && (
+
+ 用途:{v.grant_purpose} · 传播:{v.grant_distribution}
+
+ )}
+
+ {v.source === "authorized_clone" && v.is_active && (
+
+ )}
+
+ ))}
+
+ )}
+
+
+ );
+}
diff --git a/frontend/src/lib/api/index.ts b/frontend/src/lib/api/index.ts
index 1ad1ae0..984d2be 100644
--- a/frontend/src/lib/api/index.ts
+++ b/frontend/src/lib/api/index.ts
@@ -18,6 +18,7 @@ export * as meApi from "./me";
export * as baigongApi from "./baigong";
export * as covenantApi from "./covenants";
export * as worldApi from "./worlds";
+export * as xingyiApi from "./xingyi";
export * as importsApi from "./imports";
export * as extractionApi from "./extraction";
export * as memoriesApi from "./memories";
diff --git a/frontend/src/lib/api/xingyi.ts b/frontend/src/lib/api/xingyi.ts
new file mode 100644
index 0000000..a5af5bf
--- /dev/null
+++ b/frontend/src/lib/api/xingyi.ts
@@ -0,0 +1,125 @@
+/**
+ * 形仪 API Client:真形锚点 / 形仪候选定相 / 声音档案与克隆授权。
+ *
+ * 生成内容先为 candidate,定相(adopt)才成为正式形仪;
+ * 克隆授权可撤回,撤回立即生效。
+ */
+
+import { apiGet, apiPatch, apiPost } from "./client";
+
+/** 真形锚点 */
+export interface FormAnchorData {
+ character_id: string;
+ features: Record