diff --git a/.agents/skills/test-requirements/SKILL.md b/.agents/skills/test-requirements/SKILL.md
deleted file mode 100644
index 2baea9a..0000000
--- a/.agents/skills/test-requirements/SKILL.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-name: test-requirements
-description: 本仓库代码禁止写任何测试
----
diff --git a/.agents/skills/test-requirements/agents/openai.yaml b/.agents/skills/test-requirements/agents/openai.yaml
deleted file mode 100644
index 3ca2219..0000000
--- a/.agents/skills/test-requirements/agents/openai.yaml
+++ /dev/null
@@ -1,4 +0,0 @@
-interface:
- display_name: "测试要求"
- short_description: "根据测试要求,生成测试用例"
- default_prompt: "使用 $test-requirements 来根据测试要求,生成测试用例。"
diff --git a/frontend/src/components/CursorAccountCard.vue b/frontend/src/components/CursorAccountCard.vue
new file mode 100644
index 0000000..c9ab9e0
--- /dev/null
+++ b/frontend/src/components/CursorAccountCard.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
Cursor 控制面账号
+
+ {{ cursorAccountStateText }}
+
+
+
+
@aike0210
+
+
+
感谢 @aike0210 对 Cursor 控制面账号功能的贡献。
+
+
+
+
+
+
+
+
+
+ {{ cursorAccountStatus.email || cursorAccountStatus.authId }}
+
+
+ 独立用于插件、Skills 和 MCP;不会改变 Cursor 客户端当前账号
+
+
+ 请在浏览器完成登录,完成后返回 Cursor 重新打开插件市场
+
+
+ {{ cursorAccountStatus.error }}
+
+
+
+
+
+
+
+
diff --git a/frontend/src/i18n/generated/catalog.json b/frontend/src/i18n/generated/catalog.json
index f3dd2e5..c4beeb1 100644
--- a/frontend/src/i18n/generated/catalog.json
+++ b/frontend/src/i18n/generated/catalog.json
@@ -7,7 +7,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1017,
+ "line": 982,
"column": 14
}
]
@@ -36,18 +36,6 @@
}
]
},
- "047ec6b71d0cec08": {
- "source": "控制白名单主链路请求走本地服务,还是回到原始 Cursor 上游地址",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/views/Config.vue",
- "line": 72,
- "column": 1
- }
- ]
- },
"04f632dd4f034d5e": {
"source": "{0} 的上下文窗口必须为正整数",
"kind": "template",
@@ -55,7 +43,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 462,
+ "line": 448,
"column": 14
}
]
@@ -89,30 +77,6 @@
}
]
},
- "05c8a9238c702efa": {
- "source": "直连 Cursor 模式",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/state/appState.js",
- "line": 52,
- "column": 12
- }
- ]
- },
- "0647728439b5da2e": {
- "source": "可配置运行模式和模型渠道;运行日志位于",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/views/Config.vue",
- "line": 58,
- "column": 1
- }
- ]
- },
"092b520558eff5f2": {
"source": "未测试",
"kind": "text",
@@ -144,7 +108,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 429,
+ "line": 415,
"column": 14
}
]
@@ -166,6 +130,18 @@
}
]
},
+ "0d6b7efd5ccefd8a": {
+ "source": "可配置模型渠道;运行日志位于",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/views/Config.vue",
+ "line": 54,
+ "column": 1
+ }
+ ]
+ },
"0dde813d719dbd01": {
"source": "打开主页失败",
"kind": "text",
@@ -245,7 +221,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 309,
+ "line": 295,
"column": 14
}
]
@@ -257,23 +233,11 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 994,
+ "line": 959,
"column": 47
}
]
},
- "1af38868896cf53d": {
- "source": "运行模式仅支持 local 或 upstream",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/state/appState.js",
- "line": 484,
- "column": 12
- }
- ]
- },
"1baddde657dd2720": {
"source": "当前出站请求使用系统代理",
"kind": "text",
@@ -298,6 +262,18 @@
}
]
},
+ "1c631615c1d85c9e": {
+ "source": "登录 Cursor",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 173,
+ "column": 14
+ }
+ ]
+ },
"1e238093b79b3165": {
"source": "留空时默认 65536",
"kind": "text",
@@ -327,7 +303,7 @@
},
{
"file": "src/state/appState.js",
- "line": 335,
+ "line": 321,
"column": 36
},
{
@@ -344,17 +320,17 @@
"refs": [
{
"file": "src/views/Config.vue",
- "line": 42,
+ "line": 38,
"column": 27
},
{
"file": "src/views/Home.vue",
- "line": 118,
+ "line": 114,
"column": 27
},
{
"file": "src/views/Home.vue",
- "line": 126,
+ "line": 122,
"column": 27
},
{
@@ -383,7 +359,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 985,
+ "line": 950,
"column": 12
}
]
@@ -395,7 +371,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 471,
+ "line": 457,
"column": 14
}
]
@@ -407,7 +383,7 @@
"refs": [
{
"file": "src/views/Config.vue",
- "line": 90,
+ "line": 68,
"column": 1
}
]
@@ -429,6 +405,11 @@
"kind": "text",
"placeholders": 0,
"refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 74,
+ "column": 17
+ },
{
"file": "src/components/ModelAdapterModal.vue",
"line": 297,
@@ -456,7 +437,7 @@
},
{
"file": "src/state/appState.js",
- "line": 1059,
+ "line": 1024,
"column": 12
},
{
@@ -473,7 +454,7 @@
"refs": [
{
"file": "src/views/Config.vue",
- "line": 34,
+ "line": 30,
"column": 14
}
]
@@ -509,17 +490,17 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 443,
+ "line": 429,
"column": 16
},
{
"file": "src/state/appState.js",
- "line": 449,
+ "line": 435,
"column": 16
},
{
"file": "src/state/appState.js",
- "line": 455,
+ "line": 441,
"column": 16
}
]
@@ -615,7 +596,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1051,
+ "line": 1016,
"column": 14
}
]
@@ -659,6 +640,28 @@
}
]
},
+ "3ab8cc15939f3b5c": {
+ "source": "退出登录",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 71,
+ "column": 12
+ },
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 73,
+ "column": 18
+ },
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 164,
+ "column": 1
+ }
+ ]
+ },
"3af7e5489e61ea51": {
"source": "刷新中",
"kind": "text",
@@ -671,18 +674,6 @@
}
]
},
- "3bf8512aa520ed21": {
- "source": "本地服务模式",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/state/appState.js",
- "line": 51,
- "column": 12
- }
- ]
- },
"3c2a9f9901109e75": {
"source": "{0} 的类型仅支持 OpenAI 或 Anthropic",
"kind": "template",
@@ -690,7 +681,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 420,
+ "line": 406,
"column": 14
}
]
@@ -712,11 +703,23 @@
},
{
"file": "src/views/Config.vue",
- "line": 88,
+ "line": 66,
"column": 56
}
]
},
+ "3d52574ce1500561": {
+ "source": "未连接",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 35,
+ "column": 10
+ }
+ ]
+ },
"3ea83f9f55062582": {
"source": "发布时间:{0}",
"kind": "template",
@@ -724,7 +727,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1015,
+ "line": 980,
"column": 5
}
]
@@ -736,7 +739,7 @@
"refs": [
{
"file": "src/views/Config.vue",
- "line": 102,
+ "line": 80,
"column": 53
}
]
@@ -820,7 +823,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 432,
+ "line": 418,
"column": 14
}
]
@@ -868,7 +871,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 120,
+ "line": 114,
"column": 12
}
]
@@ -926,6 +929,18 @@
}
]
},
+ "58c6b0935a7216da": {
+ "source": "打开贡献者主页失败",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 49,
+ "column": 27
+ }
+ ]
+ },
"593a972852ba0004": {
"source": "Cursor助手|永久免费|自定义API",
"kind": "text",
@@ -950,7 +965,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 312,
+ "line": 298,
"column": 12
}
]
@@ -1010,7 +1025,7 @@
"refs": [
{
"file": "src/views/Home.vue",
- "line": 106,
+ "line": 102,
"column": 27
}
]
@@ -1044,7 +1059,7 @@
},
{
"file": "src/views/Config.vue",
- "line": 29,
+ "line": 25,
"column": 27
}
]
@@ -1056,7 +1071,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 415,
+ "line": 401,
"column": 20
}
]
@@ -1080,7 +1095,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 328,
+ "line": 314,
"column": 14
}
]
@@ -1104,7 +1119,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 983,
+ "line": 948,
"column": 14
}
]
@@ -1116,7 +1131,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 426,
+ "line": 412,
"column": 14
}
]
@@ -1150,15 +1165,15 @@
}
]
},
- "699fe7ade5407687": {
- "source": "直连模式",
+ "688102a402ba015a": {
+ "source": "等待登录...",
"kind": "text",
"placeholders": 0,
"refs": [
{
- "file": "src/views/Home.vue",
- "line": 185,
- "column": 11
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 173,
+ "column": 14
}
]
},
@@ -1196,6 +1211,16 @@
"kind": "text",
"placeholders": 0,
"refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 41,
+ "column": 30
+ },
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 41,
+ "column": 48
+ },
{
"file": "src/state/appState.js",
"line": 23,
@@ -1203,22 +1228,22 @@
},
{
"file": "src/views/Config.vue",
- "line": 22,
+ "line": 18,
"column": 30
},
{
"file": "src/views/Config.vue",
- "line": 22,
+ "line": 18,
"column": 48
},
{
"file": "src/views/Home.vue",
- "line": 89,
+ "line": 85,
"column": 30
},
{
"file": "src/views/Home.vue",
- "line": 89,
+ "line": 85,
"column": 48
},
{
@@ -1252,7 +1277,7 @@
"refs": [
{
"file": "src/views/Config.vue",
- "line": 62,
+ "line": 58,
"column": 14
}
]
@@ -1380,7 +1405,7 @@
},
{
"file": "src/state/appState.js",
- "line": 214,
+ "line": 200,
"column": 12
},
{
@@ -1426,7 +1451,7 @@
"refs": [
{
"file": "src/views/Home.vue",
- "line": 96,
+ "line": 92,
"column": 27
}
]
@@ -1443,7 +1468,7 @@
},
{
"file": "src/state/appState.js",
- "line": 1036,
+ "line": 1001,
"column": 16
}
]
@@ -1484,6 +1509,18 @@
}
]
},
+ "83be9cac28873059": {
+ "source": "Cursor 控制面账号",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 111,
+ "column": 56
+ }
+ ]
+ },
"8672864e90417138": {
"source": "最高",
"kind": "text",
@@ -1508,23 +1545,11 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 980,
+ "line": 945,
"column": 14
}
]
},
- "87ed126f7bd1121e": {
- "source": "运行模式",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/views/Config.vue",
- "line": 70,
- "column": 56
- }
- ]
- },
"899add6275682210": {
"source": "留空时默认 200000",
"kind": "text",
@@ -1549,18 +1574,6 @@
}
]
},
- "8c0d84831a3c3d5b": {
- "source": "当前为本地服务模式",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/views/Home.vue",
- "line": 188,
- "column": 11
- }
- ]
- },
"8c1935935600e336": {
"source": "模型测试",
"kind": "text",
@@ -1590,12 +1603,12 @@
},
{
"file": "src/views/Config.vue",
- "line": 100,
+ "line": 78,
"column": 56
},
{
"file": "src/views/Home.vue",
- "line": 205,
+ "line": 183,
"column": 68
}
]
@@ -1655,7 +1668,7 @@
"refs": [
{
"file": "src/views/Config.vue",
- "line": 105,
+ "line": 83,
"column": 66
}
]
@@ -1667,7 +1680,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 438,
+ "line": 424,
"column": 14
}
]
@@ -1679,7 +1692,7 @@
"refs": [
{
"file": "src/views/Config.vue",
- "line": 62,
+ "line": 58,
"column": 14
},
{
@@ -1792,12 +1805,12 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1304,
+ "line": 1256,
"column": 32
},
{
"file": "src/state/appState.js",
- "line": 1325,
+ "line": 1277,
"column": 32
}
]
@@ -1838,18 +1851,6 @@
}
]
},
- "9c38b6e9bf94abec": {
- "source": "已切换到直连 Cursor 模式",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/views/Home.vue",
- "line": 136,
- "column": 29
- }
- ]
- },
"9c41b3a9e12ac994": {
"source": "思考强度",
"kind": "text",
@@ -1869,7 +1870,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1057,
+ "line": 1022,
"column": 14
}
]
@@ -1905,7 +1906,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 475,
+ "line": 461,
"column": 14
}
]
@@ -1929,7 +1930,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 459,
+ "line": 445,
"column": 14
}
]
@@ -1941,12 +1942,12 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1003,
+ "line": 968,
"column": 12
},
{
"file": "src/state/appState.js",
- "line": 1046,
+ "line": 1011,
"column": 87
}
]
@@ -1975,7 +1976,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1249,
+ "line": 1201,
"column": 14
},
{
@@ -2009,18 +2010,6 @@
}
]
},
- "a55a88237df85d98": {
- "source": "当前为直连模式",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/views/Home.vue",
- "line": 187,
- "column": 11
- }
- ]
- },
"a567bdaa11367f26": {
"source": "中",
"kind": "text",
@@ -2135,7 +2124,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1032,
+ "line": 997,
"column": 16
}
]
@@ -2147,7 +2136,7 @@
"refs": [
{
"file": "src/views/Home.vue",
- "line": 201,
+ "line": 179,
"column": 47
}
]
@@ -2215,18 +2204,6 @@
}
]
},
- "b42049dcf8a05ef7": {
- "source": "已切换到本地服务模式",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/views/Home.vue",
- "line": 136,
- "column": 50
- }
- ]
- },
"b5409d4049286061": {
"source": "自定义路径(请输入完整请求地址)",
"kind": "text",
@@ -2400,15 +2377,15 @@
}
]
},
- "c3e9c3c60020b8b7": {
- "source": "选择模式",
+ "c3d46b387eeadb23": {
+ "source": "只会退出 cursor-byok 中的 Cursor 账号,不会退出 Cursor 客户端。是否继续?",
"kind": "text",
"placeholders": 0,
"refs": [
{
- "file": "src/views/Config.vue",
- "line": 79,
- "column": 13
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 72,
+ "column": 14
}
]
},
@@ -2431,11 +2408,23 @@
"refs": [
{
"file": "src/views/Home.vue",
- "line": 204,
+ "line": 182,
"column": 63
}
]
},
+ "c8a52b66651d294c": {
+ "source": "退出登录失败",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 83,
+ "column": 27
+ }
+ ]
+ },
"c8c14507b2d37395": {
"source": "推理强度",
"kind": "text",
@@ -2455,17 +2444,17 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1220,
+ "line": 1172,
"column": 28
},
{
"file": "src/state/appState.js",
- "line": 1222,
+ "line": 1174,
"column": 38
},
{
"file": "src/state/appState.js",
- "line": 1257,
+ "line": 1209,
"column": 93
}
]
@@ -2489,7 +2478,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 992,
+ "line": 957,
"column": 51
}
]
@@ -2513,20 +2502,20 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 304,
+ "line": 290,
"column": 12
}
]
},
- "ce46f23cea3bf3c5": {
- "source": "开启后,Cursor将直接接通官方,请勿开启",
+ "cfa6c803eb3fc713": {
+ "source": "等待浏览器登录",
"kind": "text",
"placeholders": 0,
"refs": [
{
- "file": "src/views/Home.vue",
- "line": 186,
- "column": 11
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 34,
+ "column": 42
}
]
},
@@ -2542,18 +2531,6 @@
}
]
},
- "d08fd4224abcd69d": {
- "source": "切换失败",
- "kind": "text",
- "placeholders": 0,
- "refs": [
- {
- "file": "src/views/Home.vue",
- "line": 133,
- "column": 27
- }
- ]
- },
"d1bde4a4e057b2c7": {
"source": "[MainLayout] 加载作者信息失败",
"kind": "text",
@@ -2573,7 +2550,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 417,
+ "line": 403,
"column": 14
}
]
@@ -2597,7 +2574,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1201,
+ "line": 1153,
"column": 14
},
{
@@ -2626,12 +2603,12 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 217,
+ "line": 203,
"column": 38
},
{
"file": "src/state/appState.js",
- "line": 247,
+ "line": 233,
"column": 50
}
]
@@ -2643,7 +2620,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 318,
+ "line": 304,
"column": 49
},
{
@@ -2653,6 +2630,18 @@
}
]
},
+ "d6ce4f0f88178144": {
+ "source": "独立用于插件、Skills 和 MCP;不会改变 Cursor 客户端当前账号",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 146,
+ "column": 1
+ }
+ ]
+ },
"d7889896c5b7732a": {
"source": "Anthropic 额外参数 JSON",
"kind": "text",
@@ -2660,7 +2649,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 339,
+ "line": 325,
"column": 36
},
{
@@ -2718,7 +2707,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 268,
+ "line": 254,
"column": 18
},
{
@@ -2735,7 +2724,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 435,
+ "line": 421,
"column": 14
}
]
@@ -2747,7 +2736,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 423,
+ "line": 409,
"column": 14
}
]
@@ -2759,7 +2748,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1014,
+ "line": 979,
"column": 5
}
]
@@ -2771,7 +2760,7 @@
"refs": [
{
"file": "src/views/Config.vue",
- "line": 102,
+ "line": 80,
"column": 1
}
]
@@ -2807,16 +2796,52 @@
"refs": [
{
"file": "src/views/Config.vue",
- "line": 56,
+ "line": 52,
"column": 56
},
{
"file": "src/views/Home.vue",
- "line": 200,
+ "line": 178,
"column": 56
}
]
},
+ "e4343921c928a856": {
+ "source": "登录失败",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 62,
+ "column": 27
+ }
+ ]
+ },
+ "e4c0daa3c4bea691": {
+ "source": "感谢 @aike0210 对 Cursor 控制面账号功能的贡献。",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 122,
+ "column": 20
+ }
+ ]
+ },
+ "e53580f8031f13c0": {
+ "source": "请在浏览器完成登录,完成后返回 Cursor 重新打开插件市场",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 149,
+ "column": 1
+ }
+ ]
+ },
"e552c2accdbf5178": {
"source": "新增模型",
"kind": "text",
@@ -2841,6 +2866,18 @@
}
]
},
+ "e8a0a6053998ebfa": {
+ "source": "已经登录",
+ "kind": "text",
+ "placeholders": 0,
+ "refs": [
+ {
+ "file": "src/components/CursorAccountCard.vue",
+ "line": 33,
+ "column": 43
+ }
+ ]
+ },
"eaffd48cd2ea9f1a": {
"source": "例如:https://api.anthropic.com",
"kind": "text",
@@ -2872,7 +2909,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 223,
+ "line": 209,
"column": 10
}
]
@@ -2884,7 +2921,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 1034,
+ "line": 999,
"column": 16
}
]
@@ -2944,7 +2981,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 325,
+ "line": 311,
"column": 14
}
]
@@ -2956,7 +2993,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 994,
+ "line": 959,
"column": 38
}
]
@@ -3025,7 +3062,7 @@
},
{
"file": "src/views/Config.vue",
- "line": 33,
+ "line": 29,
"column": 12
}
]
@@ -3037,12 +3074,12 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 465,
+ "line": 451,
"column": 14
},
{
"file": "src/state/appState.js",
- "line": 468,
+ "line": 454,
"column": 14
}
]
@@ -3091,7 +3128,7 @@
},
{
"file": "src/state/appState.js",
- "line": 1053,
+ "line": 1018,
"column": 12
}
]
@@ -3103,7 +3140,7 @@
"refs": [
{
"file": "src/state/appState.js",
- "line": 992,
+ "line": 957,
"column": 40
}
]
diff --git a/frontend/src/i18n/locales/en-US.json b/frontend/src/i18n/locales/en-US.json
index 2701794..04cd9ff 100644
--- a/frontend/src/i18n/locales/en-US.json
+++ b/frontend/src/i18n/locales/en-US.json
@@ -2,16 +2,14 @@
"02216368edc68816": "No release notes",
"02bc2e95bf49e587": "No",
"03b11112dc970014": "Base URL",
- "047ec6b71d0cec08": "Control whether requests on the whitelist main path go through the local service or return to the original Cursor upstream endpoint",
"04f632dd4f034d5e": "{0} context window must be a positive integer",
"051836569928a9f9": "Edit",
"054d763265603305": "e.g. 65536 (leave blank to use the default)",
- "05c8a9238c702efa": "Direct Cursor Mode",
- "0647728439b5da2e": "You can configure the routing mode and model channels. Runtime logs are stored in",
"092b520558eff5f2": "Not tested",
"09ebc2643631ba25": "Cost Estimate",
"0b0e7478e41fe677": "{0} tooltip text cannot be empty",
"0c3b4cf7aa259edb": "Operation failed",
+ "0d6b7efd5ccefd8a": "You can configure model channels. Runtime logs are stored in",
"0dde813d719dbd01": "Failed to open homepage",
"1117a2f86030d03b": "Cache reads and writes are included in Prompt-side statistics.",
"11afd2a534395b18": "Valid",
@@ -20,9 +18,9 @@
"15d124b200ddabed": "Maximum number of context tokens the model can accept in a single request. Leave blank to use the default.",
"185aebe19c77425d": "{0} must be a JSON object",
"18b7312022cd1840": "Start Service",
- "1af38868896cf53d": "Routing mode only supports local or upstream",
"1baddde657dd2720": "Current outbound requests use system proxy",
"1bc77f5ab979f4c1": "Add Model Settings",
+ "1c631615c1d85c9e": "Log in to Cursor",
"1e238093b79b3165": "Uses 65536 by default when left blank",
"21296ab18ad9af25": "Extra Params JSON",
"24343a2096988d42": "Failed to open",
@@ -46,10 +44,11 @@
"37d23612f78a2e63": "Restart Now to Update",
"392d0dceb45998d3": "Extreme",
"393df9bb13ea4900": "Hit",
+ "3ab8cc15939f3b5c": "Log out",
"3af7e5489e61ea51": "Refreshing",
- "3bf8512aa520ed21": "Local Service Mode",
"3c2a9f9901109e75": "{0} type only supports OpenAI or Anthropic",
"3d13868593ae4eeb": "Interface Language",
+ "3d52574ce1500561": "Not connected",
"3ea83f9f55062582": "Release date: {0}",
"3edda85621fd03b2": "model adapters",
"3fd47edce45b3603": "Close",
@@ -67,6 +66,7 @@
"51194c3ad014fb29": "Retest required",
"5205125c0e91d346": "Maximum tokens an Anthropic model may generate in a single response. Leave blank to use the default.",
"56627c94a9decee6": "Max Output Tokens",
+ "58c6b0935a7216da": "Failed to open contributor profile",
"593a972852ba0004": "Cursor Assistant | Permanently Free | Custom API",
"59a2195a01a8b35b": "{0} must be a valid JSON object",
"5aa8f5590c940829": "Non-cache Input: {0}",
@@ -84,7 +84,7 @@
"66af574b8948fe83": "{0} API key cannot be empty",
"6744b4c6a9aa0038": "Disabled",
"675109292da4eb36": "Not tested yet",
- "699fe7ade5407687": "Direct Mode",
+ "688102a402ba015a": "Waiting for login...",
"6a7b96f399e58138": "e.g. sk-xxxxxx",
"6aa8f49cc992dfd7": "Test",
"6ae23d6d7cb18592": "Service error",
@@ -106,12 +106,11 @@
"80296f4aa3f4543b": "Cache Read/Write",
"81123c56d5d880d0": "API Key",
"8139cb3dd11f5a67": "When enabled, the JSON object will override the final request headers. Duplicate headers are determined by this field, and values must be strings.",
+ "83be9cac28873059": "Cursor Control Plane Account",
"8672864e90417138": "Max",
"86df7ec743047234": "Service running",
- "87ed126f7bd1121e": "Routing Mode",
"899add6275682210": "Uses 200000 by default when left blank",
"8a4ef3e48e4e8a5a": "Enabled",
- "8c0d84831a3c3d5b": "Currently in Local Service Mode",
"8c1935935600e336": "Model Test",
"8cbcf741e727dbf7": "Model Settings",
"8d1de152be6360ce": "Valid ratio: {0}",
@@ -133,7 +132,6 @@
"9970736b36ff2b68": "The base URL of the model service, usually an OpenAI- or Anthropic-compatible endpoint.",
"9a6e7d6c17471711": "Currently displayed using the default hit rate definition",
"9b17fa889b307f7f": "Valid turns: {0}",
- "9c38b6e9bf94abec": "Switched to Direct Cursor Mode",
"9c41b3a9e12ac994": "Thinking Effort",
"9d2ca261281a158a": "Later",
"9d2fb46c0ba890b9": "Custom Path",
@@ -146,7 +144,6 @@
"a325d25c69e7256d": "Model settings not found; cannot duplicate",
"a4dd8bb7e8b6eb31": "Show API Key",
"a54d745d9a9249e2": "When enabled, the JSON object will override the Anthropic request body. Duplicate fields are determined by this field.",
- "a55a88237df85d98": "Currently in Direct Mode",
"a567bdaa11367f26": "Medium",
"a5f1bd344c92e195": "The API key required to call this model service.",
"a693d69af48bfe48": "Save and Test",
@@ -159,7 +156,6 @@
"aed55419ce62f08e": "Switching...",
"b10041a13f5c55b1": "Model Output: {0} × ${1}/1M = {2}",
"b1c27820fec23edb": "High",
- "b42049dcf8a05ef7": "Switched to Local Service Mode",
"b5409d4049286061": "Custom Path (Please enter the full request URL)",
"b571037dc396a00c": "Total request tokens include both prompt and model output.",
"b765005f69fa971f": "e.g. gpt-4.1",
@@ -174,18 +170,18 @@
"bddd504af0c92fd0": "System PAC/automatic proxy detected; current version is handled as a direct connection",
"bef280f9eb392495": "Conversation Turns",
"c228558cf257fc49": "Delete failed",
- "c3e9c3c60020b8b7": "Select Mode",
+ "c3d46b387eeadb23": "This only logs the Cursor account out of cursor-byok; it does not log out of the Cursor client. Continue?",
"c5af02060847d167": "Thinking effort for Anthropic adaptive thinking. Requests will consistently use the new thinking.type=adaptive.",
"c69f5bce63b9f14c": "Settings Folder",
+ "c8a52b66651d294c": "Failed to log out",
"c8c14507b2d37395": "Reasoning Effort",
"c98e118e0a43f078": "Model",
"c9dd59beefd7144f": "Cache Read / (Cache Read + Non-cache Input)",
"ca00a39fcea70dc6": "Starting...",
"ca1d1059408b3837": "Invalid turns: {0}",
"cd7ca5fb221e1c53": "{0} cannot be empty",
- "ce46f23cea3bf3c5": "When enabled, Cursor connects directly to the official service. Do not enable this.",
+ "cfa6c803eb3fc713": "Waiting for browser login",
"d0325067fed88e5a": "Cache hit rate {0}",
- "d08fd4224abcd69d": "Switch failed",
"d1bde4a4e057b2c7": "[MainLayout] Failed to load author info",
"d20ab96566d33f25": "{0} display name cannot be empty",
"d2243e1d44b2a94e": "Edit Model Settings",
@@ -193,6 +189,7 @@
"d373809ab86ba93b": "Copy",
"d3b1da3088ddd334": "Model test failed",
"d53d32f1a1211371": "Custom Headers JSON",
+ "d6ce4f0f88178144": "Used only for Plugins, Skills, and MCP; does not change the account in the Cursor client",
"d7889896c5b7732a": "Anthropic Extra Params JSON",
"d7da2aabd35772ec": "e.g. 200000 (leave blank to use the default)",
"d95e5cb6bdcee553": "Include Cache Creation",
@@ -205,8 +202,12 @@
"e01c5dae36cf8c35": "When enabled, the JSON object will override the OpenAI request body. Duplicate fields are determined by this field. OpenAI service_tier supports auto, default, flex, scale, priority.",
"e14c41ef2b7253c9": "Total request tokens: {0}",
"e406825e0a72d2c2": "Local Settings",
+ "e4343921c928a856": "Login failed",
+ "e4c0daa3c4bea691": "Thanks to @aike0210 for contributing the Cursor control-plane account feature.",
+ "e53580f8031f13c0": "Complete login in the browser, then return to Cursor and reopen the plugin marketplace",
"e552c2accdbf5178": "Add Model",
"e6faccfddce722e8": "Cache read tokens: {0}",
+ "e8a0a6053998ebfa": "Logged in",
"eaffd48cd2ea9f1a": "e.g. https://api.anthropic.com",
"eb1be07f2ca6e506": "Estimated based on Claude Opus 4.7 pricing.",
"ec3b17a75db49e24": "{0} t/s | First token {1}",
diff --git a/frontend/src/i18n/locales/ja-JP.json b/frontend/src/i18n/locales/ja-JP.json
index 95fe244..18cf9e6 100644
--- a/frontend/src/i18n/locales/ja-JP.json
+++ b/frontend/src/i18n/locales/ja-JP.json
@@ -2,16 +2,14 @@
"02216368edc68816": "更新内容はありません",
"02bc2e95bf49e587": "まだ",
"03b11112dc970014": "ベース URL",
- "047ec6b71d0cec08": "ホワイトリストのメイン経路のリクエストをローカルサービス経由にするか、元の Cursor 上流アドレスに戻すかを制御します",
"04f632dd4f034d5e": "{0} のコンテキストウィンドウは正の整数である必要があります",
"051836569928a9f9": "編集",
"054d763265603305": "例: 65536(空欄でデフォルト値)",
- "05c8a9238c702efa": "Cursor 直結モード",
- "0647728439b5da2e": "ルーティングモードとモデルチャネルを設定できます。実行ログは次にあります",
"092b520558eff5f2": "未テスト",
"09ebc2643631ba25": "価値見積もり",
"0b0e7478e41fe677": "{0} のツールチップは必須です",
"0c3b4cf7aa259edb": "操作に失敗しました",
+ "0d6b7efd5ccefd8a": "モデルチャネルを設定できます。実行ログは次にあります",
"0dde813d719dbd01": "ホームページを開けませんでした",
"1117a2f86030d03b": "キャッシュの読み書きは Prompt 側の統計に含まれます。",
"11afd2a534395b18": "有効",
@@ -20,9 +18,9 @@
"15d124b200ddabed": "モデルが1回のリクエストで受け取れる最大コンテキスト Token 数。空欄の場合はデフォルト値を使用します。",
"185aebe19c77425d": "{0}はJSONオブジェクトである必要があります",
"18b7312022cd1840": "サービスを開始",
- "1af38868896cf53d": "ルーティングモードは local または upstream のみサポートします",
"1baddde657dd2720": "現在のアウトバウンドリクエストはシステムプロキシを使用しています",
"1bc77f5ab979f4c1": "モデル設定を追加",
+ "1c631615c1d85c9e": "Cursor にログイン",
"1e238093b79b3165": "空欄で 65536",
"21296ab18ad9af25": "追加パラメータ JSON",
"24343a2096988d42": "開けませんでした",
@@ -46,10 +44,11 @@
"37d23612f78a2e63": "今すぐ再起動して更新",
"392d0dceb45998d3": "最高",
"393df9bb13ea4900": "ヒット",
+ "3ab8cc15939f3b5c": "ログアウト",
"3af7e5489e61ea51": "更新中",
- "3bf8512aa520ed21": "ローカルサービスモード",
"3c2a9f9901109e75": "{0} のタイプは OpenAI または Anthropic のみサポートします",
"3d13868593ae4eeb": "表示言語",
+ "3d52574ce1500561": "未接続",
"3ea83f9f55062582": "公開日時: {0}",
"3edda85621fd03b2": "件のモデルアダプター",
"3fd47edce45b3603": "閉じる",
@@ -67,6 +66,7 @@
"51194c3ad014fb29": "再テストが必要",
"5205125c0e91d346": "Anthropic モデルが1回の応答で生成できる最大 Token 数。空欄の場合はデフォルト値を使用します。",
"56627c94a9decee6": "最大出力 Token",
+ "58c6b0935a7216da": "コントリビューターのプロフィールを開けませんでした",
"593a972852ba0004": "Cursor アシスタント | 永久無料 | カスタム API",
"59a2195a01a8b35b": "{0}は有効なJSONオブジェクトである必要があります",
"5aa8f5590c940829": "非キャッシュ入力:{0}",
@@ -84,7 +84,7 @@
"66af574b8948fe83": "{0} の API キーは必須です",
"6744b4c6a9aa0038": "無効化",
"675109292da4eb36": "まだテストしていません",
- "699fe7ade5407687": "直結モード",
+ "688102a402ba015a": "ログインを待っています...",
"6a7b96f399e58138": "例: sk-xxxxxx",
"6aa8f49cc992dfd7": "テスト",
"6ae23d6d7cb18592": "サービスエラー",
@@ -106,12 +106,11 @@
"80296f4aa3f4543b": "キャッシュ読み書き",
"81123c56d5d880d0": "API キー",
"8139cb3dd11f5a67": "有効にすると、JSONオブジェクトが最終的なリクエストヘッダーを上書きします。同名のヘッダーはこの設定が優先され、値は文字列である必要があります。",
+ "83be9cac28873059": "Cursor コントロールプレーンアカウント",
"8672864e90417138": "最大",
"86df7ec743047234": "サービス稼働中",
- "87ed126f7bd1121e": "ルーティングモード",
"899add6275682210": "空欄で 200000",
"8a4ef3e48e4e8a5a": "有効",
- "8c0d84831a3c3d5b": "現在はローカルサービスモードです",
"8c1935935600e336": "モデルテスト",
"8cbcf741e727dbf7": "モデル設定",
"8d1de152be6360ce": "有効率: {0}",
@@ -133,7 +132,6 @@
"9970736b36ff2b68": "モデルサービスの API ルート URL。通常は OpenAI または Anthropic 互換のエンドポイントです。",
"9a6e7d6c17471711": "現在、デフォルトのヒット率定義に従って表示されています",
"9b17fa889b307f7f": "有効ターン: {0}",
- "9c38b6e9bf94abec": "Cursor 直結モードに切り替えました",
"9c41b3a9e12ac994": "思考強度",
"9d2ca261281a158a": "後で",
"9d2fb46c0ba890b9": "カスタムパス",
@@ -146,7 +144,6 @@
"a325d25c69e7256d": "モデル設定が存在しないため複製できません",
"a4dd8bb7e8b6eb31": "API キーを表示",
"a54d745d9a9249e2": "有効にすると、JSONオブジェクトがAnthropicのリクエストボディを上書きします。同名のフィールドはこの設定が優先されます。",
- "a55a88237df85d98": "現在は直結モードです",
"a567bdaa11367f26": "中",
"a5f1bd344c92e195": "このモデルサービスを呼び出すために必要な API キーです。",
"a693d69af48bfe48": "保存してテスト",
@@ -159,7 +156,6 @@
"aed55419ce62f08e": "切替中...",
"b10041a13f5c55b1": "モデル出力:{0} × ${1}/1M = {2}",
"b1c27820fec23edb": "高",
- "b42049dcf8a05ef7": "ローカルサービスモードに切り替えました",
"b5409d4049286061": "カスタムパス(完全なリクエストURLを入力してください)",
"b571037dc396a00c": "総リクエスト Token には Prompt とモデル出力の両方が含まれます。",
"b765005f69fa971f": "例: gpt-4.1",
@@ -174,18 +170,18 @@
"bddd504af0c92fd0": "システムのPAC/自動プロキシが検出されました。現在のバージョンは直接接続として処理されます",
"bef280f9eb392495": "会話ターン",
"c228558cf257fc49": "削除に失敗しました",
- "c3e9c3c60020b8b7": "モードを選択",
+ "c3d46b387eeadb23": "cursor-byok 内の Cursor アカウントからのみログアウトします。Cursor クライアントからはログアウトしません。続行しますか?",
"c5af02060847d167": "Anthropic adaptive thinkingの思考強度。リクエストは一貫して新しいthinking.type=adaptiveを使用します。",
"c69f5bce63b9f14c": "設定フォルダー",
+ "c8a52b66651d294c": "ログアウトに失敗しました",
"c8c14507b2d37395": "推論強度",
"c98e118e0a43f078": "モデル",
"c9dd59beefd7144f": "キャッシュ読み取り / (キャッシュ読み取り + 非キャッシュ入力)",
"ca00a39fcea70dc6": "起動中...",
"ca1d1059408b3837": "異常ターン: {0}",
"cd7ca5fb221e1c53": "{0}は空にできません",
- "ce46f23cea3bf3c5": "有効にすると、Cursor は公式サービスへ直接接続します。オンにしないでください",
+ "cfa6c803eb3fc713": "ブラウザでのログインを待っています",
"d0325067fed88e5a": "キャッシュヒット率 {0}",
- "d08fd4224abcd69d": "切替に失敗しました",
"d1bde4a4e057b2c7": "[MainLayout] 作者情報の読み込みに失敗しました",
"d20ab96566d33f25": "{0} の表示名は必須です",
"d2243e1d44b2a94e": "モデル設定を編集",
@@ -193,6 +189,7 @@
"d373809ab86ba93b": "コピー",
"d3b1da3088ddd334": "モデルテストに失敗しました",
"d53d32f1a1211371": "カスタムヘッダー JSON",
+ "d6ce4f0f88178144": "プラグイン、Skills、MCP 専用です。Cursor クライアントの現在のアカウントは変更しません",
"d7889896c5b7732a": "Anthropic 追加パラメータ JSON",
"d7da2aabd35772ec": "例: 200000(空欄でデフォルト値)",
"d95e5cb6bdcee553": "キャッシュ作成を含める",
@@ -205,8 +202,12 @@
"e01c5dae36cf8c35": "有効にすると、JSONオブジェクトがOpenAIのリクエストボディを上書きします。同名のフィールドはこの設定が優先されます。OpenAIのservice_tierはauto、default、flex、scale、priorityをサポートしています。",
"e14c41ef2b7253c9": "総リクエスト Token: {0}",
"e406825e0a72d2c2": "ローカル設定",
+ "e4343921c928a856": "ログインに失敗しました",
+ "e4c0daa3c4bea691": "Cursor コントロールプレーンアカウント機能への @aike0210 の貢献に感謝します。",
+ "e53580f8031f13c0": "ブラウザでログインを完了し、Cursor に戻ってプラグインマーケットを開き直してください",
"e552c2accdbf5178": "モデルを追加",
"e6faccfddce722e8": "キャッシュ読込 Token: {0}",
+ "e8a0a6053998ebfa": "ログイン済み",
"eaffd48cd2ea9f1a": "例: https://api.anthropic.com",
"eb1be07f2ca6e506": "Claude Opus 4.7の価格に基づいて見積もられます。",
"ec3b17a75db49e24": "{0} t/s | 初回 Token {1}",
diff --git a/frontend/src/i18n/locales/ru-RU.json b/frontend/src/i18n/locales/ru-RU.json
index 19e8608..99e5283 100644
--- a/frontend/src/i18n/locales/ru-RU.json
+++ b/frontend/src/i18n/locales/ru-RU.json
@@ -2,16 +2,14 @@
"02216368edc68816": "Нет примечаний к выпуску",
"02bc2e95bf49e587": "Пока нет настроенных",
"03b11112dc970014": "Базовый URL",
- "047ec6b71d0cec08": "Определяет, будут ли запросы основного маршрута из белого списка проходить через локальный сервис или исходный сервер Cursor",
"04f632dd4f034d5e": "Размер контекстного окна {0} должен быть положительным целым числом",
"051836569928a9f9": "Изменить",
"054d763265603305": "например, 65536 (оставьте пустым для значения по умолчанию)",
- "05c8a9238c702efa": "Прямое подключение к Cursor",
- "0647728439b5da2e": "Здесь можно настроить режим маршрутизации и каналы моделей. Журналы выполнения находятся в",
"092b520558eff5f2": "Не проверено",
"09ebc2643631ba25": "Оценка стоимости",
"0b0e7478e41fe677": "Текст подсказки {0} не может быть пустым",
"0c3b4cf7aa259edb": "Не удалось выполнить операцию",
+ "0d6b7efd5ccefd8a": "Здесь можно настроить каналы моделей. Журналы выполнения находятся в",
"0dde813d719dbd01": "Не удалось открыть домашнюю страницу",
"1117a2f86030d03b": "Чтение и запись кеша включены в статистику Prompt.",
"11afd2a534395b18": "Успешно",
@@ -20,9 +18,9 @@
"15d124b200ddabed": "Максимальное число токенов контекста, которое модель может принять за один запрос. Оставьте поле пустым для значения по умолчанию.",
"185aebe19c77425d": "{0} должен быть объектом JSON",
"18b7312022cd1840": "Запустить сервис",
- "1af38868896cf53d": "Режим маршрутизации поддерживает только local или upstream",
"1baddde657dd2720": "Исходящие запросы используют системный прокси",
"1bc77f5ab979f4c1": "Добавить настройки модели",
+ "1c631615c1d85c9e": "Войти в Cursor",
"1e238093b79b3165": "Если оставить пустым, используется 65536",
"21296ab18ad9af25": "Дополнительные параметры JSON",
"24343a2096988d42": "Не удалось открыть",
@@ -46,10 +44,11 @@
"37d23612f78a2e63": "Перезапустить и обновить",
"392d0dceb45998d3": "Очень высокая",
"393df9bb13ea4900": "Попадание",
+ "3ab8cc15939f3b5c": "Выйти",
"3af7e5489e61ea51": "Обновление",
- "3bf8512aa520ed21": "Режим локального сервиса",
"3c2a9f9901109e75": "Тип {0} поддерживает только OpenAI или Anthropic",
"3d13868593ae4eeb": "Язык интерфейса",
+ "3d52574ce1500561": "Не подключено",
"3ea83f9f55062582": "Дата выпуска: {0}",
"3edda85621fd03b2": "адаптеров моделей",
"3fd47edce45b3603": "Закрыть",
@@ -67,6 +66,7 @@
"51194c3ad014fb29": "Требуется повторная проверка",
"5205125c0e91d346": "Максимальное число токенов, которое модель Anthropic может сгенерировать за один ответ. Оставьте поле пустым для значения по умолчанию.",
"56627c94a9decee6": "Макс. выходных токенов",
+ "58c6b0935a7216da": "Не удалось открыть профиль участника",
"593a972852ba0004": "Cursor Assistant | Всегда бесплатно | Пользовательский API",
"59a2195a01a8b35b": "{0} должен быть допустимым объектом JSON",
"5aa8f5590c940829": "Ввод без кеша: {0}",
@@ -84,7 +84,7 @@
"66af574b8948fe83": "Ключ API {0} не может быть пустым",
"6744b4c6a9aa0038": "Выключено",
"675109292da4eb36": "Еще не проверено",
- "699fe7ade5407687": "Прямой режим",
+ "688102a402ba015a": "Ожидание входа...",
"6a7b96f399e58138": "например, sk-xxxxxx",
"6aa8f49cc992dfd7": "Проверить",
"6ae23d6d7cb18592": "Ошибка сервиса",
@@ -106,12 +106,11 @@
"80296f4aa3f4543b": "Чтение/запись кеша",
"81123c56d5d880d0": "Ключ API",
"8139cb3dd11f5a67": "Если включено, объект JSON переопределит итоговые заголовки запроса. При совпадении имен используются значения отсюда; все значения должны быть строками.",
+ "83be9cac28873059": "Аккаунт управляющего уровня Cursor",
"8672864e90417138": "Максимальная",
"86df7ec743047234": "Сервис запущен",
- "87ed126f7bd1121e": "Режим маршрутизации",
"899add6275682210": "Если оставить пустым, используется 200000",
"8a4ef3e48e4e8a5a": "Включено",
- "8c0d84831a3c3d5b": "Сейчас используется режим локального сервиса",
"8c1935935600e336": "Проверка модели",
"8cbcf741e727dbf7": "Настройки модели",
"8d1de152be6360ce": "Доля успешных: {0}",
@@ -133,7 +132,6 @@
"9970736b36ff2b68": "Корневой адрес API сервиса модели, обычно совместимый с OpenAI или Anthropic.",
"9a6e7d6c17471711": "Сейчас используется стандартный расчет доли попаданий",
"9b17fa889b307f7f": "Успешных ходов: {0}",
- "9c38b6e9bf94abec": "Включено прямое подключение к Cursor",
"9c41b3a9e12ac994": "Интенсивность рассуждений",
"9d2ca261281a158a": "Позже",
"9d2fb46c0ba890b9": "Пользовательский путь",
@@ -146,7 +144,6 @@
"a325d25c69e7256d": "Настройки модели не найдены; дублирование невозможно",
"a4dd8bb7e8b6eb31": "Показать ключ API",
"a54d745d9a9249e2": "Если включено, объект JSON переопределит тело запроса Anthropic. При совпадении полей используются значения отсюда.",
- "a55a88237df85d98": "Сейчас используется прямой режим",
"a567bdaa11367f26": "Средняя",
"a5f1bd344c92e195": "Ключ API, необходимый для обращения к сервису модели.",
"a693d69af48bfe48": "Сохранить и проверить",
@@ -159,7 +156,6 @@
"aed55419ce62f08e": "Переключение...",
"b10041a13f5c55b1": "Вывод модели: {0} × ${1}/1M = {2}",
"b1c27820fec23edb": "Высокая",
- "b42049dcf8a05ef7": "Включен режим локального сервиса",
"b5409d4049286061": "Пользовательский путь (введите полный URL запроса)",
"b571037dc396a00c": "Общее число токенов запроса включает Prompt и вывод модели.",
"b765005f69fa971f": "например, gpt-4.1",
@@ -174,18 +170,18 @@
"bddd504af0c92fd0": "Обнаружен системный PAC/автоматический прокси; в текущей версии используется прямое подключение",
"bef280f9eb392495": "Ходы диалога",
"c228558cf257fc49": "Не удалось удалить",
- "c3e9c3c60020b8b7": "Выберите режим",
+ "c3d46b387eeadb23": "Будет выполнен выход только из аккаунта Cursor в cursor-byok. В клиенте Cursor вы останетесь в системе. Продолжить?",
"c5af02060847d167": "Интенсивность для адаптивных рассуждений Anthropic. В запросах всегда используется новый режим thinking.type=adaptive.",
"c69f5bce63b9f14c": "Папка настроек",
+ "c8a52b66651d294c": "Не удалось выйти",
"c8c14507b2d37395": "Интенсивность рассуждений",
"c98e118e0a43f078": "Модель",
"c9dd59beefd7144f": "Чтение кеша / (Чтение кеша + Ввод без кеша)",
"ca00a39fcea70dc6": "Запуск...",
"ca1d1059408b3837": "Ошибочных ходов: {0}",
"cd7ca5fb221e1c53": "{0} не может быть пустым",
- "ce46f23cea3bf3c5": "Если включено, Cursor подключается напрямую к официальному сервису. Не включайте этот режим.",
+ "cfa6c803eb3fc713": "Ожидание входа в браузере",
"d0325067fed88e5a": "Доля попаданий в кеш: {0}",
- "d08fd4224abcd69d": "Не удалось переключить",
"d1bde4a4e057b2c7": "[MainLayout] Не удалось загрузить сведения об авторе",
"d20ab96566d33f25": "Отображаемое имя {0} не может быть пустым",
"d2243e1d44b2a94e": "Изменить настройки модели",
@@ -193,6 +189,7 @@
"d373809ab86ba93b": "Копировать",
"d3b1da3088ddd334": "Проверка модели не пройдена",
"d53d32f1a1211371": "Пользовательские заголовки JSON",
+ "d6ce4f0f88178144": "Используется только для Plugins, Skills и MCP; текущий аккаунт клиента Cursor не изменяется",
"d7889896c5b7732a": "Дополнительные параметры Anthropic JSON",
"d7da2aabd35772ec": "например, 200000 (оставьте пустым для значения по умолчанию)",
"d95e5cb6bdcee553": "Учитывать создание кеша",
@@ -205,8 +202,12 @@
"e01c5dae36cf8c35": "Если включено, объект JSON переопределит тело запроса OpenAI. При совпадении полей используются значения отсюда. OpenAI service_tier поддерживает auto, default, flex, scale и priority.",
"e14c41ef2b7253c9": "Всего токенов запроса: {0}",
"e406825e0a72d2c2": "Локальные настройки",
+ "e4343921c928a856": "Не удалось войти",
+ "e4c0daa3c4bea691": "Спасибо @aike0210 за вклад в функцию аккаунта панели управления Cursor.",
+ "e53580f8031f13c0": "Завершите вход в браузере, затем вернитесь в Cursor и снова откройте магазин плагинов",
"e552c2accdbf5178": "Добавить модель",
"e6faccfddce722e8": "Токены чтения из кеша: {0}",
+ "e8a0a6053998ebfa": "Выполнен вход",
"eaffd48cd2ea9f1a": "например, https://api.anthropic.com",
"eb1be07f2ca6e506": "Расчет основан на тарифах Claude Opus 4.7.",
"ec3b17a75db49e24": "{0} т/с | Первый токен {1}",
diff --git a/frontend/src/i18n/locales/zh-CN.json b/frontend/src/i18n/locales/zh-CN.json
index eec55b6..22d1ad6 100644
--- a/frontend/src/i18n/locales/zh-CN.json
+++ b/frontend/src/i18n/locales/zh-CN.json
@@ -2,16 +2,14 @@
"02216368edc68816": "无更新说明",
"02bc2e95bf49e587": "当前还没有配置任何",
"03b11112dc970014": "接口地址",
- "047ec6b71d0cec08": "控制白名单主链路请求走本地服务,还是回到原始 Cursor 上游地址",
"04f632dd4f034d5e": "{0} 的上下文窗口必须为正整数",
"051836569928a9f9": "编辑",
"054d763265603305": "例如:65536(留空用默认值)",
- "05c8a9238c702efa": "直连 Cursor 模式",
- "0647728439b5da2e": "可配置运行模式和模型渠道;运行日志位于",
"092b520558eff5f2": "未测试",
"09ebc2643631ba25": "价值估算",
"0b0e7478e41fe677": "{0} 的悬停提示不能为空",
"0c3b4cf7aa259edb": "操作失败",
+ "0d6b7efd5ccefd8a": "可配置模型渠道;运行日志位于",
"0dde813d719dbd01": "打开主页失败",
"1117a2f86030d03b": "缓存读写已计入 Prompt 侧统计。",
"11afd2a534395b18": "有效",
@@ -20,9 +18,9 @@
"15d124b200ddabed": "模型单次可接受的最大上下文 Token 数。留空时使用默认值。",
"185aebe19c77425d": "{0}必须是 JSON 对象",
"18b7312022cd1840": "启动服务",
- "1af38868896cf53d": "运行模式仅支持 local 或 upstream",
"1baddde657dd2720": "当前出站请求使用系统代理",
"1bc77f5ab979f4c1": "新增模型配置",
+ "1c631615c1d85c9e": "登录 Cursor",
"1e238093b79b3165": "留空时默认 65536",
"21296ab18ad9af25": "额外参数 JSON",
"24343a2096988d42": "打开失败",
@@ -46,10 +44,11 @@
"37d23612f78a2e63": "立即重启更新",
"392d0dceb45998d3": "极高",
"393df9bb13ea4900": "命中",
+ "3ab8cc15939f3b5c": "退出登录",
"3af7e5489e61ea51": "刷新中",
- "3bf8512aa520ed21": "本地服务模式",
"3c2a9f9901109e75": "{0} 的类型仅支持 OpenAI 或 Anthropic",
"3d13868593ae4eeb": "界面语言",
+ "3d52574ce1500561": "未连接",
"3ea83f9f55062582": "发布时间:{0}",
"3edda85621fd03b2": "个模型适配器",
"3fd47edce45b3603": "关闭",
@@ -67,6 +66,7 @@
"51194c3ad014fb29": "需重测",
"5205125c0e91d346": "Anthropic 模型单次回复允许生成的最大 Token 数。留空时使用默认值。",
"56627c94a9decee6": "最大输出 Token",
+ "58c6b0935a7216da": "打开贡献者主页失败",
"593a972852ba0004": "Cursor助手|永久免费|自定义API",
"59a2195a01a8b35b": "{0}必须是合法 JSON 对象",
"5aa8f5590c940829": "非缓存输入:{0}",
@@ -84,7 +84,7 @@
"66af574b8948fe83": "{0} 的访问密钥不能为空",
"6744b4c6a9aa0038": "已关闭",
"675109292da4eb36": "尚未测试",
- "699fe7ade5407687": "直连模式",
+ "688102a402ba015a": "等待登录...",
"6a7b96f399e58138": "例如:sk-xxxxxx",
"6aa8f49cc992dfd7": "测试",
"6ae23d6d7cb18592": "服务错误",
@@ -106,12 +106,11 @@
"80296f4aa3f4543b": "缓存读写",
"81123c56d5d880d0": "访问密钥",
"8139cb3dd11f5a67": "开启后会把 JSON 对象覆盖到最终请求头。同名请求头以这里为准,值必须是字符串。",
+ "83be9cac28873059": "Cursor 控制面账号",
"8672864e90417138": "最高",
"86df7ec743047234": "服务运行中",
- "87ed126f7bd1121e": "运行模式",
"899add6275682210": "留空时默认 200000",
"8a4ef3e48e4e8a5a": "已开启",
- "8c0d84831a3c3d5b": "当前为本地服务模式",
"8c1935935600e336": "模型测试",
"8cbcf741e727dbf7": "模型配置",
"8d1de152be6360ce": "有效占比:{0}",
@@ -133,7 +132,6 @@
"9970736b36ff2b68": "模型服务的 API 根地址,通常为兼容 OpenAI 或 Anthropic 的接口入口。",
"9a6e7d6c17471711": "当前按默认命中率口径显示",
"9b17fa889b307f7f": "有效轮次:{0}",
- "9c38b6e9bf94abec": "已切换到直连 Cursor 模式",
"9c41b3a9e12ac994": "思考强度",
"9d2ca261281a158a": "稍后",
"9d2fb46c0ba890b9": "自定义路径",
@@ -146,7 +144,6 @@
"a325d25c69e7256d": "模型配置不存在,无法复制",
"a4dd8bb7e8b6eb31": "显示访问密钥",
"a54d745d9a9249e2": "开启后会把 JSON 对象覆盖到 Anthropic 请求体。同名字段以这里为准。",
- "a55a88237df85d98": "当前为直连模式",
"a567bdaa11367f26": "中",
"a5f1bd344c92e195": "调用该模型服务需要使用的访问密钥。",
"a693d69af48bfe48": "保存并测试",
@@ -159,7 +156,6 @@
"aed55419ce62f08e": "切换中...",
"b10041a13f5c55b1": "模型输出:{0} × ${1}/1M = {2}",
"b1c27820fec23edb": "高",
- "b42049dcf8a05ef7": "已切换到本地服务模式",
"b5409d4049286061": "自定义路径(请输入完整请求地址)",
"b571037dc396a00c": "总请求 Token 包含 Prompt 和模型输出。",
"b765005f69fa971f": "例如:gpt-4.1",
@@ -174,18 +170,18 @@
"bddd504af0c92fd0": "检测到系统 PAC/自动代理,当前版本按直连处理",
"bef280f9eb392495": "对话轮次",
"c228558cf257fc49": "删除失败",
- "c3e9c3c60020b8b7": "选择模式",
+ "c3d46b387eeadb23": "只会退出 cursor-byok 中的 Cursor 账号,不会退出 Cursor 客户端。是否继续?",
"c5af02060847d167": "Anthropic adaptive thinking 的思考强度。请求会固定使用新版 thinking.type=adaptive。",
"c69f5bce63b9f14c": "设置文件夹",
+ "c8a52b66651d294c": "退出登录失败",
"c8c14507b2d37395": "推理强度",
"c98e118e0a43f078": "模型",
"c9dd59beefd7144f": "缓存读取 /(缓存读取 + 非缓存输入)",
"ca00a39fcea70dc6": "启动中...",
"ca1d1059408b3837": "异常轮次:{0}",
"cd7ca5fb221e1c53": "{0}不能为空",
- "ce46f23cea3bf3c5": "开启后,Cursor将直接接通官方,请勿开启",
+ "cfa6c803eb3fc713": "等待浏览器登录",
"d0325067fed88e5a": "缓存命中率 {0}",
- "d08fd4224abcd69d": "切换失败",
"d1bde4a4e057b2c7": "[MainLayout] 加载作者信息失败",
"d20ab96566d33f25": "{0} 的显示名称不能为空",
"d2243e1d44b2a94e": "编辑模型配置",
@@ -193,6 +189,7 @@
"d373809ab86ba93b": "拷贝",
"d3b1da3088ddd334": "模型测试失败",
"d53d32f1a1211371": "自定义请求头 JSON",
+ "d6ce4f0f88178144": "独立用于插件、Skills 和 MCP;不会改变 Cursor 客户端当前账号",
"d7889896c5b7732a": "Anthropic 额外参数 JSON",
"d7da2aabd35772ec": "例如:200000(留空用默认值)",
"d95e5cb6bdcee553": "计入缓存创建",
@@ -205,8 +202,12 @@
"e01c5dae36cf8c35": "开启后会把 JSON 对象覆盖到 OpenAI 请求体。同名字段以这里为准。OpenAI service_tier 支持 auto、default、flex、scale、priority。",
"e14c41ef2b7253c9": "总请求:{0}",
"e406825e0a72d2c2": "本地配置",
+ "e4343921c928a856": "登录失败",
+ "e4c0daa3c4bea691": "感谢 @aike0210 对 Cursor 控制面账号功能的贡献。",
+ "e53580f8031f13c0": "请在浏览器完成登录,完成后返回 Cursor 重新打开插件市场",
"e552c2accdbf5178": "新增模型",
"e6faccfddce722e8": "缓存读取:{0}",
+ "e8a0a6053998ebfa": "已经登录",
"eaffd48cd2ea9f1a": "例如:https://api.anthropic.com",
"eb1be07f2ca6e506": "按 Claude Opus 4.7 价格估算。",
"ec3b17a75db49e24": "{0} t/s | 首字 {1}",
diff --git a/frontend/src/services/clientApi.js b/frontend/src/services/clientApi.js
index 9afce5d..621e003 100644
--- a/frontend/src/services/clientApi.js
+++ b/frontend/src/services/clientApi.js
@@ -1,7 +1,10 @@
import {
+ DisconnectCursorAccount,
+ GetCursorAccountStatus,
GetState,
LoadUserConfig,
SaveUserConfig,
+ StartCursorAccountLogin,
StartProxy,
StopProxy,
} from "@bindings/cursor/internal/bridge/proxyservice.js";
@@ -62,6 +65,18 @@ export function saveUserConfig(payload) {
return withApiLogging("SaveUserConfig", payload, () => SaveUserConfig(payload));
}
+export function getCursorAccountStatus() {
+ return withApiLogging("GetCursorAccountStatus", undefined, () => GetCursorAccountStatus());
+}
+
+export function startCursorAccountLogin() {
+ return withApiLogging("StartCursorAccountLogin", undefined, () => StartCursorAccountLogin());
+}
+
+export function disconnectCursorAccount() {
+ return withApiLogging("DisconnectCursorAccount", undefined, () => DisconnectCursorAccount());
+}
+
export function getProxyState() {
return withApiLogging("GetState", undefined, () => GetState());
}
diff --git a/frontend/src/state/appState.js b/frontend/src/state/appState.js
index 0fe4d80..8ac0acd 100644
--- a/frontend/src/state/appState.js
+++ b/frontend/src/state/appState.js
@@ -36,7 +36,6 @@ export const EXTRA_PARAMS_DEFAULT_JSON = `{
export const CUSTOM_HEADERS_DEFAULT_JSON = `{
}`;
const SUPPORTED_OPENAI_ENDPOINTS = new Set([OPENAI_ENDPOINT_RESPONSES, OPENAI_ENDPOINT_CHAT_COMPLETIONS, OPENAI_ENDPOINT_CUSTOM]);
-const SUPPORTED_ROUTE_MODES = new Set(["local", "upstream"]);
const PROXY_STATE_EVENT = "proxy:state";
const USER_CONFIG_CHANGED_EVENT = "user-config:changed";
const UPDATE_STATE_EVENT = "update:state";
@@ -47,11 +46,6 @@ const MODEL_ADAPTER_TEST_UPDATED_EVENT = "model-adapter-test:updated";
const SUPPORTED_MODEL_ADAPTER_TEST_STATUSES = new Set(["idle", "running", "success", "error"]);
const HOME_METRICS_MIN_LOADING_MS = 600;
-export const ROUTE_MODE_OPTIONS = [
- { label: "本地服务模式", value: "local" },
- { label: "直连 Cursor 模式", value: "upstream" },
-];
-
function asString(value) {
if (typeof value === "string") {
return value.trim();
@@ -126,14 +120,6 @@ function formatReleaseDate(value) {
return parsed.format("YYYY-MM-DD HH:mm");
}
-function normalizeRouteMode(value, fallback = "local") {
- const text = asString(value).toLowerCase();
- if (SUPPORTED_ROUTE_MODES.has(text)) {
- return text;
- }
- return fallback;
-}
-
function normalizeBaseURL(value) {
const text = asString(value);
if (!text) {
@@ -479,13 +465,6 @@ export function validateModelAdapters(source) {
return "";
}
-function validateConfigPayload(payload) {
- if (!SUPPORTED_ROUTE_MODES.has(normalizeRouteMode(payload?.routing?.mode, ""))) {
- return "运行模式仅支持 local 或 upstream";
- }
- return "";
-}
-
function canUseLocalStorage() {
return typeof window !== "undefined" && typeof window.localStorage !== "undefined";
}
@@ -531,7 +510,6 @@ function loadCachedState() {
function normalizeConfig(source) {
const raw = source && typeof source === "object" ? source : {};
- const routing = raw.routing && typeof raw.routing === "object" ? raw.routing : {};
const homeMetrics = raw.homeMetrics && typeof raw.homeMetrics === "object" ? raw.homeMetrics : {};
return {
log: asBoolean(raw.log),
@@ -539,9 +517,6 @@ function normalizeConfig(source) {
backendListenAddr: asString(raw.configBackendListenAddr) || asString(raw.backendListenAddr),
proxyListenAddr: asString(raw.configProxyListenAddr) || asString(raw.proxyListenAddr),
modelAdapters: normalizeModelAdapters(raw.modelAdapters),
- routing: {
- mode: normalizeRouteMode(routing.mode),
- },
homeMetrics: {
includeCacheWriteInHitRate: asBoolean(homeMetrics.includeCacheWriteInHitRate),
},
@@ -584,7 +559,6 @@ function buildConfigPayload(source = appState) {
backendListenAddr: normalized.backendListenAddr,
proxyListenAddr: normalized.proxyListenAddr,
modelAdapters: normalized.modelAdapters.map(({ id, ...adapter }) => adapter),
- routing: normalized.routing,
homeMetrics: normalized.homeMetrics,
lastAgentModelHash: normalized.lastAgentModelHash,
};
@@ -599,7 +573,6 @@ function applyConfigToState(config, { modelAdaptersOnly = false } = {}) {
appState.modelAdapters = normalized.modelAdapters;
appState.configBackendListenAddr = normalized.backendListenAddr;
appState.configProxyListenAddr = normalized.proxyListenAddr;
- appState.routingMode = normalized.routing.mode;
appState.includeCacheWriteInHitRate = normalized.homeMetrics.includeCacheWriteInHitRate;
return normalized;
}
@@ -610,13 +583,6 @@ async function loadPersistedUserConfig() {
async function persistConfigPayload(config, { modelAdaptersOnly = false } = {}) {
const payload = buildConfigPayload(config);
- const configValidationError = validateConfigPayload(payload);
- if (configValidationError) {
- return {
- ok: false,
- error: configValidationError,
- };
- }
const validationError = validateModelAdapters(payload.modelAdapters);
if (validationError) {
return {
@@ -830,7 +796,6 @@ export const appState = reactive({
modelAdapterTestResults: {},
configBackendListenAddr: cachedConfig.backendListenAddr,
configProxyListenAddr: cachedConfig.proxyListenAddr,
- routingMode: cachedConfig.routing.mode,
includeCacheWriteInHitRate: cachedConfig.homeMetrics.includeCacheWriteInHitRate,
serviceRunning: asBoolean(cachedState.serviceRunning),
@@ -1118,9 +1083,6 @@ export async function persistUserConfig() {
return persistConfigPayload({
...currentConfig,
modelAdapters: normalizeModelAdapters(appState.modelAdapters),
- routing: {
- mode: appState.routingMode,
- },
homeMetrics: {
...currentConfig.homeMetrics,
includeCacheWriteInHitRate: appState.includeCacheWriteInHitRate,
@@ -1146,16 +1108,6 @@ export async function saveIncludeCacheWriteInHitRate(value) {
return result;
}
-export async function saveRoutingMode(mode) {
- const currentConfig = await loadPersistedUserConfig();
- return persistConfigPayload({
- ...currentConfig,
- routing: {
- mode: normalizeRouteMode(mode),
- },
- });
-}
-
export async function reloadUserConfig(options = {}) {
const config = await loadPersistedUserConfig();
applyConfigToState(config, options);
diff --git a/frontend/src/views/Config.vue b/frontend/src/views/Config.vue
index a31a31f..2ef635f 100644
--- a/frontend/src/views/Config.vue
+++ b/frontend/src/views/Config.vue
@@ -2,20 +2,16 @@
import Button from "@/components/ui/Button.vue";
import Card from "@/components/ui/Card.vue";
import LocaleSelect from "@/components/LocaleSelect.vue";
-import Select from "@/components/ui/Select.vue";
import { showModal } from "@/composables/useModal";
import {
appState,
openModelConfigWindow,
persistUserConfig,
reloadUserConfig,
- ROUTE_MODE_OPTIONS,
toUserError,
} from "@/state/appState";
import { onMounted } from "vue";
-const routeModeOptions = ROUTE_MODE_OPTIONS;
-
async function showActionError(title, error) {
await showModal({
title,
@@ -55,7 +51,7 @@ onMounted(async () => {
本地配置
- 可配置运行模式和模型渠道;运行日志位于 ~/.cursor-local-assistant-v2/logs/
+ 可配置模型渠道;运行日志位于 ~/.cursor-local-assistant-v2/logs/