diff --git a/deplink.html b/deplink.html
index a02d8d66c..2c4dd788a 100644
--- a/deplink.html
+++ b/deplink.html
@@ -1072,7 +1072,7 @@
diff --git a/docs/user-manual/en/5-faq/5.3-deeplink.md b/docs/user-manual/en/5-faq/5.3-deeplink.md
index 20aaf88c5..4fece72fe 100644
--- a/docs/user-manual/en/5-faq/5.3-deeplink.md
+++ b/docs/user-manual/en/5-faq/5.3-deeplink.md
@@ -60,7 +60,7 @@ ccswitch://v1/import?resource={type}&app={app}&name={name}&...
| `configUrl` | No | Remote configuration URL |
| `enabled` | No | Whether to enable (boolean) |
| `usageScript` | No | Usage query script |
-| `usageEnabled` | No | Whether to enable usage query (**default false**). The script body is shown in full in the import confirmation dialog; without an explicit `true` the script is imported but left disabled, and can be enabled in the app |
+| `usageEnabled` | No | Whether to enable usage query. When omitted, it is enabled if `usageScript` is present and disabled otherwise; pass `false` to import the script without enabling it (it can be enabled later in the app). The script body is shown in full in the import confirmation dialog |
| `usageApiKey` | No | Usage query API Key |
| `usageBaseUrl` | No | Usage query base URL |
| `usageAccessToken` | No | Usage query access token |
diff --git a/docs/user-manual/ja/5-faq/5.3-deeplink.md b/docs/user-manual/ja/5-faq/5.3-deeplink.md
index 1fa8bd188..37204199d 100644
--- a/docs/user-manual/ja/5-faq/5.3-deeplink.md
+++ b/docs/user-manual/ja/5-faq/5.3-deeplink.md
@@ -60,7 +60,7 @@ ccswitch://v1/import?resource={type}&app={app}&name={name}&...
| `configUrl` | いいえ | リモート設定 URL |
| `enabled` | いいえ | 有効にするかどうか(ブール値) |
| `usageScript` | いいえ | 使用量クエリスクリプト |
-| `usageEnabled` | いいえ | 使用量クエリを有効にするか(**デフォルト false**)。スクリプト本文はインポート確認ダイアログに全文表示されます。明示的に `true` を指定しない場合はインポートされるだけで有効化されず、アプリ内で手動で有効にできます |
+| `usageEnabled` | いいえ | 使用量クエリを有効にするか。省略時は `usageScript` があれば有効、なければ無効です。`false` を指定するとインポートのみ行い有効化しません(アプリ内で後から有効にできます)。スクリプト本文はインポート確認ダイアログに全文表示されます |
| `usageApiKey` | いいえ | 使用量クエリ専用 API Key |
| `usageBaseUrl` | いいえ | 使用量クエリ専用アドレス |
| `usageAccessToken` | いいえ | 使用量クエリアクセストークン |
diff --git a/docs/user-manual/zh/5-faq/5.3-deeplink.md b/docs/user-manual/zh/5-faq/5.3-deeplink.md
index 2f009ffa0..57e529fbf 100644
--- a/docs/user-manual/zh/5-faq/5.3-deeplink.md
+++ b/docs/user-manual/zh/5-faq/5.3-deeplink.md
@@ -60,7 +60,7 @@ ccswitch://v1/import?resource={type}&app={app}&name={name}&...
| `configUrl` | 否 | 远程配置 URL |
| `enabled` | 否 | 是否启用(布尔值) |
| `usageScript` | 否 | 用量查询脚本 |
-| `usageEnabled` | 否 | 是否启用用量查询(**默认 false**)。脚本正文会完整展示在导入确认框中;未显式传 `true` 时仅导入不启用,可在应用内手动开启 |
+| `usageEnabled` | 否 | 是否启用用量查询。未传时:带了 `usageScript` 就启用,否则不启用;传 `false` 则只导入不启用,可在应用内手动开启。脚本正文会完整展示在导入确认框中 |
| `usageApiKey` | 否 | 用量查询专用 API Key |
| `usageBaseUrl` | 否 | 用量查询专用地址 |
| `usageAccessToken` | 否 | 用量查询访问令牌 |
diff --git a/src-tauri/src/deeplink/mod.rs b/src-tauri/src/deeplink/mod.rs
index 495a33552..413615780 100644
--- a/src-tauri/src/deeplink/mod.rs
+++ b/src-tauri/src/deeplink/mod.rs
@@ -166,8 +166,8 @@ pub struct DeepLinkImportRequest {
pub config_url: Option,
// ============ Usage script fields (v3.9+) ============
- /// Whether to enable usage query. Defaults to **disabled** — carrying a script
- /// is not itself a decision to run it; the link must say `usageEnabled=true`.
+ /// Whether to enable usage query. When omitted, defaults to enabled if the link
+ /// carries a usage script, disabled otherwise; `usageEnabled=false` opts out.
#[serde(skip_serializing_if = "Option::is_none")]
pub usage_enabled: Option,
/// Base64 encoded usage query script code
diff --git a/src-tauri/src/deeplink/provider.rs b/src-tauri/src/deeplink/provider.rs
index 0ffa6c8af..10cc69b36 100644
--- a/src-tauri/src/deeplink/provider.rs
+++ b/src-tauri/src/deeplink/provider.rs
@@ -264,18 +264,17 @@ fn build_provider_meta(request: &DeepLinkImportRequest) -> Result
{/*
- 判据是 `=== true`,与后端 `usage_enabled.unwrap_or(false)`
- 严格对齐。此前用的 `!== false` 会把"链接没说"渲染成绿色的
- 「已启用」——徽章必须显示实际会发生的事,不能比后端更乐观。
+ 与后端 `usage_enabled.unwrap_or(!code.is_empty())` 严格对齐:
+ 链接写了就照办,没写时带脚本即启用。徽章必须显示实际会发生
+ 的事,不能比后端更乐观,也不能更保守。
*/}
- {request.usageEnabled === true
+ {usageWillBeEnabled
? t("deeplink.usageScriptEnabled", {
defaultValue: "已启用",
})
diff --git a/tests/components/DeepLinkImportDialog.test.tsx b/tests/components/DeepLinkImportDialog.test.tsx
index 627a8963f..fe8157b90 100644
--- a/tests/components/DeepLinkImportDialog.test.tsx
+++ b/tests/components/DeepLinkImportDialog.test.tsx
@@ -110,6 +110,37 @@ describe("DeepLinkImportDialog", () => {
expect(screen.queryByText("脚本代码")).not.toBeInTheDocument();
});
+ // 徽章要和后端 `usage_enabled.unwrap_or(!code.is_empty())` 一致:
+ // 链接写了 usageEnabled 就照办,没写时带脚本即启用
+ it.each([
+ { usageEnabled: undefined, expected: "已启用" },
+ { usageEnabled: true, expected: "已启用" },
+ { usageEnabled: false, expected: "未启用" },
+ ])(
+ "shows the usage badge as $expected when usageEnabled is $usageEnabled and a script is attached",
+ async ({ usageEnabled, expected }) => {
+ render(, { wrapper: Wrapper });
+
+ act(() => {
+ deliverDeepLink({
+ version: "v1",
+ resource: "provider",
+ app: "claude",
+ name: "Usage Provider",
+ homepage: "https://example.com",
+ endpoint: "https://api.example.com",
+ apiKey: "sk-provider-key",
+ usageScript: btoa("console.log('usage');"),
+ ...(usageEnabled === undefined ? {} : { usageEnabled }),
+ });
+ });
+
+ await waitFor(() => {
+ expect(screen.getByText(expected)).toBeInTheDocument();
+ });
+ },
+ );
+
it("shows a link that arrived before the dialog mounted (cold start)", async () => {
// 冷启动时链接早于前端监听到达,后端已暂存;组件挂载后必须主动取一次
setPendingDeepLink({